diff options
author | Rafał Miłecki <rafal@milecki.pl> | 2018-06-18 07:09:14 +0200 |
---|---|---|
committer | Rafał Miłecki <rafal@milecki.pl> | 2018-06-18 07:41:40 +0200 |
commit | 7e8eb7f309a802ba10a13ddb807c6a31fecc9183 (patch) | |
tree | df1f4c82c2d48e76507516210eee186177ebf8b4 /package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch | |
parent | f5bce268b0e836a7e6ae9162cc0962601364d589 (diff) | |
download | mtk-20170518-7e8eb7f309a802ba10a13ddb807c6a31fecc9183.zip mtk-20170518-7e8eb7f309a802ba10a13ddb807c6a31fecc9183.tar.gz mtk-20170518-7e8eb7f309a802ba10a13ddb807c6a31fecc9183.tar.bz2 |
mac80211: backport brcmfmac firmware & clm_blob loading rework
It backports remaining brcmfmac changes from 4.17.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Diffstat (limited to 'package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch')
-rw-r--r-- | package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch b/package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch new file mode 100644 index 0000000..391229a --- /dev/null +++ b/package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch @@ -0,0 +1,231 @@ +From bf7a7b37f6ef5090a2bae7e7ae23cd26b741cca4 Mon Sep 17 00:00:00 2001 +From: Arend Van Spriel <arend.vanspriel@broadcom.com> +Date: Thu, 22 Mar 2018 21:28:28 +0100 +Subject: [PATCH] brcmfmac: add extension to .get_fwname() callbacks + +This changes the bus layer api by having the caller provide an +extension. With this the callback can use brcmf_fw_alloc_request() +to get the needed firmware name. + +Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> +Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> +Reviewed-by: Franky Lin <franky.lin@broadcom.com> +Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> +Signed-off-by: Kalle Valo <kvalo@codeaurora.org> +--- + .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 6 +-- + .../wireless/broadcom/brcm80211/brcmfmac/common.c | 43 +++------------------- + .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 27 +++++++------- + .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 26 +++++++------ + .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 27 ++++++++------ + 5 files changed, 51 insertions(+), 78 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +@@ -88,7 +88,7 @@ struct brcmf_bus_ops { + void (*wowl_config)(struct device *dev, bool enabled); + size_t (*get_ramsize)(struct device *dev); + int (*get_memdump)(struct device *dev, void *data, size_t len); +- int (*get_fwname)(struct device *dev, uint chip, uint chiprev, ++ int (*get_fwname)(struct device *dev, const char *ext, + unsigned char *fw_name); + }; + +@@ -228,10 +228,10 @@ int brcmf_bus_get_memdump(struct brcmf_b + } + + static inline +-int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev, ++int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext, + unsigned char *fw_name) + { +- return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name); ++ return bus->ops->get_fwname(bus->dev, ext, fw_name); + } + + /* +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +@@ -129,42 +129,9 @@ static int brcmf_c_download(struct brcmf + return err; + } + +-static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name) +-{ +- struct brcmf_bus *bus = ifp->drvr->bus_if; +- u8 fw_name[BRCMF_FW_NAME_LEN]; +- u8 *ptr; +- size_t len; +- s32 err; +- +- memset(fw_name, 0, BRCMF_FW_NAME_LEN); +- err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name); +- if (err) { +- brcmf_err("get firmware name failed (%d)\n", err); +- goto done; +- } +- +- /* generate CLM blob file name */ +- ptr = strrchr(fw_name, '.'); +- if (!ptr) { +- err = -ENOENT; +- goto done; +- } +- +- len = ptr - fw_name + 1; +- if (len + strlen(".clm_blob") > BRCMF_FW_NAME_LEN) { +- err = -E2BIG; +- } else { +- strlcpy(clm_name, fw_name, len); +- strlcat(clm_name, ".clm_blob", BRCMF_FW_NAME_LEN); +- } +-done: +- return err; +-} +- + static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) + { +- struct device *dev = ifp->drvr->bus_if->dev; ++ struct brcmf_bus *bus = ifp->drvr->bus_if; + struct brcmf_dload_data_le *chunk_buf; + const struct firmware *clm = NULL; + u8 clm_name[BRCMF_FW_NAME_LEN]; +@@ -177,16 +144,16 @@ static int brcmf_c_process_clm_blob(stru + + brcmf_dbg(TRACE, "Enter\n"); + +- memset(clm_name, 0, BRCMF_FW_NAME_LEN); +- err = brcmf_c_get_clm_name(ifp, clm_name); ++ memset(clm_name, 0, sizeof(clm_name)); ++ err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name); + if (err) { + brcmf_err("get CLM blob file name failed (%d)\n", err); + return err; + } + +- err = request_firmware(&clm, clm_name, dev); ++ err = request_firmware(&clm, clm_name, bus->dev); + if (err) { +- brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n", ++ brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", + err); + return 0; + } +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -1350,23 +1350,24 @@ static int brcmf_pcie_get_memdump(struct + return 0; + } + +-static int brcmf_pcie_get_fwname(struct device *dev, u32 chip, u32 chiprev, +- u8 *fw_name) ++static ++int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name) + { + struct brcmf_bus *bus_if = dev_get_drvdata(dev); +- struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie; +- struct brcmf_pciedev_info *devinfo = buspub->devinfo; +- int ret = 0; ++ struct brcmf_fw_request *fwreq; ++ struct brcmf_fw_name fwnames[] = { ++ { ext, fw_name }, ++ }; + +- if (devinfo->fw_name[0] != '\0') +- strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN); +- else +- ret = brcmf_fw_map_chip_to_name(chip, chiprev, +- brcmf_pcie_fwnames, +- ARRAY_SIZE(brcmf_pcie_fwnames), +- fw_name, NULL); ++ fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev, ++ brcmf_pcie_fwnames, ++ ARRAY_SIZE(brcmf_pcie_fwnames), ++ fwnames, ARRAY_SIZE(fwnames)); ++ if (!fwreq) ++ return -ENOMEM; + +- return ret; ++ kfree(fwreq); ++ return 0; + } + + static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +@@ -4000,22 +4000,24 @@ brcmf_sdio_watchdog(unsigned long data) + } + } + +-static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev, +- u8 *fw_name) ++static ++int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name) + { + struct brcmf_bus *bus_if = dev_get_drvdata(dev); +- struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; +- int ret = 0; ++ struct brcmf_fw_request *fwreq; ++ struct brcmf_fw_name fwnames[] = { ++ { ext, fw_name }, ++ }; + +- if (sdiodev->fw_name[0] != '\0') +- strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN); +- else +- ret = brcmf_fw_map_chip_to_name(chip, chiprev, +- brcmf_sdio_fwnames, +- ARRAY_SIZE(brcmf_sdio_fwnames), +- fw_name, NULL); ++ fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev, ++ brcmf_sdio_fwnames, ++ ARRAY_SIZE(brcmf_sdio_fwnames), ++ fwnames, ARRAY_SIZE(fwnames)); ++ if (!fwreq) ++ return -ENOMEM; + +- return ret; ++ kfree(fwreq); ++ return 0; + } + + static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -1128,21 +1128,24 @@ static void brcmf_usb_wowl_config(struct + device_set_wakeup_enable(devinfo->dev, false); + } + +-static int brcmf_usb_get_fwname(struct device *dev, u32 chip, u32 chiprev, +- u8 *fw_name) ++static ++int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name) + { +- struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); +- int ret = 0; ++ struct brcmf_bus *bus = dev_get_drvdata(dev); ++ struct brcmf_fw_request *fwreq; ++ struct brcmf_fw_name fwnames[] = { ++ { ext, fw_name }, ++ }; + +- if (devinfo->fw_name[0] != '\0') +- strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN); +- else +- ret = brcmf_fw_map_chip_to_name(chip, chiprev, +- brcmf_usb_fwnames, +- ARRAY_SIZE(brcmf_usb_fwnames), +- fw_name, NULL); ++ fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev, ++ brcmf_usb_fwnames, ++ ARRAY_SIZE(brcmf_usb_fwnames), ++ fwnames, ARRAY_SIZE(fwnames)); ++ if (!fwreq) ++ return -ENOMEM; + +- return ret; ++ kfree(fwreq); ++ return 0; + } + + static const struct brcmf_bus_ops brcmf_usb_bus_ops = { |