On Tue, Dec 21, 2021 at 2:58 AM Sasha Levin <sashal@xxxxxxxxxx> wrote: > > From: Finn Behrens <me@xxxxxxxxxx> > > [ Upstream commit 1eda919126b420fee6b8d546f7f728fbbd4b8f11 ] > > Reload the regdom when the regulatory db is reloaded. > Otherwise, the user had to change the regulatoy domain > to a different one and then reset it to the correct > one to have a new regulatory db take effect after a > reload. > > Signed-off-by: Finn Behrens <fin@xxxxxxxxxxx> > Link: https://lore.kernel.org/r/YaIIZfxHgqc/UTA7@xxxxxxxxxxxxxxxx > [edit commit message] > Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx> > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> This requires [1] to fix this warning: net/wireless/reg.c:1137:23: warning: implicit conversion from enumeration type 'enum nl80211_user_reg_hint_type' to different enumeration type 'enum nl80211_reg_ initiator' [-Wenum-conversion] [PATCH] nl80211: remove reload flag from regulatory_request - Sedat - [1] https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211.git/patch/?id=37d33114240ede043c42463a6347f68ed72d6904 > --- > include/net/regulatory.h | 1 + > net/wireless/reg.c | 27 +++++++++++++++++++++++++-- > 2 files changed, 26 insertions(+), 2 deletions(-) > > diff --git a/include/net/regulatory.h b/include/net/regulatory.h > index 47f06f6f5a67c..0cf9335431e07 100644 > --- a/include/net/regulatory.h > +++ b/include/net/regulatory.h > @@ -83,6 +83,7 @@ struct regulatory_request { > enum nl80211_dfs_regions dfs_region; > bool intersect; > bool processed; > + bool reload; > enum environment_cap country_ie_env; > struct list_head list; > }; > diff --git a/net/wireless/reg.c b/net/wireless/reg.c > index df87c7f3a0492..61f1bf1bc4a73 100644 > --- a/net/wireless/reg.c > +++ b/net/wireless/reg.c > @@ -133,6 +133,7 @@ static u32 reg_is_indoor_portid; > > static void restore_regulatory_settings(bool reset_user, bool cached); > static void print_regdomain(const struct ieee80211_regdomain *rd); > +static void reg_process_hint(struct regulatory_request *reg_request); > > static const struct ieee80211_regdomain *get_cfg80211_regdom(void) > { > @@ -1098,6 +1099,8 @@ int reg_reload_regdb(void) > const struct firmware *fw; > void *db; > int err; > + const struct ieee80211_regdomain *current_regdomain; > + struct regulatory_request *request; > > err = request_firmware(&fw, "regulatory.db", ®_pdev->dev); > if (err) > @@ -1118,8 +1121,27 @@ int reg_reload_regdb(void) > if (!IS_ERR_OR_NULL(regdb)) > kfree(regdb); > regdb = db; > - rtnl_unlock(); > > + /* reset regulatory domain */ > + current_regdomain = get_cfg80211_regdom(); > + > + request = kzalloc(sizeof(*request), GFP_KERNEL); > + if (!request) { > + err = -ENOMEM; > + goto out_unlock; > + } > + > + request->wiphy_idx = WIPHY_IDX_INVALID; > + request->alpha2[0] = current_regdomain->alpha2[0]; > + request->alpha2[1] = current_regdomain->alpha2[1]; > + request->initiator = NL80211_USER_REG_HINT_USER; > + request->user_reg_hint_type = NL80211_USER_REG_HINT_USER; > + request->reload = true; > + > + reg_process_hint(request); > + > +out_unlock: > + rtnl_unlock(); > out: > release_firmware(fw); > return err; > @@ -2690,7 +2712,8 @@ reg_process_hint_user(struct regulatory_request *user_request) > > treatment = __reg_process_hint_user(user_request); > if (treatment == REG_REQ_IGNORE || > - treatment == REG_REQ_ALREADY_SET) > + (treatment == REG_REQ_ALREADY_SET && > + !user_request->reload)) > return REG_REQ_IGNORE; > > user_request->intersect = treatment == REG_REQ_INTERSECT; > -- > 2.34.1 >