Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a413e39a authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

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: default avatarFranky Lin <frankyl@broadcom.com>
Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a64304f0
Loading
Loading
Loading
Loading
+19 −2
Original line number Original line Diff line number Diff line
@@ -569,8 +569,10 @@ brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
}
}


int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
			    uint flags, struct sk_buff_head *pktq)
			    uint flags, struct sk_buff_head *pktq, uint totlen)
{
{
	struct sk_buff *glom_skb;
	struct sk_buff *skb;
	uint width;
	uint width;
	int err = 0;
	int err = 0;


@@ -582,6 +584,21 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
	if (err)
	if (err)
		goto done;
		goto done;


	if (pktq->qlen == 1)
		err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, pktq->next);
	else if (!sdiodev->sg_support) {
		glom_skb = brcmu_pkt_buf_get_skb(totlen);
		if (!glom_skb)
			return -ENOMEM;
		err = brcmf_sdio_buffrw(sdiodev, fn, false, addr, glom_skb);
		if (err)
			goto done;

		skb_queue_walk(pktq, skb) {
			memcpy(skb->data, glom_skb->data, skb->len);
			skb_pull(glom_skb, skb->len);
		}
	} else
		err = brcmf_sdio_sglist_rw(sdiodev, fn, false, addr, pktq);
		err = brcmf_sdio_sglist_rw(sdiodev, fn, false, addr, pktq);


done:
done:
+1 −1
Original line number Original line Diff line number Diff line
@@ -1392,7 +1392,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
		sdio_claim_host(bus->sdiodev->func[1]);
		sdio_claim_host(bus->sdiodev->func[1]);
		errcode = brcmf_sdcard_recv_chain(bus->sdiodev,
		errcode = brcmf_sdcard_recv_chain(bus->sdiodev,
				bus->sdiodev->sbwad,
				bus->sdiodev->sbwad,
				SDIO_FUNC_2, F2SYNC, &bus->glom);
				SDIO_FUNC_2, F2SYNC, &bus->glom, dlen);
		sdio_release_host(bus->sdiodev->func[1]);
		sdio_release_host(bus->sdiodev->func[1]);
		bus->sdcnt.f2rxdata++;
		bus->sdcnt.f2rxdata++;


+1 −1
Original line number Original line Diff line number Diff line
@@ -225,7 +225,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
		      uint flags, u8 *buf, uint nbytes);
		      uint flags, u8 *buf, uint nbytes);
extern int
extern int
brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
			uint flags, struct sk_buff_head *pktq);
			uint flags, struct sk_buff_head *pktq, uint totlen);


/* Flags bits */
/* Flags bits */