[][openwrt-24][Release][Fix build fail of Wi-Fi7 MT76]
[Description]
Fix build fail of Wi-Fi7 MT76
[Release-log]
N/A
Change-Id: I390ff2c7d79ae8a3cdc73338054e8f3e6960d380
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9674812
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0002-mtk-mac80211-add-rate-duration-for-EHT-rate.patch b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0002-mtk-mac80211-add-rate-duration-for-EHT-rate.patch
deleted file mode 100644
index 45b334e..0000000
--- a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0002-mtk-mac80211-add-rate-duration-for-EHT-rate.patch
+++ /dev/null
@@ -1,441 +0,0 @@
-From 87774509ec7a9c7dea18a542eddd895dd2158b1a Mon Sep 17 00:00:00 2001
-From: Evelyn Tsai <evelyn.tsai@mediatek.com>
-Date: Wed, 28 Aug 2024 02:17:57 +0800
-
-mtk: mac80211: add rate duration for EHT rate.
-
----
- net/mac80211/airtime.c | 349 ++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 346 insertions(+), 3 deletions(-)
-
-diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
-index fdf8b65..370477c 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.45.2
-
diff --git a/autobuild/unified/filogic/mac80211/master/patches-base/0001-mt76-package-makefile.patch b/autobuild/unified/filogic/mac80211/master/patches-base/0001-mt76-package-makefile.patch
index cb1b6cb..959ac41 100644
--- a/autobuild/unified/filogic/mac80211/master/patches-base/0001-mt76-package-makefile.patch
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0001-mt76-package-makefile.patch
@@ -1,5 +1,5 @@
diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile
-index a07175d4d2..813f7b880a 100644
+index 4d808c9..296a1aa 100644
--- a/package/kernel/mt76/Makefile
+++ b/package/kernel/mt76/Makefile
@@ -233,7 +233,7 @@ endef
@@ -87,3 +87,4 @@
+$(eval $(call KernelPackage,mt7992-firmware))
$(eval $(call KernelPackage,mt76))
$(eval $(call BuildPackage,mt76-test))
+
diff --git a/autobuild/unified/filogic/mac80211/master/patches-base/0002-wifi-scripts-package-files.patch b/autobuild/unified/filogic/mac80211/master/patches-base/0002-wifi-scripts-package-files.patch
new file mode 100644
index 0000000..37f9da3
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0002-wifi-scripts-package-files.patch
@@ -0,0 +1,1120 @@
+diff --git a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+index 32b9d9d..df4f687 100644
+--- a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
++++ b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+@@ -60,7 +60,14 @@ hostapd_append_wpa_key_mgmt() {
+ append wpa_key_mgmt "WPA-EAP-SHA256"
+ ;;
+ sae)
+- append wpa_key_mgmt "SAE"
++ case "$encryption" in
++ *sae-ext*)
++ append wpa_key_mgmt "SAE-EXT-KEY"
++ ;;
++ *)
++ append wpa_key_mgmt "SAE"
++ ;;
++ esac
+ [ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-SAE"
+ ;;
+ psk-sae)
+@@ -119,6 +126,7 @@ hostapd_common_add_device_config() {
+ config_add_int rts_threshold
+ config_add_int rssi_reject_assoc_rssi
+ config_add_int rssi_ignore_probe_request
++ config_add_int rssi_reject_assoc_timeout
+ config_add_int maxassoc
+
+ config_add_string acs_chan_bias
+@@ -231,8 +239,10 @@ hostapd_prepare_device_config() {
+ hostapd_add_rate brlist "$br"
+ done
+
++ json_get_vars rssi_reject_assoc_timeout
+ [ -n "$rssi_reject_assoc_rssi" ] && append base_cfg "rssi_reject_assoc_rssi=$rssi_reject_assoc_rssi" "$N"
+ [ -n "$rssi_ignore_probe_request" ] && append base_cfg "rssi_ignore_probe_request=$rssi_ignore_probe_request" "$N"
++ [ -n "$rssi_reject_assoc_timeout" ] && append base_cfg "rssi_reject_assoc_timeout=$rssi_reject_assoc_timeout" "$N"
+ [ -n "$beacon_rate" ] && append base_cfg "beacon_rate=$beacon_rate" "$N"
+ [ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
+ [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
+@@ -386,6 +396,24 @@ hostapd_common_add_bss_config() {
+
+ config_add_boolean apup
+ config_add_string apup_peer_ifname_prefix
++
++ config_add_int disable_eht
++ config_add_int disable_he
++ config_add_int disable_vht
++ config_add_int disable_ht
++
++ config_add_boolean beacon_prot interworking
++
++ config_add_int unsol_bcast_probe_resp_interval
++ config_add_int fils_discovery_min_interval
++ config_add_int fils_discovery_max_interval
++ config_add_boolean rnr
++
++ config_add_array sae_groups
++ config_add_array owe_groups
++ config_add_array pairwise
++ config_add_string group_cipher
++ config_add_string group_mgmt_cipher
+ }
+
+ hostapd_set_vlan_file() {
+@@ -450,11 +478,11 @@ append_iw_nai_realm() {
+ }
+
+ append_iw_venue_name() {
+- append bss_conf "venue_name=$1" "$N"
++ [ -n "$1" ] && append bss_conf "venue_name=$1" "$N"
+ }
+
+ append_iw_venue_url() {
+- append bss_conf "venue_url=$1" "$N"
++ [ -n "$1" ] && append bss_conf "venue_url=$1" "$N"
+ }
+
+ append_hs20_oper_friendly_name() {
+@@ -572,7 +600,8 @@ hostapd_set_bss_options() {
+ ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \
+ multicast_to_unicast_all proxy_arp per_sta_vif \
+ eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id radius_server_clients radius_server_auth_port \
+- vendor_elements fils ocv apup
++ vendor_elements fils ocv apup unsol_bcast_probe_resp_interval fils_discovery_min_interval \
++ fils_discovery_max_interval rnr group_cipher group_mgmt_cipher
+
+ set_default fils 0
+ set_default isolate 0
+@@ -800,6 +829,36 @@ hostapd_set_bss_options() {
+ local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))"
+ append bss_conf "auth_algs=${auth_algs:-1}" "$N"
+ append bss_conf "wpa=$wpa" "$N"
++
++ json_get_values pairwise pairwise
++ json_get_vars group_cipher
++ if [ -n "$pairwise" ]; then
++ case "$pairwise" in
++ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
++ wpa_cipher="CCMP TKIP"
++ ;;
++ *ccmp256)
++ wpa_cipher="CCMP-256"
++ ;;
++ *aes|*ccmp)
++ wpa_cipher="CCMP"
++ ;;
++ *tkip)
++ wpa_cipher="TKIP"
++ ;;
++ *gcmp256)
++ wpa_cipher="GCMP-256"
++ ;;
++ *gcmp)
++ wpa_cipher="GCMP"
++ ;;
++ *)
++ wpa_cipher=""
++ ;;
++ esac
++ fi
++ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
++
+ [ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N"
+
+ set_default wps_pushbutton 0
+@@ -851,7 +910,7 @@ hostapd_set_bss_options() {
+ }
+
+ append bss_conf "ssid=$ssid" "$N"
+- [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N"
++ [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=$network_bridge" "$N"
+ [ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
+ [ -n "$iapp_interface" ] && {
+ local ifname
+@@ -916,6 +975,8 @@ hostapd_set_bss_options() {
+ fi
+
+ if [ "$wpa" -ge "2" ]; then
++ json_get_values sae_groups sae_groups
++ json_get_values owe_groups owe_groups
+ if [ "$ieee80211r" -gt "0" ]; then
+ json_get_vars mobility_domain ft_psk_generate_local ft_over_ds reassociation_deadline
+
+@@ -988,17 +1049,52 @@ hostapd_set_bss_options() {
+ append bss_conf "okc=$auth_cache" "$N"
+ [ "$auth_cache" = 0 -a "$fils" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
+
++ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
++
++ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
++ case "$auth_type" in
++ sae*)
++ append bss_conf "sae_groups=$sae_groups" "$N"
++ append bss_conf "group_cipher=$group_cipher" "$N"
++ ;;
++ owe)
++ append bss_conf "owe_groups=$owe_groups" "$N"
++ append bss_conf "group_cipher=$group_cipher" "$N"
++ ;;
++ esac
++ fi
++
+ # RSN -> allow management frame protection
+ case "$ieee80211w" in
+ [012])
+- json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout
++ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
+ append bss_conf "ieee80211w=$ieee80211w" "$N"
+ [ "$ieee80211w" -gt "0" ] && {
++ if [ -z "$group_mgmt_cipher" ]; then
++ case "$group_cipher" in
++ CCMP-256)
++ ieee80211w_mgmt_cipher="BIP-CMAC-256"
++ ;;
++ CCMP)
++ ieee80211w_mgmt_cipher="AES-128-CMAC"
++ ;;
++ GCMP-256)
++ ieee80211w_mgmt_cipher="BIP-GMAC-256"
++ ;;
++ GCMP)
++ ieee80211w_mgmt_cipher="BIP-GMAC-128"
++ ;;
++ esac
++ else
++ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
++ fi
+ if [ "$auth_type" = "eap192" ]; then
+ append bss_conf "group_mgmt_cipher=BIP-GMAC-256" "$N"
+ else
+ append bss_conf "group_mgmt_cipher=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N"
+ fi
++ [ -n "$beacon_prot" ] && \
++ append bss_conf "beacon_prot=$beacon_prot" "$N"
+ [ -n "$ieee80211w_max_timeout" ] && \
+ append bss_conf "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N"
+ [ -n "$ieee80211w_retry_timeout" ] && \
+@@ -1063,9 +1159,10 @@ hostapd_set_bss_options() {
+ json_get_vars iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm
+ json_get_vars iw_anqp_elem iw_qos_map_set iw_ipaddr_type_availability iw_gas_address3
+ json_get_vars iw_venue_name iw_venue_url
++ json_get_vars interworking
+
+ set_default iw_enabled 0
+- if [ "$iw_enabled" = "1" ]; then
++ if [ "$iw_enabled" = "1" ] || [ "$interworking" = "1" ]; then
+ append bss_conf "interworking=1" "$N"
+ set_default iw_internet 1
+ set_default iw_asra 0
+@@ -1184,6 +1281,22 @@ hostapd_set_bss_options() {
+ append bss_conf "$val" "$N"
+ done
+
++ if [ "$unsol_bcast_probe_resp_interval" -gt 0 ]; then
++ append bss_conf "unsol_bcast_probe_resp_interval=$unsol_bcast_probe_resp_interval" "$N"
++ fi
++
++ if [ -n "$fils_discovery_min_interval" ]; then
++ append bss_conf "fils_discovery_min_interval=$fils_discovery_min_interval" "$N"
++ fi
++
++ if [ -n "$fils_discovery_max_interval" ]; then
++ append bss_conf "fils_discovery_max_interval=$fils_discovery_max_interval" "$N"
++ fi
++
++ if [ -n "$rnr" ]; then
++ append bss_conf "rnr=$rnr" "$N"
++ fi
++
+ append "$var" "$bss_conf" "$N"
+ return 0
+ }
+@@ -1553,12 +1666,39 @@ wpa_supplicant_add_network() {
+ ;;
+ esac
+
+- [ "$wpa_cipher" = GCMP ] && {
+- append network_data "pairwise=GCMP" "$N$T"
+- append network_data "group=GCMP" "$N$T"
+- }
++ json_get_values pairwise pairwise
++ json_get_vars group_cipher group_mgmt_cipher
++ if [ -n "$pairwise" ]; then
++ case "$pairwise" in
++ *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
++ wpa_cipher="CCMP TKIP"
++ ;;
++ *ccmp256)
++ wpa_cipher="CCMP-256"
++ ;;
++ *aes|*ccmp)
++ wpa_cipher="CCMP"
++ ;;
++ *tkip)
++ wpa_cipher="TKIP"
++ ;;
++ *gcmp256)
++ wpa_cipher="GCMP-256"
++ ;;
++ *gcmp)
++ wpa_cipher="GCMP"
++ ;;
++ *)
++ wpa_cipher=""
++ ;;
++ esac
++ fi
++ [ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
+
+ [ "$mode" = mesh ] || {
++ json_get_values sae_groups sae_groups
++ json_get_values owe_groups owe_groups
++
+ case "$wpa" in
+ 1)
+ append network_data "proto=WPA" "$N$T"
+@@ -1568,12 +1708,58 @@ wpa_supplicant_add_network() {
+ ;;
+ esac
+
++ [ -n "$wpa_pairwise" ] && append network_data "pairwise=$wpa_pairwise" "$N$T"
++ [ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
++
++ if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
++ case "$auth_type" in
++ sae*)
++ echo "sae_groups=$sae_groups" >> "$_config"
++ append network_data "group=$group_cipher" "$N$T"
++ ;;
++ owe)
++ append network_data "owe_group=$owe_groups" "$N$T"
++ append network_data "group=$group_cipher" "$N$T"
++ ;;
++ esac
++ fi
++
++ # RSN -> allow management frame protection
+ case "$ieee80211w" in
+ [012])
+- [ "$wpa" -ge 2 ] && append network_data "ieee80211w=$ieee80211w" "$N$T"
++ json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
++ append network_data "ieee80211w=$ieee80211w" "$N$T"
++ [ "$ieee80211w" -gt "0" ] && {
++ if [ -z "$group_mgmt_cipher" ]; then
++ case "$group_cipher" in
++ CCMP-256)
++ ieee80211w_mgmt_cipher="BIP-CMAC-256"
++ ;;
++ CCMP)
++ ieee80211w_mgmt_cipher="AES-128-CMAC"
++ ;;
++ GCMP-256)
++ ieee80211w_mgmt_cipher="BIP-GMAC-256"
++ ;;
++ GCMP)
++ ieee80211w_mgmt_cipher="BIP-GMAC-128"
++ ;;
++ esac
++ else
++ ieee80211w_mgmt_cipher="$group_mgmt_cipher"
++ fi
++ if [ "$auth_type" = "eap192" ]; then
++ append network_data "group_mgmt=BIP-GMAC-256" "$N$T"
++ else
++ append network_data "group_mgmt=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N$T"
++ fi
++ [ -n "$beacon_prot" ] && \
++ append network_data "beacon_prot=$beacon_prot" "$N$T"
++ }
+ ;;
+ esac
+ }
++
+ [ -n "$bssid" ] && append network_data "bssid=$bssid" "$N$T"
+ [ -n "$beacon_int" ] && append network_data "beacon_int=$beacon_int" "$N$T"
+
+@@ -1584,6 +1770,20 @@ wpa_supplicant_add_network() {
+ [ -n "$bssid_blacklist" ] && append network_data "bssid_blacklist=$bssid_blacklist" "$N$T"
+ [ -n "$bssid_whitelist" ] && append network_data "bssid_whitelist=$bssid_whitelist" "$N$T"
+
++ local disable_eht
++ local disable_he
++ local disable_vht
++ local disable_ht
++ json_get_vars disable_eht
++ json_get_vars disable_he
++ json_get_vars disable_vht
++ json_get_vars disable_ht
++
++ [ -n "$disable_eht" ] && append network_data "disable_eht=$disable_eht" "$N$T"
++ [ -n "$disable_he" ] && append network_data "disable_he=$disable_he" "$N$T"
++ [ -n "$disable_vht" ] && append network_data "disable_vht=$disable_vht" "$N$T"
++ [ -n "$disable_ht" ] && append network_data "disable_ht=$disable_ht" "$N$T"
++
+ [ -n "$basic_rate" ] && {
+ local br rate_list=
+ for br in $basic_rate; do
+@@ -1598,6 +1798,11 @@ wpa_supplicant_add_network() {
+ append network_data "mcast_rate=$mc_rate" "$N$T"
+ }
+
++ if [ "$auth_type" = "sae" ]; then
++ json_get_vars sae_pwe sae_pwe
++ [ -n "$sae_pwe" ] && echo "sae_pwe=$sae_pwe" >> "$_config"
++ fi
++
+ if [ "$key_mgmt" = "WPS" ]; then
+ echo "wps_cred_processing=1" >> "$_config"
+ else
+diff --git a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+index 11b11c4..ecb317b 100755
+--- a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
++++ b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+@@ -29,10 +29,12 @@ drv_mac80211_init_device_config() {
+ config_add_string path phy 'macaddr:macaddr'
+ config_add_string tx_burst
+ config_add_string distance
++ config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval
+ config_add_int beacon_int chanbw frag rts
+ config_add_int rxantenna txantenna txpower min_tx_power
+ config_add_int num_global_macaddr multiple_bssid
+ config_add_boolean noscan ht_coex acs_exclude_dfs background_radar
++ config_add_boolean noscan ht_coex acs_exclude_dfs background_radar background_cert_mode
+ config_add_array ht_capab
+ config_add_array channels
+ config_add_array scan_list
+@@ -55,7 +57,10 @@ drv_mac80211_init_device_config() {
+ he_spr_sr_control \
+ he_spr_psr_enabled \
+ he_bss_color_enabled \
+- he_twt_required
++ he_twt_required \
++ he_twt_responder \
++ etxbfen \
++ itxbfen
+ config_add_int \
+ beamformer_antennas \
+ beamformee_antennas \
+@@ -142,13 +147,11 @@ mac80211_hostapd_setup_base() {
+ [ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
+ append base_cfg "acs_exclude_dfs=1" "$N"
+
+- json_get_vars noscan ht_coex min_tx_power:0 tx_burst
++ json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval
++ json_get_vars etxbfen:1 itxbfen:0
+ json_get_values ht_capab_list ht_capab
+ json_get_values channel_list channels
+
+- [ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \
+- channel_list="$channel"
+-
+ [ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power" "$N"
+
+ set_default noscan 0
+@@ -162,21 +165,42 @@ mac80211_hostapd_setup_base() {
+ ieee80211n=1
+ ht_capab=
+ case "$htmode" in
+- VHT20|HT20|HE20) ;;
+- HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160)
++ VHT20|HT20|HE20|EHT20) ;;
++ HT40*|VHT40|VHT80|VHT160|HE40*|HE80|HE160|EHT40*|EHT80|EHT160|EHT320*)
+ case "$hwmode" in
+ a)
+ case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
+ 1) ht_capab="[HT40+]";;
+ 0) ht_capab="[HT40-]";;
+ esac
++ case "$htmode" in
++ HT40-|HE40-|EHT40-)
++ if [ "$auto_channel" -gt 0 ]; then
++ ht_capab="[HT40-]"
++ fi
++ ;;
++ esac
+ ;;
+ *)
+ case "$htmode" in
+- HT40+) ht_capab="[HT40+]";;
+- HT40-) ht_capab="[HT40-]";;
++ HT40+|HE40+|EHT40+)
++ if [ "$channel" -gt 9 ]; then
++ echo "Could not set the center freq with this HT mode setting"
++ return 1
++ else
++ ht_capab="[HT40+]"
++ fi
++ ;;
++ HT40-|HE40-|EHT40-)
++ if [ "$channel" -lt 5 -a "$auto_channel" -eq 0 ]; then
++ echo "Could not set the center freq with this HT mode setting"
++ return 1
++ else
++ ht_capab="[HT40-]"
++ fi
++ ;;
+ *)
+- if [ "$channel" -lt 7 ]; then
++ if [ "$channel" -lt 7 -o "$auto_channel" -gt 0 ]; then
+ ht_capab="[HT40+]"
+ else
+ ht_capab="[HT40-]"
+@@ -185,7 +209,6 @@ mac80211_hostapd_setup_base() {
+ esac
+ ;;
+ esac
+- [ "$auto_channel" -gt 0 ] && ht_capab="[HT40+]"
+ ;;
+ *) ieee80211n= ;;
+ esac
+@@ -196,6 +219,11 @@ mac80211_hostapd_setup_base() {
+ set_default ht_coex 0
+ append base_cfg "ht_coex=$ht_coex" "$N"
+
++ [ "$ht_coex" -eq 1 ] && {
++ set_default obss_interval 300
++ append base_cfg "obss_interval=$obss_interval" "$N"
++ }
++
+ json_get_vars \
+ ldpc:1 \
+ greenfield:0 \
+@@ -207,7 +235,7 @@ mac80211_hostapd_setup_base() {
+ dsss_cck_40:1
+
+ ht_cap_mask=0
+- for cap in $(iw phy "$phy" info | grep 'Capabilities:' | cut -d: -f2); do
++ for cap in $(iw phy "$phy" info | grep 'Capabilities: 0x' | cut -d: -f2); do
+ ht_cap_mask="$(($ht_cap_mask | $cap))"
+ done
+
+@@ -238,8 +266,8 @@ mac80211_hostapd_setup_base() {
+
+ idx="$channel"
+ case "$htmode" in
+- VHT20|HE20) enable_ac=1;;
+- VHT40|HE40)
++ VHT20|HE20|EHT20) enable_ac=1;;
++ VHT40|HE40|EHT40)
+ case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
+ 1) idx=$(($channel + 2));;
+ 0) idx=$(($channel - 2));;
+@@ -247,7 +275,7 @@ mac80211_hostapd_setup_base() {
+ enable_ac=1
+ vht_center_seg0=$idx
+ ;;
+- VHT80|HE80)
++ VHT80|HE80|EHT80)
+ case "$(( (($channel / 4) + $chan_ofs) % 4 ))" in
+ 1) idx=$(($channel + 6));;
+ 2) idx=$(($channel + 2));;
+@@ -258,7 +286,7 @@ mac80211_hostapd_setup_base() {
+ vht_oper_chwidth=1
+ vht_center_seg0=$idx
+ ;;
+- VHT160|HE160)
++ VHT160|HE160|EHT160)
+ if [ "$band" = "6g" ]; then
+ case "$channel" in
+ 1|5|9|13|17|21|25|29) idx=15;;
+@@ -280,17 +308,57 @@ mac80211_hostapd_setup_base() {
+ vht_oper_chwidth=2
+ vht_center_seg0=$idx
+ ;;
++ EHT320*)
++ case "$channel" in
++ 1|5|9|13|17|21|25|29) idx=31;;
++ 33|37|41|45|49|53|57|61| \
++ 65|69|73|77|81|85|89|93) idx=63;;
++ 97|101|105|109|113|117|121|125| \
++ 129|133|137|141|145|149|153|157) idx=127;;
++ 161|165|169|173|177|181|185|189| \
++ 193|197|201|205|209|213|217|221) idx=191;;
++ esac
++ if [[ "$htmode" = "EHT320-1" && "$channel" -ge "193" ]] ||
++ [[ "$htmode" = "EHT320-2" && "$channel" -le "29" ]]; then
++ echo "Could not set the center freq with this EHT setting"
++ return 1
++ elif [[ "$htmode" = "EHT320-1" && "$channel" -ge "33" ]]; then
++ if [ "$channel" -gt $idx ]; then
++ idx=$(($idx + 32))
++ else
++ idx=$(($idx - 32))
++ fi
++ fi
++ vht_oper_chwidth=2
++ if [ "$channel" -gt $idx ]; then
++ vht_center_seg0=$(($idx + 16))
++ else
++ vht_center_seg0=$(($idx - 16))
++ fi
++ eht_oper_chwidth=9
++ eht_oper_centr_freq_seg0_idx=$idx
++
++ case $htmode in
++ EHT320-1) eht_bw320_offset=1;;
++ EHT320-2) eht_bw320_offset=2;;
++ EHT320) eht_bw320_offset=0;;
++ esac
++ ;;
+ esac
+ [ "$band" = "5g" ] && {
+- json_get_vars background_radar:0
++ json_get_vars \
++ background_radar:0 \
++ background_cert_mode:0 \
+
+ [ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N"
++ [ "$background_cert_mode" -eq 1 ] && append base_cfg "background_radar_mode=1" "$N"
+ }
+ [ "$band" = "6g" ] && {
+ op_class=
+ case "$htmode" in
+- HE20) op_class=131;;
+- HE*) op_class=$((132 + $vht_oper_chwidth))
++ HE20|EHT20) op_class=131;;
++ EHT320*) op_class=137;;
++ HE*|EHT*) op_class=$((132 + $vht_oper_chwidth))
+ esac
+ [ -n "$op_class" ] && append base_cfg "op_class=$op_class" "$N"
+ }
+@@ -318,7 +386,6 @@ mac80211_hostapd_setup_base() {
+ vht_link_adapt:3 \
+ vht160:2
+
+- set_default tx_burst 2.0
+ append base_cfg "ieee80211ac=1" "$N"
+ vht_cap=0
+ for cap in $(iw phy "$phy" info | awk -F "[()]" '/VHT Capabilities/ { print $2 }'); do
+@@ -337,6 +404,12 @@ mac80211_hostapd_setup_base() {
+ short_gi_160=0
+ }
+
++ [ "$etxbfen" -eq 0 ] && {
++ su_beamformer=0
++ su_beamformee=0
++ mu_beamformer=0
++ }
++
+ mac80211_add_capabilities vht_capab $vht_cap \
+ RXLDPC:0x10::$rxldpc \
+ SHORT-GI-80:0x20::$short_gi_80 \
+@@ -418,7 +491,7 @@ mac80211_hostapd_setup_base() {
+ # 802.11ax
+ enable_ax=0
+ case "$htmode" in
+- HE*) enable_ax=1 ;;
++ HE*|EHT*) enable_ax=1 ;;
+ esac
+
+ if [ "$enable_ax" != "0" ]; then
+@@ -427,10 +500,11 @@ mac80211_hostapd_setup_base() {
+ he_su_beamformee:1 \
+ he_mu_beamformer:1 \
+ he_twt_required:0 \
++ he_twt_responder \
+ he_spr_sr_control:3 \
+ he_spr_psr_enabled:0 \
+ he_spr_non_srg_obss_pd_max_offset:0 \
+- he_bss_color:128 \
++ he_bss_color \
+ he_bss_color_enabled:1
+
+ he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: .*AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
+@@ -444,6 +518,11 @@ mac80211_hostapd_setup_base() {
+ append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
+ }
+
++ [ "$etxbfen" -eq 0 ] && {
++ he_su_beamformer=0
++ he_mu_beamformer=0
++ }
++
+ mac80211_add_he_capabilities \
+ he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
+ he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
+@@ -451,7 +530,14 @@ mac80211_hostapd_setup_base() {
+ he_spr_psr_enabled:${he_phy_cap:14:2}:0x1:$he_spr_psr_enabled \
+ he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required
+
++ if [ -n "$he_twt_responder" ]; then
++ append base_cfg "he_twt_responder=$he_twt_responder" "$N"
++ fi
+ if [ "$he_bss_color_enabled" -gt 0 ]; then
++ if !([ "$he_bss_color" -gt 0 ] && [ "$he_bss_color" -le 64 ]); then
++ rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2)
++ he_bss_color=$((rand % 63 + 1))
++ fi
+ append base_cfg "he_bss_color=$he_bss_color" "$N"
+ [ "$he_spr_non_srg_obss_pd_max_offset" -gt 0 ] && { \
+ append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N"
+@@ -470,26 +556,58 @@ mac80211_hostapd_setup_base() {
+ append base_cfg "he_mu_edca_qos_info_q_ack=0" "$N"
+ append base_cfg "he_mu_edca_qos_info_queue_request=0" "$N"
+ append base_cfg "he_mu_edca_qos_info_txop_request=0" "$N"
+- append base_cfg "he_mu_edca_ac_be_aifsn=8" "$N"
++ append base_cfg "he_mu_edca_ac_be_aifsn=0" "$N"
+ append base_cfg "he_mu_edca_ac_be_aci=0" "$N"
+ append base_cfg "he_mu_edca_ac_be_ecwmin=9" "$N"
+ append base_cfg "he_mu_edca_ac_be_ecwmax=10" "$N"
+- append base_cfg "he_mu_edca_ac_be_timer=255" "$N"
+- append base_cfg "he_mu_edca_ac_bk_aifsn=15" "$N"
++ append base_cfg "he_mu_edca_ac_be_timer=3" "$N"
++ append base_cfg "he_mu_edca_ac_bk_aifsn=0" "$N"
+ append base_cfg "he_mu_edca_ac_bk_aci=1" "$N"
+ append base_cfg "he_mu_edca_ac_bk_ecwmin=9" "$N"
+ append base_cfg "he_mu_edca_ac_bk_ecwmax=10" "$N"
+- append base_cfg "he_mu_edca_ac_bk_timer=255" "$N"
++ append base_cfg "he_mu_edca_ac_bk_timer=3" "$N"
+ append base_cfg "he_mu_edca_ac_vi_ecwmin=5" "$N"
+ append base_cfg "he_mu_edca_ac_vi_ecwmax=7" "$N"
+- append base_cfg "he_mu_edca_ac_vi_aifsn=5" "$N"
++ append base_cfg "he_mu_edca_ac_vi_aifsn=0" "$N"
+ append base_cfg "he_mu_edca_ac_vi_aci=2" "$N"
+- append base_cfg "he_mu_edca_ac_vi_timer=255" "$N"
+- append base_cfg "he_mu_edca_ac_vo_aifsn=5" "$N"
++ append base_cfg "he_mu_edca_ac_vi_timer=3" "$N"
++ append base_cfg "he_mu_edca_ac_vo_aifsn=0" "$N"
+ append base_cfg "he_mu_edca_ac_vo_aci=3" "$N"
+ append base_cfg "he_mu_edca_ac_vo_ecwmin=5" "$N"
+ append base_cfg "he_mu_edca_ac_vo_ecwmax=7" "$N"
+- append base_cfg "he_mu_edca_ac_vo_timer=255" "$N"
++ append base_cfg "he_mu_edca_ac_vo_timer=3" "$N"
++ fi
++
++ set_default tx_burst 2
++
++ # 802.11be
++ enable_be=0
++ case "$htmode" in
++ EHT*) enable_be=1 ;;
++ esac
++
++ if [ "$enable_be" != "0" ]; then
++ append base_cfg "ieee80211be=1" "$N"
++ if [ "$etxbfen" -eq 0 ]; then
++ append base_cfg "eht_su_beamformee=1" "$N"
++ else
++ append base_cfg "eht_su_beamformer=1" "$N"
++ append base_cfg "eht_su_beamformee=1" "$N"
++ append base_cfg "eht_mu_beamformer=1" "$N"
++ fi
++ [ "$hwmode" = "a" ] && {
++ case $htmode in
++ EHT320*)
++ append base_cfg "eht_oper_chwidth=$eht_oper_chwidth" "$N"
++ append base_cfg "eht_oper_centr_freq_seg0_idx=$eht_oper_centr_freq_seg0_idx" "$N"
++ append base_cfg "eht_bw320_offset=$eht_bw320_offset" "$N"
++ ;;
++ *)
++ append base_cfg "eht_oper_chwidth=$vht_oper_chwidth" "$N"
++ append base_cfg "eht_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
++ ;;
++ esac
++ }
+ fi
+
+ hostapd_prepare_device_config "$hostapd_conf_file" nl80211
+@@ -498,6 +616,8 @@ ${channel:+channel=$channel}
+ ${channel_list:+chanlist=$channel_list}
+ ${hostapd_noscan:+noscan=1}
+ ${tx_burst:+tx_queue_data2_burst=$tx_burst}
++${mbssid:+mbssid=$mbssid}
++${rnr:+rnr=$rnr}
+ ${multiple_bssid:+mbssid=$multiple_bssid}
+ #num_global_macaddr=$num_global_macaddr
+ $base_cfg
+@@ -525,7 +645,7 @@ mac80211_hostapd_setup_bss() {
+ append hostapd_cfg "wds_sta=1" "$N"
+ [ -n "$wds_bridge" ] && append hostapd_cfg "wds_bridge=$wds_bridge" "$N"
+ }
+- [ "$staidx" -gt 0 -o "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
++ [ "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
+
+ cat >> /var/run/hostapd-$phy.conf <<EOF
+ $hostapd_cfg
+@@ -536,6 +656,31 @@ ${max_listen_int:+max_listen_interval=$max_listen_int}
+ EOF
+ }
+
++mac80211_generate_mbssid_mac() {
++ local phy="$1"
++ local transmitted_bssid="$2"
++ local id="${mbssidx:-0}"
++
++ local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)"
++
++ if [ -z "$transmitted_bssid" ]; then
++ transmitted_bssid=$ref
++ fi
++
++ if [ $id -eq 0 ]; then
++ echo "$transmitted_bssid"
++ return
++ fi
++
++ local oIFS="$IFS"; IFS=":"; set -- $transmitted_bssid; IFS="$oIFS"
++
++ # Calculate nontransmitted bssid
++ b6="0x$6"
++ ref_b6=$(($b6 % $max_mbssid))
++ b6=$(($b6 - $ref_b6 + ($ref_b6 + $id) % $max_mbssid))
++ printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $b6
++}
++
+ mac80211_get_addr() {
+ local phy="$1"
+ local idx="$(($2 + 1))"
+@@ -659,7 +804,19 @@ mac80211_prepare_vif() {
+ json_add_string _ifname "$ifname"
+
+ default_macaddr=
+- if [ -z "$macaddr" ]; then
++ if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
++ [ "$mbssidx" -eq 0 ] && {
++ if [ -z $macaddr ]; then
++ transmitted_bssid="$(mac80211_generate_mac $phy)"
++ else
++ # uci set mac address
++ transmitted_bssid=$macaddr
++ fi
++ macidx="$(($macidx + 1))"
++ }
++ macaddr="$(mac80211_generate_mbssid_mac $phy $transmitted_bssid)"
++ mbssidx="$(($mbssidx + 1))"
++ elif [ -z "$macaddr" ]; then
+ macaddr="$(mac80211_generate_mac $phy)"
+ macidx="$(($macidx + 1))"
+ default_macaddr=1
+@@ -918,6 +1075,14 @@ wpa_supplicant_set_config() {
+ }
+
+ hostapd_set_config() {
++
++ if [ "$inconsistent_country" -eq 1 ]; then
++ echo "ERROR: Please use the same country for all the radios."
++ wireless_setup_failed HOSTAPD_START_FAILED
++ drv_mac80211_teardown
++ return
++ fi
++
+ [ -n "$hostapd_ctrl" ] || {
+ ubus_call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"${hostapd_conf_file}.prev"'" }' > /dev/null
+ return 0;
+@@ -1001,6 +1166,9 @@ mac80211_setup_vif() {
+
+ json_select ..
+ [ -n "$failed" ] || wireless_add_vif "$name" "$ifname"
++
++ echo "Setup SMP Affinity"
++ /sbin/smp-mt76.sh
+ }
+
+ get_freq() {
+@@ -1052,6 +1220,25 @@ mac80211_reset_config() {
+ wdev_tool "$phy" set_config '{}'
+ }
+
++mac80211_count_ap() {
++ total_num_ap=$(($total_num_ap + 1))
++}
++
++country_consistent_check() {
++ local i
++ inconsistent_country=0
++ country_list="$(cat /etc/config/wireless | grep country | cut -d ' ' -f3 | tr -s "'\n" ' ')"
++ for i in $country_list
++ do
++ ret="$(echo $country_list | awk '{print ($2 == "" || $1 == $2)}')"
++ [ $ret = '0' ] && {
++ inconsistent_country=1
++ return
++ }
++ country_list="$(echo $country_list | sed -r 's/[A-Z]{2}( )*//')"
++ done
++}
++
+ drv_mac80211_setup() {
+ json_select config
+ json_get_vars \
+@@ -1060,7 +1247,8 @@ drv_mac80211_setup() {
+ txpower \
+ rxantenna txantenna \
+ frag rts beacon_int:100 htmode \
+- num_global_macaddr:1 multiple_bssid
++ num_global_macaddr:1 multiple_bssid \
++ sr_enable sr_enhanced
+ json_get_values basic_rate_list basic_rate
+ json_get_values scan_list scan_list
+ json_select ..
+@@ -1091,10 +1279,18 @@ drv_mac80211_setup() {
+ }
+ }
+
++ # each phy sleeps different times to prevent for ubus race condition.
++ if [ "$phy" = "phy1" ]; then
++ sleep 3;
++ elif [ "$phy" = "phy2" ]; then
++ sleep 6;
++ fi
++
+ hostapd_conf_file="/var/run/hostapd-$phy.conf"
+
+ macidx=0
+ staidx=0
++ mbssidx=0
+
+ [ -n "$chanbw" ] && {
+ for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
+@@ -1143,14 +1339,29 @@ drv_mac80211_setup() {
+
+ wpa_supplicant_init_config
+
++ total_num_ap=0
++ max_mbssid=1
++ for_each_interface "ap" mac80211_count_ap
++ total_num_ap=$(($total_num_ap - 1))
++ while [ $total_num_ap -gt 0 ]
++ do
++ total_num_ap=$(($total_num_ap >> 1))
++ max_mbssid=$(($max_mbssid << 1))
++ done
++
+ mac80211_prepare_iw_htmode
+ active_ifnames=
+ for_each_interface "ap sta adhoc mesh monitor" mac80211_prepare_vif
+ for_each_interface "ap sta adhoc mesh monitor" mac80211_setup_vif
+
++ country_consistent_check
++
+ [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_set_config "$phy"
+ [ -x /usr/sbin/hostapd ] && hostapd_set_config "$phy"
+
++ [ -n "$sr_enable" ] && echo "$sr_enable" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enable
++ [ -n "$sr_enhanced" ] && echo "$sr_enhanced" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enhanced_enable
++
+ [ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_start "$phy"
+
+ json_set_namespace wdev_uc prev
+diff --git a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc
+index 8f25a79..0f7bd72 100644
+--- a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc
++++ b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.uc
+@@ -3,7 +3,7 @@ import { readfile } from "fs";
+ import * as uci from 'uci';
+
+ const bands_order = [ "6G", "5G", "2G" ];
+-const htmode_order = [ "HE", "VHT", "HT" ];
++const htmode_order = [ "EHT", "HE", "VHT", "HT" ];
+
+ let board = json(readfile("/etc/board.json"));
+ if (!board.wlan)
+@@ -12,6 +12,7 @@ if (!board.wlan)
+ let idx = 0;
+ let commit;
+
++let random_mac_bytes = getenv("MT76_ENV_RANDOM_MAC_BYTES");
+ let config = uci.cursor().get_all("wireless") ?? {};
+
+ function radio_exists(path, macaddr, phy) {
+@@ -46,13 +47,11 @@ for (let phy_name, phy in board.wlan) {
+ continue;
+
+ let band = info.bands[band_name];
+- let channel = band.default_channel ?? "auto";
++ let channel = band.default_channel ?? "auto";
++ if (band_name == "6G")
++ channel = 37;
+
+ let width = band.max_width;
+- if (band_name == "2G")
+- width = 20;
+- else if (width > 80)
+- width = 80;
+
+ let htmode = filter(htmode_order, (m) => band[lc(m)])[0];
+ if (htmode)
+@@ -71,22 +70,77 @@ for (let phy_name, phy in board.wlan) {
+ if (match(phy_name, /^phy[0-9]/))
+ id = `path='${phy.path}'`;
+
++ let disabled = getenv("MT76_ENV_WM_TM") ? 1 : 0;
++ let noscan = 0;
++ let mbssid = 0;
++ let rnr = 0;
++ let background_radar = 0;
++ let encryption = "none";
++ let mbo = 0;
++ let band_idx = 0;
++ let ssid = "";
++
++ if (band_name == "6G") {
++ encryption = "sae";
++ mbo = 1;
++ band_idx = 2;
++ ssid = "OpenWrt-6g";
++ } else if (band_name == "5G") {
++ noscan = 1;
++ rnr = 1;
++ background_radar = 1;
++ band_idx = 1;
++ ssid = "OpenWrt-5g";
++ } else {
++ noscan = 1;
++ rnr = 1;
++ ssid = "OpenWrt-2g";
++ }
++
+ print(`set ${s}=wifi-device
+ set ${s}.type='mac80211'
+ set ${s}.${id}
+ set ${s}.band='${lc(band_name)}'
+ set ${s}.channel='${channel}'
+ set ${s}.htmode='${htmode}'
+-set ${s}.disabled='1'
++set ${s}.country='US'
++set ${s}.noscan=${noscan}
++set ${s}.disabled=${disabled}
+
+ set ${si}=wifi-iface
+ set ${si}.device='${name}'
+ set ${si}.network='lan'
+ set ${si}.mode='ap'
+-set ${si}.ssid='OpenWrt'
+-set ${si}.encryption='none'
++set ${si}.ssid=${ssid}
++set ${si}.encryption=${encryption}
++set ${si}.mbo=${mbo}
+
+ `);
++
++ if (mbssid)
++ print(`set ${s}.mbssid=${mbssid}
++`);
++ if (rnr)
++ print(`set ${s}.rnr=${rnr}
++`);
++ if (background_radar)
++ print(`set ${s}.background_radar=${background_radar}
++`);
++ if (getenv("MT76_ENV_TX_BURST_ZERO"))
++ print(`set ${s}.tx_burst=0.0
++`);
++ if (encryption == "sae")
++ print(`set ${si}.key=12345678
++set ${si}.sae_pwe=2
++set ${si}.ieee80211w=2
++`);
++ if (random_mac_bytes) {
++ print(`set ${si}.macaddr=00:0${idx - 1}:55:66${random_mac_bytes}
++`);
++ if (has_mlo)
++ print(`set ${si_mld}.macaddr=00:1${idx - 1}:55:66${random_mac_bytes}
++`);
++ }
+ commit = true;
+ }
+
+diff --git a/package/network/config/wifi-scripts/files/sbin/wifi b/package/network/config/wifi-scripts/files/sbin/wifi
+index f937dba..ba2d392 100755
+--- a/package/network/config/wifi-scripts/files/sbin/wifi
++++ b/package/network/config/wifi-scripts/files/sbin/wifi
+@@ -175,8 +175,33 @@ wifi_detect_notice() {
+ }
+
+ wifi_config() {
++ # Add sleep to prevent parsing before wifi modules get ready
++ sleep 1
++
+ [ -e /tmp/.config_pending ] && return
+ ucode /usr/share/hostap/wifi-detect.uc
++
++ if (dmesg | grep -q "WM_TM"); then
++ export MT76_ENV_WM_TM=1
++ fi
++
++ if (lspci | grep -q "7992"); then
++ export MT76_ENV_TX_BURST_ZERO=1
++ fi
++
++ if (dmesg | grep -q "eeprom load fail"); then
++ # generate random bytes for macaddr
++ rand=$(hexdump -C /dev/urandom | head -n 1 &)
++ killall hexdump
++
++ macaddr=""
++ for i in $(seq 2 3); do
++ macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
++ done
++
++ export MT76_ENV_RANDOM_MAC_BYTES=${macaddr}
++ fi
++
+ [ ! -f /etc/config/wireless ] && touch /etc/config/wireless
+ ucode /lib/wifi/mac80211.uc | uci -q batch
+
+diff --git a/package/network/config/wifi-scripts/files/usr/share/hostap/wifi-detect.uc b/package/network/config/wifi-scripts/files/usr/share/hostap/wifi-detect.uc
+index 109b6a3..16d3aba 100644
+--- a/package/network/config/wifi-scripts/files/usr/share/hostap/wifi-detect.uc
++++ b/package/network/config/wifi-scripts/files/usr/share/hostap/wifi-detect.uc
+@@ -117,10 +117,13 @@ function wiphy_detect() {
+
+ band_info.he = true;
+ he_phy_cap |= ift.he_cap_phy[0];
+- /* TODO: EHT */
++ /* FIXME: hardcode */
++ band_info.eht = true;
+ }
+
+- if (band_name != "2G" &&
++ if (band_name == "6G" && band_info.eht)
++ band_info.max_width = 320;
++ else if (band_name != "2G" &&
+ (he_phy_cap & 0x18) || ((band.vht_capa >> 2) & 0x3))
+ band_info.max_width = 160;
+ else if (band_name != "2G" &&
+@@ -138,13 +141,18 @@ function wiphy_detect() {
+ push(modes, "VHT20");
+ if (band_info.he)
+ push(modes, "HE20");
++ if (band_info.eht)
++ push(modes, "EHT20");
+ if (band.ht_capa & 0x2) {
+ push(modes, "HT40");
+ if (band_info.vht)
+ push(modes, "VHT40")
+ }
+- if (he_phy_cap & 0x2)
++ if (he_phy_cap & 0x2) {
+ push(modes, "HE40");
++ if (band_info.eht)
++ push(modes, "EHT40");
++ }
+
+ for (let freq in band.freqs) {
+ if (freq.disabled)
+@@ -160,12 +168,20 @@ function wiphy_detect() {
+ continue;
+ if (band_info.vht)
+ push(modes, "VHT80");
+- if (he_phy_cap & 4)
++ if (he_phy_cap & 4) {
+ push(modes, "HE80");
++ if (band_info.eht)
++ push(modes, "EHT80");
++ }
+ if ((band.vht_capa >> 2) & 0x3)
+ push(modes, "VHT160");
+- if (he_phy_cap & 0x18)
++ if (he_phy_cap & 0x18) {
+ push(modes, "HE160");
++ if (band_info.eht)
++ push(modes, "EHT160");
++ }
++ if (band_name == "6G" && band_info.eht)
++ push(modes, "EHT320");
+ }
+
+ let entry = wiphy_get_entry(name, path);
+
diff --git a/autobuild/unified/filogic/mac80211/master/patches-base/0003-hostapd-package-makefile-ucode-files.patch b/autobuild/unified/filogic/mac80211/master/patches-base/0003-hostapd-package-makefile-ucode-files.patch
index 4afe4e6..6f198ef 100644
--- a/autobuild/unified/filogic/mac80211/master/patches-base/0003-hostapd-package-makefile-ucode-files.patch
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0003-hostapd-package-makefile-ucode-files.patch
@@ -14,7 +14,7 @@
bool "Enable support for unsecure and obsolete WEP"
depends on PACKAGE_hostapd-common
diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile
-index b62592b..6318f85 100644
+index 1c0b654..3105b98 100644
--- a/package/network/services/hostapd/Makefile
+++ b/package/network/services/hostapd/Makefile
@@ -27,6 +27,7 @@ PKG_CONFIG_DEPENDS:= \
@@ -56,7 +56,7 @@
define Package/hostapd/install
diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc
-index dfddf81..72209ea 100644
+index 6774fbf..f9d9df8 100644
--- a/package/network/services/hostapd/files/hostapd.uc
+++ b/package/network/services/hostapd/files/hostapd.uc
@@ -61,6 +61,7 @@ start_disabled=1
@@ -109,7 +109,7 @@
}
function iface_add(phy, config, phy_status)
-@@ -745,6 +750,8 @@ let main_obj = {
+@@ -751,6 +756,8 @@ let main_obj = {
up: true,
frequency: 0,
sec_chan_offset: 0,
@@ -118,7 +118,7 @@
csa: true,
csa_count: 0,
},
-@@ -752,6 +759,15 @@ let main_obj = {
+@@ -758,6 +765,15 @@ let main_obj = {
if (req.args.up == null || !req.args.phy)
return libubus.STATUS_INVALID_ARGUMENT;
@@ -135,10 +135,10 @@
let config = hostapd.data.config[phy];
if (!config || !config.bss || !config.bss[0] || !config.bss[0].ifname)
diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc
-index 1709bb0..e320330 100644
+index 31d4534..36d0b9a 100644
--- a/package/network/services/hostapd/files/wpa_supplicant.uc
+++ b/package/network/services/hostapd/files/wpa_supplicant.uc
-@@ -263,6 +263,7 @@ function iface_hostapd_notify(phy, ifname, iface, state)
+@@ -266,6 +266,7 @@ function iface_hostapd_notify(phy, ifname, iface, state)
let status = iface.status();
let msg = { phy: phy };
@@ -146,7 +146,7 @@
switch (state) {
case "DISCONNECTED":
case "AUTHENTICATING":
-@@ -277,6 +278,8 @@ function iface_hostapd_notify(phy, ifname, iface, state)
+@@ -280,6 +281,8 @@ function iface_hostapd_notify(phy, ifname, iface, state)
msg.up = true;
msg.frequency = status.frequency;
msg.sec_chan_offset = status.sec_chan_offset;
@@ -155,7 +155,7 @@
break;
default:
return;
-@@ -293,6 +296,8 @@ function iface_channel_switch(phy, ifname, iface, info)
+@@ -296,6 +299,8 @@ function iface_channel_switch(phy, ifname, iface, info)
csa: true,
csa_count: info.csa_count ? info.csa_count - 1 : 0,
frequency: info.frequency,
diff --git a/autobuild/unified/filogic/mac80211/master/patches-base/0004-mac80211-package-makefile.patch b/autobuild/unified/filogic/mac80211/master/patches-base/0004-mac80211-package-makefile.patch
index 51bdefd..8736ff4 100644
--- a/autobuild/unified/filogic/mac80211/master/patches-base/0004-mac80211-package-makefile.patch
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0004-mac80211-package-makefile.patch
@@ -1,5 +1,5 @@
diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
-index aa022c9..a12901f 100644
+index 099bdae..2f75b74 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -22,6 +22,7 @@ PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz