From 66bdf62a2ad2a6c2d339a6949b647301994e629d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Thu, 1 Mar 2018 18:15:43 +0100 Subject: mac80211: brcmfmac: restructuring sdio access functions - take 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafał Miłecki --- ...0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch | 190 +++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 package/kernel/mac80211/patches/312-v4.16-0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch (limited to 'package/kernel/mac80211/patches/312-v4.16-0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch') diff --git a/package/kernel/mac80211/patches/312-v4.16-0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch b/package/kernel/mac80211/patches/312-v4.16-0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch new file mode 100644 index 0000000000..3c78af89d8 --- /dev/null +++ b/package/kernel/mac80211/patches/312-v4.16-0006-brcmfmac-Remove-brcmf_sdiod_addrprep.patch @@ -0,0 +1,190 @@ +From a7c3aa1509e243a09c5b1660c8702d792ca76aed Mon Sep 17 00:00:00 2001 +From: Ian Molton +Date: Fri, 8 Dec 2017 13:10:31 +0100 +Subject: [PATCH] brcmfmac: Remove brcmf_sdiod_addrprep() + +This function has become trivial enough that it may as well be pushed into +its callers, which has the side-benefit of clarifying what's going on. + +Remove it, and rename brcmf_sdiod_set_sbaddr_window() to +brcmf_sdiod_set_backplane_window() as it's easier to understand. + +Signed-off-by: Ian Molton +Reviewed-by: Arend van Spriel +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 84 ++++++++++++---------- + 1 file changed, 46 insertions(+), 38 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +@@ -230,41 +230,25 @@ void brcmf_sdiod_change_state(struct brc + sdiodev->state = state; + } + +-static int brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, +- u32 address) ++static int brcmf_sdiod_set_backplane_window(struct brcmf_sdio_dev *sdiodev, ++ u32 addr) + { ++ u32 v, bar0 = addr & SBSDIO_SBWINDOW_MASK; + int err = 0, i; +- u32 addr; + +- if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) +- return -ENOMEDIUM; ++ if (bar0 == sdiodev->sbwad) ++ return 0; + +- addr = (address & SBSDIO_SBWINDOW_MASK) >> 8; ++ v = bar0 >> 8; + +- for (i = 0 ; i < 3 && !err ; i++, addr >>= 8) ++ for (i = 0 ; i < 3 && !err ; i++, v >>= 8) + brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, +- addr & 0xff, &err); +- +- return err; +-} +- +-static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr) +-{ +- uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK; +- int err = 0; +- +- if (bar0 != sdiodev->sbwad) { +- err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0); +- if (err) +- return err; ++ v & 0xff, &err); + ++ if (!err) + sdiodev->sbwad = bar0; +- } +- +- *addr &= SBSDIO_SB_OFT_ADDR_MASK; +- *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; + +- return 0; ++ return err; + } + + u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) +@@ -272,11 +256,16 @@ u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) + u32 data = 0; + int retval; + +- retval = brcmf_sdiod_addrprep(sdiodev, &addr); ++ retval = brcmf_sdiod_set_backplane_window(sdiodev, addr); ++ if (retval) ++ goto out; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; + +- if (!retval) +- data = sdio_readl(sdiodev->func[1], addr, &retval); ++ data = sdio_readl(sdiodev->func[1], addr, &retval); + ++out: + if (ret) + *ret = retval; + +@@ -288,11 +277,16 @@ void brcmf_sdiod_writel(struct brcmf_sdi + { + int retval; + +- retval = brcmf_sdiod_addrprep(sdiodev, &addr); ++ retval = brcmf_sdiod_set_backplane_window(sdiodev, addr); ++ if (retval) ++ goto out; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; + +- if (!retval) +- sdio_writel(sdiodev->func[1], data, addr, &retval); ++ sdio_writel(sdiodev->func[1], data, addr, &retval); + ++out: + if (ret) + *ret = retval; + } +@@ -540,10 +534,13 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt) + + brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); + +- err = brcmf_sdiod_addrprep(sdiodev, &addr); ++ err = brcmf_sdiod_set_backplane_window(sdiodev, addr); + if (err) + goto done; + ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt); + + done: +@@ -561,10 +558,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_ + brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", + addr, pktq->qlen); + +- err = brcmf_sdiod_addrprep(sdiodev, &addr); ++ err = brcmf_sdiod_set_backplane_window(sdiodev, addr); + if (err) + goto done; + ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ + if (pktq->qlen == 1) + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, + pktq->next); +@@ -606,7 +606,12 @@ int brcmf_sdiod_send_buf(struct brcmf_sd + + memcpy(mypkt->data, buf, nbytes); + +- err = brcmf_sdiod_addrprep(sdiodev, &addr); ++ err = brcmf_sdiod_set_backplane_window(sdiodev, addr); ++ if (err) ++ return err; ++ ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; + + if (!err) + err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt); +@@ -625,10 +630,13 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd + + brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); + +- err = brcmf_sdiod_addrprep(sdiodev, &addr); ++ err = brcmf_sdiod_set_backplane_window(sdiodev, addr); + if (err) + return err; + ++ addr &= SBSDIO_SB_OFT_ADDR_MASK; ++ addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; ++ + if (pktq->qlen == 1 || !sdiodev->sg_support) { + skb_queue_walk(pktq, skb) { + err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, +@@ -673,7 +681,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev + /* Do the transfer(s) */ + while (size) { + /* Set the backplane window to include the start address */ +- err = brcmf_sdiod_set_sbaddr_window(sdiodev, address); ++ err = brcmf_sdiod_set_backplane_window(sdiodev, address); + if (err) + break; + +@@ -716,7 +724,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev + dev_kfree_skb(pkt); + + /* Return the window to backplane enumeration space for core access */ +- if (brcmf_sdiod_set_sbaddr_window(sdiodev, sdiodev->sbwad)) ++ if (brcmf_sdiod_set_backplane_window(sdiodev, sdiodev->sbwad)) + brcmf_err("FAILED to set window back to 0x%x\n", + sdiodev->sbwad); + -- cgit v1.2.3