aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Molton <ian@mnementh.co.uk>2017-12-08 07:10:31 -0500
committerKalle Valo <kvalo@codeaurora.org>2017-12-14 07:41:01 -0500
commita7c3aa1509e243a09c5b1660c8702d792ca76aed (patch)
tree2d23065e506557ea27c933ce78a383167593447b
parenteeef8a5da781e11746347b3cd9f1942be48ebaf0 (diff)
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 <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>
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c84
1 files changed, 46 insertions, 38 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index e0b201f8702f..5fcd19346b84 100644
--- 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 brcmf_sdio_dev *sdiodev,
230 sdiodev->state = state; 230 sdiodev->state = state;
231} 231}
232 232
233static int brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, 233static int brcmf_sdiod_set_backplane_window(struct brcmf_sdio_dev *sdiodev,
234 u32 address) 234 u32 addr)
235{ 235{
236 u32 v, bar0 = addr & SBSDIO_SBWINDOW_MASK;
236 int err = 0, i; 237 int err = 0, i;
237 u32 addr;
238 238
239 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) 239 if (bar0 == sdiodev->sbwad)
240 return -ENOMEDIUM; 240 return 0;
241 241
242 addr = (address & SBSDIO_SBWINDOW_MASK) >> 8; 242 v = bar0 >> 8;
243 243
244 for (i = 0 ; i < 3 && !err ; i++, addr >>= 8) 244 for (i = 0 ; i < 3 && !err ; i++, v >>= 8)
245 brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, 245 brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
246 addr & 0xff, &err); 246 v & 0xff, &err);
247
248 return err;
249}
250
251static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
252{
253 uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
254 int err = 0;
255
256 if (bar0 != sdiodev->sbwad) {
257 err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
258 if (err)
259 return err;
260 247
248 if (!err)
261 sdiodev->sbwad = bar0; 249 sdiodev->sbwad = bar0;
262 }
263
264 *addr &= SBSDIO_SB_OFT_ADDR_MASK;
265 *addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
266 250
267 return 0; 251 return err;
268} 252}
269 253
270u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) 254u32 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)
272 u32 data = 0; 256 u32 data = 0;
273 int retval; 257 int retval;
274 258
275 retval = brcmf_sdiod_addrprep(sdiodev, &addr); 259 retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
260 if (retval)
261 goto out;
262
263 addr &= SBSDIO_SB_OFT_ADDR_MASK;
264 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
276 265
277 if (!retval) 266 data = sdio_readl(sdiodev->func[1], addr, &retval);
278 data = sdio_readl(sdiodev->func[1], addr, &retval);
279 267
268out:
280 if (ret) 269 if (ret)
281 *ret = retval; 270 *ret = retval;
282 271
@@ -288,11 +277,16 @@ void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr,
288{ 277{
289 int retval; 278 int retval;
290 279
291 retval = brcmf_sdiod_addrprep(sdiodev, &addr); 280 retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
281 if (retval)
282 goto out;
283
284 addr &= SBSDIO_SB_OFT_ADDR_MASK;
285 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
292 286
293 if (!retval) 287 sdio_writel(sdiodev->func[1], data, addr, &retval);
294 sdio_writel(sdiodev->func[1], data, addr, &retval);
295 288
289out:
296 if (ret) 290 if (ret)
297 *ret = retval; 291 *ret = retval;
298} 292}
@@ -540,10 +534,13 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt)
540 534
541 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); 535 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len);
542 536
543 err = brcmf_sdiod_addrprep(sdiodev, &addr); 537 err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
544 if (err) 538 if (err)
545 goto done; 539 goto done;
546 540
541 addr &= SBSDIO_SB_OFT_ADDR_MASK;
542 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
543
547 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt); 544 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
548 545
549done: 546done:
@@ -561,10 +558,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
561 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", 558 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n",
562 addr, pktq->qlen); 559 addr, pktq->qlen);
563 560
564 err = brcmf_sdiod_addrprep(sdiodev, &addr); 561 err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
565 if (err) 562 if (err)
566 goto done; 563 goto done;
567 564
565 addr &= SBSDIO_SB_OFT_ADDR_MASK;
566 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
567
568 if (pktq->qlen == 1) 568 if (pktq->qlen == 1)
569 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, 569 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
570 pktq->next); 570 pktq->next);
@@ -606,7 +606,12 @@ int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
606 606
607 memcpy(mypkt->data, buf, nbytes); 607 memcpy(mypkt->data, buf, nbytes);
608 608
609 err = brcmf_sdiod_addrprep(sdiodev, &addr); 609 err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
610 if (err)
611 return err;
612
613 addr &= SBSDIO_SB_OFT_ADDR_MASK;
614 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
610 615
611 if (!err) 616 if (!err)
612 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt); 617 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
@@ -625,10 +630,13 @@ int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
625 630
626 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); 631 brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen);
627 632
628 err = brcmf_sdiod_addrprep(sdiodev, &addr); 633 err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
629 if (err) 634 if (err)
630 return err; 635 return err;
631 636
637 addr &= SBSDIO_SB_OFT_ADDR_MASK;
638 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
639
632 if (pktq->qlen == 1 || !sdiodev->sg_support) { 640 if (pktq->qlen == 1 || !sdiodev->sg_support) {
633 skb_queue_walk(pktq, skb) { 641 skb_queue_walk(pktq, skb) {
634 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, 642 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
@@ -673,7 +681,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
673 /* Do the transfer(s) */ 681 /* Do the transfer(s) */
674 while (size) { 682 while (size) {
675 /* Set the backplane window to include the start address */ 683 /* Set the backplane window to include the start address */
676 err = brcmf_sdiod_set_sbaddr_window(sdiodev, address); 684 err = brcmf_sdiod_set_backplane_window(sdiodev, address);
677 if (err) 685 if (err)
678 break; 686 break;
679 687
@@ -716,7 +724,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
716 dev_kfree_skb(pkt); 724 dev_kfree_skb(pkt);
717 725
718 /* Return the window to backplane enumeration space for core access */ 726 /* Return the window to backplane enumeration space for core access */
719 if (brcmf_sdiod_set_sbaddr_window(sdiodev, sdiodev->sbwad)) 727 if (brcmf_sdiod_set_backplane_window(sdiodev, sdiodev->sbwad))
720 brcmf_err("FAILED to set window back to 0x%x\n", 728 brcmf_err("FAILED to set window back to 0x%x\n",
721 sdiodev->sbwad); 729 sdiodev->sbwad);
722 730