2
0

312-v4.16-0001-brcmfmac-Split-brcmf_sdiod_buffrw-function-up.patch 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. From 8f13c87ccc495e30de5f58bbda967f6edd5bec53 Mon Sep 17 00:00:00 2001
  2. From: Ian Molton <[email protected]>
  3. Date: Fri, 8 Dec 2017 13:10:26 +0100
  4. Subject: [PATCH] brcmfmac: Split brcmf_sdiod_buffrw function up.
  5. This function needs to be split up into separate read / write variants
  6. for clarity.
  7. Signed-off-by: Ian Molton <[email protected]>
  8. Reviewed-by: Arend van Spriel <[email protected]>
  9. Signed-off-by: Arend van Spriel <[email protected]>
  10. Signed-off-by: Kalle Valo <[email protected]>
  11. ---
  12. .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 67 +++++++++++++++-------
  13. 1 file changed, 45 insertions(+), 22 deletions(-)
  14. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  15. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  16. @@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
  17. *ret = retval;
  18. }
  19. -static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
  20. - bool write, u32 addr, struct sk_buff *pkt)
  21. +static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
  22. + u32 addr, struct sk_buff *pkt)
  23. {
  24. unsigned int req_sz;
  25. int err;
  26. @@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brc
  27. req_sz = pkt->len + 3;
  28. req_sz &= (uint)~3;
  29. - if (write)
  30. - err = sdio_memcpy_toio(sdiodev->func[fn], addr,
  31. - ((u8 *)(pkt->data)), req_sz);
  32. - else if (fn == 1)
  33. - err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
  34. - addr, req_sz);
  35. + if (fn == 1)
  36. + err = sdio_memcpy_fromio(sdiodev->func[fn],
  37. + ((u8 *)(pkt->data)), addr, req_sz);
  38. else
  39. /* function 2 read is FIFO operation */
  40. - err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
  41. - req_sz);
  42. + err = sdio_readsb(sdiodev->func[fn],
  43. + ((u8 *)(pkt->data)), addr, req_sz);
  44. +
  45. + if (err == -ENOMEDIUM)
  46. + brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
  47. +
  48. + return err;
  49. +}
  50. +
  51. +static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
  52. + u32 addr, struct sk_buff *pkt)
  53. +{
  54. + unsigned int req_sz;
  55. + int err;
  56. +
  57. + /* Single skb use the standard mmc interface */
  58. + req_sz = pkt->len + 3;
  59. + req_sz &= (uint)~3;
  60. +
  61. + err = sdio_memcpy_toio(sdiodev->func[fn], addr,
  62. + ((u8 *)(pkt->data)), req_sz);
  63. +
  64. if (err == -ENOMEDIUM)
  65. brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
  66. +
  67. return err;
  68. }
  69. @@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
  70. if (err)
  71. goto done;
  72. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt);
  73. + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
  74. done:
  75. return err;
  76. @@ -665,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
  77. goto done;
  78. if (pktq->qlen == 1)
  79. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
  80. - pktq->next);
  81. + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
  82. + pktq->next);
  83. else if (!sdiodev->sg_support) {
  84. glom_skb = brcmu_pkt_buf_get_skb(totlen);
  85. if (!glom_skb)
  86. return -ENOMEM;
  87. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
  88. - glom_skb);
  89. + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
  90. + glom_skb);
  91. if (err)
  92. goto done;
  93. @@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
  94. err = brcmf_sdiod_addrprep(sdiodev, &addr);
  95. if (!err)
  96. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
  97. - mypkt);
  98. + err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
  99. brcmu_pkt_buf_free_skb(mypkt);
  100. return err;
  101. @@ -730,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
  102. if (pktq->qlen == 1 || !sdiodev->sg_support)
  103. skb_queue_walk(pktq, skb) {
  104. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
  105. - addr, skb);
  106. + err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
  107. + addr, skb);
  108. if (err)
  109. break;
  110. }
  111. @@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
  112. sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
  113. skb_put(pkt, dsize);
  114. - if (write)
  115. +
  116. + if (write) {
  117. memcpy(pkt->data, data, dsize);
  118. - err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
  119. - pkt);
  120. + err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
  121. + sdaddr, pkt);
  122. + } else {
  123. + err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
  124. + sdaddr, pkt);
  125. + }
  126. +
  127. if (err) {
  128. brcmf_err("membytes transfer failed\n");
  129. break;