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

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
3 * Copyright (C) 2024-2025 Intel Corporation
18 switch (link_sta->bandwidth) { in iwl_mld_fw_bw_from_sta_bw()
40 struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in iwl_mld_get_tlc_cmd_flags()
41 struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in iwl_mld_get_tlc_cmd_flags()
42 struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in iwl_mld_get_tlc_cmd_flags()
43 bool has_vht = vht_cap->vht_supported; in iwl_mld_get_tlc_cmd_flags()
47 if (mld->cfg->ht_params.stbc && in iwl_mld_get_tlc_cmd_flags()
49 if (he_cap->has_he && he_cap->he_cap_elem.phy_cap_info[2] & in iwl_mld_get_tlc_cmd_flags()
52 else if (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK) in iwl_mld_get_tlc_cmd_flags()
54 else if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) in iwl_mld_get_tlc_cmd_flags()
59 if (mld->cfg->ht_params.ldpc && in iwl_mld_get_tlc_cmd_flags()
60 ((ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING) || in iwl_mld_get_tlc_cmd_flags()
61 (has_vht && (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)))) in iwl_mld_get_tlc_cmd_flags()
64 if (he_cap->has_he && (he_cap->he_cap_elem.phy_cap_info[1] & in iwl_mld_get_tlc_cmd_flags()
69 !(own_he_cap->he_cap_elem.phy_cap_info[1] & in iwl_mld_get_tlc_cmd_flags()
74 if (he_cap->has_he && in iwl_mld_get_tlc_cmd_flags()
75 (he_cap->he_cap_elem.phy_cap_info[3] & in iwl_mld_get_tlc_cmd_flags()
78 own_he_cap->he_cap_elem.phy_cap_info[3] & in iwl_mld_get_tlc_cmd_flags()
84 own_eht_cap->eht_cap_elem.phy_cap_info[5] & in iwl_mld_get_tlc_cmd_flags()
86 link_sta->eht_cap.has_eht && in iwl_mld_get_tlc_cmd_flags()
87 link_sta->eht_cap.eht_cap_elem.phy_cap_info[5] & in iwl_mld_get_tlc_cmd_flags()
110 struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in iwl_mld_get_fw_sgi()
111 struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in iwl_mld_get_fw_sgi()
112 struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in iwl_mld_get_fw_sgi()
115 /* If the association supports HE, HT/VHT rates will never be used for in iwl_mld_get_fw_sgi()
117 * sgi-per-channel-width-support bits in iwl_mld_get_fw_sgi()
119 if (he_cap->has_he) in iwl_mld_get_fw_sgi()
122 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_20) in iwl_mld_get_fw_sgi()
124 if (ht_cap->cap & IEEE80211_HT_CAP_SGI_40) in iwl_mld_get_fw_sgi()
126 if (vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_80) in iwl_mld_get_fw_sgi()
128 if (vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_160) in iwl_mld_get_fw_sgi()
138 u16 rx_mcs = le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) & in iwl_mld_get_highest_fw_mcs()
139 (0x3 << (2 * (nss - 1))); in iwl_mld_get_highest_fw_mcs()
140 rx_mcs >>= (2 * (nss - 1)); in iwl_mld_get_highest_fw_mcs()
164 u8 max_nss = link_sta->rx_nss; in iwl_mld_fill_vht_rates()
166 .vht_cap_info = cpu_to_le32(vht_cap->cap), in iwl_mld_fill_vht_rates()
167 .supp_mcs = vht_cap->vht_mcs, in iwl_mld_fill_vht_rates()
171 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in iwl_mld_fill_vht_rates()
181 supp = BIT(highest_mcs + 1) - 1; in iwl_mld_fill_vht_rates()
182 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in iwl_mld_fill_vht_rates()
185 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = cpu_to_le16(supp); in iwl_mld_fill_vht_rates()
187 * configuration is supported - only for MCS 0 since we already in iwl_mld_fill_vht_rates()
188 * decoded the MCS bits anyway ourselves. in iwl_mld_fill_vht_rates()
190 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160 && in iwl_mld_fill_vht_rates()
194 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_160] = in iwl_mld_fill_vht_rates()
195 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80]; in iwl_mld_fill_vht_rates()
199 static u16 iwl_mld_he_mac80211_mcs_to_fw_mcs(u16 mcs) in iwl_mld_he_mac80211_mcs_to_fw_mcs() argument
201 switch (mcs) { in iwl_mld_he_mac80211_mcs_to_fw_mcs()
203 return BIT(IWL_TLC_MNG_HT_RATE_MCS7 + 1) - 1; in iwl_mld_he_mac80211_mcs_to_fw_mcs()
205 return BIT(IWL_TLC_MNG_HT_RATE_MCS9 + 1) - 1; in iwl_mld_he_mac80211_mcs_to_fw_mcs()
207 return BIT(IWL_TLC_MNG_HT_RATE_MCS11 + 1) - 1; in iwl_mld_he_mac80211_mcs_to_fw_mcs()
212 WARN(1, "invalid HE MCS %d\n", mcs); in iwl_mld_he_mac80211_mcs_to_fw_mcs()
221 const struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in iwl_mld_fill_he_rates()
222 u16 mcs_160 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); in iwl_mld_fill_he_rates()
223 u16 mcs_80 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); in iwl_mld_fill_he_rates()
224 u16 tx_mcs_80 = le16_to_cpu(own_he_cap->he_mcs_nss_supp.tx_mcs_80); in iwl_mld_fill_he_rates()
225 u16 tx_mcs_160 = le16_to_cpu(own_he_cap->he_mcs_nss_supp.tx_mcs_160); in iwl_mld_fill_he_rates()
227 u8 nss = link_sta->rx_nss; in iwl_mld_fill_he_rates()
230 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in iwl_mld_fill_he_rates()
239 /* If one side doesn't support - mark both as not supporting */ in iwl_mld_fill_he_rates()
247 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = in iwl_mld_fill_he_rates()
250 /* If one side doesn't support - mark both as not supporting */ in iwl_mld_fill_he_rates()
258 cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_160] = in iwl_mld_fill_he_rates()
281 return &eht_mcs->bw._80; in iwl_mld_get_eht_mcs_of_bw()
283 return &eht_mcs->bw._160; in iwl_mld_get_eht_mcs_of_bw()
285 return &eht_mcs->bw._320; in iwl_mld_get_eht_mcs_of_bw()
302 iwl_mld_get_eht_max_nss((rx)->rx_tx_mcs ##mcs_num## _max_nss, \
303 (tx)->rx_tx_mcs ##mcs_num## _max_nss)
312 /* peer RX mcs capa */ in iwl_mld_fill_eht_rates()
314 &link_sta->eht_cap.eht_mcs_nss_supp; in iwl_mld_fill_eht_rates()
315 /* our TX mcs capa */ in iwl_mld_fill_eht_rates()
317 &own_eht_cap->eht_mcs_nss_supp; in iwl_mld_fill_eht_rates()
324 if (vif->type == NL80211_IFTYPE_AP && in iwl_mld_fill_eht_rates()
325 !(link_sta->he_cap.he_cap_elem.phy_cap_info[0] & in iwl_mld_fill_eht_rates()
327 mcs_rx_20 = eht_rx_mcs->only_20mhz; in iwl_mld_fill_eht_rates()
330 eht_rx_mcs->bw._80.rx_tx_mcs9_max_nss; in iwl_mld_fill_eht_rates()
332 eht_rx_mcs->bw._80.rx_tx_mcs9_max_nss; in iwl_mld_fill_eht_rates()
334 eht_rx_mcs->bw._80.rx_tx_mcs11_max_nss; in iwl_mld_fill_eht_rates()
336 eht_rx_mcs->bw._80.rx_tx_mcs13_max_nss; in iwl_mld_fill_eht_rates()
340 if (!(own_he_cap->he_cap_elem.phy_cap_info[0] & in iwl_mld_fill_eht_rates()
342 mcs_tx_20 = eht_tx_mcs->only_20mhz; in iwl_mld_fill_eht_rates()
345 eht_tx_mcs->bw._80.rx_tx_mcs9_max_nss; in iwl_mld_fill_eht_rates()
347 eht_tx_mcs->bw._80.rx_tx_mcs9_max_nss; in iwl_mld_fill_eht_rates()
349 eht_tx_mcs->bw._80.rx_tx_mcs11_max_nss; in iwl_mld_fill_eht_rates()
351 eht_tx_mcs->bw._80.rx_tx_mcs13_max_nss; in iwl_mld_fill_eht_rates()
354 /* rates for 20/40/80 MHz */ in iwl_mld_fill_eht_rates()
356 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
359 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
362 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
365 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
369 /* rates for 160/320 MHz */ in iwl_mld_fill_eht_rates()
381 if (cmd->max_ch_width < (bw + IWL_TLC_MNG_CH_WIDTH_80MHZ)) in iwl_mld_fill_eht_rates()
384 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
387 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
390 iwl_mld_set_eht_mcs(cmd->ht_rates, bw, in iwl_mld_fill_eht_rates()
396 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC || in iwl_mld_fill_eht_rates()
397 link_sta->rx_nss < 2) in iwl_mld_fill_eht_rates()
398 memset(cmd->ht_rates[IWL_TLC_NSS_2], 0, in iwl_mld_fill_eht_rates()
399 sizeof(cmd->ht_rates[IWL_TLC_NSS_2])); in iwl_mld_fill_eht_rates()
413 const struct ieee80211_sta_ht_cap *ht_cap = &link_sta->ht_cap; in iwl_mld_fill_supp_rates()
414 const struct ieee80211_sta_vht_cap *vht_cap = &link_sta->vht_cap; in iwl_mld_fill_supp_rates()
415 const struct ieee80211_sta_he_cap *he_cap = &link_sta->he_cap; in iwl_mld_fill_supp_rates()
417 /* non HT rates */ in iwl_mld_fill_supp_rates()
418 rates_bitmap = link_sta->supp_rates[sband->band]; in iwl_mld_fill_supp_rates()
420 non_ht_rates |= BIT(sband->bitrates[i].hw_value); in iwl_mld_fill_supp_rates()
422 cmd->non_ht_rates = cpu_to_le16(non_ht_rates); in iwl_mld_fill_supp_rates()
423 cmd->mode = IWL_TLC_MNG_MODE_NON_HT; in iwl_mld_fill_supp_rates()
425 if (link_sta->eht_cap.has_eht && own_he_cap && own_eht_cap) { in iwl_mld_fill_supp_rates()
426 cmd->mode = IWL_TLC_MNG_MODE_EHT; in iwl_mld_fill_supp_rates()
429 } else if (he_cap->has_he && own_he_cap) { in iwl_mld_fill_supp_rates()
430 cmd->mode = IWL_TLC_MNG_MODE_HE; in iwl_mld_fill_supp_rates()
432 } else if (vht_cap->vht_supported) { in iwl_mld_fill_supp_rates()
433 cmd->mode = IWL_TLC_MNG_MODE_VHT; in iwl_mld_fill_supp_rates()
435 } else if (ht_cap->ht_supported) { in iwl_mld_fill_supp_rates()
436 cmd->mode = IWL_TLC_MNG_MODE_HT; in iwl_mld_fill_supp_rates()
437 cmd->ht_rates[IWL_TLC_NSS_1][IWL_TLC_MCS_PER_BW_80] = in iwl_mld_fill_supp_rates()
438 cpu_to_le16(ht_cap->mcs.rx_mask[0]); in iwl_mld_fill_supp_rates()
441 if (link_sta->smps_mode == IEEE80211_SMPS_STATIC) in iwl_mld_fill_supp_rates()
442 cmd->ht_rates[IWL_TLC_NSS_2][IWL_TLC_MCS_PER_BW_80] = in iwl_mld_fill_supp_rates()
445 cmd->ht_rates[IWL_TLC_NSS_2][IWL_TLC_MCS_PER_BW_80] = in iwl_mld_fill_supp_rates()
446 cpu_to_le16(ht_cap->mcs.rx_mask[1]); in iwl_mld_fill_supp_rates()
455 struct iwl_mld_sta *mld_sta = iwl_mld_sta_from_mac80211(link_sta->sta); in iwl_mld_send_tlc_cmd()
456 struct ieee80211_supported_band *sband = mld->hw->wiphy->bands[band]; in iwl_mld_send_tlc_cmd()
463 .max_ch_width = mld_sta->sta_state > IEEE80211_STA_ASSOC ? in iwl_mld_send_tlc_cmd()
470 .max_mpdu_len = cpu_to_le16(link_sta->agg.max_amsdu_len), in iwl_mld_send_tlc_cmd()
488 /* Send async since this can be called within a RCU-read section */ in iwl_mld_send_tlc_cmd()
526 struct iwl_mld_sta *mld_sta = iwl_mld_sta_from_mac80211(link_sta->sta); in iwl_mld_config_tlc_link()
529 if (WARN_ON_ONCE(!link_conf->chanreq.oper.chan)) in iwl_mld_config_tlc_link()
532 /* Before we have information about a station, configure the A-MSDU RC in iwl_mld_config_tlc_link()
534 * A-MSDUs. in iwl_mld_config_tlc_link()
536 if (mld_sta->sta_state < IEEE80211_STA_ASSOC) { in iwl_mld_config_tlc_link()
537 link_sta->agg.max_rc_amsdu_len = 1; in iwl_mld_config_tlc_link()
538 ieee80211_sta_recalc_aggregates(link_sta->sta); in iwl_mld_config_tlc_link()
541 band = link_conf->chanreq.oper.chan->band; in iwl_mld_config_tlc_link()
551 lockdep_assert_wiphy(mld->wiphy); in iwl_mld_config_tlc()
569 struct ieee80211_sta *sta = link_sta->sta; in iwl_mld_get_amsdu_size_of_tid()
570 struct ieee80211_vif *vif = iwl_mld_sta_from_mac80211(sta)->vif; in iwl_mld_get_amsdu_size_of_tid()
581 unsigned int result = link_sta->agg.max_rc_amsdu_len; in iwl_mld_get_amsdu_size_of_tid()
584 lockdep_assert_wiphy(mld->wiphy); in iwl_mld_get_amsdu_size_of_tid()
598 if (link_sta->he_cap.has_he) in iwl_mld_get_amsdu_size_of_tid()
604 if (hweight16(sta->valid_links) <= 1) { in iwl_mld_get_amsdu_size_of_tid()
607 wiphy_dereference(mld->wiphy, in iwl_mld_get_amsdu_size_of_tid()
608 vif->link_conf[link_sta->link_id]); in iwl_mld_get_amsdu_size_of_tid()
610 if (WARN_ON(!link || !link->chanreq.oper.chan)) in iwl_mld_get_amsdu_size_of_tid()
613 band = link->chanreq.oper.chan->band; in iwl_mld_get_amsdu_size_of_tid()
617 } else if (fw_has_capa(&mld->fw->ucode_capa, in iwl_mld_get_amsdu_size_of_tid()
621 mld->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256); in iwl_mld_get_amsdu_size_of_tid()
629 mld->fwrt.smem_cfg.lmac[lmac].txfifo_size[txf] - 256); in iwl_mld_get_amsdu_size_of_tid()
635 struct iwl_tlc_update_notif *notif = (void *)pkt->data; in iwl_mld_handle_tlc_notif()
637 u32 flags = le32_to_cpu(notif->flags); in iwl_mld_handle_tlc_notif()
641 if (IWL_FW_CHECK(mld, notif->sta_id >= mld->fw->ucode_capa.num_stations, in iwl_mld_handle_tlc_notif()
643 notif->sta_id)) in iwl_mld_handle_tlc_notif()
646 link_sta = wiphy_dereference(mld->wiphy, in iwl_mld_handle_tlc_notif()
647 mld->fw_id_to_link_sta[notif->sta_id]); in iwl_mld_handle_tlc_notif()
650 "link_sta of sta id (%d) doesn't exist\n", notif->sta_id)) in iwl_mld_handle_tlc_notif()
661 mld_link_sta->last_rate_n_flags = in iwl_mld_handle_tlc_notif()
662 iwl_v3_rate_from_v2_v3(notif->rate, in iwl_mld_handle_tlc_notif()
663 mld->fw_rates_ver_3); in iwl_mld_handle_tlc_notif()
666 mld_link_sta->last_rate_n_flags); in iwl_mld_handle_tlc_notif()
674 enabled = le32_to_cpu(notif->amsdu_enabled); in iwl_mld_handle_tlc_notif()
675 size = le32_to_cpu(notif->amsdu_size); in iwl_mld_handle_tlc_notif()
682 if (IWL_FW_CHECK(mld, size > link_sta->agg.max_amsdu_len, in iwl_mld_handle_tlc_notif()
684 size, link_sta->agg.max_amsdu_len)) in iwl_mld_handle_tlc_notif()
687 link_sta->agg.max_rc_amsdu_len = size; in iwl_mld_handle_tlc_notif()
691 link_sta->agg.max_tid_amsdu_len[i] = in iwl_mld_handle_tlc_notif()
694 link_sta->agg.max_tid_amsdu_len[i] = 1; in iwl_mld_handle_tlc_notif()
697 ieee80211_sta_recalc_aggregates(link_sta->sta); in iwl_mld_handle_tlc_notif()
701 le32_to_cpu(notif->amsdu_size), size, enabled); in iwl_mld_handle_tlc_notif()