diff options
Diffstat (limited to 'net/wireless/reg.c')
| -rw-r--r-- | net/wireless/reg.c | 39 | 
1 files changed, 32 insertions, 7 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5fcec5c94eb7..bbe6298e4bb9 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -1656,7 +1656,7 @@ const char *reg_initiator_name(enum nl80211_reg_initiator initiator)  	case NL80211_REGDOM_SET_BY_DRIVER:  		return "driver";  	case NL80211_REGDOM_SET_BY_COUNTRY_IE: -		return "country IE"; +		return "country element";  	default:  		WARN_ON(1);  		return "bug"; @@ -2622,7 +2622,7 @@ reg_process_hint_country_ie(struct wiphy *wiphy,  		 * This doesn't happen yet, not sure we  		 * ever want to support it for this case.  		 */ -		WARN_ONCE(1, "Unexpected intersection for country IEs"); +		WARN_ONCE(1, "Unexpected intersection for country elements");  		return REG_REQ_IGNORE;  	} @@ -2772,6 +2772,21 @@ out_free:  	reg_free_request(reg_request);  } +static void notify_self_managed_wiphys(struct regulatory_request *request) +{ +	struct cfg80211_registered_device *rdev; +	struct wiphy *wiphy; + +	list_for_each_entry(rdev, &cfg80211_rdev_list, list) { +		wiphy = &rdev->wiphy; +		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && +		    request->initiator == NL80211_REGDOM_SET_BY_USER && +		    request->user_reg_hint_type == +				NL80211_USER_REG_HINT_CELL_BASE) +			reg_call_notifier(wiphy, request); +	} +} +  static bool reg_only_self_managed_wiphys(void)  {  	struct cfg80211_registered_device *rdev; @@ -2823,6 +2838,7 @@ static void reg_process_pending_hints(void)  	spin_unlock(®_requests_lock); +	notify_self_managed_wiphys(reg_request);  	if (reg_only_self_managed_wiphys()) {  		reg_free_request(reg_request);  		return; @@ -3387,7 +3403,7 @@ bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)  	case NL80211_DFS_JP:  		return true;  	default: -		pr_debug("Ignoring uknown DFS master region: %d\n", dfs_region); +		pr_debug("Ignoring unknown DFS master region: %d\n", dfs_region);  		return false;  	}  } @@ -3702,17 +3718,26 @@ EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync_rtnl);  void wiphy_regulatory_register(struct wiphy *wiphy)  { -	struct regulatory_request *lr; +	struct regulatory_request *lr = get_last_request(); -	/* self-managed devices ignore external hints */ -	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) +	/* self-managed devices ignore beacon hints and country IE */ +	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {  		wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |  					   REGULATORY_COUNTRY_IE_IGNORE; +		/* +		 * The last request may have been received before this +		 * registration call. Call the driver notifier if +		 * initiator is USER and user type is CELL_BASE. +		 */ +		if (lr->initiator == NL80211_REGDOM_SET_BY_USER && +		    lr->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE) +			reg_call_notifier(wiphy, lr); +	} +  	if (!reg_dev_ignore_cell_hint(wiphy))  		reg_num_devs_support_basehint++; -	lr = get_last_request();  	wiphy_update_regulatory(wiphy, lr->initiator);  	wiphy_all_share_dfs_chan_state(wiphy);  }  | 
