]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: generate rx and tx mcs maps for supported HE mcs
authorPradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Tue, 1 Jul 2025 01:04:03 +0000 (18:04 -0700)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Wed, 2 Jul 2025 14:02:26 +0000 (07:02 -0700)
Generate rx and tx mcs maps in ath12k_mac_set_hemcsmap() based
on number of supported tx/rx chains and set them in supported
mcs/nss for HE capabilities.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Co-developed-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20250701010408.1257201-5-quic_pradeepc@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c

index f3833fa080706a6f4642db56e79db3b396b3cede..37f50851a23644779f53958912d2cd84cc47be61 100644 (file)
@@ -7537,20 +7537,40 @@ static __le16 ath12k_mac_setup_he_6ghz_cap(struct ath12k_pdev_cap *pcap,
        return cpu_to_le16(bcap->he_6ghz_capa);
 }
 
-static void ath12k_mac_set_hemcsmap(struct ath12k_band_cap *band_cap,
+static void ath12k_mac_set_hemcsmap(struct ath12k *ar,
+                                   struct ath12k_pdev_cap *cap,
                                    struct ieee80211_sta_he_cap *he_cap)
 {
        struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
+       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);
+       }
 
-       mcs_nss->rx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
-       mcs_nss->tx_mcs_80 = cpu_to_le16(band_cap->he_mcs & 0xffff);
-       mcs_nss->rx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
-       mcs_nss->tx_mcs_160 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
-       mcs_nss->rx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
-       mcs_nss->tx_mcs_80p80 = cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff);
+       mcs_nss->rx_mcs_80 = cpu_to_le16(rxmcs_map & 0xffff);
+       mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
+       mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map & 0xffff);
+       mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map & 0xffff);
+       mcs_nss->rx_mcs_80p80 = cpu_to_le16(rxmcs_map & 0xffff);
+       mcs_nss->tx_mcs_80p80 = cpu_to_le16(txmcs_map & 0xffff);
 }
 
-static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
+static void ath12k_mac_copy_he_cap(struct ath12k *ar,
+                                  struct ath12k_band_cap *band_cap,
                                   int iftype, u8 num_tx_chains,
                                   struct ieee80211_sta_he_cap *he_cap)
 {
@@ -7594,7 +7614,7 @@ static void ath12k_mac_copy_he_cap(struct ath12k_band_cap *band_cap,
                break;
        }
 
-       ath12k_mac_set_hemcsmap(band_cap, he_cap);
+       ath12k_mac_set_hemcsmap(ar, &ar->pdev->cap, he_cap);
        memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
        if (he_cap_elem->phy_cap_info[6] &
            IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
@@ -7784,7 +7804,7 @@ static int ath12k_mac_copy_sband_iftype_data(struct ath12k *ar,
 
                data[idx].types_mask = BIT(i);
 
-               ath12k_mac_copy_he_cap(band_cap, i, ar->num_tx_chains, he_cap);
+               ath12k_mac_copy_he_cap(ar, band_cap, i, ar->num_tx_chains, he_cap);
                if (band == NL80211_BAND_6GHZ) {
                        data[idx].he_6ghz_capa.capa =
                                ath12k_mac_setup_he_6ghz_cap(cap, band_cap);