wifi: ath11k: generate rx and tx mcs maps for supported HE mcs
authorMuna Sinada <quic_msinada@quicinc.com>
Fri, 24 Feb 2023 10:28:04 +0000 (12:28 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Mon, 27 Feb 2023 12:26:07 +0000 (14:26 +0200)
Generate rx and tx mcs maps in ath11k_mac_set_hemcsmap() and set them
in supported mcs/nss for HE capabilities.

Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1

Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/1666128501-12364-5-git-send-email-quic_msinada@quicinc.com
drivers/net/wireless/ath/ath11k/mac.c

index 0835ab8b389a647cb82bd79a354b594aebd55a67..fd1a23ead5e22e0cf2a93483ee7b031c92656f94 100644 (file)
@@ -5488,20 +5488,36 @@ static void ath11k_mac_set_hemcsmap(struct ath11k *ar,
                                    struct ieee80211_sta_he_cap *he_cap,
                                    int band)
 {
-       struct ath11k_band_cap *band_cap = &cap->band[band];
+       u16 txmcs_map, rxmcs_map;
+       u32 i;
 
+       rxmcs_map = 0;
+       txmcs_map = 0;
+       for (i = 0; i < 8; i++) {
+               if (i < ar->num_tx_chains &&
+                   (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
+                       txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
+               else
+                       txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
+
+               if (i < ar->num_rx_chains &&
+                   (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
+                       rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
+               else
+                       rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
+       }
        he_cap->he_mcs_nss_supp.rx_mcs_80 =
-               cpu_to_le16(band_cap->he_mcs & 0xffff);
+               cpu_to_le16(rxmcs_map & 0xffff);
        he_cap->he_mcs_nss_supp.tx_mcs_80 =
-               cpu_to_le16(band_cap->he_mcs & 0xffff);
+               cpu_to_le16(txmcs_map & 0xffff);
        he_cap->he_mcs_nss_supp.rx_mcs_160 =
-               cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
+               cpu_to_le16(rxmcs_map & 0xffff);
        he_cap->he_mcs_nss_supp.tx_mcs_160 =
-               cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
+               cpu_to_le16(txmcs_map & 0xffff);
        he_cap->he_mcs_nss_supp.rx_mcs_80p80 =
-               cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
+               cpu_to_le16(rxmcs_map & 0xffff);
        he_cap->he_mcs_nss_supp.tx_mcs_80p80 =
-               cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
+               cpu_to_le16(txmcs_map & 0xffff);
 }
 
 static int ath11k_mac_copy_he_cap(struct ath11k *ar,