Commit 800c2b67 authored by Roland Vossen's avatar Roland Vossen Committed by Greg Kroah-Hartman

staging: brcm80211: reduce indentation level in dhd_sdio.c #2

By introducing 1 new function.
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarArend van Spriel <arend@broadcom.com>
Reviewed-by: default avatarFranky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: default avatarFranky Lin <frankyl@broadcom.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 875176bb
...@@ -1797,6 +1797,62 @@ brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen, ...@@ -1797,6 +1797,62 @@ brcmf_alloc_pkt_and_read(struct brcmf_bus *bus, u16 rdlen,
} }
} }
/* Checks the header */
static int
brcmf_check_rxbuf(struct brcmf_bus *bus, struct sk_buff *pkt, u8 *rxbuf,
u8 rxseq, u16 nextlen, u16 *len)
{
u16 check;
bool len_consistent; /* Result of comparing readahead len and
len from hw-hdr */
memcpy(bus->rxhdr, rxbuf, SDPCM_HDRLEN);
/* Extract hardware header fields */
*len = get_unaligned_le16(bus->rxhdr);
check = get_unaligned_le16(bus->rxhdr + sizeof(u16));
/* All zeros means readahead info was bad */
if (!(*len | check)) {
brcmf_dbg(INFO, "(nextlen): read zeros in HW header???\n");
goto fail;
}
/* Validate check bytes */
if ((u16)~(*len ^ check)) {
brcmf_dbg(ERROR, "(nextlen): HW hdr error: nextlen/len/check 0x%04x/0x%04x/0x%04x\n",
nextlen, *len, check);
bus->rx_badhdr++;
brcmf_sdbrcm_rxfail(bus, false, false);
goto fail;
}
/* Validate frame length */
if (*len < SDPCM_HDRLEN) {
brcmf_dbg(ERROR, "(nextlen): HW hdr length invalid: %d\n",
*len);
goto fail;
}
/* Check for consistency with readahead info */
len_consistent = (nextlen != (roundup(*len, 16) >> 4));
if (len_consistent) {
/* Mismatch, force retry w/normal
header (may be >4K) */
brcmf_dbg(ERROR, "(nextlen): mismatch, nextlen %d len %d rnd %d; expected rxseq %d\n",
nextlen, *len, roundup(*len, 16),
rxseq);
brcmf_sdbrcm_rxfail(bus, true, true);
goto fail;
}
return 0;
fail:
brcmf_sdbrcm_pktfree2(bus, pkt);
return -EINVAL;
}
/* Return true if there may be more frames to read */ /* Return true if there may be more frames to read */
static uint static uint
brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished)
...@@ -1812,8 +1868,6 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) ...@@ -1812,8 +1868,6 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished)
uint rxleft = 0; /* Remaining number of frames allowed */ uint rxleft = 0; /* Remaining number of frames allowed */
int sdret; /* Return code from calls */ int sdret; /* Return code from calls */
u8 txmax; /* Maximum tx sequence offered */ u8 txmax; /* Maximum tx sequence offered */
bool len_consistent; /* Result of comparing readahead len and
len from hw-hdr */
u8 *rxbuf; u8 *rxbuf;
int ifidx = 0; int ifidx = 0;
uint rxcount = 0; /* Total frames read */ uint rxcount = 0; /* Total frames read */
...@@ -1860,50 +1914,9 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished) ...@@ -1860,50 +1914,9 @@ brcmf_sdbrcm_readframes(struct brcmf_bus *bus, uint maxframes, bool *finished)
continue; continue;
} }
/* Now check the header */ if (brcmf_check_rxbuf(bus, pkt, rxbuf, rxseq, nextlen,
memcpy(bus->rxhdr, rxbuf, SDPCM_HDRLEN); &len) < 0)
/* Extract hardware header fields */
len = get_unaligned_le16(bus->rxhdr);
check = get_unaligned_le16(bus->rxhdr + sizeof(u16));
/* All zeros means readahead info was bad */
if (!(len | check)) {
brcmf_dbg(INFO, "(nextlen): read zeros in HW header???\n");
brcmf_sdbrcm_pktfree2(bus, pkt);
continue;
}
/* Validate check bytes */
if ((u16)~(len ^ check)) {
brcmf_dbg(ERROR, "(nextlen): HW hdr error: nextlen/len/check 0x%04x/0x%04x/0x%04x\n",
nextlen, len, check);
bus->rx_badhdr++;
brcmf_sdbrcm_rxfail(bus, false, false);
brcmf_sdbrcm_pktfree2(bus, pkt);
continue;
}
/* Validate frame length */
if (len < SDPCM_HDRLEN) {
brcmf_dbg(ERROR, "(nextlen): HW hdr length invalid: %d\n",
len);
brcmf_sdbrcm_pktfree2(bus, pkt);
continue; continue;
}
/* Check for consistency withreadahead info */
len_consistent = (nextlen != (roundup(len, 16) >> 4));
if (len_consistent) {
/* Mismatch, force retry w/normal
header (may be >4K) */
brcmf_dbg(ERROR, "(nextlen): mismatch, nextlen %d len %d rnd %d; expected rxseq %d\n",
nextlen, len, roundup(len, 16),
rxseq);
brcmf_sdbrcm_rxfail(bus, true, true);
brcmf_sdbrcm_pktfree2(bus, pkt);
continue;
}
/* Extract software header fields */ /* Extract software header fields */
chan = SDPCM_PACKET_CHANNEL( chan = SDPCM_PACKET_CHANNEL(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment