[][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 = <&reg_1p8v>;
+	vmmc-supply = <&reg_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