On 18.12.21 19:56, Hans de Goede wrote: > This is a second attempt at honering the country code send out by access > points. This was first added in commit b0b524f079a2 ("brcmfmac: use > ISO3166 country code and 0 rev as fallback"). > > Subsequently this was reverted in commit 151a7c12c4fc ("Revert "brcmfmac: > use ISO3166 country code and 0 rev as fallback""), because it was causing > issues with AP mode on some brcmfmac models (specifically on BCM4359/9). > > Many devices ship with a nvram ccode value of X2/XT/XU/XV/ALL which are > all special world-wide compatibility ccode-s. Most of these world-wide > ccode-s allow passive scan mode only for 2.4GHz channels 12-14, > only enabling them when an AP is seen on them. > > But at least on brcmfmac43455 devices this is not working correctly, these > do not see accesspoints on channels 12-14 unless the ccode is changes to > a country where these channels are allowed. > > Translating received country codes to an ISO3166 country code and 0 rev > ccreq fixes devices using a brcmfmac43455 with a X2/XT/XU/XV/ALL ccode > not seeing accesspoints on channels 12-14. > > To avoid this causing issues on other brcmfmac models again, the > fallback is limited to only brcmfmac4345* chips this time. > > Cc: Shawn Guo <shawn.guo@xxxxxxxxxx> > Cc: Soeren Moch <smoch@xxxxxx> > Cc: Fabio Aiuto <fabioaiuto83@xxxxxxxxx> > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> Unsurprisingly this does not hurt on BCM4359/9. So FWIW Tested-by: Soeren Moch <smoch@xxxxxx> # on BCM4359/9 > --- > .../broadcom/brcm80211/brcmfmac/cfg80211.c | 33 +++++++++++++++---- > 1 file changed, 27 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > index fb727778312c..c10ac839dd26 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > @@ -16,6 +16,7 @@ > #include <brcmu_utils.h> > #include <defs.h> > #include <brcmu_wifi.h> > +#include <brcm_hw_ids.h> > #include "core.h" > #include "debug.h" > #include "tracepoint.h" > @@ -7455,6 +7456,16 @@ int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg, > vif_event_equals(event, action), timeout); > } > > +static bool brmcf_use_iso3166_ccode_fallback(struct brcmf_pub *drvr) > +{ > + switch (drvr->bus_if->chip) { > + case BRCM_CC_4345_CHIP_ID: > + return true; > + default: > + return false; > + } > +} > + > static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], > struct brcmf_fil_country_le *ccreq) > { > @@ -7463,18 +7474,28 @@ 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) { > + if (brmcf_use_iso3166_ccode_fallback(drvr)) { > + 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; > + } > + > + brcmf_dbg(TRACE, "No country codes configured for device\n"); > + return -EINVAL; > + } > + > found_index = -1; > for (i = 0; i < country_codes->table_size; i++) { > cc = &country_codes->table[i];