[][openwrt-24][common][bsp][Add kernel6.6 Filogic880 BE19000/BE14000]
[Description]
Add kernel6.6 Filogic880 BE19000/BE14000.
[Release-log]
N/A
Change-Id: Iff3fb6c016e759c7fcc04eacebdec09866b98b55
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9587901
diff --git a/autobuild/unified/filogic/mac80211/BE19000/master/defconfig b/autobuild/unified/filogic/mac80211/BE19000/master/defconfig
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/BE19000/master/defconfig
diff --git a/autobuild/unified/filogic/mac80211/BE19000/master/defconfig_forced b/autobuild/unified/filogic/mac80211/BE19000/master/defconfig_forced
new file mode 100644
index 0000000..7734c57
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/BE19000/master/defconfig_forced
@@ -0,0 +1,6 @@
+# CONFIG_PACKAGE_kmod-mt7981-firmware is not set
+# CONFIG_PACKAGE_kmod-mt7986-firmware is not set
+# CONFIG_PACKAGE_kmod-mt7992-firmware is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7981-rfb is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7986a-rfb-nand is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7986b-rfb is not set
\ No newline at end of file
diff --git a/autobuild/unified/filogic/mac80211/BE19000/rules b/autobuild/unified/filogic/mac80211/BE19000/rules
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/BE19000/rules
diff --git a/autobuild/unified/filogic/mac80211/master/defconfig b/autobuild/unified/filogic/mac80211/master/defconfig
new file mode 100644
index 0000000..b944e31
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/defconfig
@@ -0,0 +1,10 @@
+CONFIG_PACKAGE_hostapd-utils=y
+CONFIG_PACKAGE_iperf3=y
+CONFIG_PACKAGE_iw-full=y
+CONFIG_PACKAGE_kmod-mt76=y
+CONFIG_PACKAGE_kmod-mt7992-firmware=y
+CONFIG_PACKAGE_kmod-mt7996-firmware=y
+CONFIG_PACKAGE_wpa-cli=y
+# CONFIG_PACKAGE_wpad-basic-mbedtls is not set
+CONFIG_PACKAGE_wpad-basic-openssl=y
+CONFIG_WPA_MSG_MIN_PRIORITY=2
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/600-world-regd-6GHz.patch b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/600-world-regd-6GHz.patch
new file mode 100644
index 0000000..34e6369
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/600-world-regd-6GHz.patch
@@ -0,0 +1,25 @@
+diff --git a/db.txt b/db.txt
+index 4f36062..0d7a170 100644
+--- a/db.txt
++++ b/db.txt
+@@ -26,6 +26,8 @@ country 00:
+ (5490 - 5730 @ 160), (20), NO-IR, DFS
+ # Channel 149 - 165
+ (5735 - 5835 @ 80), (20), NO-IR
++ # WiFi 6E
++ (5925 - 7125 @ 320), (12), NO-OUTDOOR
+ # IEEE 802.11ad (60GHz), channels 1..3
+ (57240 - 63720 @ 2160), (0)
+
+@@ -1727,7 +1729,7 @@ country US: DFS-FCC
+ (5850 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR
+ # 6g band
+ # https://www.federalregister.gov/documents/2020/05/26/2020-11236/unlicensed-use-of-the-6ghz-band
+- (5925 - 7125 @ 320), (12), NO-OUTDOOR, NO-IR
++ (5925 - 7125 @ 320), (12), NO-OUTDOOR
+ # 60g band
+ # reference: section IV-D https://docs.fcc.gov/public/attachments/FCC-16-89A1.pdf
+ # channels 1-6 EIRP=40dBm(43dBm peak)
+--
+2.36.1
+
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/700-world-regd-5G_UNII-4.patch b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/700-world-regd-5G_UNII-4.patch
new file mode 100644
index 0000000..38660ba
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/700-world-regd-5G_UNII-4.patch
@@ -0,0 +1,24 @@
+diff --git a/db.txt b/db.txt
+index 949c8d4..f20956b 100644
+--- a/db.txt
++++ b/db.txt
+@@ -24,8 +24,8 @@ country 00:
+ (5250 - 5330 @ 80), (20), NO-IR, DFS, AUTO-BW
+ # Channel 100 - 144
+ (5490 - 5730 @ 160), (20), NO-IR, DFS
+- # Channel 149 - 165
+- (5735 - 5835 @ 80), (20), NO-IR
++ # Channel 149 - 177
++ (5735 - 5895 @ 160), (20), NO-IR
+ # WiFi 6E
+ (5925 - 7125 @ 320), (12), NO-OUTDOOR
+ # IEEE 802.11ad (60GHz), channels 1..3
+@@ -1759,7 +1759,7 @@ country US: DFS-FCC
+ (5730 - 5850 @ 80), (30), AUTO-BW
+ # https://www.federalregister.gov/documents/2021/05/03/2021-08802/use-of-the-5850-5925-ghz-band
+ # max. 33 dBm AP @ 20MHz, 36 dBm AP @ 40Mhz+, 6 dB less for clients
+- (5850 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW, NO-IR
++ (5850 - 5895 @ 40), (27), NO-OUTDOOR, AUTO-BW
+ # 6g band
+ # https://www.federalregister.gov/documents/2020/05/26/2020-11236/unlicensed-use-of-the-6ghz-band
+ (5925 - 7125 @ 320), (12), NO-OUTDOOR
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/999-add-country-vv.patch b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/999-add-country-vv.patch
new file mode 100644
index 0000000..467dea7
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/firmware/wireless-regdb/patches/999-add-country-vv.patch
@@ -0,0 +1,18 @@
+diff --git a/db.txt b/db.txt
+index 3e442ba4..75642b04 100644
+--- a/db.txt
++++ b/db.txt
+@@ -1698,3 +1698,13 @@ country ZW: DFS-ETSI
+ (5250 - 5330 @ 80), (20), DFS, AUTO-BW
+ (5490 - 5710 @ 160), (27), DFS
+
++country VV:
++ # Channel 1 - 14.
++ (2402 - 2494 @ 40), (30)
++ # Channel 184 - 196
++ (4910 - 4990 @ 80), (30)
++ # Channel 36 - 177
++ (5150 - 5895 @ 160), (30)
++ (5030 - 5090 @ 20), (30)
++ # WiFi 6E
++ (5925 - 7125 @ 320), (200 mW), NO-OUTDOOR
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0001-mtk-mac80211-add-EHT-BA1024-support.patch b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0001-mtk-mac80211-add-EHT-BA1024-support.patch
new file mode 100644
index 0000000..f7e8315
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0001-mtk-mac80211-add-EHT-BA1024-support.patch
@@ -0,0 +1,117 @@
+From ce225a315119c4a961341653729745e57b1b183b Mon Sep 17 00:00:00 2001
+From: Howard Hsu <howard-yh.hsu@mediatek.com>
+Date: Tue, 20 Aug 2024 11:37:46 +0800
+Subject: [PATCH] mtk: mac80211: add EHT BA1024 support
+
+---
+ include/linux/ieee80211.h | 2 ++
+ net/mac80211/agg-tx.c | 47 +++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 47 insertions(+), 2 deletions(-)
+
+diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
+index 4fd9735..8ca8db9 100644
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -1393,6 +1393,8 @@ struct ieee80211_mgmt {
+ __le16 status;
+ __le16 capab;
+ __le16 timeout;
++ /* followed by BA Extension */
++ u8 variable[];
+ } __packed addba_resp;
+ struct{
+ u8 action_code;
+diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
+index 21d55dc..fefbf17 100644
+--- a/net/mac80211/agg-tx.c
++++ b/net/mac80211/agg-tx.c
+@@ -66,9 +66,16 @@ 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;
+
+- 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;
+@@ -106,6 +113,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);
+ }
+
+@@ -473,8 +489,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
+@@ -972,8 +991,10 @@ 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;
+
+ lockdep_assert_wiphy(sta->local->hw.wiphy);
+
+@@ -981,6 +1002,28 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
+ 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.45.2
+
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
new file mode 100644
index 0000000..45b334e
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mac80211/patches/subsys/0002-mtk-mac80211-add-rate-duration-for-EHT-rate.patch
@@ -0,0 +1,441 @@
+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/files/package/kernel/mt76/patches/0001-wifi-mt76-mt7996-support-mt7996-2-3-3-variant.patch b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/patches/0001-wifi-mt76-mt7996-support-mt7996-2-3-3-variant.patch
new file mode 100644
index 0000000..bc2f9f4
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/patches/0001-wifi-mt76-mt7996-support-mt7996-2-3-3-variant.patch
@@ -0,0 +1,179 @@
+From e891179880fe0791cc674877bc4e100c2c722c91 Mon Sep 17 00:00:00 2001
+From: Shayne Chen <shayne.chen@mediatek.com>
+Date: Mon, 17 Jun 2024 16:03:16 +0800
+Subject: [PATCH 1/2] wifi: mt76: mt7996: support mt7996 2+3+3 variant
+
+Add support for mt7996 tri-band 2+3+3 variant.
+
+Co-developed-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
+Change-Id: Idd7ed0033e1255018bd03b434d3bd3eacfde7153
+---
+ mt7996/eeprom.c | 2 ++
+ mt7996/init.c | 25 +++++++++++++++++++++++++
+ mt7996/mcu.c | 9 ++++++++-
+ mt7996/mt7996.h | 17 +++++++++++++++--
+ mt7996/regs.h | 1 +
+ 5 files changed, 51 insertions(+), 3 deletions(-)
+
+diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
+index 4a823711..7e2d585a 100644
+--- a/mt7996/eeprom.c
++++ b/mt7996/eeprom.c
+@@ -26,6 +26,8 @@ static char *mt7996_eeprom_name(struct mt7996_dev *dev)
+ {
+ switch (mt76_chip(&dev->mt76)) {
+ case 0x7990:
++ if (dev->var_type == MT7996_VAR_TYPE_233)
++ return MT7996_EEPROM_DEFAULT_233;
+ return MT7996_EEPROM_DEFAULT;
+ case 0x7992:
+ return MT7992_EEPROM_DEFAULT;
+diff --git a/mt7996/init.c b/mt7996/init.c
+index 5e969732..ab1a9a8e 100644
+--- a/mt7996/init.c
++++ b/mt7996/init.c
+@@ -884,6 +884,27 @@ out:
+ #endif
+ }
+
++static int mt7996_chip_variant_init(struct mt7996_dev *dev)
++{
++ u32 val = mt76_rr(dev, MT_PAD_GPIO);
++
++ switch (mt76_chip(&dev->mt76)) {
++ case 0x7990:
++ if (u32_get_bits(val, MT_PAD_GPIO_2ADIE_TBTC))
++ dev->var_type = MT7996_VAR_TYPE_233;
++ else
++ dev->var_type = MT7996_VAR_TYPE_444;
++ break;
++ case 0x7992:
++ dev->var_type = MT7992_VAR_TYPE_44;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
+ static int mt7996_init_hardware(struct mt7996_dev *dev)
+ {
+ int ret, idx;
+@@ -899,6 +920,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
+ INIT_LIST_HEAD(&dev->wed_rro.poll_list);
+ spin_lock_init(&dev->wed_rro.lock);
+
++ ret = mt7996_chip_variant_init(dev);
++ if (ret)
++ return ret;
++
+ ret = mt7996_dma_init(dev);
+ if (ret)
+ return ret;
+diff --git a/mt7996/mcu.c b/mt7996/mcu.c
+index 0a1e23e8..a638ef50 100644
+--- a/mt7996/mcu.c
++++ b/mt7996/mcu.c
+@@ -17,6 +17,11 @@
+ _fw = MT7992_##name; \
+ break; \
+ case 0x7990: \
++ if ((_dev)->var_type == MT7996_VAR_TYPE_233) \
++ _fw = MT7996_##name##_233; \
++ else \
++ _fw = MT7996_##name; \
++ break; \
+ default: \
+ _fw = MT7996_##name; \
+ break; \
+@@ -2851,6 +2856,7 @@ out:
+
+ static int mt7996_load_ram(struct mt7996_dev *dev)
+ {
++ const char *dsp_name;
+ int ret;
+
+ ret = __mt7996_load_ram(dev, "WM", fw_name(dev, FIRMWARE_WM),
+@@ -2858,7 +2864,8 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
+ if (ret)
+ return ret;
+
+- ret = __mt7996_load_ram(dev, "DSP", fw_name(dev, FIRMWARE_DSP),
++ dsp_name = is_mt7996(&dev->mt76) ? MT7996_FIRMWARE_DSP : MT7992_FIRMWARE_DSP;
++ ret = __mt7996_load_ram(dev, "DSP", dsp_name,
+ MT7996_RAM_TYPE_DSP);
+ if (ret)
+ return ret;
+diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
+index ab8c9070..e9fc6134 100644
+--- a/mt7996/mt7996.h
++++ b/mt7996/mt7996.h
+@@ -34,12 +34,17 @@
+ #define MT7996_FIRMWARE_DSP "mediatek/mt7996/mt7996_dsp.bin"
+ #define MT7996_ROM_PATCH "mediatek/mt7996/mt7996_rom_patch.bin"
+
++#define MT7996_FIRMWARE_WA_233 "mediatek/mt7996/mt7996_wa_233.bin"
++#define MT7996_FIRMWARE_WM_233 "mediatek/mt7996/mt7996_wm_233.bin"
++#define MT7996_ROM_PATCH_233 "mediatek/mt7996/mt7996_rom_patch_233.bin"
++
+ #define MT7992_FIRMWARE_WA "mediatek/mt7996/mt7992_wa.bin"
+ #define MT7992_FIRMWARE_WM "mediatek/mt7996/mt7992_wm.bin"
+ #define MT7992_FIRMWARE_DSP "mediatek/mt7996/mt7992_dsp.bin"
+ #define MT7992_ROM_PATCH "mediatek/mt7996/mt7992_rom_patch.bin"
+
+ #define MT7996_EEPROM_DEFAULT "mediatek/mt7996/mt7996_eeprom.bin"
++#define MT7996_EEPROM_DEFAULT_233 "mediatek/mt7996/mt7996_eeprom_233.bin"
+ #define MT7992_EEPROM_DEFAULT "mediatek/mt7996/mt7992_eeprom.bin"
+ #define MT7996_EEPROM_SIZE 7680
+ #define MT7996_EEPROM_BLOCK_SIZE 16
+@@ -89,6 +94,14 @@ struct mt7996_sta;
+ struct mt7996_dfs_pulse;
+ struct mt7996_dfs_pattern;
+
++enum mt7996_var_type {
++ MT7996_VAR_TYPE_444,
++ MT7996_VAR_TYPE_233,
++
++ /* mt7992 */
++ MT7992_VAR_TYPE_44,
++};
++
+ enum mt7996_ram_type {
+ MT7996_RAM_TYPE_WM,
+ MT7996_RAM_TYPE_WA,
+@@ -329,6 +342,7 @@ struct mt7996_dev {
+ spinlock_t reg_lock;
+
+ u8 wtbl_size_group;
++ u8 var_type;
+ };
+
+ enum {
+@@ -406,8 +420,7 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
+ return band <= MT_BAND1;
+
+ /* tri-band support */
+- if (band <= MT_BAND2 &&
+- mt76_get_field(dev, MT_PAD_GPIO, MT_PAD_GPIO_ADIE_COMB) <= 1)
++ if (band <= MT_BAND2 && dev->var_type)
+ return true;
+
+ return band == MT_BAND0 || band == MT_BAND2;
+diff --git a/mt7996/regs.h b/mt7996/regs.h
+index 47b429d8..734abec4 100644
+--- a/mt7996/regs.h
++++ b/mt7996/regs.h
+@@ -662,6 +662,7 @@ enum offs_rev {
+
+ #define MT_PAD_GPIO 0x700056f0
+ #define MT_PAD_GPIO_ADIE_COMB GENMASK(16, 15)
++#define MT_PAD_GPIO_2ADIE_TBTC BIT(19)
+
+ #define MT_HW_REV 0x70010204
+ #define MT_HW_REV1 0x8a00
+--
+2.45.2
+
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/patches/0002-wifi-mt76-mt7996-background-radar-cap-check-for-2-3-.patch b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/patches/0002-wifi-mt76-mt7996-background-radar-cap-check-for-2-3-.patch
new file mode 100644
index 0000000..21e675a
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/patches/0002-wifi-mt76-mt7996-background-radar-cap-check-for-2-3-.patch
@@ -0,0 +1,59 @@
+From c307a3423ced37be475dd18adf65886aa8bb54d8 Mon Sep 17 00:00:00 2001
+From: Shayne Chen <shayne.chen@mediatek.com>
+Date: Fri, 30 Aug 2024 19:28:21 +0800
+Subject: [PATCH 2/2] wifi: mt76: mt7996: background radar cap check for 2+3+3
+ sku
+
+Change-Id: I75928ec859f8f35692eabf17d1771df7f0da799b
+---
+ mt7996/init.c | 7 ++++---
+ mt7996/mt7996.h | 15 +++++++++++++++
+ 2 files changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/mt7996/init.c b/mt7996/init.c
+index ab1a9a8e..03dfe5dc 100644
+--- a/mt7996/init.c
++++ b/mt7996/init.c
+@@ -390,9 +390,10 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
+ wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
+
+- if (!mdev->dev->of_node ||
+- !of_property_read_bool(mdev->dev->of_node,
+- "mediatek,disable-radar-background"))
++ if (mt7996_get_background_radar_cap(phy->dev) &&
++ (!mdev->dev->of_node ||
++ !of_property_read_bool(mdev->dev->of_node,
++ "mediatek,disable-radar-background")))
+ wiphy_ext_feature_set(wiphy,
+ NL80211_EXT_FEATURE_RADAR_BACKGROUND);
+
+diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
+index e9fc6134..e7386a90 100644
+--- a/mt7996/mt7996.h
++++ b/mt7996/mt7996.h
+@@ -426,6 +426,21 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
+ return band == MT_BAND0 || band == MT_BAND2;
+ }
+
++static inline bool
++mt7996_get_background_radar_cap(struct mt7996_dev *dev)
++{
++ switch (mt76_chip(&dev->mt76)) {
++ case 0x7990:
++ if (dev->var_type == MT7996_VAR_TYPE_233)
++ return false;
++ break;
++ default:
++ break;
++ }
++
++ return true;
++}
++
+ extern const struct ieee80211_ops mt7996_ops;
+ extern struct pci_driver mt7996_pci_driver;
+ extern struct pci_driver mt7996_hif_driver;
+--
+2.45.2
+
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin
new file mode 100644
index 0000000..ed3597b
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin
new file mode 100644
index 0000000..37511a9
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin
new file mode 100644
index 0000000..19aec4c
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2e5e.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2e5e.bin
new file mode 100644
index 0000000..20c5908
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2e5e.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2i5i.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2i5i.bin
new file mode 100644
index 0000000..b0894b6
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_23_2i5i.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2e5e.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2e5e.bin
new file mode 100644
index 0000000..5d567db
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2e5e.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5e.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5e.bin
new file mode 100644
index 0000000..226e2b3
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5e.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5i.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5i.bin
new file mode 100644
index 0000000..cae73ac
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_eeprom_2i5i.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin
new file mode 100644
index 0000000..dfc722e
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin
new file mode 100644
index 0000000..1fb990b
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin
new file mode 100644
index 0000000..6feaa4d
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin
new file mode 100644
index 0000000..3489c57
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin
new file mode 100644
index 0000000..c15a207
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin
new file mode 100644
index 0000000..d6bedba
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin
new file mode 100644
index 0000000..542cd54
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin
new file mode 100644
index 0000000..132beb0
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin
new file mode 100644
index 0000000..46b92ed
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin
new file mode 100644
index 0000000..a6a4a71
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin
new file mode 100644
index 0000000..db10ce2
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin
new file mode 100644
index 0000000..91cd9ae
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin
new file mode 100644
index 0000000..45fd63d
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom.bin
new file mode 100644
index 0000000..6fb81b6
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233.bin
new file mode 100644
index 0000000..11eaa85
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233_2i5i6i.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233_2i5i6i.bin
new file mode 100644
index 0000000..11eaa85
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_233_2i5i6i.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_2i5i6i.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_2i5i6i.bin
new file mode 100644
index 0000000..5ad238a
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_2i5i6i.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_dual_404.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_dual_404.bin
new file mode 100644
index 0000000..b490256
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_eeprom_dual_404.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin
new file mode 100644
index 0000000..8538d92
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin
new file mode 100644
index 0000000..f729c9a
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin
new file mode 100644
index 0000000..73a281b
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin
new file mode 100644
index 0000000..d8b85e0
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin
new file mode 100644
index 0000000..8d5fd6e
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin
new file mode 100644
index 0000000..95ab39f
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin
new file mode 100644
index 0000000..ce1e3f4
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin
new file mode 100644
index 0000000..13684f1
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin
Binary files differ
diff --git a/autobuild/unified/filogic/mac80211/master/files/package/network/services/hostapd/patches/mtk-0001-ieee80211be-build-pass.patch b/autobuild/unified/filogic/mac80211/master/files/package/network/services/hostapd/patches/mtk-0001-ieee80211be-build-pass.patch
new file mode 100644
index 0000000..dbe8ba3
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/files/package/network/services/hostapd/patches/mtk-0001-ieee80211be-build-pass.patch
@@ -0,0 +1,52 @@
+diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
+index 695b190..5c69fa4 100644
+--- a/src/ap/hostapd.h
++++ b/src/ap/hostapd.h
+@@ -827,6 +827,15 @@ int hostapd_link_remove(struct hostapd_data *hapd, u32 count);
+ _link && _link->conf->mld_ap && \
+ _link->conf->mld_id == _mld_id; \
+ _link = NULL)
++static inline bool ap_sta_is_mld(struct hostapd_data *hapd,
++ struct sta_info *sta)
++{
++#ifdef CONFIG_IEEE80211BE
++ return hapd->conf->mld_ap && sta && sta->mld_info.mld_sta;
++#else /* CONFIG_IEEE80211BE */
++ return false;
++#endif /* CONFIG_IEEE80211BE */
++}
+ #else /* CONFIG_IEEE80211BE */
+ #define for_each_mld_link(_link, _bss_idx, _iface_idx, _ifaces, _mld_id) \
+ if (false)
+diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h
+index 2bab789..dfb5e98 100644
+--- a/src/ap/sta_info.h
++++ b/src/ap/sta_info.h
+@@ -17,7 +17,6 @@
+ #include "common/sae.h"
+ #include "crypto/sha384.h"
+ #include "pasn/pasn_common.h"
+-#include "hostapd.h"
+
+ /* STA flags */
+ #define WLAN_STA_AUTH BIT(0)
+@@ -417,16 +416,6 @@ int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta);
+
+ void ap_free_sta_pasn(struct hostapd_data *hapd, struct sta_info *sta);
+
+-static inline bool ap_sta_is_mld(struct hostapd_data *hapd,
+- struct sta_info *sta)
+-{
+-#ifdef CONFIG_IEEE80211BE
+- return hapd->conf->mld_ap && sta && sta->mld_info.mld_sta;
+-#else /* CONFIG_IEEE80211BE */
+- return false;
+-#endif /* CONFIG_IEEE80211BE */
+-}
+-
+ static inline void ap_sta_set_mld(struct sta_info *sta, bool mld)
+ {
+ #ifdef CONFIG_IEEE80211BE
+--
+2.18.0
+
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
new file mode 100644
index 0000000..cb1b6cb
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0001-mt76-package-makefile.patch
@@ -0,0 +1,89 @@
+diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile
+index a07175d4d2..813f7b880a 100644
+--- a/package/kernel/mt76/Makefile
++++ b/package/kernel/mt76/Makefile
+@@ -233,7 +233,7 @@ endef
+
+ define KernelPackage/mt7915e
+ $(KernelPackage/mt76-default)
+- TITLE:=MediaTek MT7915e wireless driver
++ TITLE:=MediaTek MT7915e/MT7986/MT7916 wireless driver
+ DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac +kmod-hwmon-core +kmod-thermal +@DRIVER_11AX_SUPPORT +@KERNEL_RELAY
+ FILES:= $(PKG_BUILD_DIR)/mt7915/mt7915e.ko
+ AUTOLOAD:=$(call AutoProbe,mt7915e)
+@@ -317,12 +317,18 @@ endef
+
+ define KernelPackage/mt7996e
+ $(KernelPackage/mt76-default)
+- TITLE:=MediaTek MT7996E wireless driver
+- DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac +kmod-hwmon-core +@DRIVER_11AX_SUPPORT +@KERNEL_RELAY
++ TITLE:=MediaTek MT7996/MT7995/MT7919 wireless driver
++ DEPENDS+=@PCI_SUPPORT +kmod-mt76-core +kmod-mt76-connac +kmod-hwmon-core +kmod-thermal +@DRIVER_11AX_SUPPORT +@DRIVER_11BE_SUPPORT +@KERNEL_RELAY
+ FILES:= $(PKG_BUILD_DIR)/mt7996/mt7996e.ko
+ AUTOLOAD:=$(call AutoProbe,mt7996e)
+ endef
+
++define KernelPackage/mt7992-firmware
++ $(KernelPackage/mt76-default)
++ TITLE:=MediaTek MT7992 firmware
++ DEPENDS+=+kmod-mt7996e
++endef
++
+ define KernelPackage/mt7996-firmware
+ $(KernelPackage/mt76-default)
+ TITLE:=MediaTek MT7996 firmware
+@@ -382,6 +388,11 @@ ifdef CONFIG_PACKAGE_MAC80211_MESH
+ NOSTDINC_FLAGS += -DCONFIG_MAC80211_MESH
+ endif
+
++ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS
++ NOSTDINC_FLAGS += -DCONFIG_MAC80211_DEBUGFS
++ PKG_MAKE_FLAGS += CONFIG_MAC80211_DEBUGFS=y
++endif
++
+ ifdef CONFIG_PACKAGE_CFG80211_TESTMODE
+ NOSTDINC_FLAGS += -DCONFIG_NL80211_TESTMODE
+ PKG_MAKE_FLAGS += CONFIG_NL80211_TESTMODE=y
+@@ -638,6 +649,35 @@ define KernelPackage/mt7996-firmware/install
+ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_rom_patch.bin \
+ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wa.bin \
+ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wm.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wm_tm.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_eeprom_2i5i6i.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_rom_patch_233.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wa_233.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wm_233.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_wm_tm_233.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_eeprom_233.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7996_eeprom_233_2i5i6i.bin \
++ $(1)/lib/firmware/mediatek/mt7996
++endef
++
++define KernelPackage/mt7992-firmware/install
++ $(INSTALL_DIR) $(1)/lib/firmware/mediatek/mt7996
++ cp \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wa.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wm.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wm_tm.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_rom_patch.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_dsp.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_eeprom_2i5i.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_eeprom_2i5e.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_eeprom_2e5e.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wa_23.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wm_23.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_wm_tm_23.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_rom_patch_23.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_dsp_23.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_eeprom_23_2i5i.bin \
++ $(PKG_BUILD_DIR)/firmware/mt7996/mt7992_eeprom_23_2e5e.bin \
+ $(1)/lib/firmware/mediatek/mt7996
+ endef
+
+@@ -692,5 +732,6 @@ $(eval $(call KernelPackage,mt7925u))
+ $(eval $(call KernelPackage,mt7925e))
+ $(eval $(call KernelPackage,mt7996e))
+ $(eval $(call KernelPackage,mt7996-firmware))
++$(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..481ddba
--- /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 40266db..db38685 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 \
+- 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
+@@ -1182,6 +1279,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
+ }
+@@ -1551,12 +1664,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"
+@@ -1566,12 +1706,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"
+
+@@ -1582,6 +1768,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
+@@ -1596,6 +1796,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 0079c49..815308e 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
+@@ -917,6 +1074,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;
+@@ -1000,6 +1165,9 @@ mac80211_setup_vif() {
+
+ json_select ..
+ [ -n "$failed" ] || wireless_add_vif "$name" "$ifname"
++
++ echo "Setup SMP Affinity"
++ /sbin/smp-mt76.sh
+ }
+
+ get_freq() {
+@@ -1051,6 +1219,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 \
+@@ -1059,7 +1246,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 ..
+@@ -1090,10 +1278,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
+@@ -1142,14 +1338,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
new file mode 100644
index 0000000..4afe4e6
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0003-hostapd-package-makefile-ucode-files.patch
@@ -0,0 +1,167 @@
+diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in
+index 1fff4f8..742cd78 100644
+--- a/package/network/services/hostapd/Config.in
++++ b/package/network/services/hostapd/Config.in
+@@ -40,6 +40,10 @@ config DRIVER_11AX_SUPPORT
+ default n
+ select WPA_MBO_SUPPORT
+
++config DRIVER_11BE_SUPPORT
++ bool
++ default n
++
+ config WPA_ENABLE_WEP
+ 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
+--- a/package/network/services/hostapd/Makefile
++++ b/package/network/services/hostapd/Makefile
+@@ -27,6 +27,7 @@ PKG_CONFIG_DEPENDS:= \
+ CONFIG_WPA_RFKILL_SUPPORT \
+ CONFIG_DRIVER_11AC_SUPPORT \
+ CONFIG_DRIVER_11AX_SUPPORT \
++ CONFIG_DRIVER_11BE_SUPPORT \
+ CONFIG_WPA_ENABLE_WEP
+
+ PKG_BUILD_FLAGS:=gc-sections lto
+@@ -79,13 +80,18 @@ ifneq ($(CONFIG_DRIVER_11AX_SUPPORT),)
+ HOSTAPD_IEEE80211AX:=y
+ endif
+
++ifneq ($(CONFIG_DRIVER_11BE_SUPPORT),)
++ HOSTAPD_IEEE80211BE:=y
++endif
++
+ CORE_DEPENDS = +ucode +libubus +libucode +ucode-mod-fs +ucode-mod-nl80211 +ucode-mod-rtnl +ucode-mod-ubus +ucode-mod-uloop +libblobmsg-json +libudebug
+-OPENSSL_DEPENDS = +PACKAGE_$(1):libopenssl +PACKAGE_$(1):libopenssl-legacy
++OPENSSL_DEPENDS = +PACKAGE_$(1):libopenssl
+
+ DRIVER_MAKEOPTS= \
+ CONFIG_ACS=y CONFIG_DRIVER_NL80211=y \
+ CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \
+ CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \
++ CONFIG_IEEE80211BE=$(HOSTAPD_IEEE80211BE) \
+ CONFIG_MBO=$(CONFIG_WPA_MBO_SUPPORT) \
+ CONFIG_UCODE=y CONFIG_APUP=y
+
+@@ -716,6 +722,9 @@ define Package/hostapd-common/install
+ $(INSTALL_BIN) ./files/wps-hotplug.sh $(1)/etc/rc.button/wps
+ $(INSTALL_DATA) ./files/wpad_acl.json $(1)/usr/share/acl.d
+ $(INSTALL_DATA) ./files/wpad.json $(1)/etc/capabilities
++ [ ! -d $(STAGING_DIR)/usr/include/wpa_ctrl.h ] && $(CP) -f $(PKG_BUILD_DIR)/src/common/wpa_ctrl.h $(STAGING_DIR)/usr/include
++ [ ! -d $(STAGING_DIR)/usr/lib/wpa_ctrl.o ] && $(CP) -f $(PKG_BUILD_DIR)/build/hostapd/src/common/wpa_ctrl.o $(STAGING_DIR)/usr/lib
++ [ ! -d $(STAGING_DIR)/usr/lib/os_unix.o ] && $(CP) -f $(PKG_BUILD_DIR)/build/hostapd/src/utils/os_unix.o $(STAGING_DIR)/usr/lib
+ endef
+
+ 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
+--- a/package/network/services/hostapd/files/hostapd.uc
++++ b/package/network/services/hostapd/files/hostapd.uc
+@@ -61,6 +61,7 @@ start_disabled=1
+ function iface_freq_info(iface, config, params)
+ {
+ let freq = params.frequency;
++ let bw320_offset = params.bw320_offset;
+ if (!freq)
+ return null;
+
+@@ -69,25 +70,29 @@ function iface_freq_info(iface, config, params)
+ sec_offset = 0;
+
+ let width = 0;
+- for (let line in config.radio.data) {
+- if (!sec_offset && match(line, /^ht_capab=.*HT40/)) {
+- sec_offset = null; // auto-detect
+- continue;
+- }
++ if (params.ch_width >= 0){
++ width = params.ch_width;
++ } else {
++ for (let line in config.radio.data) {
++ if (!sec_offset && match(line, /^ht_capab=.*HT40/)) {
++ sec_offset = null; // auto-detect
++ continue;
++ }
+
+- let val = match(line, /^(vht_oper_chwidth|he_oper_chwidth)=(\d+)/);
+- if (!val)
+- continue;
++ let val = match(line, /^(vht_oper_chwidth|he_oper_chwidth|eht_oper_chwidth)=(\d+)/);
++ if (!val)
++ continue;
+
+- val = int(val[2]);
+- if (val > width)
+- width = val;
++ val = int(val[2]);
++ if (val > width)
++ width = val;
++ }
+ }
+
+ if (freq < 4000)
+ width = 0;
+
+- return hostapd.freq_info(freq, sec_offset, width);
++ return hostapd.freq_info(freq, sec_offset, width, bw320_offset);
+ }
+
+ function iface_add(phy, config, phy_status)
+@@ -745,6 +750,8 @@ let main_obj = {
+ up: true,
+ frequency: 0,
+ sec_chan_offset: 0,
++ ch_width: -1,
++ bw320_offset: 1,
+ csa: true,
+ csa_count: 0,
+ },
+@@ -752,6 +759,15 @@ let main_obj = {
+ if (req.args.up == null || !req.args.phy)
+ return libubus.STATUS_INVALID_ARGUMENT;
+
++ hostapd.printf(`ucode: mtk: apsta state update`);
++ hostapd.printf(` * phy: ${req.args.phy}`);
++ hostapd.printf(` * up: ${req.args.up}`);
++ hostapd.printf(` * freqeuncy: ${req.args.frequency}`);
++ hostapd.printf(` * sec_chan_offset: ${req.args.sec_chan_offset}`);
++ hostapd.printf(` * ch_width: ${req.args.ch_width}`);
++ hostapd.printf(` * bw320_offset: ${req.args.bw320_offset}`);
++ hostapd.printf(` * csa: ${req.args.csa}`);
++
+ let phy = req.args.phy;
+ 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
+--- 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)
+ let status = iface.status();
+ let msg = { phy: phy };
+
++ wpas.printf(`ucode: mtk: wpa_s in state ${state} notifies hostapd`);
+ switch (state) {
+ case "DISCONNECTED":
+ case "AUTHENTICATING":
+@@ -277,6 +278,8 @@ function iface_hostapd_notify(phy, ifname, iface, state)
+ msg.up = true;
+ msg.frequency = status.frequency;
+ msg.sec_chan_offset = status.sec_chan_offset;
++ msg.ch_width = status.ch_width;
++ msg.bw320_offset = status.bw320_offset;
+ break;
+ default:
+ return;
+@@ -293,6 +296,8 @@ function iface_channel_switch(phy, ifname, iface, info)
+ csa: true,
+ csa_count: info.csa_count ? info.csa_count - 1 : 0,
+ frequency: info.frequency,
++ ch_width: info.ch_width,
++ bw320_offset: info.bw320_offset,
+ sec_chan_offset: info.sec_chan_offset,
+ };
+ ubus.call("hostapd", "apsta_state", msg);
+
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
new file mode 100644
index 0000000..51bdefd
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/master/patches-base/0004-mac80211-package-makefile.patch
@@ -0,0 +1,32 @@
+diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
+index aa022c9..a12901f 100644
+--- a/package/kernel/mac80211/Makefile
++++ b/package/kernel/mac80211/Makefile
+@@ -22,6 +22,7 @@ PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
+ PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)
+ PKG_BUILD_PARALLEL:=1
+
++SOURCE_PATH:=./src
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+
+ PKG_DRIVERS = \
+@@ -80,6 +81,10 @@ config-y:= \
+ WLAN_VENDOR_ST \
+ WLAN_VENDOR_TI \
+ WLAN_VENDOR_ZYDAS \
++ MAC80211_DEBUG_MENU \
++ MAC80211_MLME_DEBUG \
++ MAC80211_STA_DEBUG \
++ MAC80211_HT_DEBUG \
+
+ config-$(call config_package,cfg80211,$(ALL_VARIANTS)) += CFG80211
+ config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
+@@ -304,6 +309,7 @@ define Build/Prepare
+ rm -rf $(PKG_BUILD_DIR)
+ mkdir -p $(PKG_BUILD_DIR)
+ $(PKG_UNPACK)
++ $(CP) $(SOURCE_PATH)/* $(PKG_BUILD_DIR) 2>/dev/null || :
+ $(Build/Patch)
+ rm -rf \
+ $(PKG_BUILD_DIR)/include/linux/ssb \
+
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/defconfig b/autobuild/unified/filogic/mac80211/mozart/master/defconfig
new file mode 100644
index 0000000..a9a91ce
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/defconfig
@@ -0,0 +1,28 @@
+CONFIG_KERNEL_KPROBES=y
+CONFIG_KERNEL_PROFILING=y
+CONFIG_PACKAGE_CFG80211_TESTMODE=y
+CONFIG_PACKAGE_e2fsprogs=y
+CONFIG_PACKAGE_f2fsck=y
+CONFIG_PACKAGE_hostapd-utils=y
+CONFIG_PACKAGE_iperf3=y
+CONFIG_PACKAGE_iw-full=y
+CONFIG_PACKAGE_kmod-l2tp=y
+CONFIG_PACKAGE_kmod-pppol2tp=y
+CONFIG_PACKAGE_kmod-pptp=y
+CONFIG_PACKAGE_kmod-sfp=y
+CONFIG_PACKAGE_kmod-usb3=y
+CONFIG_PACKAGE_mkf2fs=y
+CONFIG_PACKAGE_mt7988-2p5g-phy-firmware=y
+CONFIG_PACKAGE_omcproxy=y
+CONFIG_PACKAGE_perf=y
+CONFIG_PACKAGE_pptpd=y
+CONFIG_PACKAGE_ppp-mod-pppol2tp=y
+CONFIG_PACKAGE_ppp-mod-pptp=y
+CONFIG_PACKAGE_tcpdump=y
+CONFIG_PACKAGE_wpa-cli=y
+# CONFIG_PACKAGE_wpad-basic-mbedtls is not set
+CONFIG_PACKAGE_wpad-openssl=y
+CONFIG_PACKAGE_xl2tpd=y
+CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7988a-prpl-mozart=y
+CONFIG_WPA_ENABLE_WEP=y
+CONFIG_WPA_MSG_MIN_PRIORITY=2
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/defconfig_forced b/autobuild/unified/filogic/mac80211/mozart/master/defconfig_forced
new file mode 100644
index 0000000..29d30e8
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/defconfig_forced
@@ -0,0 +1,8 @@
+# CONFIG_PACKAGE_kmod-mt7981-firmware is not set
+# CONFIG_PACKAGE_kmod-mt7986-firmware is not set
+# CONFIG_PACKAGE_kmod-mt7992-firmware is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7981-rfb is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7986a-rfb-nand is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7986b-rfb is not set
+# CONFIG_TARGET_DEVICE_mediatek_filogic_DEVICE_mediatek_mt7988a-rfb is not set
+
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a-prpl-mozart.dts b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a-prpl-mozart.dts
new file mode 100644
index 0000000..6b591f7
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/files-6.6/arch/arm64/boot/dts/mediatek/mt7988a-prpl-mozart.dts
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ * Author: Sam.Shih <sam.shih@mediatek.com>
+ */
+
+/dts-v1/;
+#include "mt7988a-rfb.dts"
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+ model = "PrplOS Mozart board";
+
+ chosen {
+ rootdisk-emmc = <&emmc_rootfs>;
+ };
+};
+
+&pio {
+ mdio0_pins: mdio0-pins {
+ mux {
+ function = "eth";
+ groups = "mdc_mdio0";
+ };
+
+ conf {
+ groups = "mdc_mdio0";
+ drive-strength = <MTK_DRIVE_10mA>;
+ };
+ };
+
+ spic_pins: spi1-pins {
+ mux {
+ function = "spi";
+ groups = "spi1";
+ };
+ };
+};
+
+&usxgmiisys0 {
+ mediatek,pn_swap_rx;
+};
+
+&usxgmiisys1 {
+ mediatek,pn_swap_rx;
+};
+
+&mdio_bus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reset-gpios = <&pio 72 1>;
+ reset-delay-us = <40000>;
+
+ /* external Realtek RTL8261N */
+ phy0: ethernet-phy@0 {
+ reg = <0>;
+ compatible = "ethernet-phy-ieee802.3-c45";
+ };
+
+ phy8: ethernet-phy@8 {
+ reg = <8>;
+ compatible = "ethernet-phy-ieee802.3-c45";
+ };
+};
+
+&gmac1 {
+ phy-mode = "usxgmii";
+ phy-connection-type = "usxgmii";
+ phy = <&phy0>;
+ status = "okay";
+};
+
+&gmac2 {
+ phy-mode = "usxgmii";
+ phy-connection-type = "usxgmii";
+ phy = <&phy8>;
+ status = "okay";
+};
+
+&i2c1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins>;
+ clock-frequency = <100000>;
+ status = "okay";
+
+ icp201xx@63{
+ compatible = "invensense,icp201xx";
+ reg = <0x63>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+};
+
+&uart1 {
+ status = "okay";
+};
+
+&fan {
+ pwms = <&pwm 1 50000 0>;
+ status = "okay";
+};
+
+&pwm {
+ status = "okay";
+};
+
+&spi1 {
+ pinctrl-names = "default";
+ /* pin shared with snfi */
+ pinctrl-0 = <&spic_pins>;
+ status = "disabled";
+};
+
+&mmc0 {
+ pinctrl-names = "default", "state_uhs";
+ pinctrl-0 = <&mmc0_pins_emmc_51>;
+ pinctrl-1 = <&mmc0_pins_emmc_51>;
+ bus-width = <8>;
+ max-frequency = <200000000>;
+ cap-mmc-highspeed;
+ mmc-hs200-1_8v;
+ mmc-hs400-1_8v;
+ hs400-ds-delay = <0x12814>;
+ vqmmc-supply = <®_1p8v>;
+ vmmc-supply = <®_3p3v>;
+ non-removable;
+ no-sd;
+ no-sdio;
+ status = "okay";
+
+ card@0 {
+ compatible = "mmc-card";
+ reg = <0>;
+
+ block {
+ compatible = "block-device";
+ partitions {
+ block-partition-env {
+ partname = "u-boot-env";
+ nvmem-layout {
+ compatible = "u-boot,env-layout";
+ };
+ };
+
+ emmc_rootfs: block-partition-production {
+ partname = "firmware";
+ };
+ };
+ };
+ };
+};
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/image/filogic-extra.mk b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/image/filogic-extra.mk
new file mode 100644
index 0000000..1a47ebe
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/image/filogic-extra.mk
@@ -0,0 +1,21 @@
+
+define Device/mediatek_mt7988a-prpl-mozart
+ DEVICE_VENDOR := MediaTek
+ DEVICE_MODEL := PrplOS Mozart board
+ DEVICE_DTS := mt7988a-prpl-mozart
+ DEVICE_DTS_DIR := $(DTS_DIR)/
+ DEVICE_DTC_FLAGS := --pad 4096
+ DEVICE_DTS_LOADADDR := 0x45f00000
+ DEVICE_PACKAGES := blkid
+ KERNEL_LOADADDR := 0x46000000
+ KERNEL := kernel-bin | gzip
+ KERNEL_INITRAMFS := kernel-bin | lzma | \
+ fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
+ KERNEL_INITRAMFS_SUFFIX := .itb
+ KERNEL_IN_UBI := 1
+ IMAGE_SIZE := $$(shell expr 64 + $$(CONFIG_TARGET_ROOTFS_PARTSIZE))m
+ IMAGES := sysupgrade.itb
+ IMAGE/sysupgrade.itb := append-kernel | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-with-rootfs | pad-rootfs | append-metadata
+ SUPPORTED_DEVICES += mediatek,mt7988a-rfb
+endef
+TARGET_DEVICES += mediatek_mt7988a-prpl-mozart
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2700-net-ethernet-mtk_eth_soc-add-mdio-reset-delay.patch b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2700-net-ethernet-mtk_eth_soc-add-mdio-reset-delay.patch
new file mode 100644
index 0000000..e1d45f9
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2700-net-ethernet-mtk_eth_soc-add-mdio-reset-delay.patch
@@ -0,0 +1,29 @@
+diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+index 6f4d332..e9cc88d 100644
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -473,6 +473,16 @@ static int mtk_mdio_read_c45(struct mii_bus *bus, int phy_addr, int devad,
+ return _mtk_mdio_read_c45(eth, phy_addr, devad, phy_reg);
+ }
+
++static int mtk_mdio_reset(struct mii_bus *bus)
++{
++ /* The mdiobus_register will trigger a reset pulse when enabling Bus reset,
++ * we just need to wait until device ready.
++ */
++ mdelay(150);
++
++ return 0;
++}
++
+ static int mt7621_gmac0_rgmii_adjust(struct mtk_eth *eth,
+ phy_interface_t interface)
+ {
+@@ -994,6 +1004,7 @@ static int mtk_mdio_init(struct mtk_eth *eth)
+ eth->mii_bus->write = mtk_mdio_write_c22;
+ eth->mii_bus->read_c45 = mtk_mdio_read_c45;
+ eth->mii_bus->write_c45 = mtk_mdio_write_c45;
++ eth->mii_bus->reset = mtk_mdio_reset;
+ eth->mii_bus->priv = eth;
+ eth->mii_bus->parent = eth->dev;
+
diff --git a/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2701-net-pcs-mtk_usxgmii-add-polarity-control.patch b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2701-net-pcs-mtk_usxgmii-add-polarity-control.patch
new file mode 100644
index 0000000..2db0c82
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/master/files/target/linux/mediatek/patches-6.6/999-2701-net-pcs-mtk_usxgmii-add-polarity-control.patch
@@ -0,0 +1,58 @@
+diff --git a/drivers/net/pcs/pcs-mtk-usxgmii.c b/drivers/net/pcs/pcs-mtk-usxgmii.c
+index 9af9035..9caab92 100644
+--- a/drivers/net/pcs/pcs-mtk-usxgmii.c
++++ b/drivers/net/pcs/pcs-mtk-usxgmii.c
+@@ -52,6 +52,12 @@
+ #define USXGMII_LPA GENMASK(15, 0)
+ #define USXGMII_LPA_LATCH BIT(31)
+
++/* Register to control PCS polarity */
++#define RG_PHY_TOP_CTRL0 0x82C
++#define USXGMII_PN_SWAP_MASK GENMASK(1, 0)
++#define USXGMII_PN_SWAP_RX BIT(1)
++#define USXGMII_PN_SWAP_TX BIT(0)
++
+ /* Register to read PCS link status */
+ #define RG_PCS_RX_STATUS0 0x904
+ #define RG_PCS_RX_STATUS_UPDATE BIT(16)
+@@ -74,6 +80,7 @@ struct mtk_usxgmii_pcs {
+ struct clk *clk;
+ struct reset_control *reset;
+ phy_interface_t interface;
++ unsigned int polarity;
+ unsigned int neg_mode;
+ struct list_head node;
+ };
+@@ -155,6 +162,10 @@ static int mtk_usxgmii_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode
+
+ mtk_usxgmii_reset(mpcs);
+
++ /* Configure the interface polarity */
++ mtk_m32(mpcs, RG_PHY_TOP_CTRL0,
++ USXGMII_PN_SWAP_MASK, mpcs->polarity);
++
+ /* Setup USXGMII AN ctrl */
+ mtk_m32(mpcs, RG_PCS_AN_CTRL0,
+ USXGMII_AN_SYNC_CNT | USXGMII_AN_ENABLE,
+@@ -332,6 +343,7 @@ static const struct phylink_pcs_ops mtk_usxgmii_pcs_ops = {
+ static int mtk_usxgmii_probe(struct platform_device *pdev)
+ {
+ struct device *dev = &pdev->dev;
++ struct device_node *np = dev->of_node;
+ struct mtk_usxgmii_pcs *mpcs;
+
+ mpcs = devm_kzalloc(dev, sizeof(*mpcs), GFP_KERNEL);
+@@ -342,6 +354,13 @@ static int mtk_usxgmii_probe(struct platform_device *pdev)
+ if (IS_ERR(mpcs->base))
+ return PTR_ERR(mpcs->base);
+
++ if (of_property_read_bool(np->parent, "mediatek,pnswap"))
++ mpcs->polarity = USXGMII_PN_SWAP_TX | USXGMII_PN_SWAP_RX;
++ else if (of_property_read_bool(np, "mediatek,pn_swap_tx"))
++ mpcs->polarity = USXGMII_PN_SWAP_TX;
++ else if (of_property_read_bool(np, "mediatek,pn_swap_rx"))
++ mpcs->polarity = USXGMII_PN_SWAP_RX;
++
+ mpcs->dev = dev;
+ mpcs->pcs.ops = &mtk_usxgmii_pcs_ops;
+ mpcs->pcs.poll = true;
diff --git a/autobuild/unified/filogic/mac80211/mozart/rules b/autobuild/unified/filogic/mac80211/mozart/rules
new file mode 100644
index 0000000..8f834e0
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/mozart/rules
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Copyright (C) 2024 MediaTek Inc. All rights reserved.
+# Author: Weijie Gao <weijie.gao@mediatek.com>
+# PrplOS Mozart board rules
+
+. ${ab_global}/rtl8621n.sh
diff --git a/autobuild/unified/filogic/mac80211/rules b/autobuild/unified/filogic/mac80211/rules
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/autobuild/unified/filogic/mac80211/rules