diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index b6697f1e3..465cd91f7 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -10840,18 +10840,43 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, brcmf_dbg(INFO, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, alpha2[0], alpha2[1]); - err = brcmf_translate_country_code(ifp->drvr, alpha2, &ccreq); - if (err) - return; - /* Abort on-going scan before changing ccode */ brcmf_abort_scanning(cfg); + memset(&ccreq, 0, sizeof(ccreq)); + err = brcmf_translate_country_code(ifp->drvr, alpha2, &ccreq); + if (err == -EINVAL) { + /* Country map not available → build a raw /0 triplet */ + ccreq.country_abbrev[0] = alpha2[0]; + ccreq.country_abbrev[1] = alpha2[1]; + ccreq.ccode[0] = alpha2[0]; + ccreq.ccode[1] = alpha2[1]; + ccreq.rev = cpu_to_le16(0); + err = 0; + } else if (err) { + bphy_err(drvr, "translate country %c%c failed: %d\n", + alpha2[0], alpha2[1], err); + return; + } + + /* Push country into firmware */ + err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq)); if (err) { - bphy_err(drvr, "Firmware rejected country setting\n"); + bphy_err(drvr, "set country %c%c/%u failed (%d)\n", + ccreq.country_abbrev[0], ccreq.country_abbrev[1], + le16_to_cpu(ccreq.rev), err); return; } + + struct brcmf_fil_country_le cur = { 0 }; + if (!brcmf_fil_iovar_data_get(ifp, "country", &cur, sizeof(cur))) { + brcmf_dbg(INFO, "FW country now: abbrev=%c%c ccode=%c%c rev=%u\n", + cur.country_abbrev[0], cur.country_abbrev[1], + cur.ccode[0], cur.ccode[1], + le16_to_cpu(cur.rev)); + } + brcmf_setup_wiphybands(cfg); }