mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-23 07:36:57 +08:00
100 lines
3.7 KiB
Diff
100 lines
3.7 KiB
Diff
From 16db59b33f07783e609897e51a686d3c10e3a4c1 Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Sun, 26 Dec 2021 00:53:37 +0900
|
|
Subject: [PATCH 112/171] brcmfmac: common: Add support for external
|
|
calibration blobs
|
|
|
|
The calibration blob for a chip is normally stored in SROM and loaded
|
|
internally by the firmware. However, Apple ARM64 platforms instead store
|
|
it as part of platform configuration data, and provide it via the Apple
|
|
Device Tree. We forward this into the Linux DT in the bootloader.
|
|
|
|
Add support for taking this blob from the DT and loading it into the
|
|
dongle. The loading mechanism is the same as used for the CLM and TxCap
|
|
blobs.
|
|
|
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Signed-off-by: Hector Martin <marcan@marcan.st>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/common.c | 24 +++++++++++++++++++
|
|
.../broadcom/brcm80211/brcmfmac/common.h | 2 ++
|
|
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 7 ++++++
|
|
3 files changed, 33 insertions(+)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
index d36aeca5c74e..280ca0f1ba18 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
|
@@ -218,6 +218,23 @@ static int brcmf_c_process_txcap_blob(struct brcmf_if *ifp)
|
|
return err;
|
|
}
|
|
|
|
+static int brcmf_c_process_cal_blob(struct brcmf_if *ifp)
|
|
+{
|
|
+ struct brcmf_pub *drvr = ifp->drvr;
|
|
+ struct brcmf_mp_device *settings = drvr->settings;
|
|
+ s32 err;
|
|
+
|
|
+ brcmf_dbg(TRACE, "Enter\n");
|
|
+
|
|
+ if (!settings->cal_blob || !settings->cal_size)
|
|
+ return 0;
|
|
+
|
|
+ brcmf_info("Calibration blob provided by platform, loading\n");
|
|
+ err = brcmf_c_download_blob(ifp, settings->cal_blob, settings->cal_size,
|
|
+ "calload", "calload_status");
|
|
+ return err;
|
|
+}
|
|
+
|
|
int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
|
{
|
|
struct brcmf_pub *drvr = ifp->drvr;
|
|
@@ -302,6 +319,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
|
|
goto done;
|
|
}
|
|
|
|
+ /* Download external calibration blob, if available */
|
|
+ err = brcmf_c_process_cal_blob(ifp);
|
|
+ if (err < 0) {
|
|
+ bphy_err(drvr, "download calibration blob file failed, %d\n", err);
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
/* query for 'ver' to get version info from firmware */
|
|
memset(buf, 0, sizeof(buf));
|
|
err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
index 960b1042a7c2..39e8abcf0522 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
|
@@ -52,6 +52,8 @@ struct brcmf_mp_device {
|
|
const char *board_type;
|
|
unsigned char mac[ETH_ALEN];
|
|
const char *antenna_sku;
|
|
+ const void *cal_blob;
|
|
+ int cal_size;
|
|
union {
|
|
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 644cc48eae40..60a97277d798 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
|
@@ -79,6 +79,13 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
|
if (!of_property_read_string(np, "apple,antenna-sku", &prop))
|
|
settings->antenna_sku = prop;
|
|
|
|
+ /* The WLAN calibration blob is normally stored in SROM, but Apple
|
|
+ * ARM64 platforms pass it via the DT instead.
|
|
+ */
|
|
+ prop = of_get_property(np, "brcm,cal-blob", &settings->cal_size);
|
|
+ if (prop && settings->cal_size)
|
|
+ settings->cal_blob = prop;
|
|
+
|
|
/* Set board-type to the first string of the machine compatible prop */
|
|
root = of_find_node_by_path("/");
|
|
if (root && !settings->board_type) {
|
|
--
|
|
2.34.1
|
|
|