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