diff options
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 21 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h | 2 |
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 | ||
571 | int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 571 | int 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 | ||
587 | done: | 604 | done: |
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); |
226 | extern int | 226 | extern int |
227 | brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, | 227 | brcmf_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 | ||