diff options
Diffstat (limited to 'net/wireless/reg.c')
| -rw-r--r-- | net/wireless/reg.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 9b897fca7487..f0541370e68e 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -1700,7 +1700,7 @@ static void reg_process_hint(struct regulatory_request *reg_request)  		return;  	case NL80211_REGDOM_SET_BY_USER:  		treatment = reg_process_hint_user(reg_request); -		if (treatment == REG_REQ_OK || +		if (treatment == REG_REQ_IGNORE ||  		    treatment == REG_REQ_ALREADY_SET)  			return;  		schedule_delayed_work(®_timeout, msecs_to_jiffies(3142)); @@ -2373,6 +2373,7 @@ static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,  int set_regdom(const struct ieee80211_regdomain *rd)  {  	struct regulatory_request *lr; +	bool user_reset = false;  	int r;  	if (!reg_is_valid_request(rd->alpha2)) { @@ -2389,6 +2390,7 @@ int set_regdom(const struct ieee80211_regdomain *rd)  		break;  	case NL80211_REGDOM_SET_BY_USER:  		r = reg_set_rd_user(rd, lr); +		user_reset = true;  		break;  	case NL80211_REGDOM_SET_BY_DRIVER:  		r = reg_set_rd_driver(rd, lr); @@ -2402,8 +2404,14 @@ int set_regdom(const struct ieee80211_regdomain *rd)  	}  	if (r) { -		if (r == -EALREADY) +		switch (r) { +		case -EALREADY:  			reg_set_request_processed(); +			break; +		default: +			/* Back to world regulatory in case of errors */ +			restore_regulatory_settings(user_reset); +		}  		kfree(rd);  		return r;  | 
