mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
135 lines
5.2 KiB
Diff
135 lines
5.2 KiB
Diff
From 608e39fd3521d26bfc846383626f4605d7b273a7 Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Tue, 21 Dec 2021 17:45:21 +0900
|
|
Subject: [PATCH 091/171] brcmfmac: pcie: Perform firmware selection for Apple
|
|
platforms
|
|
|
|
On Apple platforms, firmware selection uses the following elements:
|
|
|
|
Property Example Source
|
|
============== ======= ========================
|
|
* Chip name 4378 Device ID
|
|
* Chip revision B1 OTP
|
|
* Platform shikoku DT (ARM64) or ACPI (x86)
|
|
* Module type RASP OTP
|
|
* Module vendor m OTP
|
|
* Module version 6.11 OTP
|
|
* Antenna SKU X3 DT (ARM64) or ACPI (x86)
|
|
|
|
In macOS, these firmwares are stored using filenames in this format
|
|
under /usr/share/firmware/wifi:
|
|
|
|
C-4378__s-B1/P-shikoku-X3_M-RASP_V-m__m-6.11.txt
|
|
|
|
To prepare firmwares for Linux, we rename these to a scheme following
|
|
the existing brcmfmac convention:
|
|
|
|
brcmfmac<chip><lower(rev)>-pcie.apple,<platform>-<mod_type>-\
|
|
<mod_vendor>-<mod_version>-<antenna_sku>.txt
|
|
|
|
The NVRAM uses all the components, while the firmware and CLM blob only
|
|
use the chip/revision/platform/antenna_sku:
|
|
|
|
brcmfmac<chip><lower(rev)>-pcie.apple,<platform>-<antenna_sku>.bin
|
|
|
|
e.g.
|
|
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.bin
|
|
|
|
In addition, since there are over 1000 files in total, many of which are
|
|
symlinks or outright duplicates, we deduplicate and prune the firmware
|
|
tree to reduce firmware filenames to fewer dimensions. For example, the
|
|
shikoku platform (MacBook Air M1 2020) simplifies to just 4 files:
|
|
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku.clm_blob
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku.bin
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-u.txt
|
|
|
|
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.
|
|
|
|
To handle this, the driver must try the following path formats when
|
|
looking for firmware files:
|
|
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP.txt
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.txt *
|
|
brcm/brcmfmac4378b1-pcie.apple,shikoku.txt
|
|
|
|
* 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
|
|
and continue to use the existing PCI revision mechanism to identify chip
|
|
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>
|
|
---
|
|
.../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 17d0353e9105..86807d990cc7 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
@@ -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[0] = devinfo->settings->board_type;
|
|
+ /* Apple platforms with fancy firmware/NVRAM selection */
|
|
+ if (devinfo->settings->board_type &&
|
|
+ devinfo->settings->antenna_sku &&
|
|
+ devinfo->otp.valid) {
|
|
+ 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 */
|
|
+ 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;
|
|
+
|
|
+ if (!bt[0] || !bt[1] || !bt[2] || !bt[3] || !bt[4]) {
|
|
+ kfree(fwreq);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ } else {
|
|
+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
|
+ fwreq->board_types[0] = devinfo->settings->board_type;
|
|
+ }
|
|
|
|
return fwreq;
|
|
}
|
|
--
|
|
2.34.1
|
|
|