[][MAC80211][misc][Add MT7996 external openwrt build]
[Description]
Add EHT support patches
Sync CMP2.0 Firmware (20230118)
[Release-log]
N/A
Change-Id: I57f73587515cae6a1fad40ce8a83f8094af5e08d
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7117487
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999901-mac80211-mtk-add-rate-duration-for-EHT-rate.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999901-mac80211-mtk-add-rate-duration-for-EHT-rate.patch
new file mode 100644
index 0000000..0675c5e
--- /dev/null
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999901-mac80211-mtk-add-rate-duration-for-EHT-rate.patch
@@ -0,0 +1,464 @@
+From 06ae5e66a56e6def22c1d4d61d75815f9b1f7ee2 Mon Sep 17 00:00:00 2001
+From: Evelyn Tsai <evelyn.tsai@mediatek.com>
+Date: Sun, 25 Dec 2022 22:43:46 +0800
+Subject: [PATCH 9999901/9999902] mac80211: mtk: add rate duration for EHT
+ rate.
+
+---
+ include/net/mac80211.h | 4 +-
+ net/mac80211/airtime.c | 349 ++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 348 insertions(+), 5 deletions(-)
+
+diff --git a/include/net/mac80211.h b/include/net/mac80211.h
+index dd9e834..f7fcefe 100644
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -1437,6 +1437,7 @@ enum mac80211_rx_encoding {
+ RX_ENC_HT,
+ RX_ENC_VHT,
+ RX_ENC_HE,
++ RX_ENC_EHT,
+ };
+
+ /**
+@@ -1499,8 +1500,7 @@ struct ieee80211_rx_status {
+ u32 flag;
+ u16 freq: 13, freq_offset: 1;
+ u8 enc_flags;
+- u8 encoding:2, bw:3, he_ru:3;
+- u8 he_gi:2, he_dcm:1;
++ u16 encoding:3, bw:3, he_ru:3, he_gi:2, he_dcm:1;
+ u8 rate_idx;
+ u8 nss;
+ u8 rx_flags;
+diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
+index e8ebd34..b1de6d0 100644
+--- a/net/mac80211/airtime.c
++++ b/net/mac80211/airtime.c
+@@ -55,10 +55,21 @@
+ #define HE_DURATION_S(shift, streams, gi, bps) \
+ (HE_DURATION(streams, gi, bps) >> shift)
+
++/* Transmit duration for the raw data part of an average sized packet */
++#define EHT_GI_08 HE_GI_08
++#define EHT_GI_16 HE_GI_16
++#define EHT_GI_32 HE_GI_32
++
++#define EHT_DURATION(streams, gi, bps) \
++ HE_DURATION(streams, gi, bps)
++#define EHT_DURATION_S(shift, streams, gi, bps) \
++ HE_DURATION_S(shift, streams, gi, bps)
++
+ #define BW_20 0
+ #define BW_40 1
+ #define BW_80 2
+ #define BW_160 3
++#define BW_320 4
+
+ /*
+ * Define group sort order: HT40 -> SGI -> #streams
+@@ -68,17 +79,26 @@
+ #define IEEE80211_VHT_STREAM_GROUPS 8 /* BW(=4) * SGI(=2) */
+
+ #define IEEE80211_HE_MAX_STREAMS 8
++#define IEEE80211_HE_STREAM_GROUPS 12 /* BW(=4) * GI(=3) */
++
++#define IEEE80211_EHT_MAX_STREAMS 16
++#define IEEE80211_EHT_STREAM_GROUPS 15 /* BW(=5) * GI(=3) */
+
+ #define IEEE80211_HT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
+ IEEE80211_HT_STREAM_GROUPS)
+ #define IEEE80211_VHT_GROUPS_NB (IEEE80211_MAX_STREAMS * \
+ IEEE80211_VHT_STREAM_GROUPS)
++#define IEEE80211_HE_GROUPS_NB (IEEE80211_HE_MAX_STREAMS * \
++ IEEE80211_HE_STREAM_GROUPS)
++#define IEEE80211_EHT_GROUPS_NB (IEEE80211_EHT_MAX_STREAMS * \
++ IEEE80211_EHT_STREAM_GROUPS)
+
+ #define IEEE80211_HT_GROUP_0 0
+ #define IEEE80211_VHT_GROUP_0 (IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
+ #define IEEE80211_HE_GROUP_0 (IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
++#define IEEE80211_EHT_GROUP_0 (IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
+
+-#define MCS_GROUP_RATES 12
++#define MCS_GROUP_RATES 14
+
+ #define HT_GROUP_IDX(_streams, _sgi, _ht40) \
+ IEEE80211_HT_GROUP_0 + \
+@@ -203,6 +223,59 @@
+ #define HE_GROUP(_streams, _gi, _bw) \
+ __HE_GROUP(_streams, _gi, _bw, \
+ HE_GROUP_SHIFT(_streams, _gi, _bw))
++
++#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1) \
++ (_bw == BW_320 ? r5 : _bw == BW_160 ? r4 : _bw == BW_80 ? r3 : _bw == BW_40 ? r2 : r1)
++
++#define EHT_GROUP_IDX(_streams, _gi, _bw) \
++ (IEEE80211_EHT_GROUP_0 + \
++ IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) + \
++ IEEE80211_EHT_MAX_STREAMS * (_gi) + \
++ (_streams) - 1)
++
++#define __EHT_GROUP(_streams, _gi, _bw, _s) \
++ [EHT_GROUP_IDX(_streams, _gi, _bw)] = { \
++ .shift = _s, \
++ .duration = { \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 3920, 1958, 979, 475, 230)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 5880, 2937, 1468, 705, 345)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 7840, 3916, 1958, 936, 475)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 11760, 5875, 2937, 1411, 705)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 15680, 7833, 3916, 1872, 936)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 17640, 8827, 4406, 2102, 1051)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 19600, 9806, 4896, 2347, 1166)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 23520, 11764, 5875, 2808, 1411)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 26133, 13060, 6523, 3124, 1555)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 29400, 14702, 7344, 3513, 1756)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 32666, 16329, 8164, 3902, 1944)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)), \
++ EHT_DURATION_S(_s, _streams, _gi, \
++ EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340)) \
++ } \
++}
++
++#define EHT_GROUP_SHIFT(_streams, _gi, _bw) \
++ GROUP_SHIFT(EHT_DURATION(_streams, _gi, \
++ EHT_BW2VBPS(_bw, 1960, 979, 489, 230, 115)))
++
++#define EHT_GROUP(_streams, _gi, _bw) \
++ __EHT_GROUP(_streams, _gi, _bw, \
++ EHT_GROUP_SHIFT(_streams, _gi, _bw))
++
+ struct mcs_group {
+ u8 shift;
+ u16 duration[MCS_GROUP_RATES];
+@@ -376,6 +449,262 @@ static const struct mcs_group airtime_mcs_groups[] = {
+ HE_GROUP(6, HE_GI_32, BW_160),
+ HE_GROUP(7, HE_GI_32, BW_160),
+ HE_GROUP(8, HE_GI_32, BW_160),
++
++ /* EHT */
++ EHT_GROUP( 1, EHT_GI_08, BW_20),
++ EHT_GROUP( 2, EHT_GI_08, BW_20),
++ EHT_GROUP( 3, EHT_GI_08, BW_20),
++ EHT_GROUP( 4, EHT_GI_08, BW_20),
++ EHT_GROUP( 5, EHT_GI_08, BW_20),
++ EHT_GROUP( 6, EHT_GI_08, BW_20),
++ EHT_GROUP( 7, EHT_GI_08, BW_20),
++ EHT_GROUP( 8, EHT_GI_08, BW_20),
++ EHT_GROUP( 9, EHT_GI_08, BW_20),
++ EHT_GROUP(10, EHT_GI_08, BW_20),
++ EHT_GROUP(11, EHT_GI_08, BW_20),
++ EHT_GROUP(12, EHT_GI_08, BW_20),
++ EHT_GROUP(13, EHT_GI_08, BW_20),
++ EHT_GROUP(14, EHT_GI_08, BW_20),
++ EHT_GROUP(15, EHT_GI_08, BW_20),
++ EHT_GROUP(16, EHT_GI_08, BW_20),
++
++ EHT_GROUP( 1, EHT_GI_16, BW_20),
++ EHT_GROUP( 2, EHT_GI_16, BW_20),
++ EHT_GROUP( 3, EHT_GI_16, BW_20),
++ EHT_GROUP( 4, EHT_GI_16, BW_20),
++ EHT_GROUP( 5, EHT_GI_16, BW_20),
++ EHT_GROUP( 6, EHT_GI_16, BW_20),
++ EHT_GROUP( 7, EHT_GI_16, BW_20),
++ EHT_GROUP( 8, EHT_GI_16, BW_20),
++ EHT_GROUP( 9, EHT_GI_16, BW_20),
++ EHT_GROUP(10, EHT_GI_16, BW_20),
++ EHT_GROUP(11, EHT_GI_16, BW_20),
++ EHT_GROUP(12, EHT_GI_16, BW_20),
++ EHT_GROUP(13, EHT_GI_16, BW_20),
++ EHT_GROUP(14, EHT_GI_16, BW_20),
++ EHT_GROUP(15, EHT_GI_16, BW_20),
++ EHT_GROUP(16, EHT_GI_16, BW_20),
++
++ EHT_GROUP( 1, EHT_GI_32, BW_20),
++ EHT_GROUP( 2, EHT_GI_32, BW_20),
++ EHT_GROUP( 3, EHT_GI_32, BW_20),
++ EHT_GROUP( 4, EHT_GI_32, BW_20),
++ EHT_GROUP( 5, EHT_GI_32, BW_20),
++ EHT_GROUP( 6, EHT_GI_32, BW_20),
++ EHT_GROUP( 7, EHT_GI_32, BW_20),
++ EHT_GROUP( 8, EHT_GI_32, BW_20),
++ EHT_GROUP( 9, EHT_GI_32, BW_20),
++ EHT_GROUP(10, EHT_GI_32, BW_20),
++ EHT_GROUP(11, EHT_GI_32, BW_20),
++ EHT_GROUP(12, EHT_GI_32, BW_20),
++ EHT_GROUP(13, EHT_GI_32, BW_20),
++ EHT_GROUP(14, EHT_GI_32, BW_20),
++ EHT_GROUP(15, EHT_GI_32, BW_20),
++ EHT_GROUP(16, EHT_GI_32, BW_20),
++
++ EHT_GROUP( 1, EHT_GI_08, BW_40),
++ EHT_GROUP( 2, EHT_GI_08, BW_40),
++ EHT_GROUP( 3, EHT_GI_08, BW_40),
++ EHT_GROUP( 4, EHT_GI_08, BW_40),
++ EHT_GROUP( 5, EHT_GI_08, BW_40),
++ EHT_GROUP( 6, EHT_GI_08, BW_40),
++ EHT_GROUP( 7, EHT_GI_08, BW_40),
++ EHT_GROUP( 8, EHT_GI_08, BW_40),
++ EHT_GROUP( 9, EHT_GI_08, BW_40),
++ EHT_GROUP(10, EHT_GI_08, BW_40),
++ EHT_GROUP(11, EHT_GI_08, BW_40),
++ EHT_GROUP(12, EHT_GI_08, BW_40),
++ EHT_GROUP(13, EHT_GI_08, BW_40),
++ EHT_GROUP(14, EHT_GI_08, BW_40),
++ EHT_GROUP(15, EHT_GI_08, BW_40),
++ EHT_GROUP(16, EHT_GI_08, BW_40),
++
++ EHT_GROUP( 1, EHT_GI_16, BW_40),
++ EHT_GROUP( 2, EHT_GI_16, BW_40),
++ EHT_GROUP( 3, EHT_GI_16, BW_40),
++ EHT_GROUP( 4, EHT_GI_16, BW_40),
++ EHT_GROUP( 5, EHT_GI_16, BW_40),
++ EHT_GROUP( 6, EHT_GI_16, BW_40),
++ EHT_GROUP( 7, EHT_GI_16, BW_40),
++ EHT_GROUP( 8, EHT_GI_16, BW_40),
++ EHT_GROUP( 9, EHT_GI_16, BW_40),
++ EHT_GROUP(10, EHT_GI_16, BW_40),
++ EHT_GROUP(11, EHT_GI_16, BW_40),
++ EHT_GROUP(12, EHT_GI_16, BW_40),
++ EHT_GROUP(13, EHT_GI_16, BW_40),
++ EHT_GROUP(14, EHT_GI_16, BW_40),
++ EHT_GROUP(15, EHT_GI_16, BW_40),
++ EHT_GROUP(16, EHT_GI_16, BW_40),
++
++ EHT_GROUP( 1, EHT_GI_32, BW_40),
++ EHT_GROUP( 2, EHT_GI_32, BW_40),
++ EHT_GROUP( 3, EHT_GI_32, BW_40),
++ EHT_GROUP( 4, EHT_GI_32, BW_40),
++ EHT_GROUP( 5, EHT_GI_32, BW_40),
++ EHT_GROUP( 6, EHT_GI_32, BW_40),
++ EHT_GROUP( 7, EHT_GI_32, BW_40),
++ EHT_GROUP( 8, EHT_GI_32, BW_40),
++ EHT_GROUP( 9, EHT_GI_32, BW_40),
++ EHT_GROUP(10, EHT_GI_32, BW_40),
++ EHT_GROUP(11, EHT_GI_32, BW_40),
++ EHT_GROUP(12, EHT_GI_32, BW_40),
++ EHT_GROUP(13, EHT_GI_32, BW_40),
++ EHT_GROUP(14, EHT_GI_32, BW_40),
++ EHT_GROUP(15, EHT_GI_32, BW_40),
++ EHT_GROUP(16, EHT_GI_32, BW_40),
++
++ EHT_GROUP( 1, EHT_GI_08, BW_80),
++ EHT_GROUP( 2, EHT_GI_08, BW_80),
++ EHT_GROUP( 3, EHT_GI_08, BW_80),
++ EHT_GROUP( 4, EHT_GI_08, BW_80),
++ EHT_GROUP( 5, EHT_GI_08, BW_80),
++ EHT_GROUP( 6, EHT_GI_08, BW_80),
++ EHT_GROUP( 7, EHT_GI_08, BW_80),
++ EHT_GROUP( 8, EHT_GI_08, BW_80),
++ EHT_GROUP( 9, EHT_GI_08, BW_80),
++ EHT_GROUP(10, EHT_GI_08, BW_80),
++ EHT_GROUP(11, EHT_GI_08, BW_80),
++ EHT_GROUP(12, EHT_GI_08, BW_80),
++ EHT_GROUP(13, EHT_GI_08, BW_80),
++ EHT_GROUP(14, EHT_GI_08, BW_80),
++ EHT_GROUP(15, EHT_GI_08, BW_80),
++ EHT_GROUP(16, EHT_GI_08, BW_80),
++
++ EHT_GROUP( 1, EHT_GI_16, BW_80),
++ EHT_GROUP( 2, EHT_GI_16, BW_80),
++ EHT_GROUP( 3, EHT_GI_16, BW_80),
++ EHT_GROUP( 4, EHT_GI_16, BW_80),
++ EHT_GROUP( 5, EHT_GI_16, BW_80),
++ EHT_GROUP( 6, EHT_GI_16, BW_80),
++ EHT_GROUP( 7, EHT_GI_16, BW_80),
++ EHT_GROUP( 8, EHT_GI_16, BW_80),
++ EHT_GROUP( 9, EHT_GI_16, BW_80),
++ EHT_GROUP(10, EHT_GI_16, BW_80),
++ EHT_GROUP(11, EHT_GI_16, BW_80),
++ EHT_GROUP(12, EHT_GI_16, BW_80),
++ EHT_GROUP(13, EHT_GI_16, BW_80),
++ EHT_GROUP(14, EHT_GI_16, BW_80),
++ EHT_GROUP(15, EHT_GI_16, BW_80),
++ EHT_GROUP(16, EHT_GI_16, BW_80),
++
++ EHT_GROUP( 1, EHT_GI_32, BW_80),
++ EHT_GROUP( 2, EHT_GI_32, BW_80),
++ EHT_GROUP( 3, EHT_GI_32, BW_80),
++ EHT_GROUP( 4, EHT_GI_32, BW_80),
++ EHT_GROUP( 5, EHT_GI_32, BW_80),
++ EHT_GROUP( 6, EHT_GI_32, BW_80),
++ EHT_GROUP( 7, EHT_GI_32, BW_80),
++ EHT_GROUP( 8, EHT_GI_32, BW_80),
++ EHT_GROUP( 9, EHT_GI_32, BW_80),
++ EHT_GROUP(10, EHT_GI_32, BW_80),
++ EHT_GROUP(11, EHT_GI_32, BW_80),
++ EHT_GROUP(12, EHT_GI_32, BW_80),
++ EHT_GROUP(13, EHT_GI_32, BW_80),
++ EHT_GROUP(14, EHT_GI_32, BW_80),
++ EHT_GROUP(15, EHT_GI_32, BW_80),
++ EHT_GROUP(16, EHT_GI_32, BW_80),
++
++ EHT_GROUP( 1, EHT_GI_08, BW_160),
++ EHT_GROUP( 2, EHT_GI_08, BW_160),
++ EHT_GROUP( 3, EHT_GI_08, BW_160),
++ EHT_GROUP( 4, EHT_GI_08, BW_160),
++ EHT_GROUP( 5, EHT_GI_08, BW_160),
++ EHT_GROUP( 6, EHT_GI_08, BW_160),
++ EHT_GROUP( 7, EHT_GI_08, BW_160),
++ EHT_GROUP( 8, EHT_GI_08, BW_160),
++ EHT_GROUP( 9, EHT_GI_08, BW_160),
++ EHT_GROUP(10, EHT_GI_08, BW_160),
++ EHT_GROUP(11, EHT_GI_08, BW_160),
++ EHT_GROUP(12, EHT_GI_08, BW_160),
++ EHT_GROUP(13, EHT_GI_08, BW_160),
++ EHT_GROUP(14, EHT_GI_08, BW_160),
++ EHT_GROUP(15, EHT_GI_08, BW_160),
++ EHT_GROUP(16, EHT_GI_08, BW_160),
++
++ EHT_GROUP( 1, EHT_GI_16, BW_160),
++ EHT_GROUP( 2, EHT_GI_16, BW_160),
++ EHT_GROUP( 3, EHT_GI_16, BW_160),
++ EHT_GROUP( 4, EHT_GI_16, BW_160),
++ EHT_GROUP( 5, EHT_GI_16, BW_160),
++ EHT_GROUP( 6, EHT_GI_16, BW_160),
++ EHT_GROUP( 7, EHT_GI_16, BW_160),
++ EHT_GROUP( 8, EHT_GI_16, BW_160),
++ EHT_GROUP( 9, EHT_GI_16, BW_160),
++ EHT_GROUP(10, EHT_GI_16, BW_160),
++ EHT_GROUP(11, EHT_GI_16, BW_160),
++ EHT_GROUP(12, EHT_GI_16, BW_160),
++ EHT_GROUP(13, EHT_GI_16, BW_160),
++ EHT_GROUP(14, EHT_GI_16, BW_160),
++ EHT_GROUP(15, EHT_GI_16, BW_160),
++ EHT_GROUP(16, EHT_GI_16, BW_160),
++
++ EHT_GROUP( 1, EHT_GI_32, BW_160),
++ EHT_GROUP( 2, EHT_GI_32, BW_160),
++ EHT_GROUP( 3, EHT_GI_32, BW_160),
++ EHT_GROUP( 4, EHT_GI_32, BW_160),
++ EHT_GROUP( 5, EHT_GI_32, BW_160),
++ EHT_GROUP( 6, EHT_GI_32, BW_160),
++ EHT_GROUP( 7, EHT_GI_32, BW_160),
++ EHT_GROUP( 8, EHT_GI_32, BW_160),
++ EHT_GROUP( 9, EHT_GI_32, BW_160),
++ EHT_GROUP(10, EHT_GI_32, BW_160),
++ EHT_GROUP(11, EHT_GI_32, BW_160),
++ EHT_GROUP(12, EHT_GI_32, BW_160),
++ EHT_GROUP(13, EHT_GI_32, BW_160),
++ EHT_GROUP(14, EHT_GI_32, BW_160),
++ EHT_GROUP(15, EHT_GI_32, BW_160),
++ EHT_GROUP(16, EHT_GI_32, BW_160),
++
++ EHT_GROUP( 1, EHT_GI_08, BW_320),
++ EHT_GROUP( 2, EHT_GI_08, BW_320),
++ EHT_GROUP( 3, EHT_GI_08, BW_320),
++ EHT_GROUP( 4, EHT_GI_08, BW_320),
++ EHT_GROUP( 5, EHT_GI_08, BW_320),
++ EHT_GROUP( 6, EHT_GI_08, BW_320),
++ EHT_GROUP( 7, EHT_GI_08, BW_320),
++ EHT_GROUP( 8, EHT_GI_08, BW_320),
++ EHT_GROUP( 9, EHT_GI_08, BW_320),
++ EHT_GROUP(10, EHT_GI_08, BW_320),
++ EHT_GROUP(11, EHT_GI_08, BW_320),
++ EHT_GROUP(12, EHT_GI_08, BW_320),
++ EHT_GROUP(13, EHT_GI_08, BW_320),
++ EHT_GROUP(14, EHT_GI_08, BW_320),
++ EHT_GROUP(15, EHT_GI_08, BW_320),
++ EHT_GROUP(16, EHT_GI_08, BW_320),
++
++ EHT_GROUP( 1, EHT_GI_16, BW_320),
++ EHT_GROUP( 2, EHT_GI_16, BW_320),
++ EHT_GROUP( 3, EHT_GI_16, BW_320),
++ EHT_GROUP( 4, EHT_GI_16, BW_320),
++ EHT_GROUP( 5, EHT_GI_16, BW_320),
++ EHT_GROUP( 6, EHT_GI_16, BW_320),
++ EHT_GROUP( 7, EHT_GI_16, BW_320),
++ EHT_GROUP( 8, EHT_GI_16, BW_320),
++ EHT_GROUP( 9, EHT_GI_16, BW_320),
++ EHT_GROUP(10, EHT_GI_16, BW_320),
++ EHT_GROUP(11, EHT_GI_16, BW_320),
++ EHT_GROUP(12, EHT_GI_16, BW_320),
++ EHT_GROUP(13, EHT_GI_16, BW_320),
++ EHT_GROUP(14, EHT_GI_16, BW_320),
++ EHT_GROUP(15, EHT_GI_16, BW_320),
++ EHT_GROUP(16, EHT_GI_16, BW_320),
++
++ EHT_GROUP( 1, EHT_GI_32, BW_320),
++ EHT_GROUP( 2, EHT_GI_32, BW_320),
++ EHT_GROUP( 3, EHT_GI_32, BW_320),
++ EHT_GROUP( 4, EHT_GI_32, BW_320),
++ EHT_GROUP( 5, EHT_GI_32, BW_320),
++ EHT_GROUP( 6, EHT_GI_32, BW_320),
++ EHT_GROUP( 7, EHT_GI_32, BW_320),
++ EHT_GROUP( 8, EHT_GI_32, BW_320),
++ EHT_GROUP( 9, EHT_GI_32, BW_320),
++ EHT_GROUP(10, EHT_GI_32, BW_320),
++ EHT_GROUP(11, EHT_GI_32, BW_320),
++ EHT_GROUP(12, EHT_GI_32, BW_320),
++ EHT_GROUP(13, EHT_GI_32, BW_320),
++ EHT_GROUP(14, EHT_GI_32, BW_320),
++ EHT_GROUP(15, EHT_GI_32, BW_320),
++ EHT_GROUP(16, EHT_GI_32, BW_320),
+ };
+
+ static u32
+@@ -422,6 +751,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
+ case RATE_INFO_BW_160:
+ bw = BW_160;
+ break;
++ case RATE_INFO_BW_320:
++ bw = BW_320;
++ break;
+ default:
+ WARN_ON_ONCE(1);
+ return 0;
+@@ -443,11 +775,20 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
+ idx = status->rate_idx;
+ group = HE_GROUP_IDX(streams, status->he_gi, bw);
+ break;
++ case RX_ENC_EHT:
++ streams = status->nss;
++ idx = status->rate_idx;
++ group = EHT_GROUP_IDX(streams, status->he_gi, bw);
++ break;
+ default:
+ WARN_ON_ONCE(1);
+ return 0;
+ }
+
++ if (WARN_ON_ONCE((status->encoding != RX_ENC_EHT && streams > 8) ||
++ (status->encoding == RX_ENC_EHT && streams > 16)))
++ return 0;
++
+ if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
+ (status->encoding == RX_ENC_HE && streams > 8)))
+ return 0;
+@@ -517,7 +858,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
+ stat->nss = ri->nss;
+ stat->rate_idx = ri->mcs;
+
+- if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
++ if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
++ stat->encoding = RX_ENC_EHT;
++ else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+ stat->encoding = RX_ENC_HE;
+ else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
+ stat->encoding = RX_ENC_VHT;
+@@ -529,7 +872,7 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
+ if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
+ stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
+
+- stat->he_gi = ri->he_gi;
++ stat->he_gi = (ri->flags & RATE_INFO_FLAGS_EHT_MCS) ? ri->eht_gi : ri->he_gi;
+
+ if (stat->encoding != RX_ENC_LEGACY)
+ return true;
+--
+2.18.0
+
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999902-mac80211-mtk-add-EHT-BA1024-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999902-mac80211-mtk-add-EHT-BA1024-support.patch
new file mode 100644
index 0000000..76dd9ef
--- /dev/null
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mac80211/patches/subsys/9999902-mac80211-mtk-add-EHT-BA1024-support.patch
@@ -0,0 +1,114 @@
+From 85dde30ef0509def7bfec494aef7e5395e656c50 Mon Sep 17 00:00:00 2001
+From: Evelyn Tsai <evelyn.tsai@mediatek.com>
+Date: Sun, 25 Dec 2022 22:43:46 +0800
+Subject: [PATCH 9999902/9999902] mac80211: mtk: add EHT BA1024 support
+
+---
+ include/linux/ieee80211.h | 2 ++
+ net/mac80211/agg-tx.c | 45 +++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 45 insertions(+), 2 deletions(-)
+
+diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
+index 6f70394..27321f2 100644
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -1270,6 +1270,8 @@ struct ieee80211_mgmt {
+ __le16 status;
+ __le16 capab;
+ __le16 timeout;
++ /* followed by BA Extension */
++ u8 variable[0];
+ } __packed addba_resp;
+ struct{
+ u8 action_code;
+diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
+index 318c71e..7f750c1 100755
+--- a/net/mac80211/agg-tx.c
++++ b/net/mac80211/agg-tx.c
+@@ -66,10 +66,17 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
+ struct ieee80211_local *local = sdata->local;
+ struct sk_buff *skb;
+ struct ieee80211_mgmt *mgmt;
++ struct ieee80211_addba_ext_ie *addba_ext;
++ u8 *pos;
+ u16 capab = 0;
+ bool amsdu = ieee80211_hw_check(&local->hw, SUPPORTS_AMSDU_IN_AMPDU);
+
+- skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
++ if (agg_size >= 1024)
++ skb = dev_alloc_skb(sizeof(*mgmt) +
++ 2 + sizeof(struct ieee80211_addba_ext_ie) +
++ local->hw.extra_tx_headroom);
++ else
++ skb = dev_alloc_skb(sizeof(*mgmt) + local->hw.extra_tx_headroom);
+
+ if (!skb)
+ return;
+@@ -108,6 +115,15 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
+ mgmt->u.action.u.addba_req.start_seq_num =
+ cpu_to_le16(start_seq_num << 4);
+
++ if (agg_size >= 1024 ) {
++ pos = skb_put_zero(skb, 2 + sizeof(struct ieee80211_addba_ext_ie));
++ *pos++ = WLAN_EID_ADDBA_EXT;
++ *pos++ = sizeof(struct ieee80211_addba_ext_ie);
++ addba_ext = (struct ieee80211_addba_ext_ie *)pos;
++ addba_ext->data = u8_encode_bits(agg_size >> IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT,
++ IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
++ }
++
+ ieee80211_tx_skb_tid(sdata, skb, tid, -1);
+ }
+
+@@ -469,8 +485,11 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
+ sta->ampdu_mlme.addba_req_num[tid]++;
+ spin_unlock_bh(&sta->lock);
+
+- if (sta->sta.deflink.he_cap.has_he) {
++ if (sta->sta.deflink.eht_cap.has_eht) {
+ buf_size = local->hw.max_tx_aggregation_subframes;
++ } else if (sta->sta.deflink.he_cap.has_he) {
++ buf_size = min_t(u16, local->hw.max_tx_aggregation_subframes,
++ IEEE80211_MAX_AMPDU_BUF_HE);
+ } else {
+ /*
+ * We really should use what the driver told us it will
+@@ -960,13 +979,35 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
+ {
+ struct tid_ampdu_tx *tid_tx;
+ struct ieee80211_txq *txq;
++ struct ieee802_11_elems *elems;
+ u16 capab, tid, buf_size;
+ bool amsdu;
++ int ext_ie_len;
+
+ capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
+ amsdu = capab & IEEE80211_ADDBA_PARAM_AMSDU_MASK;
+ tid = u16_get_bits(capab, IEEE80211_ADDBA_PARAM_TID_MASK);
+ buf_size = u16_get_bits(capab, IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK);
++ ext_ie_len = len - offsetof(struct ieee80211_mgmt,
++ u.action.u.addba_resp.variable);
++
++ if (ext_ie_len < 0)
++ goto next;
++
++ elems = ieee802_11_parse_elems(mgmt->u.action.u.addba_resp.variable,
++ ext_ie_len, true, NULL);
++
++ if (elems && !elems->parse_error) {
++ if (sta->sta.deflink.eht_cap.has_eht && elems->addba_ext_ie) {
++ u8 buf_size_1k = u8_get_bits(elems->addba_ext_ie->data,
++ IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
++ buf_size |= buf_size_1k << IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT;
++ }
++ }
++
++ if (elems)
++ kfree(elems);
++next:
+ buf_size = min(buf_size, local->hw.max_tx_aggregation_subframes);
+
+ txq = sta->sta.txq[tid];
+--
+2.18.0
+