diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/net/wireless/intel/iwlwifi/mvm/rs.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/rs.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 93 | 
1 files changed, 51 insertions, 42 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c index 0b50b816684a..9a20468345e4 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 - 2021 Intel Corporation. All rights reserved. + * Copyright(c) 2005 - 2014, 2018 - 2022 Intel Corporation. All rights reserved.   * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH   * Copyright(c) 2016 - 2017 Intel Deutschland GmbH   *****************************************************************************/ @@ -512,10 +512,10 @@ static char *rs_pretty_rate(const struct rs_rate *rate)  		 (rate->index <= IWL_RATE_MCS_9_INDEX))  		rate_str = ht_vht_rates[rate->index];  	else -		rate_str = "BAD_RATE"; +		rate_str = NULL;  	sprintf(buf, "(%s|%s|%s)", rs_pretty_lq_type(rate->type), -		iwl_rs_pretty_ant(rate->ant), rate_str); +		iwl_rs_pretty_ant(rate->ant), rate_str ?: "BAD_RATE");  	return buf;  } @@ -754,7 +754,7 @@ static int rs_collect_tlc_data(struct iwl_mvm *mvm,  		return -EINVAL;  	if (tbl->column != RS_COLUMN_INVALID) { -		struct lq_sta_pers *pers = &mvmsta->lq_sta.rs_drv.pers; +		struct lq_sta_pers *pers = &mvmsta->deflink.lq_sta.rs_drv.pers;  		pers->tx_stats[tbl->column][scale_index].total += attempts;  		pers->tx_stats[tbl->column][scale_index].success += successes; @@ -895,8 +895,7 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,  			WARN_ON_ONCE(1);  		}  	} else if (ucode_rate & RATE_MCS_VHT_MSK_V1) { -		nss = ((ucode_rate & RATE_VHT_MCS_NSS_MSK) >> -		       RATE_VHT_MCS_NSS_POS) + 1; +		nss = FIELD_GET(RATE_MCS_NSS_MSK, ucode_rate) + 1;  		if (nss == 1) {  			rate->type = LQ_VHT_SISO; @@ -910,8 +909,7 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,  			WARN_ON_ONCE(1);  		}  	} else if (ucode_rate & RATE_MCS_HE_MSK_V1) { -		nss = ((ucode_rate & RATE_VHT_MCS_NSS_MSK) >> -		      RATE_VHT_MCS_NSS_POS) + 1; +		nss = FIELD_GET(RATE_MCS_NSS_MSK, ucode_rate) + 1;  		if (nss == 1) {  			rate->type = LQ_HE_SISO; @@ -1489,9 +1487,11 @@ static void rs_set_amsdu_len(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  			     enum rs_action scale_action)  {  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); +	struct ieee80211_bss_conf *bss_conf = &mvmsta->vif->bss_conf;  	int i; -	sta->deflink.agg.max_amsdu_len = rs_fw_get_max_amsdu_len(sta); +	sta->deflink.agg.max_amsdu_len = +		rs_fw_get_max_amsdu_len(sta, bss_conf, &sta->deflink);  	/*  	 * In case TLC offload is not active amsdu_enabled is either 0xFFFF @@ -1504,7 +1504,7 @@ static void rs_set_amsdu_len(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	else  		mvmsta->amsdu_enabled = 0xFFFF; -	if (mvmsta->vif->bss_conf.he_support && +	if (bss_conf->he_support &&  	    !iwlwifi_mod_params.disable_11ax)  		mvmsta->max_amsdu_len = sta->deflink.agg.max_amsdu_len;  	else @@ -2601,7 +2601,7 @@ void rs_update_last_rssi(struct iwl_mvm *mvm,  			 struct iwl_mvm_sta *mvmsta,  			 struct ieee80211_rx_status *rx_status)  { -	struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; +	struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv;  	int i;  	lq_sta->pers.chains = rx_status->chains; @@ -2684,7 +2684,6 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,  		/* if vif isn't initialized mvm doesn't know about  		 * this station, so don't do anything with the it  		 */ -		sta = NULL;  		mvm_sta = NULL;  	} @@ -2692,6 +2691,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; @@ -2706,6 +2707,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, @@ -2714,7 +2716,7 @@ static void *rs_drv_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);  	struct iwl_op_mode *op_mode = (struct iwl_op_mode *)mvm_rate;  	struct iwl_mvm *mvm  = IWL_OP_MODE_GET_MVM(op_mode); -	struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; +	struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv;  	IWL_DEBUG_RATE(mvm, "create station rate scale window\n"); @@ -2885,8 +2887,7 @@ void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg)  		nss = ((rate & RATE_HT_MCS_NSS_MSK_V1) >> RATE_HT_MCS_NSS_POS_V1) + 1;  	} else if (rate & RATE_MCS_VHT_MSK_V1) {  		mvm->drv_rx_stats.vht_frames++; -		nss = ((rate & RATE_VHT_MCS_NSS_MSK) >> -		       RATE_VHT_MCS_NSS_POS) + 1; +		nss = FIELD_GET(RATE_MCS_NSS_MSK, rate) + 1;  	} else {  		mvm->drv_rx_stats.legacy_frames++;  	} @@ -2921,18 +2922,18 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;  	struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); -	struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; +	struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv;  	struct ieee80211_supported_band *sband;  	unsigned long supp; /* must be unsigned long for for_each_set_bit */ -	lockdep_assert_held(&mvmsta->lq_sta.rs_drv.pers.lock); +	lockdep_assert_held(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  	/* clear all non-persistent lq data */  	memset(lq_sta, 0, offsetof(typeof(*lq_sta), pers));  	sband = hw->wiphy->bands[band]; -	lq_sta->lq.sta_id = mvmsta->sta_id; +	lq_sta->lq.sta_id = mvmsta->deflink.sta_id;  	mvmsta->amsdu_enabled = 0;  	mvmsta->max_amsdu_len = sta->cur->max_amsdu_len; @@ -2944,7 +2945,7 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	IWL_DEBUG_RATE(mvm,  		       "LQ: *** rate scale station global init for station %d ***\n", -		       mvmsta->sta_id); +		       mvmsta->deflink.sta_id);  	/* TODO: what is a good starting rate for STA? About middle? Maybe not  	 * the lowest or the highest rate.. Could consider using RSSI from  	 * previous packets? Need to have IEEE 802.1X auth succeed immediately @@ -3006,17 +3007,20 @@ static void rs_drv_rate_update(void *mvm_r,  			       void *priv_sta, u32 changed)  {  	struct iwl_op_mode *op_mode = mvm_r; +	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);  	struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode);  	u8 tid; -	if (!iwl_mvm_sta_from_mac80211(sta)->vif) +	if (!mvmsta->vif)  		return;  	/* Stop any ongoing aggregations as rs starts off assuming no agg */  	for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++)  		ieee80211_stop_tx_ba_session(sta, tid); -	iwl_mvm_rs_rate_init(mvm, sta, sband->band, true); +	iwl_mvm_rs_rate_init(mvm, mvmsta->vif, sta, +			     &mvmsta->vif->bss_conf, &sta->deflink, +			     sband->band);  }  static void __iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, @@ -3036,7 +3040,7 @@ static void __iwl_mvm_rs_tx_status(struct iwl_mvm *mvm,  	u8 lq_color = RS_DRV_DATA_LQ_COLOR_GET(tlc_info);  	u32 tx_resp_hwrate = (uintptr_t)info->status.status_driver_data[1];  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); -	struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv; +	struct iwl_lq_sta *lq_sta = &mvmsta->deflink.lq_sta.rs_drv;  	if (!lq_sta->pers.drv) {  		IWL_DEBUG_RATE(mvm, "Rate scaling not initialized yet.\n"); @@ -3260,11 +3264,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->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->lq_sta.rs_drv.pers.lock); +	spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  }  #ifdef CONFIG_MAC80211_DEBUGFS @@ -3440,7 +3444,7 @@ static void rs_bfer_active_iter(void *_data,  {  	struct rs_bfer_active_iter_data *data = _data;  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); -	struct iwl_lq_cmd *lq_cmd = &mvmsta->lq_sta.rs_drv.lq; +	struct iwl_lq_cmd *lq_cmd = &mvmsta->deflink.lq_sta.rs_drv.lq;  	u32 ss_params = le32_to_cpu(lq_cmd->ss_params);  	if (sta == data->exclude_sta) @@ -3471,7 +3475,8 @@ static int rs_bfer_priority(struct iwl_mvm_sta *sta)  		prio = 1;  		break;  	default: -		WARN_ONCE(true, "viftype %d sta_id %d", viftype, sta->sta_id); +		WARN_ONCE(true, "viftype %d sta_id %d", viftype, +			  sta->deflink.sta_id);  		prio = -1;  	} @@ -3548,12 +3553,12 @@ static void rs_set_lq_ss_params(struct iwl_mvm *mvm,  	}  	IWL_DEBUG_RATE(mvm, "Found existing sta %d with BFER activated\n", -		       bfer_mvmsta->sta_id); +		       bfer_mvmsta->deflink.sta_id);  	/* Disallow BFER on another STA if active and we're a higher priority */  	if (rs_bfer_priority_cmp(mvmsta, bfer_mvmsta) > 0) {  		struct iwl_lq_cmd *bfersta_lq_cmd = -			&bfer_mvmsta->lq_sta.rs_drv.lq; +			&bfer_mvmsta->deflink.lq_sta.rs_drv.lq;  		u32 bfersta_ss_params = le32_to_cpu(bfersta_lq_cmd->ss_params);  		bfersta_ss_params &= ~LQ_SS_BFER_ALLOWED; @@ -3563,7 +3568,7 @@ static void rs_set_lq_ss_params(struct iwl_mvm *mvm,  		ss_params |= LQ_SS_BFER_ALLOWED;  		IWL_DEBUG_RATE(mvm,  			       "Lower priority BFER sta found (%d). Switch BFER\n", -			       bfer_mvmsta->sta_id); +			       bfer_mvmsta->deflink.sta_id);  	}  out:  	lq_cmd->ss_params = cpu_to_le32(ss_params); @@ -3605,7 +3610,7 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm,  	    num_of_ant(initial_rate->ant) == 1)  		lq_cmd->single_stream_ant_msk = initial_rate->ant; -	lq_cmd->agg_frame_cnt_limit = mvmsta->max_agg_bufsize; +	lq_cmd->agg_frame_cnt_limit = lq_sta->pers.max_agg_bufsize;  	/*  	 * In case of low latency, tell the firmware to leave a frame in the @@ -3665,8 +3670,7 @@ int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate)  	if (rate & RATE_MCS_VHT_MSK_V1) {  		type = "VHT";  		mcs = rate & RATE_VHT_MCS_RATE_CODE_MSK; -		nss = ((rate & RATE_VHT_MCS_NSS_MSK) -		       >> RATE_VHT_MCS_NSS_POS) + 1; +		nss = FIELD_GET(RATE_MCS_NSS_MSK, rate) + 1;  	} else if (rate & RATE_MCS_HT_MSK_V1) {  		type = "HT";  		mcs = rate & RATE_HT_MCS_INDEX_MSK_V1; @@ -3675,8 +3679,7 @@ int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate)  	} else if (rate & RATE_MCS_HE_MSK_V1) {  		type = "HE";  		mcs = rate & RATE_VHT_MCS_RATE_CODE_MSK; -		nss = ((rate & RATE_VHT_MCS_NSS_MSK) -		       >> RATE_VHT_MCS_NSS_POS) + 1; +		nss = FIELD_GET(RATE_MCS_NSS_MSK, rate) + 1;  	} else {  		type = "Unknown"; /* shouldn't happen */  	} @@ -3750,7 +3753,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,  	struct iwl_lq_sta *lq_sta = file->private_data;  	struct iwl_mvm_sta *mvmsta = -		container_of(lq_sta, struct iwl_mvm_sta, lq_sta.rs_drv); +		container_of(lq_sta, struct iwl_mvm_sta, deflink.lq_sta.rs_drv);  	struct iwl_mvm *mvm;  	struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);  	struct rs_rate *rate = &tbl->rate; @@ -4051,7 +4054,8 @@ static void rs_drv_add_sta_debugfs(void *mvm, void *priv_sta,  	struct iwl_lq_sta *lq_sta = priv_sta;  	struct iwl_mvm_sta *mvmsta; -	mvmsta = container_of(lq_sta, struct iwl_mvm_sta, lq_sta.rs_drv); +	mvmsta = container_of(lq_sta, struct iwl_mvm_sta, +			      deflink.lq_sta.rs_drv);  	if (!mvmsta->vif)  		return; @@ -4100,17 +4104,22 @@ static const struct rate_control_ops rs_mvm_ops_drv = {  	.capa = RATE_CTRL_CAPA_VHT_EXT_NSS_BW,  }; -void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, -			  enum nl80211_band band, bool update) +void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, +			  struct ieee80211_vif *vif, +			  struct ieee80211_sta *sta, +			  struct ieee80211_bss_conf *link_conf, +			  struct ieee80211_link_sta *link_sta, +			  enum nl80211_band band)  {  	if (iwl_mvm_has_tlc_offload(mvm)) { -		rs_fw_rate_init(mvm, sta, band, update); +		iwl_mvm_rs_fw_rate_init(mvm, vif, sta, link_conf, +					link_sta, band);  	} else {  		struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); -		spin_lock(&mvmsta->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->lq_sta.rs_drv.pers.lock); +		spin_unlock_bh(&mvmsta->deflink.lq_sta.rs_drv.pers.lock);  	}  } @@ -4127,7 +4136,7 @@ void iwl_mvm_rate_control_unregister(void)  static int rs_drv_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,  				bool enable)  { -	struct iwl_lq_cmd *lq = &mvmsta->lq_sta.rs_drv.lq; +	struct iwl_lq_cmd *lq = &mvmsta->deflink.lq_sta.rs_drv.lq;  	lockdep_assert_held(&mvm->mutex);  |