summaryrefslogtreecommitdiff
path: root/package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2018-06-18 07:09:14 +0200
committerRafał Miłecki <rafal@milecki.pl>2018-06-18 07:41:40 +0200
commit7e8eb7f309a802ba10a13ddb807c6a31fecc9183 (patch)
treedf1f4c82c2d48e76507516210eee186177ebf8b4 /package/kernel/mac80211/patches/327-v4.17-0009-brcmfmac-add-extension-to-.get_fwname-callbacks.patch
parentf5bce268b0e836a7e6ae9162cc0962601364d589 (diff)
downloadmtk-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.patch231
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 = {