mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
170 lines
6.7 KiB
Diff
170 lines
6.7 KiB
Diff
From 6a0d8f8abbd458ac67716c4cce00050f8c7654fe Mon Sep 17 00:00:00 2001
|
|
From: Phil Elwell <phil@raspberrypi.com>
|
|
Date: Thu, 22 Jul 2021 14:34:42 +0100
|
|
Subject: [PATCH 513/552] brcmfmac: Try product-specific clm_blob names first
|
|
|
|
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
|
---
|
|
.../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 11 +++++++++--
|
|
.../wireless/broadcom/brcm80211/brcmfmac/common.c | 14 ++++++++++++--
|
|
.../broadcom/brcm80211/brcmfmac/firmware.c | 2 +-
|
|
.../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 7 ++++++-
|
|
.../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 +++++++++++-
|
|
.../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 7 ++++++-
|
|
6 files changed, 45 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
|
index 3f5da3bb6aa5..ba3c58caac9f 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
|
@@ -78,7 +78,7 @@ struct brcmf_bus_ops {
|
|
size_t (*get_ramsize)(struct device *dev);
|
|
int (*get_memdump)(struct device *dev, void *data, size_t len);
|
|
int (*get_fwname)(struct device *dev, const char *ext,
|
|
- unsigned char *fw_name);
|
|
+ unsigned char *fw_name, bool board_specific);
|
|
void (*debugfs_create)(struct device *dev);
|
|
int (*reset)(struct device *dev);
|
|
};
|
|
@@ -223,7 +223,14 @@ static inline
|
|
int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext,
|
|
unsigned char *fw_name)
|
|
{
|
|
- return bus->ops->get_fwname(bus->dev, ext, fw_name);
|
|
+ return bus->ops->get_fwname(bus->dev, ext, fw_name, false);
|
|
+}
|
|
+
|
|
+static inline
|
|
+int brcmf_bus_get_board_fwname(struct brcmf_bus *bus, const char *ext,
|
|
+ unsigned char *fw_name)
|
|
+{
|
|
+ return bus->ops->get_fwname(bus->dev, ext, fw_name, true);
|
|
}
|
|
|
|
static inline
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
index e3758bd86acf..9047a0813ebf 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
@@ -134,13 +134,23 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
|
|
brcmf_dbg(TRACE, "Enter\n");
|
|
|
|
memset(clm_name, 0, sizeof(clm_name));
|
|
- err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name);
|
|
+ err = brcmf_bus_get_board_fwname(bus, ".clm_blob", clm_name);
|
|
if (err) {
|
|
bphy_err(drvr, "get CLM blob file name failed (%d)\n", err);
|
|
return err;
|
|
}
|
|
|
|
- err = firmware_request_nowarn(&clm, clm_name, bus->dev);
|
|
+ if (clm_name[0])
|
|
+ err = firmware_request_nowarn(&clm, clm_name, bus->dev);
|
|
+ if (err || !clm_name[0]) {
|
|
+ err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name);
|
|
+ if (err) {
|
|
+ bphy_err(drvr, "get CLM blob file name failed (%d)\n", err);
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ err = firmware_request_nowarn(&clm, clm_name, bus->dev);
|
|
+ }
|
|
if (err) {
|
|
brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n",
|
|
err);
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
|
index 5e14df09f873..beb45adc009f 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
|
@@ -630,7 +630,7 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
|
strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
|
|
strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
|
|
|
|
- ret = request_firmware(fw, alt_path, fwctx->dev);
|
|
+ ret = firmware_request_nowarn(fw, alt_path, fwctx->dev);
|
|
if (ret == 0)
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
index c49dd0c36ae4..69280117ef9c 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
@@ -1402,7 +1402,8 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
|
|
}
|
|
|
|
static
|
|
-int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
|
+int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name,
|
|
+ bool board_specific)
|
|
{
|
|
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
|
struct brcmf_fw_request *fwreq;
|
|
@@ -1410,6 +1411,10 @@ int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
|
{ ext, fw_name },
|
|
};
|
|
|
|
+ if (board_specific) {
|
|
+ fw_name[0] = 0;
|
|
+ return 0;
|
|
+ }
|
|
fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
|
|
brcmf_pcie_fwnames,
|
|
ARRAY_SIZE(brcmf_pcie_fwnames),
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
index 3d57168eabe5..1b86f222648e 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
|
@@ -4122,14 +4122,24 @@ brcmf_sdio_watchdog(struct timer_list *t)
|
|
}
|
|
|
|
static
|
|
-int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
|
+int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name,
|
|
+ bool board_specific)
|
|
{
|
|
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
|
+ struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
|
|
struct brcmf_fw_request *fwreq;
|
|
+ u8 board_ext[BRCMF_FW_NAME_LEN];
|
|
struct brcmf_fw_name fwnames[] = {
|
|
{ ext, fw_name },
|
|
};
|
|
|
|
+ if (board_specific) {
|
|
+ strlcpy(board_ext, ".", BRCMF_FW_NAME_LEN);
|
|
+ strlcat(board_ext, sdiodev->settings->board_type,
|
|
+ BRCMF_FW_NAME_LEN);
|
|
+ strlcat(board_ext, ext, BRCMF_FW_NAME_LEN);
|
|
+ fwnames[0].extension = board_ext;
|
|
+ }
|
|
fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
|
|
brcmf_sdio_fwnames,
|
|
ARRAY_SIZE(brcmf_sdio_fwnames),
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
|
index 9fb68c2dc7e3..9bf2dbd30ded 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
|
@@ -1155,7 +1155,8 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
|
|
}
|
|
|
|
static
|
|
-int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
|
+int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name,
|
|
+ bool board_specific)
|
|
{
|
|
struct brcmf_bus *bus = dev_get_drvdata(dev);
|
|
struct brcmf_fw_request *fwreq;
|
|
@@ -1163,6 +1164,10 @@ int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
|
{ ext, fw_name },
|
|
};
|
|
|
|
+ if (board_specific) {
|
|
+ fw_name[0] = 0;
|
|
+ return 0;
|
|
+ }
|
|
fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev,
|
|
brcmf_usb_fwnames,
|
|
ARRAY_SIZE(brcmf_usb_fwnames),
|
|
--
|
|
2.33.0
|
|
|