blob: 0675c5e6b0f79c49a1f28d91814211074029f802 [file] [log] [blame]
developer3e0400f2023-02-10 08:32:03 +08001From 06ae5e66a56e6def22c1d4d61d75815f9b1f7ee2 Mon Sep 17 00:00:00 2001
2From: Evelyn Tsai <evelyn.tsai@mediatek.com>
3Date: Sun, 25 Dec 2022 22:43:46 +0800
4Subject: [PATCH 9999901/9999902] mac80211: mtk: add rate duration for EHT
5 rate.
6
7---
8 include/net/mac80211.h | 4 +-
9 net/mac80211/airtime.c | 349 ++++++++++++++++++++++++++++++++++++++++-
10 2 files changed, 348 insertions(+), 5 deletions(-)
11
12diff --git a/include/net/mac80211.h b/include/net/mac80211.h
13index dd9e834..f7fcefe 100644
14--- a/include/net/mac80211.h
15+++ b/include/net/mac80211.h
16@@ -1437,6 +1437,7 @@ enum mac80211_rx_encoding {
17 RX_ENC_HT,
18 RX_ENC_VHT,
19 RX_ENC_HE,
20+ RX_ENC_EHT,
21 };
22
23 /**
24@@ -1499,8 +1500,7 @@ struct ieee80211_rx_status {
25 u32 flag;
26 u16 freq: 13, freq_offset: 1;
27 u8 enc_flags;
28- u8 encoding:2, bw:3, he_ru:3;
29- u8 he_gi:2, he_dcm:1;
30+ u16 encoding:3, bw:3, he_ru:3, he_gi:2, he_dcm:1;
31 u8 rate_idx;
32 u8 nss;
33 u8 rx_flags;
34diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
35index e8ebd34..b1de6d0 100644
36--- a/net/mac80211/airtime.c
37+++ b/net/mac80211/airtime.c
38@@ -55,10 +55,21 @@
39 #define HE_DURATION_S(shift, streams, gi, bps) \
40 (HE_DURATION(streams, gi, bps) >> shift)
41
42+/* Transmit duration for the raw data part of an average sized packet */
43+#define EHT_GI_08 HE_GI_08
44+#define EHT_GI_16 HE_GI_16
45+#define EHT_GI_32 HE_GI_32
46+
47+#define EHT_DURATION(streams, gi, bps) \
48+ HE_DURATION(streams, gi, bps)
49+#define EHT_DURATION_S(shift, streams, gi, bps) \
50+ HE_DURATION_S(shift, streams, gi, bps)
51+
52 #define BW_20 0
53 #define BW_40 1
54 #define BW_80 2
55 #define BW_160 3
56+#define BW_320 4
57
58 /*
59 * Define group sort order: HT40 -> SGI -> #streams
60@@ -68,17 +79,26 @@
61 #define IEEE80211_VHT_STREAM_GROUPS 8 /* BW(=4) * SGI(=2) */
62
63 #define IEEE80211_HE_MAX_STREAMS 8
64+#define IEEE80211_HE_STREAM_GROUPS 12 /* BW(=4) * GI(=3) */
65+
66+#define IEEE80211_EHT_MAX_STREAMS 16
67+#define IEEE80211_EHT_STREAM_GROUPS 15 /* BW(=5) * GI(=3) */
68
69 #define IEEE80211_HT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
70 IEEE80211_HT_STREAM_GROUPS)
71 #define IEEE80211_VHT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
72 IEEE80211_VHT_STREAM_GROUPS)
73+#define IEEE80211_HE_GROUPS_NB (IEEE80211_HE_MAX_STREAMS * \
74+ IEEE80211_HE_STREAM_GROUPS)
75+#define IEEE80211_EHT_GROUPS_NB (IEEE80211_EHT_MAX_STREAMS * \
76+ IEEE80211_EHT_STREAM_GROUPS)
77
78 #define IEEE80211_HT_GROUP_0 0
79 #define IEEE80211_VHT_GROUP_0 (IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
80 #define IEEE80211_HE_GROUP_0 (IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
81+#define IEEE80211_EHT_GROUP_0 (IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
82
83-#define MCS_GROUP_RATES 12
84+#define MCS_GROUP_RATES 14
85
86 #define HT_GROUP_IDX(_streams, _sgi, _ht40) \
87 IEEE80211_HT_GROUP_0 + \
88@@ -203,6 +223,59 @@
89 #define HE_GROUP(_streams, _gi, _bw) \
90 __HE_GROUP(_streams, _gi, _bw, \
91 HE_GROUP_SHIFT(_streams, _gi, _bw))
92+
93+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1) \
94+ (_bw == BW_320 ? r5 : _bw == BW_160 ? r4 : _bw == BW_80 ? r3 : _bw == BW_40 ? r2 : r1)
95+
96+#define EHT_GROUP_IDX(_streams, _gi, _bw) \
97+ (IEEE80211_EHT_GROUP_0 + \
98+ IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) + \
99+ IEEE80211_EHT_MAX_STREAMS * (_gi) + \
100+ (_streams) - 1)
101+
102+#define __EHT_GROUP(_streams, _gi, _bw, _s) \
103+ [EHT_GROUP_IDX(_streams, _gi, _bw)] = { \
104+ .shift = _s, \
105+ .duration = { \
106+ EHT_DURATION_S(_s, _streams, _gi, \
107+ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)), \
108+ EHT_DURATION_S(_s, _streams, _gi, \
109+ EHT_BW2VBPS(_bw, 3920, 1958, 979, 475, 230)), \
110+ EHT_DURATION_S(_s, _streams, _gi, \
111+ EHT_BW2VBPS(_bw, 5880, 2937, 1468, 705, 345)), \
112+ EHT_DURATION_S(_s, _streams, _gi, \
113+ EHT_BW2VBPS(_bw, 7840, 3916, 1958, 936, 475)), \
114+ EHT_DURATION_S(_s, _streams, _gi, \
115+ EHT_BW2VBPS(_bw, 11760, 5875, 2937, 1411, 705)), \
116+ EHT_DURATION_S(_s, _streams, _gi, \
117+ EHT_BW2VBPS(_bw, 15680, 7833, 3916, 1872, 936)), \
118+ EHT_DURATION_S(_s, _streams, _gi, \
119+ EHT_BW2VBPS(_bw, 17640, 8827, 4406, 2102, 1051)), \
120+ EHT_DURATION_S(_s, _streams, _gi, \
121+ EHT_BW2VBPS(_bw, 19600, 9806, 4896, 2347, 1166)), \
122+ EHT_DURATION_S(_s, _streams, _gi, \
123+ EHT_BW2VBPS(_bw, 23520, 11764, 5875, 2808, 1411)), \
124+ EHT_DURATION_S(_s, _streams, _gi, \
125+ EHT_BW2VBPS(_bw, 26133, 13060, 6523, 3124, 1555)), \
126+ EHT_DURATION_S(_s, _streams, _gi, \
127+ EHT_BW2VBPS(_bw, 29400, 14702, 7344, 3513, 1756)), \
128+ EHT_DURATION_S(_s, _streams, _gi, \
129+ EHT_BW2VBPS(_bw, 32666, 16329, 8164, 3902, 1944)), \
130+ EHT_DURATION_S(_s, _streams, _gi, \
131+ EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)), \
132+ EHT_DURATION_S(_s, _streams, _gi, \
133+ EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340)) \
134+ } \
135+}
136+
137+#define EHT_GROUP_SHIFT(_streams, _gi, _bw) \
138+ GROUP_SHIFT(EHT_DURATION(_streams, _gi, \
139+ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)))
140+
141+#define EHT_GROUP(_streams, _gi, _bw) \
142+ __EHT_GROUP(_streams, _gi, _bw, \
143+ EHT_GROUP_SHIFT(_streams, _gi, _bw))
144+
145 struct mcs_group {
146 u8 shift;
147 u16 duration[MCS_GROUP_RATES];
148@@ -376,6 +449,262 @@ static const struct mcs_group airtime_mcs_groups[] = {
149 HE_GROUP(6, HE_GI_32, BW_160),
150 HE_GROUP(7, HE_GI_32, BW_160),
151 HE_GROUP(8, HE_GI_32, BW_160),
152+
153+ /* EHT */
154+ EHT_GROUP( 1, EHT_GI_08, BW_20),
155+ EHT_GROUP( 2, EHT_GI_08, BW_20),
156+ EHT_GROUP( 3, EHT_GI_08, BW_20),
157+ EHT_GROUP( 4, EHT_GI_08, BW_20),
158+ EHT_GROUP( 5, EHT_GI_08, BW_20),
159+ EHT_GROUP( 6, EHT_GI_08, BW_20),
160+ EHT_GROUP( 7, EHT_GI_08, BW_20),
161+ EHT_GROUP( 8, EHT_GI_08, BW_20),
162+ EHT_GROUP( 9, EHT_GI_08, BW_20),
163+ EHT_GROUP(10, EHT_GI_08, BW_20),
164+ EHT_GROUP(11, EHT_GI_08, BW_20),
165+ EHT_GROUP(12, EHT_GI_08, BW_20),
166+ EHT_GROUP(13, EHT_GI_08, BW_20),
167+ EHT_GROUP(14, EHT_GI_08, BW_20),
168+ EHT_GROUP(15, EHT_GI_08, BW_20),
169+ EHT_GROUP(16, EHT_GI_08, BW_20),
170+
171+ EHT_GROUP( 1, EHT_GI_16, BW_20),
172+ EHT_GROUP( 2, EHT_GI_16, BW_20),
173+ EHT_GROUP( 3, EHT_GI_16, BW_20),
174+ EHT_GROUP( 4, EHT_GI_16, BW_20),
175+ EHT_GROUP( 5, EHT_GI_16, BW_20),
176+ EHT_GROUP( 6, EHT_GI_16, BW_20),
177+ EHT_GROUP( 7, EHT_GI_16, BW_20),
178+ EHT_GROUP( 8, EHT_GI_16, BW_20),
179+ EHT_GROUP( 9, EHT_GI_16, BW_20),
180+ EHT_GROUP(10, EHT_GI_16, BW_20),
181+ EHT_GROUP(11, EHT_GI_16, BW_20),
182+ EHT_GROUP(12, EHT_GI_16, BW_20),
183+ EHT_GROUP(13, EHT_GI_16, BW_20),
184+ EHT_GROUP(14, EHT_GI_16, BW_20),
185+ EHT_GROUP(15, EHT_GI_16, BW_20),
186+ EHT_GROUP(16, EHT_GI_16, BW_20),
187+
188+ EHT_GROUP( 1, EHT_GI_32, BW_20),
189+ EHT_GROUP( 2, EHT_GI_32, BW_20),
190+ EHT_GROUP( 3, EHT_GI_32, BW_20),
191+ EHT_GROUP( 4, EHT_GI_32, BW_20),
192+ EHT_GROUP( 5, EHT_GI_32, BW_20),
193+ EHT_GROUP( 6, EHT_GI_32, BW_20),
194+ EHT_GROUP( 7, EHT_GI_32, BW_20),
195+ EHT_GROUP( 8, EHT_GI_32, BW_20),
196+ EHT_GROUP( 9, EHT_GI_32, BW_20),
197+ EHT_GROUP(10, EHT_GI_32, BW_20),
198+ EHT_GROUP(11, EHT_GI_32, BW_20),
199+ EHT_GROUP(12, EHT_GI_32, BW_20),
200+ EHT_GROUP(13, EHT_GI_32, BW_20),
201+ EHT_GROUP(14, EHT_GI_32, BW_20),
202+ EHT_GROUP(15, EHT_GI_32, BW_20),
203+ EHT_GROUP(16, EHT_GI_32, BW_20),
204+
205+ EHT_GROUP( 1, EHT_GI_08, BW_40),
206+ EHT_GROUP( 2, EHT_GI_08, BW_40),
207+ EHT_GROUP( 3, EHT_GI_08, BW_40),
208+ EHT_GROUP( 4, EHT_GI_08, BW_40),
209+ EHT_GROUP( 5, EHT_GI_08, BW_40),
210+ EHT_GROUP( 6, EHT_GI_08, BW_40),
211+ EHT_GROUP( 7, EHT_GI_08, BW_40),
212+ EHT_GROUP( 8, EHT_GI_08, BW_40),
213+ EHT_GROUP( 9, EHT_GI_08, BW_40),
214+ EHT_GROUP(10, EHT_GI_08, BW_40),
215+ EHT_GROUP(11, EHT_GI_08, BW_40),
216+ EHT_GROUP(12, EHT_GI_08, BW_40),
217+ EHT_GROUP(13, EHT_GI_08, BW_40),
218+ EHT_GROUP(14, EHT_GI_08, BW_40),
219+ EHT_GROUP(15, EHT_GI_08, BW_40),
220+ EHT_GROUP(16, EHT_GI_08, BW_40),
221+
222+ EHT_GROUP( 1, EHT_GI_16, BW_40),
223+ EHT_GROUP( 2, EHT_GI_16, BW_40),
224+ EHT_GROUP( 3, EHT_GI_16, BW_40),
225+ EHT_GROUP( 4, EHT_GI_16, BW_40),
226+ EHT_GROUP( 5, EHT_GI_16, BW_40),
227+ EHT_GROUP( 6, EHT_GI_16, BW_40),
228+ EHT_GROUP( 7, EHT_GI_16, BW_40),
229+ EHT_GROUP( 8, EHT_GI_16, BW_40),
230+ EHT_GROUP( 9, EHT_GI_16, BW_40),
231+ EHT_GROUP(10, EHT_GI_16, BW_40),
232+ EHT_GROUP(11, EHT_GI_16, BW_40),
233+ EHT_GROUP(12, EHT_GI_16, BW_40),
234+ EHT_GROUP(13, EHT_GI_16, BW_40),
235+ EHT_GROUP(14, EHT_GI_16, BW_40),
236+ EHT_GROUP(15, EHT_GI_16, BW_40),
237+ EHT_GROUP(16, EHT_GI_16, BW_40),
238+
239+ EHT_GROUP( 1, EHT_GI_32, BW_40),
240+ EHT_GROUP( 2, EHT_GI_32, BW_40),
241+ EHT_GROUP( 3, EHT_GI_32, BW_40),
242+ EHT_GROUP( 4, EHT_GI_32, BW_40),
243+ EHT_GROUP( 5, EHT_GI_32, BW_40),
244+ EHT_GROUP( 6, EHT_GI_32, BW_40),
245+ EHT_GROUP( 7, EHT_GI_32, BW_40),
246+ EHT_GROUP( 8, EHT_GI_32, BW_40),
247+ EHT_GROUP( 9, EHT_GI_32, BW_40),
248+ EHT_GROUP(10, EHT_GI_32, BW_40),
249+ EHT_GROUP(11, EHT_GI_32, BW_40),
250+ EHT_GROUP(12, EHT_GI_32, BW_40),
251+ EHT_GROUP(13, EHT_GI_32, BW_40),
252+ EHT_GROUP(14, EHT_GI_32, BW_40),
253+ EHT_GROUP(15, EHT_GI_32, BW_40),
254+ EHT_GROUP(16, EHT_GI_32, BW_40),
255+
256+ EHT_GROUP( 1, EHT_GI_08, BW_80),
257+ EHT_GROUP( 2, EHT_GI_08, BW_80),
258+ EHT_GROUP( 3, EHT_GI_08, BW_80),
259+ EHT_GROUP( 4, EHT_GI_08, BW_80),
260+ EHT_GROUP( 5, EHT_GI_08, BW_80),
261+ EHT_GROUP( 6, EHT_GI_08, BW_80),
262+ EHT_GROUP( 7, EHT_GI_08, BW_80),
263+ EHT_GROUP( 8, EHT_GI_08, BW_80),
264+ EHT_GROUP( 9, EHT_GI_08, BW_80),
265+ EHT_GROUP(10, EHT_GI_08, BW_80),
266+ EHT_GROUP(11, EHT_GI_08, BW_80),
267+ EHT_GROUP(12, EHT_GI_08, BW_80),
268+ EHT_GROUP(13, EHT_GI_08, BW_80),
269+ EHT_GROUP(14, EHT_GI_08, BW_80),
270+ EHT_GROUP(15, EHT_GI_08, BW_80),
271+ EHT_GROUP(16, EHT_GI_08, BW_80),
272+
273+ EHT_GROUP( 1, EHT_GI_16, BW_80),
274+ EHT_GROUP( 2, EHT_GI_16, BW_80),
275+ EHT_GROUP( 3, EHT_GI_16, BW_80),
276+ EHT_GROUP( 4, EHT_GI_16, BW_80),
277+ EHT_GROUP( 5, EHT_GI_16, BW_80),
278+ EHT_GROUP( 6, EHT_GI_16, BW_80),
279+ EHT_GROUP( 7, EHT_GI_16, BW_80),
280+ EHT_GROUP( 8, EHT_GI_16, BW_80),
281+ EHT_GROUP( 9, EHT_GI_16, BW_80),
282+ EHT_GROUP(10, EHT_GI_16, BW_80),
283+ EHT_GROUP(11, EHT_GI_16, BW_80),
284+ EHT_GROUP(12, EHT_GI_16, BW_80),
285+ EHT_GROUP(13, EHT_GI_16, BW_80),
286+ EHT_GROUP(14, EHT_GI_16, BW_80),
287+ EHT_GROUP(15, EHT_GI_16, BW_80),
288+ EHT_GROUP(16, EHT_GI_16, BW_80),
289+
290+ EHT_GROUP( 1, EHT_GI_32, BW_80),
291+ EHT_GROUP( 2, EHT_GI_32, BW_80),
292+ EHT_GROUP( 3, EHT_GI_32, BW_80),
293+ EHT_GROUP( 4, EHT_GI_32, BW_80),
294+ EHT_GROUP( 5, EHT_GI_32, BW_80),
295+ EHT_GROUP( 6, EHT_GI_32, BW_80),
296+ EHT_GROUP( 7, EHT_GI_32, BW_80),
297+ EHT_GROUP( 8, EHT_GI_32, BW_80),
298+ EHT_GROUP( 9, EHT_GI_32, BW_80),
299+ EHT_GROUP(10, EHT_GI_32, BW_80),
300+ EHT_GROUP(11, EHT_GI_32, BW_80),
301+ EHT_GROUP(12, EHT_GI_32, BW_80),
302+ EHT_GROUP(13, EHT_GI_32, BW_80),
303+ EHT_GROUP(14, EHT_GI_32, BW_80),
304+ EHT_GROUP(15, EHT_GI_32, BW_80),
305+ EHT_GROUP(16, EHT_GI_32, BW_80),
306+
307+ EHT_GROUP( 1, EHT_GI_08, BW_160),
308+ EHT_GROUP( 2, EHT_GI_08, BW_160),
309+ EHT_GROUP( 3, EHT_GI_08, BW_160),
310+ EHT_GROUP( 4, EHT_GI_08, BW_160),
311+ EHT_GROUP( 5, EHT_GI_08, BW_160),
312+ EHT_GROUP( 6, EHT_GI_08, BW_160),
313+ EHT_GROUP( 7, EHT_GI_08, BW_160),
314+ EHT_GROUP( 8, EHT_GI_08, BW_160),
315+ EHT_GROUP( 9, EHT_GI_08, BW_160),
316+ EHT_GROUP(10, EHT_GI_08, BW_160),
317+ EHT_GROUP(11, EHT_GI_08, BW_160),
318+ EHT_GROUP(12, EHT_GI_08, BW_160),
319+ EHT_GROUP(13, EHT_GI_08, BW_160),
320+ EHT_GROUP(14, EHT_GI_08, BW_160),
321+ EHT_GROUP(15, EHT_GI_08, BW_160),
322+ EHT_GROUP(16, EHT_GI_08, BW_160),
323+
324+ EHT_GROUP( 1, EHT_GI_16, BW_160),
325+ EHT_GROUP( 2, EHT_GI_16, BW_160),
326+ EHT_GROUP( 3, EHT_GI_16, BW_160),
327+ EHT_GROUP( 4, EHT_GI_16, BW_160),
328+ EHT_GROUP( 5, EHT_GI_16, BW_160),
329+ EHT_GROUP( 6, EHT_GI_16, BW_160),
330+ EHT_GROUP( 7, EHT_GI_16, BW_160),
331+ EHT_GROUP( 8, EHT_GI_16, BW_160),
332+ EHT_GROUP( 9, EHT_GI_16, BW_160),
333+ EHT_GROUP(10, EHT_GI_16, BW_160),
334+ EHT_GROUP(11, EHT_GI_16, BW_160),
335+ EHT_GROUP(12, EHT_GI_16, BW_160),
336+ EHT_GROUP(13, EHT_GI_16, BW_160),
337+ EHT_GROUP(14, EHT_GI_16, BW_160),
338+ EHT_GROUP(15, EHT_GI_16, BW_160),
339+ EHT_GROUP(16, EHT_GI_16, BW_160),
340+
341+ EHT_GROUP( 1, EHT_GI_32, BW_160),
342+ EHT_GROUP( 2, EHT_GI_32, BW_160),
343+ EHT_GROUP( 3, EHT_GI_32, BW_160),
344+ EHT_GROUP( 4, EHT_GI_32, BW_160),
345+ EHT_GROUP( 5, EHT_GI_32, BW_160),
346+ EHT_GROUP( 6, EHT_GI_32, BW_160),
347+ EHT_GROUP( 7, EHT_GI_32, BW_160),
348+ EHT_GROUP( 8, EHT_GI_32, BW_160),
349+ EHT_GROUP( 9, EHT_GI_32, BW_160),
350+ EHT_GROUP(10, EHT_GI_32, BW_160),
351+ EHT_GROUP(11, EHT_GI_32, BW_160),
352+ EHT_GROUP(12, EHT_GI_32, BW_160),
353+ EHT_GROUP(13, EHT_GI_32, BW_160),
354+ EHT_GROUP(14, EHT_GI_32, BW_160),
355+ EHT_GROUP(15, EHT_GI_32, BW_160),
356+ EHT_GROUP(16, EHT_GI_32, BW_160),
357+
358+ EHT_GROUP( 1, EHT_GI_08, BW_320),
359+ EHT_GROUP( 2, EHT_GI_08, BW_320),
360+ EHT_GROUP( 3, EHT_GI_08, BW_320),
361+ EHT_GROUP( 4, EHT_GI_08, BW_320),
362+ EHT_GROUP( 5, EHT_GI_08, BW_320),
363+ EHT_GROUP( 6, EHT_GI_08, BW_320),
364+ EHT_GROUP( 7, EHT_GI_08, BW_320),
365+ EHT_GROUP( 8, EHT_GI_08, BW_320),
366+ EHT_GROUP( 9, EHT_GI_08, BW_320),
367+ EHT_GROUP(10, EHT_GI_08, BW_320),
368+ EHT_GROUP(11, EHT_GI_08, BW_320),
369+ EHT_GROUP(12, EHT_GI_08, BW_320),
370+ EHT_GROUP(13, EHT_GI_08, BW_320),
371+ EHT_GROUP(14, EHT_GI_08, BW_320),
372+ EHT_GROUP(15, EHT_GI_08, BW_320),
373+ EHT_GROUP(16, EHT_GI_08, BW_320),
374+
375+ EHT_GROUP( 1, EHT_GI_16, BW_320),
376+ EHT_GROUP( 2, EHT_GI_16, BW_320),
377+ EHT_GROUP( 3, EHT_GI_16, BW_320),
378+ EHT_GROUP( 4, EHT_GI_16, BW_320),
379+ EHT_GROUP( 5, EHT_GI_16, BW_320),
380+ EHT_GROUP( 6, EHT_GI_16, BW_320),
381+ EHT_GROUP( 7, EHT_GI_16, BW_320),
382+ EHT_GROUP( 8, EHT_GI_16, BW_320),
383+ EHT_GROUP( 9, EHT_GI_16, BW_320),
384+ EHT_GROUP(10, EHT_GI_16, BW_320),
385+ EHT_GROUP(11, EHT_GI_16, BW_320),
386+ EHT_GROUP(12, EHT_GI_16, BW_320),
387+ EHT_GROUP(13, EHT_GI_16, BW_320),
388+ EHT_GROUP(14, EHT_GI_16, BW_320),
389+ EHT_GROUP(15, EHT_GI_16, BW_320),
390+ EHT_GROUP(16, EHT_GI_16, BW_320),
391+
392+ EHT_GROUP( 1, EHT_GI_32, BW_320),
393+ EHT_GROUP( 2, EHT_GI_32, BW_320),
394+ EHT_GROUP( 3, EHT_GI_32, BW_320),
395+ EHT_GROUP( 4, EHT_GI_32, BW_320),
396+ EHT_GROUP( 5, EHT_GI_32, BW_320),
397+ EHT_GROUP( 6, EHT_GI_32, BW_320),
398+ EHT_GROUP( 7, EHT_GI_32, BW_320),
399+ EHT_GROUP( 8, EHT_GI_32, BW_320),
400+ EHT_GROUP( 9, EHT_GI_32, BW_320),
401+ EHT_GROUP(10, EHT_GI_32, BW_320),
402+ EHT_GROUP(11, EHT_GI_32, BW_320),
403+ EHT_GROUP(12, EHT_GI_32, BW_320),
404+ EHT_GROUP(13, EHT_GI_32, BW_320),
405+ EHT_GROUP(14, EHT_GI_32, BW_320),
406+ EHT_GROUP(15, EHT_GI_32, BW_320),
407+ EHT_GROUP(16, EHT_GI_32, BW_320),
408 };
409
410 static u32
411@@ -422,6 +751,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
412 case RATE_INFO_BW_160:
413 bw = BW_160;
414 break;
415+ case RATE_INFO_BW_320:
416+ bw = BW_320;
417+ break;
418 default:
419 WARN_ON_ONCE(1);
420 return 0;
421@@ -443,11 +775,20 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
422 idx = status->rate_idx;
423 group = HE_GROUP_IDX(streams, status->he_gi, bw);
424 break;
425+ case RX_ENC_EHT:
426+ streams = status->nss;
427+ idx = status->rate_idx;
428+ group = EHT_GROUP_IDX(streams, status->he_gi, bw);
429+ break;
430 default:
431 WARN_ON_ONCE(1);
432 return 0;
433 }
434
435+ if (WARN_ON_ONCE((status->encoding != RX_ENC_EHT && streams > 8) ||
436+ (status->encoding == RX_ENC_EHT && streams > 16)))
437+ return 0;
438+
439 if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
440 (status->encoding == RX_ENC_HE && streams > 8)))
441 return 0;
442@@ -517,7 +858,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
443 stat->nss = ri->nss;
444 stat->rate_idx = ri->mcs;
445
446- if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
447+ if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
448+ stat->encoding = RX_ENC_EHT;
449+ else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
450 stat->encoding = RX_ENC_HE;
451 else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
452 stat->encoding = RX_ENC_VHT;
453@@ -529,7 +872,7 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
454 if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
455 stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
456
457- stat->he_gi = ri->he_gi;
458+ stat->he_gi = (ri->flags & RATE_INFO_FLAGS_EHT_MCS) ? ri->eht_gi : ri->he_gi;
459
460 if (stat->encoding != RX_ENC_LEGACY)
461 return true;
462--
4632.18.0
464