311-v4.16-0003-brcmfmac-Split-brcmf_sdiod_regrw_helper-up.patch 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. From 0fcc9fe0048422d66bb906eaa73cc75e11ff7345 Mon Sep 17 00:00:00 2001
  2. From: Ian Molton <[email protected]>
  3. Date: Mon, 13 Nov 2017 21:35:40 +0100
  4. Subject: [PATCH] brcmfmac: Split brcmf_sdiod_regrw_helper() up.
  5. This large function is concealing a LOT of obscure logic about
  6. how the hardware functions. Time to split it up.
  7. This first patch splits the function into two pieces - read and write,
  8. doing away with the rw flag in the process.
  9. Signed-off-by: Ian Molton <[email protected]>
  10. Signed-off-by: Arend van Spriel <[email protected]>
  11. Signed-off-by: Kalle Valo <[email protected]>
  12. ---
  13. .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 94 +++++++++++++++++-----
  14. 1 file changed, 73 insertions(+), 21 deletions(-)
  15. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  16. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  17. @@ -302,8 +302,8 @@ static int brcmf_sdiod_request_data(stru
  18. return ret;
  19. }
  20. -static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
  21. - u8 regsz, void *data, bool write)
  22. +static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
  23. + u8 regsz, void *data)
  24. {
  25. u8 func;
  26. s32 retry = 0;
  27. @@ -324,13 +324,66 @@ static int brcmf_sdiod_regrw_helper(stru
  28. func = SDIO_FUNC_1;
  29. do {
  30. - if (!write)
  31. - memset(data, 0, regsz);
  32. /* for retry wait for 1 ms till bus get settled down */
  33. if (retry)
  34. usleep_range(1000, 2000);
  35. +
  36. + ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
  37. + data, true);
  38. +
  39. + } while (ret != 0 && ret != -ENOMEDIUM &&
  40. + retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
  41. +
  42. + if (ret == -ENOMEDIUM) {
  43. + brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
  44. + } else if (ret != 0) {
  45. + /*
  46. + * SleepCSR register access can fail when
  47. + * waking up the device so reduce this noise
  48. + * in the logs.
  49. + */
  50. + if (addr != SBSDIO_FUNC1_SLEEPCSR)
  51. + brcmf_err("failed to write data F%d@0x%05x, err: %d\n",
  52. + func, addr, ret);
  53. + else
  54. + brcmf_dbg(SDIO, "failed to write data F%d@0x%05x, err: %d\n",
  55. + func, addr, ret);
  56. + }
  57. +
  58. + return ret;
  59. +}
  60. +
  61. +static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
  62. + u8 regsz, void *data)
  63. +{
  64. + u8 func;
  65. + s32 retry = 0;
  66. + int ret;
  67. +
  68. + if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
  69. + return -ENOMEDIUM;
  70. +
  71. + /*
  72. + * figure out how to read the register based on address range
  73. + * 0x00 ~ 0x7FF: function 0 CCCR and FBR
  74. + * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
  75. + * The rest: function 1 silicon backplane core registers
  76. + */
  77. + if ((addr & ~REG_F0_REG_MASK) == 0)
  78. + func = SDIO_FUNC_0;
  79. + else
  80. + func = SDIO_FUNC_1;
  81. +
  82. + do {
  83. + memset(data, 0, regsz);
  84. +
  85. + /* for retry wait for 1 ms till bus get settled down */
  86. + if (retry)
  87. + usleep_range(1000, 2000);
  88. +
  89. ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
  90. - data, write);
  91. + data, false);
  92. +
  93. } while (ret != 0 && ret != -ENOMEDIUM &&
  94. retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
  95. @@ -343,12 +396,13 @@ static int brcmf_sdiod_regrw_helper(stru
  96. * in the logs.
  97. */
  98. if (addr != SBSDIO_FUNC1_SLEEPCSR)
  99. - brcmf_err("failed to %s data F%d@0x%05x, err: %d\n",
  100. - write ? "write" : "read", func, addr, ret);
  101. + brcmf_err("failed to read data F%d@0x%05x, err: %d\n",
  102. + func, addr, ret);
  103. else
  104. - brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
  105. - write ? "write" : "read", func, addr, ret);
  106. + brcmf_dbg(SDIO, "failed to read data F%d@0x%05x, err: %d\n",
  107. + func, addr, ret);
  108. }
  109. +
  110. return ret;
  111. }
  112. @@ -366,13 +420,11 @@ brcmf_sdiod_set_sbaddr_window(struct brc
  113. addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
  114. for (i = 0; i < 3; i++) {
  115. - err = brcmf_sdiod_regrw_helper(sdiodev,
  116. - SBSDIO_FUNC1_SBADDRLOW + i,
  117. - 1, &addr[i], true);
  118. + brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, addr[i],
  119. + &err);
  120. if (err) {
  121. brcmf_err("failed at addr: 0x%0x\n",
  122. SBSDIO_FUNC1_SBADDRLOW + i);
  123. - break;
  124. }
  125. }
  126. @@ -407,8 +459,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
  127. int retval;
  128. brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
  129. - retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
  130. - false);
  131. + retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
  132. brcmf_dbg(SDIO, "data:0x%02x\n", data);
  133. if (ret)
  134. @@ -426,8 +477,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
  135. retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
  136. if (retval)
  137. goto done;
  138. - retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
  139. - false);
  140. +
  141. + retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
  142. +
  143. brcmf_dbg(SDIO, "data:0x%08x\n", data);
  144. done:
  145. @@ -443,8 +495,8 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
  146. int retval;
  147. brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
  148. - retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
  149. - true);
  150. + retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data);
  151. +
  152. if (ret)
  153. *ret = retval;
  154. }
  155. @@ -458,8 +510,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
  156. retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
  157. if (retval)
  158. goto done;
  159. - retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
  160. - true);
  161. +
  162. + retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
  163. done:
  164. if (ret)