diff options
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.patch | 143 |
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; |