Commit 1eda9191 authored by Finn Behrens's avatar Finn Behrens Committed by Johannes Berg
Browse files

nl80211: reset regdom when reloading regdb



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: default avatarFinn Behrens <fin@nyantec.com>
Link: https://lore.kernel.org/r/YaIIZfxHgqc/UTA7@gimli.kloenk.dev


[edit commit message]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent af9d3a29
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
};
+25 −2
Original line number Diff line number Diff line
@@ -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", &reg_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;