327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. From bf7a7b37f6ef5090a2bae7e7ae23cd26b741cca4 Mon Sep 17 00:00:00 2001
  2. From: Arend Van Spriel <[email protected]>
  3. Date: Thu, 22 Mar 2018 21:28:28 +0100
  4. Subject: [PATCH] brcmfmac: add extension to .get_fwname() callbacks
  5. This changes the bus layer api by having the caller provide an
  6. extension. With this the callback can use brcmf_fw_alloc_request()
  7. to get the needed firmware name.
  8. Reviewed-by: Hante Meuleman <[email protected]>
  9. Reviewed-by: Pieter-Paul Giesberts <[email protected]>
  10. Reviewed-by: Franky Lin <[email protected]>
  11. Signed-off-by: Arend van Spriel <[email protected]>
  12. Signed-off-by: Kalle Valo <[email protected]>
  13. ---
  14. .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 6 +--
  15. .../wireless/broadcom/brcm80211/brcmfmac/common.c | 43 +++-------------------
  16. .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 27 +++++++-------
  17. .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 26 +++++++------
  18. .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 27 ++++++++------
  19. 5 files changed, 51 insertions(+), 78 deletions(-)
  20. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
  21. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
  22. @@ -88,7 +88,7 @@ struct brcmf_bus_ops {
  23. void (*wowl_config)(struct device *dev, bool enabled);
  24. size_t (*get_ramsize)(struct device *dev);
  25. int (*get_memdump)(struct device *dev, void *data, size_t len);
  26. - int (*get_fwname)(struct device *dev, uint chip, uint chiprev,
  27. + int (*get_fwname)(struct device *dev, const char *ext,
  28. unsigned char *fw_name);
  29. };
  30. @@ -228,10 +228,10 @@ int brcmf_bus_get_memdump(struct brcmf_b
  31. }
  32. static inline
  33. -int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev,
  34. +int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext,
  35. unsigned char *fw_name)
  36. {
  37. - return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name);
  38. + return bus->ops->get_fwname(bus->dev, ext, fw_name);
  39. }
  40. /*
  41. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
  42. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
  43. @@ -129,42 +129,9 @@ static int brcmf_c_download(struct brcmf
  44. return err;
  45. }
  46. -static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name)
  47. -{
  48. - struct brcmf_bus *bus = ifp->drvr->bus_if;
  49. - u8 fw_name[BRCMF_FW_NAME_LEN];
  50. - u8 *ptr;
  51. - size_t len;
  52. - s32 err;
  53. -
  54. - memset(fw_name, 0, BRCMF_FW_NAME_LEN);
  55. - err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name);
  56. - if (err) {
  57. - brcmf_err("get firmware name failed (%d)\n", err);
  58. - goto done;
  59. - }
  60. -
  61. - /* generate CLM blob file name */
  62. - ptr = strrchr(fw_name, '.');
  63. - if (!ptr) {
  64. - err = -ENOENT;
  65. - goto done;
  66. - }
  67. -
  68. - len = ptr - fw_name + 1;
  69. - if (len + strlen(".clm_blob") > BRCMF_FW_NAME_LEN) {
  70. - err = -E2BIG;
  71. - } else {
  72. - strlcpy(clm_name, fw_name, len);
  73. - strlcat(clm_name, ".clm_blob", BRCMF_FW_NAME_LEN);
  74. - }
  75. -done:
  76. - return err;
  77. -}
  78. -
  79. static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
  80. {
  81. - struct device *dev = ifp->drvr->bus_if->dev;
  82. + struct brcmf_bus *bus = ifp->drvr->bus_if;
  83. struct brcmf_dload_data_le *chunk_buf;
  84. const struct firmware *clm = NULL;
  85. u8 clm_name[BRCMF_FW_NAME_LEN];
  86. @@ -177,16 +144,16 @@ static int brcmf_c_process_clm_blob(stru
  87. brcmf_dbg(TRACE, "Enter\n");
  88. - memset(clm_name, 0, BRCMF_FW_NAME_LEN);
  89. - err = brcmf_c_get_clm_name(ifp, clm_name);
  90. + memset(clm_name, 0, sizeof(clm_name));
  91. + err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name);
  92. if (err) {
  93. brcmf_err("get CLM blob file name failed (%d)\n", err);
  94. return err;
  95. }
  96. - err = request_firmware(&clm, clm_name, dev);
  97. + err = request_firmware(&clm, clm_name, bus->dev);
  98. if (err) {
  99. - brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n",
  100. + brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n",
  101. err);
  102. return 0;
  103. }
  104. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
  105. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
  106. @@ -1350,23 +1350,24 @@ static int brcmf_pcie_get_memdump(struct
  107. return 0;
  108. }
  109. -static int brcmf_pcie_get_fwname(struct device *dev, u32 chip, u32 chiprev,
  110. - u8 *fw_name)
  111. +static
  112. +int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
  113. {
  114. struct brcmf_bus *bus_if = dev_get_drvdata(dev);
  115. - struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
  116. - struct brcmf_pciedev_info *devinfo = buspub->devinfo;
  117. - int ret = 0;
  118. + struct brcmf_fw_request *fwreq;
  119. + struct brcmf_fw_name fwnames[] = {
  120. + { ext, fw_name },
  121. + };
  122. - if (devinfo->fw_name[0] != '\0')
  123. - strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
  124. - else
  125. - ret = brcmf_fw_map_chip_to_name(chip, chiprev,
  126. - brcmf_pcie_fwnames,
  127. - ARRAY_SIZE(brcmf_pcie_fwnames),
  128. - fw_name, NULL);
  129. + fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
  130. + brcmf_pcie_fwnames,
  131. + ARRAY_SIZE(brcmf_pcie_fwnames),
  132. + fwnames, ARRAY_SIZE(fwnames));
  133. + if (!fwreq)
  134. + return -ENOMEM;
  135. - return ret;
  136. + kfree(fwreq);
  137. + return 0;
  138. }
  139. static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
  140. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
  141. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
  142. @@ -4000,22 +4000,24 @@ brcmf_sdio_watchdog(unsigned long data)
  143. }
  144. }
  145. -static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
  146. - u8 *fw_name)
  147. +static
  148. +int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
  149. {
  150. struct brcmf_bus *bus_if = dev_get_drvdata(dev);
  151. - struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
  152. - int ret = 0;
  153. + struct brcmf_fw_request *fwreq;
  154. + struct brcmf_fw_name fwnames[] = {
  155. + { ext, fw_name },
  156. + };
  157. - if (sdiodev->fw_name[0] != '\0')
  158. - strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN);
  159. - else
  160. - ret = brcmf_fw_map_chip_to_name(chip, chiprev,
  161. - brcmf_sdio_fwnames,
  162. - ARRAY_SIZE(brcmf_sdio_fwnames),
  163. - fw_name, NULL);
  164. + fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
  165. + brcmf_sdio_fwnames,
  166. + ARRAY_SIZE(brcmf_sdio_fwnames),
  167. + fwnames, ARRAY_SIZE(fwnames));
  168. + if (!fwreq)
  169. + return -ENOMEM;
  170. - return ret;
  171. + kfree(fwreq);
  172. + return 0;
  173. }
  174. static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
  175. --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
  176. +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
  177. @@ -1128,21 +1128,24 @@ static void brcmf_usb_wowl_config(struct
  178. device_set_wakeup_enable(devinfo->dev, false);
  179. }
  180. -static int brcmf_usb_get_fwname(struct device *dev, u32 chip, u32 chiprev,
  181. - u8 *fw_name)
  182. +static
  183. +int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
  184. {
  185. - struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
  186. - int ret = 0;
  187. + struct brcmf_bus *bus = dev_get_drvdata(dev);
  188. + struct brcmf_fw_request *fwreq;
  189. + struct brcmf_fw_name fwnames[] = {
  190. + { ext, fw_name },
  191. + };
  192. - if (devinfo->fw_name[0] != '\0')
  193. - strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
  194. - else
  195. - ret = brcmf_fw_map_chip_to_name(chip, chiprev,
  196. - brcmf_usb_fwnames,
  197. - ARRAY_SIZE(brcmf_usb_fwnames),
  198. - fw_name, NULL);
  199. + fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev,
  200. + brcmf_usb_fwnames,
  201. + ARRAY_SIZE(brcmf_usb_fwnames),
  202. + fwnames, ARRAY_SIZE(fwnames));
  203. + if (!fwreq)
  204. + return -ENOMEM;
  205. - return ret;
  206. + kfree(fwreq);
  207. + return 0;
  208. }
  209. static const struct brcmf_bus_ops brcmf_usb_bus_ops = {