[PATCH V13 4/9] wifi: ath12k: generate rx and tx mcs maps for supported HE mcs
Uraj Sasan
quic_usasan at quicinc.com
Wed May 28 23:59:56 PDT 2025
On 4/18/2025 11:18 PM, Pradeep Kumar Chitrapu wrote:
> 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 at quicinc.com>
> Signed-off-by: Muna Sinada <quic_msinada at quicinc.com>
> Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
> Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
> ---
> drivers/net/wireless/ath/ath12k/mac.c | 40 ++++++++++++++++++++-------
> 1 file changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index 30c7d5770ef6..178c89029922 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -6947,20 +6947,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))
I could see the changes are already in external review but wanted to post it internally,
Shouldn't this be cap->rx_chain_mask_shift ?
*"i < ar->num_tx_chains and i < ar->num_rx_chains "*, this is issue since the value of ar->num_tx_chains is not the max supported by the hw always,
but it gets updated later also via iw phy set antenna command and if user provides any value from 0-15 we will have
issue. E.g if the value are non continues 1's eg 4 , 5, 6 it will fail and set the VHT/HT/EHT caps to disabled state,
and only 1,3,7,15 would work correctly.
> + 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)
> {
> @@ -7004,7 +7024,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)
> @@ -7194,7 +7214,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);
More information about the ath12k
mailing list