Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Entropy512/6f1161cc1470905741067c8578dd166b to your computer and use it in GitHub Desktop.
Save Entropy512/6f1161cc1470905741067c8578dd166b to your computer and use it in GitHub Desktop.
OpenWRT brcmfmac country code tweaks
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