blob: 82e083cb7ea0d4e38e265277396656f2aceccf09 [file] [log] [blame]
developer617abbd2024-04-23 14:50:01 +08001From a6f5e8e1df21f5d65fcef533b96b9d26680d5bc3 Mon Sep 17 00:00:00 2001
2From: Howard Hsu <howard-yh.hsu@mediatek.com>
3Date: Tue, 12 Mar 2024 09:07:52 +0800
4Subject: [PATCH 006/116] wifi: mt76: mt7996: fix HE and EHT phy cap
5
6This commit fix he and eht phy capabailties ie. For HE phy cap, fix
7correct beamform capabilities for station vif. For EHT phy cap, remove
8unsupported capabilities.
9
10Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi7 (802.11be) devices")
11Fixes: 348533eb968d ("wifi: mt76: mt7996: add EHT capability init")
12Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
13
14Change-Id: Ic853ec1b62344ac08787673ae22254f9829e0e6e
15CR-Id: WCNCR00240772
16---
17 mt7996/init.c | 65 ++++++++++++++++++++++++++++++++++-----------------
18 1 file changed, 43 insertions(+), 22 deletions(-)
19
20diff --git a/mt7996/init.c b/mt7996/init.c
21index 9aa97e4a7..c264d5043 100644
22--- a/mt7996/init.c
23+++ b/mt7996/init.c
24@@ -1010,8 +1010,6 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,
25 return;
26
27 elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER;
28- if (vif == NL80211_IFTYPE_AP)
29- elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
30
31 c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
32 sts - 1) |
33@@ -1019,6 +1017,11 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,
34 sts - 1);
35 elem->phy_cap_info[5] |= c;
36
37+ if (vif != NL80211_IFTYPE_AP)
38+ return;
39+
40+ elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
41+
42 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
43 IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB;
44 elem->phy_cap_info[6] |= c;
45@@ -1178,7 +1181,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
46 IEEE80211_EHT_MAC_CAP0_OM_CONTROL;
47
48 eht_cap_elem->phy_cap_info[0] =
49- IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ |
50 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
51 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
52 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE;
53@@ -1192,30 +1194,36 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
54 u8_encode_bits(u8_get_bits(val, GENMASK(2, 1)),
55 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK) |
56 u8_encode_bits(val,
57- IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK) |
58- u8_encode_bits(val,
59- IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK);
60+ IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK);
61
62 eht_cap_elem->phy_cap_info[2] =
63 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) |
64- u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK) |
65- u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK);
66+ u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK);
67+
68+ if (band == NL80211_BAND_6GHZ) {
69+ eht_cap_elem->phy_cap_info[0] |=
70+ IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ;
71+
72+ eht_cap_elem->phy_cap_info[1] |=
73+ u8_encode_bits(val,
74+ IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK);
75+
76+ eht_cap_elem->phy_cap_info[2] |=
77+ u8_encode_bits(sts - 1,
78+ IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK);
79+ }
80
81 eht_cap_elem->phy_cap_info[3] =
82 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
83 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
84 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
85- IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
86- IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
87- IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
88- IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
89+ IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK;
90
91 eht_cap_elem->phy_cap_info[4] =
92 u8_encode_bits(min_t(int, sts - 1, 2),
93 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK);
94
95 eht_cap_elem->phy_cap_info[5] =
96- IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
97 u8_encode_bits(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US,
98 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK) |
99 u8_encode_bits(u8_get_bits(0x11, GENMASK(1, 0)),
100@@ -1229,14 +1237,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
101 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK) |
102 u8_encode_bits(val, IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK);
103
104- eht_cap_elem->phy_cap_info[7] =
105- IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
106- IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
107- IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
108- IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
109- IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
110- IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
111-
112 val = u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_RX) |
113 u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_TX);
114 #define SET_EHT_MAX_NSS(_bw, _val) do { \
115@@ -1247,8 +1247,29 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
116
117 SET_EHT_MAX_NSS(80, val);
118 SET_EHT_MAX_NSS(160, val);
119- SET_EHT_MAX_NSS(320, val);
120+ if (band == NL80211_BAND_6GHZ)
121+ SET_EHT_MAX_NSS(320, val);
122 #undef SET_EHT_MAX_NSS
123+
124+ if (iftype != NL80211_IFTYPE_AP)
125+ return;
126+
127+ eht_cap_elem->phy_cap_info[3] |=
128+ IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
129+ IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK;
130+
131+ eht_cap_elem->phy_cap_info[7] =
132+ IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
133+ IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
134+ IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
135+ IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ;
136+
137+ if (band != NL80211_BAND_6GHZ)
138+ return;
139+
140+ eht_cap_elem->phy_cap_info[7] |=
141+ IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
142+ IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
143 }
144
145 static void
146--
1472.39.2
148