diff options
Diffstat (limited to 'net/mac80211/main.c')
| -rw-r--r-- | net/mac80211/main.c | 37 | 
1 files changed, 30 insertions, 7 deletions
| diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 61877662e8f8..0d7b08db8e56 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -358,7 +358,8 @@ static void ieee80211_restart_work(struct work_struct *work)  	flush_workqueue(local->workqueue);  	mutex_lock(&local->mtx); -	WARN(test_bit(SCAN_HW_SCANNING, &local->scanning), +	WARN(test_bit(SCAN_HW_SCANNING, &local->scanning) || +	     local->sched_scanning,  		"%s called with hardware scan in progress\n", __func__);  	mutex_unlock(&local->mtx); @@ -580,8 +581,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,  	wiphy->flags |= WIPHY_FLAG_NETNS_OK |  			WIPHY_FLAG_4ADDR_AP | -			WIPHY_FLAG_4ADDR_STATION | -			WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; +			WIPHY_FLAG_4ADDR_STATION;  	if (!ops->set_key)  		wiphy->flags |= WIPHY_FLAG_IBSS_RSN; @@ -652,6 +652,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,  	setup_timer(&local->dynamic_ps_timer,  		    ieee80211_dynamic_ps_timer, (unsigned long) local); +	INIT_WORK(&local->sched_scan_stopped_work, +		  ieee80211_sched_scan_stopped_work); +  	sta_info_init(local);  	for (i = 0; i < IEEE80211_MAX_QUEUES; i++) { @@ -682,7 +685,7 @@ EXPORT_SYMBOL(ieee80211_alloc_hw);  int ieee80211_register_hw(struct ieee80211_hw *hw)  {  	struct ieee80211_local *local = hw_to_local(hw); -	int result; +	int result, i;  	enum ieee80211_band band;  	int channels, max_bitrates;  	bool supp_ht; @@ -697,6 +700,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  		WLAN_CIPHER_SUITE_AES_CMAC  	}; +	if ((hw->wiphy->wowlan.flags || hw->wiphy->wowlan.n_patterns) +#ifdef CONFIG_PM +	    && (!local->ops->suspend || !local->ops->resume) +#endif +	    ) +		return -EINVAL; +  	if (hw->max_report_rates == 0)  		hw->max_report_rates = hw->max_rates; @@ -733,11 +743,19 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  		return -ENOMEM;  	/* if low-level driver supports AP, we also support VLAN */ -	if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) -		local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); +	if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) { +		hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); +		hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); +	}  	/* mac80211 always supports monitor */ -	local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); +	hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); +	hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); + +	/* mac80211 doesn't support more than 1 channel */ +	for (i = 0; i < hw->wiphy->n_iface_combinations; i++) +		if (hw->wiphy->iface_combinations[i].num_different_channels > 1) +			return -EINVAL;  #ifndef CONFIG_MAC80211_MESH  	/* mesh depends on Kconfig, but drivers should set it if they want */ @@ -827,6 +845,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  	if (!local->ops->remain_on_channel)  		local->hw.wiphy->max_remain_on_channel_duration = 5000; +	if (local->ops->sched_scan_start) +		local->hw.wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; +  	result = wiphy_register(local->hw.wiphy);  	if (result < 0)  		goto fail_wiphy_register; @@ -850,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)  	 * and we need some headroom for passing the frame to monitor  	 * interfaces, but never both at the same time.  	 */ +#ifndef __CHECKER__  	BUILD_BUG_ON(IEEE80211_TX_STATUS_HEADROOM !=  			sizeof(struct ieee80211_tx_status_rtap_hdr)); +#endif  	local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom,  				   sizeof(struct ieee80211_tx_status_rtap_hdr)); | 
