Commit 061097e5 authored by Sriram R's avatar Sriram R Committed by Kalle Valo
Browse files

wifi: ath12k: use arsta instead of sta



Currently, struct ieee80211_sta (sta) is used for many WMI and mac80211 ops but
for multi link station, driver should use struct ath12k_link_sta (arsta)
instead of sta. Add changes to use arsta object for WMI commands and other
mac80211 ops.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: default avatarSriram R <quic_srirrama@quicinc.com>
Signed-off-by: default avatarHarshitha Prem <quic_hprem@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://patch.msgid.link/20241121155806.1862733-5-kvalo@kernel.org
parent ea419255
Loading
Loading
Loading
Loading
+77 −67
Original line number Diff line number Diff line
@@ -1771,7 +1771,7 @@ static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
	else
		aid = sta->aid;

	ether_addr_copy(arg->peer_mac, sta->addr);
	ether_addr_copy(arg->peer_mac, arsta->addr);
	arg->vdev_id = arvif->vdev_id;
	arg->peer_associd = aid;
	arg->auth_flag = true;
@@ -2163,7 +2163,7 @@ static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
	arg->tx_max_mcs_nss = 0xFF;

	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d flags 0x%x\n",
		   sta->addr, arg->peer_max_mpdu, arg->peer_flags);
		   arsta->addr, arg->peer_max_mpdu, arg->peer_flags);

	/* TODO: rxnss_override */
}
@@ -2459,7 +2459,7 @@ static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
	}

	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM qos %d\n",
		   sta->addr, arg->qos_flag);
		   arsta->addr, arg->qos_flag);
}

static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,
@@ -2499,26 +2499,26 @@ static int ath12k_peer_assoc_qos_ap(struct ath12k *ar,

	arg.param = WMI_AP_PS_PEER_PARAM_UAPSD;
	arg.value = uapsd;
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
	if (ret)
		goto err;

	arg.param = WMI_AP_PS_PEER_PARAM_MAX_SP;
	arg.value = max_sp;
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
	if (ret)
		goto err;

	/* TODO: revisit during testing */
	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_FRMTYPE;
	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
	if (ret)
		goto err;

	arg.param = WMI_AP_PS_PEER_PARAM_SIFS_RESP_UAPSD;
	arg.value = DISABLE_SIFS_RESPONSE_TRIGGER;
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, sta->addr, &arg);
	ret = ath12k_wmi_send_set_ap_ps_param_cmd(ar, arsta->addr, &arg);
	if (ret)
		goto err;

@@ -2705,7 +2705,7 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
	}

	ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac peer %pM phymode %s\n",
		   sta->addr, ath12k_mac_phymode_str(phymode));
		   arsta->addr, ath12k_mac_phymode_str(phymode));

	arg->peer_phymode = phymode;
	WARN_ON(phymode == MODE_UNKNOWN);
@@ -4295,7 +4295,7 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
		return 1;

	if (sta)
		peer_addr = sta->addr;
		peer_addr = arsta->addr;
	else if (ahvif->vdev_type == WMI_VDEV_TYPE_STA)
		peer_addr = vif->bss_conf.bssid;
	else
@@ -4526,7 +4526,6 @@ ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
				   const struct cfg80211_bitrate_mask *mask,
				   enum nl80211_band band)
{
	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
	struct ath12k *ar = arvif->ar;
	u8 vht_rate, nss;
	u32 rate_code;
@@ -4545,24 +4544,24 @@ ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,

	if (!nss) {
		ath12k_warn(ar->ab, "No single VHT Fixed rate found to set for %pM",
			    sta->addr);
			    arsta->addr);
		return -EINVAL;
	}

	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
		   "Setting Fixed VHT Rate for peer %pM. Device will not switch to any other selected rates",
		   sta->addr);
		   arsta->addr);

	rate_code = ATH12K_HW_RATE_CODE(vht_rate, nss - 1,
					WMI_RATE_PREAMBLE_VHT);
	ret = ath12k_wmi_set_peer_param(ar, sta->addr,
	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
					arvif->vdev_id,
					WMI_PEER_PARAM_FIXED_RATE,
					rate_code);
	if (ret)
		ath12k_warn(ar->ab,
			    "failed to update STA %pM Fixed Rate %d: %d\n",
			     sta->addr, rate_code, ret);
			     arsta->addr, rate_code, ret);

	return ret;
}
@@ -4580,12 +4579,16 @@ static int ath12k_mac_station_assoc(struct ath12k *ar,
	enum nl80211_band band;
	struct cfg80211_bitrate_mask *mask;
	u8 num_vht_rates;
	u8 link_id = arvif->link_id;

	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);

	if (WARN_ON(ath12k_mac_vif_link_chan(vif, arvif->link_id, &def)))
		return -EPERM;

	if (WARN_ON(!rcu_access_pointer(sta->link[link_id])))
		return -EINVAL;

	band = def.chan->band;
	mask = &arvif->bitrate_mask;

@@ -4599,13 +4602,13 @@ static int ath12k_mac_station_assoc(struct ath12k *ar,
	ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
	if (ret) {
		ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
			    sta->addr, arvif->vdev_id, ret);
			    arsta->addr, arvif->vdev_id, ret);
		return ret;
	}

	if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {
		ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
			    sta->addr, arvif->vdev_id);
			    arsta->addr, arvif->vdev_id);
		return -ETIMEDOUT;
	}

@@ -4629,7 +4632,7 @@ static int ath12k_mac_station_assoc(struct ath12k *ar,
	if (reassoc)
		return 0;

	ret = ath12k_setup_peer_smps(ar, arvif, sta->addr,
	ret = ath12k_setup_peer_smps(ar, arvif, arsta->addr,
				     &sta->deflink.ht_cap,
				     &sta->deflink.he_6ghz_capa);
	if (ret) {
@@ -4649,7 +4652,7 @@ static int ath12k_mac_station_assoc(struct ath12k *ar,
		ret = ath12k_peer_assoc_qos_ap(ar, arvif, arsta);
		if (ret) {
			ath12k_warn(ar->ab, "failed to set qos params for STA %pM for vdev %i: %d\n",
				    sta->addr, arvif->vdev_id, ret);
				    arsta->addr, arvif->vdev_id, ret);
			return ret;
		}
	}
@@ -4732,65 +4735,65 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
			 * WMI_PEER_CHWIDTH
			 */
			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth upgrade for sta %pM new %d old %d\n",
				   sta->addr, bw, bw_prev);
			err = ath12k_wmi_set_peer_param(ar, sta->addr,
				   arsta->addr, bw, bw_prev);
			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
							arvif->vdev_id, WMI_PEER_PHYMODE,
							peer_phymode);
			if (err) {
				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
					    sta->addr, peer_phymode, err);
					    arsta->addr, peer_phymode, err);
				return;
			}
			err = ath12k_wmi_set_peer_param(ar, sta->addr,
			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
							arvif->vdev_id, WMI_PEER_CHWIDTH,
							bw);
			if (err)
				ath12k_warn(ar->ab, "failed to update STA %pM to peer bandwidth %d: %d\n",
					    sta->addr, bw, err);
					    arsta->addr, bw, err);
		} else {
			/* When we downgrade bandwidth this will conflict with phymode
			 * and cause to trigger firmware crash. In this case we send
			 * WMI_PEER_CHWIDTH followed by WMI_PEER_PHYMODE
			 */
			ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac bandwidth downgrade for sta %pM new %d old %d\n",
				   sta->addr, bw, bw_prev);
			err = ath12k_wmi_set_peer_param(ar, sta->addr,
				   arsta->addr, bw, bw_prev);
			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
							arvif->vdev_id, WMI_PEER_CHWIDTH,
							bw);
			if (err) {
				ath12k_warn(ar->ab, "failed to update STA %pM peer to bandwidth %d: %d\n",
					    sta->addr, bw, err);
					    arsta->addr, bw, err);
				return;
			}
			err = ath12k_wmi_set_peer_param(ar, sta->addr,
			err = ath12k_wmi_set_peer_param(ar, arsta->addr,
							arvif->vdev_id, WMI_PEER_PHYMODE,
							peer_phymode);
			if (err)
				ath12k_warn(ar->ab, "failed to update STA %pM to peer phymode %d: %d\n",
					    sta->addr, peer_phymode, err);
					    arsta->addr, peer_phymode, err);
		}
	}

	if (changed & IEEE80211_RC_NSS_CHANGED) {
		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM nss %d\n",
			   sta->addr, nss);
			   arsta->addr, nss);

		err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
						WMI_PEER_NSS, nss);
		if (err)
			ath12k_warn(ar->ab, "failed to update STA %pM nss %d: %d\n",
				    sta->addr, nss, err);
				    arsta->addr, nss, err);
	}

	if (changed & IEEE80211_RC_SMPS_CHANGED) {
		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac update sta %pM smps %d\n",
			   sta->addr, smps);
			   arsta->addr, smps);

		err = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
		err = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
						WMI_PEER_MIMO_PS_STATE, smps);
		if (err)
			ath12k_warn(ar->ab, "failed to update STA %pM smps %d: %d\n",
				    sta->addr, smps, err);
				    arsta->addr, smps, err);
	}

	if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
@@ -4823,11 +4826,11 @@ static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
			err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
			if (err)
				ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
					    sta->addr, arvif->vdev_id, err);
					    arsta->addr, arvif->vdev_id, err);

			if (!wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ))
				ath12k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",
					    sta->addr, arvif->vdev_id);
					    arsta->addr, arvif->vdev_id);
		}
	}
}
@@ -4908,7 +4911,7 @@ static void ath12k_mac_station_post_remove(struct ath12k *ar,

	spin_lock_bh(&ar->ab->base_lock);

	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
	if (peer && peer->sta == sta) {
		ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
			    vif->addr, arvif->vdev_id);
@@ -4963,27 +4966,26 @@ static int ath12k_mac_station_authorize(struct ath12k *ar,
{
	struct ath12k_peer *peer;
	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
	int ret;

	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);

	spin_lock_bh(&ar->ab->base_lock);

	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
	if (peer)
		peer->is_authorized = true;

	spin_unlock_bh(&ar->ab->base_lock);

	if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
		ret = ath12k_wmi_set_peer_param(ar, sta->addr,
		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
						arvif->vdev_id,
						WMI_PEER_AUTHORIZE,
						1);
		if (ret) {
			ath12k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
				    sta->addr, arvif->vdev_id, ret);
				    arsta->addr, arvif->vdev_id, ret);
			return ret;
		}
	}
@@ -5014,15 +5016,15 @@ static int ath12k_mac_station_remove(struct ath12k *ar,
	if (sta->mlo)
		return ret;

	ath12k_dp_peer_cleanup(ar, arvif->vdev_id, sta->addr);
	ath12k_dp_peer_cleanup(ar, arvif->vdev_id, arsta->addr);

	ret = ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
	ret = ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
	if (ret)
		ath12k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
			    sta->addr, arvif->vdev_id);
			    arsta->addr, arvif->vdev_id);
	else
		ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
			   sta->addr, arvif->vdev_id);
			   arsta->addr, arvif->vdev_id);

	ath12k_mac_station_post_remove(ar, arvif, arsta);

@@ -5040,7 +5042,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
	struct ath12k_base *ab = ar->ab;
	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
	struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
	struct ath12k_wmi_peer_create_arg peer_param;
	struct ath12k_wmi_peer_create_arg peer_param = {0};
	int ret;

	lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
@@ -5065,28 +5067,28 @@ static int ath12k_mac_station_add(struct ath12k *ar,
	ret = ath12k_peer_create(ar, arvif, sta, &peer_param);
	if (ret) {
		ath12k_warn(ab, "Failed to add peer: %pM for VDEV: %d\n",
			    sta->addr, arvif->vdev_id);
			    arsta->addr, arvif->vdev_id);
		goto free_peer;
	}

	ath12k_dbg(ab, ATH12K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
		   sta->addr, arvif->vdev_id);
		   arsta->addr, arvif->vdev_id);

	if (ieee80211_vif_is_mesh(vif)) {
		ret = ath12k_wmi_set_peer_param(ar, sta->addr,
		ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
						arvif->vdev_id,
						WMI_PEER_USE_4ADDR, 1);
		if (ret) {
			ath12k_warn(ab, "failed to STA %pM 4addr capability: %d\n",
				    sta->addr, ret);
				    arsta->addr, ret);
			goto free_peer;
		}
	}

	ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, sta->addr);
	ret = ath12k_dp_peer_setup(ar, arvif->vdev_id, arsta->addr);
	if (ret) {
		ath12k_warn(ab, "failed to setup dp for peer %pM on vdev %i (%d)\n",
			    sta->addr, arvif->vdev_id, ret);
			    arsta->addr, arvif->vdev_id, ret);
		goto free_peer;
	}

@@ -5103,7 +5105,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
	return 0;

free_peer:
	ath12k_peer_delete(ar, arvif->vdev_id, sta->addr);
	ath12k_peer_delete(ar, arvif->vdev_id, arsta->addr);
dec_num_station:
	ath12k_mac_dec_num_stations(arvif, arsta);
exit:
@@ -5175,6 +5177,8 @@ static int ath12k_mac_assign_link_sta(struct ath12k_hw *ah,
	ahsta->links_map |= BIT(arsta->link_id);
	arsta->arvif = arvif;
	arsta->ahsta = ahsta;
	ahsta->ahvif = ahvif;

	wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);

	rcu_assign_pointer(ahsta->link[link_id], arsta);
@@ -5250,7 +5254,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
		ret = ath12k_mac_station_add(ar, arvif, arsta);
		if (ret)
			ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
				    sta->addr, arvif->vdev_id);
				    arsta->addr, arvif->vdev_id);

	/* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
	 * peer associated to AP/Mesh/ADHOC vif type.
@@ -5263,7 +5267,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
		ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
		if (ret)
			ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
				    sta->addr);
				    arsta->addr);

		spin_lock_bh(&ar->data_lock);

@@ -5280,7 +5284,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
		ret = ath12k_mac_station_authorize(ar, arvif, arsta);
		if (ret)
			ath12k_warn(ar->ab, "Failed to authorize station: %pM\n",
				    sta->addr);
				    arsta->addr);

	/* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
	 * deauthorize it.
@@ -5300,7 +5304,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
		ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
		if (ret)
			ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
				    sta->addr);
				    arsta->addr);
	}

exit:
@@ -5413,16 +5417,22 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
				       struct ieee80211_vif *vif,
				       struct ieee80211_sta *sta)
{
	struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
	struct ath12k_sta *ahsta = ath12k_sta_to_ahsta(sta);
	struct ath12k *ar;
	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
	struct ath12k_link_vif *arvif;
	struct ath12k_link_sta *arsta;
	u8 link_id;
	int ret;
	s16 txpwr;

	lockdep_assert_wiphy(hw->wiphy);

	arvif = &ahvif->deflink;
	/* TODO: use link id from mac80211 once that's implemented */
	link_id = 0;

	arvif = wiphy_dereference(hw->wiphy, ahvif->link[link_id]);
	arsta = wiphy_dereference(hw->wiphy, ahsta->link[link_id]);

	if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
		txpwr = 0;
@@ -5439,9 +5449,9 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
		goto out;
	}

	ar = ath12k_ah_to_ar(ah, 0);
	ar = arvif->ar;

	ret = ath12k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
	ret = ath12k_wmi_set_peer_param(ar, arsta->addr, arvif->vdev_id,
					WMI_PEER_USE_FIXED_PWR, txpwr);
	if (ret) {
		ath12k_warn(ar->ab, "failed to set tx power for station ret: %d\n",
@@ -5494,12 +5504,12 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
	}
	spin_lock_bh(&ar->ab->base_lock);

	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, sta->addr);
	peer = ath12k_peer_find(ar->ab, arvif->vdev_id, arsta->addr);
	if (!peer) {
		spin_unlock_bh(&ar->ab->base_lock);
		rcu_read_unlock();
		ath12k_warn(ar->ab, "mac sta rc update failed to find peer %pM on vdev %i\n",
			    sta->addr, arvif->vdev_id);
			    arsta->addr, arvif->vdev_id);
		return;
	}

@@ -5507,7 +5517,7 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,

	ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
		   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
		   sta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
		   arsta->addr, changed, sta->deflink.bandwidth, sta->deflink.rx_nss,
		   sta->deflink.smps_mode);

	spin_lock_bh(&ar->data_lock);
@@ -5537,7 +5547,7 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
			break;
		default:
			ath12k_warn(ar->ab, "Invalid smps %d in sta rc update for %pM\n",
				    sta->deflink.smps_mode, sta->addr);
				    sta->deflink.smps_mode, arsta->addr);
			smps = WMI_PEER_SMPS_PS_NONE;
			break;
		}
@@ -9121,14 +9131,14 @@ static void ath12k_mac_disable_peer_fixed_rate(void *data,
	if (arsta->arvif != arvif)
		return;

	ret = ath12k_wmi_set_peer_param(ar, sta->addr,
	ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
					arvif->vdev_id,
					WMI_PEER_PARAM_FIXED_RATE,
					WMI_FIXED_RATE_NONE);
	if (ret)
		ath12k_warn(ar->ab,
			    "failed to disable peer fixed rate for STA %pM ret %d\n",
			    sta->addr, ret);
			    arsta->addr, ret);
}

static int