232 lines
7.3 KiB
Diff
232 lines
7.3 KiB
Diff
|
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 = {
|