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/coex.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/coex.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/coex.c | 104 | 
1 files changed, 71 insertions, 33 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/coex.c b/drivers/net/wireless/intel/iwlwifi/mvm/coex.c index ee3c8a786199..5a5b1128e75c 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/coex.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/coex.c @@ -194,7 +194,7 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,  	if (mvmsta->bt_reduced_txpower == enable)  		return 0; -	value = mvmsta->sta_id; +	value = mvmsta->deflink.sta_id;  	if (enable)  		value |= BT_REDUCED_TX_POWER_BIT; @@ -257,33 +257,35 @@ static void iwl_mvm_bt_coex_tcm_based_ci(struct iwl_mvm *mvm,  	swap(data->primary, data->secondary);  } -/* must be called under rcu_read_lock */ -static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, -				      struct ieee80211_vif *vif) +static void iwl_mvm_bt_notif_per_link(struct iwl_mvm *mvm, +				      struct ieee80211_vif *vif, +				      struct iwl_bt_iterator_data *data, +				      unsigned int link_id)  { -	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); -	struct iwl_bt_iterator_data *data = _data; -	struct iwl_mvm *mvm = data->mvm; -	struct ieee80211_chanctx_conf *chanctx_conf;  	/* default smps_mode is AUTOMATIC - only used for client modes */  	enum ieee80211_smps_mode smps_mode = IEEE80211_SMPS_AUTOMATIC; +	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);  	u32 bt_activity_grading, min_ag_for_static_smps; +	struct ieee80211_chanctx_conf *chanctx_conf; +	struct iwl_mvm_vif_link_info *link_info; +	struct ieee80211_bss_conf *link_conf;  	int ave_rssi;  	lockdep_assert_held(&mvm->mutex); -	switch (vif->type) { -	case NL80211_IFTYPE_STATION: -		break; -	case NL80211_IFTYPE_AP: -		if (!mvmvif->ap_ibss_active) -			return; -		break; -	default: +	link_info = mvmvif->link[link_id]; +	if (!link_info)  		return; -	} -	chanctx_conf = rcu_dereference(vif->bss_conf.chanctx_conf); +	link_conf = rcu_dereference(vif->link_conf[link_id]); +	/* This can happen due to races: if we receive the notification +	 * and have the mutex held, while mac80211 is stuck on our mutex +	 * in the middle of removing the link. +	 */ +	if (!link_conf) +		return; + +	chanctx_conf = rcu_dereference(link_conf->chanctx_conf);  	/* If channel context is invalid or not on 2.4GHz .. */  	if ((!chanctx_conf || @@ -291,9 +293,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  		if (vif->type == NL80211_IFTYPE_STATION) {  			/* ... relax constraints and disable rssi events */  			iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX, -					    smps_mode); -			iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, +					    smps_mode, link_id); +			iwl_mvm_bt_coex_reduced_txp(mvm, link_info->ap_sta_id,  						    false); +			/* FIXME: should this be per link? */  			iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);  		}  		return; @@ -314,17 +317,18 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  	if (!vif->cfg.assoc)  		smps_mode = IEEE80211_SMPS_AUTOMATIC; -	if (mvmvif->phy_ctxt && -	    (mvm->last_bt_notif.rrc_status & BIT(mvmvif->phy_ctxt->id))) +	if (link_info->phy_ctxt && +	    (mvm->last_bt_notif.rrc_status & BIT(link_info->phy_ctxt->id)))  		smps_mode = IEEE80211_SMPS_AUTOMATIC;  	IWL_DEBUG_COEX(data->mvm, -		       "mac %d: bt_activity_grading %d smps_req %d\n", -		       mvmvif->id, bt_activity_grading, smps_mode); +		       "mac %d link %d: bt_activity_grading %d smps_req %d\n", +		       mvmvif->id, link_info->fw_link_id, +		       bt_activity_grading, smps_mode);  	if (vif->type == NL80211_IFTYPE_STATION)  		iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX, -				    smps_mode); +				    smps_mode, link_id);  	/* low latency is always primary */  	if (iwl_mvm_vif_low_latency(mvmvif)) { @@ -353,6 +357,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  			data->secondary = chanctx_conf;  		} +		/* FIXME: TCM load per interface? or need something per link? */  		if (data->primary == chanctx_conf)  			data->primary_load = mvm->tcm.result.load[mvmvif->id];  		else if (data->secondary == chanctx_conf) @@ -370,6 +375,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  		/* if secondary is not NULL, it might be a GO */  		data->secondary = chanctx_conf; +	/* FIXME: TCM load per interface? or need something per link? */  	if (data->primary == chanctx_conf)  		data->primary_load = mvm->tcm.result.load[mvmvif->id];  	else if (data->secondary == chanctx_conf) @@ -384,7 +390,8 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  	if (iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT ||  	    mvm->cfg->bt_shared_single_ant || !vif->cfg.assoc ||  	    le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) == BT_OFF) { -		iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, false); +		iwl_mvm_bt_coex_reduced_txp(mvm, link_info->ap_sta_id, false); +		/* FIXME: should this be per link? */  		iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);  		return;  	} @@ -396,10 +403,12 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  	if (!ave_rssi)  		ave_rssi = -100;  	if (ave_rssi > -IWL_MVM_BT_COEX_EN_RED_TXP_THRESH) { -		if (iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, true)) +		if (iwl_mvm_bt_coex_reduced_txp(mvm, link_info->ap_sta_id, +						true))  			IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");  	} else if (ave_rssi < -IWL_MVM_BT_COEX_DIS_RED_TXP_THRESH) { -		if (iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, false)) +		if (iwl_mvm_bt_coex_reduced_txp(mvm, link_info->ap_sta_id, +						false))  			IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");  	} @@ -407,6 +416,32 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,  	iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, true, ave_rssi);  } +/* must be called under rcu_read_lock */ +static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, +				      struct ieee80211_vif *vif) +{ +	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); +	struct iwl_bt_iterator_data *data = _data; +	struct iwl_mvm *mvm = data->mvm; +	unsigned int link_id; + +	lockdep_assert_held(&mvm->mutex); + +	switch (vif->type) { +	case NL80211_IFTYPE_STATION: +		break; +	case NL80211_IFTYPE_AP: +		if (!mvmvif->ap_ibss_active) +			return; +		break; +	default: +		return; +	} + +	for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) +		iwl_mvm_bt_notif_per_link(mvm, vif, data, link_id); +} +  static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)  {  	struct iwl_bt_iterator_data data = { @@ -521,7 +556,7 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	 * Rssi update while not associated - can happen since the statistics  	 * are handled asynchronously  	 */ -	if (mvmvif->ap_sta_id == IWL_MVM_INVALID_STA) +	if (mvmvif->deflink.ap_sta_id == IWL_MVM_INVALID_STA)  		return;  	/* No BT - reports should be disabled */ @@ -537,10 +572,13 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	 */  	if (rssi_event == RSSI_EVENT_LOW || mvm->cfg->bt_shared_single_ant ||  	    iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT) -		ret = iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, +		ret = iwl_mvm_bt_coex_reduced_txp(mvm, +						  mvmvif->deflink.ap_sta_id,  						  false);  	else -		ret = iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, true); +		ret = iwl_mvm_bt_coex_reduced_txp(mvm, +						  mvmvif->deflink.ap_sta_id, +						  true);  	if (ret)  		IWL_ERR(mvm, "couldn't send BT_CONFIG HCMD upon RSSI event\n"); @@ -554,7 +592,7 @@ u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,  {  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);  	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif); -	struct iwl_mvm_phy_ctxt *phy_ctxt = mvmvif->phy_ctxt; +	struct iwl_mvm_phy_ctxt *phy_ctxt = mvmvif->deflink.phy_ctxt;  	enum iwl_bt_coex_lut_type lut_type;  	if (mvm->last_bt_notif.ttc_status & BIT(phy_ctxt->id)) @@ -578,7 +616,7 @@ bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,  {  	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);  	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif); -	struct iwl_mvm_phy_ctxt *phy_ctxt = mvmvif->phy_ctxt; +	struct iwl_mvm_phy_ctxt *phy_ctxt = mvmvif->deflink.phy_ctxt;  	enum iwl_bt_coex_lut_type lut_type;  	if (mvm->last_bt_notif.ttc_status & BIT(phy_ctxt->id))  |