| From a6f5e8e1df21f5d65fcef533b96b9d26680d5bc3 Mon Sep 17 00:00:00 2001 |
| From: Howard Hsu <howard-yh.hsu@mediatek.com> |
| Date: Tue, 12 Mar 2024 09:07:52 +0800 |
| Subject: [PATCH 006/116] wifi: mt76: mt7996: fix HE and EHT phy cap |
| |
| This commit fix he and eht phy capabailties ie. For HE phy cap, fix |
| correct beamform capabilities for station vif. For EHT phy cap, remove |
| unsupported capabilities. |
| |
| Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi7 (802.11be) devices") |
| Fixes: 348533eb968d ("wifi: mt76: mt7996: add EHT capability init") |
| Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com> |
| |
| Change-Id: Ic853ec1b62344ac08787673ae22254f9829e0e6e |
| CR-Id: WCNCR00240772 |
| --- |
| mt7996/init.c | 65 ++++++++++++++++++++++++++++++++++----------------- |
| 1 file changed, 43 insertions(+), 22 deletions(-) |
| |
| diff --git a/mt7996/init.c b/mt7996/init.c |
| index 9aa97e4a7..c264d5043 100644 |
| --- a/mt7996/init.c |
| +++ b/mt7996/init.c |
| @@ -1010,8 +1010,6 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy, |
| return; |
| |
| elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; |
| - if (vif == NL80211_IFTYPE_AP) |
| - elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; |
| |
| c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, |
| sts - 1) | |
| @@ -1019,6 +1017,11 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy, |
| sts - 1); |
| elem->phy_cap_info[5] |= c; |
| |
| + if (vif != NL80211_IFTYPE_AP) |
| + return; |
| + |
| + elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; |
| + |
| c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | |
| IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; |
| elem->phy_cap_info[6] |= c; |
| @@ -1178,7 +1181,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, |
| IEEE80211_EHT_MAC_CAP0_OM_CONTROL; |
| |
| eht_cap_elem->phy_cap_info[0] = |
| - IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ | |
| IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI | |
| IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER | |
| IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE; |
| @@ -1192,30 +1194,36 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, |
| u8_encode_bits(u8_get_bits(val, GENMASK(2, 1)), |
| IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK) | |
| u8_encode_bits(val, |
| - IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK) | |
| - u8_encode_bits(val, |
| - IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK); |
| + IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK); |
| |
| eht_cap_elem->phy_cap_info[2] = |
| u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) | |
| - u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK) | |
| - u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK); |
| + u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK); |
| + |
| + if (band == NL80211_BAND_6GHZ) { |
| + eht_cap_elem->phy_cap_info[0] |= |
| + IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ; |
| + |
| + eht_cap_elem->phy_cap_info[1] |= |
| + u8_encode_bits(val, |
| + IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK); |
| + |
| + eht_cap_elem->phy_cap_info[2] |= |
| + u8_encode_bits(sts - 1, |
| + IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK); |
| + } |
| |
| eht_cap_elem->phy_cap_info[3] = |
| IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK | |
| IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK | |
| IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK | |
| - IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK | |
| - IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK | |
| - IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK | |
| - IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK; |
| + IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK; |
| |
| eht_cap_elem->phy_cap_info[4] = |
| u8_encode_bits(min_t(int, sts - 1, 2), |
| IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK); |
| |
| eht_cap_elem->phy_cap_info[5] = |
| - IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK | |
| u8_encode_bits(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US, |
| IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK) | |
| u8_encode_bits(u8_get_bits(0x11, GENMASK(1, 0)), |
| @@ -1229,14 +1237,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, |
| IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK) | |
| u8_encode_bits(val, IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK); |
| |
| - eht_cap_elem->phy_cap_info[7] = |
| - IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | |
| - IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | |
| - IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | |
| - IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | |
| - IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ | |
| - IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; |
| - |
| val = u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_RX) | |
| u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_TX); |
| #define SET_EHT_MAX_NSS(_bw, _val) do { \ |
| @@ -1247,8 +1247,29 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, |
| |
| SET_EHT_MAX_NSS(80, val); |
| SET_EHT_MAX_NSS(160, val); |
| - SET_EHT_MAX_NSS(320, val); |
| + if (band == NL80211_BAND_6GHZ) |
| + SET_EHT_MAX_NSS(320, val); |
| #undef SET_EHT_MAX_NSS |
| + |
| + if (iftype != NL80211_IFTYPE_AP) |
| + return; |
| + |
| + eht_cap_elem->phy_cap_info[3] |= |
| + IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK | |
| + IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK; |
| + |
| + eht_cap_elem->phy_cap_info[7] = |
| + IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ | |
| + IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ | |
| + IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ | |
| + IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ; |
| + |
| + if (band != NL80211_BAND_6GHZ) |
| + return; |
| + |
| + eht_cap_elem->phy_cap_info[7] |= |
| + IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ | |
| + IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ; |
| } |
| |
| static void |
| -- |
| 2.39.2 |
| |