diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 55 | 
1 files changed, 45 insertions, 10 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index d31f96c3f925..32dc9d6f0fb6 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c @@ -339,14 +339,14 @@ int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)  	return ret;  } -const static u8 he_if_types_ext_capa_sta[] = { +static const u8 he_if_types_ext_capa_sta[] = {  	 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,  	 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,  	 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,  	 [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,  }; -const static struct wiphy_iftype_ext_capab he_iftypes_ext_capa[] = { +static const struct wiphy_iftype_ext_capab he_iftypes_ext_capa[] = {  	{  		.iftype = NL80211_IFTYPE_STATION,  		.extended_capabilities = he_if_types_ext_capa_sta, @@ -355,6 +355,15 @@ const static struct wiphy_iftype_ext_capab he_iftypes_ext_capa[] = {  	},  }; +static int +iwl_mvm_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) +{ +	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); +	*tx_ant = iwl_mvm_get_valid_tx_ant(mvm); +	*rx_ant = iwl_mvm_get_valid_rx_ant(mvm); +	return 0; +} +  int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)  {  	struct ieee80211_hw *hw = mvm->hw; @@ -734,6 +743,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)  		wiphy_ext_feature_set(hw->wiphy,  				      NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER); +	hw->wiphy->available_antennas_tx = iwl_mvm_get_valid_tx_ant(mvm); +	hw->wiphy->available_antennas_rx = iwl_mvm_get_valid_rx_ant(mvm); +  	ret = ieee80211_register_hw(mvm->hw);  	if (ret) {  		iwl_mvm_leds_exit(mvm); @@ -2280,7 +2292,9 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,  			}  			if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, -				     &mvm->status)) { +				     &mvm->status) && +			    !fw_has_capa(&mvm->fw->ucode_capa, +					 IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) {  				/*  				 * If we're restarting then the firmware will  				 * obviously have lost synchronisation with @@ -2294,6 +2308,10 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,  				 *  				 * Set a large maximum delay to allow for more  				 * than a single interface. +				 * +				 * For new firmware versions, rely on the +				 * firmware. This is relevant for DCM scenarios +				 * only anyway.  				 */  				u32 dur = (11 * vif->bss_conf.beacon_int) / 10;  				iwl_mvm_protect_session(mvm, vif, dur, dur, @@ -2384,8 +2402,11 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,  		/*  		 * We received a beacon from the associated AP so  		 * remove the session protection. +		 * A firmware with the new API will remove it automatically.  		 */ -		iwl_mvm_stop_session_protection(mvm, vif); +		if (!fw_has_capa(&mvm->fw->ucode_capa, +				 IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) +			iwl_mvm_stop_session_protection(mvm, vif);  		iwl_mvm_sf_update(mvm, vif, false);  		WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0)); @@ -3255,8 +3276,22 @@ static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,  		duration = req_duration;  	mutex_lock(&mvm->mutex); -	/* Try really hard to protect the session and hear a beacon */ -	iwl_mvm_protect_session(mvm, vif, duration, min_duration, 500, false); +	/* Try really hard to protect the session and hear a beacon +	 * The new session protection command allows us to protect the +	 * session for a much longer time since the firmware will internally +	 * create two events: a 300TU one with a very high priority that +	 * won't be fragmented which should be enough for 99% of the cases, +	 * and another one (which we configure here to be 900TU long) which +	 * will have a slightly lower priority, but more importantly, can be +	 * fragmented so that it'll allow other activities to run. +	 */ +	if (fw_has_capa(&mvm->fw->ucode_capa, +			IWL_UCODE_TLV_CAPA_SESSION_PROT_CMD)) +		iwl_mvm_schedule_session_protection(mvm, vif, 900, +						    min_duration); +	else +		iwl_mvm_protect_session(mvm, vif, duration, +					min_duration, 500, false);  	mutex_unlock(&mvm->mutex);  } @@ -3613,8 +3648,7 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,  	/* Set the channel info data */  	iwl_mvm_set_chan_info(mvm, &aux_roc_req.channel_info, channel->hw_value, -			      (channel->band == NL80211_BAND_2GHZ) ? -			       PHY_BAND_24 : PHY_BAND_5, +			      iwl_mvm_phy_band_from_nl80211(channel->band),  			      PHY_VHT_CHANNEL_MODE20,  			      0); @@ -3848,7 +3882,7 @@ static int iwl_mvm_cancel_roc(struct ieee80211_hw *hw,  	IWL_DEBUG_MAC80211(mvm, "enter\n");  	mutex_lock(&mvm->mutex); -	iwl_mvm_stop_roc(mvm); +	iwl_mvm_stop_roc(mvm, vif);  	mutex_unlock(&mvm->mutex);  	IWL_DEBUG_MAC80211(mvm, "leave\n"); @@ -4622,7 +4656,7 @@ static void iwl_mvm_flush_no_vif(struct iwl_mvm *mvm, u32 queues, bool drop)  			continue;  		if (drop) -			iwl_mvm_flush_sta_tids(mvm, i, 0xFF, 0); +			iwl_mvm_flush_sta_tids(mvm, i, 0xFFFF, 0);  		else  			iwl_mvm_wait_sta_queues_empty(mvm,  					iwl_mvm_sta_from_mac80211(sta)); @@ -5006,6 +5040,7 @@ const struct ieee80211_ops iwl_mvm_hw_ops = {  	.tx = iwl_mvm_mac_tx,  	.wake_tx_queue = iwl_mvm_mac_wake_tx_queue,  	.ampdu_action = iwl_mvm_mac_ampdu_action, +	.get_antenna = iwl_mvm_op_get_antenna,  	.start = iwl_mvm_mac_start,  	.reconfig_complete = iwl_mvm_mac_reconfig_complete,  	.stop = iwl_mvm_mac_stop,  |