diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/rs.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 22 | 
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c index a4c1e3bf4ff1..481d68cbbbd8 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c @@ -1,7 +1,7 @@  // SPDX-License-Identifier: GPL-2.0-only  /******************************************************************************   * - * Copyright(c) 2005 - 2014, 2018 - 2022 Intel Corporation. All rights reserved. + * Copyright(c) 2005 - 2014, 2018 - 2023 Intel Corporation. All rights reserved.   * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH   * Copyright(c) 2016 - 2017 Intel Deutschland GmbH   *****************************************************************************/ @@ -1070,10 +1070,13 @@ static void rs_get_lower_rate_down_column(struct iwl_lq_sta *lq_sta,  		rate->bw = RATE_MCS_CHAN_WIDTH_20; -		WARN_ON_ONCE(rate->index < IWL_RATE_MCS_0_INDEX || -			     rate->index > IWL_RATE_MCS_9_INDEX); +		if (WARN_ON_ONCE(rate->index < IWL_RATE_MCS_0_INDEX)) +			rate->index = rs_ht_to_legacy[IWL_RATE_MCS_0_INDEX]; +		else if (WARN_ON_ONCE(rate->index > IWL_RATE_MCS_9_INDEX)) +			rate->index = rs_ht_to_legacy[IWL_RATE_MCS_9_INDEX]; +		else +			rate->index = rs_ht_to_legacy[rate->index]; -		rate->index = rs_ht_to_legacy[rate->index];  		rate->ldpc = false;  	} else {  		/* Downgrade to SISO with same MCS if in MIMO  */ @@ -2691,6 +2694,8 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,  		return;  	lq_sta = mvm_sta; + +	spin_lock_bh(&lq_sta->pers.lock);  	iwl_mvm_hwrate_to_tx_rate_v1(lq_sta->last_rate_n_flags,  				     info->band, &info->control.rates[0]);  	info->control.rates[0].count = 1; @@ -2705,6 +2710,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,  		iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band,  					     &txrc->reported_rate);  	} +	spin_unlock_bh(&lq_sta->pers.lock);  }  static void *rs_drv_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta, @@ -3261,11 +3267,11 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	/* If it's locked we are in middle of init flow  	 * just wait for next tx status to update the lq_sta data  	 */ -	if (!spin_trylock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock)) +	if (!spin_trylock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock))  		return;  	__iwl_mvm_rs_tx_status(mvm, sta, tid, info, ndp); -	spin_unlock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); +	spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  }  #ifdef CONFIG_MAC80211_DEBUGFS @@ -4114,9 +4120,9 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm,  	} else {  		struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); -		spin_lock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); +		spin_lock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  		rs_drv_rate_init(mvm, sta, band); -		spin_unlock(&mvmsta->deflink.lq_sta.rs_drv.pers.lock); +		spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  	}  }  | 
