2
0

314-v4.16-0007-brcmfmac-Replace-function-index-with-function-pointe.patch 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. From 00eb62cfc5f806b003fe5d54c8b5fe9a9665482f Mon Sep 17 00:00:00 2001
  2. From: Ian Molton <[email protected]>
  3. Date: Tue, 19 Dec 2017 13:47:13 +0100
  4. Subject: [PATCH] brcmfmac: Replace function index with function pointer
  5. In preparation for removing the function array, remove all code that
  6. refers to function by index and replace with pointers to the function
  7. itself.
  8. Signed-off-by: Ian Molton <[email protected]>
  9. Reviewed-by: Arend van Spriel <[email protected]>
  10. [arend: replace BUG() with WARN() macro]
  11. Signed-off-by: Arend van Spriel <[email protected]>
  12. Signed-off-by: Kalle Valo <[email protected]>
  13. ---
  14. .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 85 ++++++++++++----------
  15. .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 15 ++--
  16. .../wireless/broadcom/brcm80211/brcmfmac/sdio.h | 6 +-
  17. 3 files changed, 56 insertions(+), 50 deletions(-)
  18. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  19. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
  20. @@ -291,8 +291,9 @@ out:
  21. *ret = retval;
  22. }
  23. -static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
  24. - u32 addr, struct sk_buff *pkt)
  25. +static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev,
  26. + struct sdio_func *func, u32 addr,
  27. + struct sk_buff *pkt)
  28. {
  29. unsigned int req_sz;
  30. int err;
  31. @@ -301,13 +302,19 @@ static int brcmf_sdiod_buff_read(struct
  32. req_sz = pkt->len + 3;
  33. req_sz &= (uint)~3;
  34. - if (fn == 1)
  35. - err = sdio_memcpy_fromio(sdiodev->func[fn],
  36. - ((u8 *)(pkt->data)), addr, req_sz);
  37. - else
  38. - /* function 2 read is FIFO operation */
  39. - err = sdio_readsb(sdiodev->func[fn],
  40. - ((u8 *)(pkt->data)), addr, req_sz);
  41. + switch (func->num) {
  42. + case 1:
  43. + err = sdio_memcpy_fromio(func, ((u8 *)(pkt->data)), addr,
  44. + req_sz);
  45. + break;
  46. + case 2:
  47. + err = sdio_readsb(func, ((u8 *)(pkt->data)), addr, req_sz);
  48. + break;
  49. + default:
  50. + /* bail out as things are really fishy here */
  51. + WARN(1, "invalid sdio function number: %d\n", func->num);
  52. + err = -ENOMEDIUM;
  53. + };
  54. if (err == -ENOMEDIUM)
  55. brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
  56. @@ -315,8 +322,9 @@ static int brcmf_sdiod_buff_read(struct
  57. return err;
  58. }
  59. -static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
  60. - u32 addr, struct sk_buff *pkt)
  61. +static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev,
  62. + struct sdio_func *func, u32 addr,
  63. + struct sk_buff *pkt)
  64. {
  65. unsigned int req_sz;
  66. int err;
  67. @@ -325,8 +333,7 @@ static int brcmf_sdiod_buff_write(struct
  68. req_sz = pkt->len + 3;
  69. req_sz &= (uint)~3;
  70. - err = sdio_memcpy_toio(sdiodev->func[fn], addr,
  71. - ((u8 *)(pkt->data)), req_sz);
  72. + err = sdio_memcpy_toio(func, addr, ((u8 *)(pkt->data)), req_sz);
  73. if (err == -ENOMEDIUM)
  74. brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
  75. @@ -337,7 +344,7 @@ static int brcmf_sdiod_buff_write(struct
  76. /**
  77. * brcmf_sdiod_sglist_rw - SDIO interface function for block data access
  78. * @sdiodev: brcmfmac sdio device
  79. - * @fn: SDIO function number
  80. + * @func: SDIO function
  81. * @write: direction flag
  82. * @addr: dongle memory address as source/destination
  83. * @pkt: skb pointer
  84. @@ -346,7 +353,8 @@ static int brcmf_sdiod_buff_write(struct
  85. * stack for block data access. It assumes that the skb passed down by the
  86. * caller has already been padded and aligned.
  87. */
  88. -static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn,
  89. +static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev,
  90. + struct sdio_func *func,
  91. bool write, u32 addr,
  92. struct sk_buff_head *pktlist)
  93. {
  94. @@ -372,7 +380,7 @@ static int brcmf_sdiod_sglist_rw(struct
  95. req_sz = 0;
  96. skb_queue_walk(pktlist, pkt_next)
  97. req_sz += pkt_next->len;
  98. - req_sz = ALIGN(req_sz, sdiodev->func[fn]->cur_blksize);
  99. + req_sz = ALIGN(req_sz, func->cur_blksize);
  100. while (req_sz > PAGE_SIZE) {
  101. pkt_next = brcmu_pkt_buf_get_skb(PAGE_SIZE);
  102. if (pkt_next == NULL) {
  103. @@ -391,7 +399,7 @@ static int brcmf_sdiod_sglist_rw(struct
  104. target_list = &local_list;
  105. }
  106. - func_blk_sz = sdiodev->func[fn]->cur_blksize;
  107. + func_blk_sz = func->cur_blksize;
  108. max_req_sz = sdiodev->max_request_size;
  109. max_seg_cnt = min_t(unsigned short, sdiodev->max_segment_count,
  110. target_list->qlen);
  111. @@ -408,10 +416,10 @@ static int brcmf_sdiod_sglist_rw(struct
  112. mmc_dat.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
  113. mmc_cmd.opcode = SD_IO_RW_EXTENDED;
  114. mmc_cmd.arg = write ? 1<<31 : 0; /* write flag */
  115. - mmc_cmd.arg |= (fn & 0x7) << 28; /* SDIO func num */
  116. - mmc_cmd.arg |= 1<<27; /* block mode */
  117. + mmc_cmd.arg |= (func->num & 0x7) << 28; /* SDIO func num */
  118. + mmc_cmd.arg |= 1 << 27; /* block mode */
  119. /* for function 1 the addr will be incremented */
  120. - mmc_cmd.arg |= (fn == 1) ? 1<<26 : 0;
  121. + mmc_cmd.arg |= (func->num == 1) ? 1 << 26 : 0;
  122. mmc_cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC;
  123. mmc_req.cmd = &mmc_cmd;
  124. mmc_req.data = &mmc_dat;
  125. @@ -457,11 +465,11 @@ static int brcmf_sdiod_sglist_rw(struct
  126. mmc_cmd.arg |= (addr & 0x1FFFF) << 9; /* address */
  127. mmc_cmd.arg |= mmc_dat.blocks & 0x1FF; /* block count */
  128. /* incrementing addr for function 1 */
  129. - if (fn == 1)
  130. + if (func->num == 1)
  131. addr += req_sz;
  132. - mmc_set_data_timeout(&mmc_dat, sdiodev->func[fn]->card);
  133. - mmc_wait_for_req(sdiodev->func[fn]->card->host, &mmc_req);
  134. + mmc_set_data_timeout(&mmc_dat, func->card);
  135. + mmc_wait_for_req(func->card->host, &mmc_req);
  136. ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error;
  137. if (ret == -ENOMEDIUM) {
  138. @@ -541,7 +549,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
  139. addr &= SBSDIO_SB_OFT_ADDR_MASK;
  140. addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
  141. - err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
  142. + err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr, pkt);
  143. done:
  144. return err;
  145. @@ -566,13 +574,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_
  146. addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
  147. if (pktq->qlen == 1)
  148. - err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
  149. + err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
  150. pktq->next);
  151. else if (!sdiodev->sg_support) {
  152. glom_skb = brcmu_pkt_buf_get_skb(totlen);
  153. if (!glom_skb)
  154. return -ENOMEM;
  155. - err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
  156. + err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
  157. glom_skb);
  158. if (err)
  159. goto done;
  160. @@ -582,8 +590,8 @@ int brcmf_sdiod_recv_chain(struct brcmf_
  161. skb_pull(glom_skb, skb->len);
  162. }
  163. } else
  164. - err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, false, addr,
  165. - pktq);
  166. + err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], false,
  167. + addr, pktq);
  168. done:
  169. brcmu_pkt_buf_free_skb(glom_skb);
  170. @@ -614,7 +622,8 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
  171. addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
  172. if (!err)
  173. - err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
  174. + err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2], addr,
  175. + mypkt);
  176. brcmu_pkt_buf_free_skb(mypkt);
  177. @@ -639,14 +648,14 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
  178. if (pktq->qlen == 1 || !sdiodev->sg_support) {
  179. skb_queue_walk(pktq, skb) {
  180. - err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
  181. + err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2],
  182. addr, skb);
  183. if (err)
  184. break;
  185. }
  186. } else {
  187. - err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, true, addr,
  188. - pktq);
  189. + err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], true,
  190. + addr, pktq);
  191. }
  192. return err;
  193. @@ -696,10 +705,10 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
  194. if (write) {
  195. memcpy(pkt->data, data, dsize);
  196. - err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
  197. + err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[1],
  198. sdaddr, pkt);
  199. } else {
  200. - err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
  201. + err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[1],
  202. sdaddr, pkt);
  203. }
  204. @@ -728,12 +737,12 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
  205. return err;
  206. }
  207. -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn)
  208. +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func)
  209. {
  210. brcmf_dbg(SDIO, "Enter\n");
  211. /* Issue abort cmd52 command through F0 */
  212. - brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, fn, NULL);
  213. + brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, func->num, NULL);
  214. brcmf_dbg(SDIO, "Exit\n");
  215. return 0;
  216. @@ -1105,7 +1114,7 @@ static int brcmf_ops_sdio_suspend(struct
  217. func = container_of(dev, struct sdio_func, dev);
  218. brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
  219. - if (func->num != SDIO_FUNC_1)
  220. + if (func->num != 1)
  221. return 0;
  222. @@ -1134,7 +1143,7 @@ static int brcmf_ops_sdio_resume(struct
  223. struct sdio_func *func = container_of(dev, struct sdio_func, dev);
  224. brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
  225. - if (func->num != SDIO_FUNC_2)
  226. + if (func->num != 2)
  227. return 0;
  228. brcmf_sdiod_freezer_off(sdiodev);
  229. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
  230. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
  231. @@ -1157,7 +1157,7 @@ static void brcmf_sdio_rxfail(struct brc
  232. rtx ? ", send NAK" : "");
  233. if (abort)
  234. - brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
  235. + brcmf_sdiod_abort(bus->sdiodev, bus->sdiodev->func[2]);
  236. brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM,
  237. &err);
  238. @@ -1209,7 +1209,7 @@ static void brcmf_sdio_txfail(struct brc
  239. brcmf_err("sdio error, abort command and terminate frame\n");
  240. bus->sdcnt.tx_sderrs++;
  241. - brcmf_sdiod_abort(sdiodev, SDIO_FUNC_2);
  242. + brcmf_sdiod_abort(sdiodev, sdiodev->func[2]);
  243. brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL);
  244. bus->sdcnt.f1regdata++;
  245. @@ -2072,7 +2072,7 @@ static int brcmf_sdio_txpkt_prep_sg(stru
  246. int ntail, ret;
  247. sdiodev = bus->sdiodev;
  248. - blksize = sdiodev->func[SDIO_FUNC_2]->cur_blksize;
  249. + blksize = sdiodev->func[2]->cur_blksize;
  250. /* sg entry alignment should be a divisor of block size */
  251. WARN_ON(blksize % bus->sgentry_align);
  252. @@ -2441,7 +2441,7 @@ static void brcmf_sdio_bus_stop(struct d
  253. /* Turn off the bus (F2), free any pending packets */
  254. brcmf_dbg(INTR, "disable SDIO interrupts\n");
  255. - sdio_disable_func(sdiodev->func[SDIO_FUNC_2]);
  256. + sdio_disable_func(sdiodev->func[2]);
  257. /* Clear any pending interrupts now that F2 is disabled */
  258. brcmf_sdiod_writel(sdiodev, core->base + SD_REG(intstatus),
  259. @@ -4066,8 +4066,7 @@ static void brcmf_sdio_firmware_callback
  260. brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata),
  261. SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL);
  262. - err = sdio_enable_func(sdiodev->func[SDIO_FUNC_2]);
  263. -
  264. + err = sdio_enable_func(sdiodev->func[2]);
  265. brcmf_dbg(INFO, "enable F2: err=%d\n", err);
  266. @@ -4082,7 +4081,7 @@ static void brcmf_sdio_firmware_callback
  267. brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err);
  268. } else {
  269. /* Disable F2 again */
  270. - sdio_disable_func(sdiodev->func[SDIO_FUNC_2]);
  271. + sdio_disable_func(sdiodev->func[2]);
  272. goto release;
  273. }
  274. @@ -4219,7 +4218,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
  275. sdio_claim_host(bus->sdiodev->func[1]);
  276. /* Disable F2 to clear any intermediate frame state on the dongle */
  277. - sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
  278. + sdio_disable_func(bus->sdiodev->func[2]);
  279. bus->rxflow = false;
  280. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
  281. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
  282. @@ -45,9 +45,6 @@
  283. #define REG_F0_REG_MASK 0x7FF
  284. #define REG_F1_MISC_MASK 0x1FFFF
  285. -/* as of sdiod rev 0, supports 3 functions */
  286. -#define SBSDIO_NUM_FUNCTION 3
  287. -
  288. /* function 0 vendor specific CCCR registers */
  289. #define SDIO_CCCR_BRCM_CARDCAP 0xf0
  290. @@ -350,7 +347,8 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_
  291. u8 *data, uint size);
  292. /* Issue an abort to the specified function */
  293. -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn);
  294. +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
  295. +
  296. void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
  297. void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
  298. enum brcmf_sdiod_state state);