Skip to content

Commit 3db8b05

Browse files
dberlinmarcan
authored andcommitted
[brcmfmac] Fix regulatory domain handling to reset bands properly
Currently, we ignore the default country in the reg notifier. We also register a custom regulatory domain, which is set as the default. As a result, the chip is likely to be set to the correct country, but the regulatory domain will not match it. When the regulatory notifier is then called, we see the countries are the same and do not change anything, even though the domain is wrong. This patch forces us to reset the bands on the first country change even if the chip is already set to that country. We also restore the original band info before reconstructing channel info, as the new regdom power limits may be higher than what is currently set. Signed-off-by: Daniel Berlin <[email protected]>
1 parent 3046e55 commit 3db8b05

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7249,19 +7249,34 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
72497249
goto fail_pbuf;
72507250
}
72517251

7252+
/* Changing regulatory domain may change power limits upwards.
7253+
* To ensure that we correctly set the new band info, copy the original
7254+
* info first.
7255+
*/
72527256
band = wiphy->bands[NL80211_BAND_2GHZ];
7253-
if (band)
7257+
if (band) {
7258+
memcpy(band->channels, &__wl_2ghz_channels,
7259+
sizeof(__wl_2ghz_channels));
7260+
band->n_channels = ARRAY_SIZE(__wl_2ghz_channels);
72547261
for (i = 0; i < band->n_channels; i++)
72557262
band->channels[i].flags = IEEE80211_CHAN_DISABLED;
7263+
}
72567264
band = wiphy->bands[NL80211_BAND_5GHZ];
7257-
if (band)
7265+
if (band) {
7266+
memcpy(band->channels, &__wl_5ghz_channels,
7267+
sizeof(__wl_5ghz_channels));
7268+
band->n_channels = ARRAY_SIZE(__wl_5ghz_channels);
72587269
for (i = 0; i < band->n_channels; i++)
72597270
band->channels[i].flags = IEEE80211_CHAN_DISABLED;
7271+
}
72607272
band = wiphy->bands[NL80211_BAND_6GHZ];
7261-
if (band)
7273+
if (band) {
7274+
memcpy(band->channels, &__wl_6ghz_channels,
7275+
sizeof(__wl_6ghz_channels));
7276+
band->n_channels = ARRAY_SIZE(__wl_6ghz_channels);
72627277
for (i = 0; i < band->n_channels; i++)
72637278
band->channels[i].flags = IEEE80211_CHAN_DISABLED;
7264-
7279+
}
72657280
total = le32_to_cpu(list->count);
72667281
if (total > BRCMF_MAX_CHANSPEC_LIST) {
72677282
bphy_err(drvr, "Invalid count of channel Spec. (%u)\n",
@@ -8650,9 +8665,17 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
86508665
}
86518666

86528667
err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq);
8653-
if (err)
8654-
return;
8655-
8668+
if (err) {
8669+
/* Because we ignore the default country code above,
8670+
* we will start out in our custom reg domain, but the chip
8671+
* may already be set to the right country.
8672+
* As such, we force the bands to be re-set the first
8673+
* time we try to set a country for real.
8674+
*/
8675+
if (err != -EAGAIN || !cfg->force_band_setup)
8676+
return;
8677+
}
8678+
cfg->force_band_setup = false;
86568679
err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq));
86578680
if (err) {
86588681
bphy_err(drvr, "Firmware rejected country setting\n");
@@ -8719,6 +8742,7 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
87198742
cfg->pub = drvr;
87208743
init_vif_event(&cfg->vif_event);
87218744
INIT_LIST_HEAD(&cfg->vif_list);
8745+
cfg->force_band_setup = true;
87228746

87238747
vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION);
87248748
if (IS_ERR(vif))

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ struct brcmf_cfg80211_wowl {
327327
* @dongle_up: indicate whether dongle up or not.
328328
* @roam_on: on/off switch for dongle self-roaming.
329329
* @scan_tried: indicates if first scan attempted.
330+
* @force_band_setup: indicates if we should force band setup
330331
* @dcmd_buf: dcmd buffer.
331332
* @extra_buf: mainly to grab assoc information.
332333
* @debugfsdir: debugfs folder for this device.
@@ -357,6 +358,7 @@ struct brcmf_cfg80211_info {
357358
bool pwr_save;
358359
bool dongle_up;
359360
bool scan_tried;
361+
bool force_band_setup;
360362
u8 *dcmd_buf;
361363
u8 *extra_buf;
362364
struct dentry *debugfsdir;

0 commit comments

Comments
 (0)