Re: [BUG] Re: [PATCH] brcmfmac: use ISO3166 country code and 0 rev as fallback
From: Soeren Moch <hidden>
Date: 2021-09-08 05:08:31
Also in:
linux-rockchip, linux-wireless, lkml, netdev
Possibly related (same subject, not in this thread)
- 2021-09-26 · Re: [BUG] Re: [PATCH] brcmfmac: use ISO3166 country code and 0 rev as fallback · Soeren Moch <hidden>
Hi Shawn, On 08.09.21 03:00, Shawn Guo wrote:
Hi Soeren, On Tue, Sep 07, 2021 at 09:22:52PM +0200, Soeren Moch wrote:quoted
On 25.04.21 13:02, Shawn Guo wrote:quoted
Instead of aborting country code setup in firmware, use ISO3166 country code and 0 rev as fallback, when country_codes mapping table is not configured. This fallback saves the country_codes table setup for recent brcmfmac chipsets/firmwares, which just use ISO3166 code and require no revision number.This patch breaks wireless support on RockPro64. At least the access point is not usable, station mode not tested. brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4359/9 wl0: Mar 6 2017 10:16:06 version 9.87.51.7 (r686312) FWID 01-4dcc75d9 Reverting this patch makes the access point show up again with linux-5.14 .Sorry for breaking your device! So it sounds like you do not have country_codes configured for your BCM4359/9 device, while it needs particular `rev` setup for the ccode you are testing with. It was "working" likely because you have a static `ccode` and `regrev` setting in nvram file.
It always has been a mystery to me how country codes are configured for this device. Before I read your patch I did not even know that a translation table is required. Is there some documentation how this is supposed to work? Not sure if this makes a difference, BCM4359/9 is a Cypress device I think, I added mainline support for it some time ago. I have installed different firmware files, brcmfmac4359-sdio.clm_blob, brcmfmac4359-sdio.bin, brcmfmac4359-sdio.txt, the latter also linked as brcmfmac4359-sdio.pine64,rockpro64-2.1.txt. This probably is the nvram file. ccode and regrev are set to zero, which probably means 'international save settings".
But roaming to a different region will mostly get you a broken WiFi support. Is it possible to set up the country_codes for your device to get it work properly?
In linux-5.13 it worked, probably with save settings (not all channels selectable, limited tx power), with linux-5.14 it stopped working, so it is a regression. I personally would like to learn how all this is configured properly. For general use I think save settings are better than no wifi at all with this patch. This fallback to ISO CC seams to work with newer (Synaptics?) devices only. Soeren
Shawnquoted
Regards, Soerenquoted
Signed-off-by: Shawn Guo <redacted> --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index f4405d7861b6..6cb09c7c37b6 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c@@ -7442,18 +7442,23 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], s32 found_index; int i; - country_codes = drvr->settings->country_codes; - if (!country_codes) { - brcmf_dbg(TRACE, "No country codes configured for device\n"); - return -EINVAL; - } - if ((alpha2[0] == ccreq->country_abbrev[0]) && (alpha2[1] == ccreq->country_abbrev[1])) { brcmf_dbg(TRACE, "Country code already set\n"); return -EAGAIN; } + country_codes = drvr->settings->country_codes; + if (!country_codes) { + brcmf_dbg(TRACE, "No country codes configured for device, using ISO3166 code and 0 rev\n"); + memset(ccreq, 0, sizeof(*ccreq)); + ccreq->country_abbrev[0] = alpha2[0]; + ccreq->country_abbrev[1] = alpha2[1]; + ccreq->ccode[0] = alpha2[0]; + ccreq->ccode[1] = alpha2[1]; + return 0; + } + found_index = -1; for (i = 0; i < country_codes->table_size; i++) { cc = &country_codes->table[i];
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel