Lines Matching +full:rates +full:- +full:mcs

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Copyright (C) 2018-2024 Intel Corporation
7 #include "fw-api.h"
9 #include "iwl-op-mode.h"
14 switch (link_sta->bandwidth) { in rs_fw_bw_from_sta_bw()
43 struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in rs_fw_sgi_cw_support()
44 struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in rs_fw_sgi_cw_support()
45 struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in rs_fw_sgi_cw_support()
48 if (he_cap->has_he) in rs_fw_sgi_cw_support()
51 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) in rs_fw_sgi_cw_support()
53 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40) in rs_fw_sgi_cw_support()
55 if (vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_80) in rs_fw_sgi_cw_support()
57 if (vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_160) in rs_fw_sgi_cw_support()
68 struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in rs_fw_get_config_flags()
69 struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in rs_fw_get_config_flags()
70 struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in rs_fw_get_config_flags()
71 bool vht_ena = vht_cap->vht_supported; in rs_fw_get_config_flags()
75 if (mvm->cfg->ht_params->stbc && in rs_fw_get_config_flags()
77 if (he_cap->has_he && he_cap->he_cap_elem.phy_cap_info[2] & in rs_fw_get_config_flags()
80 else if (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK) in rs_fw_get_config_flags()
82 else if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) in rs_fw_get_config_flags()
86 if (mvm->cfg->ht_params->ldpc && in rs_fw_get_config_flags()
87 ((ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) || in rs_fw_get_config_flags()
88 (vht_ena && (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)))) in rs_fw_get_config_flags()
92 if (he_cap->has_he && (he_cap->he_cap_elem.phy_cap_info[1] & in rs_fw_get_config_flags()
97 !(sband_he_cap->he_cap_elem.phy_cap_info[1] & in rs_fw_get_config_flags()
101 if (he_cap->has_he && in rs_fw_get_config_flags()
102 (he_cap->he_cap_elem.phy_cap_info[3] & in rs_fw_get_config_flags()
105 sband_he_cap->he_cap_elem.phy_cap_info[3] & in rs_fw_get_config_flags()
116 u16 rx_mcs = le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) & in rs_fw_vht_highest_rx_mcs_index()
117 (0x3 << (2 * (nss - 1))); in rs_fw_vht_highest_rx_mcs_index()
118 rx_mcs >>= (2 * (nss - 1)); in rs_fw_vht_highest_rx_mcs_index()
142 u8 max_nss = link_sta->rx_nss; in rs_fw_vht_set_enabled_rates()
144 .vht_cap_info = cpu_to_le32(vht_cap->cap), in rs_fw_vht_set_enabled_rates()
145 .supp_mcs = vht_cap->vht_mcs, in rs_fw_vht_set_enabled_rates()
149 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in rs_fw_vht_set_enabled_rates()
159 supp = BIT(highest_mcs + 1) - 1; in rs_fw_vht_set_enabled_rates()
160 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in rs_fw_vht_set_enabled_rates()
163 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = cpu_to_le16(supp); in rs_fw_vht_set_enabled_rates()
166 * configuration is supported - only for MCS 0 since we already in rs_fw_vht_set_enabled_rates()
167 * decoded the MCS bits anyway ourselves. in rs_fw_vht_set_enabled_rates()
169 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160 && in rs_fw_vht_set_enabled_rates()
173 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_160] = in rs_fw_vht_set_enabled_rates()
174 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80]; in rs_fw_vht_set_enabled_rates()
178 static u16 rs_fw_he_ieee80211_mcs_to_rs_mcs(u16 mcs) in rs_fw_he_ieee80211_mcs_to_rs_mcs() argument
180 switch (mcs) { in rs_fw_he_ieee80211_mcs_to_rs_mcs()
182 return BIT(IWL_TLC_MNG_HT_RATE_MCS7 + 1) - 1; in rs_fw_he_ieee80211_mcs_to_rs_mcs()
184 return BIT(IWL_TLC_MNG_HT_RATE_MCS9 + 1) - 1; in rs_fw_he_ieee80211_mcs_to_rs_mcs()
186 return BIT(IWL_TLC_MNG_HT_RATE_MCS11 + 1) - 1; in rs_fw_he_ieee80211_mcs_to_rs_mcs()
191 WARN(1, "invalid HE MCS %d\n", mcs); in rs_fw_he_ieee80211_mcs_to_rs_mcs()
200 const struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in rs_fw_he_set_enabled_rates()
201 u16 mcs_160 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in rs_fw_he_set_enabled_rates()
202 u16 mcs_80 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in rs_fw_he_set_enabled_rates()
203 u16 tx_mcs_80 = le16_to_cpu(sband_he_cap->he_mcs_nss_supp.tx_mcs_80); in rs_fw_he_set_enabled_rates()
204 u16 tx_mcs_160 = le16_to_cpu(sband_he_cap->he_mcs_nss_supp.tx_mcs_160); in rs_fw_he_set_enabled_rates()
206 u8 nss = link_sta->rx_nss; in rs_fw_he_set_enabled_rates()
209 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in rs_fw_he_set_enabled_rates()
218 /* If one side doesn't support - mark both as not supporting */ in rs_fw_he_set_enabled_rates()
226 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = in rs_fw_he_set_enabled_rates()
229 /* If one side doesn't support - mark both as not supporting */ in rs_fw_he_set_enabled_rates()
237 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_160] = in rs_fw_he_set_enabled_rates()
253 rs_fw_eht_max_nss((rx)->rx_tx_mcs ##mcs_num## _max_nss, \
254 (tx)->rx_tx_mcs ##mcs_num## _max_nss)
274 return &eht_mcs->bw._80; in rs_fw_rs_mcs2eht_mcs()
276 return &eht_mcs->bw._160; in rs_fw_rs_mcs2eht_mcs()
278 return &eht_mcs->bw._320; in rs_fw_rs_mcs2eht_mcs()
291 /* peer RX mcs capa */ in rs_fw_eht_set_enabled_rates()
293 &link_sta->eht_cap.eht_mcs_nss_supp; in rs_fw_eht_set_enabled_rates()
294 /* our TX mcs capa */ in rs_fw_eht_set_enabled_rates()
296 &sband_eht_cap->eht_mcs_nss_supp; in rs_fw_eht_set_enabled_rates()
303 if (vif->type == NL80211_IFTYPE_AP && in rs_fw_eht_set_enabled_rates()
304 !(link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in rs_fw_eht_set_enabled_rates()
306 mcs_rx_20 = eht_rx_mcs->only_20mhz; in rs_fw_eht_set_enabled_rates()
308 mcs_rx_20.rx_tx_mcs7_max_nss = eht_rx_mcs->bw._80.rx_tx_mcs9_max_nss; in rs_fw_eht_set_enabled_rates()
309 mcs_rx_20.rx_tx_mcs9_max_nss = eht_rx_mcs->bw._80.rx_tx_mcs9_max_nss; in rs_fw_eht_set_enabled_rates()
310 mcs_rx_20.rx_tx_mcs11_max_nss = eht_rx_mcs->bw._80.rx_tx_mcs11_max_nss; in rs_fw_eht_set_enabled_rates()
311 mcs_rx_20.rx_tx_mcs13_max_nss = eht_rx_mcs->bw._80.rx_tx_mcs13_max_nss; in rs_fw_eht_set_enabled_rates()
315 if (!(sband_he_cap->he_cap_elem.phy_cap_info[0] & in rs_fw_eht_set_enabled_rates()
317 mcs_tx_20 = eht_tx_mcs->only_20mhz; in rs_fw_eht_set_enabled_rates()
319 mcs_tx_20.rx_tx_mcs7_max_nss = eht_tx_mcs->bw._80.rx_tx_mcs9_max_nss; in rs_fw_eht_set_enabled_rates()
320 mcs_tx_20.rx_tx_mcs9_max_nss = eht_tx_mcs->bw._80.rx_tx_mcs9_max_nss; in rs_fw_eht_set_enabled_rates()
321 mcs_tx_20.rx_tx_mcs11_max_nss = eht_tx_mcs->bw._80.rx_tx_mcs11_max_nss; in rs_fw_eht_set_enabled_rates()
322 mcs_tx_20.rx_tx_mcs13_max_nss = eht_tx_mcs->bw._80.rx_tx_mcs13_max_nss; in rs_fw_eht_set_enabled_rates()
325 /* rates for 20/40/80 bw */ in rs_fw_eht_set_enabled_rates()
327 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
329 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
331 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
333 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
348 if (cmd->max_ch_width < (bw + IWL_TLC_MNG_CH_WIDTH_80MHZ)) in rs_fw_eht_set_enabled_rates()
351 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
353 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
355 rs_fw_set_eht_mcs_nss(cmd->ht_rates, bw, in rs_fw_eht_set_enabled_rates()
360 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC || in rs_fw_eht_set_enabled_rates()
361 link_sta->rx_nss < 2) in rs_fw_eht_set_enabled_rates()
362 memset(cmd->ht_rates[IWL_TLC_NSS_2], 0, in rs_fw_eht_set_enabled_rates()
363 sizeof(cmd->ht_rates[IWL_TLC_NSS_2])); in rs_fw_eht_set_enabled_rates()
376 const struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in rs_fw_set_supp_rates()
377 const struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in rs_fw_set_supp_rates()
378 const struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in rs_fw_set_supp_rates()
380 /* non HT rates */ in rs_fw_set_supp_rates()
381 tmp = link_sta->supp_rates[sband->band]; in rs_fw_set_supp_rates()
383 supp |= BIT(sband->bitrates[i].hw_value); in rs_fw_set_supp_rates()
385 cmd->non_ht_rates = cpu_to_le16(supp); in rs_fw_set_supp_rates()
386 cmd->mode = IWL_TLC_MNG_MODE_NON_HT; in rs_fw_set_supp_rates()
388 /* HT/VHT rates */ in rs_fw_set_supp_rates()
389 if (link_sta->eht_cap.has_eht && sband_he_cap && sband_eht_cap) { in rs_fw_set_supp_rates()
390 cmd->mode = IWL_TLC_MNG_MODE_EHT; in rs_fw_set_supp_rates()
393 } else if (he_cap->has_he && sband_he_cap) { in rs_fw_set_supp_rates()
394 cmd->mode = IWL_TLC_MNG_MODE_HE; in rs_fw_set_supp_rates()
396 } else if (vht_cap->vht_supported) { in rs_fw_set_supp_rates()
397 cmd->mode = IWL_TLC_MNG_MODE_VHT; in rs_fw_set_supp_rates()
399 } else if (ht_cap->ht_supported) { in rs_fw_set_supp_rates()
400 cmd->mode = IWL_TLC_MNG_MODE_HT; in rs_fw_set_supp_rates()
401 cmd->ht_rates[IWL_TLC_NSS_1][IWL_TLC_MCS_PER_BW_80] = in rs_fw_set_supp_rates()
402 cpu_to_le16(ht_cap->mcs.rx_mask[0]); in rs_fw_set_supp_rates()
405 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in rs_fw_set_supp_rates()
406 cmd->ht_rates[IWL_TLC_NSS_2][IWL_TLC_MCS_PER_BW_80] = in rs_fw_set_supp_rates()
409 cmd->ht_rates[IWL_TLC_NSS_2][IWL_TLC_MCS_PER_BW_80] = in rs_fw_set_supp_rates()
410 cpu_to_le16(ht_cap->mcs.rx_mask[1]); in rs_fw_set_supp_rates()
428 notif = (void *)pkt->data; in iwl_mvm_tlc_update_notif()
429 link_sta = rcu_dereference(mvm->fw_id_to_link_sta[notif->sta_id]); in iwl_mvm_tlc_update_notif()
430 sta = rcu_dereference(mvm->fw_id_to_mac_id[notif->sta_id]); in iwl_mvm_tlc_update_notif()
437 notif->sta_id); in iwl_mvm_tlc_update_notif()
443 flags = le32_to_cpu(notif->flags); in iwl_mvm_tlc_update_notif()
445 mvm_link_sta = rcu_dereference(mvmsta->link[link_sta->link_id]); in iwl_mvm_tlc_update_notif()
449 link_sta->link_id, notif->sta_id); in iwl_mvm_tlc_update_notif()
452 lq_sta = &mvm_link_sta->lq_sta.rs_fw; in iwl_mvm_tlc_update_notif()
457 if (iwl_fw_lookup_notif_ver(mvm->fw, DATA_PATH_GROUP, in iwl_mvm_tlc_update_notif()
461 le32_to_cpu(notif->rate)); in iwl_mvm_tlc_update_notif()
465 lq_sta->last_rate_n_flags = in iwl_mvm_tlc_update_notif()
466 iwl_new_rate_from_v1(le32_to_cpu(notif->rate)); in iwl_mvm_tlc_update_notif()
468 lq_sta->last_rate_n_flags = le32_to_cpu(notif->rate); in iwl_mvm_tlc_update_notif()
471 lq_sta->last_rate_n_flags); in iwl_mvm_tlc_update_notif()
475 if (flags & IWL_TLC_NOTIF_FLAG_AMSDU && !mvm_link_sta->orig_amsdu_len) { in iwl_mvm_tlc_update_notif()
476 u32 enabled = le32_to_cpu(notif->amsdu_enabled); in iwl_mvm_tlc_update_notif()
477 u16 size = le32_to_cpu(notif->amsdu_size); in iwl_mvm_tlc_update_notif()
485 if (link_sta->agg.max_amsdu_len < size) { in iwl_mvm_tlc_update_notif()
487 * In debug link_sta->agg.max_amsdu_len < size in iwl_mvm_tlc_update_notif()
491 WARN_ON(mvm_link_sta->orig_amsdu_len < size); in iwl_mvm_tlc_update_notif()
495 mvmsta->amsdu_enabled = enabled; in iwl_mvm_tlc_update_notif()
496 mvmsta->max_amsdu_len = size; in iwl_mvm_tlc_update_notif()
497 link_sta->agg.max_rc_amsdu_len = mvmsta->max_amsdu_len; in iwl_mvm_tlc_update_notif()
500 if (mvmsta->amsdu_enabled & BIT(i)) in iwl_mvm_tlc_update_notif()
501 link_sta->agg.max_tid_amsdu_len[i] = in iwl_mvm_tlc_update_notif()
508 link_sta->agg.max_tid_amsdu_len[i] = 1; in iwl_mvm_tlc_update_notif()
515 le32_to_cpu(notif->amsdu_size), size, in iwl_mvm_tlc_update_notif()
516 mvmsta->amsdu_enabled); in iwl_mvm_tlc_update_notif()
526 const struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in rs_fw_get_max_amsdu_len()
527 const struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in rs_fw_get_max_amsdu_len()
528 const struct ieee80211_sta_eht_cap *eht_cap = &link_sta->eht_cap; in rs_fw_get_max_amsdu_len()
530 if (WARN_ON_ONCE(!link_conf->chanreq.oper.chan)) in rs_fw_get_max_amsdu_len()
533 if (link_conf->chanreq.oper.chan->band == NL80211_BAND_6GHZ) { in rs_fw_get_max_amsdu_len()
534 switch (le16_get_bits(link_sta->he_6ghz_capa.capa, in rs_fw_get_max_amsdu_len()
543 } else if (link_conf->chanreq.oper.chan->band == NL80211_BAND_2GHZ && in rs_fw_get_max_amsdu_len()
544 eht_cap->has_eht) { in rs_fw_get_max_amsdu_len()
545 switch (u8_get_bits(eht_cap->eht_cap_elem.mac_cap_info[0], in rs_fw_get_max_amsdu_len()
554 } else if (vht_cap->vht_supported) { in rs_fw_get_max_amsdu_len()
555 switch (vht_cap->cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK) { in rs_fw_get_max_amsdu_len()
563 } else if (ht_cap->ht_supported) { in rs_fw_get_max_amsdu_len()
564 if (ht_cap->cap & IEEE80211_HT_CAP_MAX_AMSDU) in rs_fw_get_max_amsdu_len()
568 * (spec 802.11-2016 9.3.2.1) in rs_fw_get_max_amsdu_len()
586 struct ieee80211_hw *hw = mvm->hw; in iwl_mvm_rs_fw_rate_init()
589 struct ieee80211_supported_band *sband = hw->wiphy->bands[band]; in iwl_mvm_rs_fw_rate_init()
598 .max_ch_width = mvmsta->authorized ? in iwl_mvm_rs_fw_rate_init()
607 unsigned int link_id = link_conf->link_id; in iwl_mvm_rs_fw_rate_init()
608 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif); in iwl_mvm_rs_fw_rate_init()
614 sband_eht_cap->eht_cap_elem.phy_cap_info[5] & in iwl_mvm_rs_fw_rate_init()
616 link_sta->eht_cap.has_eht && in iwl_mvm_rs_fw_rate_init()
617 link_sta->eht_cap.eht_cap_elem.phy_cap_info[5] & in iwl_mvm_rs_fw_rate_init()
625 mvm_link_sta = rcu_dereference(mvmsta->link[link_id]); in iwl_mvm_rs_fw_rate_init()
631 cfg_cmd.sta_id = mvm_link_sta->sta_id; in iwl_mvm_rs_fw_rate_init()
633 lq_sta = &mvm_link_sta->lq_sta.rs_fw; in iwl_mvm_rs_fw_rate_init()
649 link_sta->agg.max_amsdu_len = max_amsdu_len; in iwl_mvm_rs_fw_rate_init()
652 cfg_cmd.max_tx_op = cpu_to_le16(mvmvif->max_tx_op); in iwl_mvm_rs_fw_rate_init()
654 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 0); in iwl_mvm_rs_fw_rate_init()
690 if (iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 0) < 3) in iwl_mvm_rs_fw_rate_init()
691 cmd_size -= 4; in iwl_mvm_rs_fw_rate_init()
696 ret = -EINVAL; in iwl_mvm_rs_fw_rate_init()
707 IWL_DEBUG_RATE(mvm, "tx protection - not implemented yet.\n"); in rs_fw_tx_protection()
716 lq_sta = &link_sta->lq_sta.rs_fw; in iwl_mvm_rs_add_sta_link()
718 lq_sta->pers.drv = mvm; in iwl_mvm_rs_add_sta_link()
719 lq_sta->pers.sta_id = link_sta->sta_id; in iwl_mvm_rs_add_sta_link()
720 lq_sta->pers.chains = 0; in iwl_mvm_rs_add_sta_link()
721 memset(lq_sta->pers.chain_signal, 0, in iwl_mvm_rs_add_sta_link()
722 sizeof(lq_sta->pers.chain_signal)); in iwl_mvm_rs_add_sta_link()
723 lq_sta->pers.last_rssi = S8_MIN; in iwl_mvm_rs_add_sta_link()
724 lq_sta->last_rate_n_flags = 0; in iwl_mvm_rs_add_sta_link()
727 lq_sta->pers.dbg_fixed_rate = 0; in iwl_mvm_rs_add_sta_link()
737 for (link_id = 0; link_id < ARRAY_SIZE(mvmsta->link); link_id++) { in iwl_mvm_rs_add_sta()
739 rcu_dereference_protected(mvmsta->link[link_id], in iwl_mvm_rs_add_sta()
740 lockdep_is_held(&mvm->mutex)); in iwl_mvm_rs_add_sta()