aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Molton <ian@mnementh.co.uk>2017-12-08 07:10:26 -0500
committerKalle Valo <kvalo@codeaurora.org>2017-12-14 07:40:58 -0500
commit8f13c87ccc495e30de5f58bbda967f6edd5bec53 (patch)
treeb7bafec46aee05dd6ac5240b9e8eca62f4aa112d
parent18907f20ea71b17b3cac91049b415b95cde5fa9c (diff)
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>
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c67
1 files changed, 45 insertions, 22 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index 30ab0aa7a240..d9ecc69fe739 100644
--- 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_dev *sdiodev, u32 addr,
414 *ret = retval; 414 *ret = retval;
415} 415}
416 416
417static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn, 417static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
418 bool write, u32 addr, struct sk_buff *pkt) 418 u32 addr, struct sk_buff *pkt)
419{ 419{
420 unsigned int req_sz; 420 unsigned int req_sz;
421 int err; 421 int err;
@@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
424 req_sz = pkt->len + 3; 424 req_sz = pkt->len + 3;
425 req_sz &= (uint)~3; 425 req_sz &= (uint)~3;
426 426
427 if (write) 427 if (fn == 1)
428 err = sdio_memcpy_toio(sdiodev->func[fn], addr, 428 err = sdio_memcpy_fromio(sdiodev->func[fn],
429 ((u8 *)(pkt->data)), req_sz); 429 ((u8 *)(pkt->data)), addr, req_sz);
430 else if (fn == 1)
431 err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
432 addr, req_sz);
433 else 430 else
434 /* function 2 read is FIFO operation */ 431 /* function 2 read is FIFO operation */
435 err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr, 432 err = sdio_readsb(sdiodev->func[fn],
436 req_sz); 433 ((u8 *)(pkt->data)), addr, req_sz);
434
435 if (err == -ENOMEDIUM)
436 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
437
438 return err;
439}
440
441static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
442 u32 addr, struct sk_buff *pkt)
443{
444 unsigned int req_sz;
445 int err;
446
447 /* Single skb use the standard mmc interface */
448 req_sz = pkt->len + 3;
449 req_sz &= (uint)~3;
450
451 err = sdio_memcpy_toio(sdiodev->func[fn], addr,
452 ((u8 *)(pkt->data)), req_sz);
453
437 if (err == -ENOMEDIUM) 454 if (err == -ENOMEDIUM)
438 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); 455 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
456
439 return err; 457 return err;
440} 458}
441 459
@@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt)
643 if (err) 661 if (err)
644 goto done; 662 goto done;
645 663
646 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt); 664 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
647 665
648done: 666done:
649 return err; 667 return err;
@@ -665,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
665 goto done; 683 goto done;
666 684
667 if (pktq->qlen == 1) 685 if (pktq->qlen == 1)
668 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, 686 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
669 pktq->next); 687 pktq->next);
670 else if (!sdiodev->sg_support) { 688 else if (!sdiodev->sg_support) {
671 glom_skb = brcmu_pkt_buf_get_skb(totlen); 689 glom_skb = brcmu_pkt_buf_get_skb(totlen);
672 if (!glom_skb) 690 if (!glom_skb)
673 return -ENOMEM; 691 return -ENOMEM;
674 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, 692 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
675 glom_skb); 693 glom_skb);
676 if (err) 694 if (err)
677 goto done; 695 goto done;
678 696
@@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
707 err = brcmf_sdiod_addrprep(sdiodev, &addr); 725 err = brcmf_sdiod_addrprep(sdiodev, &addr);
708 726
709 if (!err) 727 if (!err)
710 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr, 728 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
711 mypkt);
712 729
713 brcmu_pkt_buf_free_skb(mypkt); 730 brcmu_pkt_buf_free_skb(mypkt);
714 return err; 731 return err;
@@ -730,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
730 747
731 if (pktq->qlen == 1 || !sdiodev->sg_support) 748 if (pktq->qlen == 1 || !sdiodev->sg_support)
732 skb_queue_walk(pktq, skb) { 749 skb_queue_walk(pktq, skb) {
733 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, 750 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
734 addr, skb); 751 addr, skb);
735 if (err) 752 if (err)
736 break; 753 break;
737 } 754 }
@@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
783 sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 800 sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
784 801
785 skb_put(pkt, dsize); 802 skb_put(pkt, dsize);
786 if (write) 803
804 if (write) {
787 memcpy(pkt->data, data, dsize); 805 memcpy(pkt->data, data, dsize);
788 err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr, 806 err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
789 pkt); 807 sdaddr, pkt);
808 } else {
809 err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
810 sdaddr, pkt);
811 }
812
790 if (err) { 813 if (err) {
791 brcmf_err("membytes transfer failed\n"); 814 brcmf_err("membytes transfer failed\n");
792 break; 815 break;