You've already forked linux-t2-patches
mirror of
https://github.com/t2linux/linux-t2-patches.git
synced 2026-04-30 13:52:11 -07:00
Update patches
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
From 180aaf006432f3c08d2ab6c4798f5ad5982f684c Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Sat, 18 Dec 2021 20:52:04 +0900
|
||||
Subject: [PATCH 01/27] brcmfmac: firmware: Handle per-board clm_blob files
|
||||
|
||||
Teach brcm_alt_fw_paths to correctly split off variable length
|
||||
extensions, and enable alt firmware lookups for the CLM blob firmware
|
||||
requests.
|
||||
|
||||
Apple platforms have per-board CLM blob files.
|
||||
|
||||
Acked-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 33 +++++++++++--------
|
||||
1 file changed, 20 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index dcbe55b56e43..deacd39b3f7b 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -596,22 +596,29 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||
|
||||
static char *brcm_alt_fw_path(const char *path, const char *board_type)
|
||||
{
|
||||
- char alt_path[BRCMF_FW_NAME_LEN];
|
||||
- char suffix[5];
|
||||
+ char base[BRCMF_FW_NAME_LEN];
|
||||
+ const char *suffix;
|
||||
+ char *ret;
|
||||
|
||||
- strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
- /* At least one character + suffix */
|
||||
- if (strlen(alt_path) < 5)
|
||||
+ if (!board_type)
|
||||
return NULL;
|
||||
|
||||
- /* strip .txt or .bin at the end */
|
||||
- strscpy(suffix, alt_path + strlen(alt_path) - 4, 5);
|
||||
- alt_path[strlen(alt_path) - 4] = 0;
|
||||
- strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
+ suffix = strrchr(path, '.');
|
||||
+ if (!suffix || suffix == path)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* strip extension at the end */
|
||||
+ strscpy(base, path, BRCMF_FW_NAME_LEN);
|
||||
+ base[suffix - path] = 0;
|
||||
+
|
||||
+ ret = kasprintf(GFP_KERNEL, "%s.%s%s", base, board_type, suffix);
|
||||
+ if (!ret)
|
||||
+ brcmf_err("out of memory allocating firmware path for '%s'\n",
|
||||
+ path);
|
||||
+
|
||||
+ brcmf_dbg(TRACE, "FW alt path: %s\n", ret);
|
||||
|
||||
- return kstrdup(alt_path, GFP_KERNEL);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
@@ -621,7 +628,7 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
int ret;
|
||||
|
||||
/* Files can be board-specific, first try a board-specific path */
|
||||
- if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
|
||||
+ if (fwctx->req->board_type) {
|
||||
char *alt_path;
|
||||
|
||||
alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type);
|
||||
--
|
||||
2.36.0
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
From 8378dd2076a04b084f37bb945205eb2b5a2d7c2d Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Sat, 18 Dec 2021 20:38:34 +0900
|
||||
Subject: [PATCH 02/33] brcmfmac: firmware: Support having multiple alt paths
|
||||
|
||||
Apple platforms have firmware and config files identified with multiple
|
||||
dimensions. We want to be able to find the most specific firmware
|
||||
available for any given platform, progressively trying more general
|
||||
firmwares.
|
||||
|
||||
First, add support for having multiple alternate firmware paths.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
---
|
||||
Adjusted for rebase on:
|
||||
- c4caf72 ("brcmfmac: firmware: Fix crash in brcm_alt_fw_path")
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 76 ++++++++++++++-----
|
||||
1 file changed, 56 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index d99140960..9a6e339af 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -427,6 +427,8 @@ void brcmf_fw_nvram_free(void *nvram)
|
||||
struct brcmf_fw {
|
||||
struct device *dev;
|
||||
struct brcmf_fw_request *req;
|
||||
+ const char **alt_paths;
|
||||
+ int alt_index;
|
||||
u32 curpos;
|
||||
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
};
|
||||
@@ -592,9 +594,10 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||
}
|
||||
|
||||
-static char *brcm_alt_fw_path(const char *path, const char *board_type)
|
||||
+static const char **brcm_alt_fw_paths(const char *path, const char *board_type)
|
||||
{
|
||||
char alt_path[BRCMF_FW_NAME_LEN];
|
||||
+ char **alt_paths;
|
||||
char suffix[5];
|
||||
|
||||
strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
@@ -609,27 +612,45 @@ static char *brcm_alt_fw_path(const char *path, const char *board_type)
|
||||
strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN);
|
||||
strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
|
||||
- return kstrdup(alt_path, GFP_KERNEL);
|
||||
+ alt_paths = kzalloc(sizeof(char *) * 2, GFP_KERNEL);
|
||||
+ alt_paths[0] = kstrdup(alt_path, GFP_KERNEL);
|
||||
+
|
||||
+ return (const char **)alt_paths;
|
||||
+}
|
||||
+
|
||||
+static void brcm_free_alt_fw_paths(const char **alt_paths)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (!alt_paths)
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; alt_paths[i]; i++)
|
||||
+ kfree(alt_paths[i]);
|
||||
+
|
||||
+ kfree(alt_paths);
|
||||
}
|
||||
|
||||
static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
struct brcmf_fw *fwctx)
|
||||
{
|
||||
struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
|
||||
- int ret;
|
||||
+ int ret, i;
|
||||
|
||||
/* Files can be board-specific, first try a board-specific path */
|
||||
if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
|
||||
- char *alt_path;
|
||||
-
|
||||
- alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type);
|
||||
- if (!alt_path)
|
||||
+ const char **alt_paths = brcm_alt_fw_paths(cur->path, fwctx);
|
||||
+ if (!alt_paths)
|
||||
goto fallback;
|
||||
|
||||
- ret = request_firmware(fw, alt_path, fwctx->dev);
|
||||
- kfree(alt_path);
|
||||
- if (ret == 0)
|
||||
- return ret;
|
||||
+ for (i = 0; alt_paths[i]; i++) {
|
||||
+ ret = firmware_request_nowarn(fw, alt_paths[i], fwctx->dev);
|
||||
+ if (ret == 0) {
|
||||
+ brcm_free_alt_fw_paths(alt_paths);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+ brcm_free_alt_fw_paths(alt_paths);
|
||||
}
|
||||
|
||||
fallback:
|
||||
@@ -641,6 +662,9 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||
struct brcmf_fw *fwctx = ctx;
|
||||
int ret;
|
||||
|
||||
+ brcm_free_alt_fw_paths(fwctx->alt_paths);
|
||||
+ fwctx->alt_paths = NULL;
|
||||
+
|
||||
ret = brcmf_fw_complete_request(fw, fwctx);
|
||||
|
||||
while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
|
||||
@@ -662,13 +686,26 @@ static void brcmf_fw_request_done_alt_path(const struct firmware *fw, void *ctx)
|
||||
struct brcmf_fw_item *first = &fwctx->req->items[0];
|
||||
int ret = 0;
|
||||
|
||||
- /* Fall back to canonical path if board firmware not found */
|
||||
- if (!fw)
|
||||
+ if (fw) {
|
||||
+ brcmf_fw_request_done(fw, ctx);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ fwctx->alt_index++;
|
||||
+ if (fwctx->alt_paths[fwctx->alt_index]) {
|
||||
+ /* Try the next alt firmware */
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true,
|
||||
+ fwctx->alt_paths[fwctx->alt_index],
|
||||
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||
+ brcmf_fw_request_done_alt_path);
|
||||
+ } else {
|
||||
+ /* Fall back to canonical path if board firmware not found */
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
brcmf_fw_request_done);
|
||||
+ }
|
||||
|
||||
- if (fw || ret < 0)
|
||||
+ if (ret < 0)
|
||||
brcmf_fw_request_done(fw, ctx);
|
||||
}
|
||||
|
||||
@@ -693,7 +730,6 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
- char *alt_path = NULL;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -713,13 +749,13 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
|
||||
/* First try alternative board-specific path if any */
|
||||
if (fwctx->req->board_type)
|
||||
- alt_path = brcm_alt_fw_path(first->path,
|
||||
- fwctx->req->board_type);
|
||||
- if (alt_path) {
|
||||
- ret = request_firmware_nowait(THIS_MODULE, true, alt_path,
|
||||
+ fwctx->alt_paths = brcm_alt_fw_paths(first->path, fwctx);
|
||||
+
|
||||
+ if (fwctx->alt_paths) {
|
||||
+ fwctx->alt_index = 0;
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, fwctx->alt_paths[0],
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
brcmf_fw_request_done_alt_path);
|
||||
- kfree(alt_path);
|
||||
} else {
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
--
|
||||
2.25.1
|
||||
|
||||
+27
-26
@@ -1,7 +1,7 @@
|
||||
From 2a33be44976577007be09404ee29cf976c20f960 Mon Sep 17 00:00:00 2001
|
||||
From f39c196b44d46f1abd75318a7b9b6c6ef938a0ea Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:13:49 +0900
|
||||
Subject: [PATCH 04/33] brcmfmac: pcie/sdio/usb: Get CLM blob via standard
|
||||
Subject: [PATCH 02/27] brcmfmac: pcie/sdio/usb: Get CLM blob via standard
|
||||
firmware mechanism
|
||||
|
||||
Now that the firmware fetcher can handle per-board CLM files, load the
|
||||
@@ -10,8 +10,9 @@ just return the existing blob, instead of fetching the filename.
|
||||
|
||||
This enables per-board CLM blobs, which are required on Apple platforms.
|
||||
|
||||
Acked-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/bus.h | 19 ++++++---
|
||||
.../broadcom/brcm80211/brcmfmac/common.c | 12 +-----
|
||||
@@ -22,7 +23,7 @@ Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
6 files changed, 69 insertions(+), 62 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
index 3f5da3bb6..b13af8f63 100644
|
||||
index 3f5da3bb6aa5..b13af8f631f3 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
|
||||
@@ -7,6 +7,8 @@
|
||||
@@ -81,7 +82,7 @@ index 3f5da3bb6..b13af8f63 100644
|
||||
|
||||
static inline
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
index e3758bd86..b8ed85112 100644
|
||||
index e3758bd86acf..b8ed851129b4 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -123,7 +123,6 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
|
||||
@@ -111,10 +112,10 @@ index e3758bd86..b8ed85112 100644
|
||||
err);
|
||||
return 0;
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index aed49416c..ab0503c6f 100644
|
||||
index 97f0f13dfe50..ec73d2620ec9 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -65,6 +65,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt");
|
||||
@@ -66,6 +66,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt");
|
||||
|
||||
/* per-board firmware binaries */
|
||||
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.bin");
|
||||
@@ -122,7 +123,7 @@ index aed49416c..ab0503c6f 100644
|
||||
|
||||
static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
|
||||
@@ -260,6 +261,8 @@ struct brcmf_pciedev_info {
|
||||
@@ -261,6 +262,8 @@ struct brcmf_pciedev_info {
|
||||
struct pci_dev *pdev;
|
||||
char fw_name[BRCMF_FW_NAME_LEN];
|
||||
char nvram_name[BRCMF_FW_NAME_LEN];
|
||||
@@ -131,14 +132,14 @@ index aed49416c..ab0503c6f 100644
|
||||
void __iomem *regs;
|
||||
void __iomem *tcm;
|
||||
u32 ram_base;
|
||||
@@ -1408,23 +1411,25 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
|
||||
@@ -1382,23 +1385,25 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static
|
||||
-int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
+static int brcmf_pcie_get_blob(struct device *dev, const struct firmware **fw,
|
||||
+ enum brcmf_blob_type type)
|
||||
+ enum brcmf_blob_type type)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
- struct brcmf_fw_request *fwreq;
|
||||
@@ -170,7 +171,7 @@ index aed49416c..ab0503c6f 100644
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1470,7 +1475,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
@@ -1445,7 +1450,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
.wowl_config = brcmf_pcie_wowl_config,
|
||||
.get_ramsize = brcmf_pcie_get_ramsize,
|
||||
.get_memdump = brcmf_pcie_get_memdump,
|
||||
@@ -179,7 +180,7 @@ index aed49416c..ab0503c6f 100644
|
||||
.reset = brcmf_pcie_reset,
|
||||
};
|
||||
|
||||
@@ -1755,6 +1760,7 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
|
||||
@@ -1731,6 +1736,7 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
|
||||
|
||||
#define BRCMF_PCIE_FW_CODE 0
|
||||
#define BRCMF_PCIE_FW_NVRAM 1
|
||||
@@ -187,7 +188,7 @@ index aed49416c..ab0503c6f 100644
|
||||
|
||||
static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
struct brcmf_fw_request *fwreq)
|
||||
@@ -1779,6 +1785,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
@@ -1755,6 +1761,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
|
||||
nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data;
|
||||
nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len;
|
||||
@@ -195,7 +196,7 @@ index aed49416c..ab0503c6f 100644
|
||||
kfree(fwreq);
|
||||
|
||||
ret = brcmf_chip_get_raminfo(devinfo->ci);
|
||||
@@ -1855,6 +1862,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -1830,6 +1837,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
struct brcmf_fw_name fwnames[] = {
|
||||
{ ".bin", devinfo->fw_name },
|
||||
{ ".txt", devinfo->nvram_name },
|
||||
@@ -203,7 +204,7 @@ index aed49416c..ab0503c6f 100644
|
||||
};
|
||||
|
||||
fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
|
||||
@@ -1867,6 +1875,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -1842,6 +1850,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
@@ -212,7 +213,7 @@ index aed49416c..ab0503c6f 100644
|
||||
fwreq->board_type = devinfo->settings->board_type;
|
||||
/* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
|
||||
fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
@@ -2005,6 +2015,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
|
||||
@@ -1981,6 +1991,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
|
||||
brcmf_pcie_release_ringbuffers(devinfo);
|
||||
brcmf_pcie_reset_device(devinfo);
|
||||
brcmf_pcie_release_resource(devinfo);
|
||||
@@ -221,10 +222,10 @@ index aed49416c..ab0503c6f 100644
|
||||
if (devinfo->ci)
|
||||
brcmf_chip_detach(devinfo->ci);
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
index 5d156e591..7466e6fd6 100644
|
||||
index 212fbbe1cd7e..27dc8ed29ac8 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4129,23 +4129,24 @@ brcmf_sdio_watchdog(struct timer_list *t)
|
||||
@@ -4130,23 +4130,24 @@ brcmf_sdio_watchdog(struct timer_list *t)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,7 +263,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4188,13 +4189,14 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
||||
@@ -4189,13 +4190,14 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
||||
.wowl_config = brcmf_sdio_wowl_config,
|
||||
.get_ramsize = brcmf_sdio_bus_get_ramsize,
|
||||
.get_memdump = brcmf_sdio_bus_get_memdump,
|
||||
@@ -278,7 +279,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
|
||||
static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
struct brcmf_fw_request *fwreq)
|
||||
@@ -4217,6 +4219,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
@@ -4218,6 +4220,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
|
||||
code = fwreq->items[BRCMF_SDIO_FW_CODE].binary;
|
||||
nvram = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.data;
|
||||
nvram_len = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.len;
|
||||
@@ -286,7 +287,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
kfree(fwreq);
|
||||
|
||||
/* try to download image and nvram to the dongle */
|
||||
@@ -4415,6 +4418,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
@@ -4416,6 +4419,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
struct brcmf_fw_name fwnames[] = {
|
||||
{ ".bin", bus->sdiodev->fw_name },
|
||||
{ ".txt", bus->sdiodev->nvram_name },
|
||||
@@ -294,7 +295,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
};
|
||||
|
||||
fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
|
||||
@@ -4426,6 +4430,8 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
@@ -4427,6 +4431,8 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
|
||||
fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
@@ -303,7 +304,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
fwreq->board_type = bus->sdiodev->settings->board_type;
|
||||
|
||||
return fwreq;
|
||||
@@ -4582,6 +4588,8 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
|
||||
@@ -4583,6 +4589,8 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
|
||||
if (bus->sdiodev->settings)
|
||||
brcmf_release_module_param(bus->sdiodev->settings);
|
||||
|
||||
@@ -313,7 +314,7 @@ index 5d156e591..7466e6fd6 100644
|
||||
kfree(bus->hdrbuf);
|
||||
kfree(bus);
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
index 15d2c02fa..7b74c295e 100644
|
||||
index 15d2c02fa3ec..7b74c295e4c9 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
|
||||
@@ -186,9 +186,11 @@ struct brcmf_sdio_dev {
|
||||
@@ -329,7 +330,7 @@ index 15d2c02fa..7b74c295e 100644
|
||||
|
||||
/* sdio core registers */
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
index 9fb68c2dc..85e18fb9c 100644
|
||||
index 9fb68c2dc7e3..85e18fb9c497 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1154,24 +1154,11 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
|
||||
@@ -371,5 +372,5 @@ index 9fb68c2dc..85e18fb9c 100644
|
||||
|
||||
#define BRCMF_USB_FW_CODE 0
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
From fff59b00d136b44bd0944c1f220803b8fcf17e3a Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Sat, 18 Dec 2021 20:52:04 +0900
|
||||
Subject: [PATCH 03/33] brcmfmac: firmware: Handle per-board clm_blob files
|
||||
|
||||
Teach brcm_alt_fw_paths to correctly split off variable length
|
||||
extensions, and enable alt firmware lookups for the CLM blob firmware
|
||||
requests.
|
||||
|
||||
Apple platforms have per-board CLM blob files.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 16 ++++++++--------
|
||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index 9a6e339af..93e31ddd0 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -598,16 +598,16 @@ static const char **brcm_alt_fw_paths(const char *path, const char *board_type)
|
||||
{
|
||||
char alt_path[BRCMF_FW_NAME_LEN];
|
||||
char **alt_paths;
|
||||
- char suffix[5];
|
||||
+ const char *suffix;
|
||||
|
||||
- strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
- /* At least one character + suffix */
|
||||
- if (strlen(alt_path) < 5)
|
||||
+ suffix = strrchr(path, '.');
|
||||
+ if (!suffix || suffix == path)
|
||||
return NULL;
|
||||
|
||||
- /* strip .txt or .bin at the end */
|
||||
- strscpy(suffix, alt_path + strlen(alt_path) - 4, 5);
|
||||
- alt_path[strlen(alt_path) - 4] = 0;
|
||||
+ /* strip extension at the end */
|
||||
+ strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
+ alt_path[suffix - path] = 0;
|
||||
+
|
||||
strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN);
|
||||
strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
@@ -638,7 +638,7 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
int ret, i;
|
||||
|
||||
/* Files can be board-specific, first try a board-specific path */
|
||||
- if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
|
||||
+ if (fwctx->req->board_type) {
|
||||
const char **alt_paths = brcm_alt_fw_paths(cur->path, fwctx);
|
||||
if (!alt_paths)
|
||||
goto fallback;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
From 915df3f38e97a150c053be7d2819e33e5e8e3975 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Fri, 7 Jan 2022 11:14:44 +0900
|
||||
Subject: [PATCH 03/27] brcmfmac: firmware: Support passing in multiple
|
||||
board_types
|
||||
|
||||
Apple platforms have firmware and config files identified with multiple
|
||||
dimensions. We want to be able to find the most specific firmware
|
||||
available for any given platform, progressively trying more general
|
||||
firmwares.
|
||||
|
||||
To do this, first add support for passing in multiple board_types,
|
||||
which will be tried in sequence.
|
||||
|
||||
Since this will cause more log spam due to missing firmwares, also
|
||||
switch the secondary firmware fecthes to use the _nowarn variant, which
|
||||
will not log if the firmware is not found.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 53 +++++++++++++++----
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 4 +-
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 4 +-
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 2 +-
|
||||
4 files changed, 49 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index deacd39b3f7b..d04a59cf4a1e 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -430,6 +430,7 @@ struct brcmf_fw {
|
||||
struct device *dev;
|
||||
struct brcmf_fw_request *req;
|
||||
u32 curpos;
|
||||
+ unsigned int board_index;
|
||||
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
|
||||
};
|
||||
|
||||
@@ -625,17 +626,21 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
struct brcmf_fw *fwctx)
|
||||
{
|
||||
struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
|
||||
+ unsigned int i;
|
||||
int ret;
|
||||
|
||||
- /* Files can be board-specific, first try a board-specific path */
|
||||
- if (fwctx->req->board_type) {
|
||||
+ /* Files can be board-specific, first try board-specific paths */
|
||||
+ for (i = 0; i < ARRAY_SIZE(fwctx->req->board_types); i++) {
|
||||
char *alt_path;
|
||||
|
||||
- alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type);
|
||||
+ if (!fwctx->req->board_types[i])
|
||||
+ goto fallback;
|
||||
+ alt_path = brcm_alt_fw_path(cur->path,
|
||||
+ fwctx->req->board_types[i]);
|
||||
if (!alt_path)
|
||||
goto fallback;
|
||||
|
||||
- ret = request_firmware(fw, alt_path, fwctx->dev);
|
||||
+ ret = firmware_request_nowarn(fw, alt_path, fwctx->dev);
|
||||
kfree(alt_path);
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
@@ -669,15 +674,40 @@ static void brcmf_fw_request_done_alt_path(const struct firmware *fw, void *ctx)
|
||||
{
|
||||
struct brcmf_fw *fwctx = ctx;
|
||||
struct brcmf_fw_item *first = &fwctx->req->items[0];
|
||||
+ const char *board_type, *alt_path;
|
||||
int ret = 0;
|
||||
|
||||
- /* Fall back to canonical path if board firmware not found */
|
||||
- if (!fw)
|
||||
- ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
+ if (fw) {
|
||||
+ brcmf_fw_request_done(fw, ctx);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* Try next board firmware */
|
||||
+ if (fwctx->board_index < ARRAY_SIZE(fwctx->req->board_types)) {
|
||||
+ board_type = fwctx->req->board_types[fwctx->board_index++];
|
||||
+ if (!board_type)
|
||||
+ goto fallback;
|
||||
+ alt_path = brcm_alt_fw_path(first->path, board_type);
|
||||
+ if (!alt_path)
|
||||
+ goto fallback;
|
||||
+
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, alt_path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
- brcmf_fw_request_done);
|
||||
+ brcmf_fw_request_done_alt_path);
|
||||
+ kfree(alt_path);
|
||||
|
||||
- if (fw || ret < 0)
|
||||
+ if (ret < 0)
|
||||
+ brcmf_fw_request_done(fw, ctx);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+fallback:
|
||||
+ /* Fall back to canonical path if board firmware not found */
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||
+ brcmf_fw_request_done);
|
||||
+
|
||||
+ if (ret < 0)
|
||||
brcmf_fw_request_done(fw, ctx);
|
||||
}
|
||||
|
||||
@@ -721,10 +751,11 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
fwctx->done = fw_cb;
|
||||
|
||||
/* First try alternative board-specific path if any */
|
||||
- if (fwctx->req->board_type)
|
||||
+ if (fwctx->req->board_types[0])
|
||||
alt_path = brcm_alt_fw_path(first->path,
|
||||
- fwctx->req->board_type);
|
||||
+ fwctx->req->board_types[0]);
|
||||
if (alt_path) {
|
||||
+ fwctx->board_index++;
|
||||
ret = request_firmware_nowait(THIS_MODULE, true, alt_path,
|
||||
fwctx->dev, GFP_KERNEL, fwctx,
|
||||
brcmf_fw_request_done_alt_path);
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
index e290dec9c53d..1266cbaee072 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -11,6 +11,8 @@
|
||||
|
||||
#define BRCMF_FW_DEFAULT_PATH "brcm/"
|
||||
|
||||
+#define BRCMF_FW_MAX_BOARD_TYPES 8
|
||||
+
|
||||
/**
|
||||
* struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware
|
||||
* filename and nvram filename. Each bus type implementation should create
|
||||
@@ -66,7 +68,7 @@ struct brcmf_fw_request {
|
||||
u16 domain_nr;
|
||||
u16 bus_nr;
|
||||
u32 n_items;
|
||||
- const char *board_type;
|
||||
+ const char *board_types[BRCMF_FW_MAX_BOARD_TYPES];
|
||||
struct brcmf_fw_item items[];
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index ec73d2620ec9..2a74c9d8d46a 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1852,11 +1852,13 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->board_type = devinfo->settings->board_type;
|
||||
/* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
|
||||
fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||
|
||||
+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
||||
+ fwreq->board_types[0] = devinfo->settings->board_type;
|
||||
+
|
||||
return fwreq;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
index 27dc8ed29ac8..2b71991f7d9b 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4433,7 +4433,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
fwreq->items[BRCMF_SDIO_FW_CLM].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_SDIO_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->board_type = bus->sdiodev->settings->board_type;
|
||||
+ fwreq->board_types[0] = bus->sdiodev->settings->board_type;
|
||||
|
||||
return fwreq;
|
||||
}
|
||||
--
|
||||
2.36.0
|
||||
|
||||
+44
-47
@@ -1,7 +1,7 @@
|
||||
From b6aadc75a336f1d9d9b31448dfe13978c0254325 Mon Sep 17 00:00:00 2001
|
||||
From deeb9254b770bcac4848911a5af7d496138e2ab8 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:26:34 +0900
|
||||
Subject: [PATCH 06/33] brcmfmac: pcie: Read Apple OTP information
|
||||
Subject: [PATCH 04/27] brcmfmac: pcie: Read Apple OTP information
|
||||
|
||||
On Apple platforms, the One Time Programmable ROM in the Broadcom chips
|
||||
contains information about the specific board design (module, vendor,
|
||||
@@ -11,18 +11,18 @@ OTP ROM and extract the required strings.
|
||||
Note that the user OTP offset/size is per-chip. This patch does not add
|
||||
any chips yet.
|
||||
|
||||
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 221 ++++++++++++++++++
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 218 ++++++++++++++++++
|
||||
include/linux/bcma/bcma_driver_chipcommon.h | 1 +
|
||||
2 files changed, 222 insertions(+)
|
||||
2 files changed, 219 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 0e4ba33fb..0f19fc9b1 100644
|
||||
index 2a74c9d8d46a..17d0353e9105 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -255,6 +255,15 @@ struct brcmf_pcie_core_info {
|
||||
@@ -256,6 +256,15 @@ struct brcmf_pcie_core_info {
|
||||
u32 wrapbase;
|
||||
};
|
||||
|
||||
@@ -38,7 +38,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
struct brcmf_pciedev_info {
|
||||
enum brcmf_pcie_state state;
|
||||
bool in_irq;
|
||||
@@ -282,6 +291,7 @@ struct brcmf_pciedev_info {
|
||||
@@ -283,6 +292,7 @@ struct brcmf_pciedev_info {
|
||||
void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
|
||||
u16 value);
|
||||
struct brcmf_mp_device *settings;
|
||||
@@ -46,7 +46,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
};
|
||||
|
||||
struct brcmf_pcie_ringbuf {
|
||||
@@ -353,6 +363,15 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
@@ -354,6 +364,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
static struct brcmf_fw_request *
|
||||
brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
|
||||
|
||||
@@ -55,14 +55,13 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+{
|
||||
+ void __iomem *address = devinfo->regs + reg_offset;
|
||||
+
|
||||
+ return (ioread16(address));
|
||||
+ return ioread16(address);
|
||||
+}
|
||||
+
|
||||
+
|
||||
static u32
|
||||
brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
|
||||
{
|
||||
@@ -539,6 +558,8 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
|
||||
@@ -499,6 +517,8 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +70,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
#define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \
|
||||
CHIPCREGOFFS(reg), value)
|
||||
|
||||
@@ -1758,6 +1779,200 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
|
||||
@@ -1734,6 +1754,198 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
|
||||
.write32 = brcmf_pcie_buscore_write32,
|
||||
};
|
||||
|
||||
@@ -86,7 +85,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+{
|
||||
+ int idx = 4;
|
||||
+ const char *chip_params;
|
||||
+ const char *module_params;
|
||||
+ const char *board_params;
|
||||
+ const char *p;
|
||||
+
|
||||
+ /* 4-byte header and two empty strings */
|
||||
@@ -103,26 +102,23 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+ if (idx >= size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ module_params = &data[idx];
|
||||
+ board_params = &data[idx];
|
||||
+
|
||||
+ /* Skip to terminator of second string */
|
||||
+ idx += strnlen(module_params, size - idx);
|
||||
+ idx += strnlen(board_params, size - idx);
|
||||
+ if (idx >= size)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /* At this point both strings are guaranteed NUL-terminated */
|
||||
+ brcmf_dbg(PCIE, "OTP: chip_params='%s' module_params='%s'\n",
|
||||
+ chip_params, module_params);
|
||||
+ brcmf_dbg(PCIE, "OTP: chip_params='%s' board_params='%s'\n",
|
||||
+ chip_params, board_params);
|
||||
+
|
||||
+ p = module_params;
|
||||
+ p = skip_spaces(board_params);
|
||||
+ while (*p) {
|
||||
+ char tag = *p++;
|
||||
+ const char *end;
|
||||
+ size_t len;
|
||||
+
|
||||
+ if (tag == ' ') /* Skip extra spaces */
|
||||
+ continue;
|
||||
+
|
||||
+ if (*p++ != '=') /* implicit NUL check */
|
||||
+ return -EINVAL;
|
||||
+
|
||||
@@ -136,28 +132,28 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+
|
||||
+ /* Copy len characters plus a NUL terminator */
|
||||
+ switch (tag) {
|
||||
+ case 'M':
|
||||
+ strlcpy(devinfo->otp.module, p, len + 1);
|
||||
+ break;
|
||||
+ case 'V':
|
||||
+ strlcpy(devinfo->otp.vendor, p, len + 1);
|
||||
+ break;
|
||||
+ case 'm':
|
||||
+ strlcpy(devinfo->otp.version, p, len + 1);
|
||||
+ break;
|
||||
+ case 'M':
|
||||
+ strscpy(devinfo->otp.module, p, len + 1);
|
||||
+ break;
|
||||
+ case 'V':
|
||||
+ strscpy(devinfo->otp.vendor, p, len + 1);
|
||||
+ break;
|
||||
+ case 'm':
|
||||
+ strscpy(devinfo->otp.version, p, len + 1);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /* Skip to space separator or NUL */
|
||||
+ p = end;
|
||||
+ /* Skip to next arg, if any */
|
||||
+ p = skip_spaces(end);
|
||||
+ }
|
||||
+
|
||||
+ brcmf_dbg(PCIE, "OTP: module=%s vendor=%s version=%s\n",
|
||||
+ devinfo->otp.module, devinfo->otp.vendor,
|
||||
+ devinfo->otp.version);
|
||||
+
|
||||
+ if (!devinfo->otp.module ||
|
||||
+ !devinfo->otp.vendor ||
|
||||
+ !devinfo->otp.version)
|
||||
+ if (!devinfo->otp.module[0] ||
|
||||
+ !devinfo->otp.vendor[0] ||
|
||||
+ !devinfo->otp.version[0])
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ devinfo->otp.valid = true;
|
||||
@@ -168,7 +164,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+brcmf_pcie_parse_otp(struct brcmf_pciedev_info *devinfo, u8 *otp, size_t size)
|
||||
+{
|
||||
+ int p = 0;
|
||||
+ int ret = -1;
|
||||
+ int ret = -EINVAL;
|
||||
+
|
||||
+ brcmf_dbg(PCIE, "parse_otp size=%ld\n", size);
|
||||
+
|
||||
@@ -184,18 +180,18 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+
|
||||
+ switch (type) {
|
||||
+ case BRCMF_OTP_SYS_VENDOR:
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): SYS_VENDOR\n",
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): SYS_VENDOR\n",
|
||||
+ p, length);
|
||||
+ ret = brcmf_pcie_parse_otp_sys_vendor(devinfo,
|
||||
+ &otp[p + 2],
|
||||
+ length);
|
||||
+ break;
|
||||
+ case BRCMF_OTP_BRCM_CIS:
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): BRCM_CIS\n",
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): BRCM_CIS\n",
|
||||
+ p, length);
|
||||
+ break;
|
||||
+ default:
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): Unknown type 0x%x\n",
|
||||
+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): Unknown type 0x%x\n",
|
||||
+ p, length, type);
|
||||
+ break;
|
||||
+ }
|
||||
@@ -228,8 +224,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+ }
|
||||
+
|
||||
+ if (coreid == BCMA_CORE_CHIPCOMMON) {
|
||||
+ /*
|
||||
+ * Chips with OTP accessed via ChipCommon need additional
|
||||
+ /* Chips with OTP accessed via ChipCommon need additional
|
||||
+ * handling to access the OTP
|
||||
+ */
|
||||
+ brcmf_pcie_select_core(devinfo, coreid);
|
||||
@@ -247,7 +242,9 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
+ sromctl | BCMA_CC_SROM_CONTROL_OTPSEL);
|
||||
+ }
|
||||
+
|
||||
+ otp = kzalloc(sizeof(u16) * words, GFP_KERNEL);
|
||||
+ otp = kcalloc(words, sizeof(u16), GFP_KERNEL);
|
||||
+ if (!otp)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ /* Map bus window to SROM/OTP shadow area in core */
|
||||
+ base = brcmf_pcie_buscore_prep_addr(devinfo->pdev, base + core->base);
|
||||
@@ -272,7 +269,7 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
#define BRCMF_PCIE_FW_CODE 0
|
||||
#define BRCMF_PCIE_FW_NVRAM 1
|
||||
#define BRCMF_PCIE_FW_CLM 2
|
||||
@@ -1958,6 +2173,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
@@ -1930,6 +2142,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (ret)
|
||||
goto fail_bus;
|
||||
|
||||
@@ -286,10 +283,10 @@ index 0e4ba33fb..0f19fc9b1 100644
|
||||
if (!fwreq) {
|
||||
ret = -ENOMEM;
|
||||
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
index d35b92060..c91db7460 100644
|
||||
index e3314f746bfa..2d94c30ed439 100644
|
||||
--- a/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
@@ -270,6 +270,7 @@
|
||||
@@ -271,6 +271,7 @@
|
||||
#define BCMA_CC_SROM_CONTROL_OP_WRDIS 0x40000000
|
||||
#define BCMA_CC_SROM_CONTROL_OP_WREN 0x60000000
|
||||
#define BCMA_CC_SROM_CONTROL_OTPSEL 0x00000010
|
||||
@@ -298,5 +295,5 @@ index d35b92060..c91db7460 100644
|
||||
#define BCMA_CC_SROM_CONTROL_SIZE_MASK 0x00000006
|
||||
#define BCMA_CC_SROM_CONTROL_SIZE_1K 0x00000000
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
From 10a854cb42b9e85483a9a07887b9b24dbc1d02a3 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:38:37 +0900
|
||||
Subject: [PATCH 05/33] brcmfmac: firmware: Support passing in multiple
|
||||
board_types
|
||||
|
||||
In order to make use of the multiple alt_path functionality, change
|
||||
board_type to an array. Bus drivers can pass in a NULL-terminated list
|
||||
of board type strings to try for the firmware fetch.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
---
|
||||
Adjusted for rebase on:
|
||||
- c4caf72 ("brcmfmac: firmware: Fix crash in brcm_alt_fw_path")
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 37 +++++++++++++------
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.h | 2 +-
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 7 +++-
|
||||
.../broadcom/brcm80211/brcmfmac/sdio.c | 4 +-
|
||||
4 files changed, 36 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index 93e31ddd0..68627c51c 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -594,26 +594,41 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||
}
|
||||
|
||||
-static const char **brcm_alt_fw_paths(const char *path, const char *board_type)
|
||||
+static const char **brcm_alt_fw_paths(const char *path, struct brcmf_fw *fwctx)
|
||||
{
|
||||
+ const char **board_types = fwctx->req->board_types;
|
||||
+ int board_type_count = 0;
|
||||
+ int i;
|
||||
char alt_path[BRCMF_FW_NAME_LEN];
|
||||
char **alt_paths;
|
||||
const char *suffix;
|
||||
|
||||
+ if (!board_types || !board_types[0])
|
||||
+ return NULL;
|
||||
+
|
||||
+ while (*board_types++)
|
||||
+ board_type_count++;
|
||||
+
|
||||
suffix = strrchr(path, '.');
|
||||
if (!suffix || suffix == path)
|
||||
return NULL;
|
||||
|
||||
- /* strip extension at the end */
|
||||
- strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
- alt_path[suffix - path] = 0;
|
||||
+ alt_paths = kzalloc(sizeof(char *) * (board_type_count + 1),
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ board_types = fwctx->req->board_types;
|
||||
+ for (i = 0; i < board_type_count; i++) {
|
||||
+ /* strip extension at the end */
|
||||
+ strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
+ alt_path[suffix - path] = 0;
|
||||
|
||||
- strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(alt_path, board_types[i], BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
|
||||
- alt_paths = kzalloc(sizeof(char *) * 2, GFP_KERNEL);
|
||||
- alt_paths[0] = kstrdup(alt_path, GFP_KERNEL);
|
||||
+ alt_paths[i] = kstrdup(alt_path, GFP_KERNEL);
|
||||
+ brcmf_dbg(TRACE, "FW alt path: %s\n", alt_paths[i]);
|
||||
+ }
|
||||
|
||||
return (const char **)alt_paths;
|
||||
}
|
||||
@@ -638,7 +653,7 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
int ret, i;
|
||||
|
||||
/* Files can be board-specific, first try a board-specific path */
|
||||
- if (fwctx->req->board_type) {
|
||||
+ if (fwctx->req->board_types) {
|
||||
const char **alt_paths = brcm_alt_fw_paths(cur->path, fwctx);
|
||||
if (!alt_paths)
|
||||
goto fallback;
|
||||
@@ -748,7 +763,7 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
fwctx->done = fw_cb;
|
||||
|
||||
/* First try alternative board-specific path if any */
|
||||
- if (fwctx->req->board_type)
|
||||
+ if (fwctx->req->board_types)
|
||||
fwctx->alt_paths = brcm_alt_fw_paths(first->path, fwctx);
|
||||
|
||||
if (fwctx->alt_paths) {
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
index e290dec9c..d94a1d5be 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||
@@ -66,7 +66,7 @@ struct brcmf_fw_request {
|
||||
u16 domain_nr;
|
||||
u16 bus_nr;
|
||||
u32 n_items;
|
||||
- const char *board_type;
|
||||
+ const char **board_types;
|
||||
struct brcmf_fw_item items[];
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index ab0503c6f..0e4ba33fb 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -1877,11 +1877,16 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->board_type = devinfo->settings->board_type;
|
||||
/* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
|
||||
fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||
|
||||
+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
||||
+ fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
||||
+ sizeof(const char *) * 2,
|
||||
+ GFP_KERNEL);
|
||||
+ fwreq->board_types[0] = devinfo->settings->board_type;
|
||||
+
|
||||
return fwreq;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
index 7466e6fd6..32f457bf0 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||
@@ -4432,7 +4432,9 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||
fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||
fwreq->items[BRCMF_SDIO_FW_CLM].type = BRCMF_FW_TYPE_BINARY;
|
||||
fwreq->items[BRCMF_SDIO_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||
- fwreq->board_type = bus->sdiodev->settings->board_type;
|
||||
+ fwreq->board_types = devm_kzalloc(bus->sdiodev->dev,
|
||||
+ sizeof(const char *) * 2, GFP_KERNEL);
|
||||
+ fwreq->board_types[0] = bus->sdiodev->settings->board_type;
|
||||
|
||||
return fwreq;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
+18
-26
@@ -1,29 +1,29 @@
|
||||
From 07d5d74638a8c297b48201e0ada94bdd08caaf44 Mon Sep 17 00:00:00 2001
|
||||
From 86078789c49823b218c0f821d864d515d83368c7 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:27:19 +0900
|
||||
Subject: [PATCH 07/33] brcmfmac: of: Fetch Apple properties
|
||||
Subject: [PATCH 05/27] brcmfmac: of: Fetch Apple properties
|
||||
|
||||
On Apple ARM64 platforms, firmware selection requires two properties
|
||||
that come from system firmware: the module-instance (aka "island", a
|
||||
codename representing a given hardware platform) and the antenna-sku.
|
||||
We map Apple's module codenames to board_types in the form
|
||||
"apple,<module-instance>".
|
||||
|
||||
The module-instance is hard-coded in per-board DTS files, while the
|
||||
The mapped board_type is added to the DTS file in that form, while the
|
||||
antenna-sku is forwarded by our bootloader from the Apple Device Tree
|
||||
into the FDT. Grab them from the DT so firmware selection can use
|
||||
them.
|
||||
|
||||
The module-instance is used to construct a board_type by prepending it
|
||||
with "apple,".
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
[Redecorating: added ", len" in third last context line]
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/common.h | 1 +
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 20 ++++++++++++++++++-
|
||||
2 files changed, 20 insertions(+), 1 deletion(-)
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/common.h | 1 +
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/of.c | 12 +++++++++++-
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
index 8b5f49997..d4aa25d64 100644
|
||||
index 8b5f49997c8b..d4aa25d646fe 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
@@ -50,6 +50,7 @@ struct brcmf_mp_device {
|
||||
@@ -35,10 +35,10 @@ index 8b5f49997..d4aa25d64 100644
|
||||
struct brcmfmac_sdio_pd sdio;
|
||||
} bus;
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
index 513c7e642..31407d3a1 100644
|
||||
index 8623bde5eb70..05414ac0d28e 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||
@@ -63,14 +63,32 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
@@ -63,14 +63,24 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
{
|
||||
struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
|
||||
struct device_node *root, *np = dev->of_node;
|
||||
@@ -48,22 +48,14 @@ index 513c7e642..31407d3a1 100644
|
||||
u32 irqf;
|
||||
u32 val;
|
||||
|
||||
+ /*
|
||||
+ * Apple ARM64 platforms have their own idea of board type, passed in
|
||||
+ /* Apple ARM64 platforms have their own idea of board type, passed in
|
||||
+ * via the device tree. They also have an antenna SKU parameter
|
||||
+ */
|
||||
+ if (!of_property_read_string(np, "apple,module-instance", &prop)) {
|
||||
+ const char *prefix = "apple,";
|
||||
+ int len = strlen(prefix) + strlen(prop) + 1;
|
||||
+ char *board_type = devm_kzalloc(dev, len, GFP_KERNEL);
|
||||
+
|
||||
+ strlcpy(board_type, prefix, len);
|
||||
+ strlcat(board_type, prop, len);
|
||||
+ settings->board_type = board_type;
|
||||
+ }
|
||||
+ if (!of_property_read_string(np, "brcm,board-type", &prop))
|
||||
+ settings->board_type = prop;
|
||||
+
|
||||
+ if (!of_property_read_string(np, "apple,antenna-sku", &prop))
|
||||
+ settings->antenna_sku = devm_kstrdup(dev, prop, GFP_KERNEL);
|
||||
+ settings->antenna_sku = prop;
|
||||
+
|
||||
/* Set board-type to the first string of the machine compatible prop */
|
||||
root = of_find_node_by_path("/");
|
||||
@@ -73,5 +65,5 @@ index 513c7e642..31407d3a1 100644
|
||||
char *board_type;
|
||||
const char *tmp;
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+35
-62
@@ -1,7 +1,7 @@
|
||||
From 4fe7b8a7ba38e6a124b0a6be20533495382629c0 Mon Sep 17 00:00:00 2001
|
||||
From f65df5731a384cb33e95080fb3c55153a64e9ff6 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:45:21 +0900
|
||||
Subject: [PATCH 08/33] brcmfmac: pcie: Perform firmware selection for Apple
|
||||
Subject: [PATCH 06/27] brcmfmac: pcie: Perform firmware selection for Apple
|
||||
platforms
|
||||
|
||||
On Apple platforms, firmware selection uses the following elements:
|
||||
@@ -14,7 +14,7 @@ On Apple platforms, firmware selection uses the following elements:
|
||||
* Module type RASP OTP
|
||||
* Module vendor m OTP
|
||||
* Module version 6.11 OTP
|
||||
* Antenna SKU X3 DT (ARM64) or ??? (x86)
|
||||
* Antenna SKU X3 DT (ARM64) or ACPI (x86)
|
||||
|
||||
In macOS, these firmwares are stored using filenames in this format
|
||||
under /usr/share/firmware/wifi:
|
||||
@@ -50,7 +50,7 @@ shikoku platform (MacBook Air M1 2020) simplifies to just 4 files:
|
||||
This reduces the total file count to around 170, of which 75 are
|
||||
symlinks and 95 are regular files: 7 firmware blobs, 27 CLM blobs, and
|
||||
61 NVRAM config files. We also slightly process NVRAM files to correct
|
||||
some formatting issues and add a missing default macaddr= property.
|
||||
some formatting issues.
|
||||
|
||||
To handle this, the driver must try the following path formats when
|
||||
looking for firmware files:
|
||||
@@ -62,7 +62,7 @@ looking for firmware files:
|
||||
brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.txt *
|
||||
brcm/brcmfmac4378b1-pcie.apple,shikoku.txt
|
||||
|
||||
* Not relevant for NVRAM, only for for firmware/CLM.
|
||||
* Not relevant for NVRAM, only for firmware/CLM.
|
||||
|
||||
The chip revision nominally comes from OTP on Apple platforms, but it
|
||||
can be mapped to the PCI revision number, so we ignore the OTP revision
|
||||
@@ -71,91 +71,64 @@ revisions, as the driver already does for other chips. Unfortunately,
|
||||
the mapping is not consistent between different chip types, so this has
|
||||
to be determined experimentally.
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 68 +++++++++++++++++--
|
||||
1 file changed, 63 insertions(+), 5 deletions(-)
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 41 ++++++++++++++++++-
|
||||
1 file changed, 39 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 0f19fc9b1..4f14b261a 100644
|
||||
index 17d0353e9105..86807d990cc7 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -2096,11 +2096,69 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -2068,8 +2068,45 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||
fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||
fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||
|
||||
- brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
||||
- fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
||||
- sizeof(const char *) * 2,
|
||||
- GFP_KERNEL);
|
||||
- fwreq->board_types[0] = devinfo->settings->board_type;
|
||||
+ /* Apple platforms with fancy firmware/NVRAM selection */
|
||||
+ if (devinfo->settings->board_type &&
|
||||
+ devinfo->settings->antenna_sku &&
|
||||
+ devinfo->otp.valid) {
|
||||
+ char *buf;
|
||||
+ int len;
|
||||
+ const struct brcmf_otp_params *otp = &devinfo->otp;
|
||||
+ struct device *dev = &devinfo->pdev->dev;
|
||||
+ const char **bt = fwreq->board_types;
|
||||
+
|
||||
+ brcmf_dbg(PCIE, "Apple board: %s\n",
|
||||
+ devinfo->settings->board_type);
|
||||
+
|
||||
+ /* Example: apple,shikoku-RASP-m-6.11-X3 */
|
||||
+ len = (strlen(devinfo->settings->board_type) + 1 +
|
||||
+ strlen(devinfo->otp.module) + 1 +
|
||||
+ strlen(devinfo->otp.vendor) + 1 +
|
||||
+ strlen(devinfo->otp.version) + 1 +
|
||||
+ strlen(devinfo->settings->antenna_sku) + 1);
|
||||
+ bt[0] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s-%s",
|
||||
+ devinfo->settings->board_type,
|
||||
+ otp->module, otp->vendor, otp->version,
|
||||
+ devinfo->settings->antenna_sku);
|
||||
+ bt[1] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s",
|
||||
+ devinfo->settings->board_type,
|
||||
+ otp->module, otp->vendor, otp->version);
|
||||
+ bt[2] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s",
|
||||
+ devinfo->settings->board_type,
|
||||
+ otp->module, otp->vendor);
|
||||
+ bt[3] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s",
|
||||
+ devinfo->settings->board_type,
|
||||
+ otp->module);
|
||||
+ bt[4] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s",
|
||||
+ devinfo->settings->board_type,
|
||||
+ devinfo->settings->antenna_sku);
|
||||
+ bt[5] = devinfo->settings->board_type;
|
||||
+
|
||||
+ fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
||||
+ sizeof(const char *) * 7,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!bt[0] || !bt[1] || !bt[2] || !bt[3] || !bt[4]) {
|
||||
+ kfree(fwreq);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* apple,shikoku */
|
||||
+ fwreq->board_types[5] = devinfo->settings->board_type;
|
||||
+
|
||||
+ buf = devm_kzalloc(&devinfo->pdev->dev, len, GFP_KERNEL);
|
||||
+
|
||||
+ strlcpy(buf, devinfo->settings->board_type, len);
|
||||
+ strlcat(buf, "-", len);
|
||||
+ strlcat(buf, devinfo->settings->antenna_sku, len);
|
||||
+ /* apple,shikoku-X3 */
|
||||
+ fwreq->board_types[4] = devm_kstrdup(&devinfo->pdev->dev, buf,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ strlcpy(buf, devinfo->settings->board_type, len);
|
||||
+ strlcat(buf, "-", len);
|
||||
+ strlcat(buf, devinfo->otp.module, len);
|
||||
+ /* apple,shikoku-RASP */
|
||||
+ fwreq->board_types[3] = devm_kstrdup(&devinfo->pdev->dev, buf,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ strlcat(buf, "-", len);
|
||||
+ strlcat(buf, devinfo->otp.vendor, len);
|
||||
+ /* apple,shikoku-RASP-m */
|
||||
+ fwreq->board_types[2] = devm_kstrdup(&devinfo->pdev->dev, buf,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ strlcat(buf, "-", len);
|
||||
+ strlcat(buf, devinfo->otp.version, len);
|
||||
+ /* apple,shikoku-RASP-m-6.11 */
|
||||
+ fwreq->board_types[1] = devm_kstrdup(&devinfo->pdev->dev, buf,
|
||||
+ GFP_KERNEL);
|
||||
+
|
||||
+ strlcat(buf, "-", len);
|
||||
+ strlcat(buf, devinfo->settings->antenna_sku, len);
|
||||
+ /* apple,shikoku-RASP-m-6.11-X3 */
|
||||
+ fwreq->board_types[0] = buf;
|
||||
+ } else {
|
||||
+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
||||
+ fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
||||
+ sizeof(const char *) * 2,
|
||||
+ GFP_KERNEL);
|
||||
+ fwreq->board_types[0] = devinfo->settings->board_type;
|
||||
+ }
|
||||
|
||||
return fwreq;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+14
-14
@@ -1,7 +1,7 @@
|
||||
From 37666ce8bd160b8eb281ade724e11ac560277926 Mon Sep 17 00:00:00 2001
|
||||
From 40863bb80e5b8d3d4236aafb4148b246885d34d7 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Thu, 23 Dec 2021 22:32:08 +0900
|
||||
Subject: [PATCH 09/33] brcmfmac: firmware: Allow platform to override macaddr
|
||||
Subject: [PATCH 07/27] brcmfmac: firmware: Allow platform to override macaddr
|
||||
|
||||
On Device Tree platforms, it is customary to be able to set the MAC
|
||||
address via the Device Tree, as it is often stored in system firmware.
|
||||
@@ -17,14 +17,14 @@ On platforms with an SROM MAC address, this overrides it. On platforms
|
||||
without one, such as Apple ARM64 devices, this is required for the
|
||||
firmware to boot (it will fail if it does not have a valid MAC at all).
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 30 +++++++++++++++++--
|
||||
1 file changed, 28 insertions(+), 2 deletions(-)
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 28 +++++++++++++++++--
|
||||
1 file changed, 26 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index 68627c51c..a0ee0fab6 100644
|
||||
index d04a59cf4a1e..fbfc9458d240 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -21,6 +21,8 @@
|
||||
@@ -50,12 +50,12 @@ index 68627c51c..a0ee0fab6 100644
|
||||
nvp->boardrev_found = true;
|
||||
+ /* strip macaddr if platform MAC overrides */
|
||||
+ if (nvp->strip_mac &&
|
||||
+ strncmp(&nvp->data[nvp->entry], "macaddr", 7) == 0)
|
||||
+ strncmp(&nvp->data[nvp->entry], "macaddr", 7) == 0)
|
||||
+ st = COMMENT;
|
||||
} else if (!is_nvram_char(c) || c == ' ') {
|
||||
brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
|
||||
nvp->line, nvp->column);
|
||||
@@ -209,6 +209,7 @@ static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
|
||||
@@ -209,6 +216,7 @@ static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
|
||||
size = data_len;
|
||||
/* Add space for properties we may add */
|
||||
size += strlen(BRCMF_FW_DEFAULT_BOARDREV) + 1;
|
||||
@@ -63,14 +63,14 @@ index 68627c51c..a0ee0fab6 100644
|
||||
/* Alloc for extra 0 byte + roundup by 4 + length field */
|
||||
size += 1 + 3 + sizeof(u32);
|
||||
nvp->nvram = kzalloc(size, GFP_KERNEL);
|
||||
@@ -366,22 +376,34 @@ static void brcmf_fw_add_defaults(struct nvram_parser *nvp)
|
||||
@@ -368,22 +376,34 @@ static void brcmf_fw_add_defaults(struct nvram_parser *nvp)
|
||||
nvp->nvram_len++;
|
||||
}
|
||||
|
||||
+static void brcmf_fw_add_macaddr(struct nvram_parser *nvp, u8 *mac)
|
||||
+{
|
||||
+ snprintf(&nvp->nvram[nvp->nvram_len], BRCMF_FW_MACADDR_LEN + 1,
|
||||
+ BRCMF_FW_MACADDR_FMT, mac);
|
||||
+ BUG_ON(snprintf(&nvp->nvram[nvp->nvram_len], BRCMF_FW_MACADDR_LEN + 1,
|
||||
+ BRCMF_FW_MACADDR_FMT, mac) != BRCMF_FW_MACADDR_LEN);
|
||||
+ nvp->nvram_len += BRCMF_FW_MACADDR_LEN + 1;
|
||||
+}
|
||||
+
|
||||
@@ -99,7 +99,7 @@ index 68627c51c..a0ee0fab6 100644
|
||||
while (nvp.pos < data_len) {
|
||||
nvp.state = nv_parser_states[nvp.state](&nvp);
|
||||
if (nvp.state == END)
|
||||
@@ -402,6 +424,9 @@ static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len,
|
||||
@@ -404,6 +424,9 @@ static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len,
|
||||
|
||||
brcmf_fw_add_defaults(&nvp);
|
||||
|
||||
@@ -109,7 +109,7 @@ index 68627c51c..a0ee0fab6 100644
|
||||
pad = nvp.nvram_len;
|
||||
*new_length = roundup(nvp.nvram_len + 1, 4);
|
||||
while (pad != *new_length) {
|
||||
@@ -546,7 +571,8 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||
@@ -547,7 +570,8 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||
if (data)
|
||||
nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length,
|
||||
fwctx->req->domain_nr,
|
||||
@@ -120,5 +120,5 @@ index 68627c51c..a0ee0fab6 100644
|
||||
if (free_bcm47xx_nvram)
|
||||
bcm47xx_nvram_release_contents(data);
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+9
-8
@@ -1,20 +1,21 @@
|
||||
From 0272ded859d0ff41757a173e72a43ba444d3cfb5 Mon Sep 17 00:00:00 2001
|
||||
From 56c005811f168e32d0f21edf76300da63137ddfd Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:39:04 +0900
|
||||
Subject: [PATCH 10/33] brcmfmac: msgbuf: Increase RX ring sizes to 1024
|
||||
Subject: [PATCH 08/27] brcmfmac: msgbuf: Increase RX ring sizes to 1024
|
||||
|
||||
Newer chips used on Apple platforms have more than max_rxbufpost greater
|
||||
than 512, which causes warnings when brcmf_msgbuf_rxbuf_data_fill tries
|
||||
to put more in the ring than fit. Increase the ring sizes to 1024.
|
||||
Newer chips used on Apple platforms have a max_rxbufpost greater than
|
||||
512, which causes warnings when brcmf_msgbuf_rxbuf_data_fill tries to
|
||||
put more entries in the ring than will fit. Increase the ring sizes
|
||||
to 1024.
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
|
||||
index 2e322edbb..6a849f4a9 100644
|
||||
index 2e322edbb907..6a849f4a94dd 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
|
||||
@@ -8,10 +8,10 @@
|
||||
@@ -31,5 +32,5 @@ index 2e322edbb..6a849f4a9 100644
|
||||
|
||||
#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+23
-25
@@ -1,39 +1,37 @@
|
||||
From 215e445d3271dada17f435e830b1b73987ba22e7 Mon Sep 17 00:00:00 2001
|
||||
From 976f53c5e34623a3d503243ba0cc2d3e03649835 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:25:35 +0900
|
||||
Subject: [PATCH 12/33] brcmfmac: pcie: Support PCIe core revisions >= 64
|
||||
Subject: [PATCH 09/27] brcmfmac: pcie: Support PCIe core revisions >= 64
|
||||
|
||||
These newer PCIe core revisions include new sets of registers that must
|
||||
be used instead of the legacy ones. Introduce a brcmf_pcie_reginfo to
|
||||
hold the specific register offsets and values to use for a given
|
||||
platform, and change all the register accesses to indirect through it.
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 127 +++++++++++++++---
|
||||
1 file changed, 107 insertions(+), 20 deletions(-)
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 125 +++++++++++++++---
|
||||
1 file changed, 105 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 7190b7b80..01c7b2703 100644
|
||||
index 86807d990cc7..a2ef3de834f6 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -117,6 +117,14 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
#define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124
|
||||
@@ -119,6 +119,12 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0 0x140
|
||||
#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1 0x144
|
||||
+#define BRCMF_PCIE_PCIE2REG_D2H_MAILBOX_0 0x148
|
||||
+#define BRCMF_PCIE_PCIE2REG_D2H_MAILBOX_1 0x14c
|
||||
+
|
||||
|
||||
+#define BRCMF_PCIE_64_PCIE2REG_INTMASK 0xC14
|
||||
+#define BRCMF_PCIE_64_PCIE2REG_MAILBOXINT 0xC30
|
||||
+#define BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK 0xC34
|
||||
+#define BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0 0xA20
|
||||
+#define BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1 0xA24
|
||||
|
||||
+
|
||||
#define BRCMF_PCIE2_INTA 0x01
|
||||
#define BRCMF_PCIE2_INTB 0x02
|
||||
@@ -137,6 +145,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
|
||||
@@ -138,6 +144,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
#define BRCMF_PCIE_MB_INT_D2H3_DB0 0x400000
|
||||
#define BRCMF_PCIE_MB_INT_D2H3_DB1 0x800000
|
||||
|
||||
@@ -42,7 +40,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
#define BRCMF_PCIE_MB_INT_D2H_DB (BRCMF_PCIE_MB_INT_D2H0_DB0 | \
|
||||
BRCMF_PCIE_MB_INT_D2H0_DB1 | \
|
||||
BRCMF_PCIE_MB_INT_D2H1_DB0 | \
|
||||
@@ -146,6 +156,40 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
@@ -147,6 +155,40 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_PCIE_MB_INT_D2H3_DB0 | \
|
||||
BRCMF_PCIE_MB_INT_D2H3_DB1)
|
||||
|
||||
@@ -83,7 +81,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
#define BRCMF_PCIE_SHARED_VERSION_7 7
|
||||
#define BRCMF_PCIE_MIN_SHARED_VERSION 5
|
||||
#define BRCMF_PCIE_MAX_SHARED_VERSION BRCMF_PCIE_SHARED_VERSION_7
|
||||
@@ -272,6 +316,7 @@ struct brcmf_pciedev_info {
|
||||
@@ -273,6 +315,7 @@ struct brcmf_pciedev_info {
|
||||
char nvram_name[BRCMF_FW_NAME_LEN];
|
||||
char clm_name[BRCMF_FW_NAME_LEN];
|
||||
const struct firmware *clm_fw;
|
||||
@@ -91,7 +89,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
void __iomem *regs;
|
||||
void __iomem *tcm;
|
||||
u32 ram_base;
|
||||
@@ -358,6 +403,36 @@ static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = {
|
||||
@@ -359,6 +402,36 @@ static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = {
|
||||
BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
|
||||
};
|
||||
|
||||
@@ -128,7 +126,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
struct brcmf_fw_request *fwreq);
|
||||
static struct brcmf_fw_request *
|
||||
@@ -841,30 +916,29 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
|
||||
@@ -802,30 +875,29 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
|
||||
|
||||
static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo)
|
||||
{
|
||||
@@ -165,7 +163,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
brcmf_pcie_intr_disable(devinfo);
|
||||
brcmf_dbg(PCIE, "Enter\n");
|
||||
return IRQ_WAKE_THREAD;
|
||||
@@ -879,15 +953,14 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
|
||||
@@ -840,15 +912,14 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg)
|
||||
u32 status;
|
||||
|
||||
devinfo->in_irq = true;
|
||||
@@ -185,7 +183,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
|
||||
brcmf_proto_msgbuf_rx_trigger(
|
||||
&devinfo->pdev->dev);
|
||||
@@ -946,8 +1019,8 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -907,8 +978,8 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
|
||||
if (devinfo->in_irq)
|
||||
brcmf_err(bus, "Still in IRQ (processing) !!!\n");
|
||||
|
||||
@@ -196,7 +194,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
|
||||
devinfo->irq_allocated = false;
|
||||
}
|
||||
@@ -999,7 +1072,7 @@ static int brcmf_pcie_ring_mb_ring_bell(void *ctx)
|
||||
@@ -960,7 +1031,7 @@ static int brcmf_pcie_ring_mb_ring_bell(void *ctx)
|
||||
|
||||
brcmf_dbg(PCIE, "RING !\n");
|
||||
/* Any arbitrary value will do, lets use 1 */
|
||||
@@ -205,7 +203,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1763,15 +1836,22 @@ static int brcmf_pcie_buscoreprep(void *ctx)
|
||||
@@ -1723,15 +1794,22 @@ static int brcmf_pcie_buscoreprep(void *ctx)
|
||||
static int brcmf_pcie_buscore_reset(void *ctx, struct brcmf_chip *chip)
|
||||
{
|
||||
struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
|
||||
@@ -232,7 +230,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2183,6 +2263,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
@@ -2119,6 +2197,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
struct brcmf_pciedev_info *devinfo;
|
||||
struct brcmf_pciedev *pcie_bus_dev;
|
||||
struct brcmf_bus *bus;
|
||||
@@ -240,7 +238,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
|
||||
brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
|
||||
|
||||
@@ -2201,6 +2282,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
@@ -2137,6 +2216,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -253,7 +251,7 @@ index 7190b7b80..01c7b2703 100644
|
||||
pcie_bus_dev = kzalloc(sizeof(*pcie_bus_dev), GFP_KERNEL);
|
||||
if (pcie_bus_dev == NULL) {
|
||||
ret = -ENOMEM;
|
||||
@@ -2369,7 +2456,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
|
||||
@@ -2306,7 +2391,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
|
||||
brcmf_dbg(PCIE, "Enter, dev=%p, bus=%p\n", dev, bus);
|
||||
|
||||
/* Check if device is still up and running, if so we are ready */
|
||||
@@ -263,5 +261,5 @@ index 7190b7b80..01c7b2703 100644
|
||||
if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM))
|
||||
goto cleanup;
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+14
-14
@@ -1,7 +1,7 @@
|
||||
From 2e57c94d84c20596dafb0e7d94fe36f77b239292 Mon Sep 17 00:00:00 2001
|
||||
From 754b9a40627f4da5c83ed9ec1a6087bf4b5d8103 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:46:40 +0900
|
||||
Subject: [PATCH 13/33] brcmfmac: pcie: Add IDs/properties for BCM4378
|
||||
Subject: [PATCH 10/27] brcmfmac: pcie: Add IDs/properties for BCM4378
|
||||
|
||||
This chip is present on Apple M1 (t8103) platforms:
|
||||
|
||||
@@ -11,8 +11,8 @@ This chip is present on Apple M1 (t8103) platforms:
|
||||
* capri (apple,j456): iMac (24-inch, 4x USB-C, M1, 2020)
|
||||
* santorini (apple,j457): iMac (24-inch, 2x USB-C, M1, 2020)
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 2 ++
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++
|
||||
@@ -20,10 +20,10 @@ Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
3 files changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
index 1ee49f9e3..56a6f4168 100644
|
||||
index 4ec7773b6906..7f1d6cea2141 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -731,6 +731,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
@@ -732,6 +732,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
return 0x160000;
|
||||
case CY_CC_43752_CHIP_ID:
|
||||
return 0x170000;
|
||||
@@ -33,10 +33,10 @@ index 1ee49f9e3..56a6f4168 100644
|
||||
brcmf_err("unknown chip: %s\n", ci->pub.name);
|
||||
break;
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 01c7b2703..e1bc7e4a9 100644
|
||||
index a2ef3de834f6..2ca2c4b603cf 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -58,6 +58,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
@@ -59,6 +59,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
|
||||
BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
|
||||
BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
|
||||
@@ -44,7 +44,7 @@ index 01c7b2703..e1bc7e4a9 100644
|
||||
|
||||
/* firmware config files */
|
||||
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.txt");
|
||||
@@ -87,6 +88,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
@@ -88,6 +89,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
@@ -52,7 +52,7 @@ index 01c7b2703..e1bc7e4a9 100644
|
||||
};
|
||||
|
||||
#define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */
|
||||
@@ -2015,6 +2017,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -1970,6 +1972,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
int ret;
|
||||
|
||||
switch (devinfo->ci->chip) {
|
||||
@@ -64,7 +64,7 @@ index 01c7b2703..e1bc7e4a9 100644
|
||||
default:
|
||||
/* OTP not supported on this chip */
|
||||
return 0;
|
||||
@@ -2522,6 +2529,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
@@ -2458,6 +2465,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
|
||||
@@ -73,10 +73,10 @@ index 01c7b2703..e1bc7e4a9 100644
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
index 9d8132016..8f552b53f 100644
|
||||
index ed0b707f0cdf..43158a404652 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -50,6 +50,7 @@
|
||||
@@ -51,6 +51,7 @@
|
||||
#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_43666_CHIP_ID 43666
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
@@ -84,7 +84,7 @@ index 9d8132016..8f552b53f 100644
|
||||
#define CY_CC_4373_CHIP_ID 0x4373
|
||||
#define CY_CC_43012_CHIP_ID 43012
|
||||
#define CY_CC_43752_CHIP_ID 43752
|
||||
@@ -85,6 +86,7 @@
|
||||
@@ -87,6 +88,7 @@
|
||||
#define BRCM_PCIE_4366_2G_DEVICE_ID 0x43c4
|
||||
#define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5
|
||||
#define BRCM_PCIE_4371_DEVICE_ID 0x440d
|
||||
@@ -93,5 +93,5 @@ index 9d8132016..8f552b53f 100644
|
||||
|
||||
/* brcmsmac IDs */
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+7
-6
@@ -1,21 +1,22 @@
|
||||
From 8f577818df988e9ddd91fc91b263b4ef0d74b230 Mon Sep 17 00:00:00 2001
|
||||
From 06cd4b9c0babc787e869bd4fcd409d8039f568cf Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Thu, 23 Dec 2021 19:51:11 +0900
|
||||
Subject: [PATCH 14/33] ACPI / property: Support strings in Apple _DSM props
|
||||
Subject: [PATCH 11/27] ACPI / property: Support strings in Apple _DSM props
|
||||
|
||||
The Wi-Fi module in Apple machines has a "module-instance" device
|
||||
property that specifies the platform type and is used for firmware
|
||||
selection. Its value is a string, so add support for string values in
|
||||
acpi_extract_apple_properties().
|
||||
|
||||
Reviewed-by: Lukas Wunner <lukas@wunner.de>
|
||||
Acked-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
drivers/acpi/x86/apple.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/acpi/x86/apple.c b/drivers/acpi/x86/apple.c
|
||||
index c285c91a5..1f5a0694c 100644
|
||||
index c285c91a5e9c..71b8f103ab0f 100644
|
||||
--- a/drivers/acpi/x86/apple.c
|
||||
+++ b/drivers/acpi/x86/apple.c
|
||||
@@ -70,13 +70,16 @@ void acpi_extract_apple_properties(struct acpi_device *adev)
|
||||
@@ -31,7 +32,7 @@ index c285c91a5..1f5a0694c 100644
|
||||
newsize += key->string.length + 1;
|
||||
if ( val->type == ACPI_TYPE_BUFFER)
|
||||
newsize += val->buffer.length;
|
||||
+ else if ( val->type == ACPI_TYPE_STRING)
|
||||
+ else if (val->type == ACPI_TYPE_STRING)
|
||||
+ newsize += val->string.length + 1;
|
||||
}
|
||||
|
||||
@@ -50,5 +51,5 @@ index c285c91a5..1f5a0694c 100644
|
||||
newprops[v].buffer.length = val->buffer.length;
|
||||
newprops[v].buffer.pointer = free_space;
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+25
-26
@@ -1,7 +1,7 @@
|
||||
From 65727024796647d6848003f40c9d1af863842e46 Mon Sep 17 00:00:00 2001
|
||||
From 05e5ca05970157338e907f5c0654f17f79071bd3 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Thu, 23 Dec 2021 19:51:36 +0900
|
||||
Subject: [PATCH 15/33] brcmfmac: acpi: Add support for fetching Apple ACPI
|
||||
Subject: [PATCH 12/27] brcmfmac: acpi: Add support for fetching Apple ACPI
|
||||
properties
|
||||
|
||||
On DT platforms, the module-instance and antenna-sku-info properties
|
||||
@@ -14,7 +14,6 @@ Add support for this, to allow proper firmware selection on Apple
|
||||
platforms.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/Makefile | 2 +
|
||||
.../broadcom/brcm80211/brcmfmac/acpi.c | 52 +++++++++++++++++++
|
||||
@@ -24,7 +23,7 @@ Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||
index 13c13504a..19009eb9d 100644
|
||||
index 13c13504a6e8..19009eb9db93 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||
@@ -47,3 +47,5 @@ brcmfmac-$(CONFIG_OF) += \
|
||||
@@ -35,7 +34,7 @@ index 13c13504a..19009eb9d 100644
|
||||
+ acpi.o
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
||||
new file mode 100644
|
||||
index 000000000..b70cd6970
|
||||
index 000000000000..dec6a83d13b1
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c
|
||||
@@ -0,0 +1,52 @@
|
||||
@@ -50,27 +49,22 @@ index 000000000..b70cd6970
|
||||
+#include "common.h"
|
||||
+
|
||||
+void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||
+ struct brcmf_mp_device *settings)
|
||||
+ struct brcmf_mp_device *settings)
|
||||
+{
|
||||
+ acpi_status status;
|
||||
+ struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
+ const union acpi_object *o;
|
||||
+ struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
+ struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
+
|
||||
+ if (!adev) {
|
||||
+ if (!adev)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (!ACPI_FAILURE(acpi_dev_get_property(adev, "module-instance",
|
||||
+ ACPI_TYPE_STRING, &o))) {
|
||||
+ const char *prefix = "apple,";
|
||||
+ int len = strlen(prefix) + o->string.length + 1;
|
||||
+ char *board_type = devm_kzalloc(dev, len, GFP_KERNEL);
|
||||
+
|
||||
+ strlcpy(board_type, prefix, len);
|
||||
+ strlcat(board_type, o->string.pointer, len);
|
||||
+ ACPI_TYPE_STRING, &o))) {
|
||||
+ brcmf_dbg(INFO, "ACPI module-instance=%s\n", o->string.pointer);
|
||||
+ settings->board_type = board_type;
|
||||
+ settings->board_type = devm_kasprintf(dev, GFP_KERNEL,
|
||||
+ "apple,%s",
|
||||
+ o->string.pointer);
|
||||
+ } else {
|
||||
+ brcmf_dbg(INFO, "No ACPI module-instance\n");
|
||||
+ }
|
||||
@@ -78,21 +72,26 @@ index 000000000..b70cd6970
|
||||
+ status = acpi_evaluate_object(adev->handle, "RWCV", NULL, &buf);
|
||||
+ o = buf.pointer;
|
||||
+ if (!ACPI_FAILURE(status) && o && o->type == ACPI_TYPE_BUFFER &&
|
||||
+ o->buffer.length >= 2) {
|
||||
+ o->buffer.length >= 2) {
|
||||
+ char *antenna_sku = devm_kzalloc(dev, 3, GFP_KERNEL);
|
||||
+
|
||||
+ memcpy(antenna_sku, o->buffer.pointer, 2);
|
||||
+ brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n",
|
||||
+ (int)o->buffer.length, o->buffer.pointer,
|
||||
+ antenna_sku);
|
||||
+ if (!antenna_sku) {
|
||||
+ brcmf_err("Failed to allocate antenna-sku");
|
||||
+ } else {
|
||||
+ memcpy(antenna_sku, o->buffer.pointer, 2);
|
||||
+ brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n",
|
||||
+ (int)o->buffer.length, o->buffer.pointer,
|
||||
+ antenna_sku);
|
||||
+ settings->antenna_sku = antenna_sku;
|
||||
+ }
|
||||
+
|
||||
+ settings->antenna_sku = antenna_sku;
|
||||
+ kfree(buf.pointer);
|
||||
+ } else {
|
||||
+ brcmf_dbg(INFO, "No ACPI antenna-sku\n");
|
||||
+ }
|
||||
+}
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
index b8ed85112..c84c48e49 100644
|
||||
index b8ed851129b4..c84c48e49fde 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||
@@ -437,6 +437,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
|
||||
@@ -104,7 +103,7 @@ index b8ed85112..c84c48e49 100644
|
||||
return settings;
|
||||
}
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
index d4aa25d64..a88c4a931 100644
|
||||
index d4aa25d646fe..a88c4a9310f3 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||
@@ -73,6 +73,15 @@ static inline void
|
||||
@@ -124,5 +123,5 @@ index d4aa25d64..a88c4a931 100644
|
||||
|
||||
u8 brcmf_map_prio_to_aci(void *cfg, u8 prio);
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+12
-13
@@ -1,7 +1,7 @@
|
||||
From 6584070cfb25335f4ac239a71637161e978dfdd7 Mon Sep 17 00:00:00 2001
|
||||
From a40989f618558c83a2672354deab480ae5d8f2ac Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Thu, 23 Dec 2021 19:30:17 +0900
|
||||
Subject: [PATCH 16/33] brcmfmac: pcie: Provide a buffer of random bytes to the
|
||||
Subject: [PATCH 13/27] brcmfmac: pcie: Provide a buffer of random bytes to the
|
||||
device
|
||||
|
||||
Newer Apple firmwares on chipsets without a hardware RNG require the
|
||||
@@ -12,24 +12,24 @@ suffixed by a footer containing a magic number and the buffer length.
|
||||
This won't affect chips/firmwares that do not use this feature, so do it
|
||||
unconditionally.
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 31 +++++++++++++++++++
|
||||
1 file changed, 31 insertions(+)
|
||||
.../broadcom/brcm80211/brcmfmac/pcie.c | 29 +++++++++++++++++++
|
||||
1 file changed, 29 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 2342d4cd7..74fbbf266 100644
|
||||
index 2ca2c4b603cf..1e2afca5a60b 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/sched.h>
|
||||
+#include <linux/random.h>
|
||||
#include <linux/io.h>
|
||||
+#include <linux/random.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <soc.h>
|
||||
@@ -1625,6 +1626,13 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
|
||||
return 0;
|
||||
}
|
||||
@@ -44,7 +44,7 @@ index 2342d4cd7..74fbbf266 100644
|
||||
|
||||
static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
|
||||
const struct firmware *fw, void *nvram,
|
||||
@@ -1656,11 +1664,33 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
|
||||
@@ -1656,11 +1664,32 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
|
||||
brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
|
||||
|
||||
if (nvram) {
|
||||
@@ -61,8 +61,7 @@ index 2342d4cd7..74fbbf266 100644
|
||||
memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
|
||||
brcmf_fw_nvram_free(nvram);
|
||||
+
|
||||
+ /*
|
||||
+ * Some Apple chips/firmwares expect a buffer of random data
|
||||
+ /* Some Apple chips/firmwares expect a buffer of random data
|
||||
+ * to be present before NVRAM
|
||||
+ */
|
||||
+ brcmf_dbg(PCIE, "Download random seed\n");
|
||||
@@ -79,5 +78,5 @@ index 2342d4cd7..74fbbf266 100644
|
||||
brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
|
||||
devinfo->nvram_name);
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+14
-14
@@ -1,15 +1,15 @@
|
||||
From c74f1421fb8d246b22117608406d4e843853072e Mon Sep 17 00:00:00 2001
|
||||
From 8234909d956ce38bc5f35a2bb3980efcf2f0b895 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:50:15 +0900
|
||||
Subject: [PATCH 17/33] brcmfmac: pcie: Add IDs/properties for BCM4355
|
||||
Subject: [PATCH 14/27] brcmfmac: pcie: Add IDs/properties for BCM4355
|
||||
|
||||
This chip is present on at least these Apple T2 Macs:
|
||||
|
||||
* hawaii: MacBook Air 13" (Late 2018)
|
||||
* hawaii: MacBook Air 13" (True Tone, 2019)
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++
|
||||
@@ -17,10 +17,10 @@ Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
3 files changed, 11 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
index 56a6f4168..fdff7f5fc 100644
|
||||
index 7f1d6cea2141..6ac6a4414eda 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -726,6 +726,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
@@ -727,6 +727,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
return 0x200000;
|
||||
case BRCM_CC_4359_CHIP_ID:
|
||||
return (ci->pub.chiprev < 9) ? 0x180000 : 0x160000;
|
||||
@@ -29,10 +29,10 @@ index 56a6f4168..fdff7f5fc 100644
|
||||
case CY_CC_4373_CHIP_ID:
|
||||
return 0x160000;
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index b71952254..6d95c704f 100644
|
||||
index 1e2afca5a60b..67f79985e4b8 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -49,6 +49,7 @@ enum brcmf_pcie_state {
|
||||
@@ -50,6 +50,7 @@ enum brcmf_pcie_state {
|
||||
BRCMF_FW_DEF(43602, "brcmfmac43602-pcie");
|
||||
BRCMF_FW_DEF(4350, "brcmfmac4350-pcie");
|
||||
BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie");
|
||||
@@ -40,7 +40,7 @@ index b71952254..6d95c704f 100644
|
||||
BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie");
|
||||
BRCMF_FW_CLM_DEF(43570, "brcmfmac43570-pcie");
|
||||
BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
|
||||
@@ -75,6 +76,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
@@ -76,6 +77,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
@@ -48,7 +48,7 @@ index b71952254..6d95c704f 100644
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
@@ -2048,6 +2050,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -2001,6 +2003,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
int ret;
|
||||
|
||||
switch (devinfo->ci->chip) {
|
||||
@@ -60,7 +60,7 @@ index b71952254..6d95c704f 100644
|
||||
case BRCM_CC_4378_CHIP_ID:
|
||||
coreid = BCMA_CORE_GCI;
|
||||
base = 0x1120;
|
||||
@@ -2542,6 +2549,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
@@ -2475,6 +2482,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID),
|
||||
@@ -69,10 +69,10 @@ index b71952254..6d95c704f 100644
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
index 8f552b53f..9636ab4dd 100644
|
||||
index 43158a404652..81ada150ee30 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -36,6 +36,7 @@
|
||||
@@ -37,6 +37,7 @@
|
||||
#define BRCM_CC_4350_CHIP_ID 0x4350
|
||||
#define BRCM_CC_43525_CHIP_ID 43525
|
||||
#define BRCM_CC_4354_CHIP_ID 0x4354
|
||||
@@ -80,7 +80,7 @@ index 8f552b53f..9636ab4dd 100644
|
||||
#define BRCM_CC_4356_CHIP_ID 0x4356
|
||||
#define BRCM_CC_43566_CHIP_ID 43566
|
||||
#define BRCM_CC_43567_CHIP_ID 43567
|
||||
@@ -69,6 +70,7 @@
|
||||
@@ -70,6 +71,7 @@
|
||||
#define BRCM_PCIE_4350_DEVICE_ID 0x43a3
|
||||
#define BRCM_PCIE_4354_DEVICE_ID 0x43df
|
||||
#define BRCM_PCIE_4354_RAW_DEVICE_ID 0x4354
|
||||
@@ -89,5 +89,5 @@ index 8f552b53f..9636ab4dd 100644
|
||||
#define BRCM_PCIE_43567_DEVICE_ID 0x43d3
|
||||
#define BRCM_PCIE_43570_DEVICE_ID 0x43d9
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+14
-14
@@ -1,7 +1,7 @@
|
||||
From 226db6630db1557f4c0b64ad0692ae87e7083e6d Mon Sep 17 00:00:00 2001
|
||||
From 7b3c666a97960cf45bb8eae3a4d18ed687d0d2d6 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:51:31 +0900
|
||||
Subject: [PATCH 18/33] brcmfmac: pcie: Add IDs/properties for BCM4377
|
||||
Subject: [PATCH 15/27] brcmfmac: pcie: Add IDs/properties for BCM4377
|
||||
|
||||
This chip is present on at least these Apple T2 Macs:
|
||||
|
||||
@@ -9,8 +9,8 @@ This chip is present on at least these Apple T2 Macs:
|
||||
* formosa: MacBook Pro 13" (Touch/2019)
|
||||
* fiji: MacBook Air 13" (Scissor, 2020)
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 +
|
||||
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 ++++
|
||||
@@ -18,10 +18,10 @@ Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
3 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
index fdff7f5fc..73ab96968 100644
|
||||
index 6ac6a4414eda..4108108f0431 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -731,6 +731,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
@@ -732,6 +732,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
|
||||
case CY_CC_4373_CHIP_ID:
|
||||
return 0x160000;
|
||||
case CY_CC_43752_CHIP_ID:
|
||||
@@ -30,10 +30,10 @@ index fdff7f5fc..73ab96968 100644
|
||||
case BRCM_CC_4378_CHIP_ID:
|
||||
return 0x352000;
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 6d95c704f..5b4a4cb33 100644
|
||||
index 67f79985e4b8..d33919fd1db9 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -60,6 +60,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
@@ -61,6 +61,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
|
||||
BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
|
||||
BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
|
||||
@@ -41,7 +41,7 @@ index 6d95c704f..5b4a4cb33 100644
|
||||
BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie");
|
||||
|
||||
/* firmware config files */
|
||||
@@ -91,6 +92,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
@@ -92,6 +93,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
|
||||
@@ -49,7 +49,7 @@ index 6d95c704f..5b4a4cb33 100644
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */
|
||||
};
|
||||
|
||||
@@ -2055,6 +2057,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -2008,6 +2010,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
base = 0x8c0;
|
||||
words = 0xb2;
|
||||
break;
|
||||
@@ -57,7 +57,7 @@ index 6d95c704f..5b4a4cb33 100644
|
||||
case BRCM_CC_4378_CHIP_ID:
|
||||
coreid = BCMA_CORE_GCI;
|
||||
base = 0x1120;
|
||||
@@ -2568,6 +2571,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
@@ -2502,6 +2505,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID),
|
||||
BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID),
|
||||
@@ -66,10 +66,10 @@ index 6d95c704f..5b4a4cb33 100644
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
index 9636ab4dd..54d7ec515 100644
|
||||
index 81ada150ee30..6aea4a82e4db 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
|
||||
@@ -51,6 +51,7 @@
|
||||
@@ -52,6 +52,7 @@
|
||||
#define BRCM_CC_43664_CHIP_ID 43664
|
||||
#define BRCM_CC_43666_CHIP_ID 43666
|
||||
#define BRCM_CC_4371_CHIP_ID 0x4371
|
||||
@@ -77,7 +77,7 @@ index 9636ab4dd..54d7ec515 100644
|
||||
#define BRCM_CC_4378_CHIP_ID 0x4378
|
||||
#define CY_CC_4373_CHIP_ID 0x4373
|
||||
#define CY_CC_43012_CHIP_ID 43012
|
||||
@@ -88,6 +89,7 @@
|
||||
@@ -90,6 +91,7 @@
|
||||
#define BRCM_PCIE_4366_2G_DEVICE_ID 0x43c4
|
||||
#define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5
|
||||
#define BRCM_PCIE_4371_DEVICE_ID 0x440d
|
||||
@@ -86,5 +86,5 @@ index 9636ab4dd..54d7ec515 100644
|
||||
|
||||
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+8
-9
@@ -1,7 +1,7 @@
|
||||
From 0ea04c1f73e506a45383afb20e9ecf28e39b02a7 Mon Sep 17 00:00:00 2001
|
||||
From fd4e2cc0645af81a04e2255b73de71c8c2563bab Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Tue, 21 Dec 2021 17:51:52 +0900
|
||||
Subject: [PATCH 19/33] brcmfmac: pcie: Perform correct BCM4364 firmware
|
||||
Subject: [PATCH 16/27] brcmfmac: pcie: Perform correct BCM4364 firmware
|
||||
selection
|
||||
|
||||
This chip exists in two revisions (B2=r3 and B3=r4) on different
|
||||
@@ -30,19 +30,18 @@ kahana: Mac Pro (2019, Rack)
|
||||
hanauma: iMac 27" (5K, 2020)
|
||||
kure: iMac 27" (5K, 2020, 5700/XT)
|
||||
|
||||
Cc: brian m. carlson <sandals@crustytoothpaste.net>
|
||||
Fixes: 24f0bd136264 ("brcmfmac: add the BRCM 4364 found in MacBook Pro 15,2")
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
index 5b4a4cb33..b6b789b49 100644
|
||||
index d33919fd1db9..4e5964dd6c47 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||
@@ -54,7 +54,8 @@ BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie");
|
||||
@@ -55,7 +55,8 @@ BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie");
|
||||
BRCMF_FW_CLM_DEF(43570, "brcmfmac43570-pcie");
|
||||
BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
|
||||
BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
|
||||
@@ -52,7 +51,7 @@ index 5b4a4cb33..b6b789b49 100644
|
||||
BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
|
||||
BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
|
||||
BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
|
||||
@@ -84,7 +85,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
@@ -85,7 +86,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
|
||||
@@ -62,7 +61,7 @@ index 5b4a4cb33..b6b789b49 100644
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
|
||||
@@ -2057,6 +2059,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
@@ -2010,6 +2012,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo)
|
||||
base = 0x8c0;
|
||||
words = 0xb2;
|
||||
break;
|
||||
@@ -75,5 +74,5 @@ index 5b4a4cb33..b6b789b49 100644
|
||||
case BRCM_CC_4378_CHIP_ID:
|
||||
coreid = BCMA_CORE_GCI;
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
+9
-10
@@ -1,7 +1,7 @@
|
||||
From 66c8e1424e89aebddce3f0bea7961f8848eaf9ac Mon Sep 17 00:00:00 2001
|
||||
From 10a65edaaf93223c57d5b490826d004b1a66cfbc Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Mon, 20 Dec 2021 20:00:57 +0900
|
||||
Subject: [PATCH 20/33] brcmfmac: chip: Only disable D11 cores; handle an
|
||||
Subject: [PATCH 17/27] brcmfmac: chip: Only disable D11 cores; handle an
|
||||
arbitrary number
|
||||
|
||||
At least on BCM4387, the D11 cores are held in reset on cold startup and
|
||||
@@ -14,17 +14,17 @@ Also, BCM4387 has 3 cores, up from 2. The logic for handling that is in
|
||||
brcmf_chip_ai_resetcore(), but since we aren't using that any more, just
|
||||
handle it here.
|
||||
|
||||
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
Signed-off-by: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
---
|
||||
.../wireless/broadcom/brcm80211/brcmfmac/chip.c | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
.../net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
index 73ab96968..15a1211f0 100644
|
||||
index 4108108f0431..8266466283e4 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
|
||||
@@ -1289,15 +1289,19 @@ static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip)
|
||||
@@ -1290,15 +1290,18 @@ static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip)
|
||||
static inline void
|
||||
brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip)
|
||||
{
|
||||
@@ -38,8 +38,7 @@ index 73ab96968..15a1211f0 100644
|
||||
- D11_BCMA_IOCTL_PHYCLOCKEN,
|
||||
- D11_BCMA_IOCTL_PHYCLOCKEN,
|
||||
- D11_BCMA_IOCTL_PHYCLOCKEN);
|
||||
+ /*
|
||||
+ * Disable the cores only and let the firmware enable them.
|
||||
+ /* Disable the cores only and let the firmware enable them.
|
||||
+ * Releasing reset ourselves breaks BCM4387 in weird ways.
|
||||
+ */
|
||||
+ for (i = 0; (core = brcmf_chip_get_d11core(&chip->pub, i)); i++)
|
||||
@@ -50,5 +49,5 @@ index 73ab96968..15a1211f0 100644
|
||||
|
||||
static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec)
|
||||
--
|
||||
2.25.1
|
||||
2.36.0
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user