Created
August 12, 2020 17:10
-
-
Save Entropy512/6f1161cc1470905741067c8578dd166b to your computer and use it in GitHub Desktop.
OpenWRT brcmfmac country code tweaks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From e2a964d6872d03f9ecdb3f17dde6879239bb28a3 Mon Sep 17 00:00:00 2001 | |
From: Andy Dodd <atd7@cornell.edu> | |
Date: Tue, 11 Aug 2020 16:30:54 -0400 | |
Subject: [PATCH] Pull in upstream brcmfmac changes from raspi distro | |
--- | |
.../brcm/865-brcmfmac-upstream-raspi.patch | 179 ++++++++++++++++++ | |
1 file changed, 179 insertions(+) | |
create mode 100644 package/kernel/mac80211/patches/brcm/865-brcmfmac-upstream-raspi.patch | |
diff --git a/package/kernel/mac80211/patches/brcm/865-brcmfmac-upstream-raspi.patch b/package/kernel/mac80211/patches/brcm/865-brcmfmac-upstream-raspi.patch | |
new file mode 100644 | |
index 0000000000..ff58ccfe1e | |
--- /dev/null | |
+++ b/package/kernel/mac80211/patches/brcm/865-brcmfmac-upstream-raspi.patch | |
@@ -0,0 +1,179 @@ | |
+Index: backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | |
+=================================================================== | |
+--- backports-5.8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | |
++++ backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | |
+@@ -9,6 +9,7 @@ | |
+ #include <linux/etherdevice.h> | |
+ #include <linux/module.h> | |
+ #include <linux/vmalloc.h> | |
++#include <linux/ctype.h> | |
+ #include <net/cfg80211.h> | |
+ #include <net/netlink.h> | |
+ #include <uapi/linux/if_arp.h> | |
+@@ -7397,12 +7398,18 @@ static s32 brcmf_translate_country_code( | |
+ struct brcmfmac_pd_cc *country_codes; | |
+ struct brcmfmac_pd_cc_entry *cc; | |
+ s32 found_index; | |
++ char ccode[BRCMF_COUNTRY_BUF_SZ]; | |
++ int rev; | |
+ int i; | |
+ | |
++ memcpy(ccode, alpha2, sizeof(ccode)); | |
++ rev = -1; | |
++ | |
+ country_codes = drvr->settings->country_codes; | |
+ if (!country_codes) { | |
+- brcmf_dbg(TRACE, "No country codes configured for device\n"); | |
+- return -EINVAL; | |
++ brcmf_dbg(TRACE, "No country codes configured for device" | |
++ " - use requested value\n"); | |
++ goto use_input_value; | |
+ } | |
+ | |
+ if ((alpha2[0] == ccreq->country_abbrev[0]) && | |
+@@ -7426,10 +7433,14 @@ static s32 brcmf_translate_country_code( | |
+ brcmf_dbg(TRACE, "No country code match found\n"); | |
+ return -EINVAL; | |
+ } | |
+- memset(ccreq, 0, sizeof(*ccreq)); | |
+- ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev); | |
+- memcpy(ccreq->ccode, country_codes->table[found_index].cc, | |
++ rev = country_codes->table[found_index].rev; | |
++ memcpy(ccode, country_codes->table[found_index].cc, | |
+ BRCMF_COUNTRY_BUF_SZ); | |
++ | |
++use_input_value: | |
++ memset(ccreq, 0, sizeof(*ccreq)); | |
++ ccreq->rev = cpu_to_le32(rev); | |
++ memcpy(ccreq->ccode, ccode, sizeof(ccode)); | |
+ ccreq->country_abbrev[0] = alpha2[0]; | |
+ ccreq->country_abbrev[1] = alpha2[1]; | |
+ ccreq->country_abbrev[2] = 0; | |
+@@ -7444,31 +7455,45 @@ static void brcmf_cfg80211_reg_notifier( | |
+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); | |
+ struct brcmf_pub *drvr = cfg->pub; | |
+ struct brcmf_fil_country_le ccreq; | |
++ char *alpha2; | |
+ s32 err; | |
+ int i; | |
+ | |
+- /* The country code gets set to "00" by default at boot, ignore */ | |
+- if (req->alpha2[0] == '0' && req->alpha2[1] == '0') | |
++ err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq)); | |
++ if (err) { | |
++ bphy_err(drvr, "Country code iovar returned err = %d\n", err); | |
+ return; | |
++ } | |
++ | |
++ /* The country code gets set to "00" by default at boot - substitute | |
++ * any saved ccode from the nvram file unless there is a valid code | |
++ * already set. | |
++ */ | |
++ alpha2 = req->alpha2; | |
++ if (alpha2[0] == '0' && alpha2[1] == '0') { | |
++ extern char saved_ccode[2]; | |
++ | |
++ if ((isupper(ccreq.country_abbrev[0]) && | |
++ isupper(ccreq.country_abbrev[1])) || | |
++ !saved_ccode[0]) | |
++ return; | |
++ alpha2 = saved_ccode; | |
++ pr_debug("brcmfmac: substituting saved ccode %c%c\n", | |
++ alpha2[0], alpha2[1]); | |
++ } | |
+ | |
+ /* ignore non-ISO3166 country codes */ | |
+ for (i = 0; i < 2; i++) | |
+- if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { | |
++ if (alpha2[i] < 'A' || alpha2[i] > 'Z') { | |
+ bphy_err(drvr, "not an ISO3166 code (0x%02x 0x%02x)\n", | |
+- req->alpha2[0], req->alpha2[1]); | |
++ alpha2[0], alpha2[1]); | |
+ return; | |
+ } | |
+ | |
+ brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, | |
+- req->alpha2[0], req->alpha2[1]); | |
+- | |
+- err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq)); | |
+- if (err) { | |
+- bphy_err(drvr, "Country code iovar returned err = %d\n", err); | |
+- return; | |
+- } | |
++ alpha2[0], alpha2[1]); | |
+ | |
+- err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq); | |
++ err = brcmf_translate_country_code(ifp->drvr, alpha2, &ccreq); | |
+ if (err) | |
+ return; | |
+ | |
+Index: backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | |
+=================================================================== | |
+--- backports-5.8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | |
++++ backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | |
+@@ -10,6 +10,7 @@ | |
+ #include <linux/firmware.h> | |
+ #include <linux/module.h> | |
+ #include <linux/bcm47xx_nvram.h> | |
++#include <linux/ctype.h> | |
+ | |
+ #include "debug.h" | |
+ #include "firmware.h" | |
+@@ -30,6 +31,8 @@ enum nvram_parser_state { | |
+ END | |
+ }; | |
+ | |
++char saved_ccode[2] = {}; | |
++ | |
+ /** | |
+ * struct nvram_parser - internal info for parser. | |
+ * | |
+@@ -546,10 +549,26 @@ static int brcmf_fw_request_nvram_done(c | |
+ goto fail; | |
+ } | |
+ | |
+- if (data) | |
++ if (data) { | |
++ char *ccode = strnstr((char *)data, "ccode=", data_len); | |
++ /* Ensure this is a whole token */ | |
++ if (ccode && ((void *)ccode == (void *)data || isspace(ccode[-1]))) { | |
++ /* Comment out the line */ | |
++ ccode[0] = '#'; | |
++ ccode += 6; | |
++ if (isupper(ccode[0]) && isupper(ccode[1]) && | |
++ isspace(ccode[2])) { | |
++ pr_debug("brcmfmac: intercepting ccode=%c%c\n", | |
++ ccode[0], ccode[1]); | |
++ saved_ccode[0] = ccode[0]; | |
++ saved_ccode[1] = ccode[1]; | |
++ } | |
++ }; | |
++ | |
+ nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length, | |
+ fwctx->req->domain_nr, | |
+ fwctx->req->bus_nr); | |
++ } | |
+ | |
+ if (free_bcm47xx_nvram) | |
+ bcm47xx_nvram_release_contents(data); | |
+Index: backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | |
+=================================================================== | |
+--- backports-5.8-1.orig/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | |
++++ backports-5.8-1/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | |
+@@ -610,6 +610,7 @@ BRCMF_FW_DEF(4329, "brcmfmac4329-sdio"); | |
+ BRCMF_FW_DEF(4330, "brcmfmac4330-sdio"); | |
+ BRCMF_FW_DEF(4334, "brcmfmac4334-sdio"); | |
+ BRCMF_FW_DEF(43340, "brcmfmac43340-sdio"); | |
++BRCMF_FW_DEF(43341, "brcmfmac43341-sdio"); | |
+ BRCMF_FW_DEF(4335, "brcmfmac4335-sdio"); | |
+ BRCMF_FW_DEF(43362, "brcmfmac43362-sdio"); | |
+ BRCMF_FW_DEF(4339, "brcmfmac4339-sdio"); | |
+@@ -633,7 +634,7 @@ static const struct brcmf_firmware_mappi | |
+ BRCMF_FW_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330), | |
+ BRCMF_FW_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334), | |
+ BRCMF_FW_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340), | |
+- BRCMF_FW_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43340), | |
++ BRCMF_FW_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43341), | |
+ BRCMF_FW_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335), | |
+ BRCMF_FW_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362), | |
+ BRCMF_FW_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339), | |
-- | |
2.17.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment