aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-10-15 09:44:57 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-10-18 14:06:58 -0400
commita413e39a38573f8738911cfb51a4cd3f3873deda (patch)
tree5f307fe467818ce55dc63f095706893c3f59e17a
parenta64304f0a2cae8ce9ff71baecbad821613229cfe (diff)
brcmfmac: fix brcmf_sdcard_recv_chain() for host without sg support
If the SDIO host controller does not support scatter-gather the glom superframe must be transfered from the device and the data for each packet in the queue must be extracted from it. Reviewed-by: Franky Lin <frankyl@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c21
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h2
3 files changed, 21 insertions, 4 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 1103dc1cc9dc..3e10b801eee8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -569,8 +569,10 @@ done:
569} 569}
570 570
571int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, 571int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
572 uint flags, struct sk_buff_head *pktq) 572 uint flags, struct sk_buff_head *pktq, uint totlen)
573{ 573{
574 struct sk_buff *glom_skb;
575 struct sk_buff *skb;
574 uint width; 576 uint width;
575 int err = 0; 577 int err = 0;
576 578
@@ -582,7 +584,22 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
582 if (err) 584 if (err)
583 goto done; 585 goto done;
584 586
585 err = brcmf_sdio_sglist_rw(sdiodev, fn, false, addr, pktq); 587 if (pktq->qlen == 1)
588 err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, pktq->next);
589 else if (!sdiodev->sg_support) {
590 glom_skb = brcmu_pkt_buf_get_skb(totlen);
591 if (!glom_skb)
592 return -ENOMEM;
593 err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, glom_skb);
594 if (err)
595 goto done;
596
597 skb_queue_walk(pktq, skb) {
598 memcpy(skb->data, glom_skb->data, skb->len);
599 skb_pull(glom_skb, skb->len);
600 }
601 } else
602 err = brcmf_sdio_sglist_rw(sdiodev, fn, false, addr, pktq);
586 603
587done: 604done:
588 return err; 605 return err;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index c9277011a1bc..b02953c4ade7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -1392,7 +1392,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1392 sdio_claim_host(bus->sdiodev->func[1]); 1392 sdio_claim_host(bus->sdiodev->func[1]);
1393 errcode = brcmf_sdcard_recv_chain(bus->sdiodev, 1393 errcode = brcmf_sdcard_recv_chain(bus->sdiodev,
1394 bus->sdiodev->sbwad, 1394 bus->sdiodev->sbwad,
1395 SDIO_FUNC_2, F2SYNC, &bus->glom); 1395 SDIO_FUNC_2, F2SYNC, &bus->glom, dlen);
1396 sdio_release_host(bus->sdiodev->func[1]); 1396 sdio_release_host(bus->sdiodev->func[1]);
1397 bus->sdcnt.f2rxdata++; 1397 bus->sdcnt.f2rxdata++;
1398 1398
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
index 59c456f7eb12..1b034ea46f93 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
@@ -225,7 +225,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
225 uint flags, u8 *buf, uint nbytes); 225 uint flags, u8 *buf, uint nbytes);
226extern int 226extern int
227brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, 227brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
228 uint flags, struct sk_buff_head *pktq); 228 uint flags, struct sk_buff_head *pktq, uint totlen);
229 229
230/* Flags bits */ 230/* Flags bits */
231 231