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

Commit 8f13c87c authored by Ian Molton's avatar Ian Molton Committed by Kalle Valo
Browse files

brcmfmac: Split brcmf_sdiod_buffrw function up.



This function needs to be split up into separate read / write variants
for clarity.

Signed-off-by: default avatarIan Molton <ian@mnementh.co.uk>
Reviewed-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 18907f20
Loading
Loading
Loading
Loading
+45 −22
Original line number Diff line number Diff line
@@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr,
		*ret = retval;
}

static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
			     bool write, u32 addr, struct sk_buff *pkt)
static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
				 u32 addr, struct sk_buff *pkt)
{
	unsigned int req_sz;
	int err;
@@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
	req_sz = pkt->len + 3;
	req_sz &= (uint)~3;

	if (write)
		err = sdio_memcpy_toio(sdiodev->func[fn], addr,
				       ((u8 *)(pkt->data)), req_sz);
	else if (fn == 1)
		err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
					 addr, req_sz);
	if (fn == 1)
		err = sdio_memcpy_fromio(sdiodev->func[fn],
					 ((u8 *)(pkt->data)), addr, req_sz);
	else
		/* function 2 read is FIFO operation */
		err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
				  req_sz);
		err = sdio_readsb(sdiodev->func[fn],
				  ((u8 *)(pkt->data)), addr, req_sz);

	if (err == -ENOMEDIUM)
		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);

	return err;
}

static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
				  u32 addr, struct sk_buff *pkt)
{
	unsigned int req_sz;
	int err;

	/* Single skb use the standard mmc interface */
	req_sz = pkt->len + 3;
	req_sz &= (uint)~3;

	err = sdio_memcpy_toio(sdiodev->func[fn], addr,
			       ((u8 *)(pkt->data)), req_sz);

	if (err == -ENOMEDIUM)
		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);

	return err;
}

@@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt)
	if (err)
		goto done;

	err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt);
	err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);

done:
	return err;
@@ -665,13 +683,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
		goto done;

	if (pktq->qlen == 1)
		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
					    pktq->next);
	else if (!sdiodev->sg_support) {
		glom_skb = brcmu_pkt_buf_get_skb(totlen);
		if (!glom_skb)
			return -ENOMEM;
		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
					    glom_skb);
		if (err)
			goto done;
@@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
	err = brcmf_sdiod_addrprep(sdiodev, &addr);

	if (!err)
		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
					 mypkt);
		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);

	brcmu_pkt_buf_free_skb(mypkt);
	return err;
@@ -730,7 +747,7 @@ int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,

	if (pktq->qlen == 1 || !sdiodev->sg_support)
		skb_queue_walk(pktq, skb) {
			err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
						     addr, skb);
			if (err)
				break;
@@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
		sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;

		skb_put(pkt, dsize);
		if (write)

		if (write) {
			memcpy(pkt->data, data, dsize);
		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
					 pkt);
			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
						     sdaddr, pkt);
		} else {
			err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
						    sdaddr, pkt);
		}

		if (err) {
			brcmf_err("membytes transfer failed\n");
			break;