diff options
Diffstat (limited to 'sys/contrib/dev/iwlwifi/mvm/mld-sta.c')
| -rw-r--r-- | sys/contrib/dev/iwlwifi/mvm/mld-sta.c | 81 | 
1 files changed, 44 insertions, 37 deletions
| diff --git a/sys/contrib/dev/iwlwifi/mvm/mld-sta.c b/sys/contrib/dev/iwlwifi/mvm/mld-sta.c index d5a204e52076..e1010521c3ea 100644 --- a/sys/contrib/dev/iwlwifi/mvm/mld-sta.c +++ b/sys/contrib/dev/iwlwifi/mvm/mld-sta.c @@ -1,6 +1,6 @@  // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause  /* - * Copyright (C) 2022-2024 Intel Corporation + * Copyright (C) 2022-2025 Intel Corporation   */  #include "mvm.h"  #include "time-sync.h" @@ -46,11 +46,15 @@ u32 iwl_mvm_sta_fw_id_mask(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  }  static int iwl_mvm_mld_send_sta_cmd(struct iwl_mvm *mvm, -				    struct iwl_mvm_sta_cfg_cmd *cmd) +				    struct iwl_sta_cfg_cmd *cmd)  { +	u32 cmd_id = WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD); +	int cmd_len = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 0) > 1 ? +		      sizeof(*cmd) : +		      sizeof(struct iwl_sta_cfg_cmd_v1);  	int ret = iwl_mvm_send_cmd_pdu(mvm,  				       WIDE_ID(MAC_CONF_GROUP, STA_CONFIG_CMD), -				       0, sizeof(*cmd), cmd); +				       0, cmd_len, cmd);  	if (ret)  		IWL_ERR(mvm, "STA_CONFIG_CMD send failed, ret=0x%x\n", ret);  	return ret; @@ -63,7 +67,7 @@ static int iwl_mvm_mld_add_int_sta_to_fw(struct iwl_mvm *mvm,  					 struct iwl_mvm_int_sta *sta,  					 const u8 *addr, int link_id)  { -	struct iwl_mvm_sta_cfg_cmd cmd; +	struct iwl_sta_cfg_cmd cmd;  	lockdep_assert_held(&mvm->mutex); @@ -94,7 +98,7 @@ static int iwl_mvm_mld_add_int_sta_to_fw(struct iwl_mvm *mvm,   */  static int iwl_mvm_mld_rm_sta_from_fw(struct iwl_mvm *mvm, u32 sta_id)  { -	struct iwl_mvm_remove_sta_cmd rm_sta_cmd = { +	struct iwl_remove_sta_cmd rm_sta_cmd = {  		.sta_id = cpu_to_le32(sta_id),  	};  	int ret; @@ -121,7 +125,7 @@ static int iwl_mvm_add_aux_sta_to_fw(struct iwl_mvm *mvm,  {  	int ret; -	struct iwl_mvm_aux_sta_cmd cmd = { +	struct iwl_aux_sta_cmd cmd = {  		.sta_id = cpu_to_le32(sta->sta_id),  		.lmac_id = cpu_to_le32(lmac_id),  	}; @@ -144,9 +148,9 @@ int iwl_mvm_mld_add_int_sta_with_queue(struct iwl_mvm *mvm,  {  	int ret, txq;  	unsigned int wdg_timeout = _wdg_timeout ? *_wdg_timeout : -		mvm->trans->trans_cfg->base_params->wd_timeout; +		mvm->trans->mac_cfg->base->wd_timeout; -	if (WARN_ON_ONCE(sta->sta_id == IWL_MVM_INVALID_STA)) +	if (WARN_ON_ONCE(sta->sta_id == IWL_INVALID_STA))  		return -ENOSPC;  	if (sta->type == STATION_TYPE_AUX) @@ -216,7 +220,7 @@ int iwl_mvm_mld_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	static const u8 _baddr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  	const u8 *baddr = _baddr;  	unsigned int wdg_timeout = -		iwl_mvm_get_wd_timeout(mvm, vif, false, false); +		iwl_mvm_get_wd_timeout(mvm, vif);  	u16 *queue;  	lockdep_assert_held(&mvm->mutex); @@ -254,7 +258,7 @@ int iwl_mvm_mld_add_mcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  	struct iwl_mvm_int_sta *msta = &mvm_link->mcast_sta;  	static const u8 _maddr[] = {0x03, 0x00, 0x00, 0x00, 0x00, 0x00};  	const u8 *maddr = _maddr; -	unsigned int timeout = iwl_mvm_get_wd_timeout(mvm, vif, false, false); +	unsigned int timeout = iwl_mvm_get_wd_timeout(mvm, vif);  	lockdep_assert_held(&mvm->mutex); @@ -346,7 +350,7 @@ static int iwl_mvm_mld_rm_int_sta(struct iwl_mvm *mvm,  	lockdep_assert_held(&mvm->mutex); -	if (WARN_ON_ONCE(int_sta->sta_id == IWL_MVM_INVALID_STA)) +	if (WARN_ON_ONCE(int_sta->sta_id == IWL_INVALID_STA))  		return -EINVAL;  	if (flush) @@ -438,7 +442,7 @@ static int iwl_mvm_mld_cfg_sta(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	struct iwl_mvm_vif *mvm_vif = iwl_mvm_vif_from_mac80211(vif);  	struct iwl_mvm_vif_link_info *link_info =  					mvm_vif->link[link_conf->link_id]; -	struct iwl_mvm_sta_cfg_cmd cmd = { +	struct iwl_sta_cfg_cmd cmd = {  		.sta_id = cpu_to_le32(mvm_link_sta->sta_id),  		.station_type = cpu_to_le32(mvm_sta->sta_type),  	}; @@ -518,11 +522,12 @@ static int iwl_mvm_mld_cfg_sta(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  void iwl_mvm_mld_free_sta_link(struct iwl_mvm *mvm,  			       struct iwl_mvm_sta *mvm_sta,  			       struct iwl_mvm_link_sta *mvm_sta_link, -			       unsigned int link_id, -			       bool is_in_fw) +			       unsigned int link_id)  { -	RCU_INIT_POINTER(mvm->fw_id_to_mac_id[mvm_sta_link->sta_id], -			 is_in_fw ? ERR_PTR(-EINVAL) : NULL); +	lockdep_assert_wiphy(mvm->hw->wiphy); +	lockdep_assert_held(&mvm->mutex); + +	RCU_INIT_POINTER(mvm->fw_id_to_mac_id[mvm_sta_link->sta_id], NULL);  	RCU_INIT_POINTER(mvm->fw_id_to_link_sta[mvm_sta_link->sta_id], NULL);  	RCU_INIT_POINTER(mvm_sta->link[link_id], NULL); @@ -543,7 +548,7 @@ static void iwl_mvm_mld_sta_rm_all_sta_links(struct iwl_mvm *mvm,  		if (!link)  			continue; -		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, link, link_id, false); +		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, link, link_id);  	}  } @@ -559,7 +564,10 @@ static int iwl_mvm_mld_alloc_sta_link(struct iwl_mvm *mvm,  	u32 sta_id = iwl_mvm_find_free_sta_id(mvm,  					  ieee80211_vif_type_p2p(vif)); -	if (sta_id == IWL_MVM_INVALID_STA) +	lockdep_assert_wiphy(mvm->hw->wiphy); +	lockdep_assert_held(&mvm->mutex); + +	if (sta_id == IWL_INVALID_STA)  		return -ENOSPC;  	if (rcu_access_pointer(sta->link[link_id]) == &sta->deflink) { @@ -612,10 +620,10 @@ static void iwl_mvm_mld_set_ap_sta_id(struct ieee80211_sta *sta,  				      struct iwl_mvm_link_sta *sta_link)  {  	if (!sta->tdls) { -		WARN_ON(vif_link->ap_sta_id != IWL_MVM_INVALID_STA); +		WARN_ON(vif_link->ap_sta_id != IWL_INVALID_STA);  		vif_link->ap_sta_id = sta_link->sta_id;  	} else { -		WARN_ON(vif_link->ap_sta_id == IWL_MVM_INVALID_STA); +		WARN_ON(vif_link->ap_sta_id == IWL_INVALID_STA);  	}  } @@ -631,6 +639,9 @@ static int iwl_mvm_alloc_sta_after_restart(struct iwl_mvm *mvm,  	int ret = -EINVAL;  	int sta_id; +	lockdep_assert_wiphy(mvm->hw->wiphy); +	lockdep_assert_held(&mvm->mutex); +  	/* First add an empty station since allocating a queue requires  	 * a valid station. Since we need a link_id to allocate a station,  	 * pick up the first valid one. @@ -686,7 +697,7 @@ int iwl_mvm_mld_add_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  		spin_lock_init(&mvm_sta->lock); -		ret = iwl_mvm_sta_init(mvm, vif, sta, IWL_MVM_INVALID_STA, +		ret = iwl_mvm_sta_init(mvm, vif, sta, IWL_INVALID_STA,  				       STATION_TYPE_PEER);  	} else {  		ret = iwl_mvm_alloc_sta_after_restart(mvm, vif, sta); @@ -835,18 +846,11 @@ int iwl_mvm_mld_rm_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,  		struct iwl_mvm_link_sta *mvm_link_sta =  			rcu_dereference_protected(mvm_sta->link[link_id],  						  lockdep_is_held(&mvm->mutex)); -		bool stay_in_fw; +		iwl_mvm_sta_del(mvm, vif, sta, link_sta); -		stay_in_fw = iwl_mvm_sta_del(mvm, vif, sta, link_sta, &ret); -		if (ret) -			break; +		ret = iwl_mvm_mld_rm_sta_from_fw(mvm, mvm_link_sta->sta_id); -		if (!stay_in_fw) -			ret = iwl_mvm_mld_rm_sta_from_fw(mvm, -							 mvm_link_sta->sta_id); - -		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_link_sta, -					  link_id, stay_in_fw); +		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_link_sta, link_id);  	}  	kfree(mvm_sta->mpdu_counters);  	mvm_sta->mpdu_counters = NULL; @@ -858,9 +862,10 @@ int iwl_mvm_mld_rm_sta_id(struct iwl_mvm *mvm, u8 sta_id)  {  	int ret; +	lockdep_assert_wiphy(mvm->hw->wiphy);  	lockdep_assert_held(&mvm->mutex); -	if (WARN_ON(sta_id == IWL_MVM_INVALID_STA)) +	if (WARN_ON(sta_id == IWL_INVALID_STA))  		return 0;  	ret = iwl_mvm_mld_rm_sta_from_fw(mvm, sta_id); @@ -1064,6 +1069,7 @@ int iwl_mvm_mld_update_sta_links(struct iwl_mvm *mvm,  	unsigned int link_id;  	int ret; +	lockdep_assert_wiphy(mvm->hw->wiphy);  	lockdep_assert_held(&mvm->mutex);  	for_each_set_bit(link_id, &old_links_long, @@ -1109,10 +1115,9 @@ int iwl_mvm_mld_update_sta_links(struct iwl_mvm *mvm,  			goto err;  		if (vif->type == NL80211_IFTYPE_STATION) -			mvm_vif_link->ap_sta_id = IWL_MVM_INVALID_STA; +			mvm_vif_link->ap_sta_id = IWL_INVALID_STA; -		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_sta_link, link_id, -					  false); +		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_sta_link, link_id);  	}  	for_each_set_bit(link_id, &links_to_add, IEEE80211_MLD_MAX_NUM_LINKS) { @@ -1182,6 +1187,9 @@ int iwl_mvm_mld_update_sta_links(struct iwl_mvm *mvm,  		link_sta_added_to_fw |= BIT(link_id);  		iwl_mvm_rs_add_sta_link(mvm, mvm_sta_link); + +		iwl_mvm_rs_rate_init(mvm, vif, sta, link_conf, link_sta, +				     link_conf->chanreq.oper.chan->band);  	}  	if (sta_mask_added) { @@ -1213,8 +1221,7 @@ err:  			rcu_dereference_protected(mvm_sta->link[link_id],  						  lockdep_is_held(&mvm->mutex)); -		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_sta_link, link_id, -					  false); +		iwl_mvm_mld_free_sta_link(mvm, mvm_sta, mvm_sta_link, link_id);  	}  	return ret; | 
