[rdkb][common][bsp][Refactor and sync wifi from openwrt]

[Description]
cc3c51c7 [MAC80211][wifi6][Release][Update MT7986 Firmware]
ea393925 [MAC80211[WiFi6/7]][hostapd][Avoid unnecessary beacon update]
6763be22 [MAC80211][wifi7][Misc][Sync Internal patches to External Release Folder]
d3ed9bc8 [mac80211][wifi7][mt76][Rebase WED patch due to Cheetah MT76 modifications]
2f4b03c3 [mac80211][wifi6][mt76][Bring-up hardware path for Cheetah MT76]
cb573d78 [MAC80211][WiFi7][app][Add ibf atenl support for eagle]
04fe6893 [mac80211][wifi6][mt76][Fix rebase errors]
c301e69a [MAC80211][WiFi7][mt76][Update Kite EEPROM bin files]
463b00fb [MAC80211][WiFi7][infra][Add slot1 for kite]
8774388d [MAC80211][WiFi7][misc][Prevent deadlock in a multiple AP+STA mode]
68d43fea [MAC80211][hostapd][show acs channels config]
5aca83c6 [MAC80211][hostapd][Prevent hostapd from setting beacon too frequently]
636da369 [MAC80211][wifi6/7][misc][use current epoch date]
9eb3456f [MAC80211][hostapd][refactor AP/STA CSA handling flow]
5543f3d8 [MAC80211][WiFi6][mt76][Refactor assignment of STA BSS group]
c5631fc2 [mac80211][mt76][wifi6][Add debugfs knob for RTS threshold]
6a92a2d4 [mac80211][wifi6][mt76][Bring-up software path for Cheetah MT76]
bf66c519 [MAC80211][netifd][Remove unnecessary netifd patch]
2f141c75 [mac80211][mt76][wifi6/7][Fix build failed]
cf30db1e [mac80211[hostapd][wifi7][Fix build fial]
dc391fc0 [MAC80211][wifi6][Release][Update MT7986 Firmware]
71a7b95a [MAC80211][WiFi7][mt76][Add kite fw & eeprom to eagle codebase]
5a7bd025 [MAC80211][WiFi6][misc][Add mt7981 default eeprom bin]
e40da697 [MAC80211][WED][Fix reinsert wifi module cause memory leak issue]
0a22f8f4 [MAC80211][WiFi7][misc][fix mt7988-mt7996-mac980211 release build fail]
25f3fe1c [[Eagle][SQC3.0][BE19000][MT7996][E2][MT7976_MT7977][256][ePA][MT7988A][WiFi] [MAP][SnS][Muti-client][UES]Traffic stuck in Agent2 with invalid tid 8 found]
f59b5dad [MAC80211][WiFi6][mt76][Add additional chain signal info in station dump for merlin]
fada400d [MAC80211][WiFi6/7][mt76][Add HT40- capab when enable ACS]
98e273af [MAC80211][WiFi6/7][app][Add SKU_EN & RSSI ATTR in atenl]
aaa8eb14 [MAC80211][WiFi6][mt76][Add rssi & sku_en in testmode]
eda14aac [MAC80211][core][Remove wrong assignment on the variable "changed" when changing beacon]
000329aa [MAC80211][netifd][Move netifd patch for wifi7 used only]
57bfe0c7 [MAC80211][WiFi6][misc][fix build fail due to mt76 upgration]
fa29bb39 [MAC80211][wifi6/7][mt76][update mt76 Makefile]
56f497ec [MAC80211][netifd][not to cache previous config to avoid wifi down failure]
be9abd4d [MAC80211][WiFi6][misc][fix build fail due to netifd]
af71e303 [MAC80211][WiFi6][mt76][Fix inconsistent BSS group setting of STA for VoW]
3e42972a [MAC80211][WiFi6][mt76][Fix txpower bbp CR]
81a68c03 [MAC80211][wifi7][hostapd][rebase internal hostapd patches]
336300b7 [MAC80211][WiFi6/7][hostapd][MAX 48 mbss 6G 连线概率连不上 ]
6bebc554 [MAC80211][wifi7][core][update for backports v6.5]
19daecfd [MAC80211][wifi7][ucode][Bandwidth Synchronization in AP/STA Mode]
ddf64afb [MAC80211][mt76][add debug log in SER flow]
44611a77 [mac80211][wifi6][mt76][Enhance debug log]

[Release-log]

Change-Id: Ibf5e835de5563fff4101a77e81056f696286670b
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/110-mac80211_keep_keys_on_stop_ap.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/110-mac80211_keep_keys_on_stop_ap.patch
index 4d4a2a8..e3349da 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/110-mac80211_keep_keys_on_stop_ap.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/110-mac80211_keep_keys_on_stop_ap.patch
@@ -9,7 +9,7 @@
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1519,7 +1519,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1632,7 +1632,6 @@ static int ieee80211_stop_ap(struct wiph
  	link_conf->bssid_indicator = 0;
  
  	__sta_info_flush(sdata, true);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/130-disable_auto_vif.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/130-disable_auto_vif.patch
new file mode 100644
index 0000000..9d8f781
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/130-disable_auto_vif.patch
@@ -0,0 +1,27 @@
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -1396,24 +1396,6 @@ int ieee80211_register_hw(struct ieee802
+ 	debugfs_hw_add(local);
+ 	rate_control_add_debugfs(local);
+ 
+-	rtnl_lock();
+-	wiphy_lock(hw->wiphy);
+-
+-	/* add one default STA interface if supported */
+-	if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) &&
+-	    !ieee80211_hw_check(hw, NO_AUTO_VIF)) {
+-		struct vif_params params = {0};
+-
+-		result = ieee80211_if_add(local, "wlan%d", NET_NAME_ENUM, NULL,
+-					  NL80211_IFTYPE_STATION, &params);
+-		if (result)
+-			wiphy_warn(local->hw.wiphy,
+-				   "Failed to add default virtual iface\n");
+-	}
+-
+-	wiphy_unlock(hw->wiphy);
+-	rtnl_unlock();
+-
+ #ifdef CONFIG_INET
+ 	local->ifa_notifier.notifier_call = ieee80211_ifa_changed;
+ 	result = register_inetaddr_notifier(&local->ifa_notifier);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/210-ap_scan.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/210-ap_scan.patch
index 10b842d..25b844a 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/210-ap_scan.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/210-ap_scan.patch
@@ -8,7 +8,7 @@
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2727,6 +2727,8 @@ static int ieee80211_scan(struct wiphy *
+@@ -2843,6 +2843,8 @@ static int ieee80211_scan(struct wiphy *
  		 */
  		fallthrough;
  	case NL80211_IFTYPE_AP:
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
index 63b2177..ffa5c17 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
@@ -28,7 +28,7 @@
 
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -554,6 +554,7 @@ __sta_info_alloc(struct ieee80211_sub_if
+@@ -558,6 +558,7 @@ __sta_info_alloc(struct ieee80211_sub_if
  	INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
  	INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
  	mutex_init(&sta->ampdu_mlme.mtx);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
index 0ac9729..a27925e 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
@@ -12,7 +12,7 @@
 
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -90,6 +90,8 @@ extern const u8 ieee80211_ac_to_qos_mask
+@@ -92,6 +92,8 @@ extern const u8 ieee80211_ac_to_qos_mask
   */
  #define AIRTIME_ACTIVE_DURATION (HZ / 10)
  
@@ -23,7 +23,7 @@
  
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -3984,7 +3984,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4059,7 +4059,7 @@ struct ieee80211_txq *ieee80211_next_txq
  
  		if (deficit < 0)
  			sta->airtime[txqi->txq.ac].deficit +=
@@ -32,7 +32,7 @@
  
  		if (deficit < 0 || !aql_check) {
  			list_move_tail(&txqi->schedule_order,
-@@ -4127,7 +4127,8 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4202,7 +4202,8 @@ bool ieee80211_txq_may_transmit(struct i
  		}
  		sta = container_of(iter->txq.sta, struct sta_info, sta);
  		if (ieee80211_sta_deficit(sta, ac) < 0)
@@ -42,7 +42,7 @@
  		list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
  	}
  
-@@ -4135,7 +4136,7 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4210,7 +4211,7 @@ bool ieee80211_txq_may_transmit(struct i
  	if (sta->airtime[ac].deficit >= 0)
  		goto out;
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch
deleted file mode 100644
index d14ba05..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-From: Alexander Wetzel <alexander@wetzel-home.de>
-Date: Sun, 9 Oct 2022 18:30:38 +0200
-Subject: [PATCH] wifi: mac80211: add internal handler for wake_tx_queue
-
-Start to align the TX handling to only use internal TX queues (iTXQs):
-
-Provide a handler for drivers not having a custom wake_tx_queue
-callback and update the documentation.
-
-Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -89,15 +89,13 @@
- /**
-  * DOC: mac80211 software tx queueing
-  *
-- * mac80211 provides an optional intermediate queueing implementation designed
-- * to allow the driver to keep hardware queues short and provide some fairness
-- * between different stations/interfaces.
-- * In this model, the driver pulls data frames from the mac80211 queue instead
-- * of letting mac80211 push them via drv_tx().
-- * Other frames (e.g. control or management) are still pushed using drv_tx().
-+ * mac80211 uses an intermediate queueing implementation, designed to allow the
-+ * driver to keep hardware queues short and to provide some fairness between
-+ * different stations/interfaces.
-  *
-- * Drivers indicate that they use this model by implementing the .wake_tx_queue
-- * driver operation.
-+ * Drivers must provide the .wake_tx_queue driver operation by either
-+ * linking it to ieee80211_handle_wake_tx_queue() or implementing a custom
-+ * handler.
-  *
-  * Intermediate queues (struct ieee80211_txq) are kept per-sta per-tid, with
-  * another per-sta for non-data/non-mgmt and bufferable management frames, and
-@@ -106,9 +104,12 @@
-  * The driver is expected to initialize its private per-queue data for stations
-  * and interfaces in the .add_interface and .sta_add ops.
-  *
-- * The driver can't access the queue directly. To dequeue a frame from a
-- * txq, it calls ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a
-- * queue, it calls the .wake_tx_queue driver op.
-+ * The driver can't access the internal TX queues (iTXQs) directly.
-+ * Whenever mac80211 adds a new frame to a queue, it calls the .wake_tx_queue
-+ * driver op.
-+ * Drivers implementing a custom .wake_tx_queue op can get them by calling
-+ * ieee80211_tx_dequeue(). Drivers using ieee80211_handle_wake_tx_queue() will
-+ * simply get the individual frames pushed via the .tx driver operation.
-  *
-  * Drivers can optionally delegate responsibility for scheduling queues to
-  * mac80211, to take advantage of airtime fairness accounting. In this case, to
-@@ -2248,8 +2249,8 @@ struct ieee80211_link_sta {
-  *	For non MLO STA it will point to the deflink data. For MLO STA
-  *	ieee80211_sta_recalc_aggregates() must be called to update it.
-  * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
-- * @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that
-- *	the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames
-+ * @txq: per-TID data TX queues; note that the last entry (%IEEE80211_NUM_TIDS)
-+ *	is used for non-data frames
-  * @deflink: This holds the default link STA information, for non MLO STA all link
-  *	specific STA information is accessed through @deflink or through
-  *	link[0] which points to address of @deflink. For MLO Link STA
-@@ -5687,7 +5688,7 @@ void ieee80211_key_replay(struct ieee802
-  * @hw: pointer as obtained from ieee80211_alloc_hw().
-  * @queue: queue number (counted from zero).
-  *
-- * Drivers should use this function instead of netif_wake_queue.
-+ * Drivers must use this function instead of netif_wake_queue.
-  */
- void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
- 
-@@ -5696,7 +5697,7 @@ void ieee80211_wake_queue(struct ieee802
-  * @hw: pointer as obtained from ieee80211_alloc_hw().
-  * @queue: queue number (counted from zero).
-  *
-- * Drivers should use this function instead of netif_stop_queue.
-+ * Drivers must use this function instead of netif_stop_queue.
-  */
- void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
- 
-@@ -5705,7 +5706,7 @@ void ieee80211_stop_queue(struct ieee802
-  * @hw: pointer as obtained from ieee80211_alloc_hw().
-  * @queue: queue number (counted from zero).
-  *
-- * Drivers should use this function instead of netif_stop_queue.
-+ * Drivers must use this function instead of netif_queue_stopped.
-  *
-  * Return: %true if the queue is stopped. %false otherwise.
-  */
-@@ -5716,7 +5717,7 @@ int ieee80211_queue_stopped(struct ieee8
-  * ieee80211_stop_queues - stop all queues
-  * @hw: pointer as obtained from ieee80211_alloc_hw().
-  *
-- * Drivers should use this function instead of netif_stop_queue.
-+ * Drivers must use this function instead of netif_tx_stop_all_queues.
-  */
- void ieee80211_stop_queues(struct ieee80211_hw *hw);
- 
-@@ -5724,7 +5725,7 @@ void ieee80211_stop_queues(struct ieee80
-  * ieee80211_wake_queues - wake all queues
-  * @hw: pointer as obtained from ieee80211_alloc_hw().
-  *
-- * Drivers should use this function instead of netif_wake_queue.
-+ * Drivers must use this function instead of netif_tx_wake_all_queues.
-  */
- void ieee80211_wake_queues(struct ieee80211_hw *hw);
- 
-@@ -6946,6 +6947,18 @@ static inline struct sk_buff *ieee80211_
- }
- 
- /**
-+ * ieee80211_handle_wake_tx_queue - mac80211 handler for wake_tx_queue callback
-+ *
-+ * @hw: pointer as obtained from wake_tx_queue() callback().
-+ * @txq: pointer as obtained from wake_tx_queue() callback().
-+ *
-+ * Drivers can use this function for the mandatory mac80211 wake_tx_queue
-+ * callback in struct ieee80211_ops. They should not call this function.
-+ */
-+void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
-+				    struct ieee80211_txq *txq);
-+
-+/**
-  * ieee80211_next_txq - get next tx queue to pull packets from
-  *
-  * @hw: pointer as obtained from ieee80211_alloc_hw()
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -288,6 +288,52 @@ __le16 ieee80211_ctstoself_duration(stru
- }
- EXPORT_SYMBOL(ieee80211_ctstoself_duration);
- 
-+static void wake_tx_push_queue(struct ieee80211_local *local,
-+			       struct ieee80211_sub_if_data *sdata,
-+			       struct ieee80211_txq *queue)
-+{
-+	int q = sdata->vif.hw_queue[queue->ac];
-+	struct ieee80211_tx_control control = {
-+		.sta = queue->sta,
-+	};
-+	struct sk_buff *skb;
-+	unsigned long flags;
-+	bool q_stopped;
-+
-+	while (1) {
-+		spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
-+		q_stopped = local->queue_stop_reasons[q];
-+		spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
-+
-+		if (q_stopped)
-+			break;
-+
-+		skb = ieee80211_tx_dequeue(&local->hw, queue);
-+		if (!skb)
-+			break;
-+
-+		drv_tx(local, &control, skb);
-+	}
-+}
-+
-+/* wake_tx_queue handler for driver not implementing a custom one*/
-+void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
-+				    struct ieee80211_txq *txq)
-+{
-+	struct ieee80211_local *local = hw_to_local(hw);
-+	struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
-+	struct ieee80211_txq *queue;
-+
-+	/* Use ieee80211_next_txq() for airtime fairness accounting */
-+	ieee80211_txq_schedule_start(hw, txq->ac);
-+	while ((queue = ieee80211_next_txq(hw, txq->ac))) {
-+		wake_tx_push_queue(local, sdata, queue);
-+		ieee80211_return_txq(hw, queue, false);
-+	}
-+	ieee80211_txq_schedule_end(hw, txq->ac);
-+}
-+EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue);
-+
- static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac)
- {
- 	struct ieee80211_local *local = sdata->local;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch
deleted file mode 100644
index fee038d..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch
+++ /dev/null
@@ -1,396 +0,0 @@
-From: Alexander Wetzel <alexander@wetzel-home.de>
-Date: Sun, 9 Oct 2022 18:30:39 +0200
-Subject: [PATCH] wifi: mac80211: add wake_tx_queue callback to drivers
-
-mac80211 is fully switching over to the internal TX queue (iTXQ)
-implementation. Update all drivers not yet providing the now mandatory
-wake_tx_queue() callback.
-
-As an side effect the netdev interfaces of all updated drivers will
-switch to the noqueue qdisc.
-
-Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
-[add staging drivers]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/drivers/net/wireless/admtek/adm8211.c
-+++ b/drivers/net/wireless/admtek/adm8211.c
-@@ -1760,6 +1760,7 @@ static int adm8211_alloc_rings(struct ie
- 
- static const struct ieee80211_ops adm8211_ops = {
- 	.tx			= adm8211_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= adm8211_start,
- 	.stop			= adm8211_stop,
- 	.add_interface		= adm8211_add_interface,
---- a/drivers/net/wireless/ath/ar5523/ar5523.c
-+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
-@@ -1361,6 +1361,7 @@ static const struct ieee80211_ops ar5523
- 	.start			= ar5523_start,
- 	.stop			= ar5523_stop,
- 	.tx			= ar5523_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.set_rts_threshold	= ar5523_set_rts_threshold,
- 	.add_interface		= ar5523_add_interface,
- 	.remove_interface	= ar5523_remove_interface,
---- a/drivers/net/wireless/ath/ath11k/mac.c
-+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -8587,6 +8587,7 @@ err_fallback:
- 
- static const struct ieee80211_ops ath11k_ops = {
- 	.tx				= ath11k_mac_op_tx,
-+	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
- 	.start                          = ath11k_mac_op_start,
- 	.stop                           = ath11k_mac_op_stop,
- 	.reconfig_complete              = ath11k_mac_op_reconfig_complete,
---- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
-+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
-@@ -781,6 +781,7 @@ static int ath5k_set_ringparam(struct ie
- 
- const struct ieee80211_ops ath5k_hw_ops = {
- 	.tx			= ath5k_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= ath5k_start,
- 	.stop			= ath5k_stop,
- 	.add_interface		= ath5k_add_interface,
---- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
-@@ -1870,6 +1870,7 @@ static void ath9k_htc_channel_switch_bea
- 
- struct ieee80211_ops ath9k_htc_ops = {
- 	.tx                 = ath9k_htc_tx,
-+	.wake_tx_queue      = ieee80211_handle_wake_tx_queue,
- 	.start              = ath9k_htc_start,
- 	.stop               = ath9k_htc_stop,
- 	.add_interface      = ath9k_htc_add_interface,
---- a/drivers/net/wireless/ath/carl9170/main.c
-+++ b/drivers/net/wireless/ath/carl9170/main.c
-@@ -1715,6 +1715,7 @@ static const struct ieee80211_ops carl91
- 	.start			= carl9170_op_start,
- 	.stop			= carl9170_op_stop,
- 	.tx			= carl9170_op_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.flush			= carl9170_op_flush,
- 	.add_interface		= carl9170_op_add_interface,
- 	.remove_interface	= carl9170_op_remove_interface,
---- a/drivers/net/wireless/ath/wcn36xx/main.c
-+++ b/drivers/net/wireless/ath/wcn36xx/main.c
-@@ -1362,6 +1362,7 @@ static const struct ieee80211_ops wcn36x
- 	.prepare_multicast	= wcn36xx_prepare_multicast,
- 	.configure_filter       = wcn36xx_configure_filter,
- 	.tx			= wcn36xx_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.set_key		= wcn36xx_set_key,
- 	.hw_scan		= wcn36xx_hw_scan,
- 	.cancel_hw_scan		= wcn36xx_cancel_hw_scan,
---- a/drivers/net/wireless/atmel/at76c50x-usb.c
-+++ b/drivers/net/wireless/atmel/at76c50x-usb.c
-@@ -2187,6 +2187,7 @@ static int at76_set_key(struct ieee80211
- 
- static const struct ieee80211_ops at76_ops = {
- 	.tx = at76_mac80211_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.add_interface = at76_add_interface,
- 	.remove_interface = at76_remove_interface,
- 	.config = at76_config,
---- a/drivers/net/wireless/broadcom/b43/main.c
-+++ b/drivers/net/wireless/broadcom/b43/main.c
-@@ -5171,6 +5171,7 @@ static int b43_op_get_survey(struct ieee
- 
- static const struct ieee80211_ops b43_hw_ops = {
- 	.tx			= b43_op_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.conf_tx		= b43_op_conf_tx,
- 	.add_interface		= b43_op_add_interface,
- 	.remove_interface	= b43_op_remove_interface,
---- a/drivers/net/wireless/broadcom/b43legacy/main.c
-+++ b/drivers/net/wireless/broadcom/b43legacy/main.c
-@@ -3532,6 +3532,7 @@ static int b43legacy_op_get_survey(struc
- 
- static const struct ieee80211_ops b43legacy_hw_ops = {
- 	.tx			= b43legacy_op_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.conf_tx		= b43legacy_op_conf_tx,
- 	.add_interface		= b43legacy_op_add_interface,
- 	.remove_interface	= b43legacy_op_remove_interface,
---- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
-@@ -962,6 +962,7 @@ static int brcms_ops_beacon_set_tim(stru
- 
- static const struct ieee80211_ops brcms_ops = {
- 	.tx = brcms_ops_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = brcms_ops_start,
- 	.stop = brcms_ops_stop,
- 	.add_interface = brcms_ops_add_interface,
---- a/drivers/net/wireless/intel/iwlegacy/3945-mac.c
-+++ b/drivers/net/wireless/intel/iwlegacy/3945-mac.c
-@@ -3439,6 +3439,7 @@ static const struct attribute_group il39
- 
- static struct ieee80211_ops il3945_mac_ops __ro_after_init = {
- 	.tx = il3945_mac_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = il3945_mac_start,
- 	.stop = il3945_mac_stop,
- 	.add_interface = il_mac_add_interface,
---- a/drivers/net/wireless/intel/iwlegacy/4965-mac.c
-+++ b/drivers/net/wireless/intel/iwlegacy/4965-mac.c
-@@ -6308,6 +6308,7 @@ il4965_tx_queue_set_status(struct il_pri
- 
- static const struct ieee80211_ops il4965_mac_ops = {
- 	.tx = il4965_mac_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = il4965_mac_start,
- 	.stop = il4965_mac_stop,
- 	.add_interface = il_mac_add_interface,
---- a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
-+++ b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
-@@ -1571,6 +1571,7 @@ static void iwlagn_mac_sta_notify(struct
- 
- const struct ieee80211_ops iwlagn_hw_ops = {
- 	.tx = iwlagn_mac_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = iwlagn_mac_start,
- 	.stop = iwlagn_mac_stop,
- #ifdef CONFIG_PM_SLEEP
---- a/drivers/net/wireless/intersil/p54/main.c
-+++ b/drivers/net/wireless/intersil/p54/main.c
-@@ -705,6 +705,7 @@ static void p54_set_coverage_class(struc
- 
- static const struct ieee80211_ops p54_ops = {
- 	.tx			= p54_tx_80211,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= p54_start,
- 	.stop			= p54_stop,
- 	.add_interface		= p54_add_interface,
---- a/drivers/net/wireless/mac80211_hwsim.c
-+++ b/drivers/net/wireless/mac80211_hwsim.c
-@@ -3109,6 +3109,7 @@ static int mac80211_hwsim_change_sta_lin
- 
- #define HWSIM_COMMON_OPS					\
- 	.tx = mac80211_hwsim_tx,				\
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,	\
- 	.start = mac80211_hwsim_start,				\
- 	.stop = mac80211_hwsim_stop,				\
- 	.add_interface = mac80211_hwsim_add_interface,		\
---- a/drivers/net/wireless/marvell/libertas_tf/main.c
-+++ b/drivers/net/wireless/marvell/libertas_tf/main.c
-@@ -474,6 +474,7 @@ static int lbtf_op_get_survey(struct iee
- 
- static const struct ieee80211_ops lbtf_ops = {
- 	.tx			= lbtf_op_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= lbtf_op_start,
- 	.stop			= lbtf_op_stop,
- 	.add_interface		= lbtf_op_add_interface,
---- a/drivers/net/wireless/marvell/mwl8k.c
-+++ b/drivers/net/wireless/marvell/mwl8k.c
-@@ -5611,6 +5611,7 @@ static void mwl8k_sw_scan_complete(struc
- 
- static const struct ieee80211_ops mwl8k_ops = {
- 	.tx			= mwl8k_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= mwl8k_start,
- 	.stop			= mwl8k_stop,
- 	.add_interface		= mwl8k_add_interface,
---- a/drivers/net/wireless/mediatek/mt7601u/main.c
-+++ b/drivers/net/wireless/mediatek/mt7601u/main.c
-@@ -406,6 +406,7 @@ out:
- 
- const struct ieee80211_ops mt7601u_ops = {
- 	.tx = mt7601u_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = mt7601u_start,
- 	.stop = mt7601u_stop,
- 	.add_interface = mt7601u_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c
-@@ -1706,6 +1706,7 @@ static int rt2400pci_tx_last_beacon(stru
- 
- static const struct ieee80211_ops rt2400pci_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c
-@@ -2004,6 +2004,7 @@ static int rt2500pci_tx_last_beacon(stru
- 
- static const struct ieee80211_ops rt2500pci_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c
-@@ -1795,6 +1795,7 @@ static int rt2500usb_probe_hw(struct rt2
- 
- static const struct ieee80211_ops rt2500usb_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c
-@@ -288,6 +288,7 @@ static int rt2800pci_read_eeprom(struct
- 
- static const struct ieee80211_ops rt2800pci_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
-@@ -133,6 +133,7 @@ static int rt2800soc_write_firmware(stru
- 
- static const struct ieee80211_ops rt2800soc_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c
-@@ -630,6 +630,7 @@ static int rt2800usb_probe_hw(struct rt2
- 
- static const struct ieee80211_ops rt2800usb_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c
-@@ -2873,6 +2873,7 @@ static u64 rt61pci_get_tsf(struct ieee80
- 
- static const struct ieee80211_ops rt61pci_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c
-@@ -2292,6 +2292,7 @@ static u64 rt73usb_get_tsf(struct ieee80
- 
- static const struct ieee80211_ops rt73usb_mac80211_ops = {
- 	.tx			= rt2x00mac_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rt2x00mac_start,
- 	.stop			= rt2x00mac_stop,
- 	.add_interface		= rt2x00mac_add_interface,
---- a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
-+++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
-@@ -1608,6 +1608,7 @@ static void rtl8180_configure_filter(str
- 
- static const struct ieee80211_ops rtl8180_ops = {
- 	.tx			= rtl8180_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rtl8180_start,
- 	.stop			= rtl8180_stop,
- 	.add_interface		= rtl8180_add_interface,
---- a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c
-+++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c
-@@ -1378,6 +1378,7 @@ static int rtl8187_conf_tx(struct ieee80
- 
- static const struct ieee80211_ops rtl8187_ops = {
- 	.tx			= rtl8187_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= rtl8187_start,
- 	.stop			= rtl8187_stop,
- 	.add_interface		= rtl8187_add_interface,
---- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
-+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
-@@ -6548,6 +6548,7 @@ static void rtl8xxxu_stop(struct ieee802
- 
- static const struct ieee80211_ops rtl8xxxu_ops = {
- 	.tx = rtl8xxxu_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.add_interface = rtl8xxxu_add_interface,
- 	.remove_interface = rtl8xxxu_remove_interface,
- 	.config = rtl8xxxu_config,
---- a/drivers/net/wireless/realtek/rtlwifi/core.c
-+++ b/drivers/net/wireless/realtek/rtlwifi/core.c
-@@ -1912,6 +1912,7 @@ const struct ieee80211_ops rtl_ops = {
- 	.start = rtl_op_start,
- 	.stop = rtl_op_stop,
- 	.tx = rtl_op_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.add_interface = rtl_op_add_interface,
- 	.remove_interface = rtl_op_remove_interface,
- 	.change_interface = rtl_op_change_interface,
---- a/drivers/net/wireless/realtek/rtw88/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
-@@ -896,6 +896,7 @@ static void rtw_ops_sta_rc_update(struct
- 
- const struct ieee80211_ops rtw_ops = {
- 	.tx			= rtw_ops_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.wake_tx_queue		= rtw_ops_wake_tx_queue,
- 	.start			= rtw_ops_start,
- 	.stop			= rtw_ops_stop,
---- a/drivers/net/wireless/realtek/rtw89/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
-@@ -918,6 +918,7 @@ static int rtw89_ops_set_tid_config(stru
- 
- const struct ieee80211_ops rtw89_ops = {
- 	.tx			= rtw89_ops_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.wake_tx_queue		= rtw89_ops_wake_tx_queue,
- 	.start			= rtw89_ops_start,
- 	.stop			= rtw89_ops_stop,
---- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
-+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
-@@ -1958,6 +1958,7 @@ static int rsi_mac80211_resume(struct ie
- 
- static const struct ieee80211_ops mac80211_ops = {
- 	.tx = rsi_mac80211_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.start = rsi_mac80211_start,
- 	.stop = rsi_mac80211_stop,
- 	.add_interface = rsi_mac80211_add_interface,
---- a/drivers/net/wireless/st/cw1200/main.c
-+++ b/drivers/net/wireless/st/cw1200/main.c
-@@ -209,6 +209,7 @@ static const struct ieee80211_ops cw1200
- 	.remove_interface	= cw1200_remove_interface,
- 	.change_interface	= cw1200_change_interface,
- 	.tx			= cw1200_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.hw_scan		= cw1200_hw_scan,
- 	.set_tim		= cw1200_set_tim,
- 	.sta_notify		= cw1200_sta_notify,
---- a/drivers/net/wireless/ti/wl1251/main.c
-+++ b/drivers/net/wireless/ti/wl1251/main.c
-@@ -1359,6 +1359,7 @@ static const struct ieee80211_ops wl1251
- 	.prepare_multicast = wl1251_op_prepare_multicast,
- 	.configure_filter = wl1251_op_configure_filter,
- 	.tx = wl1251_op_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.set_key = wl1251_op_set_key,
- 	.hw_scan = wl1251_op_hw_scan,
- 	.bss_info_changed = wl1251_op_bss_info_changed,
---- a/drivers/net/wireless/ti/wlcore/main.c
-+++ b/drivers/net/wireless/ti/wlcore/main.c
-@@ -5942,6 +5942,7 @@ static const struct ieee80211_ops wl1271
- 	.prepare_multicast = wl1271_op_prepare_multicast,
- 	.configure_filter = wl1271_op_configure_filter,
- 	.tx = wl1271_op_tx,
-+	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
- 	.set_key = wlcore_op_set_key,
- 	.hw_scan = wl1271_op_hw_scan,
- 	.cancel_hw_scan = wl1271_op_cancel_hw_scan,
---- a/drivers/net/wireless/zydas/zd1211rw/zd_mac.c
-+++ b/drivers/net/wireless/zydas/zd1211rw/zd_mac.c
-@@ -1344,6 +1344,7 @@ static u64 zd_op_get_tsf(struct ieee8021
- 
- static const struct ieee80211_ops zd_ops = {
- 	.tx			= zd_op_tx,
-+	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.start			= zd_op_start,
- 	.stop			= zd_op_stop,
- 	.add_interface		= zd_op_add_interface,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch
deleted file mode 100644
index f9f9977..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch
+++ /dev/null
@@ -1,683 +0,0 @@
-From: Alexander Wetzel <alexander@wetzel-home.de>
-Date: Sun, 9 Oct 2022 18:30:40 +0200
-Subject: [PATCH] wifi: mac80211: Drop support for TX push path
-
-All drivers are now using mac80211 internal queues (iTXQs).
-Drop mac80211 internal support for the old push path.
-
-Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -4346,9 +4346,6 @@ static int ieee80211_get_txq_stats(struc
- 	struct ieee80211_sub_if_data *sdata;
- 	int ret = 0;
- 
--	if (!local->ops->wake_tx_queue)
--		return 1;
--
- 	spin_lock_bh(&local->fq.lock);
- 	rcu_read_lock();
- 
---- a/net/mac80211/debugfs.c
-+++ b/net/mac80211/debugfs.c
-@@ -663,9 +663,7 @@ void debugfs_hw_add(struct ieee80211_loc
- 	DEBUGFS_ADD_MODE(force_tx_status, 0600);
- 	DEBUGFS_ADD_MODE(aql_enable, 0600);
- 	DEBUGFS_ADD(aql_pending);
--
--	if (local->ops->wake_tx_queue)
--		DEBUGFS_ADD_MODE(aqm, 0600);
-+	DEBUGFS_ADD_MODE(aqm, 0600);
- 
- 	DEBUGFS_ADD_MODE(airtime_flags, 0600);
- 
---- a/net/mac80211/debugfs_netdev.c
-+++ b/net/mac80211/debugfs_netdev.c
-@@ -677,8 +677,7 @@ static void add_common_files(struct ieee
- 	DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz);
- 	DEBUGFS_ADD(hw_queues);
- 
--	if (sdata->local->ops->wake_tx_queue &&
--	    sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
-+	if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
- 	    sdata->vif.type != NL80211_IFTYPE_NAN)
- 		DEBUGFS_ADD(aqm);
- }
---- a/net/mac80211/debugfs_sta.c
-+++ b/net/mac80211/debugfs_sta.c
-@@ -1057,10 +1057,8 @@ void ieee80211_sta_debugfs_add(struct st
- 	DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
- 	DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
- 
--	if (local->ops->wake_tx_queue) {
--		DEBUGFS_ADD(aqm);
--		DEBUGFS_ADD(airtime);
--	}
-+	DEBUGFS_ADD(aqm);
-+	DEBUGFS_ADD(airtime);
- 
- 	if (wiphy_ext_feature_isset(local->hw.wiphy,
- 				    NL80211_EXT_FEATURE_AQL))
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2294,7 +2294,6 @@ void ieee80211_wake_queue_by_reason(stru
- void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
- 				    enum queue_stop_reason reason,
- 				    bool refcounted);
--void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
- void ieee80211_add_pending_skb(struct ieee80211_local *local,
- 			       struct sk_buff *skb);
- void ieee80211_add_pending_skbs(struct ieee80211_local *local,
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -460,12 +460,6 @@ static void ieee80211_do_stop(struct iee
- 	if (cancel_scan)
- 		ieee80211_scan_cancel(local);
- 
--	/*
--	 * Stop TX on this interface first.
--	 */
--	if (!local->ops->wake_tx_queue && sdata->dev)
--		netif_tx_stop_all_queues(sdata->dev);
--
- 	ieee80211_roc_purge(local, sdata);
- 
- 	switch (sdata->vif.type) {
-@@ -813,13 +807,6 @@ static void ieee80211_uninit(struct net_
- 	ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
- }
- 
--static u16 ieee80211_netdev_select_queue(struct net_device *dev,
--					 struct sk_buff *skb,
--					 struct net_device *sb_dev)
--{
--	return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
--}
--
- static void
- ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
- {
-@@ -833,7 +820,6 @@ static const struct net_device_ops ieee8
- 	.ndo_start_xmit		= ieee80211_subif_start_xmit,
- 	.ndo_set_rx_mode	= ieee80211_set_multicast_list,
- 	.ndo_set_mac_address 	= ieee80211_change_mac,
--	.ndo_select_queue	= ieee80211_netdev_select_queue,
- 	.ndo_get_stats64	= ieee80211_get_stats64,
- };
- 
-@@ -941,7 +927,6 @@ static const struct net_device_ops ieee8
- 	.ndo_start_xmit		= ieee80211_subif_start_xmit_8023,
- 	.ndo_set_rx_mode	= ieee80211_set_multicast_list,
- 	.ndo_set_mac_address	= ieee80211_change_mac,
--	.ndo_select_queue	= ieee80211_netdev_select_queue,
- 	.ndo_get_stats64	= ieee80211_get_stats64,
- 	.ndo_fill_forward_path	= ieee80211_netdev_fill_forward_path,
- };
-@@ -1443,35 +1428,6 @@ int ieee80211_do_open(struct wireless_de
- 
- 	ieee80211_recalc_ps(local);
- 
--	if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
--	    sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
--	    local->ops->wake_tx_queue) {
--		/* XXX: for AP_VLAN, actually track AP queues */
--		if (dev)
--			netif_tx_start_all_queues(dev);
--	} else if (dev) {
--		unsigned long flags;
--		int n_acs = IEEE80211_NUM_ACS;
--		int ac;
--
--		if (local->hw.queues < IEEE80211_NUM_ACS)
--			n_acs = 1;
--
--		spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
--		if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
--		    (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
--		     skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
--			for (ac = 0; ac < n_acs; ac++) {
--				int ac_queue = sdata->vif.hw_queue[ac];
--
--				if (local->queue_stop_reasons[ac_queue] == 0 &&
--				    skb_queue_empty(&local->pending[ac_queue]))
--					netif_start_subqueue(dev, ac);
--			}
--		}
--		spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
--	}
--
- 	set_bit(SDATA_STATE_RUNNING, &sdata->state);
- 
- 	return 0;
-@@ -1501,17 +1457,12 @@ static void ieee80211_if_setup(struct ne
- {
- 	ether_setup(dev);
- 	dev->priv_flags &= ~IFF_TX_SKB_SHARING;
-+	dev->priv_flags |= IFF_NO_QUEUE;
- 	dev->netdev_ops = &ieee80211_dataif_ops;
- 	dev->needs_free_netdev = true;
- 	dev->priv_destructor = ieee80211_if_free;
- }
- 
--static void ieee80211_if_setup_no_queue(struct net_device *dev)
--{
--	ieee80211_if_setup(dev);
--	dev->priv_flags |= IFF_NO_QUEUE;
--}
--
- static void ieee80211_iface_process_skb(struct ieee80211_local *local,
- 					struct ieee80211_sub_if_data *sdata,
- 					struct sk_buff *skb)
-@@ -2096,9 +2047,7 @@ int ieee80211_if_add(struct ieee80211_lo
- 	struct net_device *ndev = NULL;
- 	struct ieee80211_sub_if_data *sdata = NULL;
- 	struct txq_info *txqi;
--	void (*if_setup)(struct net_device *dev);
- 	int ret, i;
--	int txqs = 1;
- 
- 	ASSERT_RTNL();
- 
-@@ -2121,30 +2070,18 @@ int ieee80211_if_add(struct ieee80211_lo
- 				 sizeof(void *));
- 		int txq_size = 0;
- 
--		if (local->ops->wake_tx_queue &&
--		    type != NL80211_IFTYPE_AP_VLAN &&
-+		if (type != NL80211_IFTYPE_AP_VLAN &&
- 		    (type != NL80211_IFTYPE_MONITOR ||
- 		     (params->flags & MONITOR_FLAG_ACTIVE)))
- 			txq_size += sizeof(struct txq_info) +
- 				    local->hw.txq_data_size;
- 
--		if (local->ops->wake_tx_queue) {
--			if_setup = ieee80211_if_setup_no_queue;
--		} else {
--			if_setup = ieee80211_if_setup;
--			if (local->hw.queues >= IEEE80211_NUM_ACS)
--				txqs = IEEE80211_NUM_ACS;
--		}
--
- 		ndev = alloc_netdev_mqs(size + txq_size,
- 					name, name_assign_type,
--					if_setup, txqs, 1);
-+					ieee80211_if_setup, 1, 1);
- 		if (!ndev)
- 			return -ENOMEM;
- 
--		if (!local->ops->wake_tx_queue && local->hw.wiphy->tx_queue_len)
--			ndev->tx_queue_len = local->hw.wiphy->tx_queue_len;
--
- 		dev_net_set(ndev, wiphy_net(local->hw.wiphy));
- 
- 		ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -630,7 +630,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
- 
- 	if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
- 		    !ops->add_interface || !ops->remove_interface ||
--		    !ops->configure_filter))
-+		    !ops->configure_filter || !ops->wake_tx_queue))
- 		return NULL;
- 
- 	if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
-@@ -719,9 +719,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
- 	if (!ops->set_key)
- 		wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
- 
--	if (ops->wake_tx_queue)
--		wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
--
-+	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
- 
- 	wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
-@@ -834,10 +832,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
- 		atomic_set(&local->agg_queue_stop[i], 0);
- 	}
- 	tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
--
--	if (ops->wake_tx_queue)
--		tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
--
-+	tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
- 	tasklet_setup(&local->tasklet, ieee80211_tasklet_handler);
- 
- 	skb_queue_head_init(&local->skb_queue);
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -1571,9 +1571,6 @@ static void sta_ps_start(struct sta_info
- 
- 	ieee80211_clear_fast_xmit(sta);
- 
--	if (!sta->sta.txq[0])
--		return;
--
- 	for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) {
- 		struct ieee80211_txq *txq = sta->sta.txq[tid];
- 		struct txq_info *txqi = to_txq_info(txq);
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -140,17 +140,15 @@ static void __cleanup_single_sta(struct
- 		atomic_dec(&ps->num_sta_ps);
- 	}
- 
--	if (sta->sta.txq[0]) {
--		for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
--			struct txq_info *txqi;
-+	for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-+		struct txq_info *txqi;
- 
--			if (!sta->sta.txq[i])
--				continue;
-+		if (!sta->sta.txq[i])
-+			continue;
- 
--			txqi = to_txq_info(sta->sta.txq[i]);
-+		txqi = to_txq_info(sta->sta.txq[i]);
- 
--			ieee80211_txq_purge(local, txqi);
--		}
-+		ieee80211_txq_purge(local, txqi);
- 	}
- 
- 	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
-@@ -425,8 +423,7 @@ void sta_info_free(struct ieee80211_loca
- 
- 	sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
- 
--	if (sta->sta.txq[0])
--		kfree(to_txq_info(sta->sta.txq[0]));
-+	kfree(to_txq_info(sta->sta.txq[0]));
- 	kfree(rcu_dereference_raw(sta->sta.rates));
- #ifdef CPTCFG_MAC80211_MESH
- 	kfree(sta->mesh);
-@@ -527,6 +524,8 @@ __sta_info_alloc(struct ieee80211_sub_if
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_hw *hw = &local->hw;
- 	struct sta_info *sta;
-+	void *txq_data;
-+	int size;
- 	int i;
- 
- 	sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
-@@ -597,21 +596,18 @@ __sta_info_alloc(struct ieee80211_sub_if
- 
- 	sta->last_connected = ktime_get_seconds();
- 
--	if (local->ops->wake_tx_queue) {
--		void *txq_data;
--		int size = sizeof(struct txq_info) +
--			   ALIGN(hw->txq_data_size, sizeof(void *));
-+	size = sizeof(struct txq_info) +
-+	       ALIGN(hw->txq_data_size, sizeof(void *));
- 
--		txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
--		if (!txq_data)
--			goto free;
-+	txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
-+	if (!txq_data)
-+		goto free;
- 
--		for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
--			struct txq_info *txq = txq_data + i * size;
-+	for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-+		struct txq_info *txq = txq_data + i * size;
- 
--			/* might not do anything for the bufferable MMPDU TXQ */
--			ieee80211_txq_init(sdata, sta, txq, i);
--		}
-+		/* might not do anything for the (bufferable) MMPDU TXQ */
-+		ieee80211_txq_init(sdata, sta, txq, i);
- 	}
- 
- 	if (sta_prepare_rate_control(local, sta, gfp))
-@@ -685,8 +681,7 @@ __sta_info_alloc(struct ieee80211_sub_if
- 	return sta;
- 
- free_txq:
--	if (sta->sta.txq[0])
--		kfree(to_txq_info(sta->sta.txq[0]));
-+	kfree(to_txq_info(sta->sta.txq[0]));
- free:
- 	sta_info_free_link(&sta->deflink);
- #ifdef CPTCFG_MAC80211_MESH
-@@ -1960,9 +1955,6 @@ ieee80211_sta_ps_deliver_response(struct
- 		 * TIM recalculation.
- 		 */
- 
--		if (!sta->sta.txq[0])
--			return;
--
- 		for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
- 			if (!sta->sta.txq[tid] ||
- 			    !(driver_release_tids & BIT(tid)) ||
-@@ -2447,7 +2439,7 @@ static void sta_set_tidstats(struct sta_
- 		tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
- 	}
- 
--	if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
-+	if (tid < IEEE80211_NUM_TIDS) {
- 		spin_lock_bh(&local->fq.lock);
- 		rcu_read_lock();
- 
-@@ -2775,9 +2767,6 @@ unsigned long ieee80211_sta_last_active(
- 
- static void sta_update_codel_params(struct sta_info *sta, u32 thr)
- {
--	if (!sta->sdata->local->ops->wake_tx_queue)
--		return;
--
- 	if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
- 		sta->cparams.target = MS2TIME(50);
- 		sta->cparams.interval = MS2TIME(300);
---- a/net/mac80211/tdls.c
-+++ b/net/mac80211/tdls.c
-@@ -1016,7 +1016,6 @@ ieee80211_tdls_prep_mgmt_packet(struct w
- 		skb->priority = 256 + 5;
- 		break;
- 	}
--	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
- 
- 	/*
- 	 * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1600,9 +1600,6 @@ int ieee80211_txq_setup_flows(struct iee
- 	bool supp_vht = false;
- 	enum nl80211_band band;
- 
--	if (!local->ops->wake_tx_queue)
--		return 0;
--
- 	ret = fq_init(fq, 4096);
- 	if (ret)
- 		return ret;
-@@ -1650,9 +1647,6 @@ void ieee80211_txq_teardown_flows(struct
- {
- 	struct fq *fq = &local->fq;
- 
--	if (!local->ops->wake_tx_queue)
--		return;
--
- 	kfree(local->cvars);
- 	local->cvars = NULL;
- 
-@@ -1669,8 +1663,7 @@ static bool ieee80211_queue_skb(struct i
- 	struct ieee80211_vif *vif;
- 	struct txq_info *txqi;
- 
--	if (!local->ops->wake_tx_queue ||
--	    sdata->vif.type == NL80211_IFTYPE_MONITOR)
-+	if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
- 		return false;
- 
- 	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-@@ -4193,12 +4186,7 @@ void __ieee80211_subif_start_xmit(struct
- 	if (IS_ERR(sta))
- 		sta = NULL;
- 
--	if (local->ops->wake_tx_queue) {
--		u16 queue = __ieee80211_select_queue(sdata, sta, skb);
--		skb_set_queue_mapping(skb, queue);
--		skb_get_hash(skb);
--	}
--
-+	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
- 	ieee80211_aggr_check(sdata, sta, skb);
- 
- 	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
-@@ -4509,11 +4497,7 @@ static void ieee80211_8023_xmit(struct i
- 	struct tid_ampdu_tx *tid_tx;
- 	u8 tid;
- 
--	if (local->ops->wake_tx_queue) {
--		u16 queue = __ieee80211_select_queue(sdata, sta, skb);
--		skb_set_queue_mapping(skb, queue);
--		skb_get_hash(skb);
--	}
-+	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
- 
- 	if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
- 	    test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
-@@ -4767,9 +4751,6 @@ void ieee80211_tx_pending(struct tasklet
- 			if (!txok)
- 				break;
- 		}
--
--		if (skb_queue_empty(&local->pending[i]))
--			ieee80211_propagate_queue_wake(local, i);
- 	}
- 	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
- 
-@@ -5962,10 +5943,9 @@ int ieee80211_tx_control_port(struct wip
- 	}
- 
- 	if (!IS_ERR(sta)) {
--		u16 queue = __ieee80211_select_queue(sdata, sta, skb);
-+		u16 queue = ieee80211_select_queue(sdata, sta, skb);
- 
- 		skb_set_queue_mapping(skb, queue);
--		skb_get_hash(skb);
- 
- 		/*
- 		 * for MLO STA, the SA should be the AP MLD address, but
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -444,39 +444,6 @@ void ieee80211_wake_txqs(struct tasklet_
- 	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
- }
- 
--void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
--{
--	struct ieee80211_sub_if_data *sdata;
--	int n_acs = IEEE80211_NUM_ACS;
--
--	if (local->ops->wake_tx_queue)
--		return;
--
--	if (local->hw.queues < IEEE80211_NUM_ACS)
--		n_acs = 1;
--
--	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
--		int ac;
--
--		if (!sdata->dev)
--			continue;
--
--		if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
--		    local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
--			continue;
--
--		for (ac = 0; ac < n_acs; ac++) {
--			int ac_queue = sdata->vif.hw_queue[ac];
--
--			if (ac_queue == queue ||
--			    (sdata->vif.cab_queue == queue &&
--			     local->queue_stop_reasons[ac_queue] == 0 &&
--			     skb_queue_empty(&local->pending[ac_queue])))
--				netif_wake_subqueue(sdata->dev, ac);
--		}
--	}
--}
--
- static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
- 				   enum queue_stop_reason reason,
- 				   bool refcounted,
-@@ -507,11 +474,7 @@ static void __ieee80211_wake_queue(struc
- 		/* someone still has this queue stopped */
- 		return;
- 
--	if (skb_queue_empty(&local->pending[queue])) {
--		rcu_read_lock();
--		ieee80211_propagate_queue_wake(local, queue);
--		rcu_read_unlock();
--	} else
-+	if (!skb_queue_empty(&local->pending[queue]))
- 		tasklet_schedule(&local->tx_pending_tasklet);
- 
- 	/*
-@@ -521,12 +484,10 @@ static void __ieee80211_wake_queue(struc
- 	 * release someone's lock, but it is fine because all the callers of
- 	 * __ieee80211_wake_queue call it right before releasing the lock.
- 	 */
--	if (local->ops->wake_tx_queue) {
--		if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
--			tasklet_schedule(&local->wake_txqs_tasklet);
--		else
--			_ieee80211_wake_txqs(local, flags);
--	}
-+	if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
-+		tasklet_schedule(&local->wake_txqs_tasklet);
-+	else
-+		_ieee80211_wake_txqs(local, flags);
- }
- 
- void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
-@@ -554,8 +515,6 @@ static void __ieee80211_stop_queue(struc
- 				   bool refcounted)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
--	struct ieee80211_sub_if_data *sdata;
--	int n_acs = IEEE80211_NUM_ACS;
- 
- 	trace_stop_queue(local, queue, reason);
- 
-@@ -567,27 +526,7 @@ static void __ieee80211_stop_queue(struc
- 	else
- 		local->q_stop_reasons[queue][reason]++;
- 
--	if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
--		return;
--
--	if (local->hw.queues < IEEE80211_NUM_ACS)
--		n_acs = 1;
--
--	rcu_read_lock();
--	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
--		int ac;
--
--		if (!sdata->dev)
--			continue;
--
--		for (ac = 0; ac < n_acs; ac++) {
--			if (!local->ops->wake_tx_queue &&
--			    (sdata->vif.hw_queue[ac] == queue ||
--			     sdata->vif.cab_queue == queue))
--				netif_stop_subqueue(sdata->dev, ac);
--		}
--	}
--	rcu_read_unlock();
-+	set_bit(reason, &local->queue_stop_reasons[queue]);
- }
- 
- void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
---- a/net/mac80211/wme.c
-+++ b/net/mac80211/wme.c
-@@ -122,6 +122,9 @@ u16 ieee80211_select_queue_80211(struct
- 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- 	u8 *p;
- 
-+	/* Ensure hash is set prior to potential SW encryption */
-+	skb_get_hash(skb);
-+
- 	if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
- 	    local->hw.queues < IEEE80211_NUM_ACS)
- 		return 0;
-@@ -141,13 +144,16 @@ u16 ieee80211_select_queue_80211(struct
- 	return ieee80211_downgrade_queue(sdata, NULL, skb);
- }
- 
--u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
--			     struct sta_info *sta, struct sk_buff *skb)
-+u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
-+			   struct sta_info *sta, struct sk_buff *skb)
- {
- 	const struct ethhdr *eth = (void *)skb->data;
- 	struct mac80211_qos_map *qos_map;
- 	bool qos;
- 
-+	/* Ensure hash is set prior to potential SW encryption */
-+	skb_get_hash(skb);
-+
- 	/* all mesh/ocb stations are required to support WME */
- 	if ((sdata->vif.type == NL80211_IFTYPE_MESH_POINT &&
- 	    !is_multicast_ether_addr(eth->h_dest)) ||
-@@ -178,59 +184,6 @@ u16 __ieee80211_select_queue(struct ieee
- 	return ieee80211_downgrade_queue(sdata, sta, skb);
- }
- 
--
--/* Indicate which queue to use. */
--u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
--			   struct sk_buff *skb)
--{
--	struct ieee80211_local *local = sdata->local;
--	struct sta_info *sta = NULL;
--	const u8 *ra = NULL;
--	u16 ret;
--
--	/* when using iTXQ, we can do this later */
--	if (local->ops->wake_tx_queue)
--		return 0;
--
--	if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) {
--		skb->priority = 0; /* required for correct WPA/11i MIC */
--		return 0;
--	}
--
--	rcu_read_lock();
--	switch (sdata->vif.type) {
--	case NL80211_IFTYPE_AP_VLAN:
--		sta = rcu_dereference(sdata->u.vlan.sta);
--		if (sta)
--			break;
--		fallthrough;
--	case NL80211_IFTYPE_AP:
--		ra = skb->data;
--		break;
--	case NL80211_IFTYPE_STATION:
--		/* might be a TDLS station */
--		sta = sta_info_get(sdata, skb->data);
--		if (sta)
--			break;
--
--		ra = sdata->deflink.u.mgd.bssid;
--		break;
--	case NL80211_IFTYPE_ADHOC:
--		ra = skb->data;
--		break;
--	default:
--		break;
--	}
--
--	if (!sta && ra && !is_multicast_ether_addr(ra))
--		sta = sta_info_get(sdata, ra);
--
--	ret = __ieee80211_select_queue(sdata, sta, skb);
--
--	rcu_read_unlock();
--	return ret;
--}
--
- /**
-  * ieee80211_set_qos_hdr - Fill in the QoS header if there is one.
-  *
---- a/net/mac80211/wme.h
-+++ b/net/mac80211/wme.h
-@@ -13,10 +13,8 @@
- u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
- 				 struct sk_buff *skb,
- 				 struct ieee80211_hdr *hdr);
--u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
--			     struct sta_info *sta, struct sk_buff *skb);
- u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
--			   struct sk_buff *skb);
-+			   struct sta_info *sta, struct sk_buff *skb);
- void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
- 			   struct sk_buff *skb);
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch
deleted file mode 100644
index f0dfc75..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 10 Oct 2022 19:17:46 +0200
-Subject: [PATCH] wifi: realtek: remove duplicated wake_tx_queue
-
-By accident, the previous patch duplicated the initialization
-of the wake_tx_queue callback. Fix that by removing the new
-initializations.
-
-Fixes: a790cc3a4fad ("wifi: mac80211: add wake_tx_queue callback to drivers")
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/drivers/net/wireless/realtek/rtw88/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
-@@ -896,7 +896,6 @@ static void rtw_ops_sta_rc_update(struct
- 
- const struct ieee80211_ops rtw_ops = {
- 	.tx			= rtw_ops_tx,
--	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.wake_tx_queue		= rtw_ops_wake_tx_queue,
- 	.start			= rtw_ops_start,
- 	.stop			= rtw_ops_stop,
---- a/drivers/net/wireless/realtek/rtw89/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
-@@ -918,7 +918,6 @@ static int rtw89_ops_set_tid_config(stru
- 
- const struct ieee80211_ops rtw89_ops = {
- 	.tx			= rtw89_ops_tx,
--	.wake_tx_queue		= ieee80211_handle_wake_tx_queue,
- 	.wake_tx_queue		= rtw89_ops_wake_tx_queue,
- 	.start			= rtw89_ops_start,
- 	.stop			= rtw89_ops_stop,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch
similarity index 94%
rename from recipes-wifi/linux-mac80211/files/patches-6.x/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch
rename to recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch
index f7391a5..f362751 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch
@@ -14,7 +14,7 @@
 
 --- a/net/mac80211/mesh.c
 +++ b/net/mac80211/mesh.c
-@@ -703,6 +703,9 @@ bool ieee80211_mesh_xmit_fast(struct iee
+@@ -765,6 +765,9 @@ bool ieee80211_mesh_xmit_fast(struct iee
  			      struct sk_buff *skb, u32 ctrl_flags)
  {
  	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
@@ -24,7 +24,7 @@
  	struct ieee80211_mesh_fast_tx *entry;
  	struct ieee80211s_hdr *meshhdr;
  	u8 sa[ETH_ALEN] __aligned(2);
-@@ -738,7 +741,10 @@ bool ieee80211_mesh_xmit_fast(struct iee
+@@ -800,7 +803,10 @@ bool ieee80211_mesh_xmit_fast(struct iee
  			return false;
  	}
  
@@ -38,7 +38,7 @@
  
 --- a/net/mac80211/mesh.h
 +++ b/net/mac80211/mesh.h
-@@ -133,9 +133,33 @@ struct mesh_path {
+@@ -134,9 +134,33 @@ struct mesh_path {
  #define MESH_FAST_TX_CACHE_TIMEOUT		8000 /* msecs */
  
  /**
@@ -73,7 +73,7 @@
   * @fast_tx: base fast_tx data
   * @hdr: cached mesh and rfc1042 headers
   * @hdrlen: length of mesh + rfc1042
-@@ -146,7 +170,7 @@ struct mesh_path {
+@@ -147,7 +171,7 @@ struct mesh_path {
   */
  struct ieee80211_mesh_fast_tx {
  	struct rhash_head rhash;
@@ -82,7 +82,7 @@
  
  	struct ieee80211_fast_tx fast_tx;
  	u8 hdr[sizeof(struct ieee80211s_hdr) + sizeof(rfc1042_header)];
-@@ -329,7 +353,8 @@ void mesh_path_tx_root_frame(struct ieee
+@@ -334,7 +358,8 @@ void mesh_path_tx_root_frame(struct ieee
  
  bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt);
  struct ieee80211_mesh_fast_tx *
@@ -189,7 +189,7 @@
  
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2726,7 +2726,10 @@ ieee80211_rx_mesh_fast_forward(struct ie
+@@ -2727,7 +2727,10 @@ ieee80211_rx_mesh_fast_forward(struct ie
  			       struct sk_buff *skb, int hdrlen)
  {
  	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
@@ -201,7 +201,7 @@
  	struct ieee80211s_hdr *mesh_hdr;
  	struct tid_ampdu_tx *tid_tx;
  	struct sta_info *sta;
-@@ -2735,9 +2738,13 @@ ieee80211_rx_mesh_fast_forward(struct ie
+@@ -2736,9 +2739,13 @@ ieee80211_rx_mesh_fast_forward(struct ie
  
  	mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth));
  	if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch
deleted file mode 100644
index 812b121..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch
+++ /dev/null
@@ -1,506 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 9 Oct 2022 20:15:46 +0200
-Subject: [PATCH] mac80211: add support for restricting netdev features per vif
-
-This can be used to selectively disable feature flags for checksum offload,
-scatter/gather or GSO by changing vif->netdev_features.
-Removing features from vif->netdev_features does not affect the netdev
-features themselves, but instead fixes up skbs in the tx path so that the
-offloads are not needed in the driver.
-
-Aside from making it easier to deal with vif type based hardware limitations,
-this also makes it possible to optimize performance on hardware without native
-GSO support by declaring GSO support in hw->netdev_features and removing it
-from vif->netdev_features. This allows mac80211 to handle GSO segmentation
-after the sta lookup, but before itxq enqueue, thus reducing the number of
-unnecessary sta lookups, as well as some other per-packet processing.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/fq_impl.h
-+++ b/include/net/fq_impl.h
-@@ -200,6 +200,7 @@ static void fq_tin_enqueue(struct fq *fq
- 			   fq_skb_free_t free_func)
- {
- 	struct fq_flow *flow;
-+	struct sk_buff *next;
- 	bool oom;
- 
- 	lockdep_assert_held(&fq->lock);
-@@ -214,11 +215,15 @@ static void fq_tin_enqueue(struct fq *fq
- 	}
- 
- 	flow->tin = tin;
--	flow->backlog += skb->len;
--	tin->backlog_bytes += skb->len;
--	tin->backlog_packets++;
--	fq->memory_usage += skb->truesize;
--	fq->backlog++;
-+	skb_list_walk_safe(skb, skb, next) {
-+		skb_mark_not_on_list(skb);
-+		flow->backlog += skb->len;
-+		tin->backlog_bytes += skb->len;
-+		tin->backlog_packets++;
-+		fq->memory_usage += skb->truesize;
-+		fq->backlog++;
-+		__skb_queue_tail(&flow->queue, skb);
-+	}
- 
- 	if (list_empty(&flow->flowchain)) {
- 		flow->deficit = fq->quantum;
-@@ -226,7 +231,6 @@ static void fq_tin_enqueue(struct fq *fq
- 			      &tin->new_flows);
- 	}
- 
--	__skb_queue_tail(&flow->queue, skb);
- 	oom = (fq->memory_usage > fq->memory_limit);
- 	while (fq->backlog > fq->limit || oom) {
- 		flow = fq_find_fattest_flow(fq);
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1807,6 +1807,10 @@ struct ieee80211_vif_cfg {
-  * @addr: address of this interface
-  * @p2p: indicates whether this AP or STA interface is a p2p
-  *	interface, i.e. a GO or p2p-sta respectively
-+ * @netdev_features: tx netdev features supported by the hardware for this
-+ *	vif. mac80211 initializes this to hw->netdev_features, and the driver
-+ *	can mask out specific tx features. mac80211 will handle software fixup
-+ *	for masked offloads (GSO, CSUM)
-  * @driver_flags: flags/capabilities the driver has for this interface,
-  *	these need to be set (or cleared) when the interface is added
-  *	or, if supported by the driver, the interface type is changed
-@@ -1846,6 +1850,7 @@ struct ieee80211_vif {
- 
- 	struct ieee80211_txq *txq;
- 
-+	netdev_features_t netdev_features;
- 	u32 driver_flags;
- 	u32 offload_flags;
- 
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -2181,6 +2181,7 @@ int ieee80211_if_add(struct ieee80211_lo
- 		ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
- 		ndev->hw_features |= ndev->features &
- 					MAC80211_SUPPORTED_FEATURES_TX;
-+		sdata->vif.netdev_features = local->hw.netdev_features;
- 
- 		netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops);
- 
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1356,7 +1356,11 @@ static struct txq_info *ieee80211_get_tx
- 
- static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb)
- {
--	IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time();
-+	struct sk_buff *next;
-+	codel_time_t now = codel_get_time();
-+
-+	skb_list_walk_safe(skb, skb, next)
-+		IEEE80211_SKB_CB(skb)->control.enqueue_time = now;
- }
- 
- static u32 codel_skb_len_func(const struct sk_buff *skb)
-@@ -3579,55 +3583,79 @@ ieee80211_xmit_fast_finish(struct ieee80
- 	return TX_CONTINUE;
- }
- 
--static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
--				struct sta_info *sta,
--				struct ieee80211_fast_tx *fast_tx,
--				struct sk_buff *skb)
-+static netdev_features_t
-+ieee80211_sdata_netdev_features(struct ieee80211_sub_if_data *sdata)
- {
--	struct ieee80211_local *local = sdata->local;
--	u16 ethertype = (skb->data[12] << 8) | skb->data[13];
--	int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
--	int hw_headroom = sdata->local->hw.extra_tx_headroom;
--	struct ethhdr eth;
--	struct ieee80211_tx_info *info;
--	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
--	struct ieee80211_tx_data tx;
--	ieee80211_tx_result r;
--	struct tid_ampdu_tx *tid_tx = NULL;
--	u8 tid = IEEE80211_NUM_TIDS;
-+	if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
-+		return sdata->vif.netdev_features;
- 
--	/* control port protocol needs a lot of special handling */
--	if (cpu_to_be16(ethertype) == sdata->control_port_protocol)
--		return false;
-+	if (!sdata->bss)
-+		return 0;
- 
--	/* only RFC 1042 SNAP */
--	if (ethertype < ETH_P_802_3_MIN)
--		return false;
-+	sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap);
-+	return sdata->vif.netdev_features;
-+}
- 
--	/* don't handle TX status request here either */
--	if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
--		return false;
-+static struct sk_buff *
-+ieee80211_tx_skb_fixup(struct sk_buff *skb, netdev_features_t features)
-+{
-+	if (skb_is_gso(skb)) {
-+		struct sk_buff *segs;
- 
--	if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
--		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
--		tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
--		if (tid_tx) {
--			if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
--				return false;
--			if (tid_tx->timeout)
--				tid_tx->last_tx = jiffies;
--		}
-+		segs = skb_gso_segment(skb, features);
-+		if (!segs)
-+			return skb;
-+		if (IS_ERR(segs))
-+			goto free;
-+
-+		consume_skb(skb);
-+		return segs;
- 	}
- 
--	/* after this point (skb is modified) we cannot return false */
-+	if (skb_needs_linearize(skb, features) && __skb_linearize(skb))
-+		goto free;
-+
-+	if (skb->ip_summed == CHECKSUM_PARTIAL) {
-+		int ofs = skb_checksum_start_offset(skb);
-+
-+		if (skb->encapsulation)
-+			skb_set_inner_transport_header(skb, ofs);
-+		else
-+			skb_set_transport_header(skb, ofs);
-+
-+		if (skb_csum_hwoffload_help(skb, features))
-+			goto free;
-+	}
-+
-+	skb_mark_not_on_list(skb);
-+	return skb;
-+
-+free:
-+	kfree_skb(skb);
-+	return NULL;
-+}
-+
-+static void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+				  struct sta_info *sta,
-+				  struct ieee80211_fast_tx *fast_tx,
-+				  struct sk_buff *skb, u8 tid, bool ampdu)
-+{
-+	struct ieee80211_local *local = sdata->local;
-+	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-+	struct ieee80211_tx_info *info;
-+	struct ieee80211_tx_data tx;
-+	ieee80211_tx_result r;
-+	int hw_headroom = sdata->local->hw.extra_tx_headroom;
-+	int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
-+	struct ethhdr eth;
- 
- 	skb = skb_share_check(skb, GFP_ATOMIC);
- 	if (unlikely(!skb))
--		return true;
-+		return;
- 
- 	if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) &&
- 	    ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb))
--		return true;
-+		return;
- 
- 	/* will not be crypto-handled beyond what we do here, so use false
- 	 * as the may-encrypt argument for the resize to not account for
-@@ -3636,10 +3664,8 @@ static bool ieee80211_xmit_fast(struct i
- 	if (unlikely(ieee80211_skb_resize(sdata, skb,
- 					  max_t(int, extra_head + hw_headroom -
- 						     skb_headroom(skb), 0),
--					  ENCRYPT_NO))) {
--		kfree_skb(skb);
--		return true;
--	}
-+					  ENCRYPT_NO)))
-+		goto free;
- 
- 	memcpy(&eth, skb->data, ETH_HLEN - 2);
- 	hdr = skb_push(skb, extra_head);
-@@ -3653,7 +3679,7 @@ static bool ieee80211_xmit_fast(struct i
- 	info->control.vif = &sdata->vif;
- 	info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT |
- 		      IEEE80211_TX_CTL_DONTFRAG |
--		      (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0);
-+		      (ampdu ? IEEE80211_TX_CTL_AMPDU : 0);
- 	info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT |
- 			      u32_encode_bits(IEEE80211_LINK_UNSPECIFIED,
- 					      IEEE80211_TX_CTRL_MLO_LINK);
-@@ -3677,16 +3703,14 @@ static bool ieee80211_xmit_fast(struct i
- 	tx.key = fast_tx->key;
- 
- 	if (ieee80211_queue_skb(local, sdata, sta, skb))
--		return true;
-+		return;
- 
- 	tx.skb = skb;
- 	r = ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs,
- 				       fast_tx->key, &tx);
- 	tx.skb = NULL;
--	if (r == TX_DROP) {
--		kfree_skb(skb);
--		return true;
--	}
-+	if (r == TX_DROP)
-+		goto free;
- 
- 	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
- 		sdata = container_of(sdata->bss,
-@@ -3694,6 +3718,56 @@ static bool ieee80211_xmit_fast(struct i
- 
- 	__skb_queue_tail(&tx.skbs, skb);
- 	ieee80211_tx_frags(local, &sdata->vif, sta, &tx.skbs, false);
-+	return;
-+
-+free:
-+	kfree_skb(skb);
-+}
-+
-+static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+				struct sta_info *sta,
-+				struct ieee80211_fast_tx *fast_tx,
-+				struct sk_buff *skb)
-+{
-+	u16 ethertype = (skb->data[12] << 8) | skb->data[13];
-+	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-+	struct tid_ampdu_tx *tid_tx = NULL;
-+	struct sk_buff *next;
-+	u8 tid = IEEE80211_NUM_TIDS;
-+
-+	/* control port protocol needs a lot of special handling */
-+	if (cpu_to_be16(ethertype) == sdata->control_port_protocol)
-+		return false;
-+
-+	/* only RFC 1042 SNAP */
-+	if (ethertype < ETH_P_802_3_MIN)
-+		return false;
-+
-+	/* don't handle TX status request here either */
-+	if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
-+		return false;
-+
-+	if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
-+		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-+		tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
-+		if (tid_tx) {
-+			if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
-+				return false;
-+			if (tid_tx->timeout)
-+				tid_tx->last_tx = jiffies;
-+		}
-+	}
-+
-+	/* after this point (skb is modified) we cannot return false */
-+	skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
-+	if (!skb)
-+		return true;
-+
-+	skb_list_walk_safe(skb, skb, next) {
-+		skb_mark_not_on_list(skb);
-+		__ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid, tid_tx);
-+	}
-+
- 	return true;
- }
- 
-@@ -4201,31 +4275,14 @@ void __ieee80211_subif_start_xmit(struct
- 			goto out;
- 	}
- 
--	if (skb_is_gso(skb)) {
--		struct sk_buff *segs;
--
--		segs = skb_gso_segment(skb, 0);
--		if (IS_ERR(segs)) {
--			goto out_free;
--		} else if (segs) {
--			consume_skb(skb);
--			skb = segs;
--		}
--	} else {
--		/* we cannot process non-linear frames on this path */
--		if (skb_linearize(skb))
--			goto out_free;
--
--		/* the frame could be fragmented, software-encrypted, and other
--		 * things so we cannot really handle checksum offload with it -
--		 * fix it up in software before we handle anything else.
--		 */
--		if (skb->ip_summed == CHECKSUM_PARTIAL) {
--			skb_set_transport_header(skb,
--						 skb_checksum_start_offset(skb));
--			if (skb_checksum_help(skb))
--				goto out_free;
--		}
-+	/* the frame could be fragmented, software-encrypted, and other
-+	 * things so we cannot really handle checksum or GSO offload.
-+	 * fix it up in software before we handle anything else.
-+	 */
-+	skb = ieee80211_tx_skb_fixup(skb, 0);
-+	if (!skb) {
-+		len = 0;
-+		goto out;
- 	}
- 
- 	skb_list_walk_safe(skb, skb, next) {
-@@ -4443,9 +4500,11 @@ normal:
- 	return NETDEV_TX_OK;
- }
- 
--static bool ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata,
--			      struct sk_buff *skb, struct sta_info *sta,
--			      bool txpending)
-+
-+
-+static bool __ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata,
-+				struct sk_buff *skb, struct sta_info *sta,
-+				bool txpending)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_tx_control control = {};
-@@ -4454,14 +4513,6 @@ static bool ieee80211_tx_8023(struct iee
- 	unsigned long flags;
- 	int q = info->hw_queue;
- 
--	if (sta)
--		sk_pacing_shift_update(skb->sk, local->hw.tx_sk_pacing_shift);
--
--	ieee80211_tpt_led_trig_tx(local, skb->len);
--
--	if (ieee80211_queue_skb(local, sdata, sta, skb))
--		return true;
--
- 	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
- 
- 	if (local->queue_stop_reasons[q] ||
-@@ -4488,6 +4539,26 @@ static bool ieee80211_tx_8023(struct iee
- 	return true;
- }
- 
-+static bool ieee80211_tx_8023(struct ieee80211_sub_if_data *sdata,
-+			      struct sk_buff *skb, struct sta_info *sta,
-+			      bool txpending)
-+{
-+	struct ieee80211_local *local = sdata->local;
-+	struct sk_buff *next;
-+	bool ret = true;
-+
-+	if (ieee80211_queue_skb(local, sdata, sta, skb))
-+		return true;
-+
-+	skb_list_walk_safe(skb, skb, next) {
-+		skb_mark_not_on_list(skb);
-+		if (!__ieee80211_tx_8023(sdata, skb, sta, txpending))
-+			ret = false;
-+	}
-+
-+	return ret;
-+}
-+
- static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
- 				struct net_device *dev, struct sta_info *sta,
- 				struct ieee80211_key *key, struct sk_buff *skb)
-@@ -4495,9 +4566,13 @@ static void ieee80211_8023_xmit(struct i
- 	struct ieee80211_tx_info *info;
- 	struct ieee80211_local *local = sdata->local;
- 	struct tid_ampdu_tx *tid_tx;
-+	struct sk_buff *seg, *next;
-+	unsigned int skbs = 0, len = 0;
-+	u16 queue;
- 	u8 tid;
- 
--	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
-+	queue = ieee80211_select_queue(sdata, sta, skb);
-+	skb_set_queue_mapping(skb, queue);
- 
- 	if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
- 	    test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
-@@ -4507,9 +4582,6 @@ static void ieee80211_8023_xmit(struct i
- 	if (unlikely(!skb))
- 		return;
- 
--	info = IEEE80211_SKB_CB(skb);
--	memset(info, 0, sizeof(*info));
--
- 	ieee80211_aggr_check(sdata, sta, skb);
- 
- 	tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-@@ -4523,22 +4595,20 @@ static void ieee80211_8023_xmit(struct i
- 			return;
- 		}
- 
--		info->flags |= IEEE80211_TX_CTL_AMPDU;
- 		if (tid_tx->timeout)
- 			tid_tx->last_tx = jiffies;
- 	}
- 
--	if (unlikely(skb->sk &&
--		     skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS))
--		info->ack_frame_id = ieee80211_store_ack_skb(local, skb,
--							     &info->flags, NULL);
-+	skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
-+	if (!skb)
-+		return;
- 
--	info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)];
-+	info = IEEE80211_SKB_CB(skb);
-+	memset(info, 0, sizeof(*info));
-+	if (tid_tx)
-+		info->flags |= IEEE80211_TX_CTL_AMPDU;
- 
--	dev_sw_netstats_tx_add(dev, 1, skb->len);
--
--	sta->deflink.tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len;
--	sta->deflink.tx_stats.packets[skb_get_queue_mapping(skb)]++;
-+	info->hw_queue = sdata->vif.hw_queue[queue];
- 
- 	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
- 		sdata = container_of(sdata->bss,
-@@ -4550,6 +4620,24 @@ static void ieee80211_8023_xmit(struct i
- 	if (key)
- 		info->control.hw_key = &key->conf;
- 
-+	skb_list_walk_safe(skb, seg, next) {
-+		skbs++;
-+		len += seg->len;
-+		if (seg != skb)
-+			memcpy(IEEE80211_SKB_CB(seg), info, sizeof(*info));
-+	}
-+
-+	if (unlikely(skb->sk &&
-+		     skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS))
-+		info->ack_frame_id = ieee80211_store_ack_skb(local, skb,
-+							     &info->flags, NULL);
-+
-+	dev_sw_netstats_tx_add(dev, skbs, len);
-+	sta->deflink.tx_stats.packets[queue] += skbs;
-+	sta->deflink.tx_stats.bytes[queue] += len;
-+
-+	ieee80211_tpt_led_trig_tx(local, len);
-+
- 	ieee80211_tx_8023(sdata, skb, sta, false);
- 
- 	return;
-@@ -4591,6 +4679,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
- 		    key->conf.cipher == WLAN_CIPHER_SUITE_TKIP))
- 		goto skip_offload;
- 
-+	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
- 	ieee80211_8023_xmit(sdata, dev, sta, key, skb);
- 	goto out;
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-mac80211-fix-mesh-id-corruption-on-32-bit-systems.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-mac80211-fix-mesh-id-corruption-on-32-bit-systems.patch
new file mode 100644
index 0000000..c0c774a
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-mac80211-fix-mesh-id-corruption-on-32-bit-systems.patch
@@ -0,0 +1,62 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Tue, 12 Sep 2023 15:09:27 +0200
+Subject: [PATCH] mac80211: fix mesh id corruption on 32 bit systems
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Since the changed field size was increased to u64, mesh_bss_info_changed
+pulls invalid bits from the first 3 bytes of the mesh id, clears them, and
+passes them on to ieee80211_link_info_change_notify, because
+ifmsh->mbss_changed was not updated to match its size.
+Fix this by turning into ifmsh->mbss_changed into an unsigned long array with
+64 bit size.
+
+Fixes: 15ddba5f4311 ("wifi: mac80211: consistently use u64 for BSS changes")
+Reported-by: Thomas Hühn <thomas.huehn@hs-nordhausen.de>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -678,7 +678,7 @@ struct ieee80211_if_mesh {
+ 	struct timer_list mesh_path_root_timer;
+ 
+ 	unsigned long wrkq_flags;
+-	unsigned long mbss_changed;
++	unsigned long mbss_changed[64 / BITS_PER_LONG];
+ 
+ 	bool userspace_handles_dfs;
+ 
+--- a/net/mac80211/mesh.c
++++ b/net/mac80211/mesh.c
+@@ -1181,7 +1181,7 @@ void ieee80211_mbss_info_change_notify(s
+ 
+ 	/* if we race with running work, worst case this work becomes a noop */
+ 	for_each_set_bit(bit, &bits, sizeof(changed) * BITS_PER_BYTE)
+-		set_bit(bit, &ifmsh->mbss_changed);
++		set_bit(bit, ifmsh->mbss_changed);
+ 	set_bit(MESH_WORK_MBSS_CHANGED, &ifmsh->wrkq_flags);
+ 	wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
+ }
+@@ -1263,7 +1263,7 @@ void ieee80211_stop_mesh(struct ieee8021
+ 
+ 	/* clear any mesh work (for next join) we may have accrued */
+ 	ifmsh->wrkq_flags = 0;
+-	ifmsh->mbss_changed = 0;
++	memset(ifmsh->mbss_changed, 0, sizeof(ifmsh->mbss_changed));
+ 
+ 	local->fif_other_bss--;
+ 	atomic_dec(&local->iff_allmultis);
+@@ -1730,9 +1730,9 @@ static void mesh_bss_info_changed(struct
+ 	u32 bit;
+ 	u64 changed = 0;
+ 
+-	for_each_set_bit(bit, &ifmsh->mbss_changed,
++	for_each_set_bit(bit, ifmsh->mbss_changed,
+ 			 sizeof(changed) * BITS_PER_BYTE) {
+-		clear_bit(bit, &ifmsh->mbss_changed);
++		clear_bit(bit, ifmsh->mbss_changed);
+ 		changed |= BIT(bit);
+ 	}
+ 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch
deleted file mode 100644
index 804b02e..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 1 Dec 2022 14:57:30 +0100
-Subject: [PATCH] wifi: mac80211: fix and simplify unencrypted drop check for
- mesh
-
-ieee80211_drop_unencrypted is called from ieee80211_rx_h_mesh_fwding and
-ieee80211_frame_allowed.
-
-Since ieee80211_rx_h_mesh_fwding can forward packets for other mesh nodes
-and is called earlier, it needs to check the decryptions status and if the
-packet is using the control protocol on its own, instead of deferring to
-the later call from ieee80211_frame_allowed.
-
-Because of that, ieee80211_drop_unencrypted has a mesh specific check
-that skips over the mesh header in order to check the payload protocol.
-This code is invalid when called from ieee80211_frame_allowed, since that
-happens after the 802.11->802.3 conversion.
-
-Fix this by moving the mesh specific check directly into
-ieee80211_rx_h_mesh_fwding.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Link: https://lore.kernel.org/r/20221201135730.19723-1-nbd@nbd.name
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2403,7 +2403,6 @@ static int ieee80211_802_1x_port_control
- 
- static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
- {
--	struct ieee80211_hdr *hdr = (void *)rx->skb->data;
- 	struct sk_buff *skb = rx->skb;
- 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
- 
-@@ -2414,31 +2413,6 @@ static int ieee80211_drop_unencrypted(st
- 	if (status->flag & RX_FLAG_DECRYPTED)
- 		return 0;
- 
--	/* check mesh EAPOL frames first */
--	if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) &&
--		     ieee80211_is_data(fc))) {
--		struct ieee80211s_hdr *mesh_hdr;
--		u16 hdr_len = ieee80211_hdrlen(fc);
--		u16 ethertype_offset;
--		__be16 ethertype;
--
--		if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr))
--			goto drop_check;
--
--		/* make sure fixed part of mesh header is there, also checks skb len */
--		if (!pskb_may_pull(rx->skb, hdr_len + 6))
--			goto drop_check;
--
--		mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len);
--		ethertype_offset = hdr_len + ieee80211_get_mesh_hdrlen(mesh_hdr) +
--				   sizeof(rfc1042_header);
--
--		if (skb_copy_bits(rx->skb, ethertype_offset, &ethertype, 2) == 0 &&
--		    ethertype == rx->sdata->control_port_protocol)
--			return 0;
--	}
--
--drop_check:
- 	/* Drop unencrypted frames if key is set. */
- 	if (unlikely(!ieee80211_has_protected(fc) &&
- 		     !ieee80211_is_any_nullfunc(fc) &&
-@@ -2892,8 +2866,16 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
- 	hdr = (struct ieee80211_hdr *) skb->data;
- 	mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
- 
--	if (ieee80211_drop_unencrypted(rx, hdr->frame_control))
--		return RX_DROP_MONITOR;
-+	if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) {
-+		int offset = hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr) +
-+			     sizeof(rfc1042_header);
-+		__be16 ethertype;
-+
-+		if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr) ||
-+		    skb_copy_bits(rx->skb, offset, &ethertype, 2) != 0 ||
-+		    ethertype != rx->sdata->control_port_protocol)
-+			return RX_DROP_MONITOR;
-+	}
- 
- 	/* frame is in RMC, don't forward */
- 	if (ieee80211_is_data(hdr->frame_control) &&
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch
deleted file mode 100644
index f668905..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 2 Dec 2022 13:53:11 +0100
-Subject: [PATCH] wifi: cfg80211: move A-MSDU check in
- ieee80211_data_to_8023_exthdr
-
-When parsing the outer A-MSDU header, don't check for inner bridge tunnel
-or RFC1042 headers. This is handled by ieee80211_amsdu_to_8023s already.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -631,8 +631,9 @@ int ieee80211_data_to_8023_exthdr(struct
- 		break;
- 	}
- 
--	if (likely(skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 &&
--	           ((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) &&
-+	if (likely(!is_amsdu &&
-+		   skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 &&
-+	           ((ether_addr_equal(payload.hdr, rfc1042_header) &&
- 		     payload.proto != htons(ETH_P_AARP) &&
- 		     payload.proto != htons(ETH_P_IPX)) ||
- 		    ether_addr_equal(payload.hdr, bridge_tunnel_header)))) {
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-wifi-cfg80211-annotate-iftype_data-pointer-with-spar.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-wifi-cfg80211-annotate-iftype_data-pointer-with-spar.patch
new file mode 100644
index 0000000..18420a8
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/312-wifi-cfg80211-annotate-iftype_data-pointer-with-spar.patch
@@ -0,0 +1,467 @@
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Mon, 28 Aug 2023 09:54:39 +0200
+Subject: [PATCH] wifi: cfg80211: annotate iftype_data pointer with sparse
+
+There were are a number of cases in mac80211 and iwlwifi (at
+least) that used the sband->iftype_data pointer directly,
+instead of using the accessors to find the right array entry
+to use.
+
+Make sparse warn when such a thing is done.
+
+To not have a lot of casts, add two helper functions/macros
+
+ - ieee80211_set_sband_iftype_data()
+ - for_each_sband_iftype_data()
+
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -5893,8 +5893,9 @@ static void ath11k_mac_setup_he_cap(stru
+ 					       ar->mac.iftype[NL80211_BAND_2GHZ],
+ 					       NL80211_BAND_2GHZ);
+ 		band = &ar->mac.sbands[NL80211_BAND_2GHZ];
+-		band->iftype_data = ar->mac.iftype[NL80211_BAND_2GHZ];
+-		band->n_iftype_data = count;
++		_ieee80211_set_sband_iftype_data(band,
++						 ar->mac.iftype[NL80211_BAND_2GHZ],
++						 count);
+ 	}
+ 
+ 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP) {
+@@ -5902,8 +5903,9 @@ static void ath11k_mac_setup_he_cap(stru
+ 					       ar->mac.iftype[NL80211_BAND_5GHZ],
+ 					       NL80211_BAND_5GHZ);
+ 		band = &ar->mac.sbands[NL80211_BAND_5GHZ];
+-		band->iftype_data = ar->mac.iftype[NL80211_BAND_5GHZ];
+-		band->n_iftype_data = count;
++		_ieee80211_set_sband_iftype_data(band,
++						 ar->mac.iftype[NL80211_BAND_5GHZ],
++						 count);
+ 	}
+ 
+ 	if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP &&
+@@ -5912,8 +5914,9 @@ static void ath11k_mac_setup_he_cap(stru
+ 					       ar->mac.iftype[NL80211_BAND_6GHZ],
+ 					       NL80211_BAND_6GHZ);
+ 		band = &ar->mac.sbands[NL80211_BAND_6GHZ];
+-		band->iftype_data = ar->mac.iftype[NL80211_BAND_6GHZ];
+-		band->n_iftype_data = count;
++		_ieee80211_set_sband_iftype_data(band,
++						 ar->mac.iftype[NL80211_BAND_6GHZ],
++						 count);
+ 	}
+ }
+ 
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
+@@ -1075,8 +1075,8 @@ static void iwl_init_he_hw_capab(struct
+ 
+ 	memcpy(iftype_data, iwl_he_eht_capa, sizeof(iwl_he_eht_capa));
+ 
+-	sband->iftype_data = iftype_data;
+-	sband->n_iftype_data = ARRAY_SIZE(iwl_he_eht_capa);
++	_ieee80211_set_sband_iftype_data(sband, iftype_data,
++					 ARRAY_SIZE(iwl_he_eht_capa));
+ 
+ 	for (i = 0; i < sband->n_iftype_data; i++)
+ 		iwl_nvm_fixup_sband_iftd(trans, data, sband, &iftype_data[i],
+--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+@@ -1119,8 +1119,7 @@ void mt7915_set_stream_he_caps(struct mt
+ 		n = mt7915_init_he_caps(phy, NL80211_BAND_2GHZ, data);
+ 
+ 		band = &phy->mt76->sband_2g.sband;
+-		band->iftype_data = data;
+-		band->n_iftype_data = n;
++		_ieee80211_set_sband_iftype_data(band, data, n);
+ 	}
+ 
+ 	if (phy->mt76->cap.has_5ghz) {
+@@ -1128,8 +1127,7 @@ void mt7915_set_stream_he_caps(struct mt
+ 		n = mt7915_init_he_caps(phy, NL80211_BAND_5GHZ, data);
+ 
+ 		band = &phy->mt76->sband_5g.sband;
+-		band->iftype_data = data;
+-		band->n_iftype_data = n;
++		_ieee80211_set_sband_iftype_data(band, data, n);
+ 	}
+ 
+ 	if (phy->mt76->cap.has_6ghz) {
+@@ -1137,8 +1135,7 @@ void mt7915_set_stream_he_caps(struct mt
+ 		n = mt7915_init_he_caps(phy, NL80211_BAND_6GHZ, data);
+ 
+ 		band = &phy->mt76->sband_6g.sband;
+-		band->iftype_data = data;
+-		band->n_iftype_data = n;
++		_ieee80211_set_sband_iftype_data(band, data, n);
+ 	}
+ }
+ 
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+@@ -196,8 +196,7 @@ void mt7921_set_stream_he_caps(struct mt
+ 		n = mt7921_init_he_caps(phy, NL80211_BAND_2GHZ, data);
+ 
+ 		band = &phy->mt76->sband_2g.sband;
+-		band->iftype_data = data;
+-		band->n_iftype_data = n;
++		_ieee80211_set_sband_iftype_data(band, data, n);
+ 	}
+ 
+ 	if (phy->mt76->cap.has_5ghz) {
+@@ -205,16 +204,14 @@ void mt7921_set_stream_he_caps(struct mt
+ 		n = mt7921_init_he_caps(phy, NL80211_BAND_5GHZ, data);
+ 
+ 		band = &phy->mt76->sband_5g.sband;
+-		band->iftype_data = data;
+-		band->n_iftype_data = n;
++		_ieee80211_set_sband_iftype_data(band, data, n);
+ 
+ 		if (phy->mt76->cap.has_6ghz) {
+ 			data = phy->iftype[NL80211_BAND_6GHZ];
+ 			n = mt7921_init_he_caps(phy, NL80211_BAND_6GHZ, data);
+ 
+ 			band = &phy->mt76->sband_6g.sband;
+-			band->iftype_data = data;
+-			band->n_iftype_data = n;
++			_ieee80211_set_sband_iftype_data(band, data, n);
+ 		}
+ 	}
+ }
+--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+@@ -823,8 +823,7 @@ __mt7996_set_stream_he_eht_caps(struct m
+ 		n++;
+ 	}
+ 
+-	sband->iftype_data = data;
+-	sband->n_iftype_data = n;
++	_ieee80211_set_sband_iftype_data(sband, data, n);
+ }
+ 
+ void mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy)
+--- a/drivers/net/wireless/quantenna/qtnfmac/commands.c
++++ b/drivers/net/wireless/quantenna/qtnfmac/commands.c
+@@ -1335,7 +1335,7 @@ static int qtnf_cmd_band_fill_iftype(con
+ 		return -EINVAL;
+ 	}
+ 
+-	kfree(band->iftype_data);
++	kfree((__force void *)band->iftype_data);
+ 	band->iftype_data = NULL;
+ 	band->n_iftype_data = tlv->n_iftype_data;
+ 	if (band->n_iftype_data == 0)
+@@ -1347,7 +1347,8 @@ static int qtnf_cmd_band_fill_iftype(con
+ 		band->n_iftype_data = 0;
+ 		return -ENOMEM;
+ 	}
+-	band->iftype_data = iftype_data;
++
++	_ieee80211_set_sband_iftype_data(band, iftype_data, tlv->n_iftype_data);
+ 
+ 	for (i = 0; i < band->n_iftype_data; i++)
+ 		qtnf_cmd_conv_iftype(iftype_data++, &tlv->iftype_data[i]);
+--- a/drivers/net/wireless/quantenna/qtnfmac/core.c
++++ b/drivers/net/wireless/quantenna/qtnfmac/core.c
+@@ -549,7 +549,7 @@ static void qtnf_core_mac_detach(struct
+ 		if (!wiphy->bands[band])
+ 			continue;
+ 
+-		kfree(wiphy->bands[band]->iftype_data);
++		kfree((__force void *)wiphy->bands[band]->iftype_data);
+ 		wiphy->bands[band]->n_iftype_data = 0;
+ 
+ 		kfree(wiphy->bands[band]->channels);
+--- a/drivers/net/wireless/realtek/rtw89/core.c
++++ b/drivers/net/wireless/realtek/rtw89/core.c
+@@ -3328,8 +3328,7 @@ static void rtw89_init_he_cap(struct rtw
+ 		idx++;
+ 	}
+ 
+-	sband->iftype_data = iftype_data;
+-	sband->n_iftype_data = idx;
++	_ieee80211_set_sband_iftype_data(sband, iftype_data, idx);
+ }
+ 
+ static int rtw89_core_set_supported_band(struct rtw89_dev *rtwdev)
+@@ -3374,11 +3373,11 @@ err:
+ 	hw->wiphy->bands[NL80211_BAND_5GHZ] = NULL;
+ 	hw->wiphy->bands[NL80211_BAND_6GHZ] = NULL;
+ 	if (sband_2ghz)
+-		kfree(sband_2ghz->iftype_data);
++		kfree((__force void *)sband_2ghz->iftype_data);
+ 	if (sband_5ghz)
+-		kfree(sband_5ghz->iftype_data);
++		kfree((__force void *)sband_5ghz->iftype_data);
+ 	if (sband_6ghz)
+-		kfree(sband_6ghz->iftype_data);
++		kfree((__force void *)sband_6ghz->iftype_data);
+ 	kfree(sband_2ghz);
+ 	kfree(sband_5ghz);
+ 	kfree(sband_6ghz);
+@@ -3390,11 +3389,11 @@ static void rtw89_core_clr_supported_ban
+ 	struct ieee80211_hw *hw = rtwdev->hw;
+ 
+ 	if (hw->wiphy->bands[NL80211_BAND_2GHZ])
+-		kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]->iftype_data);
++		kfree((__force void *)hw->wiphy->bands[NL80211_BAND_2GHZ]->iftype_data);
+ 	if (hw->wiphy->bands[NL80211_BAND_5GHZ])
+-		kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]->iftype_data);
++		kfree((__force void *)hw->wiphy->bands[NL80211_BAND_5GHZ]->iftype_data);
+ 	if (hw->wiphy->bands[NL80211_BAND_6GHZ])
+-		kfree(hw->wiphy->bands[NL80211_BAND_6GHZ]->iftype_data);
++		kfree((__force void *)hw->wiphy->bands[NL80211_BAND_6GHZ]->iftype_data);
+ 	kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]);
+ 	kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]);
+ 	kfree(hw->wiphy->bands[NL80211_BAND_6GHZ]);
+--- a/drivers/net/wireless/realtek/rtw89/regd.c
++++ b/drivers/net/wireless/realtek/rtw89/regd.c
+@@ -376,7 +376,7 @@ bottom:
+ 		return;
+ 
+ 	wiphy->bands[NL80211_BAND_6GHZ] = NULL;
+-	kfree(sband->iftype_data);
++	kfree((__force void *)sband->iftype_data);
+ 	kfree(sband);
+ }
+ 
+--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
++++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
+@@ -4900,25 +4900,19 @@ static const struct ieee80211_sband_ifty
+ 
+ static void mac80211_hwsim_sband_capab(struct ieee80211_supported_band *sband)
+ {
+-	u16 n_iftype_data;
+-
+-	if (sband->band == NL80211_BAND_2GHZ) {
+-		n_iftype_data = ARRAY_SIZE(sband_capa_2ghz);
+-		sband->iftype_data =
+-			(struct ieee80211_sband_iftype_data *)sband_capa_2ghz;
+-	} else if (sband->band == NL80211_BAND_5GHZ) {
+-		n_iftype_data = ARRAY_SIZE(sband_capa_5ghz);
+-		sband->iftype_data =
+-			(struct ieee80211_sband_iftype_data *)sband_capa_5ghz;
+-	} else if (sband->band == NL80211_BAND_6GHZ) {
+-		n_iftype_data = ARRAY_SIZE(sband_capa_6ghz);
+-		sband->iftype_data =
+-			(struct ieee80211_sband_iftype_data *)sband_capa_6ghz;
+-	} else {
+-		return;
++	switch (sband->band) {
++	case NL80211_BAND_2GHZ:
++		ieee80211_set_sband_iftype_data(sband, sband_capa_2ghz);
++		break;
++	case NL80211_BAND_5GHZ:
++		ieee80211_set_sband_iftype_data(sband, sband_capa_5ghz);
++		break;
++	case NL80211_BAND_6GHZ:
++		ieee80211_set_sband_iftype_data(sband, sband_capa_6ghz);
++		break;
++	default:
++		break;
+ 	}
+-
+-	sband->n_iftype_data = n_iftype_data;
+ }
+ 
+ #ifdef CPTCFG_MAC80211_MESH
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -415,6 +415,19 @@ struct ieee80211_sta_eht_cap {
+ 	u8 eht_ppe_thres[IEEE80211_EHT_PPE_THRES_MAX_LEN];
+ };
+ 
++/* sparse defines __CHECKER__; see Documentation/dev-tools/sparse.rst */
++#ifdef __CHECKER__
++/*
++ * This is used to mark the sband->iftype_data pointer which is supposed
++ * to be an array with special access semantics (per iftype), but a lot
++ * of code got it wrong in the past, so with this marking sparse will be
++ * noisy when the pointer is used directly.
++ */
++# define __iftd		__attribute__((noderef, address_space(__iftype_data)))
++#else
++# define __iftd
++#endif /* __CHECKER__ */
++
+ /**
+  * struct ieee80211_sband_iftype_data - sband data per interface type
+  *
+@@ -548,10 +561,48 @@ struct ieee80211_supported_band {
+ 	struct ieee80211_sta_s1g_cap s1g_cap;
+ 	struct ieee80211_edmg edmg_cap;
+ 	u16 n_iftype_data;
+-	const struct ieee80211_sband_iftype_data *iftype_data;
++	const struct ieee80211_sband_iftype_data __iftd *iftype_data;
+ };
+ 
+ /**
++ * _ieee80211_set_sband_iftype_data - set sband iftype data array
++ * @sband: the sband to initialize
++ * @iftd: the iftype data array pointer
++ * @n_iftd: the length of the iftype data array
++ *
++ * Set the sband iftype data array; use this where the length cannot
++ * be derived from the ARRAY_SIZE() of the argument, but prefer
++ * ieee80211_set_sband_iftype_data() where it can be used.
++ */
++static inline void
++_ieee80211_set_sband_iftype_data(struct ieee80211_supported_band *sband,
++				 const struct ieee80211_sband_iftype_data *iftd,
++				 u16 n_iftd)
++{
++	sband->iftype_data = (const void __iftd __force *)iftd;
++	sband->n_iftype_data = n_iftd;
++}
++
++/**
++ * ieee80211_set_sband_iftype_data - set sband iftype data array
++ * @sband: the sband to initialize
++ * @iftd: the iftype data array
++ */
++#define ieee80211_set_sband_iftype_data(sband, iftd)	\
++	_ieee80211_set_sband_iftype_data(sband, iftd, ARRAY_SIZE(iftd))
++
++/**
++ * for_each_sband_iftype_data - iterate sband iftype data entries
++ * @sband: the sband whose iftype_data array to iterate
++ * @i: iterator counter
++ * @iftd: iftype data pointer to set
++ */
++#define for_each_sband_iftype_data(sband, i, iftd)				\
++	for (i = 0, iftd = (const void __force *)&(sband)->iftype_data[i];	\
++	     i < (sband)->n_iftype_data;					\
++	     i++, iftd = (const void __force *)&(sband)->iftype_data[i])
++
++/**
+  * ieee80211_get_sband_iftype_data - return sband data for a given iftype
+  * @sband: the sband to search for the STA on
+  * @iftype: enum nl80211_iftype
+@@ -562,6 +613,7 @@ static inline const struct ieee80211_sba
+ ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband,
+ 				u8 iftype)
+ {
++	const struct ieee80211_sband_iftype_data *data;
+ 	int i;
+ 
+ 	if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
+@@ -570,10 +622,7 @@ ieee80211_get_sband_iftype_data(const st
+ 	if (iftype == NL80211_IFTYPE_AP_VLAN)
+ 		iftype = NL80211_IFTYPE_AP;
+ 
+-	for (i = 0; i < sband->n_iftype_data; i++)  {
+-		const struct ieee80211_sband_iftype_data *data =
+-			&sband->iftype_data[i];
+-
++	for_each_sband_iftype_data(sband, i, data) {
+ 		if (data->types_mask & BIT(iftype))
+ 			return data;
+ 	}
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -1055,6 +1055,7 @@ int ieee80211_register_hw(struct ieee802
+ 	supp_he = false;
+ 	supp_eht = false;
+ 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
++		const struct ieee80211_sband_iftype_data *iftd;
+ 		struct ieee80211_supported_band *sband;
+ 
+ 		sband = local->hw.wiphy->bands[band];
+@@ -1101,11 +1102,7 @@ int ieee80211_register_hw(struct ieee802
+ 		supp_ht = supp_ht || sband->ht_cap.ht_supported;
+ 		supp_vht = supp_vht || sband->vht_cap.vht_supported;
+ 
+-		for (i = 0; i < sband->n_iftype_data; i++) {
+-			const struct ieee80211_sband_iftype_data *iftd;
+-
+-			iftd = &sband->iftype_data[i];
+-
++		for_each_sband_iftype_data(sband, i, iftd) {
+ 			supp_he = supp_he || iftd->he_cap.has_he;
+ 			supp_eht = supp_eht || iftd->eht_cap.has_eht;
+ 		}
+--- a/net/wireless/chan.c
++++ b/net/wireless/chan.c
+@@ -6,7 +6,7 @@
+  *
+  * Copyright 2009	Johannes Berg <johannes@sipsolutions.net>
+  * Copyright 2013-2014  Intel Mobile Communications GmbH
+- * Copyright 2018-2022	Intel Corporation
++ * Copyright 2018-2023	Intel Corporation
+  */
+ 
+ #include <linux/export.h>
+@@ -1162,8 +1162,7 @@ bool cfg80211_chandef_usable(struct wiph
+ 		if (!sband)
+ 			return false;
+ 
+-		for (i = 0; i < sband->n_iftype_data; i++) {
+-			iftd = &sband->iftype_data[i];
++		for_each_sband_iftype_data(sband, i, iftd) {
+ 			if (!iftd->eht_cap.has_eht)
+ 				continue;
+ 
+--- a/net/wireless/core.c
++++ b/net/wireless/core.c
+@@ -5,7 +5,7 @@
+  * Copyright 2006-2010		Johannes Berg <johannes@sipsolutions.net>
+  * Copyright 2013-2014  Intel Mobile Communications GmbH
+  * Copyright 2015-2017	Intel Deutschland GmbH
+- * Copyright (C) 2018-2022 Intel Corporation
++ * Copyright (C) 2018-2023 Intel Corporation
+  */
+ 
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+@@ -817,6 +817,7 @@ int wiphy_register(struct wiphy *wiphy)
+ 
+ 	/* sanity check supported bands/channels */
+ 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
++		const struct ieee80211_sband_iftype_data *iftd;
+ 		u16 types = 0;
+ 		bool have_he = false;
+ 
+@@ -873,14 +874,11 @@ int wiphy_register(struct wiphy *wiphy)
+ 				return -EINVAL;
+ 		}
+ 
+-		for (i = 0; i < sband->n_iftype_data; i++) {
+-			const struct ieee80211_sband_iftype_data *iftd;
++		for_each_sband_iftype_data(sband, i, iftd) {
+ 			bool has_ap, has_non_ap;
+ 			u32 ap_bits = BIT(NL80211_IFTYPE_AP) |
+ 				      BIT(NL80211_IFTYPE_P2P_GO);
+ 
+-			iftd = &sband->iftype_data[i];
+-
+ 			if (WARN_ON(!iftd->types_mask))
+ 				return -EINVAL;
+ 			if (WARN_ON(types & iftd->types_mask))
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -1906,20 +1906,20 @@ static int nl80211_send_band_rateinfo(st
+ 		struct nlattr *nl_iftype_data =
+ 			nla_nest_start_noflag(msg,
+ 					      NL80211_BAND_ATTR_IFTYPE_DATA);
++		const struct ieee80211_sband_iftype_data *iftd;
+ 		int err;
+ 
+ 		if (!nl_iftype_data)
+ 			return -ENOBUFS;
+ 
+-		for (i = 0; i < sband->n_iftype_data; i++) {
++		for_each_sband_iftype_data(sband, i, iftd) {
+ 			struct nlattr *iftdata;
+ 
+ 			iftdata = nla_nest_start_noflag(msg, i + 1);
+ 			if (!iftdata)
+ 				return -ENOBUFS;
+ 
+-			err = nl80211_send_iftype_data(msg, sband,
+-						       &sband->iftype_data[i]);
++			err = nl80211_send_iftype_data(msg, sband, iftd);
+ 			if (err)
+ 				return err;
+ 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch
deleted file mode 100644
index 8641057..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 2 Dec 2022 13:54:15 +0100
-Subject: [PATCH] wifi: cfg80211: factor out bridge tunnel / RFC1042 header
- check
-
-The same check is done in multiple places, unify it.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -542,6 +542,21 @@ unsigned int ieee80211_get_mesh_hdrlen(s
- }
- EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen);
- 
-+static bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto)
-+{
-+	const __be16 *hdr_proto = hdr + ETH_ALEN;
-+
-+	if (!(ether_addr_equal(hdr, rfc1042_header) &&
-+	      *hdr_proto != htons(ETH_P_AARP) &&
-+	      *hdr_proto != htons(ETH_P_IPX)) &&
-+	    !ether_addr_equal(hdr, bridge_tunnel_header))
-+		return false;
-+
-+	*proto = *hdr_proto;
-+
-+	return true;
-+}
-+
- int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
- 				  const u8 *addr, enum nl80211_iftype iftype,
- 				  u8 data_offset, bool is_amsdu)
-@@ -633,14 +648,9 @@ int ieee80211_data_to_8023_exthdr(struct
- 
- 	if (likely(!is_amsdu &&
- 		   skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 &&
--	           ((ether_addr_equal(payload.hdr, rfc1042_header) &&
--		     payload.proto != htons(ETH_P_AARP) &&
--		     payload.proto != htons(ETH_P_IPX)) ||
--		    ether_addr_equal(payload.hdr, bridge_tunnel_header)))) {
--		/* remove RFC1042 or Bridge-Tunnel encapsulation and
--		 * replace EtherType */
-+		   ieee80211_get_8023_tunnel_proto(&payload, &tmp.h_proto))) {
-+		/* remove RFC1042 or Bridge-Tunnel encapsulation */
- 		hdrlen += ETH_ALEN + 2;
--		tmp.h_proto = payload.proto;
- 		skb_postpull_rcsum(skb, &payload, ETH_ALEN + 2);
- 	} else {
- 		tmp.h_proto = htons(skb->len - hdrlen);
-@@ -756,8 +766,6 @@ void ieee80211_amsdu_to_8023s(struct sk_
- {
- 	unsigned int hlen = ALIGN(extra_headroom, 4);
- 	struct sk_buff *frame = NULL;
--	u16 ethertype;
--	u8 *payload;
- 	int offset = 0, remaining;
- 	struct ethhdr eth;
- 	bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb);
-@@ -811,14 +819,8 @@ void ieee80211_amsdu_to_8023s(struct sk_
- 		frame->dev = skb->dev;
- 		frame->priority = skb->priority;
- 
--		payload = frame->data;
--		ethertype = (payload[6] << 8) | payload[7];
--		if (likely((ether_addr_equal(payload, rfc1042_header) &&
--			    ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
--			   ether_addr_equal(payload, bridge_tunnel_header))) {
--			eth.h_proto = htons(ethertype);
-+		if (likely(ieee80211_get_8023_tunnel_proto(frame->data, &eth.h_proto)))
- 			skb_pull(frame, ETH_ALEN + 2);
--		}
- 
- 		memcpy(skb_push(frame, sizeof(eth)), &eth, sizeof(eth));
- 		__skb_queue_tail(list, frame);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-wifi-cfg80211-export-DFS-CAC-time-and-usable-state-h.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-wifi-cfg80211-export-DFS-CAC-time-and-usable-state-h.patch
new file mode 100644
index 0000000..78ec030
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/313-wifi-cfg80211-export-DFS-CAC-time-and-usable-state-h.patch
@@ -0,0 +1,111 @@
+From 30ca8b0c4d6c9fb1d76e5894b1e8bf7c6a12224d Mon Sep 17 00:00:00 2001
+From: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Date: Tue, 12 Sep 2023 10:48:55 +0530
+Subject: [PATCH] wifi: cfg80211: export DFS CAC time and usable state helper
+ functions
+
+cfg80211 has cfg80211_chandef_dfs_usable() function to know whether
+at least one channel in the chandef is in usable state or not. Also,
+cfg80211_chandef_dfs_cac_time() function is there which tells the CAC
+time required for the given chandef.
+
+Make these two functions visible to drivers by exporting their symbol
+to global list of kernel symbols.
+
+Lower level drivers can make use of these two functions to be aware
+if CAC is required on the given chandef and for how long. For example
+drivers which maintains the CAC state internally can make use of these.
+
+Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
+Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Link: https://lore.kernel.org/r/20230912051857.2284-2-quic_adisi@quicinc.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+ include/net/cfg80211.h | 24 ++++++++++++++++++++++++
+ net/wireless/chan.c    |  2 ++
+ net/wireless/core.h    | 17 -----------------
+ 3 files changed, 26 insertions(+), 17 deletions(-)
+
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -1008,6 +1008,30 @@ int cfg80211_chandef_dfs_required(struct
+ 				  enum nl80211_iftype iftype);
+ 
+ /**
++ * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable and we
++ *				 can/need start CAC on such channel
++ * @wiphy: the wiphy to validate against
++ * @chandef: the channel definition to check
++ *
++ * Return: true if all channels available and at least
++ *	   one channel requires CAC (NL80211_DFS_USABLE)
++ */
++bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
++				 const struct cfg80211_chan_def *chandef);
++
++/**
++ * cfg80211_chandef_dfs_cac_time - get the DFS CAC time (in ms) for given
++ *				   channel definition
++ * @wiphy: the wiphy to validate against
++ * @chandef: the channel definition to check
++ *
++ * Returns: DFS CAC time (in ms) which applies for this channel definition
++ */
++unsigned int
++cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
++			      const struct cfg80211_chan_def *chandef);
++
++/**
+  * nl80211_send_chandef - sends the channel definition.
+  * @msg: the msg to send channel definition
+  * @chandef: the channel definition to check
+--- a/net/wireless/chan.c
++++ b/net/wireless/chan.c
+@@ -666,6 +666,7 @@ bool cfg80211_chandef_dfs_usable(struct
+ 
+ 	return (r1 + r2 > 0);
+ }
++EXPORT_SYMBOL(cfg80211_chandef_dfs_usable);
+ 
+ /*
+  * Checks if center frequency of chan falls with in the bandwidth
+@@ -965,6 +966,7 @@ cfg80211_chandef_dfs_cac_time(struct wip
+ 
+ 	return max(t1, t2);
+ }
++EXPORT_SYMBOL(cfg80211_chandef_dfs_cac_time);
+ 
+ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
+ 					u32 center_freq, u32 bandwidth,
+--- a/net/wireless/core.h
++++ b/net/wireless/core.h
+@@ -469,29 +469,12 @@ int cfg80211_scan(struct cfg80211_regist
+ 
+ extern struct work_struct cfg80211_disconnect_work;
+ 
+-/**
+- * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable
+- * @wiphy: the wiphy to validate against
+- * @chandef: the channel definition to check
+- *
+- * Checks if chandef is usable and we can/need start CAC on such channel.
+- *
+- * Return: true if all channels available and at least
+- *	   one channel requires CAC (NL80211_DFS_USABLE)
+- */
+-bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
+-				 const struct cfg80211_chan_def *chandef);
+-
+ void cfg80211_set_dfs_state(struct wiphy *wiphy,
+ 			    const struct cfg80211_chan_def *chandef,
+ 			    enum nl80211_dfs_state dfs_state);
+ 
+ void cfg80211_dfs_channels_update_work(struct work_struct *work);
+ 
+-unsigned int
+-cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
+-			      const struct cfg80211_chan_def *chandef);
+-
+ void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
+ 
+ int
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch
deleted file mode 100644
index 515176f..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 2 Dec 2022 17:01:46 +0100
-Subject: [PATCH] wifi: mac80211: remove mesh forwarding congestion check
-
-Now that all drivers use iTXQ, it does not make sense to check to drop
-tx forwarding packets when the driver has stopped the queues.
-fq_codel will take care of dropping packets when the queues fill up
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/debugfs_netdev.c
-+++ b/net/mac80211/debugfs_netdev.c
-@@ -603,8 +603,6 @@ IEEE80211_IF_FILE(fwded_mcast, u.mesh.ms
- IEEE80211_IF_FILE(fwded_unicast, u.mesh.mshstats.fwded_unicast, DEC);
- IEEE80211_IF_FILE(fwded_frames, u.mesh.mshstats.fwded_frames, DEC);
- IEEE80211_IF_FILE(dropped_frames_ttl, u.mesh.mshstats.dropped_frames_ttl, DEC);
--IEEE80211_IF_FILE(dropped_frames_congestion,
--		  u.mesh.mshstats.dropped_frames_congestion, DEC);
- IEEE80211_IF_FILE(dropped_frames_no_route,
- 		  u.mesh.mshstats.dropped_frames_no_route, DEC);
- 
-@@ -740,7 +738,6 @@ static void add_mesh_stats(struct ieee80
- 	MESHSTATS_ADD(fwded_frames);
- 	MESHSTATS_ADD(dropped_frames_ttl);
- 	MESHSTATS_ADD(dropped_frames_no_route);
--	MESHSTATS_ADD(dropped_frames_congestion);
- #undef MESHSTATS_ADD
- }
- 
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -329,7 +329,6 @@ struct mesh_stats {
- 	__u32 fwded_frames;		/* Mesh total forwarded frames */
- 	__u32 dropped_frames_ttl;	/* Not transmitted since mesh_ttl == 0*/
- 	__u32 dropped_frames_no_route;	/* Not transmitted, no route found */
--	__u32 dropped_frames_congestion;/* Not forwarded due to congestion */
- };
- 
- #define PREQ_Q_F_START		0x1
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2926,11 +2926,6 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
- 		return RX_CONTINUE;
- 
- 	ac = ieee802_1d_to_ac[skb->priority];
--	q = sdata->vif.hw_queue[ac];
--	if (ieee80211_queue_stopped(&local->hw, q)) {
--		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
--		return RX_DROP_MONITOR;
--	}
- 	skb_set_queue_mapping(skb, ac);
- 
- 	if (!--mesh_hdr->ttl) {
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch
deleted file mode 100644
index 59b799b..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch
+++ /dev/null
@@ -1,762 +0,0 @@
-From 986e43b19ae9176093da35e0a844e65c8bf9ede7 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 13 Feb 2023 11:08:54 +0100
-Subject: [PATCH] wifi: mac80211: fix receiving A-MSDU frames on mesh
- interfaces
-
-The current mac80211 mesh A-MSDU receive path fails to parse A-MSDU packets
-on mesh interfaces, because it assumes that the Mesh Control field is always
-directly after the 802.11 header.
-802.11-2020 9.3.2.2.2 Figure 9-70 shows that the Mesh Control field is
-actually part of the A-MSDU subframe header.
-This makes more sense, since it allows packets for multiple different
-destinations to be included in the same A-MSDU, as long as RA and TID are
-still the same.
-Another issue is the fact that the A-MSDU subframe length field was apparently
-accidentally defined as little-endian in the standard.
-
-In order to fix this, the mesh forwarding path needs happen at a different
-point in the receive path.
-
-ieee80211_data_to_8023_exthdr is changed to ignore the mesh control field
-and leave it in after the ethernet header. This also affects the source/dest
-MAC address fields, which now in the case of mesh point to the mesh SA/DA.
-
-ieee80211_amsdu_to_8023s is changed to deal with the endian difference and
-to add the Mesh Control length to the subframe length, since it's not covered
-by the MSDU length field.
-
-With these changes, the mac80211 will get the same packet structure for
-converted regular data packets and unpacked A-MSDU subframes.
-
-The mesh forwarding checks are now only performed after the A-MSDU decap.
-For locally received packets, the Mesh Control header is stripped away.
-For forwarded packets, a new 802.11 header gets added.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Link: https://lore.kernel.org/r/20230213100855.34315-4-nbd@nbd.name
-[fix fortify build error]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- .../wireless/marvell/mwifiex/11n_rxreorder.c  |   2 +-
- include/net/cfg80211.h                        |  27 +-
- net/mac80211/rx.c                             | 350 ++++++++++--------
- net/wireless/util.c                           | 120 +++---
- 4 files changed, 297 insertions(+), 202 deletions(-)
-
---- a/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c
-+++ b/drivers/net/wireless/marvell/mwifiex/11n_rxreorder.c
-@@ -33,7 +33,7 @@ static int mwifiex_11n_dispatch_amsdu_pk
- 		skb_trim(skb, le16_to_cpu(local_rx_pd->rx_pkt_length));
- 
- 		ieee80211_amsdu_to_8023s(skb, &list, priv->curr_addr,
--					 priv->wdev.iftype, 0, NULL, NULL);
-+					 priv->wdev.iftype, 0, NULL, NULL, false);
- 
- 		while (!skb_queue_empty(&list)) {
- 			struct rx_packet_hdr *rx_hdr;
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6208,11 +6208,36 @@ static inline int ieee80211_data_to_8023
-  * @extra_headroom: The hardware extra headroom for SKBs in the @list.
-  * @check_da: DA to check in the inner ethernet header, or NULL
-  * @check_sa: SA to check in the inner ethernet header, or NULL
-+ * @mesh_control: A-MSDU subframe header includes the mesh control field
-  */
- void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
- 			      const u8 *addr, enum nl80211_iftype iftype,
- 			      const unsigned int extra_headroom,
--			      const u8 *check_da, const u8 *check_sa);
-+			      const u8 *check_da, const u8 *check_sa,
-+			      bool mesh_control);
-+
-+/**
-+ * ieee80211_get_8023_tunnel_proto - get RFC1042 or bridge tunnel encap protocol
-+ *
-+ * Check for RFC1042 or bridge tunnel header and fetch the encapsulated
-+ * protocol.
-+ *
-+ * @hdr: pointer to the MSDU payload
-+ * @proto: destination pointer to store the protocol
-+ * Return: true if encapsulation was found
-+ */
-+bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto);
-+
-+/**
-+ * ieee80211_strip_8023_mesh_hdr - strip mesh header from converted 802.3 frames
-+ *
-+ * Strip the mesh header, which was left in by ieee80211_data_to_8023 as part
-+ * of the MSDU data. Also move any source/destination addresses from the mesh
-+ * header to the ethernet header (if present).
-+ *
-+ * @skb: The 802.3 frame with embedded mesh header
-+ */
-+int ieee80211_strip_8023_mesh_hdr(struct sk_buff *skb);
- 
- /**
-  * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2720,6 +2720,174 @@ ieee80211_deliver_skb(struct ieee80211_r
- 	}
- }
- 
-+static ieee80211_rx_result
-+ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,
-+		       struct sk_buff *skb)
-+{
-+#ifdef CPTCFG_MAC80211_MESH
-+	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+	struct ieee80211_local *local = sdata->local;
-+	uint16_t fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA;
-+	struct ieee80211_hdr hdr = {
-+		.frame_control = cpu_to_le16(fc)
-+	};
-+	struct ieee80211_hdr *fwd_hdr;
-+	struct ieee80211s_hdr *mesh_hdr;
-+	struct ieee80211_tx_info *info;
-+	struct sk_buff *fwd_skb;
-+	struct ethhdr *eth;
-+	bool multicast;
-+	int tailroom = 0;
-+	int hdrlen, mesh_hdrlen;
-+	u8 *qos;
-+
-+	if (!ieee80211_vif_is_mesh(&sdata->vif))
-+		return RX_CONTINUE;
-+
-+	if (!pskb_may_pull(skb, sizeof(*eth) + 6))
-+		return RX_DROP_MONITOR;
-+
-+	mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(*eth));
-+	mesh_hdrlen = ieee80211_get_mesh_hdrlen(mesh_hdr);
-+
-+	if (!pskb_may_pull(skb, sizeof(*eth) + mesh_hdrlen))
-+		return RX_DROP_MONITOR;
-+
-+	eth = (struct ethhdr *)skb->data;
-+	multicast = is_multicast_ether_addr(eth->h_dest);
-+
-+	mesh_hdr = (struct ieee80211s_hdr *)(eth + 1);
-+	if (!mesh_hdr->ttl)
-+		return RX_DROP_MONITOR;
-+
-+	/* frame is in RMC, don't forward */
-+	if (is_multicast_ether_addr(eth->h_dest) &&
-+	    mesh_rmc_check(sdata, eth->h_source, mesh_hdr))
-+		return RX_DROP_MONITOR;
-+
-+	/* Frame has reached destination.  Don't forward */
-+	if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
-+		goto rx_accept;
-+
-+	if (!ifmsh->mshcfg.dot11MeshForwarding) {
-+		if (is_multicast_ether_addr(eth->h_dest))
-+			goto rx_accept;
-+
-+		return RX_DROP_MONITOR;
-+	}
-+
-+	/* forward packet */
-+	if (sdata->crypto_tx_tailroom_needed_cnt)
-+		tailroom = IEEE80211_ENCRYPT_TAILROOM;
-+
-+	if (!--mesh_hdr->ttl) {
-+		if (multicast)
-+			goto rx_accept;
-+
-+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl);
-+		return RX_DROP_MONITOR;
-+	}
-+
-+	if (mesh_hdr->flags & MESH_FLAGS_AE) {
-+		struct mesh_path *mppath;
-+		char *proxied_addr;
-+
-+		if (multicast)
-+			proxied_addr = mesh_hdr->eaddr1;
-+		else if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
-+			/* has_a4 already checked in ieee80211_rx_mesh_check */
-+			proxied_addr = mesh_hdr->eaddr2;
-+		else
-+			return RX_DROP_MONITOR;
-+
-+		rcu_read_lock();
-+		mppath = mpp_path_lookup(sdata, proxied_addr);
-+		if (!mppath) {
-+			mpp_path_add(sdata, proxied_addr, eth->h_source);
-+		} else {
-+			spin_lock_bh(&mppath->state_lock);
-+			if (!ether_addr_equal(mppath->mpp, eth->h_source))
-+				memcpy(mppath->mpp, eth->h_source, ETH_ALEN);
-+			mppath->exp_time = jiffies;
-+			spin_unlock_bh(&mppath->state_lock);
-+		}
-+		rcu_read_unlock();
-+	}
-+
-+	skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
-+
-+	ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control,
-+				      eth->h_dest, eth->h_source);
-+	hdrlen = ieee80211_hdrlen(hdr.frame_control);
-+	if (multicast) {
-+		int extra_head = sizeof(struct ieee80211_hdr) - sizeof(*eth);
-+
-+		fwd_skb = skb_copy_expand(skb, local->tx_headroom + extra_head +
-+					       IEEE80211_ENCRYPT_HEADROOM,
-+					  tailroom, GFP_ATOMIC);
-+		if (!fwd_skb)
-+			goto rx_accept;
-+	} else {
-+		fwd_skb = skb;
-+		skb = NULL;
-+
-+		if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr)))
-+			return RX_DROP_UNUSABLE;
-+	}
-+
-+	fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr));
-+	memcpy(fwd_hdr, &hdr, hdrlen - 2);
-+	qos = ieee80211_get_qos_ctl(fwd_hdr);
-+	qos[0] = qos[1] = 0;
-+
-+	skb_reset_mac_header(fwd_skb);
-+	hdrlen += mesh_hdrlen;
-+	if (ieee80211_get_8023_tunnel_proto(fwd_skb->data + hdrlen,
-+					    &fwd_skb->protocol))
-+		hdrlen += ETH_ALEN;
-+	else
-+		fwd_skb->protocol = htons(fwd_skb->len - hdrlen);
-+	skb_set_network_header(fwd_skb, hdrlen);
-+
-+	info = IEEE80211_SKB_CB(fwd_skb);
-+	memset(info, 0, sizeof(*info));
-+	info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
-+	info->control.vif = &sdata->vif;
-+	info->control.jiffies = jiffies;
-+	if (multicast) {
-+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
-+		memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
-+		/* update power mode indication when forwarding */
-+		ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr);
-+	} else if (!mesh_nexthop_lookup(sdata, fwd_skb)) {
-+		/* mesh power mode flags updated in mesh_nexthop_lookup */
-+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
-+	} else {
-+		/* unable to resolve next hop */
-+		if (sta)
-+			mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl,
-+					   hdr.addr3, 0,
-+					   WLAN_REASON_MESH_PATH_NOFORWARD,
-+					   sta->sta.addr);
-+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route);
-+		kfree_skb(fwd_skb);
-+		goto rx_accept;
-+	}
-+
-+	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
-+	fwd_skb->dev = sdata->dev;
-+	ieee80211_add_pending_skb(local, fwd_skb);
-+
-+rx_accept:
-+	if (!skb)
-+		return RX_QUEUED;
-+
-+	ieee80211_strip_8023_mesh_hdr(skb);
-+#endif
-+
-+	return RX_CONTINUE;
-+}
-+
- static ieee80211_rx_result debug_noinline
- __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset)
- {
-@@ -2728,8 +2896,10 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- 	__le16 fc = hdr->frame_control;
- 	struct sk_buff_head frame_list;
-+	static ieee80211_rx_result res;
- 	struct ethhdr ethhdr;
- 	const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source;
-+	bool mesh = false;
- 
- 	if (unlikely(ieee80211_has_a4(hdr->frame_control))) {
- 		check_da = NULL;
-@@ -2746,6 +2916,8 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 			break;
- 		case NL80211_IFTYPE_MESH_POINT:
- 			check_sa = NULL;
-+			check_da = NULL;
-+			mesh = true;
- 			break;
- 		default:
- 			break;
-@@ -2763,17 +2935,29 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 	ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr,
- 				 rx->sdata->vif.type,
- 				 rx->local->hw.extra_tx_headroom,
--				 check_da, check_sa);
-+				 check_da, check_sa, mesh);
- 
- 	while (!skb_queue_empty(&frame_list)) {
- 		rx->skb = __skb_dequeue(&frame_list);
- 
--		if (!ieee80211_frame_allowed(rx, fc)) {
--			dev_kfree_skb(rx->skb);
-+		res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
-+		switch (res) {
-+		case RX_QUEUED:
- 			continue;
-+		case RX_CONTINUE:
-+			break;
-+		default:
-+			goto free;
- 		}
- 
-+		if (!ieee80211_frame_allowed(rx, fc))
-+			goto free;
-+
- 		ieee80211_deliver_skb(rx);
-+		continue;
-+
-+free:
-+		dev_kfree_skb(rx->skb);
- 	}
- 
- 	return RX_QUEUED;
-@@ -2806,6 +2990,8 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
- 			if (!rx->sdata->u.mgd.use_4addr)
- 				return RX_DROP_UNUSABLE;
- 			break;
-+		case NL80211_IFTYPE_MESH_POINT:
-+			break;
- 		default:
- 			return RX_DROP_UNUSABLE;
- 		}
-@@ -2834,155 +3020,6 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
- 	return __ieee80211_rx_h_amsdu(rx, 0);
- }
- 
--#ifdef CPTCFG_MAC80211_MESH
--static ieee80211_rx_result
--ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
--{
--	struct ieee80211_hdr *fwd_hdr, *hdr;
--	struct ieee80211_tx_info *info;
--	struct ieee80211s_hdr *mesh_hdr;
--	struct sk_buff *skb = rx->skb, *fwd_skb;
--	struct ieee80211_local *local = rx->local;
--	struct ieee80211_sub_if_data *sdata = rx->sdata;
--	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
--	u16 ac, q, hdrlen;
--	int tailroom = 0;
--
--	hdr = (struct ieee80211_hdr *) skb->data;
--	hdrlen = ieee80211_hdrlen(hdr->frame_control);
--
--	/* make sure fixed part of mesh header is there, also checks skb len */
--	if (!pskb_may_pull(rx->skb, hdrlen + 6))
--		return RX_DROP_MONITOR;
--
--	mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
--
--	/* make sure full mesh header is there, also checks skb len */
--	if (!pskb_may_pull(rx->skb,
--			   hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr)))
--		return RX_DROP_MONITOR;
--
--	/* reload pointers */
--	hdr = (struct ieee80211_hdr *) skb->data;
--	mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
--
--	if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) {
--		int offset = hdrlen + ieee80211_get_mesh_hdrlen(mesh_hdr) +
--			     sizeof(rfc1042_header);
--		__be16 ethertype;
--
--		if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr) ||
--		    skb_copy_bits(rx->skb, offset, &ethertype, 2) != 0 ||
--		    ethertype != rx->sdata->control_port_protocol)
--			return RX_DROP_MONITOR;
--	}
--
--	/* frame is in RMC, don't forward */
--	if (ieee80211_is_data(hdr->frame_control) &&
--	    is_multicast_ether_addr(hdr->addr1) &&
--	    mesh_rmc_check(rx->sdata, hdr->addr3, mesh_hdr))
--		return RX_DROP_MONITOR;
--
--	if (!ieee80211_is_data(hdr->frame_control))
--		return RX_CONTINUE;
--
--	if (!mesh_hdr->ttl)
--		return RX_DROP_MONITOR;
--
--	if (mesh_hdr->flags & MESH_FLAGS_AE) {
--		struct mesh_path *mppath;
--		char *proxied_addr;
--		char *mpp_addr;
--
--		if (is_multicast_ether_addr(hdr->addr1)) {
--			mpp_addr = hdr->addr3;
--			proxied_addr = mesh_hdr->eaddr1;
--		} else if ((mesh_hdr->flags & MESH_FLAGS_AE) ==
--			    MESH_FLAGS_AE_A5_A6) {
--			/* has_a4 already checked in ieee80211_rx_mesh_check */
--			mpp_addr = hdr->addr4;
--			proxied_addr = mesh_hdr->eaddr2;
--		} else {
--			return RX_DROP_MONITOR;
--		}
--
--		rcu_read_lock();
--		mppath = mpp_path_lookup(sdata, proxied_addr);
--		if (!mppath) {
--			mpp_path_add(sdata, proxied_addr, mpp_addr);
--		} else {
--			spin_lock_bh(&mppath->state_lock);
--			if (!ether_addr_equal(mppath->mpp, mpp_addr))
--				memcpy(mppath->mpp, mpp_addr, ETH_ALEN);
--			mppath->exp_time = jiffies;
--			spin_unlock_bh(&mppath->state_lock);
--		}
--		rcu_read_unlock();
--	}
--
--	/* Frame has reached destination.  Don't forward */
--	if (!is_multicast_ether_addr(hdr->addr1) &&
--	    ether_addr_equal(sdata->vif.addr, hdr->addr3))
--		return RX_CONTINUE;
--
--	ac = ieee802_1d_to_ac[skb->priority];
--	skb_set_queue_mapping(skb, ac);
--
--	if (!--mesh_hdr->ttl) {
--		if (!is_multicast_ether_addr(hdr->addr1))
--			IEEE80211_IFSTA_MESH_CTR_INC(ifmsh,
--						     dropped_frames_ttl);
--		goto out;
--	}
--
--	if (!ifmsh->mshcfg.dot11MeshForwarding)
--		goto out;
--
--	if (sdata->crypto_tx_tailroom_needed_cnt)
--		tailroom = IEEE80211_ENCRYPT_TAILROOM;
--
--	fwd_skb = skb_copy_expand(skb, local->tx_headroom +
--				       IEEE80211_ENCRYPT_HEADROOM,
--				  tailroom, GFP_ATOMIC);
--	if (!fwd_skb)
--		goto out;
--
--	fwd_skb->dev = sdata->dev;
--	fwd_hdr =  (struct ieee80211_hdr *) fwd_skb->data;
--	fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY);
--	info = IEEE80211_SKB_CB(fwd_skb);
--	memset(info, 0, sizeof(*info));
--	info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
--	info->control.vif = &rx->sdata->vif;
--	info->control.jiffies = jiffies;
--	if (is_multicast_ether_addr(fwd_hdr->addr1)) {
--		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
--		memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
--		/* update power mode indication when forwarding */
--		ieee80211_mps_set_frame_flags(sdata, NULL, fwd_hdr);
--	} else if (!mesh_nexthop_lookup(sdata, fwd_skb)) {
--		/* mesh power mode flags updated in mesh_nexthop_lookup */
--		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
--	} else {
--		/* unable to resolve next hop */
--		mesh_path_error_tx(sdata, ifmsh->mshcfg.element_ttl,
--				   fwd_hdr->addr3, 0,
--				   WLAN_REASON_MESH_PATH_NOFORWARD,
--				   fwd_hdr->addr2);
--		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_no_route);
--		kfree_skb(fwd_skb);
--		return RX_DROP_MONITOR;
--	}
--
--	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
--	ieee80211_add_pending_skb(local, fwd_skb);
-- out:
--	if (is_multicast_ether_addr(hdr->addr1))
--		return RX_CONTINUE;
--	return RX_DROP_MONITOR;
--}
--#endif
--
- static ieee80211_rx_result debug_noinline
- ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
- {
-@@ -2991,6 +3028,7 @@ ieee80211_rx_h_data(struct ieee80211_rx_
- 	struct net_device *dev = sdata->dev;
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
- 	__le16 fc = hdr->frame_control;
-+	static ieee80211_rx_result res;
- 	bool port_control;
- 	int err;
- 
-@@ -3017,6 +3055,10 @@ ieee80211_rx_h_data(struct ieee80211_rx_
- 	if (unlikely(err))
- 		return RX_DROP_UNUSABLE;
- 
-+	res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
-+	if (res != RX_CONTINUE)
-+		return res;
-+
- 	if (!ieee80211_frame_allowed(rx, fc))
- 		return RX_DROP_MONITOR;
- 
-@@ -3987,10 +4029,6 @@ static void ieee80211_rx_handlers(struct
- 		CALL_RXH(ieee80211_rx_h_defragment);
- 		CALL_RXH(ieee80211_rx_h_michael_mic_verify);
- 		/* must be after MMIC verify so header is counted in MPDU mic */
--#ifdef CPTCFG_MAC80211_MESH
--		if (ieee80211_vif_is_mesh(&rx->sdata->vif))
--			CALL_RXH(ieee80211_rx_h_mesh_fwding);
--#endif
- 		CALL_RXH(ieee80211_rx_h_amsdu);
- 		CALL_RXH(ieee80211_rx_h_data);
- 
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -542,7 +542,7 @@ unsigned int ieee80211_get_mesh_hdrlen(s
- }
- EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen);
- 
--static bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto)
-+bool ieee80211_get_8023_tunnel_proto(const void *hdr, __be16 *proto)
- {
- 	const __be16 *hdr_proto = hdr + ETH_ALEN;
- 
-@@ -556,6 +556,49 @@ static bool ieee80211_get_8023_tunnel_pr
- 
- 	return true;
- }
-+EXPORT_SYMBOL(ieee80211_get_8023_tunnel_proto);
-+
-+int ieee80211_strip_8023_mesh_hdr(struct sk_buff *skb)
-+{
-+	const void *mesh_addr;
-+	struct {
-+		struct ethhdr eth;
-+		u8 flags;
-+	} payload;
-+	int hdrlen;
-+	int ret;
-+
-+	ret = skb_copy_bits(skb, 0, &payload, sizeof(payload));
-+	if (ret)
-+		return ret;
-+
-+	hdrlen = sizeof(payload.eth) + __ieee80211_get_mesh_hdrlen(payload.flags);
-+
-+	if (likely(pskb_may_pull(skb, hdrlen + 8) &&
-+		   ieee80211_get_8023_tunnel_proto(skb->data + hdrlen,
-+						   &payload.eth.h_proto)))
-+		hdrlen += ETH_ALEN + 2;
-+	else if (!pskb_may_pull(skb, hdrlen))
-+		return -EINVAL;
-+
-+	mesh_addr = skb->data + sizeof(payload.eth) + ETH_ALEN;
-+	switch (payload.flags & MESH_FLAGS_AE) {
-+	case MESH_FLAGS_AE_A4:
-+		memcpy(&payload.eth.h_source, mesh_addr, ETH_ALEN);
-+		break;
-+	case MESH_FLAGS_AE_A5_A6:
-+		memcpy(&payload.eth, mesh_addr, 2 * ETH_ALEN);
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	pskb_pull(skb, hdrlen - sizeof(payload.eth));
-+	memcpy(skb->data, &payload.eth, sizeof(payload.eth));
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL(ieee80211_strip_8023_mesh_hdr);
- 
- int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
- 				  const u8 *addr, enum nl80211_iftype iftype,
-@@ -568,7 +611,6 @@ int ieee80211_data_to_8023_exthdr(struct
- 	} payload;
- 	struct ethhdr tmp;
- 	u16 hdrlen;
--	u8 mesh_flags = 0;
- 
- 	if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
- 		return -1;
-@@ -589,12 +631,6 @@ int ieee80211_data_to_8023_exthdr(struct
- 	memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN);
- 	memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN);
- 
--	if (iftype == NL80211_IFTYPE_MESH_POINT &&
--	    skb_copy_bits(skb, hdrlen, &mesh_flags, 1) < 0)
--		return -1;
--
--	mesh_flags &= MESH_FLAGS_AE;
--
- 	switch (hdr->frame_control &
- 		cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
- 	case cpu_to_le16(IEEE80211_FCTL_TODS):
-@@ -608,17 +644,6 @@ int ieee80211_data_to_8023_exthdr(struct
- 			     iftype != NL80211_IFTYPE_AP_VLAN &&
- 			     iftype != NL80211_IFTYPE_STATION))
- 			return -1;
--		if (iftype == NL80211_IFTYPE_MESH_POINT) {
--			if (mesh_flags == MESH_FLAGS_AE_A4)
--				return -1;
--			if (mesh_flags == MESH_FLAGS_AE_A5_A6 &&
--			    skb_copy_bits(skb, hdrlen +
--					  offsetof(struct ieee80211s_hdr, eaddr1),
--					  tmp.h_dest, 2 * ETH_ALEN) < 0)
--				return -1;
--
--			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
--		}
- 		break;
- 	case cpu_to_le16(IEEE80211_FCTL_FROMDS):
- 		if ((iftype != NL80211_IFTYPE_STATION &&
-@@ -627,16 +652,6 @@ int ieee80211_data_to_8023_exthdr(struct
- 		    (is_multicast_ether_addr(tmp.h_dest) &&
- 		     ether_addr_equal(tmp.h_source, addr)))
- 			return -1;
--		if (iftype == NL80211_IFTYPE_MESH_POINT) {
--			if (mesh_flags == MESH_FLAGS_AE_A5_A6)
--				return -1;
--			if (mesh_flags == MESH_FLAGS_AE_A4 &&
--			    skb_copy_bits(skb, hdrlen +
--					  offsetof(struct ieee80211s_hdr, eaddr1),
--					  tmp.h_source, ETH_ALEN) < 0)
--				return -1;
--			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
--		}
- 		break;
- 	case cpu_to_le16(0):
- 		if (iftype != NL80211_IFTYPE_ADHOC &&
-@@ -646,7 +661,7 @@ int ieee80211_data_to_8023_exthdr(struct
- 		break;
- 	}
- 
--	if (likely(!is_amsdu &&
-+	if (likely(!is_amsdu && iftype != NL80211_IFTYPE_MESH_POINT &&
- 		   skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 &&
- 		   ieee80211_get_8023_tunnel_proto(&payload, &tmp.h_proto))) {
- 		/* remove RFC1042 or Bridge-Tunnel encapsulation */
-@@ -722,7 +737,8 @@ __ieee80211_amsdu_copy_frag(struct sk_bu
- 
- static struct sk_buff *
- __ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen,
--		       int offset, int len, bool reuse_frag)
-+		       int offset, int len, bool reuse_frag,
-+		       int min_len)
- {
- 	struct sk_buff *frame;
- 	int cur_len = len;
-@@ -736,7 +752,7 @@ __ieee80211_amsdu_copy(struct sk_buff *s
- 	 * in the stack later.
- 	 */
- 	if (reuse_frag)
--		cur_len = min_t(int, len, 32);
-+		cur_len = min_t(int, len, min_len);
- 
- 	/*
- 	 * Allocate and reserve two bytes more for payload
-@@ -746,6 +762,7 @@ __ieee80211_amsdu_copy(struct sk_buff *s
- 	if (!frame)
- 		return NULL;
- 
-+	frame->priority = skb->priority;
- 	skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2);
- 	skb_copy_bits(skb, offset, skb_put(frame, cur_len), cur_len);
- 
-@@ -762,23 +779,37 @@ __ieee80211_amsdu_copy(struct sk_buff *s
- void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
- 			      const u8 *addr, enum nl80211_iftype iftype,
- 			      const unsigned int extra_headroom,
--			      const u8 *check_da, const u8 *check_sa)
-+			      const u8 *check_da, const u8 *check_sa,
-+			      bool mesh_control)
- {
- 	unsigned int hlen = ALIGN(extra_headroom, 4);
- 	struct sk_buff *frame = NULL;
- 	int offset = 0, remaining;
--	struct ethhdr eth;
-+	struct {
-+		struct ethhdr eth;
-+		uint8_t flags;
-+	} hdr;
- 	bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb);
- 	bool reuse_skb = false;
- 	bool last = false;
-+	int copy_len = sizeof(hdr.eth);
-+
-+	if (iftype == NL80211_IFTYPE_MESH_POINT)
-+		copy_len = sizeof(hdr);
- 
- 	while (!last) {
- 		unsigned int subframe_len;
--		int len;
-+		int len, mesh_len = 0;
- 		u8 padding;
- 
--		skb_copy_bits(skb, offset, &eth, sizeof(eth));
--		len = ntohs(eth.h_proto);
-+		skb_copy_bits(skb, offset, &hdr, copy_len);
-+		if (iftype == NL80211_IFTYPE_MESH_POINT)
-+			mesh_len = __ieee80211_get_mesh_hdrlen(hdr.flags);
-+		if (mesh_control)
-+			len = le16_to_cpu(*(__le16 *)&hdr.eth.h_proto) + mesh_len;
-+		else
-+			len = ntohs(hdr.eth.h_proto);
-+
- 		subframe_len = sizeof(struct ethhdr) + len;
- 		padding = (4 - subframe_len) & 0x3;
- 
-@@ -787,16 +818,16 @@ void ieee80211_amsdu_to_8023s(struct sk_
- 		if (subframe_len > remaining)
- 			goto purge;
- 		/* mitigate A-MSDU aggregation injection attacks */
--		if (ether_addr_equal(eth.h_dest, rfc1042_header))
-+		if (ether_addr_equal(hdr.eth.h_dest, rfc1042_header))
- 			goto purge;
- 
- 		offset += sizeof(struct ethhdr);
- 		last = remaining <= subframe_len + padding;
- 
- 		/* FIXME: should we really accept multicast DA? */
--		if ((check_da && !is_multicast_ether_addr(eth.h_dest) &&
--		     !ether_addr_equal(check_da, eth.h_dest)) ||
--		    (check_sa && !ether_addr_equal(check_sa, eth.h_source))) {
-+		if ((check_da && !is_multicast_ether_addr(hdr.eth.h_dest) &&
-+		     !ether_addr_equal(check_da, hdr.eth.h_dest)) ||
-+		    (check_sa && !ether_addr_equal(check_sa, hdr.eth.h_source))) {
- 			offset += len + padding;
- 			continue;
- 		}
-@@ -808,7 +839,7 @@ void ieee80211_amsdu_to_8023s(struct sk_
- 			reuse_skb = true;
- 		} else {
- 			frame = __ieee80211_amsdu_copy(skb, hlen, offset, len,
--						       reuse_frag);
-+						       reuse_frag, 32 + mesh_len);
- 			if (!frame)
- 				goto purge;
- 
-@@ -819,10 +850,11 @@ void ieee80211_amsdu_to_8023s(struct sk_
- 		frame->dev = skb->dev;
- 		frame->priority = skb->priority;
- 
--		if (likely(ieee80211_get_8023_tunnel_proto(frame->data, &eth.h_proto)))
-+		if (likely(iftype != NL80211_IFTYPE_MESH_POINT &&
-+			   ieee80211_get_8023_tunnel_proto(frame->data, &hdr.eth.h_proto)))
- 			skb_pull(frame, ETH_ALEN + 2);
- 
--		memcpy(skb_push(frame, sizeof(eth)), &eth, sizeof(eth));
-+		memcpy(skb_push(frame, sizeof(hdr.eth)), &hdr.eth, sizeof(hdr.eth));
- 		__skb_queue_tail(list, frame);
- 	}
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch
deleted file mode 100644
index 6dc98ae..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 9 Dec 2022 21:15:04 +0100
-Subject: [PATCH] wifi: mac80211: add a workaround for receiving
- non-standard mesh A-MSDU
-
-At least ath10k and ath11k supported hardware (maybe more) does not implement
-mesh A-MSDU aggregation in a standard compliant way.
-802.11-2020 9.3.2.2.2 declares that the Mesh Control field is part of the
-A-MSDU header. As such, its length must not be included in the subframe
-length field.
-Hardware affected by this bug treats the mesh control field as part of the
-MSDU data and sets the length accordingly.
-In order to avoid packet loss, keep track of which stations are affected
-by this and take it into account when converting A-MSDU to 802.3 + mesh control
-packets.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6194,6 +6194,19 @@ static inline int ieee80211_data_to_8023
- }
- 
- /**
-+ * ieee80211_is_valid_amsdu - check if subframe lengths of an A-MSDU are valid
-+ *
-+ * This is used to detect non-standard A-MSDU frames, e.g. the ones generated
-+ * by ath10k and ath11k, where the subframe length includes the length of the
-+ * mesh control field.
-+ *
-+ * @skb: The input A-MSDU frame without any headers.
-+ * @mesh_hdr: use standard compliant mesh A-MSDU subframe header
-+ * Returns: true if subframe header lengths are valid for the @mesh_hdr mode
-+ */
-+bool ieee80211_is_valid_amsdu(struct sk_buff *skb, bool mesh_hdr);
-+
-+/**
-  * ieee80211_amsdu_to_8023s - decode an IEEE 802.11n A-MSDU frame
-  *
-  * Decode an IEEE 802.11 A-MSDU and convert it to a list of 802.3 frames.
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2899,7 +2899,6 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 	static ieee80211_rx_result res;
- 	struct ethhdr ethhdr;
- 	const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source;
--	bool mesh = false;
- 
- 	if (unlikely(ieee80211_has_a4(hdr->frame_control))) {
- 		check_da = NULL;
-@@ -2917,7 +2916,6 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 		case NL80211_IFTYPE_MESH_POINT:
- 			check_sa = NULL;
- 			check_da = NULL;
--			mesh = true;
- 			break;
- 		default:
- 			break;
-@@ -2932,10 +2930,21 @@ __ieee80211_rx_h_amsdu(struct ieee80211_
- 					  data_offset, true))
- 		return RX_DROP_UNUSABLE;
- 
-+	if (rx->sta && rx->sta->amsdu_mesh_control < 0) {
-+		bool valid_std = ieee80211_is_valid_amsdu(skb, true);
-+		bool valid_nonstd = ieee80211_is_valid_amsdu(skb, false);
-+
-+		if (valid_std && !valid_nonstd)
-+			rx->sta->amsdu_mesh_control = 1;
-+		else if (valid_nonstd && !valid_std)
-+			rx->sta->amsdu_mesh_control = 0;
-+	}
-+
- 	ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr,
- 				 rx->sdata->vif.type,
- 				 rx->local->hw.extra_tx_headroom,
--				 check_da, check_sa, mesh);
-+				 check_da, check_sa,
-+				 rx->sta->amsdu_mesh_control);
- 
- 	while (!skb_queue_empty(&frame_list)) {
- 		rx->skb = __skb_dequeue(&frame_list);
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -591,6 +591,9 @@ __sta_info_alloc(struct ieee80211_sub_if
- 
- 	sta->sta_state = IEEE80211_STA_NONE;
- 
-+	if (sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
-+		sta->amsdu_mesh_control = -1;
-+
- 	/* Mark TID as unreserved */
- 	sta->reserved_tid = IEEE80211_TID_UNRESERVED;
- 
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -702,6 +702,7 @@ struct sta_info {
- 	struct codel_params cparams;
- 
- 	u8 reserved_tid;
-+	s8 amsdu_mesh_control;
- 
- 	struct cfg80211_chan_def tdls_chandef;
- 
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -776,6 +776,38 @@ __ieee80211_amsdu_copy(struct sk_buff *s
- 	return frame;
- }
- 
-+bool ieee80211_is_valid_amsdu(struct sk_buff *skb, bool mesh_hdr)
-+{
-+	int offset = 0, remaining, subframe_len, padding;
-+
-+	for (offset = 0; offset < skb->len; offset += subframe_len + padding) {
-+		struct {
-+		    __be16 len;
-+		    u8 mesh_flags;
-+		} hdr;
-+		u16 len;
-+
-+		if (skb_copy_bits(skb, offset + 2 * ETH_ALEN, &hdr, sizeof(hdr)) < 0)
-+			return false;
-+
-+		if (mesh_hdr)
-+			len = le16_to_cpu(*(__le16 *)&hdr.len) +
-+			      __ieee80211_get_mesh_hdrlen(hdr.mesh_flags);
-+		else
-+			len = ntohs(hdr.len);
-+
-+		subframe_len = sizeof(struct ethhdr) + len;
-+		padding = (4 - subframe_len) & 0x3;
-+		remaining = skb->len - offset;
-+
-+		if (subframe_len > remaining)
-+			return false;
-+	}
-+
-+	return true;
-+}
-+EXPORT_SYMBOL(ieee80211_is_valid_amsdu);
-+
- void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
- 			      const u8 *addr, enum nl80211_iftype iftype,
- 			      const unsigned int extra_headroom,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch
deleted file mode 100644
index 7d01ffd..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 15 Feb 2023 15:21:37 +0100
-Subject: [PATCH] wifi: mac80211: fix race in mesh sequence number
- assignment
-
-Since the sequence number is shared across different tx queues, it needs
-to be atomic in order to avoid accidental duplicate assignment
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -696,7 +696,7 @@ struct ieee80211_if_mesh {
- 	struct mesh_stats mshstats;
- 	struct mesh_config mshcfg;
- 	atomic_t estab_plinks;
--	u32 mesh_seqnum;
-+	atomic_t mesh_seqnum;
- 	bool accepting_plinks;
- 	int num_gates;
- 	struct beacon_data __rcu *beacon;
---- a/net/mac80211/mesh.c
-+++ b/net/mac80211/mesh.c
-@@ -752,10 +752,8 @@ unsigned int ieee80211_new_mesh_header(s
- 
- 	meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
- 
--	/* FIXME: racy -- TX on multiple queues can be concurrent */
--	put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum);
--	sdata->u.mesh.mesh_seqnum++;
--
-+	put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum),
-+			   &meshhdr->seqnum);
- 	if (addr4or5 && !addr6) {
- 		meshhdr->flags |= MESH_FLAGS_AE_A4;
- 		memcpy(meshhdr->eaddr1, addr4or5, ETH_ALEN);
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch
deleted file mode 100644
index 968d288..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/319-wifi-mac80211-mesh-fast-xmit-support.patch
+++ /dev/null
@@ -1,850 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 26 Feb 2023 13:53:08 +0100
-Subject: [PATCH] wifi: mac80211: mesh fast xmit support
-
-Previously, fast xmit only worked on interface types where initially a
-sta lookup is performed, and a cached header can be attached to the sta,
-requiring only some fields to be updated at runtime.
-
-This technique is not directly applicable for a mesh device type due
-to the dynamic nature of the topology and protocol. There are more
-addresses that need to be filled, and there is an extra header with a
-dynamic length based on the addressing mode.
-
-Change the code to cache entries contain a copy of the mesh subframe header +
-bridge tunnel header, as well as an embedded struct ieee80211_fast_tx, which
-contains the information for building the 802.11 header.
-
-Add a mesh specific early fast xmit call, which looks up a cached entry and
-adds only the mesh subframe header, before passing it over to the generic
-fast xmit code.
-
-To ensure the changes in network are reflected in these cached headers,
-flush affected cached entries on path changes, as well as other conditions
-that currently trigger a fast xmit check in other modes (key changes etc.)
-
-This code is loosely based on a previous implementation by:
-Sriram R <quic_srirrama@quicinc.com>
-
-Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -37,6 +37,7 @@
- extern const struct cfg80211_ops mac80211_config_ops;
- 
- struct ieee80211_local;
-+struct ieee80211_mesh_fast_tx;
- 
- /* Maximum number of broadcast/multicast frames to buffer when some of the
-  * associated stations are using power saving. */
-@@ -656,6 +657,19 @@ struct mesh_table {
- 	atomic_t entries;		/* Up to MAX_MESH_NEIGHBOURS */
- };
- 
-+/**
-+ * struct mesh_tx_cache - mesh fast xmit header cache
-+ *
-+ * @rht: hash table containing struct ieee80211_mesh_fast_tx, using skb DA as key
-+ * @walk_head: linked list containing all ieee80211_mesh_fast_tx objects
-+ * @walk_lock: lock protecting walk_head and rht
-+ */
-+struct mesh_tx_cache {
-+	struct rhashtable rht;
-+	struct hlist_head walk_head;
-+	spinlock_t walk_lock;
-+};
-+
- struct ieee80211_if_mesh {
- 	struct timer_list housekeeping_timer;
- 	struct timer_list mesh_path_timer;
-@@ -734,6 +748,7 @@ struct ieee80211_if_mesh {
- 	struct mesh_table mpp_paths; /* Store paths for MPP&MAP */
- 	int mesh_paths_generation;
- 	int mpp_paths_generation;
-+	struct mesh_tx_cache tx_cache;
- };
- 
- #ifdef CPTCFG_MAC80211_MESH
-@@ -2002,6 +2017,11 @@ int ieee80211_tx_control_port(struct wip
- 			      int link_id, u64 *cookie);
- int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
- 			      const u8 *buf, size_t len);
-+void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+			   struct sta_info *sta,
-+			   struct ieee80211_fast_tx *fast_tx,
-+			   struct sk_buff *skb, bool ampdu,
-+			   const u8 *da, const u8 *sa);
- 
- /* HT */
- void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/mesh.c
-+++ b/net/mac80211/mesh.c
-@@ -10,6 +10,7 @@
- #include <asm/unaligned.h>
- #include "ieee80211_i.h"
- #include "mesh.h"
-+#include "wme.h"
- #include "driver-ops.h"
- 
- static int mesh_allocated;
-@@ -698,6 +699,95 @@ ieee80211_mesh_update_bss_params(struct
- 			__le32_to_cpu(he_oper->he_oper_params);
- }
- 
-+bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+			      struct sk_buff *skb, u32 ctrl_flags)
-+{
-+	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+	struct ieee80211_mesh_fast_tx *entry;
-+	struct ieee80211s_hdr *meshhdr;
-+	u8 sa[ETH_ALEN] __aligned(2);
-+	struct tid_ampdu_tx *tid_tx;
-+	struct sta_info *sta;
-+	bool copy_sa = false;
-+	u16 ethertype;
-+	u8 tid;
-+
-+	if (ctrl_flags & IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP)
-+		return false;
-+
-+	if (ifmsh->mshcfg.dot11MeshNolearn)
-+		return false;
-+
-+	/* Add support for these cases later */
-+	if (ifmsh->ps_peers_light_sleep || ifmsh->ps_peers_deep_sleep)
-+		return false;
-+
-+	if (is_multicast_ether_addr(skb->data))
-+		return false;
-+
-+	ethertype = (skb->data[12] << 8) | skb->data[13];
-+	if (ethertype < ETH_P_802_3_MIN)
-+		return false;
-+
-+	if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
-+		return false;
-+
-+	if (skb->ip_summed == CHECKSUM_PARTIAL) {
-+		skb_set_transport_header(skb, skb_checksum_start_offset(skb));
-+		if (skb_checksum_help(skb))
-+			return false;
-+	}
-+
-+	entry = mesh_fast_tx_get(sdata, skb->data);
-+	if (!entry)
-+		return false;
-+
-+	if (skb_headroom(skb) < entry->hdrlen + entry->fast_tx.hdr_len)
-+		return false;
-+
-+	sta = rcu_dereference(entry->mpath->next_hop);
-+	if (!sta)
-+		return false;
-+
-+	tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-+	tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
-+	if (tid_tx) {
-+		if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
-+			return false;
-+		if (tid_tx->timeout)
-+			tid_tx->last_tx = jiffies;
-+	}
-+
-+	skb = skb_share_check(skb, GFP_ATOMIC);
-+	if (!skb)
-+		return true;
-+
-+	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
-+
-+	meshhdr = (struct ieee80211s_hdr *)entry->hdr;
-+	if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) {
-+		/* preserve SA from eth header for 6-addr frames */
-+		ether_addr_copy(sa, skb->data + ETH_ALEN);
-+		copy_sa = true;
-+	}
-+
-+	memcpy(skb_push(skb, entry->hdrlen - 2 * ETH_ALEN), entry->hdr,
-+	       entry->hdrlen);
-+
-+	meshhdr = (struct ieee80211s_hdr *)skb->data;
-+	put_unaligned_le32(atomic_inc_return(&sdata->u.mesh.mesh_seqnum),
-+			   &meshhdr->seqnum);
-+	meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL;
-+	if (copy_sa)
-+	    ether_addr_copy(meshhdr->eaddr2, sa);
-+
-+	skb_push(skb, 2 * ETH_ALEN);
-+	__ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
-+			      entry->mpath->dst, sdata->vif.addr);
-+
-+	return true;
-+}
-+
- /**
-  * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
-  * @hdr:	802.11 frame header
-@@ -780,6 +870,8 @@ static void ieee80211_mesh_housekeeping(
- 	changed = mesh_accept_plinks_update(sdata);
- 	ieee80211_mbss_info_change_notify(sdata, changed);
- 
-+	mesh_fast_tx_gc(sdata);
-+
- 	mod_timer(&ifmsh->housekeeping_timer,
- 		  round_jiffies(jiffies +
- 				IEEE80211_MESH_HOUSEKEEPING_INTERVAL));
---- a/net/mac80211/mesh.h
-+++ b/net/mac80211/mesh.h
-@@ -122,11 +122,41 @@ struct mesh_path {
- 	u8 rann_snd_addr[ETH_ALEN];
- 	u32 rann_metric;
- 	unsigned long last_preq_to_root;
-+	unsigned long fast_tx_check;
- 	bool is_root;
- 	bool is_gate;
- 	u32 path_change_count;
- };
- 
-+#define MESH_FAST_TX_CACHE_MAX_SIZE		512
-+#define MESH_FAST_TX_CACHE_THRESHOLD_SIZE	384
-+#define MESH_FAST_TX_CACHE_TIMEOUT		8000 /* msecs */
-+
-+/**
-+ * struct ieee80211_mesh_fast_tx - cached mesh fast tx entry
-+ * @rhash: rhashtable pointer
-+ * @addr_key: The Ethernet DA which is the key for this entry
-+ * @fast_tx: base fast_tx data
-+ * @hdr: cached mesh and rfc1042 headers
-+ * @hdrlen: length of mesh + rfc1042
-+ * @walk_list: list containing all the fast tx entries
-+ * @mpath: mesh path corresponding to the Mesh DA
-+ * @mppath: MPP entry corresponding to this DA
-+ * @timestamp: Last used time of this entry
-+ */
-+struct ieee80211_mesh_fast_tx {
-+	struct rhash_head rhash;
-+	u8 addr_key[ETH_ALEN] __aligned(2);
-+
-+	struct ieee80211_fast_tx fast_tx;
-+	u8 hdr[sizeof(struct ieee80211s_hdr) + sizeof(rfc1042_header)];
-+	u16 hdrlen;
-+
-+	struct mesh_path *mpath, *mppath;
-+	struct hlist_node walk_list;
-+	unsigned long timestamp;
-+};
-+
- /* Recent multicast cache */
- /* RMC_BUCKETS must be a power of 2, maximum 256 */
- #define RMC_BUCKETS		256
-@@ -298,6 +328,20 @@ void mesh_path_discard_frame(struct ieee
- void mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata);
- 
- bool mesh_action_is_path_sel(struct ieee80211_mgmt *mgmt);
-+struct ieee80211_mesh_fast_tx *
-+mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr);
-+bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+			      struct sk_buff *skb, u32 ctrl_flags);
-+void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,
-+			struct sk_buff *skb, struct mesh_path *mpath);
-+void mesh_fast_tx_gc(struct ieee80211_sub_if_data *sdata);
-+void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata,
-+			     const u8 *addr);
-+void mesh_fast_tx_flush_mpath(struct mesh_path *mpath);
-+void mesh_fast_tx_flush_sta(struct ieee80211_sub_if_data *sdata,
-+			    struct sta_info *sta);
-+void mesh_path_refresh(struct ieee80211_sub_if_data *sdata,
-+		       struct mesh_path *mpath, const u8 *addr);
- 
- #ifdef CPTCFG_MAC80211_MESH
- static inline
---- a/net/mac80211/mesh_hwmp.c
-+++ b/net/mac80211/mesh_hwmp.c
-@@ -394,6 +394,7 @@ static u32 hwmp_route_info_get(struct ie
- 	u32 orig_sn, orig_metric;
- 	unsigned long orig_lifetime, exp_time;
- 	u32 last_hop_metric, new_metric;
-+	bool flush_mpath = false;
- 	bool process = true;
- 	u8 hopcount;
- 
-@@ -491,8 +492,10 @@ static u32 hwmp_route_info_get(struct ie
- 		}
- 
- 		if (fresh_info) {
--			if (rcu_access_pointer(mpath->next_hop) != sta)
-+			if (rcu_access_pointer(mpath->next_hop) != sta) {
- 				mpath->path_change_count++;
-+				flush_mpath = true;
-+			}
- 			mesh_path_assign_nexthop(mpath, sta);
- 			mpath->flags |= MESH_PATH_SN_VALID;
- 			mpath->metric = new_metric;
-@@ -502,6 +505,8 @@ static u32 hwmp_route_info_get(struct ie
- 			mpath->hop_count = hopcount;
- 			mesh_path_activate(mpath);
- 			spin_unlock_bh(&mpath->state_lock);
-+			if (flush_mpath)
-+				mesh_fast_tx_flush_mpath(mpath);
- 			ewma_mesh_fail_avg_init(&sta->mesh->fail_avg);
- 			/* init it at a low value - 0 start is tricky */
- 			ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1);
-@@ -539,8 +544,10 @@ static u32 hwmp_route_info_get(struct ie
- 		}
- 
- 		if (fresh_info) {
--			if (rcu_access_pointer(mpath->next_hop) != sta)
-+			if (rcu_access_pointer(mpath->next_hop) != sta) {
- 				mpath->path_change_count++;
-+				flush_mpath = true;
-+			}
- 			mesh_path_assign_nexthop(mpath, sta);
- 			mpath->metric = last_hop_metric;
- 			mpath->exp_time = time_after(mpath->exp_time, exp_time)
-@@ -548,6 +555,8 @@ static u32 hwmp_route_info_get(struct ie
- 			mpath->hop_count = 1;
- 			mesh_path_activate(mpath);
- 			spin_unlock_bh(&mpath->state_lock);
-+			if (flush_mpath)
-+				mesh_fast_tx_flush_mpath(mpath);
- 			ewma_mesh_fail_avg_init(&sta->mesh->fail_avg);
- 			/* init it at a low value - 0 start is tricky */
- 			ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1);
-@@ -1215,6 +1224,20 @@ static int mesh_nexthop_lookup_nolearn(s
- 	return 0;
- }
- 
-+void mesh_path_refresh(struct ieee80211_sub_if_data *sdata,
-+		       struct mesh_path *mpath, const u8 *addr)
-+{
-+	if (mpath->flags & (MESH_PATH_REQ_QUEUED | MESH_PATH_FIXED |
-+			    MESH_PATH_RESOLVING))
-+		return;
-+
-+	if (time_after(jiffies,
-+		       mpath->exp_time -
-+		       msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
-+	    (!addr || ether_addr_equal(sdata->vif.addr, addr)))
-+		mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
-+}
-+
- /**
-  * mesh_nexthop_lookup - put the appropriate next hop on a mesh frame. Calling
-  * this function is considered "using" the associated mpath, so preempt a path
-@@ -1242,19 +1265,15 @@ int mesh_nexthop_lookup(struct ieee80211
- 	if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE))
- 		return -ENOENT;
- 
--	if (time_after(jiffies,
--		       mpath->exp_time -
--		       msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
--	    ether_addr_equal(sdata->vif.addr, hdr->addr4) &&
--	    !(mpath->flags & MESH_PATH_RESOLVING) &&
--	    !(mpath->flags & MESH_PATH_FIXED))
--		mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH);
-+	mesh_path_refresh(sdata, mpath, hdr->addr4);
- 
- 	next_hop = rcu_dereference(mpath->next_hop);
- 	if (next_hop) {
- 		memcpy(hdr->addr1, next_hop->sta.addr, ETH_ALEN);
- 		memcpy(hdr->addr2, sdata->vif.addr, ETH_ALEN);
- 		ieee80211_mps_set_frame_flags(sdata, next_hop, hdr);
-+		if (ieee80211_hw_check(&sdata->local->hw, SUPPORT_FAST_XMIT))
-+			mesh_fast_tx_cache(sdata, skb, mpath);
- 		return 0;
- 	}
- 
---- a/net/mac80211/mesh_pathtbl.c
-+++ b/net/mac80211/mesh_pathtbl.c
-@@ -14,6 +14,7 @@
- #include "wme.h"
- #include "ieee80211_i.h"
- #include "mesh.h"
-+#include <linux/rhashtable.h>
- 
- static void mesh_path_free_rcu(struct mesh_table *tbl, struct mesh_path *mpath);
- 
-@@ -32,6 +33,41 @@ static const struct rhashtable_params me
- 	.hashfn = mesh_table_hash,
- };
- 
-+static const struct rhashtable_params fast_tx_rht_params = {
-+	.nelem_hint = 10,
-+	.automatic_shrinking = true,
-+	.key_len = ETH_ALEN,
-+	.key_offset = offsetof(struct ieee80211_mesh_fast_tx, addr_key),
-+	.head_offset = offsetof(struct ieee80211_mesh_fast_tx, rhash),
-+	.hashfn = mesh_table_hash,
-+};
-+
-+static void __mesh_fast_tx_entry_free(void *ptr, void *tblptr)
-+{
-+	struct ieee80211_mesh_fast_tx *entry = ptr;
-+
-+	kfree_rcu(entry, fast_tx.rcu_head);
-+}
-+
-+static void mesh_fast_tx_deinit(struct ieee80211_sub_if_data *sdata)
-+{
-+	struct mesh_tx_cache *cache;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	rhashtable_free_and_destroy(&cache->rht,
-+				    __mesh_fast_tx_entry_free, NULL);
-+}
-+
-+static void mesh_fast_tx_init(struct ieee80211_sub_if_data *sdata)
-+{
-+	struct mesh_tx_cache *cache;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	rhashtable_init(&cache->rht, &fast_tx_rht_params);
-+	INIT_HLIST_HEAD(&cache->walk_head);
-+	spin_lock_init(&cache->walk_lock);
-+}
-+
- static inline bool mpath_expired(struct mesh_path *mpath)
- {
- 	return (mpath->flags & MESH_PATH_ACTIVE) &&
-@@ -381,6 +417,243 @@ struct mesh_path *mesh_path_new(struct i
- 	return new_mpath;
- }
- 
-+static void mesh_fast_tx_entry_free(struct mesh_tx_cache *cache,
-+				    struct ieee80211_mesh_fast_tx *entry)
-+{
-+	hlist_del_rcu(&entry->walk_list);
-+	rhashtable_remove_fast(&cache->rht, &entry->rhash, fast_tx_rht_params);
-+	kfree_rcu(entry, fast_tx.rcu_head);
-+}
-+
-+struct ieee80211_mesh_fast_tx *
-+mesh_fast_tx_get(struct ieee80211_sub_if_data *sdata, const u8 *addr)
-+{
-+	struct ieee80211_mesh_fast_tx *entry;
-+	struct mesh_tx_cache *cache;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
-+	if (!entry)
-+		return NULL;
-+
-+	if (!(entry->mpath->flags & MESH_PATH_ACTIVE) ||
-+	    mpath_expired(entry->mpath)) {
-+		spin_lock_bh(&cache->walk_lock);
-+		entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
-+		if (entry)
-+		    mesh_fast_tx_entry_free(cache, entry);
-+		spin_unlock_bh(&cache->walk_lock);
-+		return NULL;
-+	}
-+
-+	mesh_path_refresh(sdata, entry->mpath, NULL);
-+	if (entry->mppath)
-+		entry->mppath->exp_time = jiffies;
-+	entry->timestamp = jiffies;
-+
-+	return entry;
-+}
-+
-+void mesh_fast_tx_cache(struct ieee80211_sub_if_data *sdata,
-+			struct sk_buff *skb, struct mesh_path *mpath)
-+{
-+	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+	struct ieee80211_mesh_fast_tx *entry, *prev;
-+	struct ieee80211_mesh_fast_tx build = {};
-+	struct ieee80211s_hdr *meshhdr;
-+	struct mesh_tx_cache *cache;
-+	struct ieee80211_key *key;
-+	struct mesh_path *mppath;
-+	struct sta_info *sta;
-+	u8 *qc;
-+
-+	if (sdata->noack_map ||
-+	    !ieee80211_is_data_qos(hdr->frame_control))
-+		return;
-+
-+	build.fast_tx.hdr_len = ieee80211_hdrlen(hdr->frame_control);
-+	meshhdr = (struct ieee80211s_hdr *)(skb->data + build.fast_tx.hdr_len);
-+	build.hdrlen = ieee80211_get_mesh_hdrlen(meshhdr);
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	if (atomic_read(&cache->rht.nelems) >= MESH_FAST_TX_CACHE_MAX_SIZE)
-+		return;
-+
-+	sta = rcu_dereference(mpath->next_hop);
-+	if (!sta)
-+		return;
-+
-+	if ((meshhdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6) {
-+		/* This is required to keep the mppath alive */
-+		mppath = mpp_path_lookup(sdata, meshhdr->eaddr1);
-+		if (!mppath)
-+			return;
-+		build.mppath = mppath;
-+	} else if (ieee80211_has_a4(hdr->frame_control)) {
-+		mppath = mpath;
-+	} else {
-+		return;
-+	}
-+
-+	/* rate limit, in case fast xmit can't be enabled */
-+	if (mppath->fast_tx_check == jiffies)
-+		return;
-+
-+	mppath->fast_tx_check = jiffies;
-+
-+	/*
-+	 * Same use of the sta lock as in ieee80211_check_fast_xmit, in order
-+	 * to protect against concurrent sta key updates.
-+	 */
-+	spin_lock_bh(&sta->lock);
-+	key = rcu_access_pointer(sta->ptk[sta->ptk_idx]);
-+	if (!key)
-+		key = rcu_access_pointer(sdata->default_unicast_key);
-+	build.fast_tx.key = key;
-+
-+	if (key) {
-+		bool gen_iv, iv_spc;
-+
-+		gen_iv = key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV;
-+		iv_spc = key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE;
-+
-+		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) ||
-+		    (key->flags & KEY_FLAG_TAINTED))
-+			goto unlock_sta;
-+
-+		switch (key->conf.cipher) {
-+		case WLAN_CIPHER_SUITE_CCMP:
-+		case WLAN_CIPHER_SUITE_CCMP_256:
-+			if (gen_iv)
-+				build.fast_tx.pn_offs = build.fast_tx.hdr_len;
-+			if (gen_iv || iv_spc)
-+				build.fast_tx.hdr_len += IEEE80211_CCMP_HDR_LEN;
-+			break;
-+		case WLAN_CIPHER_SUITE_GCMP:
-+		case WLAN_CIPHER_SUITE_GCMP_256:
-+			if (gen_iv)
-+				build.fast_tx.pn_offs = build.fast_tx.hdr_len;
-+			if (gen_iv || iv_spc)
-+				build.fast_tx.hdr_len += IEEE80211_GCMP_HDR_LEN;
-+			break;
-+		default:
-+			goto unlock_sta;
-+		}
-+	}
-+
-+	memcpy(build.addr_key, mppath->dst, ETH_ALEN);
-+	build.timestamp = jiffies;
-+	build.fast_tx.band = info->band;
-+	build.fast_tx.da_offs = offsetof(struct ieee80211_hdr, addr3);
-+	build.fast_tx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
-+	build.mpath = mpath;
-+	memcpy(build.hdr, meshhdr, build.hdrlen);
-+	memcpy(build.hdr + build.hdrlen, rfc1042_header, sizeof(rfc1042_header));
-+	build.hdrlen += sizeof(rfc1042_header);
-+	memcpy(build.fast_tx.hdr, hdr, build.fast_tx.hdr_len);
-+
-+	hdr = (struct ieee80211_hdr *)build.fast_tx.hdr;
-+	if (build.fast_tx.key)
-+		hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
-+
-+	qc = ieee80211_get_qos_ctl(hdr);
-+	qc[1] |= IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8;
-+
-+	entry = kmemdup(&build, sizeof(build), GFP_ATOMIC);
-+	if (!entry)
-+		goto unlock_sta;
-+
-+	spin_lock(&cache->walk_lock);
-+	prev = rhashtable_lookup_get_insert_fast(&cache->rht,
-+						 &entry->rhash,
-+						 fast_tx_rht_params);
-+	if (unlikely(IS_ERR(prev))) {
-+		kfree(entry);
-+		goto unlock_cache;
-+	}
-+
-+	/*
-+	 * replace any previous entry in the hash table, in case we're
-+	 * replacing it with a different type (e.g. mpath -> mpp)
-+	 */
-+	if (unlikely(prev)) {
-+		rhashtable_replace_fast(&cache->rht, &prev->rhash,
-+					&entry->rhash, fast_tx_rht_params);
-+		hlist_del_rcu(&prev->walk_list);
-+		kfree_rcu(prev, fast_tx.rcu_head);
-+	}
-+
-+	hlist_add_head(&entry->walk_list, &cache->walk_head);
-+
-+unlock_cache:
-+	spin_unlock(&cache->walk_lock);
-+unlock_sta:
-+	spin_unlock_bh(&sta->lock);
-+}
-+
-+void mesh_fast_tx_gc(struct ieee80211_sub_if_data *sdata)
-+{
-+	unsigned long timeout = msecs_to_jiffies(MESH_FAST_TX_CACHE_TIMEOUT);
-+	struct mesh_tx_cache *cache;
-+	struct ieee80211_mesh_fast_tx *entry;
-+	struct hlist_node *n;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	if (atomic_read(&cache->rht.nelems) < MESH_FAST_TX_CACHE_THRESHOLD_SIZE)
-+		return;
-+
-+	spin_lock_bh(&cache->walk_lock);
-+	hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list)
-+		if (!time_is_after_jiffies(entry->timestamp + timeout))
-+			mesh_fast_tx_entry_free(cache, entry);
-+	spin_unlock_bh(&cache->walk_lock);
-+}
-+
-+void mesh_fast_tx_flush_mpath(struct mesh_path *mpath)
-+{
-+	struct ieee80211_sub_if_data *sdata = mpath->sdata;
-+	struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;
-+	struct ieee80211_mesh_fast_tx *entry;
-+	struct hlist_node *n;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	spin_lock_bh(&cache->walk_lock);
-+	hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list)
-+		if (entry->mpath == mpath)
-+			mesh_fast_tx_entry_free(cache, entry);
-+	spin_unlock_bh(&cache->walk_lock);
-+}
-+
-+void mesh_fast_tx_flush_sta(struct ieee80211_sub_if_data *sdata,
-+			    struct sta_info *sta)
-+{
-+	struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;
-+	struct ieee80211_mesh_fast_tx *entry;
-+	struct hlist_node *n;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	spin_lock_bh(&cache->walk_lock);
-+	hlist_for_each_entry_safe(entry, n, &cache->walk_head, walk_list)
-+		if (rcu_access_pointer(entry->mpath->next_hop) == sta)
-+			mesh_fast_tx_entry_free(cache, entry);
-+	spin_unlock_bh(&cache->walk_lock);
-+}
-+
-+void mesh_fast_tx_flush_addr(struct ieee80211_sub_if_data *sdata,
-+			     const u8 *addr)
-+{
-+	struct mesh_tx_cache *cache = &sdata->u.mesh.tx_cache;
-+	struct ieee80211_mesh_fast_tx *entry;
-+
-+	cache = &sdata->u.mesh.tx_cache;
-+	spin_lock_bh(&cache->walk_lock);
-+	entry = rhashtable_lookup(&cache->rht, addr, fast_tx_rht_params);
-+	if (entry)
-+		mesh_fast_tx_entry_free(cache, entry);
-+	spin_unlock_bh(&cache->walk_lock);
-+}
-+
- /**
-  * mesh_path_add - allocate and add a new path to the mesh path table
-  * @dst: destination address of the path (ETH_ALEN length)
-@@ -464,6 +737,8 @@ int mpp_path_add(struct ieee80211_sub_if
- 
- 	if (ret)
- 		kfree(new_mpath);
-+	else
-+		mesh_fast_tx_flush_addr(sdata, dst);
- 
- 	sdata->u.mesh.mpp_paths_generation++;
- 	return ret;
-@@ -523,6 +798,10 @@ static void __mesh_path_del(struct mesh_
- {
- 	hlist_del_rcu(&mpath->walk_list);
- 	rhashtable_remove_fast(&tbl->rhead, &mpath->rhash, mesh_rht_params);
-+	if (tbl == &mpath->sdata->u.mesh.mpp_paths)
-+		mesh_fast_tx_flush_addr(mpath->sdata, mpath->dst);
-+	else
-+		mesh_fast_tx_flush_mpath(mpath);
- 	mesh_path_free_rcu(tbl, mpath);
- }
- 
-@@ -747,6 +1026,7 @@ void mesh_path_fix_nexthop(struct mesh_p
- 	mpath->exp_time = 0;
- 	mpath->flags = MESH_PATH_FIXED | MESH_PATH_SN_VALID;
- 	mesh_path_activate(mpath);
-+	mesh_fast_tx_flush_mpath(mpath);
- 	spin_unlock_bh(&mpath->state_lock);
- 	ewma_mesh_fail_avg_init(&next_hop->mesh->fail_avg);
- 	/* init it at a low value - 0 start is tricky */
-@@ -758,6 +1038,7 @@ void mesh_pathtbl_init(struct ieee80211_
- {
- 	mesh_table_init(&sdata->u.mesh.mesh_paths);
- 	mesh_table_init(&sdata->u.mesh.mpp_paths);
-+	mesh_fast_tx_init(sdata);
- }
- 
- static
-@@ -785,6 +1066,7 @@ void mesh_path_expire(struct ieee80211_s
- 
- void mesh_pathtbl_unregister(struct ieee80211_sub_if_data *sdata)
- {
-+	mesh_fast_tx_deinit(sdata);
- 	mesh_table_free(&sdata->u.mesh.mesh_paths);
- 	mesh_table_free(&sdata->u.mesh.mpp_paths);
- }
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2791,6 +2791,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	if (mesh_hdr->flags & MESH_FLAGS_AE) {
- 		struct mesh_path *mppath;
- 		char *proxied_addr;
-+		bool update = false;
- 
- 		if (multicast)
- 			proxied_addr = mesh_hdr->eaddr1;
-@@ -2806,11 +2807,18 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 			mpp_path_add(sdata, proxied_addr, eth->h_source);
- 		} else {
- 			spin_lock_bh(&mppath->state_lock);
--			if (!ether_addr_equal(mppath->mpp, eth->h_source))
-+			if (!ether_addr_equal(mppath->mpp, eth->h_source)) {
- 				memcpy(mppath->mpp, eth->h_source, ETH_ALEN);
-+				update = true;
-+			}
- 			mppath->exp_time = jiffies;
- 			spin_unlock_bh(&mppath->state_lock);
- 		}
-+
-+		/* flush fast xmit cache if the address path changed */
-+		if (update)
-+			mesh_fast_tx_flush_addr(sdata, proxied_addr);
-+
- 		rcu_read_unlock();
- 	}
- 
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -3022,6 +3022,9 @@ void ieee80211_check_fast_xmit(struct st
- 	if (!ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT))
- 		return;
- 
-+	if (ieee80211_vif_is_mesh(&sdata->vif))
-+		mesh_fast_tx_flush_sta(sdata, sta);
-+
- 	/* Locking here protects both the pointer itself, and against concurrent
- 	 * invocations winning data access races to, e.g., the key pointer that
- 	 * is used.
-@@ -3403,6 +3406,9 @@ static bool ieee80211_amsdu_aggregate(st
- 	if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
- 		return false;
- 
-+	if (ieee80211_vif_is_mesh(&sdata->vif))
-+		return false;
-+
- 	if (skb_is_gso(skb))
- 		return false;
- 
-@@ -3635,10 +3641,11 @@ free:
- 	return NULL;
- }
- 
--static void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
--				  struct sta_info *sta,
--				  struct ieee80211_fast_tx *fast_tx,
--				  struct sk_buff *skb, u8 tid, bool ampdu)
-+void __ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
-+			   struct sta_info *sta,
-+			   struct ieee80211_fast_tx *fast_tx,
-+			   struct sk_buff *skb, bool ampdu,
-+			   const u8 *da, const u8 *sa)
- {
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-@@ -3647,7 +3654,6 @@ static void __ieee80211_xmit_fast(struct
- 	ieee80211_tx_result r;
- 	int hw_headroom = sdata->local->hw.extra_tx_headroom;
- 	int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
--	struct ethhdr eth;
- 
- 	skb = skb_share_check(skb, GFP_ATOMIC);
- 	if (unlikely(!skb))
-@@ -3667,11 +3673,10 @@ static void __ieee80211_xmit_fast(struct
- 					  ENCRYPT_NO)))
- 		goto free;
- 
--	memcpy(&eth, skb->data, ETH_HLEN - 2);
- 	hdr = skb_push(skb, extra_head);
- 	memcpy(skb->data, fast_tx->hdr, fast_tx->hdr_len);
--	memcpy(skb->data + fast_tx->da_offs, eth.h_dest, ETH_ALEN);
--	memcpy(skb->data + fast_tx->sa_offs, eth.h_source, ETH_ALEN);
-+	memcpy(skb->data + fast_tx->da_offs, da, ETH_ALEN);
-+	memcpy(skb->data + fast_tx->sa_offs, sa, ETH_ALEN);
- 
- 	info = IEEE80211_SKB_CB(skb);
- 	memset(info, 0, sizeof(*info));
-@@ -3690,7 +3695,8 @@ static void __ieee80211_xmit_fast(struct
- #endif
- 
- 	if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
--		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-+		u8 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-+
- 		*ieee80211_get_qos_ctl(hdr) = tid;
- 	}
- 
-@@ -3733,6 +3739,7 @@ static bool ieee80211_xmit_fast(struct i
- 	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
- 	struct tid_ampdu_tx *tid_tx = NULL;
- 	struct sk_buff *next;
-+	struct ethhdr eth;
- 	u8 tid = IEEE80211_NUM_TIDS;
- 
- 	/* control port protocol needs a lot of special handling */
-@@ -3758,6 +3765,8 @@ static bool ieee80211_xmit_fast(struct i
- 		}
- 	}
- 
-+	memcpy(&eth, skb->data, ETH_HLEN - 2);
-+
- 	/* after this point (skb is modified) we cannot return false */
- 	skb = ieee80211_tx_skb_fixup(skb, ieee80211_sdata_netdev_features(sdata));
- 	if (!skb)
-@@ -3765,7 +3774,8 @@ static bool ieee80211_xmit_fast(struct i
- 
- 	skb_list_walk_safe(skb, skb, next) {
- 		skb_mark_not_on_list(skb);
--		__ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid, tid_tx);
-+		__ieee80211_xmit_fast(sdata, sta, fast_tx, skb, tid_tx,
-+				      eth.h_dest, eth.h_source);
- 	}
- 
- 	return true;
-@@ -4252,8 +4262,15 @@ void __ieee80211_subif_start_xmit(struct
- 		return;
- 	}
- 
-+	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
-+
- 	rcu_read_lock();
- 
-+	if (ieee80211_vif_is_mesh(&sdata->vif) &&
-+	    ieee80211_hw_check(&local->hw, SUPPORT_FAST_XMIT) &&
-+	    ieee80211_mesh_xmit_fast(sdata, skb, ctrl_flags))
-+		goto out;
-+
- 	if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
- 		goto out_free;
- 
-@@ -4263,8 +4280,6 @@ void __ieee80211_subif_start_xmit(struct
- 	skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
- 	ieee80211_aggr_check(sdata, sta, skb);
- 
--	sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
--
- 	if (sta) {
- 		struct ieee80211_fast_tx *fast_tx;
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
new file mode 100644
index 0000000..28e2144
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
@@ -0,0 +1,149 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 14 Sep 2023 13:17:16 +0200
+Subject: [PATCH] cfg80211: allow grace period for DFS available after beacon
+ shutdown
+
+Fixes reconfiguring an AP on a DFS channel in non-ETSI regdomain
+
+Fixes: b35a51c7dd25 ("cfg80211: Make pre-CAC results valid only for ETSI domain")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -175,6 +175,8 @@ enum ieee80211_channel_flags {
+  * @dfs_state: current state of this channel. Only relevant if radar is required
+  *	on this channel.
+  * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
++ * @dfs_state_last_available: timestamp (jiffies) of the last time when the
++ *	channel was available.
+  * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
+  */
+ struct ieee80211_channel {
+@@ -191,6 +193,7 @@ struct ieee80211_channel {
+ 	int orig_mag, orig_mpwr;
+ 	enum nl80211_dfs_state dfs_state;
+ 	unsigned long dfs_state_entered;
++	unsigned long dfs_state_last_available;
+ 	unsigned int dfs_cac_ms;
+ };
+ 
+--- a/net/wireless/ap.c
++++ b/net/wireless/ap.c
+@@ -30,6 +30,9 @@ static int ___cfg80211_stop_ap(struct cf
+ 	if (!wdev->links[link_id].ap.beacon_interval)
+ 		return -ENOENT;
+ 
++	cfg80211_update_last_available(wdev->wiphy,
++				       &wdev->links[link_id].ap.chandef);
++
+ 	err = rdev_stop_ap(rdev, dev, link_id);
+ 	if (!err) {
+ 		wdev->conn_owner_nlportid = 0;
+@@ -41,9 +44,6 @@ static int ___cfg80211_stop_ap(struct cf
+ 		if (notify)
+ 			nl80211_send_ap_stopped(wdev, link_id);
+ 
+-		/* Should we apply the grace period during beaconing interface
+-		 * shutdown also?
+-		 */
+ 		cfg80211_sched_dfs_chan_update(rdev);
+ 	}
+ 
+--- a/net/wireless/chan.c
++++ b/net/wireless/chan.c
+@@ -461,6 +461,8 @@ static void cfg80211_set_chans_dfs_state
+ 
+ 		c->dfs_state = dfs_state;
+ 		c->dfs_state_entered = jiffies;
++		if (dfs_state == NL80211_DFS_AVAILABLE)
++			c->dfs_state_last_available = jiffies;
+ 	}
+ }
+ 
+@@ -874,6 +876,49 @@ static bool cfg80211_get_chans_dfs_avail
+ 	return true;
+ }
+ 
++static void
++__cfg80211_update_last_available(struct wiphy *wiphy,
++					 u32 center_freq,
++					 u32 bandwidth)
++{
++	struct ieee80211_channel *c;
++	u32 freq, start_freq, end_freq;
++
++	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
++	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
++
++	/*
++	 * Check entire range of channels for the bandwidth.
++	 * If any channel in between is disabled or has not
++	 * had gone through CAC return false
++	 */
++	for (freq = start_freq; freq <= end_freq; freq += MHZ_TO_KHZ(20)) {
++		c = ieee80211_get_channel_khz(wiphy, freq);
++		if (!c)
++			return;
++
++		c->dfs_state_last_available = jiffies;
++	}
++}
++
++void cfg80211_update_last_available(struct wiphy *wiphy,
++				    const struct cfg80211_chan_def *chandef)
++{
++	int width;
++
++	width = cfg80211_chandef_get_width(chandef);
++	if (width < 0)
++		return;
++
++	__cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq1),
++						 width);
++	if (chandef->width != NL80211_CHAN_WIDTH_80P80)
++	    return;
++
++	__cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq2),
++						 width);
++}
++
+ static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
+ 				const struct cfg80211_chan_def *chandef)
+ {
+--- a/net/wireless/core.h
++++ b/net/wireless/core.h
+@@ -474,6 +474,8 @@ void cfg80211_set_dfs_state(struct wiphy
+ 			    enum nl80211_dfs_state dfs_state);
+ 
+ void cfg80211_dfs_channels_update_work(struct work_struct *work);
++void cfg80211_update_last_available(struct wiphy *wiphy,
++				    const struct cfg80211_chan_def *chandef);
+ 
+ void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
+ 
+--- a/net/wireless/mlme.c
++++ b/net/wireless/mlme.c
+@@ -915,6 +915,8 @@ void cfg80211_dfs_channels_update_work(s
+ 			if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
+ 				time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
+ 				radar_event = NL80211_RADAR_NOP_FINISHED;
++				timeout = c->dfs_state_entered +
++					  msecs_to_jiffies(time_dfs_update);
+ 			} else {
+ 				if (regulatory_pre_cac_allowed(wiphy) ||
+ 				    cfg80211_any_wiphy_oper_chan(wiphy, c))
+@@ -922,11 +924,10 @@ void cfg80211_dfs_channels_update_work(s
+ 
+ 				time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
+ 				radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;
++				timeout = c->dfs_state_last_available +
++					  msecs_to_jiffies(time_dfs_update);
+ 			}
+ 
+-			timeout = c->dfs_state_entered +
+-				  msecs_to_jiffies(time_dfs_update);
+-
+ 			if (time_after_eq(jiffies, timeout)) {
+ 				c->dfs_state = NL80211_DFS_USABLE;
+ 				c->dfs_state_entered = jiffies;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch
deleted file mode 100644
index 28b1ff1..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 16 Feb 2023 11:07:30 +0100
-Subject: [PATCH] wifi: mac80211: use mesh header cache to speed up mesh
- forwarding
-
-Significantly reduces mesh forwarding path CPU usage and enables the
-direct use of iTXQ.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2720,6 +2720,65 @@ ieee80211_deliver_skb(struct ieee80211_r
- 	}
- }
- 
-+#ifdef CPTCFG_MAC80211_MESH
-+static bool
-+ieee80211_rx_mesh_fast_forward(struct ieee80211_sub_if_data *sdata,
-+			       struct sk_buff *skb, int hdrlen)
-+{
-+	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+	struct ieee80211_mesh_fast_tx *entry = NULL;
-+	struct ieee80211s_hdr *mesh_hdr;
-+	struct tid_ampdu_tx *tid_tx;
-+	struct sta_info *sta;
-+	struct ethhdr eth;
-+	u8 tid;
-+
-+	mesh_hdr = (struct ieee80211s_hdr *)(skb->data + sizeof(eth));
-+	if ((mesh_hdr->flags & MESH_FLAGS_AE) == MESH_FLAGS_AE_A5_A6)
-+		entry = mesh_fast_tx_get(sdata, mesh_hdr->eaddr1);
-+	else if (!(mesh_hdr->flags & MESH_FLAGS_AE))
-+		entry = mesh_fast_tx_get(sdata, skb->data);
-+	if (!entry)
-+		return false;
-+
-+	sta = rcu_dereference(entry->mpath->next_hop);
-+	if (!sta)
-+		return false;
-+
-+	if (skb_linearize(skb))
-+		return false;
-+
-+	tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
-+	tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
-+	if (tid_tx) {
-+		if (!test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state))
-+			return false;
-+
-+		if (tid_tx->timeout)
-+			tid_tx->last_tx = jiffies;
-+	}
-+
-+	ieee80211_aggr_check(sdata, sta, skb);
-+
-+	if (ieee80211_get_8023_tunnel_proto(skb->data + hdrlen,
-+					    &skb->protocol))
-+		hdrlen += ETH_ALEN;
-+	else
-+		skb->protocol = htons(skb->len - hdrlen);
-+	skb_set_network_header(skb, hdrlen + 2);
-+
-+	skb->dev = sdata->dev;
-+	memcpy(&eth, skb->data, ETH_HLEN - 2);
-+	skb_pull(skb, 2);
-+	__ieee80211_xmit_fast(sdata, sta, &entry->fast_tx, skb, tid_tx,
-+			      eth.h_dest, eth.h_source);
-+	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_unicast);
-+	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
-+
-+	return true;
-+}
-+#endif
-+
- static ieee80211_rx_result
- ieee80211_rx_mesh_data(struct ieee80211_sub_if_data *sdata, struct sta_info *sta,
- 		       struct sk_buff *skb)
-@@ -2824,6 +2883,10 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 
- 	skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
- 
-+	if (!multicast &&
-+	    ieee80211_rx_mesh_fast_forward(sdata, skb, mesh_hdrlen))
-+		return RX_QUEUED;
-+
- 	ieee80211_fill_mesh_addresses(&hdr, &hdr.frame_control,
- 				      eth->h_dest, eth->h_source);
- 	hdrlen = ieee80211_hdrlen(hdr.frame_control);
-@@ -2862,6 +2925,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	info->control.flags |= IEEE80211_TX_INTCFL_NEED_TXPROCESSING;
- 	info->control.vif = &sdata->vif;
- 	info->control.jiffies = jiffies;
-+	fwd_skb->dev = sdata->dev;
- 	if (multicast) {
- 		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_mcast);
- 		memcpy(fwd_hdr->addr2, sdata->vif.addr, ETH_ALEN);
-@@ -2883,7 +2947,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	}
- 
- 	IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
--	fwd_skb->dev = sdata->dev;
- 	ieee80211_add_pending_skb(local, fwd_skb);
- 
- rx_accept:
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2022,6 +2022,8 @@ void __ieee80211_xmit_fast(struct ieee80
- 			   struct ieee80211_fast_tx *fast_tx,
- 			   struct sk_buff *skb, bool ampdu,
- 			   const u8 *da, const u8 *sa);
-+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
-+			  struct sta_info *sta, struct sk_buff *skb);
- 
- /* HT */
- void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1191,10 +1191,8 @@ static bool ieee80211_tx_prep_agg(struct
- 	return queued;
- }
- 
--static void
--ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
--		     struct sta_info *sta,
--		     struct sk_buff *skb)
-+void ieee80211_aggr_check(struct ieee80211_sub_if_data *sdata,
-+			  struct sta_info *sta, struct sk_buff *skb)
- {
- 	struct rate_control_ref *ref = sdata->local->rate_ctrl;
- 	u16 tid;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch
deleted file mode 100644
index e2b268a..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/321-mac80211-fix-mesh-forwarding.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 20 Feb 2023 12:50:50 +0100
-Subject: [PATCH] mac80211: fix mesh forwarding
-
-Linearize packets (needed for forwarding A-MSDU subframes).
-Fix network header offset to fix flow dissector (and fair queueing).
-
-Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2904,6 +2904,9 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 
- 		if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr)))
- 			return RX_DROP_UNUSABLE;
-+
-+		if (skb_linearize(fwd_skb))
-+			return RX_DROP_UNUSABLE;
- 	}
- 
- 	fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr));
-@@ -2918,7 +2921,7 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 		hdrlen += ETH_ALEN;
- 	else
- 		fwd_skb->protocol = htons(fwd_skb->len - hdrlen);
--	skb_set_network_header(fwd_skb, hdrlen);
-+	skb_set_network_header(fwd_skb, hdrlen + 2);
- 
- 	info = IEEE80211_SKB_CB(fwd_skb);
- 	memset(info, 0, sizeof(*info));
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch
deleted file mode 100644
index 292a89e..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 26 Feb 2023 20:30:20 +0100
-Subject: [PATCH] wifi: mac80211: fix mesh path discovery based on unicast
- packets
-
-If a packet has reached its intended destination, it was bumped to the code
-that accepts it, without first checking if a mesh_path needs to be created
-based on the discovered source.
-Fix this by moving the destination address check further down
-
-Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2824,17 +2824,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	    mesh_rmc_check(sdata, eth->h_source, mesh_hdr))
- 		return RX_DROP_MONITOR;
- 
--	/* Frame has reached destination.  Don't forward */
--	if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
--		goto rx_accept;
--
--	if (!ifmsh->mshcfg.dot11MeshForwarding) {
--		if (is_multicast_ether_addr(eth->h_dest))
--			goto rx_accept;
--
--		return RX_DROP_MONITOR;
--	}
--
- 	/* forward packet */
- 	if (sdata->crypto_tx_tailroom_needed_cnt)
- 		tailroom = IEEE80211_ENCRYPT_TAILROOM;
-@@ -2881,6 +2870,17 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 		rcu_read_unlock();
- 	}
- 
-+	/* Frame has reached destination.  Don't forward */
-+	if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
-+		goto rx_accept;
-+
-+	if (!ifmsh->mshcfg.dot11MeshForwarding) {
-+		if (is_multicast_ether_addr(eth->h_dest))
-+			goto rx_accept;
-+
-+		return RX_DROP_MONITOR;
-+	}
-+
- 	skb_set_queue_mapping(skb, ieee802_1d_to_ac[skb->priority]);
- 
- 	if (!multicast &&
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch
deleted file mode 100644
index e23dc4d..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: Muna Sinada <quic_msinada@quicinc.com>
-Date: Wed, 5 Oct 2022 14:54:45 -0700
-Subject: [PATCH] wifi: mac80211: Add VHT MU-MIMO related flags in
- ieee80211_bss_conf
-
-Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and
-MU Beamformee for VHT. This is utilized to pass MU-MIMO
-configurations from user space to driver in AP mode.
-
-Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
-Link: https://lore.kernel.org/r/1665006886-23874-1-git-send-email-quic_msinada@quicinc.com
-[fixed indentation, removed redundant !!]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -653,6 +653,14 @@ struct ieee80211_fils_discovery {
-  *	write-protected by sdata_lock and local->mtx so holding either is fine
-  *	for read access.
-  * @color_change_color: the bss color that will be used after the change.
-+ * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU
-+ *	beamformer
-+ * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU
-+ *	beamformee
-+ * @vht_mu_beamformer: in AP mode, does this BSS support operation as an VHT MU
-+ *	beamformer
-+ * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU
-+ *	beamformee
-  */
- struct ieee80211_bss_conf {
- 	const u8 *bssid;
-@@ -726,6 +734,11 @@ struct ieee80211_bss_conf {
- 
- 	bool color_change_active;
- 	u8 color_change_color;
-+
-+	bool vht_su_beamformer;
-+	bool vht_su_beamformee;
-+	bool vht_mu_beamformer;
-+	bool vht_mu_beamformee;
- };
- 
- /**
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1252,6 +1252,21 @@ static int ieee80211_start_ap(struct wip
- 	prev_beacon_int = link_conf->beacon_int;
- 	link_conf->beacon_int = params->beacon_interval;
- 
-+	if (params->vht_cap) {
-+		link_conf->vht_su_beamformer =
-+			params->vht_cap->vht_cap_info &
-+				cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
-+		link_conf->vht_su_beamformee =
-+			params->vht_cap->vht_cap_info &
-+				cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
-+		link_conf->vht_mu_beamformer =
-+			params->vht_cap->vht_cap_info &
-+				cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
-+		link_conf->vht_mu_beamformee =
-+			params->vht_cap->vht_cap_info &
-+				cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
-+	}
-+
- 	if (params->he_cap && params->he_oper) {
- 		link_conf->he_support = true;
- 		link_conf->htc_trig_based_pkt_ext =
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch
deleted file mode 100644
index f843dba..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: Muna Sinada <quic_msinada@quicinc.com>
-Date: Wed, 5 Oct 2022 14:54:46 -0700
-Subject: [PATCH] wifi: mac80211: Add HE MU-MIMO related flags in
- ieee80211_bss_conf
-
-Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and Full
-Bandwidth UL MU-MIMO for HE. This is utilized to pass MU-MIMO
-configurations from user space to driver in AP mode.
-
-Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
-Link: https://lore.kernel.org/r/1665006886-23874-2-git-send-email-quic_msinada@quicinc.com
-[fixed indentation, removed redundant !!]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -661,6 +661,15 @@ struct ieee80211_fils_discovery {
-  *	beamformer
-  * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU
-  *	beamformee
-+ * @he_su_beamformer: in AP-mode, does this BSS support operation as an HE SU
-+ *	beamformer
-+ * @he_su_beamformee: in AP-mode, does this BSS support operation as an HE SU
-+ *	beamformee
-+ * @he_mu_beamformer: in AP-mode, does this BSS support operation as an HE MU
-+ *	beamformer
-+ * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission
-+ *	(non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU
-+ *	bandwidth
-  */
- struct ieee80211_bss_conf {
- 	const u8 *bssid;
-@@ -739,6 +748,10 @@ struct ieee80211_bss_conf {
- 	bool vht_su_beamformee;
- 	bool vht_mu_beamformer;
- 	bool vht_mu_beamformee;
-+	bool he_su_beamformer;
-+	bool he_su_beamformee;
-+	bool he_mu_beamformer;
-+	bool he_full_ul_mumimo;
- };
- 
- /**
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1281,6 +1281,21 @@ static int ieee80211_start_ap(struct wip
- 			changed |= BSS_CHANGED_HE_BSS_COLOR;
- 	}
- 
-+	if (params->he_cap) {
-+		link_conf->he_su_beamformer =
-+			params->he_cap->phy_cap_info[3] &
-+				IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER;
-+		link_conf->he_su_beamformee =
-+			params->he_cap->phy_cap_info[4] &
-+				IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE;
-+		link_conf->he_mu_beamformer =
-+			params->he_cap->phy_cap_info[4] &
-+				IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
-+		link_conf->he_full_ul_mumimo =
-+			params->he_cap->phy_cap_info[2] &
-+				IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
-+	}
-+
- 	if (sdata->vif.type == NL80211_IFTYPE_AP &&
- 	    params->mbssid_config.tx_wdev) {
- 		err = ieee80211_set_ap_mbssid_options(sdata,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch
deleted file mode 100644
index 1be5fcf..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Ryder Lee <ryder.lee@mediatek.com>
-Date: Sat, 18 Feb 2023 01:50:05 +0800
-Subject: [PATCH] wifi: mac80211: introduce
- ieee80211_refresh_tx_agg_session_timer()
-
-This allows low level drivers to refresh the tx agg session timer, based on
-querying stats from the firmware usually. Especially for some mt76 devices
-support .net_fill_forward_path would bypass mac80211, which leads to tx BA
-session timeout for certain clients.
-
-Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -5964,6 +5964,18 @@ void ieee80211_queue_delayed_work(struct
- 				  unsigned long delay);
- 
- /**
-+ * ieee80211_refresh_tx_agg_session_timer - Refresh a tx agg session timer.
-+ * @sta: the station for which to start a BA session
-+ * @tid: the TID to BA on.
-+ *
-+ * This function allows low level driver to refresh tx agg session timer
-+ * to maintain BA session, the session level will still be managed by the
-+ * mac80211.
-+ */
-+void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta,
-+					    u16 tid);
-+
-+/**
-  * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
-  * @sta: the station for which to start a BA session
-  * @tid: the TID to BA on.
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -554,6 +554,23 @@ void ieee80211_tx_ba_session_handle_star
- 	ieee80211_send_addba_with_timeout(sta, tid_tx);
- }
- 
-+void ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *pubsta,
-+					    u16 tid)
-+{
-+	struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
-+	struct tid_ampdu_tx *tid_tx;
-+
-+	if (WARN_ON_ONCE(tid >= IEEE80211_NUM_TIDS))
-+		return;
-+
-+	tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
-+	if (!tid_tx)
-+		return;
-+
-+	tid_tx->last_tx = jiffies;
-+}
-+EXPORT_SYMBOL(ieee80211_refresh_tx_agg_session_timer);
-+
- /*
-  * After accepting the AddBA Response we activated a timer,
-  * resetting it after each frame that we send.
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch
deleted file mode 100644
index 11f39c2..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/326-wifi-mac80211-add-mesh-fast-rx-support.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 2 Mar 2023 13:52:29 +0100
-Subject: [PATCH] wifi: mac80211: add mesh fast-rx support
-
-This helps bring down rx CPU usage by avoiding calls to the rx handlers in
-the slow path. Supports forwarding and local rx, including A-MSDU.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -4564,6 +4564,12 @@ void ieee80211_check_fast_rx(struct sta_
- 		}
- 
- 		break;
-+	case NL80211_IFTYPE_MESH_POINT:
-+		fastrx.expected_ds_bits = cpu_to_le16(IEEE80211_FCTL_FROMDS |
-+						      IEEE80211_FCTL_TODS);
-+		fastrx.da_offs = offsetof(struct ieee80211_hdr, addr3);
-+		fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
-+		break;
- 	default:
- 		goto clear;
- 	}
-@@ -4772,6 +4778,7 @@ static bool ieee80211_invoke_fast_rx(str
- 	struct sk_buff *skb = rx->skb;
- 	struct ieee80211_hdr *hdr = (void *)skb->data;
- 	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
-+	static ieee80211_rx_result res;
- 	int orig_len = skb->len;
- 	int hdrlen = ieee80211_hdrlen(hdr->frame_control);
- 	int snap_offs = hdrlen;
-@@ -4833,7 +4840,8 @@ static bool ieee80211_invoke_fast_rx(str
- 		snap_offs += IEEE80211_CCMP_HDR_LEN;
- 	}
- 
--	if (!(status->rx_flags & IEEE80211_RX_AMSDU)) {
-+	if (!ieee80211_vif_is_mesh(&rx->sdata->vif) &&
-+	    !(status->rx_flags & IEEE80211_RX_AMSDU)) {
- 		if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
- 			return false;
- 
-@@ -4872,13 +4880,29 @@ static bool ieee80211_invoke_fast_rx(str
- 	/* do the header conversion - first grab the addresses */
- 	ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
- 	ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
--	skb_postpull_rcsum(skb, skb->data + snap_offs,
--			   sizeof(rfc1042_header) + 2);
--	/* remove the SNAP but leave the ethertype */
--	skb_pull(skb, snap_offs + sizeof(rfc1042_header));
-+	if (ieee80211_vif_is_mesh(&rx->sdata->vif)) {
-+	    skb_pull(skb, snap_offs - 2);
-+	    put_unaligned_be16(skb->len - 2, skb->data);
-+	} else {
-+	    skb_postpull_rcsum(skb, skb->data + snap_offs,
-+			       sizeof(rfc1042_header) + 2);
-+
-+	    /* remove the SNAP but leave the ethertype */
-+	    skb_pull(skb, snap_offs + sizeof(rfc1042_header));
-+	}
- 	/* push the addresses in front */
- 	memcpy(skb_push(skb, sizeof(addrs)), &addrs, sizeof(addrs));
- 
-+	res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
-+	switch (res) {
-+	case RX_QUEUED:
-+		return true;
-+	case RX_CONTINUE:
-+		break;
-+	default:
-+		goto drop;
-+	}
-+
- 	ieee80211_rx_8023(rx, fast_rx, orig_len);
- 
- 	return true;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch
deleted file mode 100644
index ac290b5..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/327-wifi-mac80211-add-support-for-letting-drivers-regist.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 20 Mar 2023 14:28:08 +0100
-Subject: [PATCH] wifi: mac80211: add support for letting drivers register tc
- offload support
-
-On newer MediaTek SoCs (e.g. MT7986), WLAN->WLAN or WLAN->Ethernet flows can
-be offloaded by the SoC. In order to support that, the .ndo_setup_tc op is
-needed.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -4192,6 +4192,10 @@ struct ieee80211_prep_tx_info {
-  *	Note that a sta can also be inserted or removed with valid links,
-  *	i.e. passed to @sta_add/@sta_state with sta->valid_links not zero.
-  *	In fact, cannot change from having valid_links and not having them.
-+ * @net_setup_tc: Called from .ndo_setup_tc in order to prepare hardware
-+ *	flow offloading for flows originating from the vif.
-+ *	Note that the driver must not assume that the vif driver_data is valid
-+ *	at this point, since the callback can be called during netdev teardown.
-  */
- struct ieee80211_ops {
- 	void (*tx)(struct ieee80211_hw *hw,
-@@ -4547,6 +4551,11 @@ struct ieee80211_ops {
- 				struct ieee80211_vif *vif,
- 				struct ieee80211_sta *sta,
- 				u16 old_links, u16 new_links);
-+	int (*net_setup_tc)(struct ieee80211_hw *hw,
-+			    struct ieee80211_vif *vif,
-+			    struct net_device *dev,
-+			    enum tc_setup_type type,
-+			    void *type_data);
- };
- 
- /**
---- a/net/mac80211/driver-ops.h
-+++ b/net/mac80211/driver-ops.h
-@@ -1470,6 +1470,23 @@ static inline int drv_net_fill_forward_p
- 	return ret;
- }
- 
-+static inline int drv_net_setup_tc(struct ieee80211_local *local,
-+				   struct ieee80211_sub_if_data *sdata,
-+				   struct net_device *dev,
-+				   enum tc_setup_type type, void *type_data)
-+{
-+	int ret = -EOPNOTSUPP;
-+
-+	sdata = get_bss_sdata(sdata);
-+	trace_drv_net_setup_tc(local, sdata, type);
-+	if (local->ops->net_setup_tc)
-+		ret = local->ops->net_setup_tc(&local->hw, &sdata->vif, dev,
-+					       type, type_data);
-+	trace_drv_return_int(local, ret);
-+
-+	return ret;
-+}
-+
- int drv_change_vif_links(struct ieee80211_local *local,
- 			 struct ieee80211_sub_if_data *sdata,
- 			 u16 old_links, u16 new_links,
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1939,7 +1939,8 @@ void ieee80211_color_collision_detection
- /* interface handling */
- #define MAC80211_SUPPORTED_FEATURES_TX	(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
- 					 NETIF_F_HW_CSUM | NETIF_F_SG | \
--					 NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE)
-+					 NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE | \
-+					 NETIF_F_HW_TC)
- #define MAC80211_SUPPORTED_FEATURES_RX	(NETIF_F_RXCSUM)
- #define MAC80211_SUPPORTED_FEATURES	(MAC80211_SUPPORTED_FEATURES_TX | \
- 					 MAC80211_SUPPORTED_FEATURES_RX)
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -813,6 +813,21 @@ ieee80211_get_stats64(struct net_device
- 	dev_fetch_sw_netstats(stats, dev->tstats);
- }
- 
-+static int ieee80211_netdev_setup_tc(struct net_device *dev,
-+				     enum tc_setup_type type, void *type_data)
-+{
-+	struct ieee80211_sub_if_data *sdata;
-+	struct ieee80211_local *local;
-+
-+	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-+	local = sdata->local;
-+
-+	if (!local->ops->net_setup_tc)
-+		return -EOPNOTSUPP;
-+
-+	return drv_net_setup_tc(local, sdata, dev, type, type_data);
-+}
-+
- static const struct net_device_ops ieee80211_dataif_ops = {
- 	.ndo_open		= ieee80211_open,
- 	.ndo_stop		= ieee80211_stop,
-@@ -821,6 +836,7 @@ static const struct net_device_ops ieee8
- 	.ndo_set_rx_mode	= ieee80211_set_multicast_list,
- 	.ndo_set_mac_address 	= ieee80211_change_mac,
- 	.ndo_get_stats64	= ieee80211_get_stats64,
-+	.ndo_setup_tc		= ieee80211_netdev_setup_tc,
- };
- 
- static u16 ieee80211_monitor_select_queue(struct net_device *dev,
-@@ -929,6 +945,7 @@ static const struct net_device_ops ieee8
- 	.ndo_set_mac_address	= ieee80211_change_mac,
- 	.ndo_get_stats64	= ieee80211_get_stats64,
- 	.ndo_fill_forward_path	= ieee80211_netdev_fill_forward_path,
-+	.ndo_setup_tc		= ieee80211_netdev_setup_tc,
- };
- 
- static bool ieee80211_iftype_supports_hdr_offload(enum nl80211_iftype iftype)
---- a/net/mac80211/trace.h
-+++ b/net/mac80211/trace.h
-@@ -2478,6 +2478,31 @@ DEFINE_EVENT(sta_event, drv_net_fill_for
- 	TP_ARGS(local, sdata, sta)
- );
- 
-+TRACE_EVENT(drv_net_setup_tc,
-+	TP_PROTO(struct ieee80211_local *local,
-+		 struct ieee80211_sub_if_data *sdata,
-+		 u8 type),
-+
-+	TP_ARGS(local, sdata, type),
-+
-+	TP_STRUCT__entry(
-+		LOCAL_ENTRY
-+		VIF_ENTRY
-+		__field(u8, type)
-+	),
-+
-+	TP_fast_assign(
-+		LOCAL_ASSIGN;
-+		VIF_ASSIGN;
-+		__entry->type = type;
-+	),
-+
-+	TP_printk(
-+		LOCAL_PR_FMT VIF_PR_FMT " type:%d\n",
-+		LOCAL_PR_ARG, VIF_PR_ARG, __entry->type
-+	)
-+);
-+
- TRACE_EVENT(drv_change_vif_links,
- 	TP_PROTO(struct ieee80211_local *local,
- 		 struct ieee80211_sub_if_data *sdata,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch
deleted file mode 100644
index 6882694..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 26 Mar 2023 17:11:34 +0200
-Subject: [PATCH] wifi: mac80211: fix receiving mesh packets in forwarding=0
- networks
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When forwarding is set to 0, frames are typically sent with ttl=1.
-Move the ttl decrement check below the check for local receive in order to
-fix packet drops.
-
-Reported-by: Thomas Hühn <thomas.huehn@hs-nordhausen.de>
-Reported-by: Nick Hainke <vincent@systemli.org>
-Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2828,14 +2828,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	if (sdata->crypto_tx_tailroom_needed_cnt)
- 		tailroom = IEEE80211_ENCRYPT_TAILROOM;
- 
--	if (!--mesh_hdr->ttl) {
--		if (multicast)
--			goto rx_accept;
--
--		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl);
--		return RX_DROP_MONITOR;
--	}
--
- 	if (mesh_hdr->flags & MESH_FLAGS_AE) {
- 		struct mesh_path *mppath;
- 		char *proxied_addr;
-@@ -2874,6 +2866,14 @@ ieee80211_rx_mesh_data(struct ieee80211_
- 	if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
- 		goto rx_accept;
- 
-+	if (!--mesh_hdr->ttl) {
-+		if (multicast)
-+			goto rx_accept;
-+
-+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl);
-+		return RX_DROP_MONITOR;
-+	}
-+
- 	if (!ifmsh->mshcfg.dot11MeshForwarding) {
- 		if (is_multicast_ether_addr(eth->h_dest))
- 			goto rx_accept;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch
deleted file mode 100644
index 079dd2a..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch
+++ /dev/null
@@ -1,134 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Wed, 29 Mar 2023 16:46:26 +0200
-Subject: [PATCH] wifi: ieee80211: correctly mark FTM frames non-bufferable
-
-The checks of whether or not a frame is bufferable were not
-taking into account that some action frames aren't, such as
-FTM. Check this, which requires some changes to the function
-ieee80211_is_bufferable_mmpdu() since we need the whole skb
-for the checks now.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
-Reviewed-by: Peer, Ilan <ilan.peer@intel.com>
----
-
---- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
-@@ -601,8 +601,9 @@ static void iwl_mvm_skb_prepare_status(s
- 
- static int iwl_mvm_get_ctrl_vif_queue(struct iwl_mvm *mvm,
- 				      struct ieee80211_tx_info *info,
--				      struct ieee80211_hdr *hdr)
-+				      struct sk_buff *skb)
- {
-+	struct ieee80211_hdr *hdr = (void *)skb->data;
- 	struct iwl_mvm_vif *mvmvif =
- 		iwl_mvm_vif_from_mac80211(info->control.vif);
- 	__le16 fc = hdr->frame_control;
-@@ -621,7 +622,7 @@ static int iwl_mvm_get_ctrl_vif_queue(st
- 		 * reason 7 ("Class 3 frame received from nonassociated STA").
- 		 */
- 		if (ieee80211_is_mgmt(fc) &&
--		    (!ieee80211_is_bufferable_mmpdu(fc) ||
-+		    (!ieee80211_is_bufferable_mmpdu(skb) ||
- 		     ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc)))
- 			return mvm->probe_queue;
- 
-@@ -740,7 +741,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv
- 			else
- 				sta_id = mvmvif->mcast_sta.sta_id;
- 
--			queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, hdr);
-+			queue = iwl_mvm_get_ctrl_vif_queue(mvm, &info, skb);
- 		} else if (info.control.vif->type == NL80211_IFTYPE_MONITOR) {
- 			queue = mvm->snif_queue;
- 			sta_id = mvm->snif_sta.sta_id;
---- a/include/linux/ieee80211.h
-+++ b/include/linux/ieee80211.h
-@@ -772,20 +772,6 @@ static inline bool ieee80211_is_any_null
- }
- 
- /**
-- * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
-- * @fc: frame control field in little-endian byteorder
-- */
--static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
--{
--	/* IEEE 802.11-2012, definition of "bufferable management frame";
--	 * note that this ignores the IBSS special case. */
--	return ieee80211_is_mgmt(fc) &&
--	       (ieee80211_is_action(fc) ||
--		ieee80211_is_disassoc(fc) ||
--		ieee80211_is_deauth(fc));
--}
--
--/**
-  * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
-  * @seq_ctrl: frame sequence control bytes in little-endian byteorder
-  */
-@@ -4121,6 +4107,44 @@ static inline u8 *ieee80211_get_DA(struc
- }
- 
- /**
-+ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
-+ * @skb: the skb to check, starting with the 802.11 header
-+ */
-+static inline bool ieee80211_is_bufferable_mmpdu(struct sk_buff *skb)
-+{
-+	struct ieee80211_mgmt *mgmt = (void *)skb->data;
-+	__le16 fc = mgmt->frame_control;
-+
-+	/*
-+	 * IEEE 802.11 REVme D2.0 definition of bufferable MMPDU;
-+	 * note that this ignores the IBSS special case.
-+	 */
-+	if (!ieee80211_is_mgmt(fc))
-+		return false;
-+
-+	if (ieee80211_is_disassoc(fc) || ieee80211_is_deauth(fc))
-+		return true;
-+
-+	if (!ieee80211_is_action(fc))
-+		return false;
-+
-+	if (skb->len < offsetofend(typeof(*mgmt), u.action.u.ftm.action_code))
-+		return true;
-+
-+	/* action frame - additionally check for non-bufferable FTM */
-+
-+	if (mgmt->u.action.category != WLAN_CATEGORY_PUBLIC &&
-+	    mgmt->u.action.category != WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION)
-+		return true;
-+
-+	if (mgmt->u.action.u.ftm.action_code == WLAN_PUB_ACTION_FTM_REQUEST ||
-+	    mgmt->u.action.u.ftm.action_code == WLAN_PUBLIC_ACTION_FTM_RESPONSE)
-+		return false;
-+
-+	return true;
-+}
-+
-+/**
-  * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
-  * @hdr: the frame (buffer must include at least the first octet of payload)
-  */
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -488,7 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
- 		int ac = skb_get_queue_mapping(tx->skb);
- 
- 		if (ieee80211_is_mgmt(hdr->frame_control) &&
--		    !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
-+		    !ieee80211_is_bufferable_mmpdu(tx->skb)) {
- 			info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
- 			return TX_CONTINUE;
- 		}
-@@ -1326,7 +1326,7 @@ static struct txq_info *ieee80211_get_tx
- 	if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) &&
- 	    unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
- 		if ((!ieee80211_is_mgmt(hdr->frame_control) ||
--		     ieee80211_is_bufferable_mmpdu(hdr->frame_control) ||
-+		     ieee80211_is_bufferable_mmpdu(skb) ||
- 		     vif->type == NL80211_IFTYPE_STATION) &&
- 		    sta && sta->uploaded) {
- 			/*
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch
deleted file mode 100644
index 00232ec..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/331-wifi-mac80211-flush-queues-on-STA-removal.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 13 Mar 2023 11:42:12 +0100
-Subject: [PATCH] wifi: mac80211: flush queues on STA removal
-
-When we remove a station, we first make it unreachable,
-then we (must) remove its keys, and then remove the
-station itself. Depending on the hardware design, if
-we have hardware crypto at all, frames still sitting
-on hardware queues may then be transmitted without a
-valid key, possibly unencrypted or with a fixed key.
-
-Fix this by flushing the queues when removing stations
-so this cannot happen.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
----
-
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -1271,6 +1271,14 @@ static void __sta_info_destroy_part2(str
- 		WARN_ON_ONCE(ret);
- 	}
- 
-+	/* Flush queues before removing keys, as that might remove them
-+	 * from hardware, and then depending on the offload method, any
-+	 * frames sitting on hardware queues might be sent out without
-+	 * any encryption at all.
-+	 */
-+	if (local->ops->set_key)
-+		ieee80211_flush_queues(local, sta->sdata, false);
-+
- 	/* now keys can no longer be reached */
- 	ieee80211_free_sta_keys(local, sta);
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch
deleted file mode 100644
index 3c31dfe..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 13 Mar 2023 12:02:58 +0100
-Subject: [PATCH] wifi: iwlwifi: mvm: support flush on AP interfaces
-
-Support TX flush on AP interfaces so that we will do a
-proper flush for frames on the queue before keys are
-removed.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
----
-
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-@@ -4854,9 +4854,6 @@ static void iwl_mvm_mac_flush(struct iee
- 		return;
- 	}
- 
--	if (vif->type != NL80211_IFTYPE_STATION)
--		return;
--
- 	/* Make sure we're done with the deferred traffic before flushing */
- 	flush_work(&mvm->add_stream_wk);
- 
-@@ -4874,9 +4871,6 @@ static void iwl_mvm_mac_flush(struct iee
- 		if (mvmsta->vif != vif)
- 			continue;
- 
--		/* make sure only TDLS peers or the AP are flushed */
--		WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls);
--
- 		if (drop) {
- 			if (iwl_mvm_flush_sta(mvm, mvmsta, false))
- 				IWL_ERR(mvm, "flush request fail\n");
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/333-wifi-mac80211-add-flush_sta-method.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/333-wifi-mac80211-add-flush_sta-method.patch
deleted file mode 100644
index 3bba0b7..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/333-wifi-mac80211-add-flush_sta-method.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 13 Mar 2023 11:53:51 +0100
-Subject: [PATCH] wifi: mac80211: add flush_sta method
-
-Some drivers like iwlwifi might have per-STA queues, so we
-may want to flush/drop just those queues rather than all
-when removing a station. Add a separate method for that.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -3918,6 +3918,10 @@ struct ieee80211_prep_tx_info {
-  *	Note that vif can be NULL.
-  *	The callback can sleep.
-  *
-+ * @flush_sta: Flush or drop all pending frames from the hardware queue(s) for
-+ *	the given station, as it's about to be removed.
-+ *	The callback can sleep.
-+ *
-  * @channel_switch: Drivers that need (or want) to offload the channel
-  *	switch operation for CSAs received from the AP may implement this
-  *	callback. They must then call ieee80211_chswitch_done() to indicate
-@@ -4372,6 +4376,8 @@ struct ieee80211_ops {
- #endif
- 	void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		      u32 queues, bool drop);
-+	void (*flush_sta)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-+			  struct ieee80211_sta *sta);
- 	void (*channel_switch)(struct ieee80211_hw *hw,
- 			       struct ieee80211_vif *vif,
- 			       struct ieee80211_channel_switch *ch_switch);
---- a/net/mac80211/driver-ops.h
-+++ b/net/mac80211/driver-ops.h
-@@ -617,6 +617,21 @@ static inline void drv_flush(struct ieee
- 	trace_drv_return_void(local);
- }
- 
-+static inline void drv_flush_sta(struct ieee80211_local *local,
-+				 struct ieee80211_sub_if_data *sdata,
-+				 struct sta_info *sta)
-+{
-+	might_sleep();
-+
-+	if (sdata && !check_sdata_in_driver(sdata))
-+		return;
-+
-+	trace_drv_flush_sta(local, sdata, &sta->sta);
-+	if (local->ops->flush_sta)
-+		local->ops->flush_sta(&local->hw, &sdata->vif, &sta->sta);
-+	trace_drv_return_void(local);
-+}
-+
- static inline void drv_channel_switch(struct ieee80211_local *local,
- 				      struct ieee80211_sub_if_data *sdata,
- 				      struct ieee80211_channel_switch *ch_switch)
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -1276,8 +1276,12 @@ static void __sta_info_destroy_part2(str
- 	 * frames sitting on hardware queues might be sent out without
- 	 * any encryption at all.
- 	 */
--	if (local->ops->set_key)
--		ieee80211_flush_queues(local, sta->sdata, false);
-+	if (local->ops->set_key) {
-+		if (local->ops->flush_sta)
-+			drv_flush_sta(local, sta->sdata, sta);
-+		else
-+			ieee80211_flush_queues(local, sta->sdata, false);
-+	}
- 
- 	/* now keys can no longer be reached */
- 	ieee80211_free_sta_keys(local, sta);
---- a/net/mac80211/trace.h
-+++ b/net/mac80211/trace.h
-@@ -1177,6 +1177,13 @@ TRACE_EVENT(drv_flush,
- 	)
- );
- 
-+DEFINE_EVENT(sta_event, drv_flush_sta,
-+	TP_PROTO(struct ieee80211_local *local,
-+		 struct ieee80211_sub_if_data *sdata,
-+		 struct ieee80211_sta *sta),
-+	TP_ARGS(local, sdata, sta)
-+);
-+
- TRACE_EVENT(drv_channel_switch,
- 	TP_PROTO(struct ieee80211_local *local,
- 		 struct ieee80211_sub_if_data *sdata,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch
deleted file mode 100644
index 18f39d5..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 13 Mar 2023 12:05:35 +0100
-Subject: [PATCH] wifi: iwlwifi: mvm: support new flush_sta method
-
-For iwlwifi this is simple to implement, and on newer hardware
-it's an improvement since we have per-station queues.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Reviewed-by: Greenman, Gregory <gregory.greenman@intel.com>
----
-
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-@@ -4890,6 +4890,31 @@ static void iwl_mvm_mac_flush(struct iee
- 		iwl_trans_wait_tx_queues_empty(mvm->trans, msk);
- }
- 
-+static void iwl_mvm_mac_flush_sta(struct ieee80211_hw *hw,
-+				  struct ieee80211_vif *vif,
-+				  struct ieee80211_sta *sta)
-+{
-+	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
-+	int i;
-+
-+	mutex_lock(&mvm->mutex);
-+	for (i = 0; i < mvm->fw->ucode_capa.num_stations; i++) {
-+		struct iwl_mvm_sta *mvmsta;
-+		struct ieee80211_sta *tmp;
-+
-+		tmp = rcu_dereference_protected(mvm->fw_id_to_mac_id[i],
-+						lockdep_is_held(&mvm->mutex));
-+		if (tmp != sta)
-+			continue;
-+
-+		mvmsta = iwl_mvm_sta_from_mac80211(sta);
-+
-+		if (iwl_mvm_flush_sta(mvm, mvmsta, false))
-+			IWL_ERR(mvm, "flush request fail\n");
-+	}
-+	mutex_unlock(&mvm->mutex);
-+}
-+
- static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
- 				  struct survey_info *survey)
- {
-@@ -5417,6 +5442,7 @@ const struct ieee80211_ops iwl_mvm_hw_op
- 	.mgd_complete_tx = iwl_mvm_mac_mgd_complete_tx,
- 	.mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover,
- 	.flush = iwl_mvm_mac_flush,
-+	.flush_sta = iwl_mvm_mac_flush_sta,
- 	.sched_scan_start = iwl_mvm_mac_sched_scan_start,
- 	.sched_scan_stop = iwl_mvm_mac_sched_scan_stop,
- 	.set_key = iwl_mvm_mac_set_key,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch
deleted file mode 100644
index 1b379b7..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From: Ryder Lee <ryder.lee@mediatek.com>
-Date: Sat, 18 Feb 2023 01:49:25 +0800
-Subject: [PATCH] wifi: mac80211: add LDPC related flags in ieee80211_bss_conf
-
-This is utilized to pass LDPC configurations from user space
-(i.e. hostapd) to driver.
-
-Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
-Link: https://lore.kernel.org/r/1de696aaa34efd77a926eb657b8c0fda05aaa177.1676628065.git.ryder.lee@mediatek.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -653,6 +653,9 @@ struct ieee80211_fils_discovery {
-  *	write-protected by sdata_lock and local->mtx so holding either is fine
-  *	for read access.
-  * @color_change_color: the bss color that will be used after the change.
-+ * @ht_ldpc: in AP mode, indicates interface has HT LDPC capability.
-+ * @vht_ldpc: in AP mode, indicates interface has VHT LDPC capability.
-+ * @he_ldpc: in AP mode, indicates interface has HE LDPC capability.
-  * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU
-  *	beamformer
-  * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU
-@@ -744,6 +747,9 @@ struct ieee80211_bss_conf {
- 	bool color_change_active;
- 	u8 color_change_color;
- 
-+	bool ht_ldpc;
-+	bool vht_ldpc;
-+	bool he_ldpc;
- 	bool vht_su_beamformer;
- 	bool vht_su_beamformee;
- 	bool vht_mu_beamformer;
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1252,7 +1252,15 @@ static int ieee80211_start_ap(struct wip
- 	prev_beacon_int = link_conf->beacon_int;
- 	link_conf->beacon_int = params->beacon_interval;
- 
-+	if (params->ht_cap)
-+		link_conf->ht_ldpc =
-+			params->ht_cap->cap_info &
-+				cpu_to_le16(IEEE80211_HT_CAP_LDPC_CODING);
-+
- 	if (params->vht_cap) {
-+		link_conf->vht_ldpc =
-+			params->vht_cap->vht_cap_info &
-+				cpu_to_le32(IEEE80211_VHT_CAP_RXLDPC);
- 		link_conf->vht_su_beamformer =
- 			params->vht_cap->vht_cap_info &
- 				cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE);
-@@ -1282,6 +1290,9 @@ static int ieee80211_start_ap(struct wip
- 	}
- 
- 	if (params->he_cap) {
-+		link_conf->he_ldpc =
-+			params->he_cap->phy_cap_info[1] &
-+				IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
- 		link_conf->he_su_beamformer =
- 			params->he_cap->phy_cap_info[3] &
- 				IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch
deleted file mode 100644
index 088f468..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch
+++ /dev/null
@@ -1,372 +0,0 @@
-From bd54f3c29077f23dad92ef82a78061b40be30c65 Mon Sep 17 00:00:00 2001
-From: Aloka Dixit <quic_alokad@quicinc.com>
-Date: Mon, 5 Dec 2022 16:50:37 -0800
-Subject: [PATCH] wifi: mac80211: generate EMA beacons in AP mode
-
-Add APIs to generate an array of beacons for an EMA AP (enhanced
-multiple BSSID advertisements), each including a single MBSSID element.
-EMA profile periodicity equals the count of elements.
-
-- ieee80211_beacon_get_template_ema_list() - Generate and return all
-EMA beacon templates. Drivers must call ieee80211_beacon_free_ema_list()
-to free the memory. No change in the prototype for the existing API,
-ieee80211_beacon_get_template(), which should be used for non-EMA AP.
-
-- ieee80211_beacon_get_template_ema_index() - Generate a beacon which
-includes the multiple BSSID element at the given index. Drivers can use
-this function in a loop until NULL is returned which indicates end of
-available MBSSID elements.
-
-- ieee80211_beacon_free_ema_list() - free the memory allocated for the
-list of EMA beacon templates.
-
-Modify existing functions ieee80211_beacon_get_ap(),
-ieee80211_get_mbssid_beacon_len() and ieee80211_beacon_add_mbssid()
-to accept a new parameter for EMA index.
-
-Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
-Co-developed-by: John Crispin <john@phrozen.org>
-Signed-off-by: John Crispin <john@phrozen.org>
-Link: https://lore.kernel.org/r/20221206005040.3177-2-quic_alokad@quicinc.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/mac80211.h     |  68 +++++++++++++++++++
- net/mac80211/cfg.c         |  11 +--
- net/mac80211/ieee80211_i.h |  10 ++-
- net/mac80211/tx.c          | 134 ++++++++++++++++++++++++++++++++++---
- 4 files changed, 205 insertions(+), 18 deletions(-)
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -5252,6 +5252,74 @@ ieee80211_beacon_get_template(struct iee
- 			      unsigned int link_id);
- 
- /**
-+ * ieee80211_beacon_get_template_ema_index - EMA beacon template generation
-+ * @hw: pointer obtained from ieee80211_alloc_hw().
-+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
-+ * @offs: &struct ieee80211_mutable_offsets pointer to struct that will
-+ *	receive the offsets that may be updated by the driver.
-+ * @link_id: the link id to which the beacon belongs (or 0 for a non-MLD AP).
-+ * @ema_index: index of the beacon in the EMA set.
-+ *
-+ * This function follows the same rules as ieee80211_beacon_get_template()
-+ * but returns a beacon template which includes multiple BSSID element at the
-+ * requested index.
-+ *
-+ * Return: The beacon template. %NULL indicates the end of EMA templates.
-+ */
-+struct sk_buff *
-+ieee80211_beacon_get_template_ema_index(struct ieee80211_hw *hw,
-+					struct ieee80211_vif *vif,
-+					struct ieee80211_mutable_offsets *offs,
-+					unsigned int link_id, u8 ema_index);
-+
-+/**
-+ * struct ieee80211_ema_beacons - List of EMA beacons
-+ * @cnt: count of EMA beacons.
-+ *
-+ * @bcn: array of EMA beacons.
-+ * @bcn.skb: the skb containing this specific beacon
-+ * @bcn.offs: &struct ieee80211_mutable_offsets pointer to struct that will
-+ *	receive the offsets that may be updated by the driver.
-+ */
-+struct ieee80211_ema_beacons {
-+	u8 cnt;
-+	struct {
-+		struct sk_buff *skb;
-+		struct ieee80211_mutable_offsets offs;
-+	} bcn[];
-+};
-+
-+/**
-+ * ieee80211_beacon_get_template_ema_list - EMA beacon template generation
-+ * @hw: pointer obtained from ieee80211_alloc_hw().
-+ * @vif: &struct ieee80211_vif pointer from the add_interface callback.
-+ * @link_id: the link id to which the beacon belongs (or 0 for a non-MLD AP)
-+ *
-+ * This function follows the same rules as ieee80211_beacon_get_template()
-+ * but allocates and returns a pointer to list of all beacon templates required
-+ * to cover all profiles in the multiple BSSID set. Each template includes only
-+ * one multiple BSSID element.
-+ *
-+ * Driver must call ieee80211_beacon_free_ema_list() to free the memory.
-+ *
-+ * Return: EMA beacon templates of type struct ieee80211_ema_beacons *.
-+ *	%NULL on error.
-+ */
-+struct ieee80211_ema_beacons *
-+ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw,
-+				       struct ieee80211_vif *vif,
-+				       unsigned int link_id);
-+
-+/**
-+ * ieee80211_beacon_free_ema_list - free an EMA beacon template list
-+ * @ema_beacons: list of EMA beacons of type &struct ieee80211_ema_beacons pointers.
-+ *
-+ * This function will free a list previously acquired by calling
-+ * ieee80211_beacon_get_template_ema_list()
-+ */
-+void ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *ema_beacons);
-+
-+/**
-  * ieee80211_beacon_get_tim - beacon generation function
-  * @hw: pointer obtained from ieee80211_alloc_hw().
-  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1122,11 +1122,11 @@ static int ieee80211_assign_beacon(struc
- 	if (params->mbssid_ies) {
- 		mbssid = params->mbssid_ies;
- 		size += struct_size(new->mbssid_ies, elem, mbssid->cnt);
--		size += ieee80211_get_mbssid_beacon_len(mbssid);
-+		size += ieee80211_get_mbssid_beacon_len(mbssid, mbssid->cnt);
- 	} else if (old && old->mbssid_ies) {
- 		mbssid = old->mbssid_ies;
- 		size += struct_size(new->mbssid_ies, elem, mbssid->cnt);
--		size += ieee80211_get_mbssid_beacon_len(mbssid);
-+		size += ieee80211_get_mbssid_beacon_len(mbssid, mbssid->cnt);
- 	}
- 
- 	new = kzalloc(size, GFP_KERNEL);
-@@ -3384,8 +3384,11 @@ cfg80211_beacon_dup(struct cfg80211_beac
- 
- 	len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
- 	      beacon->proberesp_ies_len + beacon->assocresp_ies_len +
--	      beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len +
--	      ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies);
-+	      beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len;
-+
-+	if (beacon->mbssid_ies)
-+		len += ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies,
-+						       beacon->mbssid_ies->cnt);
- 
- 	new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
- 	if (!new_beacon)
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1182,13 +1182,17 @@ ieee80211_vif_get_shift(struct ieee80211
- }
- 
- static inline int
--ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems)
-+ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems, u8 i)
- {
--	int i, len = 0;
-+	int len = 0;
- 
--	if (!elems)
-+	if (!elems || !elems->cnt || i > elems->cnt)
- 		return 0;
- 
-+	if (i < elems->cnt)
-+		return elems->elem[i].len;
-+
-+	/* i == elems->cnt, calculate total length of all MBSSID elements */
- 	for (i = 0; i < elems->cnt; i++)
- 		len += elems->elem[i].len;
- 
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -5205,13 +5205,20 @@ ieee80211_beacon_get_finish(struct ieee8
- }
- 
- static void
--ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon)
-+ieee80211_beacon_add_mbssid(struct sk_buff *skb, struct beacon_data *beacon,
-+			    u8 i)
- {
--	int i;
-+	if (!beacon->mbssid_ies || !beacon->mbssid_ies->cnt ||
-+	    i > beacon->mbssid_ies->cnt)
-+		return;
- 
--	if (!beacon->mbssid_ies)
-+	if (i < beacon->mbssid_ies->cnt) {
-+		skb_put_data(skb, beacon->mbssid_ies->elem[i].data,
-+			     beacon->mbssid_ies->elem[i].len);
- 		return;
-+	}
- 
-+	/* i == beacon->mbssid_ies->cnt, include all MBSSID elements */
- 	for (i = 0; i < beacon->mbssid_ies->cnt; i++)
- 		skb_put_data(skb, beacon->mbssid_ies->elem[i].data,
- 			     beacon->mbssid_ies->elem[i].len);
-@@ -5224,7 +5231,8 @@ ieee80211_beacon_get_ap(struct ieee80211
- 			struct ieee80211_mutable_offsets *offs,
- 			bool is_template,
- 			struct beacon_data *beacon,
--			struct ieee80211_chanctx_conf *chanctx_conf)
-+			struct ieee80211_chanctx_conf *chanctx_conf,
-+			u8 ema_index)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
- 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
-@@ -5243,7 +5251,9 @@ ieee80211_beacon_get_ap(struct ieee80211
- 	/* headroom, head length,
- 	 * tail length, maximum TIM length and multiple BSSID length
- 	 */
--	mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies);
-+	mbssid_len = ieee80211_get_mbssid_beacon_len(beacon->mbssid_ies,
-+						     ema_index);
-+
- 	skb = dev_alloc_skb(local->tx_headroom + beacon->head_len +
- 			    beacon->tail_len + 256 +
- 			    local->hw.extra_beacon_tailroom + mbssid_len);
-@@ -5261,7 +5271,7 @@ ieee80211_beacon_get_ap(struct ieee80211
- 		offs->cntdwn_counter_offs[0] = beacon->cntdwn_counter_offsets[0];
- 
- 		if (mbssid_len) {
--			ieee80211_beacon_add_mbssid(skb, beacon);
-+			ieee80211_beacon_add_mbssid(skb, beacon, ema_index);
- 			offs->mbssid_off = skb->len - mbssid_len;
- 		}
- 
-@@ -5280,12 +5290,51 @@ ieee80211_beacon_get_ap(struct ieee80211
- 	return skb;
- }
- 
-+static struct ieee80211_ema_beacons *
-+ieee80211_beacon_get_ap_ema_list(struct ieee80211_hw *hw,
-+				 struct ieee80211_vif *vif,
-+				 struct ieee80211_link_data *link,
-+				 struct ieee80211_mutable_offsets *offs,
-+				 bool is_template, struct beacon_data *beacon,
-+				 struct ieee80211_chanctx_conf *chanctx_conf)
-+{
-+	struct ieee80211_ema_beacons *ema = NULL;
-+
-+	if (!beacon->mbssid_ies || !beacon->mbssid_ies->cnt)
-+		return NULL;
-+
-+	ema = kzalloc(struct_size(ema, bcn, beacon->mbssid_ies->cnt),
-+		      GFP_ATOMIC);
-+	if (!ema)
-+		return NULL;
-+
-+	for (ema->cnt = 0; ema->cnt < beacon->mbssid_ies->cnt; ema->cnt++) {
-+		ema->bcn[ema->cnt].skb =
-+			ieee80211_beacon_get_ap(hw, vif, link,
-+						&ema->bcn[ema->cnt].offs,
-+						is_template, beacon,
-+						chanctx_conf, ema->cnt);
-+		if (!ema->bcn[ema->cnt].skb)
-+			break;
-+	}
-+
-+	if (ema->cnt == beacon->mbssid_ies->cnt)
-+		return ema;
-+
-+	ieee80211_beacon_free_ema_list(ema);
-+	return NULL;
-+}
-+
-+#define IEEE80211_INCLUDE_ALL_MBSSID_ELEMS -1
-+
- static struct sk_buff *
- __ieee80211_beacon_get(struct ieee80211_hw *hw,
- 		       struct ieee80211_vif *vif,
- 		       struct ieee80211_mutable_offsets *offs,
- 		       bool is_template,
--		       unsigned int link_id)
-+		       unsigned int link_id,
-+		       int ema_index,
-+		       struct ieee80211_ema_beacons **ema_beacons)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
- 	struct beacon_data *beacon = NULL;
-@@ -5314,8 +5363,29 @@ __ieee80211_beacon_get(struct ieee80211_
- 		if (!beacon)
- 			goto out;
- 
--		skb = ieee80211_beacon_get_ap(hw, vif, link, offs, is_template,
--					      beacon, chanctx_conf);
-+		if (ema_beacons) {
-+			*ema_beacons =
-+				ieee80211_beacon_get_ap_ema_list(hw, vif, link,
-+								 offs,
-+								 is_template,
-+								 beacon,
-+								 chanctx_conf);
-+		} else {
-+			if (beacon->mbssid_ies && beacon->mbssid_ies->cnt) {
-+				if (ema_index >= beacon->mbssid_ies->cnt)
-+					goto out; /* End of MBSSID elements */
-+
-+				if (ema_index <= IEEE80211_INCLUDE_ALL_MBSSID_ELEMS)
-+					ema_index = beacon->mbssid_ies->cnt;
-+			} else {
-+				ema_index = 0;
-+			}
-+
-+			skb = ieee80211_beacon_get_ap(hw, vif, link, offs,
-+						      is_template, beacon,
-+						      chanctx_conf,
-+						      ema_index);
-+		}
- 	} else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
- 		struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
- 		struct ieee80211_hdr *hdr;
-@@ -5403,10 +5473,50 @@ ieee80211_beacon_get_template(struct iee
- 			      struct ieee80211_mutable_offsets *offs,
- 			      unsigned int link_id)
- {
--	return __ieee80211_beacon_get(hw, vif, offs, true, link_id);
-+	return __ieee80211_beacon_get(hw, vif, offs, true, link_id,
-+				      IEEE80211_INCLUDE_ALL_MBSSID_ELEMS, NULL);
- }
- EXPORT_SYMBOL(ieee80211_beacon_get_template);
- 
-+struct sk_buff *
-+ieee80211_beacon_get_template_ema_index(struct ieee80211_hw *hw,
-+					struct ieee80211_vif *vif,
-+					struct ieee80211_mutable_offsets *offs,
-+					unsigned int link_id, u8 ema_index)
-+{
-+	return __ieee80211_beacon_get(hw, vif, offs, true, link_id, ema_index,
-+				      NULL);
-+}
-+EXPORT_SYMBOL(ieee80211_beacon_get_template_ema_index);
-+
-+void ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *ema_beacons)
-+{
-+	u8 i;
-+
-+	if (!ema_beacons)
-+		return;
-+
-+	for (i = 0; i < ema_beacons->cnt; i++)
-+		kfree_skb(ema_beacons->bcn[i].skb);
-+
-+	kfree(ema_beacons);
-+}
-+EXPORT_SYMBOL(ieee80211_beacon_free_ema_list);
-+
-+struct ieee80211_ema_beacons *
-+ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw,
-+				       struct ieee80211_vif *vif,
-+				       unsigned int link_id)
-+{
-+	struct ieee80211_ema_beacons *ema_beacons = NULL;
-+
-+	WARN_ON(__ieee80211_beacon_get(hw, vif, NULL, false, link_id, 0,
-+				       &ema_beacons));
-+
-+	return ema_beacons;
-+}
-+EXPORT_SYMBOL(ieee80211_beacon_get_template_ema_list);
-+
- struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
- 					 struct ieee80211_vif *vif,
- 					 u16 *tim_offset, u16 *tim_length,
-@@ -5414,7 +5524,9 @@ struct sk_buff *ieee80211_beacon_get_tim
- {
- 	struct ieee80211_mutable_offsets offs = {};
- 	struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false,
--						     link_id);
-+						     link_id,
-+						     IEEE80211_INCLUDE_ALL_MBSSID_ELEMS,
-+						     NULL);
- 	struct sk_buff *copy;
- 	int shift;
- 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/337-mac80211-fix-sband-iftype-data-lookup-for-AP_VLAN.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/337-mac80211-fix-sband-iftype-data-lookup-for-AP_VLAN.patch
deleted file mode 100644
index 67b4284..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/337-mac80211-fix-sband-iftype-data-lookup-for-AP_VLAN.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 22 Jun 2023 18:02:25 +0200
-Subject: [PATCH] mac80211: fix sband iftype data lookup for AP_VLAN
-
-AP_VLAN interfaces are virtual, so doesn't really exist as a type for
-capabilities. When passed in as a type, AP is the one that's really intended.
-
-Fixes: c4cbaf7973a7 ("cfg80211: Add support for HE")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -567,6 +567,9 @@ ieee80211_get_sband_iftype_data(const st
- 	if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
- 		return NULL;
- 
-+	if (iftype == NL80211_IFTYPE_AP_VLAN)
-+		iftype = NL80211_IFTYPE_AP;
-+
- 	for (i = 0; i < sband->n_iftype_data; i++)  {
- 		const struct ieee80211_sband_iftype_data *data =
- 			&sband->iftype_data[i];
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/339-wifi-cfg80211-fix-receving-mesh-packets-without-RFC1.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/339-wifi-cfg80211-fix-receving-mesh-packets-without-RFC1.patch
deleted file mode 100644
index e32c6ae..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/339-wifi-cfg80211-fix-receving-mesh-packets-without-RFC1.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Tue, 11 Jul 2023 13:30:12 +0200
-Subject: [PATCH] wifi: cfg80211: fix receving mesh packets without RFC1042
- header
-
-Fix ethernet header length field after stripping the mesh header
-
-Cc: stable@vger.kernel.org
-Link: https://lore.kernel.org/all/CT5GNZSK28AI.2K6M69OXM9RW5@syracuse/
-Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
-Reported-by: Nicolas Escande <nico.escande@gmail.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -580,6 +580,8 @@ int ieee80211_strip_8023_mesh_hdr(struct
- 		hdrlen += ETH_ALEN + 2;
- 	else if (!pskb_may_pull(skb, hdrlen))
- 		return -EINVAL;
-+	else
-+		payload.eth.h_proto = htons(skb->len - hdrlen);
- 
- 	mesh_addr = skb->data + sizeof(payload.eth) + ETH_ALEN;
- 	switch (payload.flags & MESH_FLAGS_AE) {
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/400-allow-ibss-mixed.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/400-allow-ibss-mixed.patch
index c38fa13..ad24dfd 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/400-allow-ibss-mixed.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/400-allow-ibss-mixed.patch
@@ -16,7 +16,7 @@
 
 --- a/net/wireless/core.c
 +++ b/net/wireless/core.c
-@@ -614,21 +614,6 @@ static int wiphy_verify_combinations(str
+@@ -649,21 +649,6 @@ static int wiphy_verify_combinations(str
  				    c->limits[j].max > 1))
  				return -EINVAL;
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0001-Revert-mac80211-use-the-new-drop-reasons-infrastruct.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0001-Revert-mac80211-use-the-new-drop-reasons-infrastruct.patch
new file mode 100644
index 0000000..8e924dc
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0001-Revert-mac80211-use-the-new-drop-reasons-infrastruct.patch
@@ -0,0 +1,381 @@
+From e6a3cf0e4fd98f36be9352b92d40cfeb79993fc9 Mon Sep 17 00:00:00 2001
+From: Shayne Chen <shayne.chen@mediatek.com>
+Date: Mon, 21 Aug 2023 14:20:49 +0800
+Subject: [PATCH] Revert mac80211: use the new drop reasons infrastructure
+
+---
+ net/mac80211/drop.h        | 56 --------------------------------------
+ net/mac80211/ieee80211_i.h |  8 +++++-
+ net/mac80211/main.c        | 31 ---------------------
+ net/mac80211/rx.c          | 55 +++++++++++++++++++------------------
+ net/mac80211/wpa.c         | 24 ++++++++--------
+ 5 files changed, 48 insertions(+), 126 deletions(-)
+ delete mode 100644 net/mac80211/drop.h
+
+diff --git a/net/mac80211/drop.h b/net/mac80211/drop.h
+deleted file mode 100644
+index 49dc809..0000000
+--- a/net/mac80211/drop.h
++++ /dev/null
+@@ -1,56 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0-only */
+-/*
+- * mac80211 drop reason list
+- *
+- * Copyright (C) 2023 Intel Corporation
+- */
+-
+-#ifndef MAC80211_DROP_H
+-#define MAC80211_DROP_H
+-#include <net/dropreason.h>
+-
+-typedef unsigned int __bitwise ieee80211_rx_result;
+-
+-#define MAC80211_DROP_REASONS_MONITOR(R)	\
+-	R(RX_DROP_M_UNEXPECTED_4ADDR_FRAME)	\
+-	R(RX_DROP_M_BAD_BCN_KEYIDX)		\
+-	R(RX_DROP_M_BAD_MGMT_KEYIDX)		\
+-/* this line for the trailing \ - add before this */
+-
+-#define MAC80211_DROP_REASONS_UNUSABLE(R)	\
+-	R(RX_DROP_U_MIC_FAIL)			\
+-	R(RX_DROP_U_REPLAY)			\
+-	R(RX_DROP_U_BAD_MMIE)			\
+-/* this line for the trailing \ - add before this */
+-
+-/* having two enums allows for checking ieee80211_rx_result use with sparse */
+-enum ___mac80211_drop_reason {
+-/* if we get to the end of handlers with RX_CONTINUE this will be the reason */
+-	___RX_CONTINUE	= SKB_CONSUMED,
+-
+-/* this never gets used as an argument to kfree_skb_reason() */
+-	___RX_QUEUED	= SKB_NOT_DROPPED_YET,
+-
+-#define ENUM(x) ___ ## x,
+-	___RX_DROP_MONITOR = SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR <<
+-		SKB_DROP_REASON_SUBSYS_SHIFT,
+-	MAC80211_DROP_REASONS_MONITOR(ENUM)
+-
+-	___RX_DROP_UNUSABLE = SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE <<
+-		SKB_DROP_REASON_SUBSYS_SHIFT,
+-	MAC80211_DROP_REASONS_UNUSABLE(ENUM)
+-#undef ENUM
+-};
+-
+-enum mac80211_drop_reason {
+-	RX_CONTINUE	 = (__force ieee80211_rx_result)___RX_CONTINUE,
+-	RX_QUEUED	 = (__force ieee80211_rx_result)___RX_QUEUED,
+-	RX_DROP_MONITOR	 = (__force ieee80211_rx_result)___RX_DROP_MONITOR,
+-	RX_DROP_UNUSABLE = (__force ieee80211_rx_result)___RX_DROP_UNUSABLE,
+-#define DEF(x) x = (__force ieee80211_rx_result)___ ## x,
+-	MAC80211_DROP_REASONS_MONITOR(DEF)
+-	MAC80211_DROP_REASONS_UNUSABLE(DEF)
+-#undef DEF
+-};
+-
+-#endif /* MAC80211_DROP_H */
+diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
+index 9fdfd11..7ca2482 100644
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -33,7 +33,6 @@
+ #include "key.h"
+ #include "sta_info.h"
+ #include "debug.h"
+-#include "drop.h"
+ 
+ extern const struct cfg80211_ops mac80211_config_ops;
+ 
+@@ -171,6 +170,13 @@ struct ieee80211_tx_data {
+ 	unsigned int flags;
+ };
+ 
++
++typedef unsigned __bitwise ieee80211_rx_result;
++#define RX_CONTINUE		((__force ieee80211_rx_result) 0u)
++#define RX_DROP_UNUSABLE	((__force ieee80211_rx_result) 1u)
++#define RX_DROP_MONITOR		((__force ieee80211_rx_result) 2u)
++#define RX_QUEUED		((__force ieee80211_rx_result) 3u)
++
+ /**
+  * enum ieee80211_packet_rx_flags - packet RX flags
+  * @IEEE80211_RX_AMSDU: a-MSDU packet
+diff --git a/net/mac80211/main.c b/net/mac80211/main.c
+index c2f25a4..e2f7ae5 100644
+--- a/net/mac80211/main.c
++++ b/net/mac80211/main.c
+@@ -22,7 +22,6 @@
+ #include <linux/bitmap.h>
+ #include <linux/inetdevice.h>
+ #include <net/net_namespace.h>
+-#include <net/dropreason.h>
+ #include <net/cfg80211.h>
+ #include <net/addrconf.h>
+ 
+@@ -1544,28 +1543,6 @@ void ieee80211_free_hw(struct ieee80211_hw *hw)
+ }
+ EXPORT_SYMBOL(ieee80211_free_hw);
+ 
+-static const char * const drop_reasons_monitor[] = {
+-#define V(x)	#x,
+-	[0] = "RX_DROP_MONITOR",
+-	MAC80211_DROP_REASONS_MONITOR(V)
+-};
+-
+-static struct drop_reason_list drop_reason_list_monitor = {
+-	.reasons = drop_reasons_monitor,
+-	.n_reasons = ARRAY_SIZE(drop_reasons_monitor),
+-};
+-
+-static const char * const drop_reasons_unusable[] = {
+-	[0] = "RX_DROP_UNUSABLE",
+-	MAC80211_DROP_REASONS_UNUSABLE(V)
+-#undef V
+-};
+-
+-static struct drop_reason_list drop_reason_list_unusable = {
+-	.reasons = drop_reasons_unusable,
+-	.n_reasons = ARRAY_SIZE(drop_reasons_unusable),
+-};
+-
+ static int __init ieee80211_init(void)
+ {
+ 	struct sk_buff *skb;
+@@ -1583,11 +1560,6 @@ static int __init ieee80211_init(void)
+ 	if (ret)
+ 		goto err_netdev;
+ 
+-	drop_reasons_register_subsys(SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR,
+-				     &drop_reason_list_monitor);
+-	drop_reasons_register_subsys(SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE,
+-				     &drop_reason_list_unusable);
+-
+ 	return 0;
+  err_netdev:
+ 	rc80211_minstrel_exit();
+@@ -1603,9 +1575,6 @@ static void __exit ieee80211_exit(void)
+ 
+ 	ieee80211_iface_exit();
+ 
+-	drop_reasons_unregister_subsys(SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR);
+-	drop_reasons_unregister_subsys(SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE);
+-
+ 	rcu_barrier();
+ }
+ 
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index 491047d..8ffe90d 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -1828,7 +1828,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
+ 				cfg80211_rx_unexpected_4addr_frame(
+ 					rx->sdata->dev, sta->sta.addr,
+ 					GFP_ATOMIC);
+-			return RX_DROP_M_UNEXPECTED_4ADDR_FRAME;
++			return RX_DROP_MONITOR;
+ 		}
+ 		/*
+ 		 * Update counter and free packet here to avoid
+@@ -1963,7 +1963,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
+ 				cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
+ 							     skb->data,
+ 							     skb->len);
+-			return RX_DROP_M_BAD_BCN_KEYIDX;
++			return RX_DROP_MONITOR; /* unexpected BIP keyidx */
+ 		}
+ 
+ 		rx->key = ieee80211_rx_get_bigtk(rx, mmie_keyidx);
+@@ -1977,7 +1977,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
+ 
+ 		if (mmie_keyidx < NUM_DEFAULT_KEYS ||
+ 		    mmie_keyidx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
+-			return RX_DROP_M_BAD_MGMT_KEYIDX; /* unexpected BIP keyidx */
++			return RX_DROP_MONITOR; /* unexpected BIP keyidx */
+ 		if (rx->link_sta) {
+ 			if (ieee80211_is_group_privacy_action(skb) &&
+ 			    test_sta_flag(rx->sta, WLAN_STA_MFP))
+@@ -3981,8 +3981,7 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
+ }
+ 
+ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
+-					struct ieee80211_rate *rate,
+-					ieee80211_rx_result reason)
++					struct ieee80211_rate *rate)
+ {
+ 	struct ieee80211_sub_if_data *sdata;
+ 	struct ieee80211_local *local = rx->local;
+@@ -4046,38 +4045,42 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
+ 	}
+ 
+  out_free_skb:
+-	kfree_skb_reason(skb, (__force u32)reason);
++	dev_kfree_skb(skb);
+ }
+ 
+ static void ieee80211_rx_handlers_result(struct ieee80211_rx_data *rx,
+ 					 ieee80211_rx_result res)
+ {
+-	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
+-	struct ieee80211_supported_band *sband;
+-	struct ieee80211_rate *rate = NULL;
+-
+-	if (res == RX_QUEUED) {
+-		I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued);
+-		return;
+-	}
+-
+-	if (res != RX_CONTINUE) {
++	switch (res) {
++	case RX_DROP_MONITOR:
+ 		I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
+ 		if (rx->sta)
+ 			rx->link_sta->rx_stats.dropped++;
+-	}
++		fallthrough;
++	case RX_CONTINUE: {
++		struct ieee80211_rate *rate = NULL;
++		struct ieee80211_supported_band *sband;
++		struct ieee80211_rx_status *status;
+ 
+-	if (u32_get_bits((__force u32)res, SKB_DROP_REASON_SUBSYS_MASK) ==
+-			SKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE) {
+-		kfree_skb_reason(rx->skb, (__force u32)res);
+-		return;
+-	}
++		status = IEEE80211_SKB_RXCB((rx->skb));
+ 
+-	sband = rx->local->hw.wiphy->bands[status->band];
+-	if (status->encoding == RX_ENC_LEGACY)
+-		rate = &sband->bitrates[status->rate_idx];
++		sband = rx->local->hw.wiphy->bands[status->band];
++		if (status->encoding == RX_ENC_LEGACY)
++			rate = &sband->bitrates[status->rate_idx];
+ 
+-	ieee80211_rx_cooked_monitor(rx, rate, res);
++		ieee80211_rx_cooked_monitor(rx, rate);
++		break;
++		}
++	case RX_DROP_UNUSABLE:
++		I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
++		if (rx->sta)
++			rx->link_sta->rx_stats.dropped++;
++		dev_kfree_skb(rx->skb);
++		break;
++	case RX_QUEUED:
++		I802_DEBUG_INC(rx->sdata->local->rx_handlers_queued);
++		break;
++	}
+ }
+ 
+ static void ieee80211_rx_handlers(struct ieee80211_rx_data *rx,
+diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
+index 4133496..20f742b 100644
+--- a/net/mac80211/wpa.c
++++ b/net/mac80211/wpa.c
+@@ -550,7 +550,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
+ 		if (res < 0 ||
+ 		    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
+ 			key->u.ccmp.replays++;
+-			return RX_DROP_U_REPLAY;
++			return RX_DROP_UNUSABLE;
+ 		}
+ 
+ 		if (!(status->flag & RX_FLAG_DECRYPTED)) {
+@@ -564,7 +564,7 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
+ 				    skb->data + hdrlen + IEEE80211_CCMP_HDR_LEN,
+ 				    data_len,
+ 				    skb->data + skb->len - mic_len))
+-				return RX_DROP_U_MIC_FAIL;
++				return RX_DROP_UNUSABLE;
+ 		}
+ 
+ 		memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN);
+@@ -746,7 +746,7 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
+ 		if (res < 0 ||
+ 		    (!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
+ 			key->u.gcmp.replays++;
+-			return RX_DROP_U_REPLAY;
++			return RX_DROP_UNUSABLE;
+ 		}
+ 
+ 		if (!(status->flag & RX_FLAG_DECRYPTED)) {
+@@ -761,7 +761,7 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
+ 				    data_len,
+ 				    skb->data + skb->len -
+ 				    IEEE80211_GCMP_MIC_LEN))
+-				return RX_DROP_U_MIC_FAIL;
++				return RX_DROP_UNUSABLE;
+ 		}
+ 
+ 		memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN);
+@@ -930,13 +930,13 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
+ 		(skb->data + skb->len - sizeof(*mmie));
+ 	if (mmie->element_id != WLAN_EID_MMIE ||
+ 	    mmie->length != sizeof(*mmie) - 2)
+-		return RX_DROP_U_BAD_MMIE; /* Invalid MMIE */
++		return RX_DROP_UNUSABLE; /* Invalid MMIE */
+ 
+ 	bip_ipn_swap(ipn, mmie->sequence_number);
+ 
+ 	if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
+ 		key->u.aes_cmac.replays++;
+-		return RX_DROP_U_REPLAY;
++		return RX_DROP_UNUSABLE;
+ 	}
+ 
+ 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
+@@ -946,7 +946,7 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
+ 				   skb->data + 24, skb->len - 24, mic);
+ 		if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
+ 			key->u.aes_cmac.icverrors++;
+-			return RX_DROP_U_MIC_FAIL;
++			return RX_DROP_UNUSABLE;
+ 		}
+ 	}
+ 
+@@ -986,7 +986,7 @@ ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx)
+ 
+ 	if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
+ 		key->u.aes_cmac.replays++;
+-		return RX_DROP_U_REPLAY;
++		return RX_DROP_UNUSABLE;
+ 	}
+ 
+ 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
+@@ -996,7 +996,7 @@ ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx)
+ 				       skb->data + 24, skb->len - 24, mic);
+ 		if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
+ 			key->u.aes_cmac.icverrors++;
+-			return RX_DROP_U_MIC_FAIL;
++			return RX_DROP_UNUSABLE;
+ 		}
+ 	}
+ 
+@@ -1079,13 +1079,13 @@ ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
+ 		(skb->data + skb->len - sizeof(*mmie));
+ 	if (mmie->element_id != WLAN_EID_MMIE ||
+ 	    mmie->length != sizeof(*mmie) - 2)
+-		return RX_DROP_U_BAD_MMIE; /* Invalid MMIE */
++		return RX_DROP_UNUSABLE; /* Invalid MMIE */
+ 
+ 	bip_ipn_swap(ipn, mmie->sequence_number);
+ 
+ 	if (memcmp(ipn, key->u.aes_gmac.rx_pn, 6) <= 0) {
+ 		key->u.aes_gmac.replays++;
+-		return RX_DROP_U_REPLAY;
++		return RX_DROP_UNUSABLE;
+ 	}
+ 
+ 	if (!(status->flag & RX_FLAG_DECRYPTED)) {
+@@ -1104,7 +1104,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
+ 		    crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
+ 			key->u.aes_gmac.icverrors++;
+ 			kfree(mic);
+-			return RX_DROP_U_MIC_FAIL;
++			return RX_DROP_UNUSABLE;
+ 		}
+ 		kfree(mic);
+ 	}
+-- 
+2.39.2
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0002-mac80211-support-minimal-EHT-rate-reporting-on-RX.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0002-mac80211-support-minimal-EHT-rate-reporting-on-RX.patch
deleted file mode 100644
index c063f3e..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0002-mac80211-support-minimal-EHT-rate-reporting-on-RX.patch
+++ /dev/null
@@ -1,192 +0,0 @@
-From 2ff2e76bdbbbe8fa6923c274f276110f86acfb6a Mon Sep 17 00:00:00 2001
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 9 Jan 2023 13:07:21 +0200
-Subject: [PATCH 2/9] mac80211: support minimal EHT rate reporting on RX
-
-Add minimal support for RX EHT rate reporting, not yet
-adding (modifying) any radiotap headers, just statistics
-for cfg80211.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/mac80211.h  | 19 ++++++++++++++++---
- net/mac80211/rx.c       |  9 +++++++++
- net/mac80211/sta_info.c |  9 ++++++++-
- net/mac80211/sta_info.h | 24 ++++++++++++++++++------
- net/mac80211/util.c     | 13 +++++++++++++
- 5 files changed, 64 insertions(+), 10 deletions(-)
-
-diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 9c59eb8..3388cc7 100644
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1468,6 +1468,7 @@ enum mac80211_rx_encoding {
- 	RX_ENC_HT,
- 	RX_ENC_VHT,
- 	RX_ENC_HE,
-+	RX_ENC_EHT,
- };
- 
- /**
-@@ -1501,7 +1502,7 @@ enum mac80211_rx_encoding {
-  * @antenna: antenna used
-  * @rate_idx: index of data rate into band's supported rates or MCS index if
-  *	HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
-- * @nss: number of streams (VHT and HE only)
-+ * @nss: number of streams (VHT, HE and EHT only)
-  * @flag: %RX_FLAG_\*
-  * @encoding: &enum mac80211_rx_encoding
-  * @bw: &enum rate_info_bw
-@@ -1509,6 +1510,8 @@ enum mac80211_rx_encoding {
-  * @he_ru: HE RU, from &enum nl80211_he_ru_alloc
-  * @he_gi: HE GI, from &enum nl80211_he_gi
-  * @he_dcm: HE DCM value
-+ * @eht.ru: EHT RU, from &enum nl80211_eht_ru_alloc
-+ * @eht.gi: EHT GI, from &enum nl80211_eht_gi
-  * @rx_flags: internal RX flags for mac80211
-  * @ampdu_reference: A-MPDU reference number, must be a different value for
-  *	each A-MPDU but the same for each subframe within one A-MPDU
-@@ -1530,8 +1533,18 @@ struct ieee80211_rx_status {
- 	u32 flag;
- 	u16 freq: 13, freq_offset: 1;
- 	u8 enc_flags;
--	u8 encoding:2, bw:3, he_ru:3;
--	u8 he_gi:2, he_dcm:1;
-+	u8 encoding:3, bw:4;
-+	union {
-+		struct {
-+			u8 he_ru:3;
-+			u8 he_gi:2;
-+			u8 he_dcm:1;
-+		};
-+		struct {
-+			u8 ru:4;
-+			u8 gi:2;
-+		} eht;
-+	};
- 	u8 rate_idx;
- 	u8 nss;
- 	u8 rx_flags;
-diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
-index 46ae9e9..fadf2be 100644
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -5328,6 +5328,15 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
- 				      status->rate_idx, status->nss))
- 				goto drop;
- 			break;
-+		case RX_ENC_EHT:
-+			if (WARN_ONCE(status->rate_idx > 15 ||
-+				      !status->nss ||
-+				      status->nss > 8 ||
-+				      status->eht.gi > NL80211_RATE_INFO_EHT_GI_3_2,
-+				      "Rate marked as an EHT rate but data is invalid: MCS:%d, NSS:%d, GI:%d\n",
-+				      status->rate_idx, status->nss, status->eht.gi))
-+				goto drop;
-+			break;
- 		default:
- 			WARN_ON_ONCE(1);
- 			fallthrough;
-diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
-index a13a8fb..50daa22 100644
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -4,7 +4,7 @@
-  * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
-  * Copyright 2013-2014  Intel Mobile Communications GmbH
-  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
-- * Copyright (C) 2018-2021 Intel Corporation
-+ * Copyright (C) 2018-2022 Intel Corporation
-  */
- 
- #include <linux/module.h>
-@@ -2384,6 +2384,13 @@ static void sta_stats_decode_rate(struct ieee80211_local *local, u32 rate,
- 		rinfo->he_ru_alloc = STA_STATS_GET(HE_RU, rate);
- 		rinfo->he_dcm = STA_STATS_GET(HE_DCM, rate);
- 		break;
-+	case STA_STATS_RATE_TYPE_EHT:
-+		rinfo->flags = RATE_INFO_FLAGS_EHT_MCS;
-+		rinfo->mcs = STA_STATS_GET(EHT_MCS, rate);
-+		rinfo->nss = STA_STATS_GET(EHT_NSS, rate);
-+		rinfo->eht_gi = STA_STATS_GET(EHT_GI, rate);
-+		rinfo->eht_ru_alloc = STA_STATS_GET(EHT_RU, rate);
-+		break;
- 	}
- }
- 
-diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
-index 759a1a8..ec8dff0 100644
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -930,6 +930,7 @@ enum sta_stats_type {
- 	STA_STATS_RATE_TYPE_VHT,
- 	STA_STATS_RATE_TYPE_HE,
- 	STA_STATS_RATE_TYPE_S1G,
-+	STA_STATS_RATE_TYPE_EHT,
- };
- 
- #define STA_STATS_FIELD_HT_MCS		GENMASK( 7,  0)
-@@ -939,12 +940,16 @@ enum sta_stats_type {
- #define STA_STATS_FIELD_VHT_NSS		GENMASK( 7,  4)
- #define STA_STATS_FIELD_HE_MCS		GENMASK( 3,  0)
- #define STA_STATS_FIELD_HE_NSS		GENMASK( 7,  4)
--#define STA_STATS_FIELD_BW		GENMASK(11,  8)
--#define STA_STATS_FIELD_SGI		GENMASK(12, 12)
--#define STA_STATS_FIELD_TYPE		GENMASK(15, 13)
--#define STA_STATS_FIELD_HE_RU		GENMASK(18, 16)
--#define STA_STATS_FIELD_HE_GI		GENMASK(20, 19)
--#define STA_STATS_FIELD_HE_DCM		GENMASK(21, 21)
-+#define STA_STATS_FIELD_EHT_MCS		GENMASK( 3,  0)
-+#define STA_STATS_FIELD_EHT_NSS		GENMASK( 7,  4)
-+#define STA_STATS_FIELD_BW		GENMASK(12,  8)
-+#define STA_STATS_FIELD_SGI		GENMASK(13, 13)
-+#define STA_STATS_FIELD_TYPE		GENMASK(16, 14)
-+#define STA_STATS_FIELD_HE_RU		GENMASK(19, 17)
-+#define STA_STATS_FIELD_HE_GI		GENMASK(21, 20)
-+#define STA_STATS_FIELD_HE_DCM		GENMASK(22, 22)
-+#define STA_STATS_FIELD_EHT_RU		GENMASK(20, 17)
-+#define STA_STATS_FIELD_EHT_GI		GENMASK(22, 21)
- 
- #define STA_STATS_FIELD(_n, _v)		FIELD_PREP(STA_STATS_FIELD_ ## _n, _v)
- #define STA_STATS_GET(_n, _v)		FIELD_GET(STA_STATS_FIELD_ ## _n, _v)
-@@ -983,6 +988,13 @@ static inline u32 sta_stats_encode_rate(struct ieee80211_rx_status *s)
- 		r |= STA_STATS_FIELD(HE_RU, s->he_ru);
- 		r |= STA_STATS_FIELD(HE_DCM, s->he_dcm);
- 		break;
-+	case RX_ENC_EHT:
-+		r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_EHT);
-+		r |= STA_STATS_FIELD(EHT_NSS, s->nss);
-+		r |= STA_STATS_FIELD(EHT_MCS, s->rate_idx);
-+		r |= STA_STATS_FIELD(EHT_GI, s->eht.gi);
-+		r |= STA_STATS_FIELD(EHT_RU, s->eht.ru);
-+		break;
- 	default:
- 		WARN_ON(1);
- 		return STA_STATS_RATE_INVALID;
-diff --git a/net/mac80211/util.c b/net/mac80211/util.c
-index 83f6c56..5a6c091 100644
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -3900,6 +3900,19 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
- 
- 	/* Fill cfg80211 rate info */
- 	switch (status->encoding) {
-+	case RX_ENC_EHT:
-+		ri.flags |= RATE_INFO_FLAGS_EHT_MCS;
-+		ri.mcs = status->rate_idx;
-+		ri.nss = status->nss;
-+		ri.eht_ru_alloc = status->eht.ru;
-+		if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
-+			ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
-+		/* TODO/FIXME: is this right? handle other PPDUs */
-+		if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
-+			mpdu_offset += 2;
-+			ts += 36;
-+		}
-+		break;
- 	case RX_ENC_HE:
- 		ri.flags |= RATE_INFO_FLAGS_HE_MCS;
- 		ri.mcs = status->rate_idx;
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0003-cfg80211-Update-Transition-Disable-policy-during-por.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0003-cfg80211-Update-Transition-Disable-policy-during-por.patch
deleted file mode 100644
index a3f6dda..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0003-cfg80211-Update-Transition-Disable-policy-during-por.patch
+++ /dev/null
@@ -1,208 +0,0 @@
-From e0756f54dea42f1833e40ddfb0deb5d0b8e6dda4 Mon Sep 17 00:00:00 2001
-From: Vinayak Yadawad <vinayak.yadawad@broadcom.com>
-Date: Wed, 7 Sep 2022 18:14:48 +0530
-Subject: [PATCH 3/9] cfg80211: Update Transition Disable policy during port
- authorization
-
-In case of 4way handshake offload, transition disable policy
-updated by the AP during EAPOL 3/4 is not updated to the upper layer.
-This results in mismatch between transition disable policy
-between the upper layer and the driver. This patch addresses this
-issue by updating transition disable policy as part of port
-authorization indication.
-
-Signed-off-by: Vinayak Yadawad <vinayak.yadawad@broadcom.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c  |  2 +-
- include/net/cfg80211.h                               |  4 +++-
- include/uapi/linux/nl80211.h                         |  3 +++
- net/wireless/core.h                                  |  5 ++++-
- net/wireless/nl80211.c                               |  8 +++++++-
- net/wireless/nl80211.h                               |  3 ++-
- net/wireless/sme.c                                   | 12 ++++++++----
- net/wireless/util.c                                  |  4 +++-
- 8 files changed, 31 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-index ea8409e..bddc0af 100644
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -6005,7 +6005,7 @@ done:
- 	brcmf_dbg(CONN, "Report roaming result\n");
- 
- 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
--		cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
-+		cfg80211_port_authorized(ndev, profile->bssid, NULL, 0, GFP_KERNEL);
- 		brcmf_dbg(CONN, "Report port authorized\n");
- 	}
- 
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 803949b..9420086 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -7717,6 +7717,8 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
-  *
-  * @dev: network device
-  * @bssid: the BSSID of the AP
-+ * @td_bitmap: transition disable policy
-+ * @td_bitmap_len: Length of transition disable policy
-  * @gfp: allocation flags
-  *
-  * This function should be called by a driver that supports 4 way handshake
-@@ -7727,7 +7729,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
-  * indicate the 802.11 association.
-  */
- void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
--			      gfp_t gfp);
-+			      const u8* td_bitmap, u8 td_bitmap_len, gfp_t gfp);
- 
- /**
-  * cfg80211_disconnected - notify cfg80211 that connection was dropped
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index c32e761..c14a91b 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -2749,6 +2749,8 @@ enum nl80211_commands {
-  *	When used with %NL80211_CMD_FRAME_TX_STATUS, indicates the ack RX
-  *	timestamp. When used with %NL80211_CMD_FRAME RX notification, indicates
-  *	the incoming frame RX timestamp.
-+ * @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent
-+ *	(re)associations.
-  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -3276,6 +3278,7 @@ enum nl80211_attrs {
- 
- 	NL80211_ATTR_TX_HW_TIMESTAMP,
- 	NL80211_ATTR_RX_HW_TIMESTAMP,
-+	NL80211_ATTR_TD_BITMAP,
- 
- 	/* add attributes here, update the policy in nl80211.c */
- 
-diff --git a/net/wireless/core.h b/net/wireless/core.h
-index f4d3b83..382455c 100644
---- a/net/wireless/core.h
-+++ b/net/wireless/core.h
-@@ -271,6 +271,8 @@ struct cfg80211_event {
- 		} ij;
- 		struct {
- 			u8 bssid[ETH_ALEN];
-+			const u8 *td_bitmap;
-+			u8 td_bitmap_len;
- 		} pa;
- 	};
- };
-@@ -409,7 +411,8 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
- 			bool wextev);
- void __cfg80211_roamed(struct wireless_dev *wdev,
- 		       struct cfg80211_roam_info *info);
--void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid);
-+void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid,
-+				const u8 *td_bitmap, u8 td_bitmap_len);
- int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
- 			      struct wireless_dev *wdev);
- void cfg80211_autodisconnect_wk(struct work_struct *work);
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 777c141..6a97e52 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -17936,7 +17936,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
- }
- 
- void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
--				  struct net_device *netdev, const u8 *bssid)
-+				  struct net_device *netdev, const u8 *bssid,
-+				  const u8 *td_bitmap, u8 td_bitmap_len)
- {
- 	struct sk_buff *msg;
- 	void *hdr;
-@@ -17956,6 +17957,11 @@ void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
- 	    nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
- 		goto nla_put_failure;
- 
-+	if ((td_bitmap_len > 0) && td_bitmap)
-+		if (nla_put(msg, NL80211_ATTR_TD_BITMAP,
-+			    td_bitmap_len, td_bitmap))
-+			goto nla_put_failure;
-+
- 	genlmsg_end(msg, hdr);
- 
- 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
-diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
-index 855d540..ba9457e 100644
---- a/net/wireless/nl80211.h
-+++ b/net/wireless/nl80211.h
-@@ -83,7 +83,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
- 			 struct net_device *netdev,
- 			 struct cfg80211_roam_info *info, gfp_t gfp);
- void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
--				  struct net_device *netdev, const u8 *bssid);
-+				  struct net_device *netdev, const u8 *bssid,
-+				  const u8 *td_bitmap, u8 td_bitmap_len);
- void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
- 			       struct net_device *netdev, u16 reason,
- 			       const u8 *ie, size_t ie_len, bool from_ap);
-diff --git a/net/wireless/sme.c b/net/wireless/sme.c
-index 05e4f29..1ee4408 100644
---- a/net/wireless/sme.c
-+++ b/net/wireless/sme.c
-@@ -1266,7 +1266,8 @@ out:
- }
- EXPORT_SYMBOL(cfg80211_roamed);
- 
--void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid)
-+void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid,
-+					const u8 *td_bitmap, u8 td_bitmap_len)
- {
- 	ASSERT_WDEV_LOCK(wdev);
- 
-@@ -1279,11 +1280,11 @@ void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid)
- 		return;
- 
- 	nl80211_send_port_authorized(wiphy_to_rdev(wdev->wiphy), wdev->netdev,
--				     bssid);
-+				     bssid, td_bitmap, td_bitmap_len);
- }
- 
- void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
--			      gfp_t gfp)
-+			      const u8 *td_bitmap, u8 td_bitmap_len, gfp_t gfp)
- {
- 	struct wireless_dev *wdev = dev->ieee80211_ptr;
- 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
-@@ -1293,12 +1294,15 @@ void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
- 	if (WARN_ON(!bssid))
- 		return;
- 
--	ev = kzalloc(sizeof(*ev), gfp);
-+	ev = kzalloc(sizeof(*ev) + td_bitmap_len, gfp);
- 	if (!ev)
- 		return;
- 
- 	ev->type = EVENT_PORT_AUTHORIZED;
- 	memcpy(ev->pa.bssid, bssid, ETH_ALEN);
-+	ev->pa.td_bitmap = ((u8 *)ev) + sizeof(*ev);
-+	ev->pa.td_bitmap_len = td_bitmap_len;
-+	memcpy((void *)ev->pa.td_bitmap, td_bitmap, td_bitmap_len);
- 
- 	/*
- 	 * Use the wdev event list so that if there are pending
-diff --git a/net/wireless/util.c b/net/wireless/util.c
-index 769f8fe..fdc140e 100644
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -1057,7 +1057,9 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
- 			__cfg80211_leave(wiphy_to_rdev(wdev->wiphy), wdev);
- 			break;
- 		case EVENT_PORT_AUTHORIZED:
--			__cfg80211_port_authorized(wdev, ev->pa.bssid);
-+			__cfg80211_port_authorized(wdev, ev->pa.bssid,
-+						   ev->pa.td_bitmap,
-+						   ev->pa.td_bitmap_len);
- 			break;
- 		}
- 		wdev_unlock(wdev);
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0004-wifi-mac80211-mlme-handle-EHT-channel-puncturing.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0004-wifi-mac80211-mlme-handle-EHT-channel-puncturing.patch
deleted file mode 100644
index d455dd0..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0004-wifi-mac80211-mlme-handle-EHT-channel-puncturing.patch
+++ /dev/null
@@ -1,400 +0,0 @@
-From 67ce530e39e0372f11006c5695f682e71152f7b7 Mon Sep 17 00:00:00 2001
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Fri, 27 Jan 2023 12:39:31 +0100
-Subject: [PATCH 4/9] wifi: mac80211: mlme: handle EHT channel puncturing
-
-Handle the Puncturing info received from the AP in the
-EHT Operation element in beacons.
-
-If the info is invalid:
- - during association: disable EHT connection for the AP
- - after association: disconnect
-
-This commit includes many (internal) bugfixes and spec
-updates various people.
-
-Co-developed-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
-Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
-Link: https://lore.kernel.org/r/20230127123930.4fbc74582331.I3547481d49f958389f59dfeba3fcc75e72b0aa6e@changeid
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/mac80211.h     |   5 +-
- net/mac80211/cfg.c         |   2 +-
- net/mac80211/chan.c        |   2 +-
- net/mac80211/ieee80211_i.h |   2 +-
- net/mac80211/mlme.c        | 224 ++++++++++++++++++++++++++++++++++++-
- 5 files changed, 228 insertions(+), 7 deletions(-)
-
-diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 3388cc7..8fb38c9 100644
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -340,7 +340,7 @@ struct ieee80211_vif_chanctx_switch {
-  * @BSS_CHANGED_FILS_DISCOVERY: FILS discovery status changed.
-  * @BSS_CHANGED_UNSOL_BCAST_PROBE_RESP: Unsolicited broadcast probe response
-  *	status changed.
-- *
-+ * @BSS_CHANGED_EHT_PUNCTURING: The channel puncturing bitmap changed.
-  */
- enum ieee80211_bss_change {
- 	BSS_CHANGED_ASSOC		= 1<<0,
-@@ -375,6 +375,7 @@ enum ieee80211_bss_change {
- 	BSS_CHANGED_HE_BSS_COLOR	= 1<<29,
- 	BSS_CHANGED_FILS_DISCOVERY      = 1<<30,
- 	BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = 1<<31,
-+	BSS_CHANGED_EHT_PUNCTURING	= BIT_ULL(32),
- 
- 	/* when adding here, make sure to change ieee80211_reconfig */
- };
-@@ -640,6 +641,7 @@ struct ieee80211_fils_discovery {
-  * @tx_pwr_env_num: number of @tx_pwr_env.
-  * @pwr_reduction: power constraint of BSS.
-  * @eht_support: does this BSS support EHT
-+ * @eht_puncturing: bitmap to indicate which channels are punctured in this BSS
-  * @csa_active: marks whether a channel switch is going on. Internally it is
-  *	write-protected by sdata_lock and local->mtx so holding either is fine
-  *	for read access.
-@@ -739,6 +741,7 @@ struct ieee80211_bss_conf {
- 	u8 tx_pwr_env_num;
- 	u8 pwr_reduction;
- 	bool eht_support;
-+	u16 eht_puncturing;
- 
- 	bool csa_active;
- 	bool mu_mimo_owner;
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 7a5e459..5bb43de 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -4181,7 +4181,7 @@ static int ieee80211_set_ap_chanwidth(struct wiphy *wiphy,
- 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
- 	struct ieee80211_link_data *link;
- 	int ret;
--	u32 changed = 0;
-+	u64 changed = 0;
- 
- 	link = sdata_dereference(sdata->link[link_id], sdata);
- 
-diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
-index e72cf07..dbc34fb 100644
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -1916,7 +1916,7 @@ int ieee80211_link_use_reserved_context(struct ieee80211_link_data *link)
- 
- int ieee80211_link_change_bandwidth(struct ieee80211_link_data *link,
- 				    const struct cfg80211_chan_def *chandef,
--				    u32 *changed)
-+				    u64 *changed)
- {
- 	struct ieee80211_sub_if_data *sdata = link->sdata;
- 	struct ieee80211_bss_conf *link_conf = link->conf;
-diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
-index a4fab9a..04128d5 100644
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2487,7 +2487,7 @@ int ieee80211_link_unreserve_chanctx(struct ieee80211_link_data *link);
- int __must_check
- ieee80211_link_change_bandwidth(struct ieee80211_link_data *link,
- 				const struct cfg80211_chan_def *chandef,
--				u32 *changed);
-+				u64 *changed);
- void ieee80211_link_release_channel(struct ieee80211_link_data *link);
- void ieee80211_link_vlan_copy_chanctx(struct ieee80211_link_data *link);
- void ieee80211_link_copy_chanctx_to_vlans(struct ieee80211_link_data *link,
-diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index 0125b3e..8c69fd6 100644
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -8,7 +8,7 @@
-  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
-  * Copyright 2013-2014  Intel Mobile Communications GmbH
-  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
-- * Copyright (C) 2018 - 2022 Intel Corporation
-+ * Copyright (C) 2018 - 2023 Intel Corporation
-  */
- 
- #include <linux/delay.h>
-@@ -88,6 +88,141 @@ MODULE_PARM_DESC(probe_wait_ms,
-  */
- #define IEEE80211_SIGNAL_AVE_MIN_COUNT	4
- 
-+struct ieee80211_per_bw_puncturing_values {
-+	u8 len;
-+	const u16 *valid_values;
-+};
-+
-+static const u16 puncturing_values_80mhz[] = {
-+	0x8, 0x4, 0x2, 0x1
-+};
-+
-+static const u16 puncturing_values_160mhz[] = {
-+	 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0xc0, 0x30, 0xc, 0x3
-+};
-+
-+static const u16 puncturing_values_320mhz[] = {
-+	0xc000, 0x3000, 0xc00, 0x300, 0xc0, 0x30, 0xc, 0x3, 0xf000, 0xf00,
-+	0xf0, 0xf, 0xfc00, 0xf300, 0xf0c0, 0xf030, 0xf00c, 0xf003, 0xc00f,
-+	0x300f, 0xc0f, 0x30f, 0xcf, 0x3f
-+};
-+
-+#define IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(_bw) \
-+	{ \
-+		.len = ARRAY_SIZE(puncturing_values_ ## _bw ## mhz), \
-+		.valid_values = puncturing_values_ ## _bw ## mhz \
-+	}
-+
-+static const struct ieee80211_per_bw_puncturing_values per_bw_puncturing[] = {
-+	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(80),
-+	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(160),
-+	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(320)
-+};
-+
-+static bool ieee80211_valid_disable_subchannel_bitmap(u16 *bitmap,
-+						      enum nl80211_chan_width bw)
-+{
-+	u32 idx, i;
-+
-+	switch (bw) {
-+	case NL80211_CHAN_WIDTH_80:
-+		idx = 0;
-+		break;
-+	case NL80211_CHAN_WIDTH_160:
-+		idx = 1;
-+		break;
-+	case NL80211_CHAN_WIDTH_320:
-+		idx = 2;
-+		break;
-+	default:
-+		*bitmap = 0;
-+		break;
-+	}
-+
-+	if (!*bitmap)
-+		return true;
-+
-+	for (i = 0; i < per_bw_puncturing[idx].len; i++)
-+		if (per_bw_puncturing[idx].valid_values[i] == *bitmap)
-+			return true;
-+
-+	return false;
-+}
-+
-+/*
-+ * Extract from the given disabled subchannel bitmap (raw format
-+ * from the EHT Operation Element) the bits for the subchannel
-+ * we're using right now.
-+ */
-+static u16
-+ieee80211_extract_dis_subch_bmap(const struct ieee80211_eht_operation *eht_oper,
-+				 struct cfg80211_chan_def *chandef, u16 bitmap)
-+{
-+	struct ieee80211_eht_operation_info *info = (void *)eht_oper->optional;
-+	struct cfg80211_chan_def ap_chandef = *chandef;
-+	u32 ap_center_freq, local_center_freq;
-+	u32 ap_bw, local_bw;
-+	int ap_start_freq, local_start_freq;
-+	u16 shift, mask;
-+
-+	if (!(eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) ||
-+	    !(eht_oper->params &
-+	      IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT))
-+		return 0;
-+
-+	/* set 160/320 supported to get the full AP definition */
-+	ieee80211_chandef_eht_oper(eht_oper, true, true, &ap_chandef);
-+	ap_center_freq = ap_chandef.center_freq1;
-+	ap_bw = 20 * BIT(u8_get_bits(info->control,
-+				     IEEE80211_EHT_OPER_CHAN_WIDTH));
-+	ap_start_freq = ap_center_freq - ap_bw / 2;
-+	local_center_freq = chandef->center_freq1;
-+	local_bw = 20 * BIT(ieee80211_chan_width_to_rx_bw(chandef->width));
-+	local_start_freq = local_center_freq - local_bw / 2;
-+	shift = (local_start_freq - ap_start_freq) / 20;
-+	mask = BIT(local_bw / 20) - 1;
-+
-+	return (bitmap >> shift) & mask;
-+}
-+
-+/*
-+ * Handle the puncturing bitmap, possibly downgrading bandwidth to get a
-+ * valid bitmap.
-+ */
-+static void
-+ieee80211_handle_puncturing_bitmap(struct ieee80211_link_data *link,
-+				   const struct ieee80211_eht_operation *eht_oper,
-+				   u16 bitmap, u64 *changed)
-+{
-+	struct cfg80211_chan_def *chandef = &link->conf->chandef;
-+	u16 extracted;
-+	u64 _changed = 0;
-+
-+	if (!changed)
-+		changed = &_changed;
-+
-+	while (chandef->width > NL80211_CHAN_WIDTH_40) {
-+		extracted =
-+			ieee80211_extract_dis_subch_bmap(eht_oper, chandef,
-+							 bitmap);
-+
-+		if (ieee80211_valid_disable_subchannel_bitmap(&bitmap,
-+							      chandef->width))
-+			break;
-+		link->u.mgd.conn_flags |=
-+			ieee80211_chandef_downgrade(chandef);
-+		*changed |= BSS_CHANGED_BANDWIDTH;
-+	}
-+
-+	if (chandef->width <= NL80211_CHAN_WIDTH_40)
-+		extracted = 0;
-+
-+	if (link->conf->eht_puncturing != extracted) {
-+		link->conf->eht_puncturing = extracted;
-+		*changed |= BSS_CHANGED_EHT_PUNCTURING;
-+	}
-+}
-+
- /*
-  * We can have multiple work items (and connection probing)
-  * scheduling this timer, but we need to take care to only
-@@ -413,7 +548,7 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link,
- 			       const struct ieee80211_he_operation *he_oper,
- 			       const struct ieee80211_eht_operation *eht_oper,
- 			       const struct ieee80211_s1g_oper_ie *s1g_oper,
--			       const u8 *bssid, u32 *changed)
-+			       const u8 *bssid, u64 *changed)
- {
- 	struct ieee80211_sub_if_data *sdata = link->sdata;
- 	struct ieee80211_local *local = sdata->local;
-@@ -4111,6 +4246,7 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
- 							    link_sta);
- 
- 			bss_conf->eht_support = link_sta->pub->eht_cap.has_eht;
-+			*changed |= BSS_CHANGED_EHT_PUNCTURING;
- 		} else {
- 			bss_conf->eht_support = false;
- 		}
-@@ -5423,6 +5559,45 @@ static bool ieee80211_rx_our_beacon(const u8 *tx_bssid,
- 	return ether_addr_equal(tx_bssid, bss->transmitted_bss->bssid);
- }
- 
-+static bool ieee80211_config_puncturing(struct ieee80211_link_data *link,
-+					const struct ieee80211_eht_operation *eht_oper,
-+					u64 *changed)
-+{
-+	u16 bitmap = 0, extracted;
-+
-+	if ((eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) &&
-+	    (eht_oper->params &
-+	     IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT)) {
-+		const struct ieee80211_eht_operation_info *info =
-+			(void *)eht_oper->optional;
-+		const u8 *disable_subchannel_bitmap = info->optional;
-+
-+		bitmap = get_unaligned_le16(disable_subchannel_bitmap);
-+	}
-+
-+	extracted = ieee80211_extract_dis_subch_bmap(eht_oper,
-+						     &link->conf->chandef,
-+						     bitmap);
-+
-+	/* accept if there are no changes */
-+	if (!(*changed & BSS_CHANGED_BANDWIDTH) &&
-+	    extracted == link->conf->eht_puncturing)
-+		return true;
-+
-+	if (!ieee80211_valid_disable_subchannel_bitmap(&bitmap,
-+						       link->conf->chandef.width)) {
-+		link_info(link,
-+			  "Got an invalid disable subchannel bitmap from AP %pM: bitmap = 0x%x, bw = 0x%x. disconnect\n",
-+			  link->u.mgd.bssid,
-+			  bitmap,
-+			  link->conf->chandef.width);
-+		return false;
-+	}
-+
-+	ieee80211_handle_puncturing_bitmap(link, eht_oper, bitmap, changed);
-+	return true;
-+}
-+
- static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
- 				     struct ieee80211_hdr *hdr, size_t len,
- 				     struct ieee80211_rx_status *rx_status)
-@@ -5439,7 +5614,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
- 	struct ieee80211_channel *chan;
- 	struct link_sta_info *link_sta;
- 	struct sta_info *sta;
--	u32 changed = 0;
-+	u64 changed = 0;
- 	bool erp_valid;
- 	u8 erp_value = 0;
- 	u32 ncrc = 0;
-@@ -5731,6 +5906,21 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
- 					       elems->pwr_constr_elem,
- 					       elems->cisco_dtpc_elem);
- 
-+	if (elems->eht_operation &&
-+	    !(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_EHT)) {
-+		if (!ieee80211_config_puncturing(link, elems->eht_operation,
-+						 &changed)) {
-+			ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
-+					       WLAN_REASON_DEAUTH_LEAVING,
-+					       true, deauth_buf);
-+			ieee80211_report_disconnect(sdata, deauth_buf,
-+						    sizeof(deauth_buf), true,
-+						    WLAN_REASON_DEAUTH_LEAVING,
-+						    false);
-+			goto free;
-+		}
-+	}
-+
- 	ieee80211_link_info_change_notify(sdata, link, changed);
- free:
- 	kfree(elems);
-@@ -6832,9 +7022,12 @@ ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,
- 		ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
- 	}
- 
-+	link->conf->eht_puncturing = 0;
-+
- 	rcu_read_lock();
- 	beacon_ies = rcu_dereference(cbss->beacon_ies);
- 	if (beacon_ies) {
-+		const struct ieee80211_eht_operation *eht_oper;
- 		const struct element *elem;
- 		u8 dtim_count = 0;
- 
-@@ -6863,6 +7056,31 @@ ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,
- 			link->conf->ema_ap = true;
- 		else
- 			link->conf->ema_ap = false;
-+
-+		elem = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION,
-+					      beacon_ies->data, beacon_ies->len);
-+		eht_oper = (const void *)(elem->data + 1);
-+
-+		if (elem &&
-+		    ieee80211_eht_oper_size_ok((const void *)(elem->data + 1),
-+					       elem->datalen - 1) &&
-+		    (eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) &&
-+		    (eht_oper->params & IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT)) {
-+			const struct ieee80211_eht_operation_info *info =
-+				(void *)eht_oper->optional;
-+			const u8 *disable_subchannel_bitmap = info->optional;
-+			u16 bitmap;
-+
-+			bitmap = get_unaligned_le16(disable_subchannel_bitmap);
-+			if (ieee80211_valid_disable_subchannel_bitmap(&bitmap,
-+								      link->conf->chandef.width))
-+				ieee80211_handle_puncturing_bitmap(link,
-+								   eht_oper,
-+								   bitmap,
-+								   NULL);
-+			else
-+				conn_flags |= IEEE80211_CONN_DISABLE_EHT;
-+		}
- 	}
- 	rcu_read_unlock();
- 
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0005-wifi-cfg80211-move-puncturing-bitmap-validation-from.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0005-wifi-cfg80211-move-puncturing-bitmap-validation-from.patch
deleted file mode 100644
index 2a7cd07..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0005-wifi-cfg80211-move-puncturing-bitmap-validation-from.patch
+++ /dev/null
@@ -1,228 +0,0 @@
-From 40e52a97b1bc7b280198cb63e11663d784bd48c8 Mon Sep 17 00:00:00 2001
-From: Aloka Dixit <quic_alokad@quicinc.com>
-Date: Mon, 30 Jan 2023 16:12:24 -0800
-Subject: [PATCH 5/9] wifi: cfg80211: move puncturing bitmap validation from
- mac80211
-
-- Move ieee80211_valid_disable_subchannel_bitmap() from mlme.c to
-  chan.c, rename it as cfg80211_valid_disable_subchannel_bitmap()
-  and export it.
-- Modify the prototype to include struct cfg80211_chan_def instead
-  of only bandwidth to support a check which returns false if the
-  primary channel is punctured.
-
-Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
-Link: https://lore.kernel.org/r/20230131001227.25014-2-quic_alokad@quicinc.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/cfg80211.h | 12 +++++++
- net/mac80211/mlme.c    | 73 ++++--------------------------------------
- net/wireless/chan.c    | 69 +++++++++++++++++++++++++++++++++++++++
- 3 files changed, 87 insertions(+), 67 deletions(-)
-
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 9420086..d532612 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -8948,4 +8948,16 @@ static inline int cfg80211_color_change_notify(struct net_device *dev)
- 					 0, 0);
- }
- 
-+/**
-+ * cfg80211_valid_disable_subchannel_bitmap - validate puncturing bitmap
-+ * @bitmap: bitmap to be validated
-+ * @chandef: channel definition
-+ *
-+ * Validate the puncturing bitmap.
-+ *
-+ * Return: %true if the bitmap is valid. %false otherwise.
-+ */
-+bool cfg80211_valid_disable_subchannel_bitmap(u16 *bitmap,
-+					      const struct cfg80211_chan_def *chandef);
-+
- #endif /* __NET_CFG80211_H */
-diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index 8c69fd6..2716ae0 100644
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -88,67 +88,6 @@ MODULE_PARM_DESC(probe_wait_ms,
-  */
- #define IEEE80211_SIGNAL_AVE_MIN_COUNT	4
- 
--struct ieee80211_per_bw_puncturing_values {
--	u8 len;
--	const u16 *valid_values;
--};
--
--static const u16 puncturing_values_80mhz[] = {
--	0x8, 0x4, 0x2, 0x1
--};
--
--static const u16 puncturing_values_160mhz[] = {
--	 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0xc0, 0x30, 0xc, 0x3
--};
--
--static const u16 puncturing_values_320mhz[] = {
--	0xc000, 0x3000, 0xc00, 0x300, 0xc0, 0x30, 0xc, 0x3, 0xf000, 0xf00,
--	0xf0, 0xf, 0xfc00, 0xf300, 0xf0c0, 0xf030, 0xf00c, 0xf003, 0xc00f,
--	0x300f, 0xc0f, 0x30f, 0xcf, 0x3f
--};
--
--#define IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(_bw) \
--	{ \
--		.len = ARRAY_SIZE(puncturing_values_ ## _bw ## mhz), \
--		.valid_values = puncturing_values_ ## _bw ## mhz \
--	}
--
--static const struct ieee80211_per_bw_puncturing_values per_bw_puncturing[] = {
--	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(80),
--	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(160),
--	IEEE80211_PER_BW_VALID_PUNCTURING_VALUES(320)
--};
--
--static bool ieee80211_valid_disable_subchannel_bitmap(u16 *bitmap,
--						      enum nl80211_chan_width bw)
--{
--	u32 idx, i;
--
--	switch (bw) {
--	case NL80211_CHAN_WIDTH_80:
--		idx = 0;
--		break;
--	case NL80211_CHAN_WIDTH_160:
--		idx = 1;
--		break;
--	case NL80211_CHAN_WIDTH_320:
--		idx = 2;
--		break;
--	default:
--		*bitmap = 0;
--		break;
--	}
--
--	if (!*bitmap)
--		return true;
--
--	for (i = 0; i < per_bw_puncturing[idx].len; i++)
--		if (per_bw_puncturing[idx].valid_values[i] == *bitmap)
--			return true;
--
--	return false;
--}
--
- /*
-  * Extract from the given disabled subchannel bitmap (raw format
-  * from the EHT Operation Element) the bits for the subchannel
-@@ -206,8 +145,8 @@ ieee80211_handle_puncturing_bitmap(struct ieee80211_link_data *link,
- 			ieee80211_extract_dis_subch_bmap(eht_oper, chandef,
- 							 bitmap);
- 
--		if (ieee80211_valid_disable_subchannel_bitmap(&bitmap,
--							      chandef->width))
-+		if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
-+							     chandef))
- 			break;
- 		link->u.mgd.conn_flags |=
- 			ieee80211_chandef_downgrade(chandef);
-@@ -5584,8 +5523,8 @@ static bool ieee80211_config_puncturing(struct ieee80211_link_data *link,
- 	    extracted == link->conf->eht_puncturing)
- 		return true;
- 
--	if (!ieee80211_valid_disable_subchannel_bitmap(&bitmap,
--						       link->conf->chandef.width)) {
-+	if (!cfg80211_valid_disable_subchannel_bitmap(&bitmap,
-+						      &link->conf->chandef)) {
- 		link_info(link,
- 			  "Got an invalid disable subchannel bitmap from AP %pM: bitmap = 0x%x, bw = 0x%x. disconnect\n",
- 			  link->u.mgd.bssid,
-@@ -7072,8 +7011,8 @@ ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,
- 			u16 bitmap;
- 
- 			bitmap = get_unaligned_le16(disable_subchannel_bitmap);
--			if (ieee80211_valid_disable_subchannel_bitmap(&bitmap,
--								      link->conf->chandef.width))
-+			if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
-+								     &link->conf->chandef))
- 				ieee80211_handle_puncturing_bitmap(link,
- 								   eht_oper,
- 								   bitmap,
-diff --git a/net/wireless/chan.c b/net/wireless/chan.c
-index 29b5c2f..d5ed976 100644
---- a/net/wireless/chan.c
-+++ b/net/wireless/chan.c
-@@ -1460,3 +1460,72 @@ struct cfg80211_chan_def *wdev_chandef(struct wireless_dev *wdev,
- 	}
- }
- EXPORT_SYMBOL(wdev_chandef);
-+
-+struct cfg80211_per_bw_puncturing_values {
-+	u8 len;
-+	const u16 *valid_values;
-+};
-+
-+static const u16 puncturing_values_80mhz[] = {
-+	0x8, 0x4, 0x2, 0x1
-+};
-+
-+static const u16 puncturing_values_160mhz[] = {
-+	 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1, 0xc0, 0x30, 0xc, 0x3
-+};
-+
-+static const u16 puncturing_values_320mhz[] = {
-+	0xc000, 0x3000, 0xc00, 0x300, 0xc0, 0x30, 0xc, 0x3, 0xf000, 0xf00,
-+	0xf0, 0xf, 0xfc00, 0xf300, 0xf0c0, 0xf030, 0xf00c, 0xf003, 0xc00f,
-+	0x300f, 0xc0f, 0x30f, 0xcf, 0x3f
-+};
-+
-+#define CFG80211_PER_BW_VALID_PUNCTURING_VALUES(_bw) \
-+	{ \
-+		.len = ARRAY_SIZE(puncturing_values_ ## _bw ## mhz), \
-+		.valid_values = puncturing_values_ ## _bw ## mhz \
-+	}
-+
-+static const struct cfg80211_per_bw_puncturing_values per_bw_puncturing[] = {
-+	CFG80211_PER_BW_VALID_PUNCTURING_VALUES(80),
-+	CFG80211_PER_BW_VALID_PUNCTURING_VALUES(160),
-+	CFG80211_PER_BW_VALID_PUNCTURING_VALUES(320)
-+};
-+
-+bool cfg80211_valid_disable_subchannel_bitmap(u16 *bitmap,
-+					      const struct cfg80211_chan_def *chandef)
-+{
-+	u32 idx, i, start_freq;
-+
-+	switch (chandef->width) {
-+	case NL80211_CHAN_WIDTH_80:
-+		idx = 0;
-+		start_freq = chandef->center_freq1 - 40;
-+		break;
-+	case NL80211_CHAN_WIDTH_160:
-+		idx = 1;
-+		start_freq = chandef->center_freq1 - 80;
-+		break;
-+	case NL80211_CHAN_WIDTH_320:
-+		idx = 2;
-+		start_freq = chandef->center_freq1 - 160;
-+		break;
-+	default:
-+		*bitmap = 0;
-+		break;
-+	}
-+
-+	if (!*bitmap)
-+		return true;
-+
-+	/* check if primary channel is punctured */
-+	if (*bitmap & (u16)BIT((chandef->chan->center_freq - start_freq) / 20))
-+		return false;
-+
-+	for (i = 0; i < per_bw_puncturing[idx].len; i++)
-+		if (per_bw_puncturing[idx].valid_values[i] == *bitmap)
-+			return true;
-+
-+	return false;
-+}
-+EXPORT_SYMBOL(cfg80211_valid_disable_subchannel_bitmap);
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0006-wifi-nl80211-validate-and-configure-puncturing-bitma.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0006-wifi-nl80211-validate-and-configure-puncturing-bitma.patch
deleted file mode 100644
index 75fe1bb..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0006-wifi-nl80211-validate-and-configure-puncturing-bitma.patch
+++ /dev/null
@@ -1,178 +0,0 @@
-From 63bd8cc91635ad129587df0227be49074538b36e Mon Sep 17 00:00:00 2001
-From: Aloka Dixit <quic_alokad@quicinc.com>
-Date: Mon, 30 Jan 2023 16:12:25 -0800
-Subject: [PATCH 6/9] wifi: nl80211: validate and configure puncturing bitmap
-
-- New feature flag, NL80211_EXT_FEATURE_PUNCT, to advertise
-  driver support for preamble puncturing in AP mode.
-- New attribute, NL80211_ATTR_PUNCT_BITMAP, to receive a puncturing
-  bitmap from the userspace during AP bring up (NL80211_CMD_START_AP)
-  and channel switch (NL80211_CMD_CHANNEL_SWITCH) operations. Each bit
-  corresponds to a 20 MHz channel in the operating bandwidth, lowest
-  bit for the lowest channel. Bit set to 1 indicates that the channel
-  is punctured. Higher 16 bits are reserved.
-- New members added to structures cfg80211_ap_settings and
-  cfg80211_csa_settings to propagate the bitmap to the driver after
-  validation.
-
-Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
-Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
-Link: https://lore.kernel.org/r/20230131001227.25014-3-quic_alokad@quicinc.com
-[move validation against 0xffff into policy]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/cfg80211.h       |  8 ++++++++
- include/uapi/linux/nl80211.h | 11 +++++++++++
- net/wireless/nl80211.c       | 32 ++++++++++++++++++++++++++++++++
- 3 files changed, 51 insertions(+)
-
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index d532612..9c65eda 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -1327,6 +1327,9 @@ struct cfg80211_unsol_bcast_probe_resp {
-  * @fils_discovery: FILS discovery transmission parameters
-  * @unsol_bcast_probe_resp: Unsolicited broadcast probe response parameters
-  * @mbssid_config: AP settings for multiple bssid
-+ * @punct_bitmap: Preamble puncturing bitmap. Each bit represents
-+ *	a 20 MHz channel, lowest bit corresponding to the lowest channel.
-+ *	Bit set to 1 indicates that the channel is punctured.
-  */
- struct cfg80211_ap_settings {
- 	struct cfg80211_chan_def chandef;
-@@ -1361,6 +1364,7 @@ struct cfg80211_ap_settings {
- 	struct cfg80211_fils_discovery fils_discovery;
- 	struct cfg80211_unsol_bcast_probe_resp unsol_bcast_probe_resp;
- 	struct cfg80211_mbssid_config mbssid_config;
-+	u16 punct_bitmap;
- };
- 
- /**
-@@ -1378,6 +1382,9 @@ struct cfg80211_ap_settings {
-  * @radar_required: whether radar detection is required on the new channel
-  * @block_tx: whether transmissions should be blocked while changing
-  * @count: number of beacons until switch
-+ * @punct_bitmap: Preamble puncturing bitmap. Each bit represents
-+ *	a 20 MHz channel, lowest bit corresponding to the lowest channel.
-+ *	Bit set to 1 indicates that the channel is punctured.
-  */
- struct cfg80211_csa_settings {
- 	struct cfg80211_chan_def chandef;
-@@ -1390,6 +1397,7 @@ struct cfg80211_csa_settings {
- 	bool radar_required;
- 	bool block_tx;
- 	u8 count;
-+	u16 punct_bitmap;
- };
- 
- /**
-diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index c14a91b..173aef8 100644
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -2751,6 +2751,12 @@ enum nl80211_commands {
-  *	the incoming frame RX timestamp.
-  * @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent
-  *	(re)associations.
-+ *
-+ * @NL80211_ATTR_PUNCT_BITMAP: (u32) Preamble puncturing bitmap, lowest
-+ *	bit corresponds to the lowest 20 MHz channel. Each bit set to 1
-+ *	indicates that the sub-channel is punctured. Higher 16 bits are
-+ *	reserved.
-+ *
-  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -3280,6 +3286,8 @@ enum nl80211_attrs {
- 	NL80211_ATTR_RX_HW_TIMESTAMP,
- 	NL80211_ATTR_TD_BITMAP,
- 
-+	NL80211_ATTR_PUNCT_BITMAP,
-+
- 	/* add attributes here, update the policy in nl80211.c */
- 
- 	__NL80211_ATTR_AFTER_LAST,
-@@ -6294,6 +6302,8 @@ enum nl80211_feature_flags {
-  *	might apply, e.g. no scans in progress, no offchannel operations
-  *	in progress, and no active connections.
-  *
-+ * @NL80211_EXT_FEATURE_PUNCT: Driver supports preamble puncturing in AP mode.
-+ *
-  * @NUM_NL80211_EXT_FEATURES: number of extended features.
-  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
-  */
-@@ -6362,6 +6372,7 @@ enum nl80211_ext_feature_index {
- 	NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD,
- 	NL80211_EXT_FEATURE_RADAR_BACKGROUND,
- 	NL80211_EXT_FEATURE_POWERED_ADDR_CHANGE,
-+	NL80211_EXT_FEATURE_PUNCT,
- 
- 	/* add new features before the definition below */
- 	NUM_NL80211_EXT_FEATURES,
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 6a97e52..4cc095d 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -799,6 +799,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
- 	[NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN),
- 	[NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG },
- 	[NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT },
-+	[NL80211_ATTR_PUNCT_BITMAP] = NLA_POLICY_RANGE(NLA_U8, 0, 0xffff),
- };
- 
- /* policy for the key attributes */
-@@ -3167,6 +3168,21 @@ static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
- 		wdev->iftype == NL80211_IFTYPE_P2P_GO;
- }
- 
-+static int nl80211_parse_punct_bitmap(struct cfg80211_registered_device *rdev,
-+				      struct genl_info *info,
-+				      const struct cfg80211_chan_def *chandef,
-+				      u16 *punct_bitmap)
-+{
-+	if (!wiphy_ext_feature_isset(&rdev->wiphy, NL80211_EXT_FEATURE_PUNCT))
-+		return -EINVAL;
-+
-+	*punct_bitmap = nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]);
-+	if (!cfg80211_valid_disable_subchannel_bitmap(punct_bitmap, chandef))
-+		return -EINVAL;
-+
-+	return 0;
-+}
-+
- int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
- 			  struct genl_info *info,
- 			  struct cfg80211_chan_def *chandef)
-@@ -5912,6 +5928,14 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
- 		goto out;
- 	}
- 
-+	if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) {
-+		err = nl80211_parse_punct_bitmap(rdev, info,
-+						 &params->chandef,
-+						 &params->punct_bitmap);
-+		if (err)
-+			goto out;
-+	}
-+
- 	if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, &params->chandef,
- 					   wdev->iftype)) {
- 		err = -EINVAL;
-@@ -10050,6 +10074,14 @@ skip_beacons:
- 	if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
- 		params.block_tx = true;
- 
-+	if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) {
-+		err = nl80211_parse_punct_bitmap(rdev, info,
-+						 &params.chandef,
-+						 &params.punct_bitmap);
-+		if (err)
-+			goto free;
-+	}
-+
- 	wdev_lock(wdev);
- 	err = rdev_channel_switch(rdev, dev, &params);
- 	wdev_unlock(wdev);
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0007-wifi-cfg80211-include-puncturing-bitmap-in-channel-s.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0007-wifi-cfg80211-include-puncturing-bitmap-in-channel-s.patch
deleted file mode 100644
index 73498f0..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0007-wifi-cfg80211-include-puncturing-bitmap-in-channel-s.patch
+++ /dev/null
@@ -1,282 +0,0 @@
-From a0306fbf2adb7074815390d6adbe58fb72533556 Mon Sep 17 00:00:00 2001
-From: Aloka Dixit <quic_alokad@quicinc.com>
-Date: Mon, 30 Jan 2023 16:12:26 -0800
-Subject: [PATCH 7/9] wifi: cfg80211: include puncturing bitmap in channel
- switch events
-
-Add puncturing bitmap in channel switch notifications
-and corresponding trace functions.
-
-Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
-Link: https://lore.kernel.org/r/20230131001227.25014-4-quic_alokad@quicinc.com
-[fix qtnfmac]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- drivers/net/wireless/ath/ath6kl/cfg80211.c    |  2 +-
- drivers/net/wireless/marvell/mwifiex/11h.c    |  2 +-
- .../net/wireless/quantenna/qtnfmac/event.c    |  2 +-
- include/net/cfg80211.h                        |  6 +++--
- net/mac80211/cfg.c                            |  5 ++--
- net/mac80211/mlme.c                           |  4 ++--
- net/wireless/nl80211.c                        | 20 ++++++++++------
- net/wireless/trace.h                          | 24 ++++++++++++-------
- 8 files changed, 41 insertions(+), 24 deletions(-)
-
-diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
-index 07de0bd..576c449 100644
---- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
-+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
-@@ -1119,7 +1119,7 @@ void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
- 					NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT);
- 
- 	mutex_lock(&vif->wdev.mtx);
--	cfg80211_ch_switch_notify(vif->ndev, &chandef, 0);
-+	cfg80211_ch_switch_notify(vif->ndev, &chandef, 0, 0);
- 	mutex_unlock(&vif->wdev.mtx);
- }
- 
-diff --git a/drivers/net/wireless/marvell/mwifiex/11h.c b/drivers/net/wireless/marvell/mwifiex/11h.c
-index 6a9d7bc..b0c40a7 100644
---- a/drivers/net/wireless/marvell/mwifiex/11h.c
-+++ b/drivers/net/wireless/marvell/mwifiex/11h.c
-@@ -292,6 +292,6 @@ void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work)
- 	mwifiex_dbg(priv->adapter, MSG,
- 		    "indicating channel switch completion to kernel\n");
- 	mutex_lock(&priv->wdev.mtx);
--	cfg80211_ch_switch_notify(priv->netdev, &priv->dfs_chandef, 0);
-+	cfg80211_ch_switch_notify(priv->netdev, &priv->dfs_chandef, 0, 0);
- 	mutex_unlock(&priv->wdev.mtx);
- }
-diff --git a/drivers/net/wireless/quantenna/qtnfmac/event.c b/drivers/net/wireless/quantenna/qtnfmac/event.c
-index 4fafe37..0e336ff 100644
---- a/drivers/net/wireless/quantenna/qtnfmac/event.c
-+++ b/drivers/net/wireless/quantenna/qtnfmac/event.c
-@@ -478,7 +478,7 @@ qtnf_event_handle_freq_change(struct qtnf_wmac *mac,
- 			continue;
- 
- 		mutex_lock(&vif->wdev.mtx);
--		cfg80211_ch_switch_notify(vif->netdev, &chandef, 0);
-+		cfg80211_ch_switch_notify(vif->netdev, &chandef, 0, 0);
- 		mutex_unlock(&vif->wdev.mtx);
- 	}
- 
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 9c65eda..8d72357 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -8322,13 +8322,14 @@ bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
-  * @dev: the device which switched channels
-  * @chandef: the new channel definition
-  * @link_id: the link ID for MLO, must be 0 for non-MLO
-+ * @punct_bitmap: the new puncturing bitmap
-  *
-  * Caller must acquire wdev_lock, therefore must only be called from sleepable
-  * driver context!
-  */
- void cfg80211_ch_switch_notify(struct net_device *dev,
- 			       struct cfg80211_chan_def *chandef,
--			       unsigned int link_id);
-+			       unsigned int link_id, u16 punct_bitmap);
- 
- /*
-  * cfg80211_ch_switch_started_notify - notify channel switch start
-@@ -8337,6 +8338,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
-  * @link_id: the link ID for MLO, must be 0 for non-MLO
-  * @count: the number of TBTTs until the channel switch happens
-  * @quiet: whether or not immediate quiet was requested by the AP
-+ * @punct_bitmap: the future puncturing bitmap
-  *
-  * Inform the userspace about the channel switch that has just
-  * started, so that it can take appropriate actions (eg. starting
-@@ -8345,7 +8347,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
- void cfg80211_ch_switch_started_notify(struct net_device *dev,
- 				       struct cfg80211_chan_def *chandef,
- 				       unsigned int link_id, u8 count,
--				       bool quiet);
-+				       bool quiet, u16 punct_bitmap);
- 
- /**
-  * ieee80211_operating_class_to_band - convert operating class to band
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 5bb43de..17d1e71 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -3597,7 +3597,8 @@ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
- 	if (err)
- 		return err;
- 
--	cfg80211_ch_switch_notify(sdata->dev, &sdata->deflink.csa_chandef, 0);
-+	cfg80211_ch_switch_notify(sdata->dev, &sdata->deflink.csa_chandef, 0,
-+				  0);
- 
- 	return 0;
- }
-@@ -3869,7 +3870,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
- 
- 	cfg80211_ch_switch_started_notify(sdata->dev,
- 					  &sdata->deflink.csa_chandef, 0,
--					  params->count, params->block_tx);
-+					  params->count, params->block_tx, 0);
- 
- 	if (changed) {
- 		ieee80211_link_info_change_notify(sdata, &sdata->deflink,
-diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index 2716ae0..d63434b 100644
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -1778,7 +1778,7 @@ static void ieee80211_chswitch_post_beacon(struct ieee80211_link_data *link)
- 		return;
- 	}
- 
--	cfg80211_ch_switch_notify(sdata->dev, &link->reserved_chandef, 0);
-+	cfg80211_ch_switch_notify(sdata->dev, &link->reserved_chandef, 0, 0);
- }
- 
- void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success)
-@@ -1988,7 +1988,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
- 	mutex_unlock(&local->mtx);
- 
- 	cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, 0,
--					  csa_ie.count, csa_ie.mode);
-+					  csa_ie.count, csa_ie.mode, 0);
- 
- 	if (local->ops->channel_switch) {
- 		/* use driver's channel switch callback */
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 4cc095d..f3b2fc4 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -18973,7 +18973,7 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
- 				     struct cfg80211_chan_def *chandef,
- 				     gfp_t gfp,
- 				     enum nl80211_commands notif,
--				     u8 count, bool quiet)
-+				     u8 count, bool quiet, u16 punct_bitmap)
- {
- 	struct wireless_dev *wdev = netdev->ieee80211_ptr;
- 	struct sk_buff *msg;
-@@ -19007,6 +19007,9 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
- 			goto nla_put_failure;
- 	}
- 
-+	if (nla_put_u32(msg, NL80211_ATTR_PUNCT_BITMAP, punct_bitmap))
-+		goto nla_put_failure;
-+
- 	genlmsg_end(msg, hdr);
- 
- 	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
-@@ -19019,7 +19022,7 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
- 
- void cfg80211_ch_switch_notify(struct net_device *dev,
- 			       struct cfg80211_chan_def *chandef,
--			       unsigned int link_id)
-+			       unsigned int link_id, u16 punct_bitmap)
- {
- 	struct wireless_dev *wdev = dev->ieee80211_ptr;
- 	struct wiphy *wiphy = wdev->wiphy;
-@@ -19028,7 +19031,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
- 	ASSERT_WDEV_LOCK(wdev);
- 	WARN_INVALID_LINK_ID(wdev, link_id);
- 
--	trace_cfg80211_ch_switch_notify(dev, chandef, link_id);
-+	trace_cfg80211_ch_switch_notify(dev, chandef, link_id, punct_bitmap);
- 
- 	switch (wdev->iftype) {
- 	case NL80211_IFTYPE_STATION:
-@@ -19056,14 +19059,15 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
- 	cfg80211_sched_dfs_chan_update(rdev);
- 
- 	nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
--				 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
-+				 NL80211_CMD_CH_SWITCH_NOTIFY, 0, false,
-+				 punct_bitmap);
- }
- EXPORT_SYMBOL(cfg80211_ch_switch_notify);
- 
- void cfg80211_ch_switch_started_notify(struct net_device *dev,
- 				       struct cfg80211_chan_def *chandef,
- 				       unsigned int link_id, u8 count,
--				       bool quiet)
-+				       bool quiet, u16 punct_bitmap)
- {
- 	struct wireless_dev *wdev = dev->ieee80211_ptr;
- 	struct wiphy *wiphy = wdev->wiphy;
-@@ -19072,11 +19076,13 @@ void cfg80211_ch_switch_started_notify(struct net_device *dev,
- 	ASSERT_WDEV_LOCK(wdev);
- 	WARN_INVALID_LINK_ID(wdev, link_id);
- 
--	trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id);
-+	trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id,
-+						punct_bitmap);
-+
- 
- 	nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
- 				 NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
--				 count, quiet);
-+				 count, quiet, punct_bitmap);
- }
- EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
- 
-diff --git a/net/wireless/trace.h b/net/wireless/trace.h
-index 8e7c00f..4a7d0ae 100644
---- a/net/wireless/trace.h
-+++ b/net/wireless/trace.h
-@@ -3245,39 +3245,47 @@ TRACE_EVENT(cfg80211_chandef_dfs_required,
- TRACE_EVENT(cfg80211_ch_switch_notify,
- 	TP_PROTO(struct net_device *netdev,
- 		 struct cfg80211_chan_def *chandef,
--		 unsigned int link_id),
--	TP_ARGS(netdev, chandef, link_id),
-+		 unsigned int link_id,
-+		 u16 punct_bitmap),
-+	TP_ARGS(netdev, chandef, link_id, punct_bitmap),
- 	TP_STRUCT__entry(
- 		NETDEV_ENTRY
- 		CHAN_DEF_ENTRY
- 		__field(unsigned int, link_id)
-+		__field(u16, punct_bitmap)
- 	),
- 	TP_fast_assign(
- 		NETDEV_ASSIGN;
- 		CHAN_DEF_ASSIGN(chandef);
- 		__entry->link_id = link_id;
-+		__entry->punct_bitmap = punct_bitmap;
- 	),
--	TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT ", link:%d",
--		  NETDEV_PR_ARG, CHAN_DEF_PR_ARG, __entry->link_id)
-+	TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT ", link:%d, punct_bitmap:%u",
-+		  NETDEV_PR_ARG, CHAN_DEF_PR_ARG, __entry->link_id,
-+		  __entry->punct_bitmap)
- );
- 
- TRACE_EVENT(cfg80211_ch_switch_started_notify,
- 	TP_PROTO(struct net_device *netdev,
- 		 struct cfg80211_chan_def *chandef,
--		 unsigned int link_id),
--	TP_ARGS(netdev, chandef, link_id),
-+		 unsigned int link_id,
-+		 u16 punct_bitmap),
-+	TP_ARGS(netdev, chandef, link_id, punct_bitmap),
- 	TP_STRUCT__entry(
- 		NETDEV_ENTRY
- 		CHAN_DEF_ENTRY
- 		__field(unsigned int, link_id)
-+		__field(u16, punct_bitmap)
- 	),
- 	TP_fast_assign(
- 		NETDEV_ASSIGN;
- 		CHAN_DEF_ASSIGN(chandef);
- 		__entry->link_id = link_id;
-+		__entry->punct_bitmap = punct_bitmap;
- 	),
--	TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT ", link:%d",
--		  NETDEV_PR_ARG, CHAN_DEF_PR_ARG, __entry->link_id)
-+	TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT ", link:%d, punct_bitmap:%u",
-+		  NETDEV_PR_ARG, CHAN_DEF_PR_ARG, __entry->link_id,
-+		  __entry->punct_bitmap)
- );
- 
- TRACE_EVENT(cfg80211_radar_event,
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0008-wifi-mac80211-configure-puncturing-bitmap.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0008-wifi-mac80211-configure-puncturing-bitmap.patch
deleted file mode 100644
index 80c4b61..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0008-wifi-mac80211-configure-puncturing-bitmap.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From b5bdd1f773d65d640844f4b8a3e63c25057f1b46 Mon Sep 17 00:00:00 2001
-From: Aloka Dixit <quic_alokad@quicinc.com>
-Date: Mon, 30 Jan 2023 16:12:27 -0800
-Subject: [PATCH 8/9] wifi: mac80211: configure puncturing bitmap
-
-- Configure the bitmap in link_conf and notify the driver.
-- Modify 'change' in ieee80211_start_ap() from u32 to u64 to support
-BSS_CHANGED_EHT_PUNCTURING.
-- Propagate the bitmap in channel switch events to userspace.
-
-Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
-Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
-Link: https://lore.kernel.org/r/20230131001227.25014-5-quic_alokad@quicinc.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/mac80211.h |  3 +++
- net/mac80211/cfg.c     | 22 +++++++++++++++++++---
- 2 files changed, 22 insertions(+), 3 deletions(-)
-
-diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 8fb38c9..c4ff6a3 100644
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -645,6 +645,7 @@ struct ieee80211_fils_discovery {
-  * @csa_active: marks whether a channel switch is going on. Internally it is
-  *	write-protected by sdata_lock and local->mtx so holding either is fine
-  *	for read access.
-+ * @csa_punct_bitmap: new puncturing bitmap for channel switch
-  * @mu_mimo_owner: indicates interface owns MU-MIMO capability
-  * @chanctx_conf: The channel context this interface is assigned to, or %NULL
-  *	when it is not assigned. This pointer is RCU-protected due to the TX
-@@ -744,6 +745,8 @@ struct ieee80211_bss_conf {
- 	u16 eht_puncturing;
- 
- 	bool csa_active;
-+	u16 csa_punct_bitmap;
-+
- 	bool mu_mimo_owner;
- 	struct ieee80211_chanctx_conf __rcu *chanctx_conf;
- 
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 17d1e71..6defc1d 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1220,7 +1220,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
- 	struct ieee80211_local *local = sdata->local;
- 	struct beacon_data *old;
- 	struct ieee80211_sub_if_data *vlan;
--	u32 changed = BSS_CHANGED_BEACON_INT |
-+	u64 changed = BSS_CHANGED_BEACON_INT |
- 		      BSS_CHANGED_BEACON_ENABLED |
- 		      BSS_CHANGED_BEACON |
- 		      BSS_CHANGED_P2P_PS |
-@@ -1307,6 +1307,11 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
- 				IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
- 	}
- 
-+	if (params->eht_cap) {
-+		link_conf->eht_puncturing = params->punct_bitmap;
-+		changed |= BSS_CHANGED_EHT_PUNCTURING;
-+	}
-+
- 	if (sdata->vif.type == NL80211_IFTYPE_AP &&
- 	    params->mbssid_config.tx_wdev) {
- 		err = ieee80211_set_ap_mbssid_options(sdata,
-@@ -3556,6 +3561,12 @@ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
- 	lockdep_assert_held(&local->mtx);
- 	lockdep_assert_held(&local->chanctx_mtx);
- 
-+	if (sdata->vif.bss_conf.eht_puncturing != sdata->vif.bss_conf.csa_punct_bitmap) {
-+		sdata->vif.bss_conf.eht_puncturing =
-+					sdata->vif.bss_conf.csa_punct_bitmap;
-+		changed |= BSS_CHANGED_EHT_PUNCTURING;
-+	}
-+
- 	/*
- 	 * using reservation isn't immediate as it may be deferred until later
- 	 * with multi-vif. once reservation is complete it will re-schedule the
-@@ -3598,7 +3609,7 @@ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
- 		return err;
- 
- 	cfg80211_ch_switch_notify(sdata->dev, &sdata->deflink.csa_chandef, 0,
--				  0);
-+				  sdata->vif.bss_conf.eht_puncturing);
- 
- 	return 0;
- }
-@@ -3860,9 +3871,13 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
- 		goto out;
- 	}
- 
-+	if (params->punct_bitmap && !sdata->vif.bss_conf.eht_support)
-+		goto out;
-+
- 	sdata->deflink.csa_chandef = params->chandef;
- 	sdata->deflink.csa_block_tx = params->block_tx;
- 	sdata->vif.bss_conf.csa_active = true;
-+	sdata->vif.bss_conf.csa_punct_bitmap = params->punct_bitmap;
- 
- 	if (sdata->deflink.csa_block_tx)
- 		ieee80211_stop_vif_queues(local, sdata,
-@@ -3870,7 +3885,8 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
- 
- 	cfg80211_ch_switch_started_notify(sdata->dev,
- 					  &sdata->deflink.csa_chandef, 0,
--					  params->count, params->block_tx, 0);
-+					  params->count, params->block_tx,
-+					  sdata->vif.bss_conf.csa_punct_bitmap);
- 
- 	if (changed) {
- 		ieee80211_link_info_change_notify(sdata, &sdata->deflink,
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0009-wifi-mac80211-add-EHT-MU-MIMO-related-flags-in-ieee8.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0009-wifi-mac80211-add-EHT-MU-MIMO-related-flags-in-ieee8.patch
deleted file mode 100644
index 74c0d07..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/bp-0009-wifi-mac80211-add-EHT-MU-MIMO-related-flags-in-ieee8.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 4244ed072fedc6f391ddad20fbc70bbb9dfb7c2c Mon Sep 17 00:00:00 2001
-From: Ryder Lee <ryder.lee@mediatek.com>
-Date: Sat, 18 Feb 2023 01:48:59 +0800
-Subject: [PATCH 9/9] wifi: mac80211: add EHT MU-MIMO related flags in
- ieee80211_bss_conf
-
-Similar to VHT/HE. This is utilized to pass MU-MIMO configurations
-from user space (i.e. hostapd) to driver.
-
-Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
-Link: https://lore.kernel.org/r/8d9966c4c1e77cb1ade77d42bdc49905609192e9.1676628065.git.ryder.lee@mediatek.com
-[move into combined if statement, reset on !eht]
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
- include/net/mac80211.h |  9 +++++++++
- net/mac80211/cfg.c     | 16 ++++++++++++++++
- 2 files changed, 25 insertions(+)
-
-diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index c4ff6a3..24d2a66 100644
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -676,6 +676,12 @@ struct ieee80211_fils_discovery {
-  * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission
-  *	(non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU
-  *	bandwidth
-+ * @eht_su_beamformer: in AP-mode, does this BSS enable operation as an EHT SU
-+ *	beamformer
-+ * @eht_su_beamformee: in AP-mode, does this BSS enable operation as an EHT SU
-+ *	beamformee
-+ * @eht_mu_beamformer: in AP-mode, does this BSS enable operation as an EHT MU
-+ *	beamformer
-  */
- struct ieee80211_bss_conf {
- 	const u8 *bssid;
-@@ -764,6 +770,9 @@ struct ieee80211_bss_conf {
- 	bool he_su_beamformee;
- 	bool he_mu_beamformer;
- 	bool he_full_ul_mumimo;
-+	bool eht_su_beamformer;
-+	bool eht_su_beamformee;
-+	bool eht_mu_beamformer;
- };
- 
- /**
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 6defc1d..49760bf 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1310,6 +1310,22 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
- 	if (params->eht_cap) {
- 		link_conf->eht_puncturing = params->punct_bitmap;
- 		changed |= BSS_CHANGED_EHT_PUNCTURING;
-+
-+		link_conf->eht_su_beamformer =
-+			params->eht_cap->fixed.phy_cap_info[0] &
-+				IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER;
-+		link_conf->eht_su_beamformee =
-+			params->eht_cap->fixed.phy_cap_info[0] &
-+				IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE;
-+		link_conf->eht_mu_beamformer =
-+			params->eht_cap->fixed.phy_cap_info[7] &
-+				(IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
-+				 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
-+				 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
-+	} else {
-+		link_conf->eht_su_beamformer = false;
-+		link_conf->eht_su_beamformee = false;
-+		link_conf->eht_mu_beamformer = false;
- 	}
- 
- 	if (sdata->vif.type == NL80211_IFTYPE_AP &&
--- 
-2.39.2
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
index c75457d..c52c759 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch
@@ -1,7 +1,7 @@
-From 635092a3fd448ecca927e72882f05dc52bb1d21b Mon Sep 17 00:00:00 2001
+From 5369b107bbb17d2152f7690f3fc91a135f05a88c Mon Sep 17 00:00:00 2001
 From: Peter Chiu <chui-hao.chiu@mediatek.com>
 Date: Tue, 18 Jan 2022 20:29:44 +0800
-Subject: [PATCH 01/14] mac80211: mtk: do not setup twt when twt responder is
+Subject: [PATCH 01/21] mac80211: mtk: do not setup twt when twt responder is
  false
 
 ---
@@ -9,10 +9,10 @@
  1 file changed, 3 insertions(+)
 
 diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
-index fadf2be..54dcaf6 100644
+index 8ffe90d..56abe67 100644
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -3400,6 +3400,9 @@ ieee80211_process_rx_twt_action(struct ieee80211_rx_data *rx)
+@@ -3416,6 +3416,9 @@ ieee80211_process_rx_twt_action(struct ieee80211_rx_data *rx)
  	if (sdata->vif.type != NL80211_IFTYPE_AP)
  		return false;
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0002-cfg80211-mtk-extend-CAC-time-for-weather-radar-chann.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0002-cfg80211-mtk-extend-CAC-time-for-weather-radar-chann.patch
index e3288e4..2a60dc4 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0002-cfg80211-mtk-extend-CAC-time-for-weather-radar-chann.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0002-cfg80211-mtk-extend-CAC-time-for-weather-radar-chann.patch
@@ -1,7 +1,8 @@
-From a1d6921a833c7d85170cb54145bfcf98d7f11283 Mon Sep 17 00:00:00 2001
+From 9b4ed2d99cc24c50bef088ee2bc48047d4e17c97 Mon Sep 17 00:00:00 2001
 From: Shayne Chen <shayne.chen@mediatek.com>
 Date: Tue, 29 Mar 2022 16:06:30 +0800
-Subject: [PATCH] cfg80211: mtk: extend CAC time for weather radar channels
+Subject: [PATCH 02/21] cfg80211: mtk: extend CAC time for weather radar
+ channels
 
 Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
@@ -12,7 +13,7 @@
  3 files changed, 11 insertions(+)
 
 diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 98a2971..28c0a5f 100644
+index 3e0a190..32df498 100644
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
 @@ -149,6 +149,7 @@ enum ieee80211_channel_flags {
@@ -24,7 +25,7 @@
  
  /**
 diff --git a/net/wireless/chan.c b/net/wireless/chan.c
-index d5ed976..62f0169 100644
+index d5ed976..caa5acc 100644
 --- a/net/wireless/chan.c
 +++ b/net/wireless/chan.c
 @@ -931,6 +931,13 @@ static unsigned int cfg80211_get_chans_dfs_cac_time(struct wiphy *wiphy,
@@ -42,10 +43,10 @@
  			dfs_cac_ms = c->dfs_cac_ms;
  	}
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index f3b2fc4..215a603 100644
+index 6d62c81..3ec073a 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -9817,6 +9817,9 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
+@@ -9992,6 +9992,9 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
  	if (WARN_ON(!cac_time_ms))
  		cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
  
@@ -56,5 +57,5 @@
  	if (!err) {
  		wdev->links[0].ap.chandef = chandef;
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
index b31ba64..a68441f 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch
@@ -1,7 +1,7 @@
-From efac6783560b2859f49f0a5d3dceff0e388431cf Mon Sep 17 00:00:00 2001
+From 395e1cebc680455965b24fe771efaae400439acc Mon Sep 17 00:00:00 2001
 From: Bo Jiao <Bo.Jiao@mediatek.com>
 Date: Fri, 1 Apr 2022 09:15:21 +0800
-Subject: [PATCH 03/14] mac80211: mtk: it's invalid case when frag_threshold is
+Subject: [PATCH 03/21] mac80211: mtk: it's invalid case when frag_threshold is
  greater than 2346
 
 Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 3 insertions(+)
 
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 0430bbe..c5620f3 100644
+index 3ec073a..e0ee534 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -3614,6 +3614,9 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
+@@ -3650,6 +3650,9 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
  			goto out;
  		}
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0004-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0004-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
index 5a81d9b..5eb6ee7 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0004-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0004-mac80211-mtk-airtime_flags-depends-on-NL80211_EXT_FE.patch
@@ -1,7 +1,7 @@
-From f88d59e107e1d962ebf77be9e1d0b35b188c8185 Mon Sep 17 00:00:00 2001
+From 7b34ccae1fef44bc222e9ff6313fa6c57f962b92 Mon Sep 17 00:00:00 2001
 From: Evelyn Tsai <evelyn.tsai@mediatek.com>
 Date: Wed, 19 Oct 2022 13:42:43 +0800
-Subject: [PATCH 04/14] mac80211: mtk: airtime_flags depends on
+Subject: [PATCH 04/21] mac80211: mtk: airtime_flags depends on
  NL80211_EXT_FEATURE
 
 Signed-off-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 diff --git a/net/mac80211/main.c b/net/mac80211/main.c
-index dfb9f4b..06d111d 100644
+index e2f7ae5..0188e6a 100644
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -797,8 +797,9 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
+@@ -798,8 +798,9 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
  			IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H;
  		atomic_set(&local->aql_ac_pending_airtime[i], 0);
  	}
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0005-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0005-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
index 0bbbfe0..66a784d 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0005-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0005-mac80211-mtk-add-support-for-runtime-set-inband-disc.patch
@@ -1,23 +1,22 @@
-From 5deaaa36bfeb7a68bbcce8770011ef49be6a6991 Mon Sep 17 00:00:00 2001
+From f6907ff7ff3669e73f64f802de10346bfd1d24d8 Mon Sep 17 00:00:00 2001
 From: MeiChia Chiu <meichia.chiu@mediatek.com>
 Date: Wed, 19 Oct 2022 13:45:42 +0800
-Subject: [PATCH 05/14] mac80211: mtk: add support for runtime set inband
- discovery
+Subject: [PATCH] mac80211: mtk: add support for runtime set inband discovery
 
 Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
 ---
  include/net/cfg80211.h       |  1 +
  include/net/mac80211.h       |  1 +
  include/uapi/linux/nl80211.h |  1 +
- net/mac80211/cfg.c           | 33 ++++++++++++++++++++++++++++++++-
- net/wireless/nl80211.c       | 31 +++++++++++++++++++++++++++----
- 5 files changed, 62 insertions(+), 5 deletions(-)
+ net/mac80211/cfg.c           | 30 +++++++++++++++++++++++++++++-
+ net/wireless/nl80211.c       | 33 ++++++++++++++++++++++++++++-----
+ 5 files changed, 60 insertions(+), 6 deletions(-)
 
 diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 8d72357..450de58 100644
+index 072a787..02e342e 100644
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -1268,6 +1268,7 @@ struct cfg80211_fils_discovery {
+@@ -1309,6 +1309,7 @@ struct cfg80211_fils_discovery {
  	u32 max_interval;
  	size_t tmpl_len;
  	const u8 *tmpl;
@@ -26,7 +25,7 @@
  
  /**
 diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 24d2a66..09fad2b 100644
+index 2e5b5c6..96e4ec9 100644
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
 @@ -526,6 +526,7 @@ struct ieee80211_ftm_responder_params {
@@ -38,10 +37,10 @@
  
  /**
 diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index 173aef8..bd26a06 100644
+index 88eb85c..72ef4d9 100644
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -7513,6 +7513,7 @@ enum nl80211_fils_discovery_attributes {
+@@ -7619,6 +7619,7 @@ enum nl80211_fils_discovery_attributes {
  	NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
  	NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
  	NL80211_FILS_DISCOVERY_ATTR_TMPL,
@@ -50,10 +49,10 @@
  	/* keep last */
  	__NL80211_FILS_DISCOVERY_ATTR_LAST,
 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 49760bf..97f7905 100644
+index f4649d1..baff0e6 100644
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -984,6 +984,7 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
+@@ -990,6 +990,7 @@ static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
  	fd = &link_conf->fils_discovery;
  	fd->min_interval = params->min_interval;
  	fd->max_interval = params->max_interval;
@@ -61,23 +60,23 @@
  
  	old = sdata_dereference(link->u.ap.fils_discovery, sdata);
  	new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
-@@ -1466,6 +1467,9 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
+@@ -1513,9 +1514,11 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
  	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  	struct ieee80211_link_data *link;
  	struct beacon_data *old;
 +	struct cfg80211_ap_settings *ap_params;
 +	struct ieee80211_supported_band *sband;
-+	u32 changed;
++	u64 changed = 0;
  	int err;
  	struct ieee80211_bss_conf *link_conf;
+-	u64 changed = 0;
  
-@@ -1497,7 +1501,34 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
- 		err |= BSS_CHANGED_HE_BSS_COLOR;
+ 	sdata_assert_lock(sdata);
+ 
+@@ -1546,6 +1549,31 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
+ 		changed |= BSS_CHANGED_HE_BSS_COLOR;
  	}
  
--	ieee80211_link_info_change_notify(sdata, link, err);
-+	changed = err;
-+
 +	sband = ieee80211_get_sband(sdata);
 +	if (!sband)
 +		return -EINVAL;
@@ -103,12 +102,11 @@
 +		}
 +	}
 +
-+	ieee80211_bss_info_change_notify(sdata, changed);
+ 	ieee80211_link_info_change_notify(sdata, link, changed);
  	return 0;
  }
- 
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index c5620f3..95676d9 100644
+index e0ee534..ff8afa5 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
 @@ -423,6 +423,7 @@ nl80211_fils_discovery_policy[NL80211_FILS_DISCOVERY_ATTR_MAX + 1] = {
@@ -119,7 +117,7 @@
  };
  
  static const struct nla_policy
-@@ -5605,6 +5606,8 @@ static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
+@@ -5692,6 +5693,8 @@ static int nl80211_parse_fils_discovery(struct cfg80211_registered_device *rdev,
  	fd->tmpl = nla_data(tb[NL80211_FILS_DISCOVERY_ATTR_TMPL]);
  	fd->min_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MIN]);
  	fd->max_interval = nla_get_u32(tb[NL80211_FILS_DISCOVERY_ATTR_INT_MAX]);
@@ -128,7 +126,7 @@
  
  	return 0;
  }
-@@ -6092,7 +6095,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
+@@ -6224,7 +6227,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
  	unsigned int link_id = nl80211_link_id(info->attrs);
  	struct net_device *dev = info->user_ptr[1];
  	struct wireless_dev *wdev = dev->ieee80211_ptr;
@@ -138,15 +136,15 @@
  	int err;
  
  	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
-@@ -6105,16 +6109,35 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
+@@ -6237,17 +6241,36 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
  	if (!wdev->links[link_id].ap.beacon_interval)
  		return -EINVAL;
  
--	err = nl80211_parse_beacon(rdev, info->attrs, &params);
+-	err = nl80211_parse_beacon(rdev, info->attrs, &params, info->extack);
 +	memset(&ap_params, 0, sizeof(ap_params));
 +	params = &ap_params.beacon;
 +
-+	err = nl80211_parse_beacon(rdev, info->attrs, params);
++	err = nl80211_parse_beacon(rdev, info->attrs, params, info->extack);
  	if (err)
  		goto out;
  
@@ -173,10 +171,12 @@
  
  out:
 -	kfree(params.mbssid_ies);
+-	kfree(params.rnr_ies);
 +	kfree(params->mbssid_ies);
++	kfree(params->rnr_ies);
  	return err;
  }
  
 -- 
-2.39.2
+2.25.1
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0006-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0006-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
index 4072a92..b2408ad 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0006-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0006-cfg80211-mtk-implement-DFS-status-show-cac-and-nop-s.patch
@@ -1,8 +1,8 @@
-From dc8caecd0c7f5dfd542ba08f98605a7d6849e110 Mon Sep 17 00:00:00 2001
+From cbb9327b27651e375f72783e9c2453a2474f3ad3 Mon Sep 17 00:00:00 2001
 From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 Date: Thu, 22 Sep 2022 14:27:41 +0800
-Subject: [PATCH] cfg80211: mtk: implement DFS status show, cac and nop skip
- command via debugfs
+Subject: [PATCH 06/21] cfg80211: mtk: implement DFS status show, cac and nop
+ skip command via debugfs
 
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 ---
@@ -16,23 +16,23 @@
  7 files changed, 360 insertions(+), 7 deletions(-)
 
 diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 450de58..ddd63e7 100644
+index 7ba5fe9..cd0ec8a 100644
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -4647,6 +4647,7 @@ struct cfg80211_ops {
- 				    struct link_station_parameters *params);
- 	int	(*del_link_station)(struct wiphy *wiphy, struct net_device *dev,
+@@ -4768,6 +4768,7 @@ struct cfg80211_ops {
  				    struct link_station_del_parameters *params);
+ 	int	(*set_hw_timestamp)(struct wiphy *wiphy, struct net_device *dev,
+ 				    struct cfg80211_set_hw_timestamp *hwts);
 +	void	(*skip_cac)(struct wireless_dev *wdev);
  };
  
  /*
 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 97f7905..36a2c8d 100644
+index a78ee52..8033b2f 100644
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -4962,6 +4962,25 @@ ieee80211_del_link_station(struct wiphy *wiphy, struct net_device *dev,
- 	return ret;
+@@ -5049,6 +5049,25 @@ static int ieee80211_set_hw_timestamp(struct wiphy *wiphy,
+ 	return local->ops->set_hw_timestamp(&local->hw, &sdata->vif, hwts);
  }
  
 +static void
@@ -57,14 +57,14 @@
  const struct cfg80211_ops mac80211_config_ops = {
  	.add_virtual_intf = ieee80211_add_iface,
  	.del_virtual_intf = ieee80211_del_iface,
-@@ -5072,4 +5091,5 @@ const struct cfg80211_ops mac80211_config_ops = {
- 	.add_link_station = ieee80211_add_link_station,
+@@ -5161,4 +5180,5 @@ const struct cfg80211_ops mac80211_config_ops = {
  	.mod_link_station = ieee80211_mod_link_station,
  	.del_link_station = ieee80211_del_link_station,
+ 	.set_hw_timestamp = ieee80211_set_hw_timestamp,
 +	.skip_cac = ieee80211_skip_cac,
  };
 diff --git a/net/wireless/core.h b/net/wireless/core.h
-index 382455c..c9d7712 100644
+index 70fc2e6..ea1b6ff 100644
 --- a/net/wireless/core.h
 +++ b/net/wireless/core.h
 @@ -86,6 +86,9 @@ struct cfg80211_registered_device {
@@ -410,10 +410,10 @@
 +	DEBUGFS_ADD(dfs_available_reset, 0600);
  }
 diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
-index 5a63dba..57b9bde 100644
+index 8b87bc9..e3cbfc0 100644
 --- a/net/wireless/mlme.c
 +++ b/net/wireless/mlme.c
-@@ -1030,13 +1030,16 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
+@@ -1054,13 +1054,16 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
  		queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
  		cfg80211_sched_dfs_chan_update(rdev);
  		wdev = rdev->background_radar_wdev;
@@ -430,7 +430,7 @@
  		break;
  	default:
  		return;
-@@ -1056,6 +1059,7 @@ cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
+@@ -1080,6 +1083,7 @@ cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
  					chandef, event);
  	wiphy_unlock(&rdev->wiphy);
  }
@@ -438,7 +438,7 @@
  
  void cfg80211_background_cac_done_wk(struct work_struct *work)
  {
-@@ -1117,8 +1121,10 @@ cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rde
+@@ -1141,8 +1145,10 @@ cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rde
  	if (!cac_time_ms)
  		cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
  
@@ -450,13 +450,14 @@
  	__cfg80211_background_cac_event(rdev, wdev, chandef,
  					NL80211_RADAR_CAC_STARTED);
 diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
-index ca29892..ce83152 100644
+index 72c1282..5a4854c 100644
 --- a/net/wireless/rdev-ops.h
 +++ b/net/wireless/rdev-ops.h
-@@ -1494,4 +1494,18 @@ rdev_del_link_station(struct cfg80211_registered_device *rdev,
+@@ -1524,4 +1524,18 @@ rdev_set_hw_timestamp(struct cfg80211_registered_device *rdev,
+ 
  	return ret;
  }
- 
++
 +static inline int
 +rdev_skip_cac(struct cfg80211_registered_device *rdev,
 +	      struct wireless_dev *wdev)
@@ -470,14 +471,13 @@
 +
 +	return 0;
 +}
-+
  #endif /* __CFG80211_RDEV_OPS */
 diff --git a/net/wireless/trace.h b/net/wireless/trace.h
-index 4a7d0ae..4d44c55 100644
+index fc955a9..01dcfd3 100644
 --- a/net/wireless/trace.h
 +++ b/net/wireless/trace.h
-@@ -3909,6 +3909,18 @@ TRACE_EVENT(rdev_del_link_station,
- 		  __entry->link_id)
+@@ -3981,6 +3981,18 @@ TRACE_EVENT(cfg80211_links_removed,
+ 		  __entry->link_mask)
  );
  
 +TRACE_EVENT(rdev_skip_cac,
@@ -496,5 +496,5 @@
  
  #undef TRACE_INCLUDE_PATH
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0007-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0007-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
index 0b33292..5276b39 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0007-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0007-mac80211-mtk-Set-TWT-Information-Frame-Disabled-bit-.patch
@@ -1,7 +1,7 @@
-From f6619b6ecec6122b107fa3c3c9bb0e2a4ceaba87 Mon Sep 17 00:00:00 2001
+From c1fac970b782b1d6786f3ec59abc995d84374ceb Mon Sep 17 00:00:00 2001
 From: Howard Hsu <howard-yh.hsu@mediatek.com>
 Date: Tue, 4 Oct 2022 10:47:05 +0800
-Subject: [PATCH 07/14] mac80211: mtk: Set TWT Information Frame Disabled bit
+Subject: [PATCH 07/21] mac80211: mtk: Set TWT Information Frame Disabled bit
  as 1.
 
 This modification means that current implementation do not support twt information frame.
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0008-mac80211-mtk-check-the-control-channel-before-downgr.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0008-mac80211-mtk-check-the-control-channel-before-downgr.patch
index 685e0b7..6c614fe 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0008-mac80211-mtk-check-the-control-channel-before-downgr.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0008-mac80211-mtk-check-the-control-channel-before-downgr.patch
@@ -1,7 +1,7 @@
-From 74dec28f086c6d919d936fb159bfb3fada5f4ca7 Mon Sep 17 00:00:00 2001
+From cc5889f25d7d72cf4ecbaefbe885ad654d50e730 Mon Sep 17 00:00:00 2001
 From: Evelyn Tsai <evelyn.tsai@mediatek.com>
 Date: Fri, 16 Dec 2022 03:31:06 +0800
-Subject: [PATCH 08/14] mac80211: mtk: check the control channel before
+Subject: [PATCH 08/21] mac80211: mtk: check the control channel before
  downgrading the bandwidth
 
 ---
@@ -9,11 +9,11 @@
  1 file changed, 23 insertions(+)
 
 diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index d63434b..72d153f 100644
+index f93eb38..86f762d 100644
 --- a/net/mac80211/mlme.c
 +++ b/net/mac80211/mlme.c
-@@ -4657,6 +4657,26 @@ ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata,
- 	return false;
+@@ -4791,6 +4791,26 @@ ieee80211_verify_sta_eht_mcs_support(struct ieee80211_sub_if_data *sdata,
+ 	return true;
  }
  
 +static bool ieee80211_check_same_ctrl_channel(struct ieee80211_sub_if_data *sdata,
@@ -39,7 +39,7 @@
  static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
  				  struct ieee80211_link_data *link,
  				  struct cfg80211_bss *cbss,
-@@ -4883,6 +4903,9 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
+@@ -5033,6 +5053,9 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
  	    chandef.width == NL80211_CHAN_WIDTH_10)
  		goto out;
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0009-mac80211-mtk-fix-tx-amsdu-aggregation.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0009-mac80211-mtk-fix-tx-amsdu-aggregation.patch
index fd2295f..a505811 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0009-mac80211-mtk-fix-tx-amsdu-aggregation.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0009-mac80211-mtk-fix-tx-amsdu-aggregation.patch
@@ -1,7 +1,7 @@
-From e12f4ecc226a21580958bcbb2f418ae979e49a36 Mon Sep 17 00:00:00 2001
+From 3a7bbbffc4870e413856f3f3d7e54066117d13ed Mon Sep 17 00:00:00 2001
 From: TomLiu <tomml.liu@mediatek.com>
 Date: Wed, 14 Dec 2022 00:26:50 -0800
-Subject: [PATCH 09/14] mac80211: mtk: fix tx amsdu aggregation
+Subject: [PATCH 09/21] mac80211: mtk: fix tx amsdu aggregation
 
 ---
  include/net/mac80211.h | 7 +++++++
@@ -9,10 +9,10 @@
  2 files changed, 11 insertions(+), 2 deletions(-)
 
 diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 09fad2b..bd257ce 100644
+index 96e4ec9..eb229aa 100644
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -2905,6 +2905,13 @@ static inline void _ieee80211_hw_set(struct ieee80211_hw *hw,
+@@ -2921,6 +2921,13 @@ static inline void _ieee80211_hw_set(struct ieee80211_hw *hw,
  }
  #define ieee80211_hw_set(hw, flg)	_ieee80211_hw_set(hw, IEEE80211_HW_##flg)
  
@@ -27,7 +27,7 @@
   * struct ieee80211_scan_request - hw scan request
   *
 diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
-index 6597607..752ad09 100644
+index b6b7726..80cd642 100644
 --- a/net/mac80211/agg-tx.c
 +++ b/net/mac80211/agg-tx.c
 @@ -66,7 +66,8 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0010-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-id.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0010-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-id.patch
index a160e14..d121c4f 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0010-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-id.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0010-mac80211-mtk-add-fill-receive-path-ops-to-get-wed-id.patch
@@ -1,7 +1,7 @@
-From ea115965135f78dc8993f1a73a0600fb5b83cdf7 Mon Sep 17 00:00:00 2001
+From 66fbfef0e7ae77359c9609aeec93a31463af59b4 Mon Sep 17 00:00:00 2001
 From: Sujuan Chen <sujuan.chen@mediatek.com>
 Date: Wed, 18 May 2022 15:10:22 +0800
-Subject: [PATCH 10/14] mac80211: mtk: add fill receive path ops to get wed idx
+Subject: [PATCH 10/21] mac80211: mtk: add fill receive path ops to get wed idx
 
 Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
 ---
@@ -12,10 +12,10 @@
  4 files changed, 50 insertions(+)
 
 diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index bd257ce..9208a8d 100644
+index eb229aa..2c282e6 100644
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -4226,6 +4226,8 @@ struct ieee80211_prep_tx_info {
+@@ -4255,6 +4255,8 @@ struct ieee80211_prep_tx_info {
   *	disable background CAC/radar detection.
   * @net_fill_forward_path: Called from .ndo_fill_forward_path in order to
   *	resolve a path for hardware flow offloading
@@ -24,7 +24,7 @@
   * @change_vif_links: Change the valid links on an interface, note that while
   *	removing the old link information is still valid (link_conf pointer),
   *	but may immediately disappear after the function returns. The old or
-@@ -4591,6 +4593,9 @@ struct ieee80211_ops {
+@@ -4631,6 +4633,9 @@ struct ieee80211_ops {
  				     struct ieee80211_sta *sta,
  				     struct net_device_path_ctx *ctx,
  				     struct net_device_path *path);
@@ -35,10 +35,10 @@
  				struct ieee80211_vif *vif,
  				u16 old_links, u16 new_links,
 diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
-index 37f428e..b076658 100644
+index 650d8d1..d187206 100644
 --- a/net/mac80211/driver-ops.h
 +++ b/net/mac80211/driver-ops.h
-@@ -1485,6 +1485,19 @@ static inline int drv_net_fill_forward_path(struct ieee80211_local *local,
+@@ -1519,6 +1519,19 @@ static inline int drv_net_fill_forward_path(struct ieee80211_local *local,
  	return ret;
  }
  
@@ -59,10 +59,10 @@
  				   struct ieee80211_sub_if_data *sdata,
  				   struct net_device *dev,
 diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
-index a18f80d..b82065c 100644
+index be586bc..b8dfd32 100644
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -936,6 +936,28 @@ out:
+@@ -930,6 +930,28 @@ out:
  	return ret;
  }
  
@@ -91,7 +91,7 @@
  static const struct net_device_ops ieee80211_dataif_8023_ops = {
  	.ndo_open		= ieee80211_open,
  	.ndo_stop		= ieee80211_stop,
-@@ -945,6 +967,7 @@ static const struct net_device_ops ieee80211_dataif_8023_ops = {
+@@ -939,6 +961,7 @@ static const struct net_device_ops ieee80211_dataif_8023_ops = {
  	.ndo_set_mac_address	= ieee80211_change_mac,
  	.ndo_get_stats64	= ieee80211_get_stats64,
  	.ndo_fill_forward_path	= ieee80211_netdev_fill_forward_path,
@@ -100,10 +100,10 @@
  };
  
 diff --git a/net/mac80211/util.c b/net/mac80211/util.c
-index 5a6c091..f6a2561 100644
+index 8a6917c..3650dcd 100644
 --- a/net/mac80211/util.c
 +++ b/net/mac80211/util.c
-@@ -888,6 +888,15 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
+@@ -868,6 +868,15 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
  }
  EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0011-mac80211-mtk-fix-build-error-on-Linux-Kernel-5.4.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0011-mac80211-mtk-fix-build-error-on-Linux-Kernel-5.4.patch
index 17a5248..a75e19c 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0011-mac80211-mtk-fix-build-error-on-Linux-Kernel-5.4.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0011-mac80211-mtk-fix-build-error-on-Linux-Kernel-5.4.patch
@@ -1,17 +1,17 @@
-From ecf81145d85cc3d991d360d283b83a0e91ecf1da Mon Sep 17 00:00:00 2001
+From d0528e1e6fffdb620314bb7934cdab4971e02e77 Mon Sep 17 00:00:00 2001
 From: Evelyn Tsai <evelyn.tsai@mediatek.com>
 Date: Tue, 13 Dec 2022 09:04:49 +0800
-Subject: [PATCH 11/14] mac80211: mtk: fix build error on Linux Kernel 5.4
+Subject: [PATCH 11/21] mac80211: mtk: fix build error on Linux Kernel 5.4
 
 ---
- include/linux/ieee80211.h          | 8 +++-----
- net/mac80211/rc80211_minstrel_ht.c | 2 ++
- net/mac80211/wpa.c                 | 4 ++--
- net/wireless/nl80211.c             | 4 ++++
- 4 files changed, 11 insertions(+), 7 deletions(-)
+ include/linux/ieee80211.h          |  8 +++-----
+ net/mac80211/rc80211_minstrel_ht.c |  2 ++
+ net/mac80211/wpa.c                 |  4 ++--
+ net/wireless/nl80211.c             | 12 +++++-------
+ 4 files changed, 12 insertions(+), 14 deletions(-)
 
 diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
-index d15816f..00d381e 100644
+index 4b99809..7aaae32 100644
 --- a/include/linux/ieee80211.h
 +++ b/include/linux/ieee80211.h
 @@ -310,11 +310,9 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
@@ -30,7 +30,7 @@
  	u8 addr4[ETH_ALEN];
  } __packed __aligned(2);
 diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
-index 33001ec..277fec9 100644
+index e916130..c09147f 100644
 --- a/net/mac80211/rc80211_minstrel_ht.c
 +++ b/net/mac80211/rc80211_minstrel_ht.c
 @@ -10,7 +10,9 @@
@@ -66,10 +66,32 @@
  
  
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 95676d9..6f1d60a 100644
+index ff8afa5..0ed3f51 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -16457,9 +16457,11 @@ static const struct genl_ops nl80211_ops[] = {
+@@ -461,11 +461,6 @@ nl80211_sta_wme_policy[NL80211_STA_WME_MAX + 1] = {
+ 	[NL80211_STA_WME_MAX_SP] = { .type = NLA_U8 },
+ };
+ 
+-static struct netlink_range_validation nl80211_punct_bitmap_range = {
+-	.min = 0,
+-	.max = 0xffff,
+-};
+-
+ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
+ 	[0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
+ 	[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
+@@ -805,8 +800,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
+ 	[NL80211_ATTR_MLD_ADDR] = NLA_POLICY_EXACT_LEN(ETH_ALEN),
+ 	[NL80211_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG },
+ 	[NL80211_ATTR_MAX_NUM_AKM_SUITES] = { .type = NLA_REJECT },
+-	[NL80211_ATTR_PUNCT_BITMAP] =
+-		NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range),
++	[NL80211_ATTR_PUNCT_BITMAP] = NLA_POLICY_RANGE(NLA_U8, 0, 0xffff),
+ 
+ 	[NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS] = { .type = NLA_U16 },
+ 	[NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG },
+@@ -16687,9 +16681,11 @@ static const struct genl_ops nl80211_ops[] = {
  		/* can be retrieved by unprivileged users */
  		.internal_flags = IFLAGS(NL80211_FLAG_NEED_WIPHY),
  	},
@@ -81,7 +103,7 @@
  	{
  		.cmd = NL80211_CMD_SET_WIPHY,
  		.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
-@@ -17296,8 +17298,10 @@ static struct genl_family nl80211_fam __genl_ro_after_init = {
+@@ -17534,8 +17530,10 @@ static struct genl_family nl80211_fam __genl_ro_after_init = {
  	.module = THIS_MODULE,
  	.ops = nl80211_ops,
  	.n_ops = ARRAY_SIZE(nl80211_ops),
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0012-mac80211-mtk-track-obss-color-bitmap.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0012-mac80211-mtk-track-obss-color-bitmap.patch
index 607670c..31811d3 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0012-mac80211-mtk-track-obss-color-bitmap.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0012-mac80211-mtk-track-obss-color-bitmap.patch
@@ -1,7 +1,7 @@
-From a7b0e17e0dafe6cfe58f88465006cd0c9e7c3217 Mon Sep 17 00:00:00 2001
+From 529ea5156b39398b24801eabcb3f1531ca53d3ca Mon Sep 17 00:00:00 2001
 From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
 Date: Mon, 13 Mar 2023 05:23:37 +0800
-Subject: [PATCH 12/14] mac80211: mtk: track obss color bitmap
+Subject: [PATCH 12/21] mac80211: mtk: track obss color bitmap
 
 Track OBSS BSS color when receive their beacon.
 
@@ -9,17 +9,16 @@
 echo 1 > /sys/kernel/debug/tracing/events/mac80211/bss_color_bitmap/enable
 echo 1 > /sys/kernel/debug/tracing/events/mac80211/bss_color_collision/enable
 ---
- include/net/mac80211.h |  5 +++--
- net/mac80211/cfg.c     |  4 ++--
- net/mac80211/rx.c      |  9 +++++++--
+ include/net/mac80211.h |  1 +
+ net/mac80211/rx.c      |  6 +++++-
  net/mac80211/trace.h   | 21 +++++++++++++++++++++
- 4 files changed, 33 insertions(+), 6 deletions(-)
+ 3 files changed, 27 insertions(+), 1 deletion(-)
 
 diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 9208a8d..299425a 100644
+index 2c282e6..b90e828 100644
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -741,6 +741,7 @@ struct ieee80211_bss_conf {
+@@ -744,6 +744,7 @@ struct ieee80211_bss_conf {
  	} he_oper;
  	struct ieee80211_he_obss_pd he_obss_pd;
  	struct cfg80211_he_bss_color he_bss_color;
@@ -27,72 +26,30 @@
  	struct ieee80211_fils_discovery fils_discovery;
  	u32 unsol_bcast_probe_resp_interval;
  	struct cfg80211_bitrate_mask beacon_tx_rate;
-@@ -7269,7 +7270,7 @@ ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
- 					  struct ieee80211_vif *vif);
- 
- /**
-- * ieeee80211_obss_color_collision_notify - notify userland about a BSS color
-+ * ieee80211_obss_color_collision_notify - notify userland about a BSS color
-  * collision.
-  *
-  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
-@@ -7278,7 +7279,7 @@ ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
-  * @gfp: allocation flags
-  */
- void
--ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
-+ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
- 				       u64 color_bitmap, gfp_t gfp);
- 
- /**
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 36a2c8d..0ecc026 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -4750,7 +4750,7 @@ void ieee80211_color_change_finish(struct ieee80211_vif *vif)
- EXPORT_SYMBOL_GPL(ieee80211_color_change_finish);
- 
- void
--ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
-+ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
- 				       u64 color_bitmap, gfp_t gfp)
- {
- 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
-@@ -4770,7 +4770,7 @@ ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
- 				     &link->color_collision_detect_work,
- 				     msecs_to_jiffies(500));
- }
--EXPORT_SYMBOL_GPL(ieeee80211_obss_color_collision_notify);
-+EXPORT_SYMBOL_GPL(ieee80211_obss_color_collision_notify);
- 
- static int
- ieee80211_color_change(struct wiphy *wiphy, struct net_device *dev,
 diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
-index 54dcaf6..0048c22 100644
+index 56abe67..cf41b93 100644
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -3338,9 +3338,14 @@ ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
+@@ -3349,9 +3349,13 @@ ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
  
  		color = le32_get_bits(he_oper->he_oper_params,
  				      IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
 +
 +		bss_conf->used_color_bitmap |= BIT_ULL(color);
 +
-+		trace_bss_color_bitmap(color, bss_conf->used_color_bitmap);
-+
++		// trace_bss_color_bitmap(color, bss_conf->used_color_bitmap);
  		if (color == bss_conf->he_bss_color.color)
--			ieeee80211_obss_color_collision_notify(&rx->sdata->vif,
--							       BIT_ULL(color),
-+			ieee80211_obss_color_collision_notify(&rx->sdata->vif,
-+							       bss_conf->used_color_bitmap,
- 							       GFP_ATOMIC);
+ 			ieee80211_obss_color_collision_notify(&rx->sdata->vif,
+-							      BIT_ULL(color),
++							      bss_conf->used_color_bitmap,
+ 							      GFP_ATOMIC);
  	}
  }
 diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
-index de5d69f..cad6597 100644
+index b8c53b4..814aed6 100644
 --- a/net/mac80211/trace.h
 +++ b/net/mac80211/trace.h
-@@ -3058,6 +3058,27 @@ TRACE_EVENT(stop_queue,
+@@ -3060,6 +3060,27 @@ TRACE_EVENT(stop_queue,
  	)
  );
  
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0013-mac80211-mtk-ageout-color-bitmap.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0013-mac80211-mtk-ageout-color-bitmap.patch
index 34e1f5c..4531d85 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0013-mac80211-mtk-ageout-color-bitmap.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0013-mac80211-mtk-ageout-color-bitmap.patch
@@ -1,7 +1,7 @@
-From dd1fc5e8ea8df5f6a5e0b87957872053d13b3278 Mon Sep 17 00:00:00 2001
+From 31b5d2289d106c9d0f55ea501182080ca1d52a72 Mon Sep 17 00:00:00 2001
 From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
 Date: Mon, 13 Mar 2023 05:36:59 +0800
-Subject: [PATCH] mac80211: mtk: ageout color bitmap
+Subject: [PATCH 13/21] mac80211: mtk: ageout color bitmap
 
 Adding a periodic work which runs once per second to check BSS color.
 OBSS BSS Color will be ageout if not seen for 10 seconds.
@@ -11,14 +11,14 @@
  net/mac80211/ieee80211_i.h |  5 +++++
  net/mac80211/iface.c       |  5 +++++
  net/mac80211/link.c        |  2 ++
- net/mac80211/rx.c          |  3 ++-
- 6 files changed, 45 insertions(+), 1 deletion(-)
+ net/mac80211/rx.c          |  1 +
+ 6 files changed, 44 insertions(+)
 
 diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 299425a..b4f156e 100644
+index b90e828..6ff6d3a 100644
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -742,6 +742,7 @@ struct ieee80211_bss_conf {
+@@ -745,6 +745,7 @@ struct ieee80211_bss_conf {
  	struct ieee80211_he_obss_pd he_obss_pd;
  	struct cfg80211_he_bss_color he_bss_color;
  	u64 used_color_bitmap;
@@ -27,10 +27,10 @@
  	u32 unsol_bcast_probe_resp_interval;
  	struct cfg80211_bitrate_mask beacon_tx_rate;
 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 0ecc026..3c83024 100644
+index 8033b2f..177409d 100644
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -4817,6 +4817,36 @@ out:
+@@ -4881,6 +4881,36 @@ out:
  	return err;
  }
  
@@ -68,10 +68,10 @@
  ieee80211_set_radar_background(struct wiphy *wiphy,
  			       struct cfg80211_chan_def *chandef)
 diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
-index 04128d5..bf2c51e 100644
+index 7ca2482..1fa9641 100644
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -989,6 +989,7 @@ struct ieee80211_link_data {
+@@ -996,6 +996,7 @@ struct ieee80211_link_data {
  
  	struct work_struct color_change_finalize_work;
  	struct delayed_work color_collision_detect_work;
@@ -79,7 +79,7 @@
  	u64 color_bitmap;
  
  	/* context reservation -- protected with chanctx_mtx */
-@@ -1932,9 +1933,13 @@ void ieee80211_csa_finalize_work(struct work_struct *work);
+@@ -1993,9 +1994,13 @@ void ieee80211_csa_finalize_work(struct work_struct *work);
  int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
  			     struct cfg80211_csa_settings *params);
  
@@ -94,7 +94,7 @@
  /* interface handling */
  #define MAC80211_SUPPORTED_FEATURES_TX	(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
 diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
-index b82065c..6a300ab 100644
+index b8dfd32..e5b5e74 100644
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
 @@ -541,6 +541,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
@@ -105,7 +105,7 @@
  
  	if (sdata->wdev.cac_started) {
  		chandef = sdata->vif.bss_conf.chandef;
-@@ -1470,6 +1471,10 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
+@@ -1474,6 +1475,10 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
  
  	set_bit(SDATA_STATE_RUNNING, &sdata->state);
  
@@ -117,10 +117,10 @@
   err_del_interface:
  	drv_remove_interface(local, sdata);
 diff --git a/net/mac80211/link.c b/net/mac80211/link.c
-index a1b3031..7d4cdfb 100644
+index 6148208..2f64b69 100644
 --- a/net/mac80211/link.c
 +++ b/net/mac80211/link.c
-@@ -45,6 +45,8 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
+@@ -47,6 +47,8 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
  	INIT_LIST_HEAD(&link->reserved_chanctx_list);
  	INIT_DELAYED_WORK(&link->dfs_cac_timer_work,
  			  ieee80211_dfs_cac_timer_work);
@@ -130,20 +130,17 @@
  	if (!deflink) {
  		switch (sdata->vif.type) {
 diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
-index 0048c22..6b0fb01 100644
+index cf41b93..e245f31 100644
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -3340,8 +3340,9 @@ ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
+@@ -3351,6 +3351,7 @@ ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
  				      IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
  
  		bss_conf->used_color_bitmap |= BIT_ULL(color);
 +		bss_conf->color_last_seen[color] = jiffies;
  
--		trace_bss_color_bitmap(color, bss_conf->used_color_bitmap);
-+		/* trace_bss_color_bitmap(color, bss_conf->used_color_bitmap); */
- 
+ 		// trace_bss_color_bitmap(color, bss_conf->used_color_bitmap);
  		if (color == bss_conf->he_bss_color.color)
- 			ieee80211_obss_color_collision_notify(&rx->sdata->vif,
 -- 
 2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0014-mac80211-mtk-update-max_bssid_indicator-based-on-rea.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0014-mac80211-mtk-update-max_bssid_indicator-based-on-rea.patch
index 205d30d..8d2b34d 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0014-mac80211-mtk-update-max_bssid_indicator-based-on-rea.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0014-mac80211-mtk-update-max_bssid_indicator-based-on-rea.patch
@@ -1,7 +1,7 @@
-From 869bb0c749acc325ea6ecbf7513a90159d426602 Mon Sep 17 00:00:00 2001
+From 928dff74ea4777892a48de4d9a8e1385bf4cab81 Mon Sep 17 00:00:00 2001
 From: Evelyn Tsai <evelyn.tsai@mediatek.com>
 Date: Fri, 14 Apr 2023 05:05:17 +0800
-Subject: [PATCH 14/14] mac80211: mtk: update max_bssid_indicator based on real
+Subject: [PATCH 14/21] mac80211: mtk: update max_bssid_indicator based on real
  BSS numbers
 
 ---
@@ -9,12 +9,12 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 3c83024..d5ffa64 100644
+index 177409d..9724258 100644
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1152,8 +1152,7 @@ static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
- 		pos += struct_size(new->mbssid_ies, elem, mbssid->cnt);
- 		ieee80211_copy_mbssid_beacon(pos, new->mbssid_ies, mbssid);
+@@ -1194,8 +1194,7 @@ ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
+ 			ieee80211_copy_rnr_beacon(pos, new->rnr_ies, rnr);
+ 		}
  		/* update bssid_indicator */
 -		link_conf->bssid_indicator =
 -			ilog2(__roundup_pow_of_two(mbssid->cnt + 1));
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-mac80211-support-configurable-addba-resp-time.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-support-configurable-addba-resp-time.patch
similarity index 80%
rename from recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-mac80211-support-configurable-addba-resp-time.patch
rename to recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-support-configurable-addba-resp-time.patch
index 759d36b..de32d4e 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-mac80211-support-configurable-addba-resp-time.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0015-support-configurable-addba-resp-time.patch
@@ -1,14 +1,14 @@
-From 0236a4a01f3f3ed932ab326de0deef6911519dab Mon Sep 17 00:00:00 2001
+From 41a81ced950b4f97331f964b8ad67b773b5dcd7a Mon Sep 17 00:00:00 2001
 From: Lian Chen <lian.chen@mediatek.com>
 Date: Wed, 7 Jun 2023 15:30:34 +0800
-Subject: [PATCH] support configurable addba resp time.
+Subject: [PATCH 15/21] support configurable addba resp time.
 
 ---
  net/mac80211/agg-tx.c | 8 +++++++-
  1 file changed, 7 insertions(+), 1 deletion(-)
 
 diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
-index 6992c1f..ad0c0d6 100644
+index 80cd642..7f66e69 100644
 --- a/net/mac80211/agg-tx.c
 +++ b/net/mac80211/agg-tx.c
 @@ -16,10 +16,16 @@
@@ -28,8 +28,8 @@
  /**
   * DOC: TX A-MPDU aggregation
   *
-@@ -460,7 +466,7 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
- 	u16 buf_size;
+@@ -466,7 +472,7 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
+ 	lockdep_assert_held(&sta->ampdu_mlme.mtx);
  
  	/* activate the timer for the recipient's addBA response */
 -	mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL);
@@ -38,5 +38,5 @@
  	       sta->sta.addr, tid);
  
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0016-mac80211-mtk-add-sta-assisted-DFS-state-update-mecha.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0016-mac80211-mtk-add-sta-assisted-DFS-state-update-mecha.patch
index f14111c..945a5bd 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0016-mac80211-mtk-add-sta-assisted-DFS-state-update-mecha.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0016-mac80211-mtk-add-sta-assisted-DFS-state-update-mecha.patch
@@ -1,7 +1,8 @@
-From e545285e24de95d0d620bb7e9c97abba39e363b9 Mon Sep 17 00:00:00 2001
+From e2aa2e712fbebfbbb2338debd632d83157d72e92 Mon Sep 17 00:00:00 2001
 From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 Date: Mon, 20 Feb 2023 14:25:24 +0800
-Subject: [PATCH] mac80211: mtk: add sta-assisted DFS state update mechanism
+Subject: [PATCH 16/21] mac80211: mtk: add sta-assisted DFS state update
+ mechanism
 
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 ---
@@ -12,10 +13,10 @@
  4 files changed, 92 insertions(+)
 
 diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 84564bd..06d1567 100644
+index cd0ec8a..2c51c3e 100644
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -8180,6 +8180,20 @@ void cfg80211_cac_event(struct net_device *netdev,
+@@ -8430,6 +8430,20 @@ void cfg80211_cac_event(struct net_device *netdev,
  			const struct cfg80211_chan_def *chandef,
  			enum nl80211_radar_event event, gfp_t gfp);
  
@@ -37,10 +38,10 @@
   * cfg80211_background_cac_abort - Channel Availability Check offchan abort event
   * @wiphy: the wiphy
 diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
-index bd26a06..e453d64 100644
+index 72ef4d9..60c6f79 100644
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -6565,6 +6565,10 @@ enum nl80211_smps_mode {
+@@ -6671,6 +6671,10 @@ enum nl80211_smps_mode {
   *	applicable for ETSI dfs domain where pre-CAC is valid for ever.
   * @NL80211_RADAR_CAC_STARTED: Channel Availability Check has been started,
   *	should be generated by HW if NL80211_EXT_FEATURE_DFS_OFFLOAD is enabled.
@@ -51,7 +52,7 @@
   */
  enum nl80211_radar_event {
  	NL80211_RADAR_DETECTED,
-@@ -6573,6 +6577,8 @@ enum nl80211_radar_event {
+@@ -6679,6 +6683,8 @@ enum nl80211_radar_event {
  	NL80211_RADAR_NOP_FINISHED,
  	NL80211_RADAR_PRE_CAC_EXPIRED,
  	NL80211_RADAR_CAC_STARTED,
@@ -61,10 +62,10 @@
  
  /**
 diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index 72d153f..5a3dd31 100644
+index 86f762d..df39a8b 100644
 --- a/net/mac80211/mlme.c
 +++ b/net/mac80211/mlme.c
-@@ -1987,6 +1987,11 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
+@@ -1981,6 +1981,11 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
  					  IEEE80211_QUEUE_STOP_REASON_CSA);
  	mutex_unlock(&local->mtx);
  
@@ -73,13 +74,13 @@
 +				      &link->csa_chandef,
 +				      sdata->vif.cfg.assoc);
 +
- 	cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, 0,
- 					  csa_ie.count, csa_ie.mode, 0);
- 
-@@ -3072,6 +3077,10 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
+ 	cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef,
+ 					  link->link_id, csa_ie.count,
+ 					  csa_ie.mode, 0);
+@@ -3066,6 +3071,10 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
  	       sizeof(sdata->vif.bss_conf.tx_pwr_env));
  
- 	ieee80211_vif_set_links(sdata, 0);
+ 	ieee80211_vif_set_links(sdata, 0, 0);
 +
 +	cfg80211_sta_update_dfs_state(&sdata->wdev,
 +				      &sdata->vif.bss_conf.chandef,
@@ -87,7 +88,7 @@
  }
  
  static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
-@@ -5276,6 +5285,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
+@@ -5445,6 +5454,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
  		event.u.mlme.status = MLME_SUCCESS;
  		drv_event_callback(sdata->local, sdata, &event);
  		sdata_info(sdata, "associated\n");
@@ -98,7 +99,7 @@
  		info.success = 1;
  	}
 diff --git a/net/wireless/chan.c b/net/wireless/chan.c
-index fef0ba5..13276bc 100644
+index caa5acc..a7e597d 100644
 --- a/net/wireless/chan.c
 +++ b/net/wireless/chan.c
 @@ -14,6 +14,7 @@
@@ -109,7 +110,7 @@
  
  static bool cfg80211_valid_60g_freq(u32 freq)
  {
-@@ -1436,6 +1437,65 @@ bool cfg80211_any_usable_channels(struct wiphy *wiphy,
+@@ -1437,6 +1438,65 @@ bool cfg80211_any_usable_channels(struct wiphy *wiphy,
  }
  EXPORT_SYMBOL(cfg80211_any_usable_channels);
  
@@ -176,5 +177,5 @@
  				       unsigned int link_id)
  {
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0017-nl80211-mtk-Mark-DFS-channel-as-available-for-CSA.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0017-nl80211-mtk-Mark-DFS-channel-as-available-for-CSA.patch
index cdc6290..92686c5 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0017-nl80211-mtk-Mark-DFS-channel-as-available-for-CSA.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0017-nl80211-mtk-Mark-DFS-channel-as-available-for-CSA.patch
@@ -1,17 +1,17 @@
-From 4c78e6469da8de9c4584d029231938063545b031 Mon Sep 17 00:00:00 2001
+From 532a2d6aacdd960d8f9f046f5862cae740b160b5 Mon Sep 17 00:00:00 2001
 From: "himanshu.goyal" <himanshu.goyal@mediatek.com>
 Date: Fri, 17 Mar 2023 17:36:01 +0800
-Subject: [PATCH] nl80211: mtk: Mark DFS channel as available for CSA.
+Subject: [PATCH 17/21] nl80211: mtk: Mark DFS channel as available for CSA.
 
 ---
  net/wireless/nl80211.c | 5 +++++
  1 file changed, 5 insertions(+)
 
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index af43c22..53f32c6 100644
+index 0ed3f51..d8e4d0f 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -10079,6 +10079,11 @@ skip_beacons:
+@@ -10250,6 +10250,11 @@ skip_beacons:
  	if (err)
  		goto free;
  
@@ -24,5 +24,5 @@
  					   wdev->iftype)) {
  		err = -EINVAL;
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0018-cfg80211-mtk-fix-early-return-in-cfg80211_stop_backg.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0018-cfg80211-mtk-fix-early-return-in-cfg80211_stop_backg.patch
index d57273b..810054d 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0018-cfg80211-mtk-fix-early-return-in-cfg80211_stop_backg.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0018-cfg80211-mtk-fix-early-return-in-cfg80211_stop_backg.patch
@@ -1,7 +1,7 @@
-From 435bf8765d44b694b86a400fb128fcf6d72b8aa6 Mon Sep 17 00:00:00 2001
+From ca445932b19fb346ea7cb33a5d23d94f979a2603 Mon Sep 17 00:00:00 2001
 From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 Date: Thu, 27 Jul 2023 10:25:59 +0800
-Subject: [PATCH 18/19] cfg80211: mtk: fix early return in
+Subject: [PATCH 18/21] cfg80211: mtk: fix early return in
  cfg80211_stop_background_radar_detection
 
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
-index 57b9bde..c2cf8aa 100644
+index e3cbfc0..d345c72 100644
 --- a/net/wireless/mlme.c
 +++ b/net/wireless/mlme.c
-@@ -1145,9 +1145,9 @@ void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
+@@ -1169,9 +1169,9 @@ void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
  		return;
  
  	rdev_set_radar_background(rdev, NULL);
@@ -25,5 +25,5 @@
 +	rdev->background_radar_wdev = NULL; /* Release offchain ownership */
  }
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0019-cfg80211-mtk-add-background-radar-stop-when-backgrou.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0019-cfg80211-mtk-add-background-radar-stop-when-backgrou.patch
index 66d4d10..a07ea82 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0019-cfg80211-mtk-add-background-radar-stop-when-backgrou.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0019-cfg80211-mtk-add-background-radar-stop-when-backgrou.patch
@@ -1,7 +1,7 @@
-From 818c8f1d1a9ff9e5423ed0927b052692c282fdf4 Mon Sep 17 00:00:00 2001
+From a97cd11f1654844ed431aa359eca83fa844883c0 Mon Sep 17 00:00:00 2001
 From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 Date: Thu, 27 Jul 2023 10:27:04 +0800
-Subject: [PATCH 19/19] cfg80211: mtk: add background radar stop when
+Subject: [PATCH 19/21] cfg80211: mtk: add background radar stop when
  background channel is overlapped with operating channel
 
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 4 insertions(+)
 
 diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 53f32c6..ab61f8f 100644
+index d8e4d0f..4692480 100644
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -9852,6 +9852,10 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
+@@ -10021,6 +10021,10 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
  		wdev->cac_started = true;
  		wdev->cac_start_time = jiffies;
  		wdev->cac_time_ms = cac_time_ms;
@@ -25,5 +25,5 @@
  unlock:
  	wiphy_unlock(wiphy);
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0020-mac80211-mtk-avoid-kernel-warning-of-check_flush_dep.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0020-mac80211-mtk-avoid-kernel-warning-of-check_flush_dep.patch
index cc72cf9..3ac2f2c 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0020-mac80211-mtk-avoid-kernel-warning-of-check_flush_dep.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0020-mac80211-mtk-avoid-kernel-warning-of-check_flush_dep.patch
@@ -1,7 +1,7 @@
-From 6e6ceea486d4bd12a2d4118905d8fc0ba5eec6f6 Mon Sep 17 00:00:00 2001
+From f386c3a87f050489992ca66b8b17e970dc4a1ec1 Mon Sep 17 00:00:00 2001
 From: Evelyn Tsai <evelyn.tsai@mediatek.com>
 Date: Thu, 3 Aug 2023 07:17:44 +0800
-Subject: [PATCH 1/7] mac80211: mtk: avoid kernel warning of
+Subject: [PATCH 20/21] mac80211: mtk: avoid kernel warning of
  check_flush_dependency
 
 ---
@@ -9,10 +9,10 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/net/mac80211/main.c b/net/mac80211/main.c
-index 06d111d..8965fff 100644
+index 0188e6a..ba133fa 100644
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -1276,7 +1276,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
+@@ -1291,7 +1291,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
  		hw->queues = IEEE80211_MAX_QUEUES;
  
  	local->workqueue =
@@ -22,5 +22,5 @@
  		result = -ENOMEM;
  		goto fail_workqueue;
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0021-mac80211-mtk-avoid-calling-switch_vif_chanctx-when-u.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0021-mac80211-mtk-avoid-calling-switch_vif_chanctx-when-u.patch
index d9fcacf..11bc559 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0021-mac80211-mtk-avoid-calling-switch_vif_chanctx-when-u.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0021-mac80211-mtk-avoid-calling-switch_vif_chanctx-when-u.patch
@@ -1,7 +1,7 @@
-From d5104c3407f3f1d476d072a8242ba40cc96ae566 Mon Sep 17 00:00:00 2001
+From 244189a8c4412ac16301678a7683f4eb2545d657 Mon Sep 17 00:00:00 2001
 From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
 Date: Mon, 7 Aug 2023 19:00:53 +0800
-Subject: [PATCH] mac80211: mtk: avoid calling switch_vif_chanctx when
+Subject: [PATCH 21/21] mac80211: mtk: avoid calling switch_vif_chanctx when
  use_chanctx is false
 
 Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 8 insertions(+), 6 deletions(-)
 
 diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
-index dbc34fb..f9d1a8a 100644
+index 6895275..96f1ad0 100644
 --- a/net/mac80211/chan.c
 +++ b/net/mac80211/chan.c
-@@ -1280,13 +1280,15 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)
+@@ -1304,13 +1304,15 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)
  	list_del(&link->reserved_chanctx_list);
  	link->reserved_chanctx = NULL;
  
@@ -36,5 +36,5 @@
  
  	list_move(&link->assigned_chanctx_list, &new_ctx->assigned_links);
 -- 
-2.18.0
+2.39.2
 
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0022-mac80211-mtk-Add-utilities-for-converting-op_class.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0022-mac80211-mtk-Add-utilities-for-converting-op_class.patch
new file mode 100644
index 0000000..e32ba2f
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0022-mac80211-mtk-Add-utilities-for-converting-op_class.patch
@@ -0,0 +1,201 @@
+From 979c688e54a73cfedb8757881a95c4f6c795023a Mon Sep 17 00:00:00 2001
+From: Michael-CY Lee <michael-cy.lee@mediatek.com>
+Date: Mon, 14 Aug 2023 18:03:29 +0800
+Subject: mac80211: mtk: Add utilities for converting op_class
+
+These utilities include converting op_class to nl80211 channel width and
+center frequency.
+
+Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
+---
+ include/net/cfg80211.h |  25 ++++++++
+ net/wireless/util.c    | 130 ++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 154 insertions(+), 1 deletion(-)
+
+diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
+index cfaa3d6..bea7d25 100644
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -8693,6 +8693,31 @@ void cfg80211_ch_switch_started_notify(struct net_device *dev,
+ bool ieee80211_operating_class_to_band(u8 operating_class,
+ 				       enum nl80211_band *band);
+ 
++/**
++ * ieee80211_operating_class_to_center_freq - convert operating class to
++ * center frequency
++ *
++ * @operating_class: the operating class to convert
++ * @chan: the ieee80211_channel to convert
++ * @center_freq1: cneter frequency 1 pointer to fill
++ * @center_freq2: cneter frequency 2 pointer to fill
++ *
++ * Returns %true if the conversion was successful, %false otherwise.
++ */
++bool ieee80211_operating_class_to_center_freq(u8 operating_class,
++					      struct ieee80211_channel *chan,
++					      u32 *center_freq1,
++					      u32 *center_freq2);
++
++/**
++ * ieee80211_operating_class_to_chan_width - convert operating class to
++ * nl80211 channel width
++ *
++ * @operating_class: the operating class to convert
++ */
++enum nl80211_chan_width
++ieee80211_operating_class_to_chan_width(u8 operating_class);
++
+ /**
+  * ieee80211_chandef_to_operating_class - convert chandef to operation class
+  *
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index 1783ab9..13cb986 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -1981,7 +1981,7 @@ bool ieee80211_operating_class_to_band(u8 operating_class,
+ 	case 128 ... 130:
+ 		*band = NL80211_BAND_5GHZ;
+ 		return true;
+-	case 131 ... 135:
++	case 131 ... 137:
+ 		*band = NL80211_BAND_6GHZ;
+ 		return true;
+ 	case 81:
+@@ -1999,6 +1999,134 @@ bool ieee80211_operating_class_to_band(u8 operating_class,
+ }
+ EXPORT_SYMBOL(ieee80211_operating_class_to_band);
+ 
++bool ieee80211_operating_class_to_center_freq(u8 operating_class,
++					      struct ieee80211_channel *chan,
++					      u32 *center_freq1,
++					      u32 *center_freq2)
++{
++	u32 control_freq, offset;
++	enum nl80211_band band;
++
++	control_freq = chan->center_freq;
++	if (!ieee80211_operating_class_to_band(operating_class, &band))
++		return false;
++
++	if (band != chan->band)
++		return false;
++
++	if (control_freq >= 5955)
++		offset = control_freq - 5955;
++	else if (control_freq >= 5745)
++		offset = control_freq - 5745;
++	else if (control_freq >= 5180)
++		offset = control_freq - 5180;
++	offset /= 20;
++
++	*center_freq2 = 0;
++	switch (operating_class) {
++	case 81:  /* 2 GHz band; 20 MHz; channels 1..13 */
++	case 82:  /* 2 GHz band; 20 MHz; channel 14 */
++	case 115: /* 5 GHz band; 20 MHz; channels 36,40,44,48 */
++	case 118: /* 5 GHz band; 20 MHz; channels 52,56,60,64 */
++	case 121: /* 5 GHz band; 20 MHz; channels 100..144 */
++	case 124: /* 5 GHz band; 20 MHz; channels 149,153,157,161 */
++	case 125: /* 5 GHz band; 20 MHz; channels 149..177 */
++	case 131: /* 6 GHz band; 20 MHz; channels 1..233*/
++	case 136: /* 6 GHz band; 20 MHz; channel 2 */
++		*center_freq1 = control_freq;
++		return true;
++	case 83:  /* 2 GHz band; 40 MHz; channels 1..9 */
++	case 116: /* 5 GHz band; 40 MHz; channels 36,44 */
++	case 119: /* 5 GHz band; 40 MHz; channels 52,60 */
++	case 122: /* 5 GHz band; 40 MHz; channels 100,108,116,124,132,140 */
++	case 126: /* 5 GHz band; 40 MHz; channels 149,157,165,173 */
++		*center_freq1 = control_freq + 10;
++		return true;
++	case 84:  /* 2 GHz band; 40 MHz; channels 5..13 */
++	case 117: /* 5 GHz band; 40 MHz; channels 40,48 */
++	case 120: /* 5 GHz band; 40 MHz; channels 56,64 */
++	case 123: /* 5 GHz band; 40 MHz; channels 104,112,120,128,136,144 */
++	case 127: /* 5 GHz band; 40 MHz; channels 153,161,169,177 */
++		*center_freq1 = control_freq - 10;
++		return true;
++	case 132: /* 6 GHz band; 40 MHz; channels 1,5,..,229*/
++		*center_freq1 = control_freq + 10 - (offset & 1) * 20;
++		return true;
++	case 128: /* 5 GHz band; 80 MHz; channels 36..64,100..144,149..177 */
++		*center_freq1 = control_freq + 30 - (offset & 3) * 20;
++		return true;
++	case 130: /* 5 GHz band; 80+80 MHz; channels 36..64,100..144,149..177 */
++		/* TODO How to know the center_freq2 of 80+80 MHz?*/
++		*center_freq1 = 0;
++		return false;
++	case 133: /* 6 GHz band; 80 MHz; channels 1,5,..,229 */
++		*center_freq1 = control_freq + 30 - (offset & 3) * 20;
++		return true;
++	case 129: /* 5 GHz band; 160 MHz; channels 36..64,100..144,149..177 */
++		*center_freq1 = control_freq + 70 - (offset & 7) * 20;
++		return true;
++	case 134: /* 6 GHz band; 160 MHz; channels 1,5,..,229 */
++		*center_freq1 = control_freq + 70 - (offset & 7) * 20;
++		return true;
++	case 135: /* 6 GHz band; 80+80 MHz; channels 1,5,..,229 */
++		/* TODO How to know the center_freq2 of 80+80 MHz?*/
++		*center_freq1 = 0;
++		return false;
++	case 137: /* 6 GHz band; 320 MHz; channels 1,5,..,229 */
++		/* TODO it's 320-1 or 320-2 channelization? */
++		/* Currently convert to 320-1 */
++		*center_freq1 = control_freq + 150 - (offset & 15) * 20;
++		return true;
++	default:
++		return false;
++	}
++}
++EXPORT_SYMBOL(ieee80211_operating_class_to_center_freq);
++
++enum nl80211_chan_width
++ieee80211_operating_class_to_chan_width(u8 operating_class)
++{
++	switch (operating_class) {
++	case 81:  /* 2 GHz band; 20 MHz; channels 1..13 */
++	case 82:  /* 2 GHz band; 20 MHz; channel 14 */
++	case 115: /* 5 GHz band; 20 MHz; channels 36,40,44,48 */
++	case 118: /* 5 GHz band; 20 MHz; channels 52,56,60,64 */
++	case 121: /* 5 GHz band; 20 MHz; channels 100..144 */
++	case 124: /* 5 GHz band; 20 MHz; channels 149,153,157,161 */
++	case 125: /* 5 GHz band; 20 MHz; channels 149..177 */
++	case 131: /* 6 GHz band; 20 MHz; channels 1..233*/
++	case 136: /* 6 GHz band; 20 MHz; channel 2 */
++		return NL80211_CHAN_WIDTH_20;
++	case 83:  /* 2 GHz band; 40 MHz; channels 1..9 */
++	case 84:  /* 2 GHz band; 40 MHz; channels 5..13 */
++	case 116: /* 5 GHz band; 40 MHz; channels 36,44 */
++	case 117: /* 5 GHz band; 40 MHz; channels 40,48 */
++	case 119: /* 5 GHz band; 40 MHz; channels 52,60 */
++	case 120: /* 5 GHz band; 40 MHz; channels 56,64 */
++	case 122: /* 5 GHz band; 40 MHz; channels 100,108,116,124,132,140 */
++	case 123: /* 5 GHz band; 40 MHz; channels 104,112,120,128,136,144 */
++	case 126: /* 5 GHz band; 40 MHz; channels 149,157,165,173 */
++	case 127: /* 5 GHz band; 40 MHz; channels 153,161,169,177 */
++	case 132: /* 6 GHz band; 40 MHz; channels 1,5,..,229*/
++		return NL80211_CHAN_WIDTH_40;
++	case 128: /* 5 GHz band; 80 MHz; channels 36..64,100..144,149..177 */
++	case 133: /* 6 GHz band; 80 MHz; channels 1,5,..,229 */
++		return NL80211_CHAN_WIDTH_80;
++	case 130: /* 5 GHz band; 80+80 MHz; channels 36..64,100..144,149..177 */
++	case 135: /* 6 GHz band; 80+80 MHz; channels 1,5,..,229 */
++		return NL80211_CHAN_WIDTH_80P80;
++	case 129: /* 5 GHz band; 160 MHz; channels 36..64,100..144,149..177 */
++	case 134: /* 6 GHz band; 160 MHz; channels 1,5,..,229 */
++		return NL80211_CHAN_WIDTH_160;
++	case 137: /* 6 GHz band; 320 MHz; channels 1,5,..,229 */
++		return NL80211_CHAN_WIDTH_320;
++	default:
++		WARN_ON(1);
++		return NL80211_CHAN_WIDTH_20_NOHT;
++	}
++}
++EXPORT_SYMBOL(ieee80211_operating_class_to_chan_width);
++
+ bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef,
+ 					  u8 *op_class)
+ {
+-- 
+2.25.1
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0023-mac80211-mtk-change-STA-CSA-parsing-flows.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0023-mac80211-mtk-change-STA-CSA-parsing-flows.patch
new file mode 100644
index 0000000..54b59e1
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-0023-mac80211-mtk-change-STA-CSA-parsing-flows.patch
@@ -0,0 +1,598 @@
+From e7247da28b7d7e90abd9ced10438df1cbe59af7e Mon Sep 17 00:00:00 2001
+From: Michael-CY Lee <michael-cy.lee@mediatek.com>
+Date: Thu, 28 Sep 2023 09:28:50 +0800
+Subject: mac80211: mtk: refactor STA CSA parsing flows
+
+This patch changes the flows when STA parses csa IE:
+
+1. If Extended CSA IE is presented, this patch uses the subfield op_class
+   to build the VHT and HE operation in 5 GHz and 6 GHz, respectively.
+2. If Extended CSA IE is NOT presented but the Wide Bandwidth Channel
+   Switch IE is presented, the new channel width is at least 40 MHz.
+   Therefore this patch first prepares a 40 MHz chandef, then build the
+   VHT and HE operation in 5 GHz and 6 GHz, respectively.
+   Note that in a 6 GHz BSS, the subfield of Wide Bandwidth Channel Switch
+   IE might be the VHT, deprecated VHT or HE operation, so this patch
+   checks the combination of new channel width, ccfs0 and ccfs1 to build
+   the correct HE operation.
+3. From the HE/VHT operation created in step 1 or 2, this patch then
+   creates the chandef and assigns it to csa_ie.
+
+Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
+---
+ net/mac80211/spectmgmt.c | 508 ++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 454 insertions(+), 54 deletions(-)
+
+diff --git a/net/mac80211/spectmgmt.c b/net/mac80211/spectmgmt.c
+index 871cdac..dee7a60 100644
+--- a/net/mac80211/spectmgmt.c
++++ b/net/mac80211/spectmgmt.c
+@@ -19,6 +19,332 @@
+ #include "sta_info.h"
+ #include "wme.h"
+ 
++static inline void
++op_class_to_6ghz_he_eht_oper(u8 op_class, struct ieee80211_channel *chan,
++			     struct ieee80211_he_operation *he_oper,
++			     struct ieee80211_eht_operation *eht_oper)
++{
++	u8 new_chan_width;
++	u32 he_oper_params, center_freq1 = 0, center_freq2 = 0;
++	struct ieee80211_he_6ghz_oper *he_6ghz_oper;
++	struct ieee80211_eht_operation_info *eht_oper_info;
++
++	new_chan_width = ieee80211_operating_class_to_chan_width(op_class);
++	if (!ieee80211_operating_class_to_center_freq(op_class, chan,
++						      &center_freq1,
++						      &center_freq2)) {
++		new_chan_width = NL80211_CHAN_WIDTH_20;
++		center_freq1 = chan->center_freq;
++	}
++
++	he_oper_params =
++		u32_encode_bits(1, IEEE80211_HE_OPERATION_6GHZ_OP_INFO);
++	he_oper->he_oper_params = cpu_to_le32(he_oper_params);
++
++	he_6ghz_oper = (struct ieee80211_he_6ghz_oper *)he_oper->optional;
++	he_6ghz_oper->primary =
++		ieee80211_frequency_to_channel(chan->center_freq);
++	he_6ghz_oper->ccfs0 = ieee80211_frequency_to_channel(center_freq1);
++	he_6ghz_oper->ccfs1 = center_freq2 ?
++		ieee80211_frequency_to_channel(center_freq2) : 0;
++
++	switch (new_chan_width) {
++	case NL80211_CHAN_WIDTH_320:
++		/* Cannot derive center frequency for 320 MHZ from op_class
++		 * since it might be 320-1 or 320-2
++		 */
++		WARN_ON(1);
++		break;
++	case NL80211_CHAN_WIDTH_160:
++		he_6ghz_oper->ccfs1 = he_6ghz_oper->ccfs0;
++		he_6ghz_oper->ccfs0 += chan->center_freq < center_freq1 ? -8 : 8;
++		fallthrough;
++	case NL80211_CHAN_WIDTH_80P80:
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
++		break;
++	case NL80211_CHAN_WIDTH_80:
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ;
++		break;
++	case NL80211_CHAN_WIDTH_40:
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ;
++		break;
++	default:
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ;
++		break;
++	}
++
++	eht_oper->params = IEEE80211_EHT_OPER_INFO_PRESENT;
++
++	eht_oper_info =
++		(struct ieee80211_eht_operation_info *)eht_oper->optional;
++	eht_oper_info->control = he_6ghz_oper->control;
++	eht_oper_info->ccfs0 = he_6ghz_oper->ccfs0;
++	eht_oper_info->ccfs1 = he_6ghz_oper->ccfs1;
++}
++
++static inline void
++wbcs_ie_to_6ghz_he_eht_oper(const struct ieee80211_wide_bw_chansw_ie *wbcs_ie,
++			    u8 new_chan_no,
++			    struct ieee80211_he_operation *he_oper,
++			    struct ieee80211_eht_operation *eht_oper)
++{
++	u32 he_oper_params;
++	struct ieee80211_he_6ghz_oper *he_6ghz_oper;
++	struct ieee80211_eht_operation_info *eht_oper_info;
++	bool fallback_20mhz;
++	u8 ccfs_diff;
++
++	he_oper_params =
++		u32_encode_bits(1, IEEE80211_HE_OPERATION_6GHZ_OP_INFO);
++	he_oper->he_oper_params = cpu_to_le32(he_oper_params);
++
++	he_6ghz_oper = (struct ieee80211_he_6ghz_oper *)he_oper->optional;
++	he_6ghz_oper->primary = new_chan_no;
++
++	/* The Wide Bandwidth Channel Switch IE in a 6 GHz BSS migth be
++	 * deprecated VHT operation, VHT operation (IEEE 802.11-2020 9.4.2.160)
++	 * or HE operation (IEEE P80211be D3.2 9.4.2.159).
++	 * Check the combination of width, ccfs0 and ccfs1 to build the correct
++	 * HE/EHT operation.
++	 */
++	he_6ghz_oper->ccfs0 = wbcs_ie->new_center_freq_seg0;
++	he_6ghz_oper->ccfs1 = wbcs_ie->new_center_freq_seg1;
++	switch (wbcs_ie->new_channel_width) {
++	case 0:
++		/* Must be [deprecated] VHT operation with 40 MHz bandwidth */
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ;
++		break;
++	case 1:
++		if (he_6ghz_oper->ccfs1) {
++			/* VHT operation with 160/80P80 MHz bandwidth */
++			he_6ghz_oper->control =
++				IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
++		} else if ((he_6ghz_oper->ccfs0 - 7) % 16 == 0) {
++			/* [deprecated] VHT operation with 80 MHz bandwidth */
++			he_6ghz_oper->control =
++				IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ;
++		} else {
++			/* HE operation with 40 MHz bandwidth */
++			he_6ghz_oper->control =
++				IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ;
++		}
++		break;
++	case 2:
++		if ((he_6ghz_oper->ccfs0 - 15) % 32 == 0) {
++			/* deprecated VHT operation with 160 MHz bandwidth */
++			he_6ghz_oper->control =
++				IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
++			he_6ghz_oper->ccfs1 = he_6ghz_oper->ccfs0;
++			he_6ghz_oper->ccfs0 +=
++				new_chan_no < he_6ghz_oper->ccfs0 ? -8 : 8;
++		} else {
++			/* HE operation with 80 MHz bandwidth */
++			he_6ghz_oper->control =
++				IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ;
++		}
++		break;
++	case 3:
++		/* Can be
++		 * 1. deprecated VHT operation with 80P80 MHz bandwidth
++		 * 2. HE operation with 160/80P80 MHz bandwidth
++		 */
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
++		break;
++	case 4:
++		/* 320 MHz bandwidth
++		 * TODO channel switch to 320 MHz bandwidth should be indiated
++		 * by Bandwidth Indication IE (IEEE P80211be D3.2 9.4.2.159)
++		 */
++		he_6ghz_oper->control = IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ;
++		break;
++	default:
++		/* Ignore invalid width */
++		break;
++	}
++
++	/* Validate the relationship between new channel width and center frequency
++	 * segments, and fallback to 20 MHz if the relationship is wrong.
++	 */
++	fallback_20mhz = false;
++	switch (he_6ghz_oper->control) {
++	case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ:
++		if ((he_6ghz_oper->ccfs0 - 3) % 8 != 0)
++			fallback_20mhz = true;
++		break;
++	case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ:
++		if ((he_6ghz_oper->ccfs0 - 7) % 16 != 0)
++			fallback_20mhz = true;
++		break;
++	case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ:
++		ccfs_diff = abs(he_6ghz_oper->ccfs1 - he_6ghz_oper->ccfs0);
++		if ((ccfs_diff == 8 && (he_6ghz_oper->ccfs1 - 15) % 32 != 0) ||
++		    (ccfs_diff > 16 && ((he_6ghz_oper->ccfs0 - 7) % 16 != 0 ||
++		    (he_6ghz_oper->ccfs1 - 7) % 16 != 0)))
++			fallback_20mhz = true;
++		break;
++	case IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ:
++		if ((he_6ghz_oper->ccfs1 - 31) % 32 != 0)
++			fallback_20mhz = true;
++		break;
++	}
++
++	if (fallback_20mhz) {
++		he_6ghz_oper->control =
++			IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ;
++		he_6ghz_oper->ccfs0 = he_6ghz_oper->primary;
++		he_6ghz_oper->ccfs1 = 0;
++	}
++
++	eht_oper->params = IEEE80211_EHT_OPER_INFO_PRESENT;
++	eht_oper_info =
++		(struct ieee80211_eht_operation_info *)eht_oper->optional;
++	eht_oper_info->control = he_6ghz_oper->control;
++	eht_oper_info->ccfs0 = he_6ghz_oper->ccfs0;
++	eht_oper_info->ccfs1 = he_6ghz_oper->ccfs1;
++}
++
++static inline void
++op_class_to_ht_vht_oper(u8 op_class, struct ieee80211_channel *chan,
++			struct ieee80211_ht_operation *ht_oper,
++			struct ieee80211_vht_operation *vht_oper)
++{
++	u8 new_chan_width;
++	u32 center_freq1 = 0, center_freq2 = 0;
++
++	new_chan_width = ieee80211_operating_class_to_chan_width(op_class);
++	if (!ieee80211_operating_class_to_center_freq(op_class, chan,
++						      &center_freq1,
++						      &center_freq2)) {
++		new_chan_width = NL80211_CHAN_WIDTH_20;
++		center_freq1 = chan->center_freq;
++	}
++
++	vht_oper->center_freq_seg0_idx =
++		ieee80211_frequency_to_channel(center_freq1);
++	vht_oper->center_freq_seg1_idx = center_freq2 ?
++		ieee80211_frequency_to_channel(center_freq2) : 0;
++
++	ht_oper->ht_param = (chan->center_freq / 20) & 1 ?
++				IEEE80211_HT_PARAM_CHA_SEC_ABOVE :
++				IEEE80211_HT_PARAM_CHA_SEC_BELOW;
++
++	switch (new_chan_width) {
++	case NL80211_CHAN_WIDTH_320:
++		WARN_ON(1);
++		break;
++	case NL80211_CHAN_WIDTH_160:
++		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
++		vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx;
++		vht_oper->center_freq_seg0_idx +=
++			chan->center_freq < center_freq1 ? -8 : 8;
++		break;
++	case NL80211_CHAN_WIDTH_80P80:
++		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
++		break;
++	case NL80211_CHAN_WIDTH_80:
++		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
++		break;
++	default:
++		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
++		if (chan->center_freq != center_freq1)
++			ht_oper->ht_param = chan->center_freq > center_freq1 ?
++				IEEE80211_HT_PARAM_CHA_SEC_BELOW :
++				IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
++		else
++			ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
++	}
++
++	ht_oper->operation_mode =
++		cpu_to_le16(vht_oper->center_freq_seg1_idx <<
++				IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
++}
++
++static inline void
++wbcs_ie_to_ht_vht_oper(struct ieee80211_channel *chan,
++		       const struct ieee80211_wide_bw_chansw_ie *wbcs_ie,
++		       struct ieee80211_ht_operation *ht_oper,
++		       struct ieee80211_vht_operation *vht_oper)
++{
++	u8 new_chan_width, new_ccfs0, new_ccfs1;
++	bool fallback_20mhz;
++
++	new_chan_width = wbcs_ie->new_channel_width;
++	new_ccfs0 = wbcs_ie->new_center_freq_seg0;
++	new_ccfs1 = wbcs_ie->new_center_freq_seg1;
++
++	/* Validate the relationship between new channel width and center frequency
++	 * segments, and fallback to 20 MHz if the relationship is wrong.
++	 */
++	fallback_20mhz = false;
++	switch (new_chan_width) {
++	case IEEE80211_VHT_CHANWIDTH_USE_HT:
++		/* If the wide bandwidth channel switch IE is presented,
++		 * the new channel width is at least 40 MHz.
++		 */
++		if (!new_ccfs1) {
++			new_ccfs0 -= (new_ccfs0 >= 149) ? 151 : 38;
++			if (new_ccfs0 % 8 != 0)
++				fallback_20mhz = true;
++		} else {
++			fallback_20mhz = true;
++		}
++		break;
++	case IEEE80211_VHT_CHANWIDTH_80MHZ:
++		if (!new_ccfs1) {
++			new_ccfs0 -= (new_ccfs0 >= 149) ? 155 : 42;
++			if (new_ccfs0 % 16 != 0)
++				fallback_20mhz = true;
++			break;
++		} else if (abs(new_ccfs1 - new_ccfs0) == 8) {
++			new_ccfs0 = new_ccfs1;
++			new_ccfs1 = 0;
++		}
++		fallthrough;
++	case IEEE80211_VHT_CHANWIDTH_160MHZ:
++		if (!new_ccfs1) {
++			if (new_ccfs0 != 50 && new_ccfs0 != 114 && new_ccfs0 != 163)
++				fallback_20mhz = true;
++			break;
++		}
++		fallthrough;
++	case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
++		new_ccfs0 -= (new_ccfs0 >= 149) ? 155 : 42;
++		new_ccfs1 -= (new_ccfs1 >= 149) ? 155 : 42;
++		if (new_ccfs0 % 16 != 0 || new_ccfs1 % 16 != 0)
++			fallback_20mhz = true;
++		break;
++	default:
++		fallback_20mhz = true;
++	}
++
++	if (fallback_20mhz) {
++		ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
++
++		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
++		vht_oper->center_freq_seg0_idx =
++			ieee80211_frequency_to_channel(chan->center_freq);
++		vht_oper->center_freq_seg1_idx = 0;
++
++	} else {
++		ht_oper->ht_param = (chan->center_freq / 20) & 1 ?
++					IEEE80211_HT_PARAM_CHA_SEC_ABOVE :
++					IEEE80211_HT_PARAM_CHA_SEC_BELOW;
++
++		vht_oper->chan_width = new_chan_width;
++		vht_oper->center_freq_seg0_idx = wbcs_ie->new_center_freq_seg0;
++		vht_oper->center_freq_seg1_idx = wbcs_ie->new_center_freq_seg1;
++	}
++
++	ht_oper->operation_mode = cpu_to_le16(vht_oper->center_freq_seg1_idx <<
++					      IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
++}
++
+ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
+ 				 struct ieee802_11_elems *elems,
+ 				 enum nl80211_band current_band,
+@@ -26,19 +352,27 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
+ 				 ieee80211_conn_flags_t conn_flags, u8 *bssid,
+ 				 struct ieee80211_csa_ie *csa_ie)
+ {
++	struct ieee80211_supported_band *sband;
+ 	enum nl80211_band new_band = current_band;
+-	int new_freq;
+-	u8 new_chan_no;
++	int new_freq, size;
++	u8 new_chan_no = 0, new_op_class = 0;
+ 	struct ieee80211_channel *new_chan;
+-	struct cfg80211_chan_def new_vht_chandef = {};
++	struct cfg80211_chan_def new_chandef = {};
+ 	const struct ieee80211_sec_chan_offs_ie *sec_chan_offs;
+ 	const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie;
++	const struct ieee80211_ext_chansw_ie *ext_chansw_ie;
++	struct ieee80211_ht_operation *ht_oper;
++	struct ieee80211_vht_operation *vht_oper;
++	struct ieee80211_he_operation *he_oper;
++	struct ieee80211_eht_operation *eht_oper;
++	struct ieee80211_sta_ht_cap sta_ht_cap;
+ 	int secondary_channel_offset = -1;
+ 
+ 	memset(csa_ie, 0, sizeof(*csa_ie));
+ 
+ 	sec_chan_offs = elems->sec_chan_offs;
+ 	wide_bw_chansw_ie = elems->wide_bw_chansw_ie;
++	ext_chansw_ie = elems->ext_chansw_ie;
+ 
+ 	if (conn_flags & (IEEE80211_CONN_DISABLE_HT |
+ 			  IEEE80211_CONN_DISABLE_40MHZ)) {
+@@ -46,29 +380,30 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
+ 		wide_bw_chansw_ie = NULL;
+ 	}
+ 
+-	if (conn_flags & IEEE80211_CONN_DISABLE_VHT)
+-		wide_bw_chansw_ie = NULL;
+-
+-	if (elems->ext_chansw_ie) {
+-		if (!ieee80211_operating_class_to_band(
+-				elems->ext_chansw_ie->new_operating_class,
+-				&new_band)) {
+-			sdata_info(sdata,
+-				   "cannot understand ECSA IE operating class, %d, ignoring\n",
+-				   elems->ext_chansw_ie->new_operating_class);
++	if (ext_chansw_ie) {
++		new_op_class = ext_chansw_ie->new_operating_class;
++		if (!ieee80211_operating_class_to_band(new_op_class, &new_band)) {
++			new_op_class = 0;
++			sdata_info(sdata, "cannot understand ECSA IE "
++					  "operating class, %d, ignoring\n",
++				   ext_chansw_ie->new_operating_class);
++		} else {
++			new_chan_no = ext_chansw_ie->new_ch_num;
++			csa_ie->count = ext_chansw_ie->count;
++			csa_ie->mode = ext_chansw_ie->mode;
+ 		}
+-		new_chan_no = elems->ext_chansw_ie->new_ch_num;
+-		csa_ie->count = elems->ext_chansw_ie->count;
+-		csa_ie->mode = elems->ext_chansw_ie->mode;
+-	} else if (elems->ch_switch_ie) {
++	}
++
++	if (!new_op_class && elems->ch_switch_ie) {
+ 		new_chan_no = elems->ch_switch_ie->new_ch_num;
+ 		csa_ie->count = elems->ch_switch_ie->count;
+ 		csa_ie->mode = elems->ch_switch_ie->mode;
+-	} else {
+-		/* nothing here we understand */
+-		return 1;
+ 	}
+ 
++	/* nothing here we understand */
++	if (!new_chan_no)
++		return 1;
++
+ 	/* Mesh Channel Switch Parameters Element */
+ 	if (elems->mesh_chansw_params_ie) {
+ 		csa_ie->ttl = elems->mesh_chansw_params_ie->mesh_ttl;
+@@ -132,54 +467,119 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
+ 		break;
+ 	}
+ 
+-	if (wide_bw_chansw_ie) {
+-		u8 new_seg1 = wide_bw_chansw_ie->new_center_freq_seg1;
+-		struct ieee80211_vht_operation vht_oper = {
+-			.chan_width =
+-				wide_bw_chansw_ie->new_channel_width,
+-			.center_freq_seg0_idx =
+-				wide_bw_chansw_ie->new_center_freq_seg0,
+-			.center_freq_seg1_idx = new_seg1,
+-			/* .basic_mcs_set doesn't matter */
+-		};
+-		struct ieee80211_ht_operation ht_oper = {
+-			.operation_mode =
+-				cpu_to_le16(new_seg1 <<
+-					    IEEE80211_HT_OP_MODE_CCFS2_SHIFT),
+-		};
+-
+-		/* default, for the case of IEEE80211_VHT_CHANWIDTH_USE_HT,
+-		 * to the previously parsed chandef
+-		 */
+-		new_vht_chandef = csa_ie->chandef;
++	if (new_band == NL80211_BAND_6GHZ) {
++		size = sizeof(struct ieee80211_he_operation) +
++		       sizeof(struct ieee80211_he_6ghz_oper);
++		he_oper = kzalloc(size, GFP_KERNEL);
++		if (!he_oper)
++			return -ENOMEM;
++
++		size = sizeof(struct ieee80211_eht_operation) +
++		       sizeof(struct ieee80211_eht_operation_info);
++		eht_oper = kzalloc(size, GFP_KERNEL);
++		if (!eht_oper) {
++			kfree(he_oper);
++			return -ENOMEM;
++		}
++
++		if (new_op_class && new_op_class != 135 && new_op_class != 137) {
++			/* There is no way to tell the ccfs1 for op_class 135
++			 * (80P80 MHz) and 137 (320 MHz).
++			 */
++			op_class_to_6ghz_he_eht_oper(new_op_class, new_chan,
++						     he_oper, eht_oper);
++		} else if (wide_bw_chansw_ie) {
++			wbcs_ie_to_6ghz_he_eht_oper(wide_bw_chansw_ie,
++						    new_chan_no, he_oper,
++						    eht_oper);
++		}
++
++		new_chandef = csa_ie->chandef;
+ 
+ 		/* ignore if parsing fails */
+-		if (!ieee80211_chandef_vht_oper(&sdata->local->hw,
+-						vht_cap_info,
+-						&vht_oper, &ht_oper,
+-						&new_vht_chandef))
+-			new_vht_chandef.chan = NULL;
++		if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, eht_oper,
++						    &new_chandef))
++			new_chandef.chan = NULL;
++
++		kfree(he_oper);
++		kfree(eht_oper);
++	} else {
++		sband = sdata->local->hw.wiphy->bands[new_band];
++		memcpy(&sta_ht_cap, &sband->ht_cap, sizeof(sta_ht_cap));
++		ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
++
++		if (!sta_ht_cap.ht_supported ||
++		    !(sta_ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
++			goto out;
++
++		ht_oper = kzalloc(sizeof(*ht_oper), GFP_KERNEL);
++		if (!ht_oper)
++			return -ENOMEM;
++
++		vht_oper = kzalloc(sizeof(*vht_oper), GFP_KERNEL);
++		if (!vht_oper) {
++			kfree(ht_oper);
++			return -ENOMEM;
++		}
++
++		if (new_op_class && new_op_class != 130) {
++			/* There is no way to tell the ccfs1 for op_class 130
++			 * (80P80 MHz).
++			 */
++			op_class_to_ht_vht_oper(new_op_class, new_chan, ht_oper,
++						vht_oper);
++		} else if (wide_bw_chansw_ie && new_band == NL80211_BAND_5GHZ &&
++			   sband->vht_cap.vht_supported) {
++			/* It is assumed that there is no WBCS IE in the beacon
++			 * from a 2 GHz BSS during a channel switch.
++			 */
++			wbcs_ie_to_ht_vht_oper(new_chan, wide_bw_chansw_ie,
++					       ht_oper, vht_oper);
++		} else {
++			kfree(ht_oper);
++			kfree(vht_oper);
++			goto out;
++		}
++
++		new_chandef = csa_ie->chandef;
++
++		ieee80211_chandef_ht_oper(ht_oper, &new_chandef);
++
++		/* ignore if parsing fails */
++		if (sband->vht_cap.vht_supported &&
++		    !ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info,
++						vht_oper, ht_oper, &new_chandef))
++			new_chandef.chan = NULL;
++
++		kfree(ht_oper);
++		kfree(vht_oper);
++	}
++
++	if (new_chandef.chan) {
++		if (conn_flags & IEEE80211_CONN_DISABLE_320MHZ &&
++		    new_chandef.width == NL80211_CHAN_WIDTH_320)
++			ieee80211_chandef_downgrade(&new_chandef);
+ 
+ 		if (conn_flags & IEEE80211_CONN_DISABLE_80P80MHZ &&
+-		    new_vht_chandef.width == NL80211_CHAN_WIDTH_80P80)
+-			ieee80211_chandef_downgrade(&new_vht_chandef);
++		    new_chandef.width == NL80211_CHAN_WIDTH_80P80)
++			ieee80211_chandef_downgrade(&new_chandef);
++
+ 		if (conn_flags & IEEE80211_CONN_DISABLE_160MHZ &&
+-		    new_vht_chandef.width == NL80211_CHAN_WIDTH_160)
+-			ieee80211_chandef_downgrade(&new_vht_chandef);
+-	}
++		    new_chandef.width == NL80211_CHAN_WIDTH_160)
++			ieee80211_chandef_downgrade(&new_chandef);
+ 
+-	/* if VHT data is there validate & use it */
+-	if (new_vht_chandef.chan) {
+-		if (!cfg80211_chandef_compatible(&new_vht_chandef,
++		if (!cfg80211_chandef_compatible(&new_chandef,
+ 						 &csa_ie->chandef)) {
+ 			sdata_info(sdata,
+ 				   "BSS %pM: CSA has inconsistent channel data, disconnecting\n",
+ 				   bssid);
+ 			return -EINVAL;
+ 		}
+-		csa_ie->chandef = new_vht_chandef;
++
++		csa_ie->chandef = new_chandef;
+ 	}
+ 
++out:
+ 	if (elems->max_channel_switch_time)
+ 		csa_ie->max_switch_time =
+ 			(elems->max_channel_switch_time[0] << 0) |
+-- 
+2.25.1
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1000-mac80211-mtk-add-EHT-BA1024-support.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1000-mac80211-mtk-add-EHT-BA1024-support.patch
index fe7b1af..41d3d2f 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1000-mac80211-mtk-add-EHT-BA1024-support.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1000-mac80211-mtk-add-EHT-BA1024-support.patch
@@ -1,7 +1,7 @@
-From 5a82834ed7eb4cbf0f4f5abc8665eeef023b67ff Mon Sep 17 00:00:00 2001
+From 1a54516b2d934f80a80c6e1bb0fe824ceb63cd3b Mon Sep 17 00:00:00 2001
 From: MeiChia Chiu <meichia.chiu@mediatek.com>
 Date: Sun, 25 Dec 2022 22:43:46 +0800
-Subject: [PATCH 1000/1003] mac80211: mtk: add EHT BA1024 support
+Subject: [PATCH 1000/1006] mac80211: mtk: add EHT BA1024 support
 
 ---
  include/linux/ieee80211.h |  2 ++
@@ -9,10 +9,10 @@
  2 files changed, 45 insertions(+), 2 deletions(-)
 
 diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
-index 00d381e..0781b76 100644
+index 7aaae32..3308e85 100644
 --- a/include/linux/ieee80211.h
 +++ b/include/linux/ieee80211.h
-@@ -1256,6 +1256,8 @@ struct ieee80211_mgmt {
+@@ -1267,6 +1267,8 @@ struct ieee80211_mgmt {
  					__le16 status;
  					__le16 capab;
  					__le16 timeout;
@@ -22,10 +22,10 @@
  				struct{
  					u8 action_code;
 diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
-index 752ad09..7f0e72a 100644
+index 7f66e69..b8b8e22 100644
 --- a/net/mac80211/agg-tx.c
 +++ b/net/mac80211/agg-tx.c
-@@ -66,10 +66,17 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
+@@ -72,10 +72,17 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
  	struct ieee80211_local *local = sdata->local;
  	struct sk_buff *skb;
  	struct ieee80211_mgmt *mgmt;
@@ -44,7 +44,7 @@
  
  	if (!skb)
  		return;
-@@ -108,6 +115,15 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
+@@ -114,6 +121,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);
  
@@ -60,7 +60,7 @@
  	ieee80211_tx_skb_tid(sdata, skb, tid, -1);
  }
  
-@@ -469,8 +485,11 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
+@@ -481,8 +497,11 @@ static void ieee80211_send_addba_with_timeout(struct sta_info *sta,
  	sta->ampdu_mlme.addba_req_num[tid]++;
  	spin_unlock_bh(&sta->lock);
  
@@ -73,7 +73,7 @@
  	} else {
  		/*
  		 * We really should use what the driver told us it will
-@@ -980,13 +999,35 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
+@@ -998,13 +1017,35 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
  {
  	struct tid_ampdu_tx *tid_tx;
  	struct ieee80211_txq *txq;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1001-mac80211-mtk-add-rate-duration-for-EHT-rate.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1001-mac80211-mtk-add-rate-duration-for-EHT-rate.patch
index f20cb61..d94b942 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1001-mac80211-mtk-add-rate-duration-for-EHT-rate.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1001-mac80211-mtk-add-rate-duration-for-EHT-rate.patch
@@ -1,7 +1,7 @@
-From 857debd24af093da4e85f148767fd16fb9eaf975 Mon Sep 17 00:00:00 2001
+From 732eee694af50c9854755e4bcecf3a37f762a932 Mon Sep 17 00:00:00 2001
 From: Bo Jiao <Bo.Jiao@mediatek.com>
 Date: Sun, 25 Dec 2022 22:43:46 +0800
-Subject: [PATCH 1001/1003] mac80211: mtk: add rate duration for EHT rate.
+Subject: [PATCH 1001/1006] mac80211: mtk: add rate duration for EHT rate.
 
 ---
  net/mac80211/airtime.c | 349 ++++++++++++++++++++++++++++++++++++++++-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1002-mac80211-mtk-add-send-bar-action-when-recieve-addba-.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1002-mac80211-mtk-add-send-bar-action-when-recieve-addba-.patch
index 099071c..a8ecdb7 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1002-mac80211-mtk-add-send-bar-action-when-recieve-addba-.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1002-mac80211-mtk-add-send-bar-action-when-recieve-addba-.patch
@@ -1,7 +1,7 @@
-From a9b8e0e62b19fbd7c1dd865330ceb5a943e5cbb2 Mon Sep 17 00:00:00 2001
+From 962ea174654c240aacc4e83b2000846c796cf1fc Mon Sep 17 00:00:00 2001
 From: ye he <ye.he@mediatek.com>
 Date: Wed, 22 Feb 2023 16:09:32 +0800
-Subject: [PATCH 1002/1003] mac80211: mtk: add send bar action when recieve
+Subject: [PATCH 1002/1006] mac80211: mtk: add send bar action when recieve
  addba rsp
 
 Signed-off-by: ye he <ye.he@mediatek.com>
@@ -10,10 +10,10 @@
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
-index 7f0e72a..3ce2226 100644
+index b8b8e22..285433a 100644
 --- a/net/mac80211/agg-tx.c
 +++ b/net/mac80211/agg-tx.c
-@@ -1080,7 +1080,8 @@ next:
+@@ -1098,7 +1098,8 @@ next:
  
  		tid_tx->buf_size = buf_size;
  		tid_tx->amsdu = amsdu;
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1003-mac80211-mtk-inrease-beacon-loss-count.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1003-mac80211-mtk-inrease-beacon-loss-count.patch
index 1def860..559b91d 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1003-mac80211-mtk-inrease-beacon-loss-count.patch
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1003-mac80211-mtk-inrease-beacon-loss-count.patch
@@ -1,7 +1,7 @@
-From 8175f5cdf45728cdfcf34893696f994c6f1e6cc1 Mon Sep 17 00:00:00 2001
+From 6e12a9af43178a46e573e8ee92520ec502562bb5 Mon Sep 17 00:00:00 2001
 From: Amit Khatri <amit.khatri@mediatek.com>
 Date: Thu, 6 Apr 2023 21:37:33 +0800
-Subject: [PATCH 1003/1003] mac80211: mtk: inrease beacon loss count
+Subject: [PATCH 1003/1006] mac80211: mtk: inrease beacon loss count
 
 as per eagle code beacone loss time out is
 4 seconds.
@@ -16,7 +16,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index 72d153f..458609c 100644
+index df39a8b..ccc72da 100644
 --- a/net/mac80211/mlme.c
 +++ b/net/mac80211/mlme.c
 @@ -61,7 +61,7 @@ MODULE_PARM_DESC(max_probe_tries,
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-cfg80211-mtk-add-support-for-updating-background-cha.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-cfg80211-mtk-add-support-for-updating-background-cha.patch
new file mode 100644
index 0000000..b52511a
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-cfg80211-mtk-add-support-for-updating-background-cha.patch
@@ -0,0 +1,88 @@
+From f0e42c5a5ea3491be2d7c61c798dffe126eabd2b Mon Sep 17 00:00:00 2001
+From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+Date: Wed, 5 Jul 2023 09:49:02 +0800
+Subject: [PATCH 1004/1006] cfg80211: mtk: add support for updating background
+ channel
+
+Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+---
+ include/net/cfg80211.h       | 14 ++++++++++++++
+ include/uapi/linux/nl80211.h |  6 ++++++
+ net/wireless/mlme.c          | 12 ++++++++++++
+ 3 files changed, 32 insertions(+)
+
+diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
+index 2c51c3e..46c477a 100644
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -8444,6 +8444,20 @@ void cfg80211_sta_update_dfs_state(struct wireless_dev *wdev,
+ 				   const struct cfg80211_chan_def *csa_chandef,
+ 				   bool associated);
+ 
++/**
++ * cfg80211_background_radar_update_channel - notify background chandef has been updated
++ * @wiphy: the wiphy
++ * @chandef: the updated chandef
++ * @expand: whether or not the operating channel should expand its width
++ * after offchan CAC
++ *
++ * Update the background chandef based on driver's decision, and notify the userspace
++ * that the current channel of background chain should be updated.
++ */
++void cfg80211_background_radar_update_channel(struct wiphy *wiphy,
++					      const struct cfg80211_chan_def *chandef,
++					      bool expand);
++
+ /**
+  * cfg80211_background_cac_abort - Channel Availability Check offchan abort event
+  * @wiphy: the wiphy
+diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
+index 60c6f79..6e96ad9 100644
+--- a/include/uapi/linux/nl80211.h
++++ b/include/uapi/linux/nl80211.h
+@@ -6671,6 +6671,10 @@ enum nl80211_smps_mode {
+  *	applicable for ETSI dfs domain where pre-CAC is valid for ever.
+  * @NL80211_RADAR_CAC_STARTED: Channel Availability Check has been started,
+  *	should be generated by HW if NL80211_EXT_FEATURE_DFS_OFFLOAD is enabled.
++ * @NL80211_RADAR_BACKGROUND_CHAN_UPDATE: background channel is updated by the
++ *	driver.
++ * @NL80211_RADAR_BACKGROUND_CHAN_EXPAND: background channel is updated by the
++ *	driver and required to expand main operating channel.
+  * @NL80211_RADAR_STA_CAC_SKIPPED: STA set the DFS state to available
+  *	when receiving CSA/assoc resp
+  * @NL80211_RADAR_STA_CAC_EXPIRED: STA set the DFS state to usable
+@@ -6683,6 +6687,8 @@ enum nl80211_radar_event {
+ 	NL80211_RADAR_NOP_FINISHED,
+ 	NL80211_RADAR_PRE_CAC_EXPIRED,
+ 	NL80211_RADAR_CAC_STARTED,
++	NL80211_RADAR_BACKGROUND_CHAN_UPDATE,
++	NL80211_RADAR_BACKGROUND_CHAN_EXPAND,
+ 	NL80211_RADAR_STA_CAC_SKIPPED,
+ 	NL80211_RADAR_STA_CAC_EXPIRED,
+ };
+diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
+index d345c72..5510d77 100644
+--- a/net/wireless/mlme.c
++++ b/net/wireless/mlme.c
+@@ -1158,6 +1158,18 @@ cfg80211_start_background_radar_detection(struct cfg80211_registered_device *rde
+ 	return 0;
+ }
+ 
++void cfg80211_background_radar_update_channel(struct wiphy *wiphy,
++					      const struct cfg80211_chan_def *chandef,
++					      bool expand)
++{
++	enum nl80211_radar_event event;
++
++	event = expand ? NL80211_RADAR_BACKGROUND_CHAN_EXPAND :
++			 NL80211_RADAR_BACKGROUND_CHAN_UPDATE;
++	nl80211_radar_notify(wiphy_to_rdev(wiphy), chandef, event, NULL, GFP_ATOMIC);
++}
++EXPORT_SYMBOL(cfg80211_background_radar_update_channel);
++
+ void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
+ {
+ 	struct wiphy *wiphy = wdev->wiphy;
+-- 
+2.39.2
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-mac80211-mtk-add-disabling-cca-when-stopping-AP.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-mac80211-mtk-add-disabling-cca-when-stopping-AP.patch
deleted file mode 100644
index c8fc398..0000000
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1004-mac80211-mtk-add-disabling-cca-when-stopping-AP.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 79837bcb22a80a4c95cbba77b23f16352d4e791d Mon Sep 17 00:00:00 2001
-From: Michael Lee <michael-cy.lee@mediatek.com>
-Date: Mon, 24 Apr 2023 09:59:24 +0800
-Subject: [PATCH] mac80211: mtk: add disabling cca when stopping AP.
-
----
- net/mac80211/cfg.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
-index 343ce2b..611c29e 100644
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -1540,6 +1540,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
- 	/* abort any running channel switch */
- 	mutex_lock(&local->mtx);
- 	link_conf->csa_active = false;
-+	link_conf->color_change_active = false;
- 	if (link->csa_block_tx) {
- 		ieee80211_wake_vif_queues(local, sdata,
- 					  IEEE80211_QUEUE_STOP_REASON_CSA);
--- 
-2.25.1
-
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1005-mac80211-mtk-Allow-STA-interface-to-set-TX-queue-par.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1005-mac80211-mtk-Allow-STA-interface-to-set-TX-queue-par.patch
new file mode 100644
index 0000000..83fb948
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1005-mac80211-mtk-Allow-STA-interface-to-set-TX-queue-par.patch
@@ -0,0 +1,26 @@
+From 345695bc97c9a69aa9717e2fceb2e42701a63486 Mon Sep 17 00:00:00 2001
+From: Michael Lee <michael-cy.lee@mediatek.com>
+Date: Fri, 7 Jul 2023 17:17:30 +0800
+Subject: [PATCH 1005/1006] mac80211: mtk: Allow STA interface to set TX queue
+ parameters
+
+Signed-off-by: Michael Lee <michael-cy.lee@mediatek.com>
+---
+ net/wireless/nl80211.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
+index 4692480..e098263 100644
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -3497,6 +3497,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
+ 		}
+ 
+ 		if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
++		    netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION &&
+ 		    netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
+ 			result = -EINVAL;
+ 			goto out;
+-- 
+2.39.2
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1006-mac80211-mtk-export-ieee80211_tpt_led_trig_tx-rx-for.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1006-mac80211-mtk-export-ieee80211_tpt_led_trig_tx-rx-for.patch
new file mode 100644
index 0000000..825a8dc
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1006-mac80211-mtk-export-ieee80211_tpt_led_trig_tx-rx-for.patch
@@ -0,0 +1,150 @@
+From 8fb30028bd630b37840d023029aa6aa4791f7697 Mon Sep 17 00:00:00 2001
+From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
+Date: Fri, 23 Jun 2023 05:53:50 +0800
+Subject: [PATCH 1006/1006] mac80211: mtk: export ieee80211_tpt_led_trig_tx/rx
+ for driver
+
+Whenever the H/W path is enabled and traffic is in the binding state,
+mac80211 is not aware of the traffic. Consequently, the LED does not
+blink for that reason.
+
+The ieee80211_tpt_led_trig_tx/rx functions are exported for the driver
+so that we can report the tx and rx bytes from the driver when
+the H/W path is being used.
+
+Signed-off-by: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
+---
+ include/net/mac80211.h | 17 +++++++++++++++++
+ net/mac80211/led.c     | 16 ++++++++++++++++
+ net/mac80211/led.h     | 17 -----------------
+ net/mac80211/rx.c      |  2 +-
+ net/mac80211/tx.c      |  4 ++--
+ 5 files changed, 36 insertions(+), 20 deletions(-)
+
+diff --git a/include/net/mac80211.h b/include/net/mac80211.h
+index 6ff6d3a..345c323 100644
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -4744,6 +4744,8 @@ __ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw,
+ 				   unsigned int flags,
+ 				   const struct ieee80211_tpt_blink *blink_table,
+ 				   unsigned int blink_table_len);
++void __ieee80211_tpt_led_trig_tx(struct ieee80211_hw *hw, int bytes);
++void __ieee80211_tpt_led_trig_rx(struct ieee80211_hw *hw, int bytes);
+ #endif
+ /**
+  * ieee80211_get_tx_led_name - get name of TX LED
+@@ -4854,6 +4856,21 @@ ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, unsigned int flags,
+ #endif
+ }
+ 
++static inline void
++ieee80211_tpt_led_trig_tx(struct ieee80211_hw *hw, int bytes)
++{
++#ifdef CPTCFG_MAC80211_LEDS
++	__ieee80211_tpt_led_trig_tx(hw, bytes);
++#endif
++}
++
++static inline void
++ieee80211_tpt_led_trig_rx(struct ieee80211_hw *hw, int bytes)
++{
++#ifdef CPTCFG_MAC80211_LEDS
++	__ieee80211_tpt_led_trig_rx(hw, bytes);
++#endif
++}
+ /**
+  * ieee80211_unregister_hw - Unregister a hardware device
+  *
+diff --git a/net/mac80211/led.c b/net/mac80211/led.c
+index b992430..3109501 100644
+--- a/net/mac80211/led.c
++++ b/net/mac80211/led.c
+@@ -364,6 +364,22 @@ __ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw,
+ }
+ EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger);
+ 
++void __ieee80211_tpt_led_trig_tx(struct ieee80211_hw *hw, int bytes)
++{
++	struct ieee80211_local *local = hw_to_local(hw);
++	if (atomic_read(&local->tpt_led_active))
++		local->tpt_led_trigger->tx_bytes += bytes;
++}
++EXPORT_SYMBOL(__ieee80211_tpt_led_trig_tx);
++
++void __ieee80211_tpt_led_trig_rx(struct ieee80211_hw *hw, int bytes)
++{
++	struct ieee80211_local *local = hw_to_local(hw);
++	if (atomic_read(&local->tpt_led_active))
++		local->tpt_led_trigger->rx_bytes += bytes;
++}
++EXPORT_SYMBOL(__ieee80211_tpt_led_trig_rx);
++
+ static void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
+ {
+ 	struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
+diff --git a/net/mac80211/led.h b/net/mac80211/led.h
+index 59f5a83..f381790 100644
+--- a/net/mac80211/led.h
++++ b/net/mac80211/led.h
+@@ -65,22 +65,5 @@ static inline void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
+ 					      unsigned int types_off)
+ {
+ }
+-#endif
+ 
+-static inline void
+-ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, int bytes)
+-{
+-#ifdef CPTCFG_MAC80211_LEDS
+-	if (atomic_read(&local->tpt_led_active))
+-		local->tpt_led_trigger->tx_bytes += bytes;
+ #endif
+-}
+-
+-static inline void
+-ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, int bytes)
+-{
+-#ifdef CPTCFG_MAC80211_LEDS
+-	if (atomic_read(&local->tpt_led_active))
+-		local->tpt_led_trigger->rx_bytes += bytes;
+-#endif
+-}
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index e245f31..a44381b 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -5394,7 +5394,7 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
+ 	if (skb) {
+ 		if ((status->flag & RX_FLAG_8023) ||
+ 			ieee80211_is_data_present(hdr->frame_control))
+-			ieee80211_tpt_led_trig_rx(local, skb->len);
++			ieee80211_tpt_led_trig_rx(&local->hw, skb->len);
+ 
+ 		if (status->flag & RX_FLAG_8023)
+ 			__ieee80211_rx_handle_8023(hw, pubsta, skb, list);
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index d816c36..4925fab 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -4320,7 +4320,7 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
+ 	len = 0;
+  out:
+ 	if (len)
+-		ieee80211_tpt_led_trig_tx(local, len);
++		ieee80211_tpt_led_trig_tx(&local->hw, len);
+ 	rcu_read_unlock();
+ }
+ 
+@@ -4646,7 +4646,7 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
+ 	sta->deflink.tx_stats.packets[queue] += skbs;
+ 	sta->deflink.tx_stats.bytes[queue] += len;
+ 
+-	ieee80211_tpt_led_trig_tx(local, len);
++	ieee80211_tpt_led_trig_tx(&local->hw, len);
+ 
+ 	ieee80211_tx_8023(sdata, skb, sta, false);
+ 
+-- 
+2.39.2
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1007-mac80211-mtk-add-packet-count-input-for-dev_sw_netst.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1007-mac80211-mtk-add-packet-count-input-for-dev_sw_netst.patch
new file mode 100644
index 0000000..9a4f9ce
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1007-mac80211-mtk-add-packet-count-input-for-dev_sw_netst.patch
@@ -0,0 +1,136 @@
+From 26a73e67325cd28ff295afacfb875c14ea8e1988 Mon Sep 17 00:00:00 2001
+From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
+Date: Tue, 22 Aug 2023 05:02:53 +0800
+Subject: [PATCH 1/2] mac80211: mtk: add packet count input for
+ dev_sw_netstat_rx_add
+
+---
+ backport-include/linux/netdevice.h                   | 12 ++++++++----
+ drivers/net/usb/qmi_wwan.c                           |  2 +-
+ .../net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c |  2 +-
+ .../net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c |  2 +-
+ net/mac80211/rx.c                                    |  8 ++++----
+ 5 files changed, 15 insertions(+), 11 deletions(-)
+
+diff --git a/backport-include/linux/netdevice.h b/backport-include/linux/netdevice.h
+index 1d2ac66..04d76d7 100644
+--- a/backport-include/linux/netdevice.h
++++ b/backport-include/linux/netdevice.h
+@@ -112,13 +112,15 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
+ #define netif_rx_any_context LINUX_BACKPORT(netif_rx_any_context)
+ int netif_rx_any_context(struct sk_buff *skb);
+ 
+-static inline void dev_sw_netstats_rx_add(struct net_device *dev, unsigned int len)
++static inline void dev_sw_netstats_rx_add(struct net_device *dev,
++					  unsigned int packets,
++					  unsigned int len)
+ {
+ 	struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
+ 
+ 	u64_stats_update_begin(&tstats->syncp);
+ 	tstats->rx_bytes += len;
+-	tstats->rx_packets++;
++	tstats->rx_packets += packets;
+ 	u64_stats_update_end(&tstats->syncp);
+ }
+ 
+@@ -140,13 +142,15 @@ static inline void dev_sw_netstats_tx_add(struct net_device *dev,
+ 
+ #if LINUX_VERSION_IS_LESS(5,10,0)
+ #define dev_sw_netstats_rx_add LINUX_BACKPORT(dev_sw_netstats_rx_add)
+-static inline void dev_sw_netstats_rx_add(struct net_device *dev, unsigned int len)
++static inline void dev_sw_netstats_rx_add(struct net_device *dev,
++					  unsigned int packets,
++					  unsigned int len)
+ {
+ 	struct pcpu_sw_netstats *tstats = this_cpu_ptr(dev->tstats);
+ 
+ 	u64_stats_update_begin(&tstats->syncp);
+ 	tstats->rx_bytes += len;
+-	tstats->rx_packets++;
++	tstats->rx_packets += packets;
+ 	u64_stats_update_end(&tstats->syncp);
+ }
+ #endif /* < 5.10 */
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index adbcfdf..f93359a 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -210,7 +210,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
+ 			net->stats.rx_errors++;
+ 			return 0;
+ 		} else {
+-			dev_sw_netstats_rx_add(net, pkt_len);
++			dev_sw_netstats_rx_add(net, 1, pkt_len);
+ 		}
+ 
+ skip:
+diff --git a/drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c
+index 8c23a77..8f201ea 100644
+--- a/drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c
++++ b/drivers/net/wireless/quantenna/qtnfmac/pcie/pearl_pcie.c
+@@ -756,7 +756,7 @@ static int qtnf_pcie_pearl_rx_poll(struct napi_struct *napi, int budget)
+ 			skb_put(skb, psize);
+ 			ndev = qtnf_classify_skb(bus, skb);
+ 			if (likely(ndev)) {
+-				dev_sw_netstats_rx_add(ndev, skb->len);
++				dev_sw_netstats_rx_add(ndev, 1, skb->len);
+ 				skb->protocol = eth_type_trans(skb, ndev);
+ 				napi_gro_receive(napi, skb);
+ 			} else {
+diff --git a/drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c
+index d833625..0a7bb97 100644
+--- a/drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c
++++ b/drivers/net/wireless/quantenna/qtnfmac/pcie/topaz_pcie.c
+@@ -662,7 +662,7 @@ static int qtnf_topaz_rx_poll(struct napi_struct *napi, int budget)
+ 			skb_put(skb, psize);
+ 			ndev = qtnf_classify_skb(bus, skb);
+ 			if (likely(ndev)) {
+-				dev_sw_netstats_rx_add(ndev, skb->len);
++				dev_sw_netstats_rx_add(ndev, 1, skb->len);
+ 				skb->protocol = eth_type_trans(skb, ndev);
+ 				netif_receive_skb(skb);
+ 			} else {
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index fb3d2e4..347867c 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -853,7 +853,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
+ 
+ 			if (skb) {
+ 				skb->dev = sdata->dev;
+-				dev_sw_netstats_rx_add(skb->dev, skb->len);
++				dev_sw_netstats_rx_add(skb->dev, 1, skb->len);
+ 				netif_receive_skb(skb);
+ 			}
+ 		}
+@@ -2632,7 +2632,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
+ 	skb = rx->skb;
+ 	xmit_skb = NULL;
+ 
+-	dev_sw_netstats_rx_add(dev, skb->len);
++	dev_sw_netstats_rx_add(dev, 1, skb->len);
+ 
+ 	if (rx->sta) {
+ 		/* The seqno index has the same property as needed
+@@ -4050,7 +4050,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
+ 		}
+ 
+ 		prev_dev = sdata->dev;
+-		dev_sw_netstats_rx_add(sdata->dev, skb->len);
++		dev_sw_netstats_rx_add(sdata->dev, 1, skb->len);
+ 	}
+ 
+ 	if (prev_dev) {
+@@ -4762,7 +4762,7 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
+ 
+ 	skb->dev = fast_rx->dev;
+ 
+-	dev_sw_netstats_rx_add(fast_rx->dev, skb->len);
++	dev_sw_netstats_rx_add(fast_rx->dev, 1, skb->len);
+ 
+ 	/* The seqno index has the same property as needed
+ 	 * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
+-- 
+2.18.0
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1008-mac80211-mtk-add-per-bss-flag-to-support-vendors-cou.patch b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1008-mac80211-mtk-add-per-bss-flag-to-support-vendors-cou.patch
new file mode 100644
index 0000000..4cb182c
--- /dev/null
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/mtk-1008-mac80211-mtk-add-per-bss-flag-to-support-vendors-cou.patch
@@ -0,0 +1,91 @@
+From 7ef885cff2d628c84b83eb4b697106b781495fa5 Mon Sep 17 00:00:00 2001
+From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
+Date: Wed, 16 Aug 2023 07:23:34 +0800
+Subject: [PATCH 2/2] mac80211: mtk: add per-bss flag to support vendors
+ counter
+
+---
+ include/uapi/linux/nl80211.h |  1 +
+ net/mac80211/rx.c            |  8 ++++++--
+ net/mac80211/tx.c            | 13 ++++++++++---
+ 3 files changed, 17 insertions(+), 5 deletions(-)
+
+diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
+index 6e96ad9..b1555bb 100644
+--- a/include/uapi/linux/nl80211.h
++++ b/include/uapi/linux/nl80211.h
+@@ -6471,6 +6471,7 @@ enum nl80211_ext_feature_index {
+ 	NL80211_EXT_FEATURE_PUNCT,
+ 	NL80211_EXT_FEATURE_SECURE_NAN,
+ 	NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA,
++	NL80211_EXT_FEATURE_STAS_COUNT,
+ 
+ 	/* add new features before the definition below */
+ 	NUM_NL80211_EXT_FEATURES,
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index 347867c..07dddcd 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -2632,7 +2632,9 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
+ 	skb = rx->skb;
+ 	xmit_skb = NULL;
+ 
+-	dev_sw_netstats_rx_add(dev, 1, skb->len);
++	if (!wiphy_ext_feature_isset(sdata->local->hw.wiphy,
++	    NL80211_EXT_FEATURE_STAS_COUNT) || !rx->sta)
++		dev_sw_netstats_rx_add(dev, 1, skb->len);
+ 
+ 	if (rx->sta) {
+ 		/* The seqno index has the same property as needed
+@@ -4762,7 +4764,9 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
+ 
+ 	skb->dev = fast_rx->dev;
+ 
+-	dev_sw_netstats_rx_add(fast_rx->dev, 1, skb->len);
++	if (!wiphy_ext_feature_isset(sta->local->hw.wiphy,
++	    NL80211_EXT_FEATURE_STAS_COUNT))
++		dev_sw_netstats_rx_add(fast_rx->dev, 1, skb->len);
+ 
+ 	/* The seqno index has the same property as needed
+ 	 * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index 0ed18d5..c6eec00 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -3540,7 +3540,9 @@ ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,
+ 	if (key)
+ 		info->control.hw_key = &key->conf;
+ 
+-	dev_sw_netstats_tx_add(skb->dev, 1, skb->len);
++	if (!wiphy_ext_feature_isset(sta->local->hw.wiphy,
++	    NL80211_EXT_FEATURE_STAS_COUNT))
++		dev_sw_netstats_tx_add(skb->dev, 1, skb->len);
+ 
+ 	if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
+ 		tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
+@@ -4311,7 +4313,9 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
+ 			goto out;
+ 		}
+ 
+-		dev_sw_netstats_tx_add(dev, 1, skb->len);
++		if (!wiphy_ext_feature_isset(sdata->local->hw.wiphy,
++		    NL80211_EXT_FEATURE_STAS_COUNT) || !sta)
++			dev_sw_netstats_tx_add(dev, 1, skb->len);
+ 
+ 		ieee80211_xmit(sdata, sta, skb);
+ 	}
+@@ -4643,7 +4647,10 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
+ 		info->ack_frame_id = ieee80211_store_ack_skb(local, skb,
+ 							     &info->flags, NULL);
+ 
+-	dev_sw_netstats_tx_add(dev, skbs, len);
++	if (!wiphy_ext_feature_isset(sta->local->hw.wiphy,
++	    NL80211_EXT_FEATURE_STAS_COUNT))
++		dev_sw_netstats_tx_add(dev, skbs, len);
++
+ 	sta->deflink.tx_stats.packets[queue] += skbs;
+ 	sta->deflink.tx_stats.bytes[queue] += len;
+ 
+-- 
+2.18.0
+
diff --git a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
index 758523e..ccc29ce 100644
--- a/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
+++ b/recipes-wifi/linux-mac80211/files/patches-6.x/subsys/subsys.inc
@@ -2,54 +2,21 @@
 SRC_URI_append = " \
     file://110-mac80211_keep_keys_on_stop_ap.patch \
     file://120-cfg80211_allow_perm_addr_change.patch \
+    file://130-disable_auto_vif.patch \
     file://210-ap_scan.patch \
     file://301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch \
     file://302-mac80211-minstrel_ht-fix-MINSTREL_FRAC-macro.patch \
     file://303-mac80211-minstrel_ht-reduce-fluctuations-in-rate-pro.patch \
     file://304-mac80211-minstrel_ht-rework-rate-downgrade-code-and-.patch \
     file://305-mac80211-increase-quantum-for-airtime-scheduler.patch \
-    file://306-01-v6.2-wifi-mac80211-add-internal-handler-for-wake_tx_queue.patch \
-    file://306-02-v6.2-wifi-mac80211-add-wake_tx_queue-callback-to-drivers.patch \
-    file://306-03-v6.2-wifi-mac80211-Drop-support-for-TX-push-path.patch \
-    file://306-04-v6.2-wifi-realtek-remove-duplicated-wake_tx_queue.patch \
-    file://310-v6.2-mac80211-add-support-for-restricting-netdev-features.patch \
-    file://311-v6.2-wifi-mac80211-fix-and-simplify-unencrypted-drop-chec.patch \
-    file://312-v6.3-wifi-cfg80211-move-A-MSDU-check-in-ieee80211_data_to.patch \
-    file://313-v6.3-wifi-cfg80211-factor-out-bridge-tunnel-RFC1042-heade.patch \
-    file://314-v6.3-wifi-mac80211-remove-mesh-forwarding-congestion-chec.patch \
-    file://315-v6.3-wifi-mac80211-fix-receiving-A-MSDU-frames-on-mesh-in.patch \
-    file://316-v6.3-wifi-mac80211-add-a-workaround-for-receiving-non-sta.patch \
-    file://318-wifi-mac80211-fix-race-in-mesh-sequence-number-assig.patch \
-    file://319-wifi-mac80211-mesh-fast-xmit-support.patch \
-    file://320-wifi-mac80211-use-mesh-header-cache-to-speed-up-mesh.patch \
-    file://321-mac80211-fix-mesh-forwarding.patch \
-    file://322-wifi-mac80211-fix-mesh-path-discovery-based-on-unica.patch \
-    file://323-v6.3-wifi-mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee8.patch \
-    file://324-v6.3-wifi-mac80211-Add-HE-MU-MIMO-related-flags-in-ieee80.patch \
-    file://325-wifi-mac80211-introduce-ieee80211_refresh_tx_agg_ses.patch \
-    file://326-wifi-mac80211-add-mesh-fast-rx-support.patch \
-    file://327-wifi-mac80211-add-support-for-letting-drivers-regist.patch \
-    file://329-wifi-mac80211-fix-receiving-mesh-packets-in-forwardi.patch \
-    file://330-wifi-ieee80211-correctly-mark-FTM-frames-non-buffera.patch \
-    file://331-wifi-mac80211-flush-queues-on-STA-removal.patch \
-    file://332-wifi-iwlwifi-mvm-support-flush-on-AP-interfaces.patch \
-    file://333-wifi-mac80211-add-flush_sta-method.patch \
-    file://334-wifi-iwlwifi-mvm-support-new-flush_sta-method.patch \
-    file://335-wifi-mac80211-add-LDPC-related-flags-in-ieee80211_bs.patch \
-    file://336-v6.4-wifi-mac80211-generate-EMA-beacons-in-AP-mode.patch \
-    file://337-mac80211-fix-sband-iftype-data-lookup-for-AP_VLAN.patch \
-    file://338-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch \
-    file://339-wifi-cfg80211-fix-receving-mesh-packets-without-RFC1.patch \
+    file://310-mac80211-split-mesh-fast-tx-cache-into-local-proxied.patch \
+    file://311-mac80211-fix-mesh-id-corruption-on-32-bit-systems.patch \
+    file://312-wifi-cfg80211-annotate-iftype_data-pointer-with-spar.patch \
+    file://313-wifi-cfg80211-export-DFS-CAC-time-and-usable-state-h.patch \
+    file://320-cfg80211-allow-grace-period-for-DFS-available-after-.patch \
     file://400-allow-ibss-mixed.patch \
     file://782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch \
-    file://bp-0002-mac80211-support-minimal-EHT-rate-reporting-on-RX.patch \
-    file://bp-0003-cfg80211-Update-Transition-Disable-policy-during-por.patch \
-    file://bp-0004-wifi-mac80211-mlme-handle-EHT-channel-puncturing.patch \
-    file://bp-0005-wifi-cfg80211-move-puncturing-bitmap-validation-from.patch \
-    file://bp-0006-wifi-nl80211-validate-and-configure-puncturing-bitma.patch \
-    file://bp-0007-wifi-cfg80211-include-puncturing-bitmap-in-channel-s.patch \
-    file://bp-0008-wifi-mac80211-configure-puncturing-bitmap.patch \
-    file://bp-0009-wifi-mac80211-add-EHT-MU-MIMO-related-flags-in-ieee8.patch \
+    file://bp-0001-Revert-mac80211-use-the-new-drop-reasons-infrastruct.patch \
     file://mtk-0001-mac80211-mtk-do-not-setup-twt-when-twt-responder-is-.patch \
     file://mtk-0002-cfg80211-mtk-extend-CAC-time-for-weather-radar-chann.patch \
     file://mtk-0003-mac80211-mtk-it-s-invalid-case-when-frag_threshold-i.patch \
@@ -64,16 +31,22 @@
     file://mtk-0012-mac80211-mtk-track-obss-color-bitmap.patch \
     file://mtk-0013-mac80211-mtk-ageout-color-bitmap.patch \
     file://mtk-0014-mac80211-mtk-update-max_bssid_indicator-based-on-rea.patch \
-    file://mtk-0015-mac80211-support-configurable-addba-resp-time.patch \
+    file://mtk-0015-support-configurable-addba-resp-time.patch \
     file://mtk-0016-mac80211-mtk-add-sta-assisted-DFS-state-update-mecha.patch \
     file://mtk-0017-nl80211-mtk-Mark-DFS-channel-as-available-for-CSA.patch \
     file://mtk-0018-cfg80211-mtk-fix-early-return-in-cfg80211_stop_backg.patch \
     file://mtk-0019-cfg80211-mtk-add-background-radar-stop-when-backgrou.patch \
     file://mtk-0020-mac80211-mtk-avoid-kernel-warning-of-check_flush_dep.patch \
     file://mtk-0021-mac80211-mtk-avoid-calling-switch_vif_chanctx-when-u.patch \
+    file://mtk-0022-mac80211-mtk-Add-utilities-for-converting-op_class.patch \
+    file://mtk-0023-mac80211-mtk-change-STA-CSA-parsing-flows.patch \
     file://mtk-1000-mac80211-mtk-add-EHT-BA1024-support.patch \
     file://mtk-1001-mac80211-mtk-add-rate-duration-for-EHT-rate.patch \
     file://mtk-1002-mac80211-mtk-add-send-bar-action-when-recieve-addba-.patch \
     file://mtk-1003-mac80211-mtk-inrease-beacon-loss-count.patch \
-    file://mtk-1004-mac80211-mtk-add-disabling-cca-when-stopping-AP.patch \
+    file://mtk-1004-cfg80211-mtk-add-support-for-updating-background-cha.patch \
+    file://mtk-1005-mac80211-mtk-Allow-STA-interface-to-set-TX-queue-par.patch \
+    file://mtk-1006-mac80211-mtk-export-ieee80211_tpt_led_trig_tx-rx-for.patch \
+    file://mtk-1007-mac80211-mtk-add-packet-count-input-for-dev_sw_netst.patch \
+    file://mtk-1008-mac80211-mtk-add-per-bss-flag-to-support-vendors-cou.patch \
     "