aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch')
-rw-r--r--package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch143
1 files changed, 143 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch b/package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch
new file mode 100644
index 0000000000..c260b96550
--- /dev/null
+++ b/package/kernel/mac80211/patches/312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch
@@ -0,0 +1,143 @@
+From 8f13c87ccc495e30de5f58bbda967f6edd5bec53 Mon Sep 17 00:00:00 2001
+From: Ian Molton <ian@mnementh.co.uk>
+Date: Fri, 8 Dec 2017 13:10:26 +0100
+Subject: [PATCH] brcmfmac: Split brcmf_sdiod_buffrw function up.
+
+This function needs to be split up into separate read / write variants
+for clarity.
+
+Signed-off-by: Ian Molton <ian@mnementh.co.uk>
+Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+ .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 67 +++++++++++++++-------
+ 1 file changed, 45 insertions(+), 22 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+@@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
+ *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 brc
+ 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_sd
+ 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,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
+ goto done;
+
+ if (pktq->qlen == 1)
+- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
+- pktq->next);
++ 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,
+- glom_skb);
++ 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_sd
+ 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,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
+
+ if (pktq->qlen == 1 || !sdiodev->sg_support)
+ skb_queue_walk(pktq, skb) {
+- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
+- addr, skb);
++ 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
+ 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;