[openwrt/openwrt] mac80211: update to version 6.11

LEDE Commits lede-commits at lists.infradead.org
Thu Sep 26 01:55:22 PDT 2024


nbd pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/384d079fd87620234abc5061be65050c3d54a4fe

commit 384d079fd87620234abc5061be65050c3d54a4fe
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Tue Sep 24 15:06:20 2024 +0200

    mac80211: update to version 6.11
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../kernel/ath10k-ct/patches/010-api_update.patch  |  11 +
 package/kernel/mac80211/Makefile                   |   4 +-
 .../patches/ath/402-ath_regd_optional.patch        |   2 +-
 .../patches/ath10k/080-ath10k_thermal_config.patch |   8 +-
 .../921-ath10k_init_devices_synchronously.patch    |   2 +-
 .../ath10k/930-ath10k_add_tpt_led_trigger.patch    |   4 +-
 ...-add-LED-and-GPIO-controlling-support-for.patch | 626 ---------------------
 .../975-ath10k-use-tpt-trigger-by-default.patch    |   2 +-
 ...84-ath10k-Try-to-get-mac-address-from-dts.patch |   2 +-
 ...0-wifi-ath11k-use-unique-QRTR-instance-ID.patch |   6 +-
 ...th11k-add-support-DT-ieee80211-freq-limit.patch |  24 -
 ...ath11k-control-thermal-support-via-symbol.patch |   8 +-
 ...11k-support-setting-FW-memory-mode-via-DT.patch |   4 +-
 ...ve-intersection-support-for-regulatory-ru.patch |  16 +-
 .../patches/ath9k/511-ath9k_reduce_rxbuf.patch     |   2 +-
 .../patches/ath9k/513-ath9k_add_pci_ids.patch      |   2 +-
 .../patches/ath9k/530-ath9k_extra_leds.patch       |   6 +-
 .../patches/ath9k/548-ath9k_enable_gpio_chip.patch |   4 +-
 .../ath9k/549-ath9k_enable_gpio_buttons.patch      |   2 +-
 .../ath9k/551-ath9k_ubnt_uap_plus_hsr.patch        |   2 +-
 .../mac80211/patches/ath9k/552-ath9k-ahb_of.patch  |   2 +-
 ...c-add-in-driver-tables-with-country-codes.patch |   2 +-
 ...5-brcmfmac-disable-dump_survey-on-bcm2835.patch |   6 +-
 .../patches/build/060-no_local_ssb_bcma.patch      | 314 -----------
 .../mac80211/patches/build/090-bcma-otp.patch      |  13 -
 .../build/100-backports-drop-QRTR-and-MHI.patch    |   2 +-
 .../patches/build/140-trace_backport.patch         | 541 ++++++++++++++++++
 .../build/150-ath_iommu_paging_domain_revert.patch |  32 ++
 .../build/200-iwlwifi_thermal_backport.patch       |  16 +-
 .../build/210-backport_genl_split_ops.patch        |   4 +-
 .../build/230-brcmfmac_usb_driver_backport.patch   |   2 +-
 .../mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch |   2 +-
 .../mwl/940-mwl8k_init_devices_synchronously.patch |   4 +-
 ...-Add-support-for-loading-EEPROM-from-user.patch |   4 +-
 ...low_disabling_bands_through_platform_data.patch |   2 +-
 ...import-support-for-external-LNA-on-MT7620.patch |   2 +-
 ...usb-schedule-rx-work-after-everything-is-.patch |  98 ----
 .../subsys/110-mac80211_keep_keys_on_stop_ap.patch |   2 +-
 .../patches/subsys/130-disable_auto_vif.patch      |   2 +-
 .../mac80211/patches/subsys/210-ap_scan.patch      |   2 +-
 ...11-increase-quantum-for-airtime-scheduler.patch |   8 +-
 ...11-clear-vif-drv_priv-after-calling-remov.patch |  29 -
 ...low-grace-period-for-DFS-available-after-.patch |   8 +-
 ...211-add-AQL-support-for-broadcast-packets.patch |  22 +-
 ...11-extend-IEEE80211_KEY_FLAG_GENERATE_MMI.patch |  70 ---
 ...1-split-helper-function-from-nl80211_put_.patch | 145 -----
 ...11-add-support-for-advertising-multiple-r.patch | 348 ------------
 ...11-extend-interface-combination-check-for.patch | 172 ------
 ...11-add-helper-for-checking-if-a-chandef-i.patch |  69 ---
 ...11-add-support-for-DFS-with-multiple-radi.patch |  88 ---
 ...11-add-radio-index-to-ieee80211_chanctx_c.patch |  66 ---
 ...11-extend-ifcomb-check-functions-for-mult.patch | 322 -----------
 ...11-move-code-in-ieee80211_link_reserve_ch.patch | 175 ------
 ...11-add-wiphy-radio-assignment-and-validat.patch | 132 -----
 ...11_hwsim-add-support-for-multi-radio-wiph.patch | 199 -------
 .../patches/subsys/400-allow-ibss-mixed.patch      |   2 +-
 package/kernel/mac80211/realtek.mk                 |  42 +-
 package/kernel/mt76/patches/100-api_update.patch   | 216 +++++++
 .../mwlwifi/patches/005-mac80211_update.patch      |   9 +
 59 files changed, 938 insertions(+), 2973 deletions(-)

diff --git a/package/kernel/ath10k-ct/patches/010-api_update.patch b/package/kernel/ath10k-ct/patches/010-api_update.patch
new file mode 100644
index 0000000000..c0d2574748
--- /dev/null
+++ b/package/kernel/ath10k-ct/patches/010-api_update.patch
@@ -0,0 +1,11 @@
+--- a/ath10k-6.9/mac.c
++++ b/ath10k-6.9/mac.c
+@@ -6238,7 +6238,7 @@ err:
+ 	return ret;
+ }
+ 
+-static void ath10k_stop(struct ieee80211_hw *hw)
++static void ath10k_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct ath10k *ar = hw->priv;
+ 	u32 opt;
diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index 099bdae46f..026d3e5f82 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=6.9.9
+PKG_VERSION:=6.11
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0-only
 PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources/
-PKG_HASH:=3417da091a57c7b1c145d44c1fae9f1e0bac6d0c8ad61b37e57b0a802eeb2837
+PKG_HASH:=2c091ce9520c2e4c8a9c91a294f3c040f90cd76222674928e61542ead06cfa41
 
 PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)
diff --git a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
index 0f6a570cb0..5f5ac20ddb 100644
--- a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
+++ b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
@@ -82,7 +82,7 @@
  	help
 --- a/local-symbols
 +++ b/local-symbols
-@@ -94,6 +94,7 @@ ADM8211=
+@@ -96,6 +96,7 @@ ADM8211=
  ATH_COMMON=
  WLAN_VENDOR_ATH=
  ATH_DEBUG=
diff --git a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
index c41bfa8888..10d95d36bf 100644
--- a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
+++ b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath10k/Kconfig
 +++ b/drivers/net/wireless/ath/ath10k/Kconfig
-@@ -88,6 +88,12 @@ config ATH10K_TRACING
+@@ -94,6 +94,12 @@ config ATH10K_TRACING
  	help
  	  Select this to ath10k use tracing infrastructure.
  
@@ -21,9 +21,9 @@
  ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
 -ath10k_core-$(CONFIG_THERMAL) += thermal.o
 +ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
+ ath10k_core-$(CPTCFG_ATH10K_LEDS) += leds.o
  ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
  ath10k_core-$(CONFIG_PM) += wow.o
- ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
 --- a/drivers/net/wireless/ath/ath10k/thermal.h
 +++ b/drivers/net/wireless/ath/ath10k/thermal.h
 @@ -25,7 +25,7 @@ struct ath10k_thermal {
@@ -37,9 +37,9 @@
  void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
 --- a/local-symbols
 +++ b/local-symbols
-@@ -153,6 +153,7 @@ ATH10K_SNOC=
- ATH10K_DEBUG=
+@@ -156,6 +156,7 @@ ATH10K_DEBUG=
  ATH10K_DEBUGFS=
+ ATH10K_LEDS=
  ATH10K_SPECTRAL=
 +ATH10K_THERMAL=
  ATH10K_TRACING=
diff --git a/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch
index 479c74e473..a7e11679a3 100644
--- a/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch
+++ b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch
@@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven at open-mesh.com>
 
 --- a/drivers/net/wireless/ath/ath10k/core.c
 +++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -3527,6 +3527,16 @@ int ath10k_core_register(struct ath10k *
+@@ -3539,6 +3539,16 @@ int ath10k_core_register(struct ath10k *
  
  	queue_work(ar->workqueue, &ar->register_work);
  
diff --git a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
index c9ad4018c8..b13bc33498 100644
--- a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
+++ b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath10k/mac.c
 +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -9918,6 +9918,21 @@ static int ath10k_mac_init_rd(struct ath
+@@ -9919,6 +9919,21 @@ static int ath10k_mac_init_rd(struct ath
  	return 0;
  }
  
@@ -22,7 +22,7 @@
  int ath10k_mac_register(struct ath10k *ar)
  {
  	static const u32 cipher_suites[] = {
-@@ -10280,6 +10295,12 @@ int ath10k_mac_register(struct ath10k *a
+@@ -10281,6 +10296,12 @@ int ath10k_mac_register(struct ath10k *a
  
  	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
  
diff --git a/package/kernel/mac80211/patches/ath10k/974-wifi-ath10k-add-LED-and-GPIO-controlling-support-for.patch b/package/kernel/mac80211/patches/ath10k/974-wifi-ath10k-add-LED-and-GPIO-controlling-support-for.patch
deleted file mode 100644
index a9eb38e576..0000000000
--- a/package/kernel/mac80211/patches/ath10k/974-wifi-ath10k-add-LED-and-GPIO-controlling-support-for.patch
+++ /dev/null
@@ -1,626 +0,0 @@
-From 8e1debd82466a3fe711784ab37e6b54e56011267 Mon Sep 17 00:00:00 2001
-From: Sebastian Gottschall <s.gottschall at dd-wrt.com>
-Date: Mon, 13 May 2024 17:22:25 +0300
-Subject: [PATCH] wifi: ath10k: add LED and GPIO controlling support for
- various chipsets
-
-Adds LED and GPIO Control support for 988x, 9887, 9888, 99x0, 9984
-based chipsets with on chipset connected led's using WMI Firmware API.
-The LED device will get available named as "ath10k-phyX" at sysfs and
-can be controlled with various triggers.
-Adds also debugfs interface for gpio control.
-
-Signed-off-by: Sebastian Gottschall <s.gottschall at dd-wrt.com>
-Reviewed-by: Steve deRosier <derosier at cal-sierra.com>
-[kvalo: major reorg and cleanup]
-Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
-[ansuel: rebase and small cleanup]
-Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
-Tested-by: Stefan Lippers-Hollmann <s.l-h at gmx.de>
-Signed-off-by: Kalle Valo <quic_kvalo at quicinc.com>
-Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
----
- drivers/net/wireless/ath/ath10k/Kconfig   |  6 ++
- drivers/net/wireless/ath/ath10k/Makefile  |  1 +
- drivers/net/wireless/ath/ath10k/core.c    | 32 ++++++++
- drivers/net/wireless/ath/ath10k/core.h    |  8 ++
- drivers/net/wireless/ath/ath10k/hw.h      |  1 +
- drivers/net/wireless/ath/ath10k/leds.c    | 90 +++++++++++++++++++++++
- drivers/net/wireless/ath/ath10k/leds.h    | 34 +++++++++
- drivers/net/wireless/ath/ath10k/mac.c     |  1 +
- drivers/net/wireless/ath/ath10k/wmi-ops.h | 32 ++++++++
- drivers/net/wireless/ath/ath10k/wmi-tlv.c |  2 +
- drivers/net/wireless/ath/ath10k/wmi.c     | 54 ++++++++++++++
- drivers/net/wireless/ath/ath10k/wmi.h     | 35 +++++++++
- 12 files changed, 296 insertions(+)
- create mode 100644 drivers/net/wireless/ath/ath10k/leds.c
- create mode 100644 drivers/net/wireless/ath/ath10k/leds.h
-
---- a/drivers/net/wireless/ath/ath10k/Kconfig
-+++ b/drivers/net/wireless/ath/ath10k/Kconfig
-@@ -73,6 +73,12 @@ config ATH10K_DEBUGFS
- 
- 	  If unsure, say Y to make it easier to debug problems.
- 
-+config ATH10K_LEDS
-+	bool
-+	depends on ATH10K
-+	depends on LEDS_CLASS=y || LEDS_CLASS=MAC80211
-+	default y
-+
- config ATH10K_SPECTRAL
- 	bool "Atheros ath10k spectral scan support"
- 	depends on ATH10K_DEBUGFS
---- a/drivers/net/wireless/ath/ath10k/Makefile
-+++ b/drivers/net/wireless/ath/ath10k/Makefile
-@@ -19,6 +19,7 @@ ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) +=
- ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o
- ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o
- ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
-+ath10k_core-$(CPTCFG_ATH10K_LEDS) += leds.o
- ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o
- ath10k_core-$(CONFIG_PM) += wow.o
- ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
---- a/local-symbols
-+++ b/local-symbols
-@@ -154,6 +154,7 @@ ATH10K_DEBUG=
- ATH10K_DEBUGFS=
- ATH10K_SPECTRAL=
- ATH10K_THERMAL=
-+ATH10K_LEDS=
- ATH10K_TRACING=
- ATH10K_DFS_CERTIFIED=
- WCN36XX=
---- a/drivers/net/wireless/ath/ath10k/core.c
-+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -27,6 +27,7 @@
- #include "testmode.h"
- #include "wmi-ops.h"
- #include "coredump.h"
-+#include "leds.h"
- 
- unsigned int ath10k_debug_mask;
- EXPORT_SYMBOL(ath10k_debug_mask);
-@@ -68,6 +69,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca988x hw2.0",
- 		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 1,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
-@@ -109,6 +111,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca988x hw2.0 ubiquiti",
- 		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 0,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
-@@ -151,6 +154,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9887 hw1.0",
- 		.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 1,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
-@@ -193,6 +197,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca6174 hw3.2 sdio",
- 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 19,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -230,6 +235,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca6164 hw2.1",
- 		.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -271,6 +277,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca6174 hw2.1",
- 		.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -312,6 +319,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca6174 hw3.0",
- 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -353,6 +361,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca6174 hw3.2",
- 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -398,6 +407,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca99x0 hw2.0",
- 		.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 17,
- 		.otp_exe_param = 0x00000700,
- 		.continuous_frag_desc = true,
- 		.cck_rate_map_rev2 = true,
-@@ -445,6 +455,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9984/qca9994 hw1.0",
- 		.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 17,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- 		.otp_exe_param = 0x00000700,
- 		.continuous_frag_desc = true,
-@@ -499,6 +510,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9888 hw2.0",
- 		.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 17,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- 		.otp_exe_param = 0x00000700,
- 		.continuous_frag_desc = true,
-@@ -550,6 +562,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9377 hw1.0",
- 		.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -591,6 +604,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9377 hw1.1",
- 		.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 6,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -634,6 +648,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca9377 hw1.1 sdio",
- 		.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 19,
-+		.led_pin = 0,
- 		.otp_exe_param = 0,
- 		.channel_counters_freq_hz = 88000,
- 		.max_probe_resp_desc_thres = 0,
-@@ -668,6 +683,7 @@ static const struct ath10k_hw_params ath
- 		.name = "qca4019 hw1.0",
- 		.patch_load_addr = QCA4019_HW_1_0_PATCH_LOAD_ADDR,
- 		.uart_pin = 7,
-+		.led_pin = 0,
- 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- 		.otp_exe_param = 0x0010000,
- 		.continuous_frag_desc = true,
-@@ -714,6 +730,7 @@ static const struct ath10k_hw_params ath
- 		.dev_id = 0,
- 		.bus = ATH10K_BUS_SNOC,
- 		.name = "wcn3990 hw1.0",
-+		.led_pin = 0,
- 		.continuous_frag_desc = true,
- 		.tx_chain_mask = 0x7,
- 		.rx_chain_mask = 0x7,
-@@ -3242,6 +3259,10 @@ int ath10k_core_start(struct ath10k *ar,
- 		goto err_hif_stop;
- 	}
- 
-+	status = ath10k_leds_start(ar);
-+	if (status)
-+		goto err_hif_stop;
-+
- 	return 0;
- 
- err_hif_stop:
-@@ -3500,9 +3521,18 @@ static void ath10k_core_register_work(st
- 		goto err_spectral_destroy;
- 	}
- 
-+	status = ath10k_leds_register(ar);
-+	if (status) {
-+		ath10k_err(ar, "could not register leds: %d\n",
-+			   status);
-+		goto err_thermal_unregister;
-+	}
-+
- 	set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
- 	return;
- 
-+err_thermal_unregister:
-+	ath10k_thermal_unregister(ar);
- err_spectral_destroy:
- 	ath10k_spectral_destroy(ar);
- err_debug_destroy:
-@@ -3548,6 +3578,8 @@ void ath10k_core_unregister(struct ath10
- 	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
- 		return;
- 
-+	ath10k_leds_unregister(ar);
-+
- 	ath10k_thermal_unregister(ar);
- 	/* Stop spectral before unregistering from mac80211 to remove the
- 	 * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
---- a/drivers/net/wireless/ath/ath10k/core.h
-+++ b/drivers/net/wireless/ath/ath10k/core.h
-@@ -15,6 +15,7 @@
- #include <linux/pci.h>
- #include <linux/uuid.h>
- #include <linux/time.h>
-+#include <linux/leds.h>
- 
- #include "htt.h"
- #include "htc.h"
-@@ -1257,6 +1258,13 @@ struct ath10k {
- 	} testmode;
- 
- 	struct {
-+		struct gpio_led wifi_led;
-+		struct led_classdev cdev;
-+		char label[48];
-+		u32 gpio_state_pin;
-+	} leds;
-+
-+	struct {
- 		/* protected by data_lock */
- 		u32 rx_crc_err_drop;
- 		u32 fw_crash_counter;
---- a/drivers/net/wireless/ath/ath10k/hw.h
-+++ b/drivers/net/wireless/ath/ath10k/hw.h
-@@ -521,6 +521,7 @@ struct ath10k_hw_params {
- 	const char *name;
- 	u32 patch_load_addr;
- 	int uart_pin;
-+	int led_pin;
- 	u32 otp_exe_param;
- 
- 	/* Type of hw cycle counter wraparound logic, for more info
---- /dev/null
-+++ b/drivers/net/wireless/ath/ath10k/leds.c
-@@ -0,0 +1,90 @@
-+// SPDX-License-Identifier: ISC
-+/*
-+ * Copyright (c) 2005-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
-+ * Copyright (c) 2018 Sebastian Gottschall <s.gottschall at dd-wrt.com>
-+ * Copyright (c) 2018 The Linux Foundation. All rights reserved.
-+ */
-+
-+#include <linux/leds.h>
-+
-+#include "core.h"
-+#include "wmi.h"
-+#include "wmi-ops.h"
-+
-+#include "leds.h"
-+
-+static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev,
-+					       enum led_brightness brightness)
-+{
-+	struct ath10k *ar = container_of(led_cdev, struct ath10k,
-+					 leds.cdev);
-+	struct gpio_led *led = &ar->leds.wifi_led;
-+
-+	mutex_lock(&ar->conf_mutex);
-+
-+	if (ar->state != ATH10K_STATE_ON)
-+		goto out;
-+
-+	ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low;
-+	ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin);
-+
-+out:
-+	mutex_unlock(&ar->conf_mutex);
-+
-+	return 0;
-+}
-+
-+int ath10k_leds_start(struct ath10k *ar)
-+{
-+	if (ar->hw_params.led_pin == 0)
-+		/* leds not supported */
-+		return 0;
-+
-+	/* under some circumstances, the gpio pin gets reconfigured
-+	 * to default state by the firmware, so we need to
-+	 * reconfigure it this behaviour has only ben seen on
-+	 * QCA9984 and QCA99XX devices so far
-+	 */
-+	ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0,
-+			       WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE);
-+	ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1);
-+
-+	return 0;
-+}
-+
-+int ath10k_leds_register(struct ath10k *ar)
-+{
-+	int ret;
-+
-+	if (ar->hw_params.led_pin == 0)
-+		/* leds not supported */
-+		return 0;
-+
-+	snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s",
-+		 wiphy_name(ar->hw->wiphy));
-+	ar->leds.wifi_led.active_low = 1;
-+	ar->leds.wifi_led.gpio = ar->hw_params.led_pin;
-+	ar->leds.wifi_led.name = ar->leds.label;
-+	ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
-+
-+	ar->leds.cdev.name = ar->leds.label;
-+	ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking;
-+	ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger;
-+
-+	ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
-+	if (ret)
-+		return ret;
-+
-+	return 0;
-+}
-+
-+void ath10k_leds_unregister(struct ath10k *ar)
-+{
-+	if (ar->hw_params.led_pin == 0)
-+		/* leds not supported */
-+		return;
-+
-+	led_classdev_unregister(&ar->leds.cdev);
-+}
-+
---- /dev/null
-+++ b/drivers/net/wireless/ath/ath10k/leds.h
-@@ -0,0 +1,34 @@
-+/* SPDX-License-Identifier: ISC */
-+/*
-+ * Copyright (c) 2005-2011 Atheros Communications Inc.
-+ * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
-+ * Copyright (c) 2018 Sebastian Gottschall <s.gottschall at dd-wrt.com>
-+ * Copyright (c) 2018 The Linux Foundation. All rights reserved.
-+ */
-+
-+#ifndef _LEDS_H_
-+#define _LEDS_H_
-+
-+#include "core.h"
-+
-+#ifdef CPTCFG_ATH10K_LEDS
-+void ath10k_leds_unregister(struct ath10k *ar);
-+int ath10k_leds_start(struct ath10k *ar);
-+int ath10k_leds_register(struct ath10k *ar);
-+#else
-+static inline void ath10k_leds_unregister(struct ath10k *ar)
-+{
-+}
-+
-+static inline int ath10k_leds_start(struct ath10k *ar)
-+{
-+	return 0;
-+}
-+
-+static inline int ath10k_leds_register(struct ath10k *ar)
-+{
-+	return 0;
-+}
-+
-+#endif
-+#endif /* _LEDS_H_ */
---- a/drivers/net/wireless/ath/ath10k/mac.c
-+++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -25,6 +25,7 @@
- #include "wmi-tlv.h"
- #include "wmi-ops.h"
- #include "wow.h"
-+#include "leds.h"
- 
- /*********/
- /* Rates */
---- a/drivers/net/wireless/ath/ath10k/wmi-ops.h
-+++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h
-@@ -226,7 +226,10 @@ struct wmi_ops {
- 			 const struct wmi_bb_timing_cfg_arg *arg);
- 	struct sk_buff *(*gen_per_peer_per_tid_cfg)(struct ath10k *ar,
- 						    const struct wmi_per_peer_per_tid_cfg_arg *arg);
-+	struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num,
-+					   u32 input, u32 pull_type, u32 intr_mode);
- 
-+	struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set);
- };
- 
- int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
-@@ -1122,6 +1125,35 @@ ath10k_wmi_force_fw_hang(struct ath10k *
- 	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
- }
- 
-+static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num,
-+					 u32 input, u32 pull_type, u32 intr_mode)
-+{
-+	struct sk_buff *skb;
-+
-+	if (!ar->wmi.ops->gen_gpio_config)
-+		return -EOPNOTSUPP;
-+
-+	skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode);
-+	if (IS_ERR(skb))
-+		return PTR_ERR(skb);
-+
-+	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid);
-+}
-+
-+static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set)
-+{
-+	struct sk_buff *skb;
-+
-+	if (!ar->wmi.ops->gen_gpio_config)
-+		return -EOPNOTSUPP;
-+
-+	skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set);
-+	if (IS_ERR(skb))
-+		return PTR_ERR(skb);
-+
-+	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid);
-+}
-+
- static inline int
- ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)
- {
---- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
-+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
-@@ -4606,6 +4606,8 @@ static const struct wmi_ops wmi_tlv_ops
- 	.gen_echo = ath10k_wmi_tlv_op_gen_echo,
- 	.gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
- 	.gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
-+	/* .gen_gpio_config not implemented */
-+	/* .gen_gpio_output not implemented */
- };
- 
- static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
---- a/drivers/net/wireless/ath/ath10k/wmi.c
-+++ b/drivers/net/wireless/ath/ath10k/wmi.c
-@@ -7493,6 +7493,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
- 	return skb;
- }
- 
-+static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar,
-+						     u32 gpio_num, u32 input,
-+						     u32 pull_type, u32 intr_mode)
-+{
-+	struct wmi_gpio_config_cmd *cmd;
-+	struct sk_buff *skb;
-+
-+	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
-+	if (!skb)
-+		return ERR_PTR(-ENOMEM);
-+
-+	cmd = (struct wmi_gpio_config_cmd *)skb->data;
-+	cmd->pull_type = __cpu_to_le32(pull_type);
-+	cmd->gpio_num = __cpu_to_le32(gpio_num);
-+	cmd->input = __cpu_to_le32(input);
-+	cmd->intr_mode = __cpu_to_le32(intr_mode);
-+
-+	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n",
-+		   gpio_num, input, pull_type, intr_mode);
-+
-+	return skb;
-+}
-+
-+static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar,
-+						     u32 gpio_num, u32 set)
-+{
-+	struct wmi_gpio_output_cmd *cmd;
-+	struct sk_buff *skb;
-+
-+	skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
-+	if (!skb)
-+		return ERR_PTR(-ENOMEM);
-+
-+	cmd = (struct wmi_gpio_output_cmd *)skb->data;
-+	cmd->gpio_num = __cpu_to_le32(gpio_num);
-+	cmd->set = __cpu_to_le32(set);
-+
-+	ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n",
-+		   gpio_num, set);
-+
-+	return skb;
-+}
-+
- static struct sk_buff *
- ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
- 			     enum wmi_sta_ps_mode psmode)
-@@ -9157,6 +9200,9 @@ static const struct wmi_ops wmi_ops = {
- 	.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
- 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- 	.gen_echo = ath10k_wmi_op_gen_echo,
-+	.gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
-+	.gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
-+
- 	/* .gen_bcn_tmpl not implemented */
- 	/* .gen_prb_tmpl not implemented */
- 	/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9227,6 +9273,8 @@ static const struct wmi_ops wmi_10_1_ops
- 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- 	.gen_echo = ath10k_wmi_op_gen_echo,
-+	.gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
-+	.gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- 	/* .gen_bcn_tmpl not implemented */
- 	/* .gen_prb_tmpl not implemented */
- 	/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9299,6 +9347,8 @@ static const struct wmi_ops wmi_10_2_ops
- 	.gen_delba_send = ath10k_wmi_op_gen_delba_send,
- 	.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- 	.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
-+	.gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
-+	.gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- 	/* .gen_pdev_enable_adaptive_cca not implemented */
- };
- 
-@@ -9370,6 +9420,8 @@ static const struct wmi_ops wmi_10_2_4_o
- 		ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
- 	.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
- 	.gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
-+	.gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
-+	.gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- 	/* .gen_bcn_tmpl not implemented */
- 	/* .gen_prb_tmpl not implemented */
- 	/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9451,6 +9503,8 @@ static const struct wmi_ops wmi_10_4_ops
- 	.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
- 	.gen_echo = ath10k_wmi_op_gen_echo,
- 	.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
-+	.gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
-+	.gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- };
- 
- int ath10k_wmi_attach(struct ath10k *ar)
---- a/drivers/net/wireless/ath/ath10k/wmi.h
-+++ b/drivers/net/wireless/ath/ath10k/wmi.h
-@@ -3034,6 +3034,41 @@ enum wmi_10_4_feature_mask {
- 
- };
- 
-+/* WMI_GPIO_CPTCFG_CMDID */
-+enum {
-+	WMI_GPIO_PULL_NONE,
-+	WMI_GPIO_PULL_UP,
-+	WMI_GPIO_PULL_DOWN,
-+};
-+
-+enum {
-+	WMI_GPIO_INTTYPE_DISABLE,
-+	WMI_GPIO_INTTYPE_RISING_EDGE,
-+	WMI_GPIO_INTTYPE_FALLING_EDGE,
-+	WMI_GPIO_INTTYPE_BOTH_EDGE,
-+	WMI_GPIO_INTTYPE_LEVEL_LOW,
-+	WMI_GPIO_INTTYPE_LEVEL_HIGH
-+};
-+
-+/* WMI_GPIO_CPTCFG_CMDID */
-+struct wmi_gpio_config_cmd {
-+	__le32 gpio_num;             /* GPIO number to be setup */
-+	__le32 input;                /* 0 - Output/ 1 - Input */
-+	__le32 pull_type;            /* Pull type defined above */
-+	__le32 intr_mode;            /* Interrupt mode defined above (Input) */
-+} __packed;
-+
-+/* WMI_GPIO_OUTPUT_CMDID */
-+struct wmi_gpio_output_cmd {
-+	__le32 gpio_num;    /* GPIO number to be setup */
-+	__le32 set;         /* Set the GPIO pin*/
-+} __packed;
-+
-+/* WMI_GPIO_INPUT_EVENTID */
-+struct wmi_gpio_input_event {
-+	__le32 gpio_num;    /* GPIO number which changed state */
-+} __packed;
-+
- struct wmi_ext_resource_config_10_4_cmd {
- 	/* contains enum wmi_host_platform_type */
- 	__le32 host_platform_config;
diff --git a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
index 5bd9186d19..fc41f5f151 100644
--- a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
+++ b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
@@ -16,7 +16,7 @@ Signed-off-by: Mathias Kresin <dev at kresin.me>
 
 --- a/drivers/net/wireless/ath/ath10k/core.h
 +++ b/drivers/net/wireless/ath/ath10k/core.h
-@@ -1313,6 +1313,10 @@ struct ath10k {
+@@ -1315,6 +1315,10 @@ struct ath10k {
  	s32 tx_power_2g_limit;
  	s32 tx_power_5g_limit;
  
diff --git a/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
index 5d70df15ad..beec6a95ea 100644
--- a/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
+++ b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
@@ -26,7 +26,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth at gmail.com>
  #include <linux/property.h>
  #include <linux/dmi.h>
  #include <linux/ctype.h>
-@@ -3429,6 +3430,8 @@ static int ath10k_core_probe_fw(struct a
+@@ -3411,6 +3412,8 @@ static int ath10k_core_probe_fw(struct a
  
  	device_get_mac_address(ar->dev, ar->mac_addr);
  
diff --git a/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch b/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
index f1583b6e96..272876288b 100644
--- a/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
+++ b/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
@@ -93,9 +93,9 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
  	default:
  		return "UNKNOWN";
  	}
-@@ -282,27 +312,14 @@ static void ath11k_mhi_op_status_cb(stru
- 		if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)))
+@@ -290,6 +320,9 @@ static void ath11k_mhi_op_status_cb(stru
  			queue_work(ab->workqueue_aux, &ab->reset_work);
+ 
  		break;
 +	case MHI_CB_EE_SBL_MODE:
 +		ath11k_mhi_qrtr_instance_set(mhi_cntrl);
@@ -103,6 +103,8 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
  	default:
  		break;
  	}
+@@ -297,22 +330,6 @@ static void ath11k_mhi_op_status_cb(stru
+ 	ab_pci->mhi_pre_cb = cb;
  }
  
 -static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl,
diff --git a/package/kernel/mac80211/patches/ath11k/101-wifi-ath11k-add-support-DT-ieee80211-freq-limit.patch b/package/kernel/mac80211/patches/ath11k/101-wifi-ath11k-add-support-DT-ieee80211-freq-limit.patch
deleted file mode 100644
index 6088b26e6b..0000000000
--- a/package/kernel/mac80211/patches/ath11k/101-wifi-ath11k-add-support-DT-ieee80211-freq-limit.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 1338da257f299d35b4d954b9fda2cc7e0a54a69d Mon Sep 17 00:00:00 2001
-From: Christian Lamparter <chunkeey at gmail.com>
-Date: Sun, 11 Jun 2023 14:37:32 +0200
-Subject: [PATCH] wifi: ath11k: add support DT ieee80211-freq-limit
-
-The common DT property can be used to limit the available
-channels/frequencies. But ath11k has to manually call
-wiphy_read_of_freq_limits().
-
-Signed-off-by: Christian Lamparter <chunkeey at gmail.com>
----
- drivers/net/wireless/ath/ath11k/mac.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireless/ath/ath11k/mac.c
-+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -10034,6 +10034,7 @@ static int __ath11k_mac_register(struct
- 	if (ret)
- 		goto err;
- 
-+	wiphy_read_of_freq_limits(ar->hw->wiphy);
- 	ath11k_mac_setup_ht_vht_cap(ar, cap, &ht_cap);
- 	ath11k_mac_setup_he_cap(ar, cap);
- 
diff --git a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
index 6b351cc81d..6a0e4ff77e 100644
--- a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
+++ b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
@@ -21,7 +21,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
 
 --- a/drivers/net/wireless/ath/ath11k/Kconfig
 +++ b/drivers/net/wireless/ath/ath11k/Kconfig
-@@ -61,3 +61,10 @@ config ATH11K_SPECTRAL
+@@ -62,3 +62,10 @@ config ATH11K_SPECTRAL
  	  Enable ath11k spectral scan support
  
  	  Say Y to enable access to the FFT/spectral data via debugfs.
@@ -34,7 +34,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
 +	  Enable ath11k thermal sensors and throttling support.
 --- a/drivers/net/wireless/ath/ath11k/Makefile
 +++ b/drivers/net/wireless/ath/ath11k/Makefile
-@@ -23,7 +23,7 @@ ath11k-y += core.o \
+@@ -24,7 +24,7 @@ ath11k-y += core.o \
  ath11k-$(CPTCFG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
  ath11k-$(CPTCFG_NL80211_TESTMODE) += testmode.o
  ath11k-$(CPTCFG_ATH11K_TRACING) += trace.o
@@ -56,11 +56,11 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
  int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state);
 --- a/local-symbols
 +++ b/local-symbols
-@@ -166,6 +166,7 @@ ATH11K_DEBUG=
+@@ -168,6 +168,7 @@ ATH11K_DEBUG=
  ATH11K_DEBUGFS=
  ATH11K_TRACING=
  ATH11K_SPECTRAL=
 +ATH11K_THERMAL=
  ATH12K=
  ATH12K_DEBUG=
- ATH12K_TRACING=
+ ATH12K_DEBUGFS=
diff --git a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
index dcf1f5f276..1250147e2b 100644
--- a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
+++ b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
@@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
  	{
  		.hw_rev = ATH11K_HW_IPQ8074,
  		.name = "ipq8074 hw2.0",
-@@ -2138,7 +2138,8 @@ static void ath11k_core_reset(struct wor
+@@ -2147,7 +2147,8 @@ static void ath11k_core_reset(struct wor
  static int ath11k_init_hw_params(struct ath11k_base *ab)
  {
  	const struct ath11k_hw_params *hw_params = NULL;
@@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
  
  	for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
  		hw_params = &ath11k_hw_params[i];
-@@ -2154,7 +2155,31 @@ static int ath11k_init_hw_params(struct
+@@ -2163,7 +2164,31 @@ static int ath11k_init_hw_params(struct
  
  	ab->hw_params = *hw_params;
  
diff --git a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
index 19f4e7dbe2..f30e03475f 100644
--- a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
+++ b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
@@ -23,7 +23,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
 
 --- a/drivers/net/wireless/ath/ath11k/reg.c
 +++ b/drivers/net/wireless/ath/ath11k/reg.c
-@@ -363,134 +363,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
+@@ -361,134 +361,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
  	return flags;
  }
  
@@ -158,7 +158,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  static const char *
  ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region)
  {
-@@ -641,11 +513,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211
+@@ -639,11 +511,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211
  
  struct ieee80211_regdomain *
  ath11k_reg_build_regd(struct ath11k_base *ab,
@@ -172,7 +172,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  	struct cur_reg_rule *reg_rule, *reg_rule_6ghz;
  	u8 i = 0, j = 0, k = 0;
  	u8 num_rules;
-@@ -688,26 +560,26 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -686,26 +558,26 @@ ath11k_reg_build_regd(struct ath11k_base
  	}
  
  	if (!num_rules)
@@ -206,7 +206,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  		   reg_info->dfs_region, num_rules);
  	/* Update reg_rules[] below. Firmware is expected to
  	 * send these rules in order(2 GHz rules first and then 5 GHz)
-@@ -746,7 +618,7 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -744,7 +616,7 @@ ath11k_reg_build_regd(struct ath11k_base
  		flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
  		flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
  
@@ -215,7 +215,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  				       reg_rule->start_freq,
  				       reg_rule->end_freq, max_bw,
  				       reg_rule->ant_gain, reg_rule->reg_power,
-@@ -761,7 +633,7 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -759,7 +631,7 @@ ath11k_reg_build_regd(struct ath11k_base
  		    reg_info->dfs_region == ATH11K_DFS_REG_ETSI &&
  		    (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW &&
  		    reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){
@@ -224,7 +224,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  							     reg_rule, &i,
  							     flags, max_bw);
  			continue;
-@@ -772,51 +644,23 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -770,51 +642,23 @@ ath11k_reg_build_regd(struct ath11k_base
  				   "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n",
  				   i + 1, reg_rule->start_freq, reg_rule->end_freq,
  				   max_bw, reg_rule->ant_gain, reg_rule->reg_power,
@@ -279,7 +279,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  static enum wmi_vdev_type ath11k_reg_get_ar_vdev_type(struct ath11k *ar)
  {
  	struct ath11k_vif *arvif;
-@@ -839,7 +683,6 @@ int ath11k_reg_handle_chan_list(struct a
+@@ -837,7 +681,6 @@ int ath11k_reg_handle_chan_list(struct a
  				enum ieee80211_ap_reg_power power_type)
  {
  	struct ieee80211_regdomain *regd;
@@ -287,7 +287,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
  	int pdev_idx;
  	struct ath11k *ar;
  	enum wmi_vdev_type vdev_type;
-@@ -891,24 +734,14 @@ int ath11k_reg_handle_chan_list(struct a
+@@ -889,24 +732,14 @@ int ath11k_reg_handle_chan_list(struct a
  		    (char *)reg_info->alpha2, 2))
  		goto retfail;
  
diff --git a/package/kernel/mac80211/patches/ath9k/511-ath9k_reduce_rxbuf.patch b/package/kernel/mac80211/patches/ath9k/511-ath9k_reduce_rxbuf.patch
index 3abf16b03e..d806782889 100644
--- a/package/kernel/mac80211/patches/ath9k/511-ath9k_reduce_rxbuf.patch
+++ b/package/kernel/mac80211/patches/ath9k/511-ath9k_reduce_rxbuf.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -89,7 +89,7 @@ int ath_descdma_setup(struct ath_softc *
+@@ -90,7 +90,7 @@ int ath_descdma_setup(struct ath_softc *
  		(_l) &= ((_sz) - 1);		\
  	} while (0)
  
diff --git a/package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch
index a085e3a1fb..6b60d3c089 100644
--- a/package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch
+++ b/package/kernel/mac80211/patches/ath9k/513-ath9k_add_pci_ids.patch
@@ -20,7 +20,7 @@
  #define AR9160_DEVID_PCI	0x0027
 --- a/drivers/net/wireless/ath/ath9k/pci.c
 +++ b/drivers/net/wireless/ath/ath9k/pci.c
-@@ -774,6 +774,7 @@ static const struct pci_device_id ath_pc
+@@ -772,6 +772,7 @@ static const struct pci_device_id ath_pc
  	  .driver_data = ATH9K_PCI_BT_ANT_DIV },
  #endif
  
diff --git a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
index 1b2d4cb5d4..71a6dd9f00 100644
--- a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
+++ b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -844,6 +844,9 @@ static inline int ath9k_dump_btcoex(stru
+@@ -845,6 +845,9 @@ static inline int ath9k_dump_btcoex(stru
  #ifdef CPTCFG_MAC80211_LEDS
  void ath_init_leds(struct ath_softc *sc);
  void ath_deinit_leds(struct ath_softc *sc);
@@ -10,7 +10,7 @@
  #else
  static inline void ath_init_leds(struct ath_softc *sc)
  {
-@@ -980,6 +983,13 @@ void ath_ant_comb_scan(struct ath_softc
+@@ -981,6 +984,13 @@ void ath_ant_comb_scan(struct ath_softc
  
  #define ATH9K_NUM_CHANCTX  2 /* supports 2 operating channels */
  
@@ -24,7 +24,7 @@
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
-@@ -1033,9 +1043,8 @@ struct ath_softc {
+@@ -1034,9 +1044,8 @@ struct ath_softc {
  	spinlock_t chan_lock;
  
  #ifdef CPTCFG_MAC80211_LEDS
diff --git a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
index 643d51285b..bb0127b011 100644
--- a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
+++ b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
@@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
  #include "common.h"
  #include "debug.h"
-@@ -990,6 +991,14 @@ struct ath_led {
+@@ -991,6 +992,14 @@ struct ath_led {
  	struct led_classdev cdev;
  };
  
@@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  struct ath_softc {
  	struct ieee80211_hw *hw;
  	struct device *dev;
-@@ -1045,6 +1054,9 @@ struct ath_softc {
+@@ -1046,6 +1055,9 @@ struct ath_softc {
  #ifdef CPTCFG_MAC80211_LEDS
  	const char *led_default_trigger;
  	struct list_head leds;
diff --git a/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch
index 0b2acf8af1..f8aed716f5 100644
--- a/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch
+++ b/package/kernel/mac80211/patches/ath9k/549-ath9k_enable_gpio_buttons.patch
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 ---
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -1056,6 +1056,7 @@ struct ath_softc {
+@@ -1057,6 +1057,7 @@ struct ath_softc {
  	struct list_head leds;
  #ifdef CONFIG_GPIOLIB
  	struct ath9k_gpio_chip *gpiochip;
diff --git a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
index 4e4cab986b..3ccd3fc487 100644
--- a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
+++ b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
@@ -371,7 +371,7 @@
  
 --- a/local-symbols
 +++ b/local-symbols
-@@ -121,6 +121,7 @@ ATH9K_WOW=
+@@ -123,6 +123,7 @@ ATH9K_WOW=
  ATH9K_RFKILL=
  ATH9K_CHANNEL_CONTEXT=
  ATH9K_PCOEM=
diff --git a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
index a4efdcd1bc..3adc8bb8d6 100644
--- a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
+++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
@@ -272,7 +272,7 @@
  
  #include "common.h"
  #include "debug.h"
-@@ -1012,6 +1013,9 @@ struct ath_softc {
+@@ -1013,6 +1014,9 @@ struct ath_softc {
  	struct ath_hw *sc_ah;
  	void __iomem *mem;
  	int irq;
diff --git a/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch b/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch
index f873528e26..25f0d254c0 100644
--- a/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch
+++ b/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch
@@ -49,7 +49,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
  void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
  		    struct brcmf_mp_device *settings)
  {
-@@ -113,6 +143,8 @@ void brcmf_of_probe(struct device *dev,
+@@ -114,6 +144,8 @@ void brcmf_of_probe(struct device *dev,
  		of_node_put(root);
  	}
  
diff --git a/package/kernel/mac80211/patches/brcm/865-brcmfmac-disable-dump_survey-on-bcm2835.patch b/package/kernel/mac80211/patches/brcm/865-brcmfmac-disable-dump_survey-on-bcm2835.patch
index 975647444f..275f0aa166 100644
--- a/package/kernel/mac80211/patches/brcm/865-brcmfmac-disable-dump_survey-on-bcm2835.patch
+++ b/package/kernel/mac80211/patches/brcm/865-brcmfmac-disable-dump_survey-on-bcm2835.patch
@@ -9,7 +9,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -7979,6 +7979,7 @@ static s32 brcmf_translate_country_code(
+@@ -7986,6 +7986,7 @@ static s32 brcmf_translate_country_code(
  	return 0;
  }
  
@@ -17,7 +17,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
  static int
  brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
  {
-@@ -8201,6 +8202,7 @@ exit:
+@@ -8208,6 +8209,7 @@ exit:
  		brcmf_set_mpc(ifp, 1);
  	return err;
  }
@@ -25,7 +25,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
  
  static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
  					struct regulatory_request *req)
-@@ -8353,8 +8355,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
+@@ -8360,8 +8362,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
  		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
  #endif
diff --git a/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch
deleted file mode 100644
index 0dad745b4f..0000000000
--- a/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch
+++ /dev/null
@@ -1,314 +0,0 @@
---- a/local-symbols
-+++ b/local-symbols
-@@ -471,43 +471,6 @@ USB_VL600=
- USB_NET_CH9200=
- USB_NET_AQC111=
- USB_RTL8153_ECM=
--SSB_POSSIBLE=
--SSB=
--SSB_SPROM=
--SSB_BLOCKIO=
--SSB_PCIHOST_POSSIBLE=
--SSB_PCIHOST=
--SSB_B43_PCI_BRIDGE=
--SSB_PCMCIAHOST_POSSIBLE=
--SSB_PCMCIAHOST=
--SSB_SDIOHOST_POSSIBLE=
--SSB_SDIOHOST=
--SSB_HOST_SOC=
--SSB_SERIAL=
--SSB_DRIVER_PCICORE_POSSIBLE=
--SSB_DRIVER_PCICORE=
--SSB_PCICORE_HOSTMODE=
--SSB_DRIVER_MIPS=
--SSB_SFLASH=
--SSB_EMBEDDED=
--SSB_DRIVER_EXTIF=
--SSB_DRIVER_GIGE=
--SSB_DRIVER_GPIO=
--BCMA_POSSIBLE=
--BCMA=
--BCMA_BLOCKIO=
--BCMA_HOST_PCI_POSSIBLE=
--BCMA_HOST_PCI=
--BCMA_HOST_SOC=
--BCMA_DRIVER_PCI=
--BCMA_DRIVER_PCI_HOSTMODE=
--BCMA_DRIVER_MIPS=
--BCMA_PFLASH=
--BCMA_SFLASH=
--BCMA_NFLASH=
--BCMA_DRIVER_GMAC_CMN=
--BCMA_DRIVER_GPIO=
--BCMA_DEBUG=
- USB_ACM=
- USB_PRINTER=
- USB_WDM=
---- a/drivers/net/wireless/broadcom/b43/Kconfig
-+++ b/drivers/net/wireless/broadcom/b43/Kconfig
-@@ -63,21 +63,21 @@ endchoice
- config B43_PCI_AUTOSELECT
- 	bool
- 	depends on B43 && SSB_PCIHOST_POSSIBLE
--	select SSB_PCIHOST
--	select SSB_B43_PCI_BRIDGE
-+	depends on SSB_PCIHOST
-+	depends on SSB_B43_PCI_BRIDGE
- 	default y
- 
- # Auto-select SSB PCICORE driver, if possible
- config B43_PCICORE_AUTOSELECT
- 	bool
- 	depends on B43 && SSB_DRIVER_PCICORE_POSSIBLE
--	select SSB_DRIVER_PCICORE
-+	depends on SSB_DRIVER_PCICORE
- 	default y
- 
- config B43_SDIO
- 	bool "Broadcom 43xx SDIO device support"
- 	depends on B43 && B43_SSB && SSB_SDIOHOST_POSSIBLE
--	select SSB_SDIOHOST
-+	depends on SSB_SDIOHOST
- 	help
- 	  Broadcom 43xx device support for Soft-MAC SDIO devices.
- 
-@@ -96,13 +96,13 @@ config B43_SDIO
- config B43_BCMA_PIO
- 	bool
- 	depends on B43 && B43_BCMA
--	select BCMA_BLOCKIO
-+	depends on BCMA_BLOCKIO
- 	default y
- 
- config B43_PIO
- 	bool
- 	depends on B43 && B43_SSB
--	select SSB_BLOCKIO
-+	depends on SSB_BLOCKIO
- 	default y
- 
- config B43_PHY_G
---- a/drivers/net/wireless/broadcom/b43/main.c
-+++ b/drivers/net/wireless/broadcom/b43/main.c
-@@ -2854,7 +2854,7 @@ static struct ssb_device *b43_ssb_gpio_d
- {
- 	struct ssb_bus *bus = dev->dev->sdev->bus;
- 
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- 	return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
- #else
- 	return bus->chipco.dev;
-@@ -4873,7 +4873,7 @@ static int b43_wireless_core_init(struct
- 	}
- 	if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
- 		hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
--#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
-+#if defined(CPTCFG_B43_SSB) && defined(CONFIG_SSB_DRIVER_PCICORE)
- 	if (dev->dev->bus_type == B43_BUS_SSB &&
- 	    dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
- 	    dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
---- a/drivers/net/wireless/broadcom/b43legacy/Kconfig
-+++ b/drivers/net/wireless/broadcom/b43legacy/Kconfig
-@@ -3,7 +3,7 @@ config B43LEGACY
- 	tristate "Broadcom 43xx-legacy wireless support (mac80211 stack)"
- 	depends on m
- 	depends on SSB_POSSIBLE && MAC80211 && HAS_DMA
--	select SSB
-+	depends on SSB
- 	depends on FW_LOADER
- 	help
- 	  b43legacy is a driver for 802.11b devices from Broadcom (BCM4301 and
-@@ -25,15 +25,15 @@ config B43LEGACY
- config B43LEGACY_PCI_AUTOSELECT
- 	bool
- 	depends on B43LEGACY && SSB_PCIHOST_POSSIBLE
--	select SSB_PCIHOST
--	select SSB_B43_PCI_BRIDGE
-+	depends on SSB_PCIHOST
-+	depends on SSB_B43_PCI_BRIDGE
- 	default y
- 
- # Auto-select SSB PCICORE driver, if possible
- config B43LEGACY_PCICORE_AUTOSELECT
- 	bool
- 	depends on B43LEGACY && SSB_DRIVER_PCICORE_POSSIBLE
--	select SSB_DRIVER_PCICORE
-+	depends on SSB_DRIVER_PCICORE
- 	default y
- 
- # LED support
---- a/drivers/net/wireless/broadcom/b43legacy/main.c
-+++ b/drivers/net/wireless/broadcom/b43legacy/main.c
-@@ -1907,7 +1907,7 @@ static int b43legacy_gpio_init(struct b4
- 	if (dev->dev->id.revision >= 2)
- 		mask  |= 0x0010; /* FIXME: This is redundant. */
- 
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- 	pcidev = bus->pcicore.dev;
- #endif
- 	gpiodev = bus->chipco.dev ? : pcidev;
-@@ -1926,7 +1926,7 @@ static void b43legacy_gpio_cleanup(struc
- 	struct ssb_bus *bus = dev->dev->bus;
- 	struct ssb_device *gpiodev, *pcidev = NULL;
- 
--#ifdef CPTCFG_SSB_DRIVER_PCICORE
-+#ifdef CONFIG_SSB_DRIVER_PCICORE
- 	pcidev = bus->pcicore.dev;
- #endif
- 	gpiodev = bus->chipco.dev ? : pcidev;
---- a/drivers/net/wireless/broadcom/brcm80211/Kconfig
-+++ b/drivers/net/wireless/broadcom/brcm80211/Kconfig
-@@ -8,7 +8,7 @@ config BRCMSMAC
- 	depends on m
- 	depends on MAC80211
- 	depends on BCMA_POSSIBLE
--	select BCMA
-+	depends on BCMA
- 	select BRCMUTIL
- 	depends on FW_LOADER
- 	depends on CORDIC
---- a/Kconfig.local
-+++ b/Kconfig.local
-@@ -1417,117 +1417,6 @@ config BACKPORTED_USB_NET_AQC111
- config BACKPORTED_USB_RTL8153_ECM
- 	tristate
- 	default USB_RTL8153_ECM
--config BACKPORTED_SSB_POSSIBLE
--	tristate
--	default SSB_POSSIBLE
--config BACKPORTED_SSB
--	tristate
--	default SSB
--config BACKPORTED_SSB_SPROM
--	tristate
--	default SSB_SPROM
--config BACKPORTED_SSB_BLOCKIO
--	tristate
--	default SSB_BLOCKIO
--config BACKPORTED_SSB_PCIHOST_POSSIBLE
--	tristate
--	default SSB_PCIHOST_POSSIBLE
--config BACKPORTED_SSB_PCIHOST
--	tristate
--	default SSB_PCIHOST
--config BACKPORTED_SSB_B43_PCI_BRIDGE
--	tristate
--	default SSB_B43_PCI_BRIDGE
--config BACKPORTED_SSB_PCMCIAHOST_POSSIBLE
--	tristate
--	default SSB_PCMCIAHOST_POSSIBLE
--config BACKPORTED_SSB_PCMCIAHOST
--	tristate
--	default SSB_PCMCIAHOST
--config BACKPORTED_SSB_SDIOHOST_POSSIBLE
--	tristate
--	default SSB_SDIOHOST_POSSIBLE
--config BACKPORTED_SSB_SDIOHOST
--	tristate
--	default SSB_SDIOHOST
--config BACKPORTED_SSB_HOST_SOC
--	tristate
--	default SSB_HOST_SOC
--config BACKPORTED_SSB_SERIAL
--	tristate
--	default SSB_SERIAL
--config BACKPORTED_SSB_DRIVER_PCICORE_POSSIBLE
--	tristate
--	default SSB_DRIVER_PCICORE_POSSIBLE
--config BACKPORTED_SSB_DRIVER_PCICORE
--	tristate
--	default SSB_DRIVER_PCICORE
--config BACKPORTED_SSB_PCICORE_HOSTMODE
--	tristate
--	default SSB_PCICORE_HOSTMODE
--config BACKPORTED_SSB_DRIVER_MIPS
--	tristate
--	default SSB_DRIVER_MIPS
--config BACKPORTED_SSB_SFLASH
--	tristate
--	default SSB_SFLASH
--config BACKPORTED_SSB_EMBEDDED
--	tristate
--	default SSB_EMBEDDED
--config BACKPORTED_SSB_DRIVER_EXTIF
--	tristate
--	default SSB_DRIVER_EXTIF
--config BACKPORTED_SSB_DRIVER_GIGE
--	tristate
--	default SSB_DRIVER_GIGE
--config BACKPORTED_SSB_DRIVER_GPIO
--	tristate
--	default SSB_DRIVER_GPIO
--config BACKPORTED_BCMA_POSSIBLE
--	tristate
--	default BCMA_POSSIBLE
--config BACKPORTED_BCMA
--	tristate
--	default BCMA
--config BACKPORTED_BCMA_BLOCKIO
--	tristate
--	default BCMA_BLOCKIO
--config BACKPORTED_BCMA_HOST_PCI_POSSIBLE
--	tristate
--	default BCMA_HOST_PCI_POSSIBLE
--config BACKPORTED_BCMA_HOST_PCI
--	tristate
--	default BCMA_HOST_PCI
--config BACKPORTED_BCMA_HOST_SOC
--	tristate
--	default BCMA_HOST_SOC
--config BACKPORTED_BCMA_DRIVER_PCI
--	tristate
--	default BCMA_DRIVER_PCI
--config BACKPORTED_BCMA_DRIVER_PCI_HOSTMODE
--	tristate
--	default BCMA_DRIVER_PCI_HOSTMODE
--config BACKPORTED_BCMA_DRIVER_MIPS
--	tristate
--	default BCMA_DRIVER_MIPS
--config BACKPORTED_BCMA_PFLASH
--	tristate
--	default BCMA_PFLASH
--config BACKPORTED_BCMA_SFLASH
--	tristate
--	default BCMA_SFLASH
--config BACKPORTED_BCMA_NFLASH
--	tristate
--	default BCMA_NFLASH
--config BACKPORTED_BCMA_DRIVER_GMAC_CMN
--	tristate
--	default BCMA_DRIVER_GMAC_CMN
--config BACKPORTED_BCMA_DRIVER_GPIO
--	tristate
--	default BCMA_DRIVER_GPIO
--config BACKPORTED_BCMA_DEBUG
--	tristate
--	default BCMA_DEBUG
- config BACKPORTED_USB_ACM
- 	tristate
- 	default USB_ACM
---- a/Kconfig.sources
-+++ b/Kconfig.sources
-@@ -10,9 +10,6 @@ source "$BACKPORT_DIR/drivers/soc/qcom/K
- source "$BACKPORT_DIR/drivers/net/wireless/Kconfig"
- source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
- 
--source "$BACKPORT_DIR/drivers/ssb/Kconfig"
--source "$BACKPORT_DIR/drivers/bcma/Kconfig"
--
- source "$BACKPORT_DIR/drivers/usb/class/Kconfig"
- 
- source "$BACKPORT_DIR/drivers/staging/Kconfig"
---- a/Makefile.kernel
-+++ b/Makefile.kernel
-@@ -42,8 +42,6 @@ obj-$(CPTCFG_QRTR) += net/qrtr/
- obj-$(CPTCFG_QCOM_QMI_HELPERS) += drivers/soc/qcom/
- obj-$(CPTCFG_MHI_BUS) += drivers/bus/mhi/
- obj-$(CPTCFG_WLAN) += drivers/net/wireless/
--obj-$(CPTCFG_SSB) += drivers/ssb/
--obj-$(CPTCFG_BCMA) += drivers/bcma/
- obj-$(CPTCFG_USB_NET_RNDIS_WLAN) += drivers/net/usb/
- 
- obj-$(CPTCFG_USB_WDM) += drivers/usb/class/
diff --git a/package/kernel/mac80211/patches/build/090-bcma-otp.patch b/package/kernel/mac80211/patches/build/090-bcma-otp.patch
deleted file mode 100644
index 3974776124..0000000000
--- a/package/kernel/mac80211/patches/build/090-bcma-otp.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- /dev/null
-+++ b/backport-include/linux/bcma/bcma_driver_chipcommon.h
-@@ -0,0 +1,10 @@
-+#ifndef __BACKPORT_BCMA_DRIVER_CHIPCOMMON_H
-+#define __BACKPORT_BCMA_DRIVER_CHIPCOMMON_H
-+
-+#include_next <linux/bcma/bcma_driver_chipcommon.h>
-+
-+#ifndef BCMA_CC_SROM_CONTROL_OTP_PRESENT
-+#define BCMA_CC_SROM_CONTROL_OTP_PRESENT 0x00000020
-+#endif
-+
-+#endif
diff --git a/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
index a3a65c2d2a..f4dc5508b1 100644
--- a/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
+++ b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
@@ -54,9 +54,9 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
 +	depends on MHI_BUS
 +	depends on QRTR
 +	depends on QRTR_MHI
+ 	select PCI_PWRCTL_PWRSEQ if HAVE_PWRCTL
  	help
  	  This module adds support for PCIE bus
- 
 --- a/local-symbols
 +++ b/local-symbols
 @@ -59,14 +59,6 @@ MAC80211_MESH_PS_DEBUG=
diff --git a/package/kernel/mac80211/patches/build/140-trace_backport.patch b/package/kernel/mac80211/patches/build/140-trace_backport.patch
new file mode 100644
index 0000000000..00ee47e1a4
--- /dev/null
+++ b/package/kernel/mac80211/patches/build/140-trace_backport.patch
@@ -0,0 +1,541 @@
+--- a/drivers/bus/mhi/host/trace.h
++++ b/drivers/bus/mhi/host/trace.h
+@@ -103,7 +103,7 @@ TRACE_EVENT(mhi_gen_tre,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		__entry->ch_num = mhi_chan->chan;
+ 		__entry->wp = mhi_tre;
+ 		__entry->tre_ptr = mhi_tre->ptr;
+@@ -131,7 +131,7 @@ TRACE_EVENT(mhi_intvec_states,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		__entry->local_ee = mhi_cntrl->ee;
+ 		__entry->state = mhi_cntrl->dev_state;
+ 		__entry->dev_ee = dev_ee;
+@@ -158,7 +158,7 @@ TRACE_EVENT(mhi_tryset_pm_state,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		if (pm_state)
+ 			pm_state = __fls(pm_state);
+ 		__entry->pm_state = pm_state;
+@@ -184,7 +184,7 @@ DECLARE_EVENT_CLASS(mhi_process_event_ri
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		__entry->rp = rp;
+ 		__entry->ptr = rp->ptr;
+ 		__entry->dword0 = rp->dword[0];
+@@ -226,7 +226,7 @@ DECLARE_EVENT_CLASS(mhi_update_channel_s
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		__entry->ch_num = mhi_chan->chan;
+ 		__entry->state = state;
+ 		__entry->reason = reason;
+@@ -265,7 +265,7 @@ TRACE_EVENT(mhi_pm_st_transition,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(name);
++		__assign_str(name, mhi_cntrl->mhi_dev->name);
+ 		__entry->state = state;
+ 	),
+ 
+--- a/drivers/net/wireless/ath/ath10k/trace.h
++++ b/drivers/net/wireless/ath/ath10k/trace.h
+@@ -55,8 +55,8 @@ DECLARE_EVENT_CLASS(ath10k_log_event,
+ 		__vstring(msg, vaf->fmt, vaf->va)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk(
+@@ -92,8 +92,8 @@ TRACE_EVENT(ath10k_log_dbg,
+ 		__vstring(msg, vaf->fmt, vaf->va)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->level = level;
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+@@ -121,10 +121,10 @@ TRACE_EVENT(ath10k_log_dbg_dump,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
+-		__assign_str(msg);
+-		__assign_str(prefix);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
++		__assign_str(msg, msg);
++		__assign_str(prefix, prefix);
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+ 	),
+@@ -152,8 +152,8 @@ TRACE_EVENT(ath10k_wmi_cmd,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->id = id;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+@@ -182,8 +182,8 @@ TRACE_EVENT(ath10k_wmi_event,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->id = id;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+@@ -211,8 +211,8 @@ TRACE_EVENT(ath10k_htt_stats,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+ 	),
+@@ -239,8 +239,8 @@ TRACE_EVENT(ath10k_wmi_dbglog,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->hw_type = ar->hw_rev;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+@@ -269,8 +269,8 @@ TRACE_EVENT(ath10k_htt_pktlog,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->hw_type = ar->hw_rev;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(pktlog), buf, buf_len);
+@@ -301,8 +301,8 @@ TRACE_EVENT(ath10k_htt_tx,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->msdu_id = msdu_id;
+ 		__entry->msdu_len = msdu_len;
+ 		__entry->vdev_id = vdev_id;
+@@ -332,8 +332,8 @@ TRACE_EVENT(ath10k_txrx_tx_unref,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->msdu_id = msdu_id;
+ 	),
+ 
+@@ -358,8 +358,8 @@ DECLARE_EVENT_CLASS(ath10k_hdr_event,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->len = ath10k_frm_hdr_len(data, len);
+ 		memcpy(__get_dynamic_array(data), data, __entry->len);
+ 	),
+@@ -386,8 +386,8 @@ DECLARE_EVENT_CLASS(ath10k_payload_event
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->len = len - ath10k_frm_hdr_len(data, len);
+ 		memcpy(__get_dynamic_array(payload),
+ 		       data + ath10k_frm_hdr_len(data, len), __entry->len);
+@@ -435,8 +435,8 @@ TRACE_EVENT(ath10k_htt_rx_desc,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->hw_type = ar->hw_rev;
+ 		__entry->len = len;
+ 		memcpy(__get_dynamic_array(rxdesc), data, len);
+@@ -472,8 +472,8 @@ TRACE_EVENT(ath10k_wmi_diag_container,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->type = type;
+ 		__entry->timestamp = timestamp;
+ 		__entry->code = code;
+@@ -505,8 +505,8 @@ TRACE_EVENT(ath10k_wmi_diag,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->dev));
++		__assign_str(driver, dev_driver_string(ar->dev));
+ 		__entry->len = len;
+ 		memcpy(__get_dynamic_array(data), data, len);
+ 	),
+--- a/drivers/net/wireless/ath/ath11k/trace.h
++++ b/drivers/net/wireless/ath/ath11k/trace.h
+@@ -48,8 +48,8 @@ TRACE_EVENT(ath11k_htt_pktlog,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->buf_len = buf_len;
+ 		__entry->pktlog_checksum = pktlog_checksum;
+ 		memcpy(__get_dynamic_array(pktlog), buf, buf_len);
+@@ -77,8 +77,8 @@ TRACE_EVENT(ath11k_htt_ppdu_stats,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->len = len;
+ 		memcpy(__get_dynamic_array(ppdu), data, len);
+ 	),
+@@ -105,8 +105,8 @@ TRACE_EVENT(ath11k_htt_rxdesc,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->len = len;
+ 		__entry->log_type = log_type;
+ 		memcpy(__get_dynamic_array(rxdesc), data, len);
+@@ -130,8 +130,8 @@ DECLARE_EVENT_CLASS(ath11k_log_event,
+ 		__vstring(msg, vaf->fmt, vaf->va)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk(
+@@ -171,8 +171,8 @@ TRACE_EVENT(ath11k_wmi_cmd,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__entry->id = id;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+@@ -201,8 +201,8 @@ TRACE_EVENT(ath11k_wmi_event,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__entry->id = id;
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+@@ -230,8 +230,8 @@ TRACE_EVENT(ath11k_log_dbg,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__entry->level = level;
+ 		WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
+ 				       ATH11K_MSG_MAX, vaf->fmt,
+@@ -262,10 +262,10 @@ TRACE_EVENT(ath11k_log_dbg_dump,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
+-		__assign_str(msg);
+-		__assign_str(prefix);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
++		__assign_str(msg, msg);
++		__assign_str(prefix, prefix);
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+ 	),
+@@ -292,8 +292,8 @@ TRACE_EVENT(ath11k_wmi_diag,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__entry->len = len;
+ 		memcpy(__get_dynamic_array(data), data, len);
+ 	),
+@@ -318,8 +318,8 @@ TRACE_EVENT(ath11k_ps_timekeeper,
+ 			 __field(u32, peer_ps_timestamp)
+ 	),
+ 
+-	TP_fast_assign(__assign_str(device);
+-		       __assign_str(driver);
++	TP_fast_assign(__assign_str(device, dev_name(ar->ab->dev));
++		       __assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		       memcpy(__get_dynamic_array(peer_addr), peer_addr,
+ 			      ETH_ALEN);
+ 		       __entry->peer_ps_state = peer_ps_state;
+--- a/drivers/net/wireless/ath/ath12k/trace.h
++++ b/drivers/net/wireless/ath/ath12k/trace.h
+@@ -36,8 +36,8 @@ TRACE_EVENT(ath12k_htt_pktlog,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->buf_len = buf_len;
+ 		__entry->pktlog_checksum = pktlog_checksum;
+ 		memcpy(__get_dynamic_array(pktlog), buf, buf_len);
+@@ -73,8 +73,8 @@ TRACE_EVENT(ath12k_htt_ppdu_stats,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->len = len;
+ 		__entry->info = ar->pdev->timestamp.info;
+ 		__entry->sync_tstmp_lo_us = ar->pdev->timestamp.sync_timestamp_hi_us;
+@@ -117,8 +117,8 @@ TRACE_EVENT(ath12k_htt_rxdesc,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ar->ab->dev));
++		__assign_str(driver, dev_driver_string(ar->ab->dev));
+ 		__entry->len = len;
+ 		__entry->type = type;
+ 		__entry->info = ar->pdev->timestamp.info;
+@@ -153,8 +153,8 @@ TRACE_EVENT(ath12k_wmi_diag,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(device);
+-		__assign_str(driver);
++		__assign_str(device, dev_name(ab->dev));
++		__assign_str(driver, dev_driver_string(ab->dev));
+ 		__entry->len = len;
+ 		memcpy(__get_dynamic_array(data), data, len);
+ 	),
+--- a/drivers/net/wireless/ath/ath6kl/trace.h
++++ b/drivers/net/wireless/ath/ath6kl/trace.h
+@@ -304,8 +304,8 @@ TRACE_EVENT(ath6kl_log_dbg_dump,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(msg);
+-		__assign_str(prefix);
++		__assign_str(msg, msg);
++		__assign_str(prefix, prefix);
+ 		__entry->buf_len = buf_len;
+ 		memcpy(__get_dynamic_array(buf), buf, buf_len);
+ 	),
+--- a/drivers/net/wireless/ath/trace.h
++++ b/drivers/net/wireless/ath/trace.h
+@@ -44,8 +44,8 @@ TRACE_EVENT(ath_log,
+ 	    ),
+ 
+ 	    TP_fast_assign(
+-		    __assign_str(device);
+-		    __assign_str(driver);
++		    __assign_str(device, wiphy_name(wiphy));
++		    __assign_str(driver, KBUILD_MODNAME);
+ 		    __assign_vstr(msg, vaf->fmt, vaf->va);
+ 	    ),
+ 
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.h
+@@ -41,7 +41,7 @@ TRACE_EVENT(brcmf_err,
+ 		__vstring(msg, vaf->fmt, vaf->va)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(func);
++		__assign_str(func, func);
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk("%s: %s", __get_str(func), __get_str(msg))
+@@ -57,7 +57,7 @@ TRACE_EVENT(brcmf_dbg,
+ 	),
+ 	TP_fast_assign(
+ 		__entry->level = level;
+-		__assign_str(func);
++		__assign_str(func, func);
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk("%s: %s", __get_str(func), __get_str(msg))
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac.h
+@@ -81,7 +81,7 @@ TRACE_EVENT(brcms_macintstatus,
+ 		__field(u32, mask)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(dev);
++		__assign_str(dev, dev_name(dev));
+ 		__entry->in_isr = in_isr;
+ 		__entry->macintstatus = macintstatus;
+ 		__entry->mask = mask;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h
+@@ -71,7 +71,7 @@ TRACE_EVENT(brcms_dbg,
+ 	),
+ 	TP_fast_assign(
+ 		__entry->level = level;
+-		__assign_str(func);
++		__assign_str(func, func);
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk("%s: %s", __get_str(func), __get_str(msg))
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_tx.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/brcms_trace_brcmsmac_tx.h
+@@ -31,7 +31,7 @@ TRACE_EVENT(brcms_txdesc,
+ 		__dynamic_array(u8, txh, txh_len)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(dev);
++		__assign_str(dev, dev_name(dev));
+ 		memcpy(__get_dynamic_array(txh), txh, txh_len);
+ 	),
+ 	TP_printk("[%s] txdesc", __get_str(dev))
+@@ -54,7 +54,7 @@ TRACE_EVENT(brcms_txstatus,
+ 		__field(u16, ackphyrxsh)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(dev);
++		__assign_str(dev, dev_name(dev));
+ 		__entry->framelen = framelen;
+ 		__entry->frameid = frameid;
+ 		__entry->status = status;
+@@ -85,7 +85,7 @@ TRACE_EVENT(brcms_ampdu_session,
+ 		__field(u16, dma_len)
+ 	),
+ 	TP_fast_assign(
+-		__assign_str(dev);
++		__assign_str(dev, dev_name(dev));
+ 		__entry->max_ampdu_len = max_ampdu_len;
+ 		__entry->max_ampdu_frames = max_ampdu_frames;
+ 		__entry->ampdu_len = ampdu_len;
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h
+@@ -57,7 +57,7 @@ TRACE_EVENT(iwlwifi_dbg,
+ 	),
+ 	TP_fast_assign(
+ 		__entry->level = level;
+-		__assign_str(function);
++		__assign_str(function, function);
+ 		__assign_vstr(msg, vaf->fmt, vaf->va);
+ 	),
+ 	TP_printk("%s", __get_str(msg))
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h
+@@ -87,7 +87,7 @@ static inline void trace_ ## name(proto)
+ #endif
+ 
+ #define DEV_ENTRY	__string(dev, dev_name(dev))
+-#define DEV_ASSIGN	__assign_str(dev)
++#define DEV_ASSIGN	__assign_str(dev, dev_name(dev))
+ 
+ #include "iwl-devtrace-io.h"
+ #include "iwl-devtrace-ucode.h"
+--- a/include/trace/events/qrtr.h
++++ b/include/trace/events/qrtr.h
+@@ -102,7 +102,7 @@ TRACE_EVENT(qrtr_ns_message,
+ 	),
+ 
+ 	TP_fast_assign(
+-		__assign_str(ctrl_pkt_str);
++		__assign_str(ctrl_pkt_str, ctrl_pkt_str);
+ 		__entry->sq_node = sq_node;
+ 		__entry->sq_port = sq_port;
+ 	),
+--- a/net/mac80211/trace.h
++++ b/net/mac80211/trace.h
+@@ -33,7 +33,7 @@
+ 			__string(vif_name, sdata->name)
+ #define VIF_ASSIGN	__entry->vif_type = sdata->vif.type; __entry->sdata = sdata;	\
+ 			__entry->p2p = sdata->vif.p2p;					\
+-			__assign_str(vif_name)
++			__assign_str(vif_name, sdata->name)
+ #define VIF_PR_FMT	" vif:%s(%d%s)"
+ #define VIF_PR_ARG	__get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
+ 
+--- a/net/wireless/trace.h
++++ b/net/wireless/trace.h
+@@ -446,7 +446,7 @@ TRACE_EVENT(rdev_add_virtual_intf,
+ 	),
+ 	TP_fast_assign(
+ 		WIPHY_ASSIGN;
+-		__assign_str(vir_intf_name);
++		__assign_str(vir_intf_name, name ? name : "<noname>");
+ 		__entry->type = type;
+ 	),
+ 	TP_printk(WIPHY_PR_FMT ", virtual intf name: %s, type: %d",
diff --git a/package/kernel/mac80211/patches/build/150-ath_iommu_paging_domain_revert.patch b/package/kernel/mac80211/patches/build/150-ath_iommu_paging_domain_revert.patch
new file mode 100644
index 0000000000..2c5235e49f
--- /dev/null
+++ b/package/kernel/mac80211/patches/build/150-ath_iommu_paging_domain_revert.patch
@@ -0,0 +1,32 @@
+--- a/drivers/net/wireless/ath/ath10k/snoc.c
++++ b/drivers/net/wireless/ath/ath10k/snoc.c
+@@ -1635,10 +1635,10 @@ static int ath10k_fw_init(struct ath10k
+ 
+ 	ar_snoc->fw.dev = &pdev->dev;
+ 
+-	iommu_dom = iommu_paging_domain_alloc(ar_snoc->fw.dev);
+-	if (IS_ERR(iommu_dom)) {
++	iommu_dom = iommu_domain_alloc(&platform_bus_type);
++	if (!iommu_dom) {
+ 		ath10k_err(ar, "failed to allocate iommu domain\n");
+-		ret = PTR_ERR(iommu_dom);
++		ret = -ENOMEM;
+ 		goto err_unregister;
+ 	}
+ 
+--- a/drivers/net/wireless/ath/ath11k/ahb.c
++++ b/drivers/net/wireless/ath/ath11k/ahb.c
+@@ -1031,10 +1031,10 @@ static int ath11k_ahb_fw_resources_init(
+ 
+ 	ab_ahb->fw.dev = &pdev->dev;
+ 
+-	iommu_dom = iommu_paging_domain_alloc(ab_ahb->fw.dev);
+-	if (IS_ERR(iommu_dom)) {
++	iommu_dom = iommu_domain_alloc(&platform_bus_type);
++	if (!iommu_dom) {
+ 		ath11k_err(ab, "failed to allocate iommu domain\n");
+-		ret = PTR_ERR(iommu_dom);
++		ret = -ENOMEM;
+ 		goto err_unregister;
+ 	}
+ 
diff --git a/package/kernel/mac80211/patches/build/200-iwlwifi_thermal_backport.patch b/package/kernel/mac80211/patches/build/200-iwlwifi_thermal_backport.patch
index ad398d4d9d..a8ffce1e30 100644
--- a/package/kernel/mac80211/patches/build/200-iwlwifi_thermal_backport.patch
+++ b/package/kernel/mac80211/patches/build/200-iwlwifi_thermal_backport.patch
@@ -1,6 +1,20 @@
 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
 +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
-@@ -689,13 +689,23 @@ static void iwl_mvm_thermal_zone_registe
+@@ -638,8 +638,13 @@ static int iwl_mvm_tzone_get_temp(struct
+ 	return 0;
+ }
+ 
++#if LINUX_VERSION_IS_GEQ(6,11,0)
+ static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
+ 				       const struct thermal_trip *trip, int temp)
++#else
++static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
++				       int trip, int temp)
++#endif
+ {
+ 	struct iwl_mvm *mvm = thermal_zone_device_priv(device);
+ 
+@@ -682,13 +687,23 @@ static void iwl_mvm_thermal_zone_registe
  	for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
  		mvm->tz_device.trips[i].temperature = THERMAL_TEMP_INVALID;
  		mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
diff --git a/package/kernel/mac80211/patches/build/210-backport_genl_split_ops.patch b/package/kernel/mac80211/patches/build/210-backport_genl_split_ops.patch
index d9d6b8a75b..0898f33bda 100644
--- a/package/kernel/mac80211/patches/build/210-backport_genl_split_ops.patch
+++ b/package/kernel/mac80211/patches/build/210-backport_genl_split_ops.patch
@@ -1,6 +1,6 @@
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -16383,9 +16383,14 @@ static u32 nl80211_internal_flags[] = {
+@@ -16529,9 +16529,14 @@ static u32 nl80211_internal_flags[] = {
  #undef SELECTOR
  };
  
@@ -15,7 +15,7 @@
  {
  	struct cfg80211_registered_device *rdev = NULL;
  	struct wireless_dev *wdev = NULL;
-@@ -16485,9 +16490,14 @@ out_unlock:
+@@ -16631,9 +16636,14 @@ out_unlock:
  	return err;
  }
  
diff --git a/package/kernel/mac80211/patches/build/230-brcmfmac_usb_driver_backport.patch b/package/kernel/mac80211/patches/build/230-brcmfmac_usb_driver_backport.patch
index daeea38372..25dab46905 100644
--- a/package/kernel/mac80211/patches/build/230-brcmfmac_usb_driver_backport.patch
+++ b/package/kernel/mac80211/patches/build/230-brcmfmac_usb_driver_backport.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -1581,7 +1581,11 @@ static int brcmf_usb_reset_device(struct
+@@ -1574,7 +1574,11 @@ static int brcmf_usb_reset_device(struct
  
  void brcmf_usb_exit(void)
  {
diff --git a/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch
index fb774b5201..c3324f4289 100644
--- a/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch
+++ b/package/kernel/mac80211/patches/mwl/700-mwl8k-missing-pci-id-for-WNR854T.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/marvell/mwl8k.c
 +++ b/drivers/net/wireless/marvell/mwl8k.c
-@@ -5707,6 +5707,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
+@@ -5709,6 +5709,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  
  static const struct pci_device_id mwl8k_pci_id_table[] = {
diff --git a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch
index 06edc441ec..062b0600d0 100644
--- a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch
+++ b/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/marvell/mwl8k.c
 +++ b/drivers/net/wireless/marvell/mwl8k.c
-@@ -6293,6 +6293,8 @@ static int mwl8k_probe(struct pci_dev *p
+@@ -6295,6 +6295,8 @@ static int mwl8k_probe(struct pci_dev *p
  
  	priv->running_bsses = 0;
  
@@ -9,7 +9,7 @@
  	return rc;
  
  err_stop_firmware:
-@@ -6326,8 +6328,6 @@ static void mwl8k_remove(struct pci_dev
+@@ -6328,8 +6330,6 @@ static void mwl8k_remove(struct pci_dev
  		return;
  	priv = hw->priv;
  
diff --git a/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch b/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
index 1516c6cb43..b6b1e0da96 100644
--- a/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
+++ b/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
@@ -21,7 +21,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 
 --- a/local-symbols
 +++ b/local-symbols
-@@ -334,6 +334,7 @@ RT2X00_LIB_FIRMWARE=
+@@ -339,6 +339,7 @@ RT2X00_LIB_FIRMWARE=
  RT2X00_LIB_CRYPTO=
  RT2X00_LIB_LEDS=
  RT2X00_LIB_DEBUGFS=
@@ -100,7 +100,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  	.drv_init_registers	= rt2800mmio_init_registers,
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
-@@ -703,6 +703,7 @@ enum rt2x00_capability_flags {
+@@ -693,6 +693,7 @@ enum rt2x00_capability_flags {
  	REQUIRE_HT_TX_DESC,
  	REQUIRE_PS_AUTOWAKE,
  	REQUIRE_DELAYED_RFKILL,
diff --git a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
index ab09a68297..a554707bda 100644
--- a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
+++ b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
@@ -37,7 +37,7 @@
  		num_rates += 4;
 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
-@@ -408,6 +408,7 @@ struct hw_mode_spec {
+@@ -398,6 +398,7 @@ struct hw_mode_spec {
  	unsigned int supported_bands;
  #define SUPPORT_BAND_2GHZ	0x00000001
  #define SUPPORT_BAND_5GHZ	0x00000002
diff --git a/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
index 5b950539b9..bb3f819702 100644
--- a/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
+++ b/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
@@ -83,7 +83,7 @@ Signed-off-by: Daniel Golle <daniel at makrotopia.org>
  #include <linux/rt2x00_platform.h>
  
  #include <net/mac80211.h>
-@@ -1027,6 +1028,11 @@ struct rt2x00_dev {
+@@ -1017,6 +1018,11 @@ struct rt2x00_dev {
  
  	/* Clock for System On Chip devices. */
  	struct clk *clk;
diff --git a/package/kernel/mac80211/patches/rtl/001-v6.10-wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch b/package/kernel/mac80211/patches/rtl/001-v6.10-wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch
deleted file mode 100644
index 2fa581f288..0000000000
--- a/package/kernel/mac80211/patches/rtl/001-v6.10-wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From 25eaef533bf3ccc6fee5067aac16f41f280e343e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Marcin=20=C5=9Alusarz?= <mslusarz at renau.com>
-Date: Tue, 28 May 2024 13:02:46 +0200
-Subject: [PATCH] wifi: rtw88: usb: schedule rx work after everything is set up
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-[ Upstream commit adc539784c98a7cc602cbf557debfc2e7b9be8b3 ]
-
-Right now it's possible to hit NULL pointer dereference in
-rtw_rx_fill_rx_status on hw object and/or its fields because
-initialization routine can start getting USB replies before
-rtw_dev is fully setup.
-
-The stack trace looks like this:
-
-rtw_rx_fill_rx_status
-rtw8821c_query_rx_desc
-rtw_usb_rx_handler
-...
-queue_work
-rtw_usb_read_port_complete
-...
-usb_submit_urb
-rtw_usb_rx_resubmit
-rtw_usb_init_rx
-rtw_usb_probe
-
-So while we do the async stuff rtw_usb_probe continues and calls
-rtw_register_hw, which does all kinds of initialization (e.g.
-via ieee80211_register_hw) that rtw_rx_fill_rx_status relies on.
-
-Fix this by moving the first usb_submit_urb after everything
-is set up.
-
-For me, this bug manifested as:
-[    8.893177] rtw_8821cu 1-1:1.2: band wrong, packet dropped
-[    8.910904] rtw_8821cu 1-1:1.2: hw->conf.chandef.chan NULL in rtw_rx_fill_rx_status
-because I'm using Larry's backport of rtw88 driver with the NULL
-checks in rtw_rx_fill_rx_status.
-
-Link: https://lore.kernel.org/linux-wireless/CA+shoWQ7P49jhQasofDcTdQhiuarPTjYEDa--NiVVx494WcuQw@mail.gmail.com/
-Signed-off-by: Marcin Ślusarz <mslusarz at renau.com>
-Cc: Tim K <tpkuester at gmail.com>
-Cc: Ping-Ke Shih <pkshih at realtek.com>
-Cc: Larry Finger <Larry.Finger at lwfinger.net>
-Cc: Kalle Valo <kvalo at kernel.org>
-Cc: linux-wireless at vger.kernel.org
-Cc: linux-kernel at vger.kernel.org
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20240528110246.477321-1-marcin.slusarz@gmail.com
-Signed-off-by: Sasha Levin <sashal at kernel.org>
----
- drivers/net/wireless/realtek/rtw88/usb.c | 13 ++++++++++---
- 1 file changed, 10 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -740,7 +740,6 @@ static struct rtw_hci_ops rtw_usb_ops =
- static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
- {
- 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
--	int i;
- 
- 	rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
- 	if (!rtwusb->rxwq) {
-@@ -752,13 +751,19 @@ static int rtw_usb_init_rx(struct rtw_de
- 
- 	INIT_WORK(&rtwusb->rx_work, rtw_usb_rx_handler);
- 
-+	return 0;
-+}
-+
-+static void rtw_usb_setup_rx(struct rtw_dev *rtwdev)
-+{
-+	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
-+	int i;
-+
- 	for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
- 		struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];
- 
- 		rtw_usb_rx_resubmit(rtwusb, rxcb);
- 	}
--
--	return 0;
- }
- 
- static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev)
-@@ -895,6 +900,8 @@ int rtw_usb_probe(struct usb_interface *
- 		goto err_destroy_rxwq;
- 	}
- 
-+	rtw_usb_setup_rx(rtwdev);
-+
- 	return 0;
- 
- err_destroy_rxwq:
diff --git a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
index c71f1f2ffc..68534f4e7b 100644
--- a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
+++ b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
@@ -9,7 +9,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnect
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1647,12 +1647,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1649,12 +1649,6 @@ static int ieee80211_stop_ap(struct wiph
  
  	__sta_info_flush(sdata, true, link_id);
  
diff --git a/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch b/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
index d4341a1350..eea165ccca 100644
--- a/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
+++ b/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
@@ -1,6 +1,6 @@
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -1564,24 +1564,6 @@ int ieee80211_register_hw(struct ieee802
+@@ -1581,24 +1581,6 @@ int ieee80211_register_hw(struct ieee802
  
  	ieee80211_check_wbrf_support(local);
  
diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
index a1f96cb3a0..ca4ac8adb6 100644
--- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
+++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
@@ -8,7 +8,7 @@ Subject: [PATCH] mac80211: allow scans in access point mode (for site survey)
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2844,6 +2844,8 @@ static int ieee80211_scan(struct wiphy *
+@@ -2863,6 +2863,8 @@ static int ieee80211_scan(struct wiphy *
  		 */
  		fallthrough;
  	case NL80211_IFTYPE_AP:
diff --git a/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
index 71ce340d31..6cf46ce7e5 100644
--- a/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
+++ b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -101,6 +101,8 @@ ieee80211_sta_keep_active(struct sta_inf
+@@ -103,6 +103,8 @@ ieee80211_sta_keep_active(struct sta_inf
  	return time_before_eq(jiffies, sta->airtime[ac].last_active + HZ / 10);
  }
  
@@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4082,7 +4082,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4081,7 +4081,7 @@ struct ieee80211_txq *ieee80211_next_txq
  
  		if (deficit < 0)
  			sta->airtime[txqi->txq.ac].deficit +=
@@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
  		if (deficit < 0 || !aql_check) {
  			list_move_tail(&txqi->schedule_order,
-@@ -4225,7 +4225,8 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4224,7 +4224,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 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  		list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
  	}
  
-@@ -4233,7 +4234,7 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4232,7 +4233,7 @@ bool ieee80211_txq_may_transmit(struct i
  	if (sta->airtime[ac].deficit >= 0)
  		goto out;
  
diff --git a/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-clear-vif-drv_priv-after-calling-remov.patch b/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-clear-vif-drv_priv-after-calling-remov.patch
deleted file mode 100644
index b0119988d3..0000000000
--- a/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-clear-vif-drv_priv-after-calling-remov.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 3 Jul 2024 12:10:01 +0200
-Subject: [PATCH] wifi: mac80211: clear vif drv_priv after calling
- remove_interface
-
-Avoid reusing stale driver data when an interface is brought down and up
-again. In order to avoid having to duplicate the memset in every single
-driver, do it here.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -693,8 +693,12 @@ static void ieee80211_do_stop(struct iee
- 
- 		fallthrough;
- 	default:
--		if (going_down)
--			drv_remove_interface(local, sdata);
-+		if (!going_down)
-+			break;
-+		drv_remove_interface(local, sdata);
-+
-+		/* Clear private driver data to prevent reuse */
-+		memset(sdata->vif.drv_priv, 0, local->hw.vif_data_size);
- 	}
- 
- 	ieee80211_recalc_ps(local);
diff --git a/package/kernel/mac80211/patches/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch b/package/kernel/mac80211/patches/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
index 39f23f7839..7e9be59e04 100644
--- a/package/kernel/mac80211/patches/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
+++ b/package/kernel/mac80211/patches/subsys/320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -189,6 +189,8 @@ enum ieee80211_channel_flags {
+@@ -187,6 +187,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.
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
   * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
   * @psd: power spectral density (in dBm)
   */
-@@ -206,6 +208,7 @@ struct ieee80211_channel {
+@@ -204,6 +206,7 @@ struct ieee80211_channel {
  	int orig_mag, orig_mpwr;
  	enum nl80211_dfs_state dfs_state;
  	unsigned long dfs_state_entered;
@@ -52,7 +52,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
 --- a/net/wireless/chan.c
 +++ b/net/wireless/chan.c
-@@ -560,6 +560,8 @@ static void cfg80211_set_chans_dfs_state
+@@ -598,6 +598,8 @@ static void cfg80211_set_chans_dfs_state
  
  		c->dfs_state = dfs_state;
  		c->dfs_state_entered = jiffies;
@@ -61,7 +61,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  	}
  }
  
-@@ -1049,6 +1051,49 @@ static bool cfg80211_get_chans_dfs_avail
+@@ -1087,6 +1089,49 @@ static bool cfg80211_get_chans_dfs_avail
  	return true;
  }
  
diff --git a/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch b/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch
index d822e45357..82fe546509 100644
--- a/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch
+++ b/package/kernel/mac80211/patches/subsys/330-mac80211-add-AQL-support-for-broadcast-packets.patch
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -3416,6 +3416,7 @@ enum wiphy_params_flags {
+@@ -3423,6 +3423,7 @@ enum wiphy_params_flags {
  /* The per TXQ device queue limit in airtime */
  #define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L	5000
  #define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H	12000
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1338,10 +1338,12 @@ struct ieee80211_local {
+@@ -1351,10 +1351,12 @@ struct ieee80211_local {
  	spinlock_t handle_wake_tx_queue_lock;
  
  	u16 airtime_flags;
@@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  	const struct ieee80211_ops *ops;
 --- a/net/mac80211/main.c
 +++ b/net/mac80211/main.c
-@@ -944,6 +944,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -952,6 +952,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
  	spin_lock_init(&local->rx_path_lock);
  	spin_lock_init(&local->queue_stop_reason_lock);
  
@@ -136,7 +136,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  		spin_unlock_irqrestore(&local->ack_status_lock, flags);
  
  		if (id >= 0) {
-@@ -3983,20 +3983,20 @@ begin:
+@@ -3982,20 +3982,20 @@ begin:
  encap_out:
  	info->control.vif = vif;
  
@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  	}
  
  	return skb;
-@@ -4048,6 +4048,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4047,6 +4047,7 @@ struct ieee80211_txq *ieee80211_next_txq
  	struct ieee80211_txq *ret = NULL;
  	struct txq_info *txqi = NULL, *head = NULL;
  	bool found_eligible_txq = false;
@@ -175,7 +175,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
  	spin_lock_bh(&local->active_txq_lock[ac]);
  
-@@ -4071,26 +4072,26 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4070,26 +4071,26 @@ struct ieee80211_txq *ieee80211_next_txq
  	if (!head)
  		head = txqi;
  
@@ -214,7 +214,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  	if (txqi->schedule_round == local->schedule_round[ac])
  		goto out;
  
-@@ -4155,7 +4156,8 @@ bool ieee80211_txq_airtime_check(struct
+@@ -4154,7 +4155,8 @@ bool ieee80211_txq_airtime_check(struct
  		return true;
  
  	if (!txq->sta)
@@ -224,7 +224,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
  	if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
  		return true;
-@@ -4204,15 +4206,15 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4203,15 +4205,15 @@ bool ieee80211_txq_may_transmit(struct i
  
  	spin_lock_bh(&local->active_txq_lock[ac]);
  
@@ -245,7 +245,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  		if (iter == txqi)
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1180,8 +1180,8 @@ struct ieee80211_tx_info {
+@@ -1221,8 +1221,8 @@ struct ieee80211_tx_info {
  	    status_data_idr:1,
  	    status_data:13,
  	    hw_queue:4,
@@ -269,7 +269,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -717,7 +717,7 @@ static void ieee80211_report_used_skb(st
+@@ -734,7 +734,7 @@ static void ieee80211_report_used_skb(st
  		ieee80211_sta_update_pending_airtime(local, sta,
  						     skb_get_queue_mapping(skb),
  						     tx_time_est,
@@ -278,7 +278,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  		rcu_read_unlock();
  	}
  
-@@ -1138,10 +1138,11 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1158,10 +1158,11 @@ void ieee80211_tx_status_ext(struct ieee
  		/* Do this here to avoid the expensive lookup of the sta
  		 * in ieee80211_report_used_skb().
  		 */
diff --git a/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-extend-IEEE80211_KEY_FLAG_GENERATE_MMI.patch b/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-extend-IEEE80211_KEY_FLAG_GENERATE_MMI.patch
deleted file mode 100644
index 5c202c26c2..0000000000
--- a/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-extend-IEEE80211_KEY_FLAG_GENERATE_MMI.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From: Michael-CY Lee <michael-cy.lee at mediatek.com>
-Date: Tue, 26 Mar 2024 08:30:36 +0800
-Subject: [PATCH] wifi: mac80211: extend IEEE80211_KEY_FLAG_GENERATE_MMIE to
- other ciphers
-
-Extend the flag IEEE80211_KEY_FLAG_GENERATE_MMIE to BIP-CMAC-256,
-BIP-GMAC-128 and BIP-GMAC-256 for the same reason and in the same
-way that the flag was added originally in commit a0b4496a4368
-("mac80211: add IEEE80211_KEY_FLAG_GENERATE_MMIE to ieee80211_key_flags").
-
-Signed-off-by: Michael-CY Lee <michael-cy.lee at mediatek.com>
-Link: https://msgid.link/20240326003036.15215-1-michael-cy.lee@mediatek.com
-Signed-off-by: Johannes Berg <johannes.berg at intel.com>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -2123,8 +2123,8 @@ static inline bool lockdep_vif_wiphy_mut
-  *	@IEEE80211_KEY_FLAG_GENERATE_MMIC on the same key.
-  * @IEEE80211_KEY_FLAG_NO_AUTO_TX: Key needs explicit Tx activation.
-  * @IEEE80211_KEY_FLAG_GENERATE_MMIE: This flag should be set by the driver
-- *	for a AES_CMAC key to indicate that it requires sequence number
-- *	generation only
-+ *	for a AES_CMAC or a AES_GMAC key to indicate that it requires sequence
-+ *	number generation only
-  * @IEEE80211_KEY_FLAG_SPP_AMSDU: SPP A-MSDUs can be used with this key
-  *	(set by mac80211 from the sta->spp_amsdu flag)
-  */
---- a/net/mac80211/wpa.c
-+++ b/net/mac80211/wpa.c
-@@ -895,7 +895,8 @@ ieee80211_crypto_aes_cmac_256_encrypt(st
- 
- 	info = IEEE80211_SKB_CB(skb);
- 
--	if (info->control.hw_key)
-+	if (info->control.hw_key &&
-+	    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE))
- 		return TX_CONTINUE;
- 
- 	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
-@@ -911,6 +912,9 @@ ieee80211_crypto_aes_cmac_256_encrypt(st
- 
- 	bip_ipn_set64(mmie->sequence_number, pn64);
- 
-+	if (info->control.hw_key)
-+		return TX_CONTINUE;
-+
- 	bip_aad(skb, aad);
- 
- 	/* MIC = AES-256-CMAC(IGTK, AAD || Management Frame Body || MMIE, 128)
-@@ -1040,7 +1044,8 @@ ieee80211_crypto_aes_gmac_encrypt(struct
- 
- 	info = IEEE80211_SKB_CB(skb);
- 
--	if (info->control.hw_key)
-+	if (info->control.hw_key &&
-+	    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIE))
- 		return TX_CONTINUE;
- 
- 	if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
-@@ -1056,6 +1061,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct
- 
- 	bip_ipn_set64(mmie->sequence_number, pn64);
- 
-+	if (info->control.hw_key)
-+		return TX_CONTINUE;
-+
- 	bip_aad(skb, aad);
- 
- 	hdr = (struct ieee80211_hdr *)skb->data;
diff --git a/package/kernel/mac80211/patches/subsys/340-wifi-nl80211-split-helper-function-from-nl80211_put_.patch b/package/kernel/mac80211/patches/subsys/340-wifi-nl80211-split-helper-function-from-nl80211_put_.patch
deleted file mode 100644
index 40757e3777..0000000000
--- a/package/kernel/mac80211/patches/subsys/340-wifi-nl80211-split-helper-function-from-nl80211_put_.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Tue, 4 Jun 2024 14:31:09 +0200
-Subject: [PATCH] wifi: nl80211: split helper function from
- nl80211_put_iface_combinations
-
-Create a helper function that puts the data from struct
-ieee80211_iface_combination to a nl80211 message.
-This will be used for adding per-radio interface combination data.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -1620,71 +1620,78 @@ nla_put_failure:
- 	return -ENOBUFS;
- }
- 
--static int nl80211_put_iface_combinations(struct wiphy *wiphy,
--					  struct sk_buff *msg,
--					  bool large)
-+static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx,
-+				   const struct ieee80211_iface_combination *c)
- {
--	struct nlattr *nl_combis;
--	int i, j;
-+	struct nlattr *nl_combi, *nl_limits;
-+	int i;
- 
--	nl_combis = nla_nest_start_noflag(msg,
--					  NL80211_ATTR_INTERFACE_COMBINATIONS);
--	if (!nl_combis)
-+	nl_combi = nla_nest_start_noflag(msg, idx);
-+	if (!nl_combi)
- 		goto nla_put_failure;
- 
--	for (i = 0; i < wiphy->n_iface_combinations; i++) {
--		const struct ieee80211_iface_combination *c;
--		struct nlattr *nl_combi, *nl_limits;
-+	nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS);
-+	if (!nl_limits)
-+		goto nla_put_failure;
- 
--		c = &wiphy->iface_combinations[i];
-+	for (i = 0; i < c->n_limits; i++) {
-+		struct nlattr *nl_limit;
- 
--		nl_combi = nla_nest_start_noflag(msg, i + 1);
--		if (!nl_combi)
-+		nl_limit = nla_nest_start_noflag(msg, i + 1);
-+		if (!nl_limit)
- 			goto nla_put_failure;
--
--		nl_limits = nla_nest_start_noflag(msg,
--						  NL80211_IFACE_COMB_LIMITS);
--		if (!nl_limits)
-+		if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max))
- 			goto nla_put_failure;
-+		if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
-+					c->limits[i].types))
-+			goto nla_put_failure;
-+		nla_nest_end(msg, nl_limit);
-+	}
- 
--		for (j = 0; j < c->n_limits; j++) {
--			struct nlattr *nl_limit;
-+	nla_nest_end(msg, nl_limits);
- 
--			nl_limit = nla_nest_start_noflag(msg, j + 1);
--			if (!nl_limit)
--				goto nla_put_failure;
--			if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
--					c->limits[j].max))
--				goto nla_put_failure;
--			if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
--						c->limits[j].types))
--				goto nla_put_failure;
--			nla_nest_end(msg, nl_limit);
--		}
-+	if (c->beacon_int_infra_match &&
-+	    nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
-+		goto nla_put_failure;
-+	if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
-+			c->num_different_channels) ||
-+	    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
-+			c->max_interfaces))
-+		goto nla_put_failure;
-+	if (large &&
-+	    (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
-+			c->radar_detect_widths) ||
-+	     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
-+			c->radar_detect_regions)))
-+		goto nla_put_failure;
-+	if (c->beacon_int_min_gcd &&
-+	    nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
-+			c->beacon_int_min_gcd))
-+		goto nla_put_failure;
- 
--		nla_nest_end(msg, nl_limits);
-+	nla_nest_end(msg, nl_combi);
- 
--		if (c->beacon_int_infra_match &&
--		    nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
--			goto nla_put_failure;
--		if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
--				c->num_different_channels) ||
--		    nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
--				c->max_interfaces))
--			goto nla_put_failure;
--		if (large &&
--		    (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
--				c->radar_detect_widths) ||
--		     nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
--				c->radar_detect_regions)))
--			goto nla_put_failure;
--		if (c->beacon_int_min_gcd &&
--		    nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
--				c->beacon_int_min_gcd))
--			goto nla_put_failure;
-+	return 0;
-+nla_put_failure:
-+	return -ENOBUFS;
-+}
- 
--		nla_nest_end(msg, nl_combi);
--	}
-+static int nl80211_put_iface_combinations(struct wiphy *wiphy,
-+					  struct sk_buff *msg,
-+					  bool large)
-+{
-+	struct nlattr *nl_combis;
-+	int i;
-+
-+	nl_combis = nla_nest_start_noflag(msg,
-+					  NL80211_ATTR_INTERFACE_COMBINATIONS);
-+	if (!nl_combis)
-+		goto nla_put_failure;
-+
-+	for (i = 0; i < wiphy->n_iface_combinations; i++)
-+		if (nl80211_put_ifcomb_data(msg, large, i + 1,
-+					    &wiphy->iface_combinations[i]))
-+			goto nla_put_failure;
- 
- 	nla_nest_end(msg, nl_combis);
- 
diff --git a/package/kernel/mac80211/patches/subsys/341-wifi-cfg80211-add-support-for-advertising-multiple-r.patch b/package/kernel/mac80211/patches/subsys/341-wifi-cfg80211-add-support-for-advertising-multiple-r.patch
deleted file mode 100644
index 45349891b6..0000000000
--- a/package/kernel/mac80211/patches/subsys/341-wifi-cfg80211-add-support-for-advertising-multiple-r.patch
+++ /dev/null
@@ -1,348 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 22 May 2024 11:42:57 +0200
-Subject: [PATCH] wifi: cfg80211: add support for advertising multiple
- radios belonging to a wiphy
-
-The prerequisite for MLO support in cfg80211/mac80211 is that all the links
-participating in MLO must be from the same wiphy/ieee80211_hw. To meet this
-expectation, some drivers may need to group multiple discrete hardware each
-acting as a link in MLO under single wiphy.
-
-With this change, supported frequencies and interface combinations of each
-individual radio are reported to user space. This allows user space to figure
-out the limitations of what combination of channels can be used concurrently.
-
-Even for non-MLO devices, this improves support for devices capable of
-running on multiple channels at the same time.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -5045,7 +5045,9 @@ struct ieee80211_iface_limit {
-  * struct ieee80211_iface_combination - possible interface combination
-  *
-  * With this structure the driver can describe which interface
-- * combinations it supports concurrently.
-+ * combinations it supports concurrently. When set in a struct wiphy_radio,
-+ * the combinations refer to combinations of interfaces currently active on
-+ * that radio.
-  *
-  * Examples:
-  *
-@@ -5403,6 +5405,38 @@ struct wiphy_iftype_akm_suites {
- 	int n_akm_suites;
- };
- 
-+/**
-+ * struct wiphy_radio_freq_range - wiphy frequency range
-+ * @start_freq:  start range edge frequency (kHz)
-+ * @end_freq:    end range edge frequency (kHz)
-+ */
-+struct wiphy_radio_freq_range {
-+	u32 start_freq;
-+	u32 end_freq;
-+};
-+
-+
-+/**
-+ * struct wiphy_radio - physical radio of a wiphy
-+ * This structure describes a physical radio belonging to a wiphy.
-+ * It is used to describe concurrent-channel capabilities. Only one channel
-+ * can be active on the radio described by struct wiphy_radio.
-+ *
-+ * @freq_range: frequency range that the radio can operate on.
-+ * @n_freq_range: number of elements in @freq_range
-+ *
-+ * @iface_combinations: Valid interface combinations array, should not
-+ *	list single interface types.
-+ * @n_iface_combinations: number of entries in @iface_combinations array.
-+ */
-+struct wiphy_radio {
-+	const struct wiphy_radio_freq_range *freq_range;
-+	int n_freq_range;
-+
-+	const struct ieee80211_iface_combination *iface_combinations;
-+	int n_iface_combinations;
-+};
-+
- #define CFG80211_HW_TIMESTAMP_ALL_PEERS	0xffff
- 
- /**
-@@ -5621,6 +5655,9 @@ struct wiphy_iftype_akm_suites {
-  *	A value of %CFG80211_HW_TIMESTAMP_ALL_PEERS indicates the driver
-  *	supports enabling HW timestamping for all peers (i.e. no need to
-  *	specify a mac address).
-+ *
-+ * @radio: radios belonging to this wiphy
-+ * @n_radio: number of radios
-  */
- struct wiphy {
- 	struct mutex mtx;
-@@ -5771,6 +5808,9 @@ struct wiphy {
- 
- 	u16 hw_timestamp_max_peers;
- 
-+	int n_radio;
-+	const struct wiphy_radio *radio;
-+
- 	char priv[] __aligned(NETDEV_ALIGN);
- };
- 
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -2061,6 +2061,10 @@ enum nl80211_commands {
-  * @NL80211_ATTR_INTERFACE_COMBINATIONS: Nested attribute listing the supported
-  *	interface combinations. In each nested item, it contains attributes
-  *	defined in &enum nl80211_if_combination_attrs.
-+ *	If the wiphy uses multiple radios (@NL80211_ATTR_WIPHY_RADIOS is set),
-+ *	this attribute contains the interface combinations of the first radio.
-+ *	See @NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS for the global wiphy
-+ *	combinations for the sum of all radios.
-  * @NL80211_ATTR_SOFTWARE_IFTYPES: Nested attribute (just like
-  *	%NL80211_ATTR_SUPPORTED_IFTYPES) containing the interface types that
-  *	are managed in software: interfaces of these types aren't subject to
-@@ -2856,6 +2860,14 @@ enum nl80211_commands {
-  *	%NL80211_CMD_ASSOCIATE indicating the SPP A-MSDUs
-  *	are used on this connection
-  *
-+ * @NL80211_ATTR_WIPHY_RADIOS: Nested attribute describing physical radios
-+ *	belonging to this wiphy. See &enum nl80211_wiphy_radio_attrs.
-+ *
-+ * @NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS: Nested attribute listing the
-+ *	supported interface combinations for all radios combined. In each
-+ *	nested item, it contains attributes defined in
-+ *	&enum nl80211_if_combination_attrs.
-+ *
-  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -3401,6 +3413,9 @@ enum nl80211_attrs {
- 
- 	NL80211_ATTR_ASSOC_SPP_AMSDU,
- 
-+	NL80211_ATTR_WIPHY_RADIOS,
-+	NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS,
-+
- 	/* add attributes here, update the policy in nl80211.c */
- 
- 	__NL80211_ATTR_AFTER_LAST,
-@@ -7987,4 +8002,54 @@ enum nl80211_ap_settings_flags {
- 	NL80211_AP_SETTINGS_SA_QUERY_OFFLOAD_SUPPORT	= 1 << 1,
- };
- 
-+/**
-+ * enum nl80211_wiphy_radio_attrs - wiphy radio attributes
-+ *
-+ * @__NL80211_WIPHY_RADIO_ATTR_INVALID: Invalid
-+ *
-+ * @NL80211_WIPHY_RADIO_ATTR_INDEX: Index of this radio (u32)
-+ * @NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE: Frequency range supported by this
-+ *	radio. Attribute may be present multiple times.
-+ * @NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION: Supported interface
-+ *	combination for this radio. Attribute may be present multiple times
-+ *	and contains attributes defined in &enum nl80211_if_combination_attrs.
-+ *
-+ * @__NL80211_WIPHY_RADIO_ATTR_LAST: Internal
-+ * @NL80211_WIPHY_RADIO_ATTR_MAX: Highest attribute
-+ */
-+enum nl80211_wiphy_radio_attrs {
-+	__NL80211_WIPHY_RADIO_ATTR_INVALID,
-+
-+	NL80211_WIPHY_RADIO_ATTR_INDEX,
-+	NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE,
-+	NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION,
-+
-+	/* keep last */
-+	__NL80211_WIPHY_RADIO_ATTR_LAST,
-+	NL80211_WIPHY_RADIO_ATTR_MAX = __NL80211_WIPHY_RADIO_ATTR_LAST - 1,
-+};
-+
-+/**
-+ * enum nl80211_wiphy_radio_freq_range - wiphy radio frequency range
-+ *
-+ * @__NL80211_WIPHY_RADIO_FREQ_ATTR_INVALID: Invalid
-+ *
-+ * @NL80211_WIPHY_RADIO_FREQ_ATTR_START: Frequency range start (u32).
-+ *	The unit is kHz.
-+ * @NL80211_WIPHY_RADIO_FREQ_ATTR_END: Frequency range end (u32).
-+ *	The unit is kHz.
-+ *
-+ * @__NL80211_WIPHY_RADIO_FREQ_ATTR_LAST: Internal
-+ * @NL80211_WIPHY_RADIO_FREQ_ATTR_MAX: Highest attribute
-+ */
-+enum nl80211_wiphy_radio_freq_range {
-+	__NL80211_WIPHY_RADIO_FREQ_ATTR_INVALID,
-+
-+	NL80211_WIPHY_RADIO_FREQ_ATTR_START,
-+	NL80211_WIPHY_RADIO_FREQ_ATTR_END,
-+
-+	__NL80211_WIPHY_RADIO_FREQ_ATTR_LAST,
-+	NL80211_WIPHY_RADIO_FREQ_ATTR_MAX = __NL80211_WIPHY_RADIO_FREQ_ATTR_LAST - 1,
-+};
-+
- #endif /* __LINUX_NL80211_H */
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -1621,16 +1621,18 @@ nla_put_failure:
- }
- 
- static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx,
--				   const struct ieee80211_iface_combination *c)
-+				   const struct ieee80211_iface_combination *c,
-+				   u16 nested)
- {
- 	struct nlattr *nl_combi, *nl_limits;
- 	int i;
- 
--	nl_combi = nla_nest_start_noflag(msg, idx);
-+	nl_combi = nla_nest_start_noflag(msg, idx | nested);
- 	if (!nl_combi)
- 		goto nla_put_failure;
- 
--	nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS);
-+	nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS |
-+					       nested);
- 	if (!nl_limits)
- 		goto nla_put_failure;
- 
-@@ -1678,19 +1680,26 @@ nla_put_failure:
- 
- static int nl80211_put_iface_combinations(struct wiphy *wiphy,
- 					  struct sk_buff *msg,
--					  bool large)
-+					  int attr, int radio,
-+					  bool large, u16 nested)
- {
-+	const struct ieee80211_iface_combination *c;
- 	struct nlattr *nl_combis;
--	int i;
-+	int i, n;
- 
--	nl_combis = nla_nest_start_noflag(msg,
--					  NL80211_ATTR_INTERFACE_COMBINATIONS);
-+	nl_combis = nla_nest_start_noflag(msg, attr | nested);
- 	if (!nl_combis)
- 		goto nla_put_failure;
- 
--	for (i = 0; i < wiphy->n_iface_combinations; i++)
--		if (nl80211_put_ifcomb_data(msg, large, i + 1,
--					    &wiphy->iface_combinations[i]))
-+	if (radio >= 0) {
-+		c = wiphy->radio[0].iface_combinations;
-+		n = wiphy->radio[0].n_iface_combinations;
-+	} else {
-+		c = wiphy->iface_combinations;
-+		n = wiphy->n_iface_combinations;
-+	}
-+	for (i = 0; i < n; i++)
-+		if (nl80211_put_ifcomb_data(msg, large, i + 1, &c[i], nested))
- 			goto nla_put_failure;
- 
- 	nla_nest_end(msg, nl_combis);
-@@ -2397,6 +2406,80 @@ fail:
- 	return -ENOBUFS;
- }
- 
-+static int nl80211_put_radio(struct wiphy *wiphy, struct sk_buff *msg, int idx)
-+{
-+	const struct wiphy_radio *r = &wiphy->radio[idx];
-+	struct nlattr *radio, *freq;
-+	int i;
-+
-+	radio = nla_nest_start(msg, idx);
-+	if (!radio)
-+		return -ENOBUFS;
-+
-+	if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx))
-+		goto nla_put_failure;
-+
-+	for (i = 0; i < r->n_freq_range; i++) {
-+		const struct wiphy_radio_freq_range *range = &r->freq_range[i];
-+
-+		freq = nla_nest_start(msg, NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE);
-+		if (!freq)
-+			goto nla_put_failure;
-+
-+		if (nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_START,
-+				range->start_freq) ||
-+		    nla_put_u32(msg, NL80211_WIPHY_RADIO_FREQ_ATTR_END,
-+				range->end_freq))
-+			goto nla_put_failure;
-+
-+		nla_nest_end(msg, freq);
-+	}
-+
-+	for (i = 0; i < r->n_iface_combinations; i++)
-+		if (nl80211_put_ifcomb_data(msg, true,
-+					    NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION,
-+					    &r->iface_combinations[i],
-+					    NLA_F_NESTED))
-+			goto nla_put_failure;
-+
-+	nla_nest_end(msg, radio);
-+
-+	return 0;
-+
-+nla_put_failure:
-+	return -ENOBUFS;
-+}
-+
-+static int nl80211_put_radios(struct wiphy *wiphy, struct sk_buff *msg)
-+{
-+	struct nlattr *radios;
-+	int i;
-+
-+	if (!wiphy->n_radio)
-+		return 0;
-+
-+	radios = nla_nest_start(msg, NL80211_ATTR_WIPHY_RADIOS);
-+	if (!radios)
-+		return -ENOBUFS;
-+
-+	for (i = 0; i < wiphy->n_radio; i++)
-+		if (nl80211_put_radio(wiphy, msg, i))
-+			goto fail;
-+
-+	nla_nest_end(msg, radios);
-+
-+	if (nl80211_put_iface_combinations(wiphy, msg,
-+					   NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS,
-+					   -1, true, NLA_F_NESTED))
-+		return -ENOBUFS;
-+
-+	return 0;
-+
-+fail:
-+	nla_nest_cancel(msg, radios);
-+	return -ENOBUFS;
-+}
-+
- struct nl80211_dump_wiphy_state {
- 	s64 filter_wiphy;
- 	long start;
-@@ -2692,7 +2775,9 @@ static int nl80211_send_wiphy(struct cfg
- 			goto nla_put_failure;
- 
- 		if (nl80211_put_iface_combinations(&rdev->wiphy, msg,
--						   state->split))
-+						   NL80211_ATTR_INTERFACE_COMBINATIONS,
-+						   rdev->wiphy.n_radio ? 0 : -1,
-+						   state->split, 0))
- 			goto nla_put_failure;
- 
- 		state->split_start++;
-@@ -3006,6 +3091,12 @@ static int nl80211_send_wiphy(struct cfg
- 				rdev->wiphy.hw_timestamp_max_peers))
- 			goto nla_put_failure;
- 
-+		state->split_start++;
-+		break;
-+	case 17:
-+		if (nl80211_put_radios(&rdev->wiphy, msg))
-+			goto nla_put_failure;
-+
- 		/* done */
- 		state->split_start = 0;
- 		break;
diff --git a/package/kernel/mac80211/patches/subsys/342-wifi-cfg80211-extend-interface-combination-check-for.patch b/package/kernel/mac80211/patches/subsys/342-wifi-cfg80211-extend-interface-combination-check-for.patch
deleted file mode 100644
index 0ba97a2c0f..0000000000
--- a/package/kernel/mac80211/patches/subsys/342-wifi-cfg80211-extend-interface-combination-check-for.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Tue, 4 Jun 2024 21:01:50 +0200
-Subject: [PATCH] wifi: cfg80211: extend interface combination check for
- multi-radio
-
-Add a field in struct iface_combination_params to check per-radio
-interface combinations instead of per-wiphy ones.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -1598,6 +1598,7 @@ struct cfg80211_color_change_settings {
-  *
-  * Used to pass interface combination parameters
-  *
-+ * @radio_idx: wiphy radio index or -1 for global
-  * @num_different_channels: the number of different channels we want
-  *	to use for verification
-  * @radar_detect: a bitmap where each bit corresponds to a channel
-@@ -1611,6 +1612,7 @@ struct cfg80211_color_change_settings {
-  *	the verification
-  */
- struct iface_combination_params {
-+	int radio_idx;
- 	int num_different_channels;
- 	u8 radar_detect;
- 	int iftype_num[NUM_NL80211_IFTYPES];
-@@ -4579,6 +4581,8 @@ struct mgmt_frame_regs {
-  *
-  * @set_hw_timestamp: Enable/disable HW timestamping of TM/FTM frames.
-  * @set_ttlm: set the TID to link mapping.
-+ * @get_radio_mask: get bitmask of radios in use.
-+ *	(invoked with the wiphy mutex held)
-  */
- struct cfg80211_ops {
- 	int	(*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
-@@ -4940,6 +4944,7 @@ struct cfg80211_ops {
- 				    struct cfg80211_set_hw_timestamp *hwts);
- 	int	(*set_ttlm)(struct wiphy *wiphy, struct net_device *dev,
- 			    struct cfg80211_ttlm_params *params);
-+	u32	(*get_radio_mask)(struct wiphy *wiphy, struct net_device *dev);
- };
- 
- /*
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -3930,6 +3930,7 @@ int ieee80211_check_combinations(struct
- 	int total = 1;
- 	struct iface_combination_params params = {
- 		.radar_detect = radar_detect,
-+		.radio_idx = -1,
- 	};
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
-@@ -4020,7 +4021,9 @@ int ieee80211_max_num_channels(struct ie
- 	struct ieee80211_chanctx *ctx;
- 	u32 max_num_different_channels = 1;
- 	int err;
--	struct iface_combination_params params = {0};
-+	struct iface_combination_params params = {
-+		.radio_idx = -1,
-+	};
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
---- a/net/wireless/rdev-ops.h
-+++ b/net/wireless/rdev-ops.h
-@@ -1542,4 +1542,16 @@ rdev_set_ttlm(struct cfg80211_registered
- 
- 	return ret;
- }
-+
-+static inline u32
-+rdev_get_radio_mask(struct cfg80211_registered_device *rdev,
-+		    struct net_device *dev)
-+{
-+	struct wiphy *wiphy = &rdev->wiphy;
-+
-+	if (!rdev->ops->get_radio_mask)
-+		return 0;
-+
-+	return rdev->ops->get_radio_mask(wiphy, dev);
-+}
- #endif /* __CFG80211_RDEV_OPS */
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -2305,13 +2305,16 @@ static int cfg80211_wdev_bi(struct wirel
- 
- static void cfg80211_calculate_bi_data(struct wiphy *wiphy, u32 new_beacon_int,
- 				       u32 *beacon_int_gcd,
--				       bool *beacon_int_different)
-+				       bool *beacon_int_different,
-+				       int radio_idx)
- {
-+	struct cfg80211_registered_device *rdev;
- 	struct wireless_dev *wdev;
- 
- 	*beacon_int_gcd = 0;
- 	*beacon_int_different = false;
- 
-+	rdev = wiphy_to_rdev(wiphy);
- 	list_for_each_entry(wdev, &wiphy->wdev_list, list) {
- 		int wdev_bi;
- 
-@@ -2319,6 +2322,11 @@ static void cfg80211_calculate_bi_data(s
- 		if (wdev->valid_links)
- 			continue;
- 
-+		/* skip wdevs not active on the given wiphy radio */
-+		if (radio_idx >= 0 &&
-+		    !(rdev_get_radio_mask(rdev, wdev->netdev) & BIT(radio_idx)))
-+			continue;
-+
- 		wdev_bi = cfg80211_wdev_bi(wdev);
- 
- 		if (!wdev_bi)
-@@ -2366,14 +2374,19 @@ int cfg80211_iter_combinations(struct wi
- 					    void *data),
- 			       void *data)
- {
-+	const struct wiphy_radio *radio = NULL;
-+	const struct ieee80211_iface_combination *c, *cs;
- 	const struct ieee80211_regdomain *regdom;
- 	enum nl80211_dfs_regions region = 0;
--	int i, j, iftype;
-+	int i, j, n, iftype;
- 	int num_interfaces = 0;
- 	u32 used_iftypes = 0;
- 	u32 beacon_int_gcd;
- 	bool beacon_int_different;
- 
-+	if (params->radio_idx >= 0)
-+		radio = &wiphy->radio[params->radio_idx];
-+
- 	/*
- 	 * This is a bit strange, since the iteration used to rely only on
- 	 * the data given by the driver, but here it now relies on context,
-@@ -2385,7 +2398,8 @@ int cfg80211_iter_combinations(struct wi
- 	 * interfaces (while being brought up) and channel/radar data.
- 	 */
- 	cfg80211_calculate_bi_data(wiphy, params->new_beacon_int,
--				   &beacon_int_gcd, &beacon_int_different);
-+				   &beacon_int_gcd, &beacon_int_different,
-+				   params->radio_idx);
- 
- 	if (params->radar_detect) {
- 		rcu_read_lock();
-@@ -2402,13 +2416,18 @@ int cfg80211_iter_combinations(struct wi
- 			used_iftypes |= BIT(iftype);
- 	}
- 
--	for (i = 0; i < wiphy->n_iface_combinations; i++) {
--		const struct ieee80211_iface_combination *c;
-+	if (radio) {
-+		cs = radio->iface_combinations;
-+		n = radio->n_iface_combinations;
-+	} else {
-+		cs = wiphy->iface_combinations;
-+		n = wiphy->n_iface_combinations;
-+	}
-+	for (i = 0; i < n; i++) {
- 		struct ieee80211_iface_limit *limits;
- 		u32 all_iftypes = 0;
- 
--		c = &wiphy->iface_combinations[i];
--
-+		c = &cs[i];
- 		if (num_interfaces > c->max_interfaces)
- 			continue;
- 		if (params->num_different_channels > c->num_different_channels)
diff --git a/package/kernel/mac80211/patches/subsys/343-wifi-cfg80211-add-helper-for-checking-if-a-chandef-i.patch b/package/kernel/mac80211/patches/subsys/343-wifi-cfg80211-add-helper-for-checking-if-a-chandef-i.patch
deleted file mode 100644
index d115dd2e54..0000000000
--- a/package/kernel/mac80211/patches/subsys/343-wifi-cfg80211-add-helper-for-checking-if-a-chandef-i.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Fri, 7 Jun 2024 17:58:54 +0200
-Subject: [PATCH] wifi: cfg80211: add helper for checking if a chandef is
- valid on a radio
-
-Check if the full channel width is in the radio's frequency range.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6485,6 +6485,15 @@ static inline bool cfg80211_channel_is_p
- }
- 
- /**
-+ * cfg80211_radio_chandef_valid - Check if the radio supports the chandef
-+ *
-+ * @radio: wiphy radio
-+ * @chandef: chandef for current channel
-+ */
-+bool cfg80211_radio_chandef_valid(const struct wiphy_radio *radio,
-+				  const struct cfg80211_chan_def *chandef);
-+
-+/**
-  * ieee80211_get_response_rate - get basic rate for a given rate
-  *
-  * @sband: the band to look for rates in
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -2884,3 +2884,38 @@ cfg80211_get_iftype_ext_capa(struct wiph
- 	return NULL;
- }
- EXPORT_SYMBOL(cfg80211_get_iftype_ext_capa);
-+
-+static bool
-+ieee80211_radio_freq_range_valid(const struct wiphy_radio *radio,
-+				 u32 freq, u32 width)
-+{
-+	const struct wiphy_radio_freq_range *r;
-+	int i;
-+
-+	for (i = 0; i < radio->n_freq_range; i++) {
-+		r = &radio->freq_range[i];
-+		if (freq - width / 2 >= r->start_freq &&
-+		    freq + width / 2 <= r->end_freq)
-+			return true;
-+	}
-+
-+	return false;
-+}
-+
-+bool cfg80211_radio_chandef_valid(const struct wiphy_radio *radio,
-+				  const struct cfg80211_chan_def *chandef)
-+{
-+	u32 freq, width;
-+
-+	freq = ieee80211_chandef_to_khz(chandef);
-+	width = nl80211_chan_width_to_mhz(chandef->width);
-+	if (!ieee80211_radio_freq_range_valid(radio, freq, width))
-+		return false;
-+
-+	freq = MHZ_TO_KHZ(chandef->center_freq2);
-+	if (freq && !ieee80211_radio_freq_range_valid(radio, freq, width))
-+		return false;
-+
-+	return true;
-+}
-+EXPORT_SYMBOL(cfg80211_radio_chandef_valid);
diff --git a/package/kernel/mac80211/patches/subsys/344-wifi-mac80211-add-support-for-DFS-with-multiple-radi.patch b/package/kernel/mac80211/patches/subsys/344-wifi-mac80211-add-support-for-DFS-with-multiple-radi.patch
deleted file mode 100644
index 18634fe146..0000000000
--- a/package/kernel/mac80211/patches/subsys/344-wifi-mac80211-add-support-for-DFS-with-multiple-radi.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Thu, 6 Jun 2024 12:19:08 +0200
-Subject: [PATCH] wifi: mac80211: add support for DFS with multiple
- radios
-
-DFS can be supported with multi-channel combinations, as long as each DFS
-capable radio only supports one channel.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -1084,6 +1084,27 @@ static int ieee80211_init_cipher_suites(
- 	return 0;
- }
- 
-+static bool
-+ieee80211_ifcomb_check(const struct ieee80211_iface_combination *c, int n_comb)
-+{
-+	int i, j;
-+
-+	for (i = 0; i < n_comb; i++, c++) {
-+		/* DFS is not supported with multi-channel combinations yet */
-+		if (c->radar_detect_widths &&
-+		    c->num_different_channels > 1)
-+			return false;
-+
-+		/* mac80211 doesn't support more than one IBSS interface */
-+		for (j = 0; j < c->n_limits; j++)
-+			if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
-+			    c->limits[j].max > 1)
-+				return false;
-+	}
-+
-+	return true;
-+}
-+
- int ieee80211_register_hw(struct ieee80211_hw *hw)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
-@@ -1173,17 +1194,20 @@ int ieee80211_register_hw(struct ieee802
- 			if (comb->num_different_channels > 1)
- 				return -EINVAL;
- 		}
--	} else {
--		/* DFS is not supported with multi-channel combinations yet */
--		for (i = 0; i < local->hw.wiphy->n_iface_combinations; i++) {
--			const struct ieee80211_iface_combination *comb;
-+	}
- 
--			comb = &local->hw.wiphy->iface_combinations[i];
-+	if (hw->wiphy->n_radio) {
-+		for (i = 0; i < hw->wiphy->n_radio; i++) {
-+			const struct wiphy_radio *radio = &hw->wiphy->radio[i];
- 
--			if (comb->radar_detect_widths &&
--			    comb->num_different_channels > 1)
-+			if (!ieee80211_ifcomb_check(radio->iface_combinations,
-+						    radio->n_iface_combinations))
- 				return -EINVAL;
- 		}
-+	} else {
-+		if (!ieee80211_ifcomb_check(hw->wiphy->iface_combinations,
-+					    hw->wiphy->n_iface_combinations))
-+			return -EINVAL;
- 	}
- 
- 	/* Only HW csum features are currently compatible with mac80211 */
-@@ -1313,18 +1337,6 @@ int ieee80211_register_hw(struct ieee802
- 	hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
- 	hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);
- 
--	/* mac80211 doesn't support more than one IBSS interface right now */
--	for (i = 0; i < hw->wiphy->n_iface_combinations; i++) {
--		const struct ieee80211_iface_combination *c;
--		int j;
--
--		c = &hw->wiphy->iface_combinations[i];
--
--		for (j = 0; j < c->n_limits; j++)
--			if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
--			    c->limits[j].max > 1)
--				return -EINVAL;
--	}
- 
- 	local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
- 				      sizeof(void *) * channels, GFP_KERNEL);
diff --git a/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-add-radio-index-to-ieee80211_chanctx_c.patch b/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-add-radio-index-to-ieee80211_chanctx_c.patch
deleted file mode 100644
index b832a2a124..0000000000
--- a/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-add-radio-index-to-ieee80211_chanctx_c.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 5 Jun 2024 10:41:34 +0200
-Subject: [PATCH] wifi: mac80211: add radio index to
- ieee80211_chanctx_conf
-
-Will be used to explicitly assign a channel context to a wiphy radio.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -250,6 +250,7 @@ struct ieee80211_chan_req {
-  * @min_def: the minimum channel definition currently required.
-  * @ap: the channel definition the AP actually is operating as,
-  *	for use with (wider bandwidth) OFDMA
-+ * @radio_idx: index of the wiphy radio used used for this channel
-  * @rx_chains_static: The number of RX chains that must always be
-  *	active on the channel to receive MIMO transmissions
-  * @rx_chains_dynamic: The number of RX chains that must be enabled
-@@ -264,6 +265,7 @@ struct ieee80211_chanctx_conf {
- 	struct cfg80211_chan_def min_def;
- 	struct cfg80211_chan_def ap;
- 
-+	int radio_idx;
- 	u8 rx_chains_static, rx_chains_dynamic;
- 
- 	bool radar_enabled;
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -623,7 +623,8 @@ ieee80211_chanctx_radar_required(struct
- static struct ieee80211_chanctx *
- ieee80211_alloc_chanctx(struct ieee80211_local *local,
- 			const struct ieee80211_chan_req *chanreq,
--			enum ieee80211_chanctx_mode mode)
-+			enum ieee80211_chanctx_mode mode,
-+			int radio_idx)
- {
- 	struct ieee80211_chanctx *ctx;
- 
-@@ -641,6 +642,7 @@ ieee80211_alloc_chanctx(struct ieee80211
- 	ctx->conf.rx_chains_dynamic = 1;
- 	ctx->mode = mode;
- 	ctx->conf.radar_enabled = false;
-+	ctx->conf.radio_idx = radio_idx;
- 	_ieee80211_recalc_chanctx_min_def(local, ctx, NULL);
- 
- 	return ctx;
-@@ -680,7 +682,7 @@ ieee80211_new_chanctx(struct ieee80211_l
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
--	ctx = ieee80211_alloc_chanctx(local, chanreq, mode);
-+	ctx = ieee80211_alloc_chanctx(local, chanreq, mode, -1);
- 	if (!ctx)
- 		return ERR_PTR(-ENOMEM);
- 
-@@ -1098,7 +1100,7 @@ int ieee80211_link_reserve_chanctx(struc
- 			    !list_empty(&curr_ctx->reserved_links))
- 				return -EBUSY;
- 
--			new_ctx = ieee80211_alloc_chanctx(local, chanreq, mode);
-+			new_ctx = ieee80211_alloc_chanctx(local, chanreq, mode, -1);
- 			if (!new_ctx)
- 				return -ENOMEM;
- 
diff --git a/package/kernel/mac80211/patches/subsys/346-wifi-mac80211-extend-ifcomb-check-functions-for-mult.patch b/package/kernel/mac80211/patches/subsys/346-wifi-mac80211-extend-ifcomb-check-functions-for-mult.patch
deleted file mode 100644
index 168cf6fad0..0000000000
--- a/package/kernel/mac80211/patches/subsys/346-wifi-mac80211-extend-ifcomb-check-functions-for-mult.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Tue, 4 Jun 2024 21:48:48 +0200
-Subject: [PATCH] wifi: mac80211: extend ifcomb check functions for
- multi-radio
-
-Add support for counting global and per-radio max/current number of
-channels, as well as checking radio-specific interface combinations.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -263,7 +263,7 @@ static int ieee80211_start_p2p_device(st
- 
- 	lockdep_assert_wiphy(sdata->local->hw.wiphy);
- 
--	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
-+	ret = ieee80211_check_combinations(sdata, NULL, 0, 0, -1);
- 	if (ret < 0)
- 		return ret;
- 
-@@ -285,7 +285,7 @@ static int ieee80211_start_nan(struct wi
- 
- 	lockdep_assert_wiphy(sdata->local->hw.wiphy);
- 
--	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
-+	ret = ieee80211_check_combinations(sdata, NULL, 0, 0, -1);
- 	if (ret < 0)
- 		return ret;
- 
-@@ -3992,7 +3992,7 @@ __ieee80211_channel_switch(struct wiphy
- 		goto out;
- 
- 	/* if reservation is invalid then this will fail */
--	err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0);
-+	err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0, -1);
- 	if (err) {
- 		ieee80211_link_unreserve_chanctx(link_data);
- 		goto out;
-@@ -5161,4 +5161,5 @@ const struct cfg80211_ops mac80211_confi
- 	.del_link_station = ieee80211_del_link_station,
- 	.set_hw_timestamp = ieee80211_set_hw_timestamp,
- 	.set_ttlm = ieee80211_set_ttlm,
-+	.get_radio_mask = ieee80211_get_radio_mask,
- };
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -47,24 +47,29 @@ int ieee80211_chanctx_refcount(struct ie
- 	       ieee80211_chanctx_num_reserved(local, ctx);
- }
- 
--static int ieee80211_num_chanctx(struct ieee80211_local *local)
-+static int ieee80211_num_chanctx(struct ieee80211_local *local, int radio_idx)
- {
- 	struct ieee80211_chanctx *ctx;
- 	int num = 0;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
--	list_for_each_entry(ctx, &local->chanctx_list, list)
-+	list_for_each_entry(ctx, &local->chanctx_list, list) {
-+		if (radio_idx >= 0 && ctx->conf.radio_idx != radio_idx)
-+			continue;
- 		num++;
-+	}
- 
- 	return num;
- }
- 
--static bool ieee80211_can_create_new_chanctx(struct ieee80211_local *local)
-+static bool ieee80211_can_create_new_chanctx(struct ieee80211_local *local,
-+					     int radio_idx)
- {
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
--	return ieee80211_num_chanctx(local) < ieee80211_max_num_channels(local);
-+	return ieee80211_num_chanctx(local, radio_idx) <
-+	       ieee80211_max_num_channels(local, radio_idx);
- }
- 
- static struct ieee80211_chanctx *
-@@ -1045,7 +1050,7 @@ int ieee80211_link_reserve_chanctx(struc
- 
- 	new_ctx = ieee80211_find_reservation_chanctx(local, chanreq, mode);
- 	if (!new_ctx) {
--		if (ieee80211_can_create_new_chanctx(local)) {
-+		if (ieee80211_can_create_new_chanctx(local, -1)) {
- 			new_ctx = ieee80211_new_chanctx(local, chanreq, mode);
- 			if (IS_ERR(new_ctx))
- 				return PTR_ERR(new_ctx);
-@@ -1736,7 +1741,7 @@ int ieee80211_link_use_channel(struct ie
- 	link->radar_required = ret;
- 
- 	ret = ieee80211_check_combinations(sdata, &chanreq->oper, mode,
--					   radar_detect_width);
-+					   radar_detect_width, -1);
- 	if (ret < 0)
- 		goto out;
- 
---- a/net/mac80211/ibss.c
-+++ b/net/mac80211/ibss.c
-@@ -1745,7 +1745,7 @@ int ieee80211_ibss_join(struct ieee80211
- 		IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE;
- 
- 	ret = ieee80211_check_combinations(sdata, &params->chandef, chanmode,
--					   radar_detect_width);
-+					   radar_detect_width, -1);
- 	if (ret < 0)
- 		return ret;
- 
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2596,8 +2596,9 @@ void ieee80211_recalc_dtim(struct ieee80
- int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
- 				 const struct cfg80211_chan_def *chandef,
- 				 enum ieee80211_chanctx_mode chanmode,
--				 u8 radar_detect);
--int ieee80211_max_num_channels(struct ieee80211_local *local);
-+				 u8 radar_detect, int radio_idx);
-+int ieee80211_max_num_channels(struct ieee80211_local *local, int radio_idx);
-+u32 ieee80211_get_radio_mask(struct wiphy *wiphy, struct net_device *dev);
- void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
- 				       struct ieee80211_chanctx *ctx);
- 
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -397,7 +397,7 @@ static int ieee80211_check_concurrent_if
- 		}
- 	}
- 
--	return ieee80211_check_combinations(sdata, NULL, 0, 0);
-+	return ieee80211_check_combinations(sdata, NULL, 0, 0, -1);
- }
- 
- static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -3918,20 +3918,103 @@ static u8 ieee80211_chanctx_radar_detect
- 	return radar_detect;
- }
- 
-+static u32
-+__ieee80211_get_radio_mask(struct ieee80211_sub_if_data *sdata)
-+{
-+	struct ieee80211_bss_conf *link_conf;
-+	struct ieee80211_chanctx_conf *conf;
-+	unsigned int link_id;
-+	u32 mask = 0;
-+
-+	for_each_vif_active_link(&sdata->vif, link_conf, link_id) {
-+		conf = sdata_dereference(link_conf->chanctx_conf, sdata);
-+		if (!conf || conf->radio_idx < 0)
-+			continue;
-+
-+		mask |= BIT(conf->radio_idx);
-+	}
-+
-+	return mask;
-+}
-+
-+u32 ieee80211_get_radio_mask(struct wiphy *wiphy, struct net_device *dev)
-+{
-+	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-+
-+	return __ieee80211_get_radio_mask(sdata);
-+}
-+
-+static bool
-+ieee80211_sdata_uses_radio(struct ieee80211_sub_if_data *sdata, int radio_idx)
-+{
-+	if (radio_idx < 0)
-+		return true;
-+
-+	return __ieee80211_get_radio_mask(sdata) & BIT(radio_idx);
-+}
-+
-+static int
-+ieee80211_fill_ifcomb_params(struct ieee80211_local *local,
-+			     struct iface_combination_params *params,
-+			     const struct cfg80211_chan_def *chandef,
-+			     struct ieee80211_sub_if_data *sdata)
-+{
-+	struct ieee80211_sub_if_data *sdata_iter;
-+	struct ieee80211_chanctx *ctx;
-+	int total = !!sdata;
-+
-+	list_for_each_entry(ctx, &local->chanctx_list, list) {
-+		if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
-+			continue;
-+
-+		if (params->radio_idx >= 0 &&
-+		    ctx->conf.radio_idx != params->radio_idx)
-+			continue;
-+
-+		params->radar_detect |=
-+			ieee80211_chanctx_radar_detect(local, ctx);
-+
-+		if (chandef && ctx->mode != IEEE80211_CHANCTX_EXCLUSIVE &&
-+		    cfg80211_chandef_compatible(chandef, &ctx->conf.def))
-+			continue;
-+
-+		params->num_different_channels++;
-+	}
-+
-+	list_for_each_entry(sdata_iter, &local->interfaces, list) {
-+		struct wireless_dev *wdev_iter;
-+
-+		wdev_iter = &sdata_iter->wdev;
-+
-+		if (sdata_iter == sdata ||
-+		    !ieee80211_sdata_running(sdata_iter) ||
-+		    cfg80211_iftype_allowed(local->hw.wiphy,
-+					    wdev_iter->iftype, 0, 1))
-+			continue;
-+
-+		if (!ieee80211_sdata_uses_radio(sdata_iter, params->radio_idx))
-+			continue;
-+
-+		params->iftype_num[wdev_iter->iftype]++;
-+		total++;
-+	}
-+
-+	return total;
-+}
-+
- int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
- 				 const struct cfg80211_chan_def *chandef,
- 				 enum ieee80211_chanctx_mode chanmode,
--				 u8 radar_detect)
-+				 u8 radar_detect, int radio_idx)
- {
-+	bool shared = chanmode == IEEE80211_CHANCTX_SHARED;
- 	struct ieee80211_local *local = sdata->local;
--	struct ieee80211_sub_if_data *sdata_iter;
- 	enum nl80211_iftype iftype = sdata->wdev.iftype;
--	struct ieee80211_chanctx *ctx;
--	int total = 1;
- 	struct iface_combination_params params = {
- 		.radar_detect = radar_detect,
--		.radio_idx = -1,
-+		.radio_idx = radio_idx,
- 	};
-+	int total;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
-@@ -3968,37 +4051,9 @@ int ieee80211_check_combinations(struct
- 	if (iftype != NL80211_IFTYPE_UNSPECIFIED)
- 		params.iftype_num[iftype] = 1;
- 
--	list_for_each_entry(ctx, &local->chanctx_list, list) {
--		if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
--			continue;
--		params.radar_detect |=
--			ieee80211_chanctx_radar_detect(local, ctx);
--		if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
--			params.num_different_channels++;
--			continue;
--		}
--		if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
--		    cfg80211_chandef_compatible(chandef,
--						&ctx->conf.def))
--			continue;
--		params.num_different_channels++;
--	}
--
--	list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
--		struct wireless_dev *wdev_iter;
--
--		wdev_iter = &sdata_iter->wdev;
--
--		if (sdata_iter == sdata ||
--		    !ieee80211_sdata_running(sdata_iter) ||
--		    cfg80211_iftype_allowed(local->hw.wiphy,
--					    wdev_iter->iftype, 0, 1))
--			continue;
--
--		params.iftype_num[wdev_iter->iftype]++;
--		total++;
--	}
--
-+	total = ieee80211_fill_ifcomb_params(local, &params,
-+					     shared ? chandef : NULL,
-+					     sdata);
- 	if (total == 1 && !params.radar_detect)
- 		return 0;
- 
-@@ -4015,30 +4070,17 @@ ieee80211_iter_max_chans(const struct ie
- 					  c->num_different_channels);
- }
- 
--int ieee80211_max_num_channels(struct ieee80211_local *local)
-+int ieee80211_max_num_channels(struct ieee80211_local *local, int radio_idx)
- {
--	struct ieee80211_sub_if_data *sdata;
--	struct ieee80211_chanctx *ctx;
- 	u32 max_num_different_channels = 1;
- 	int err;
- 	struct iface_combination_params params = {
--		.radio_idx = -1,
-+		.radio_idx = radio_idx,
- 	};
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
--	list_for_each_entry(ctx, &local->chanctx_list, list) {
--		if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
--			continue;
--
--		params.num_different_channels++;
--
--		params.radar_detect |=
--			ieee80211_chanctx_radar_detect(local, ctx);
--	}
--
--	list_for_each_entry_rcu(sdata, &local->interfaces, list)
--		params.iftype_num[sdata->wdev.iftype]++;
-+	ieee80211_fill_ifcomb_params(local, &params, NULL, NULL);
- 
- 	err = cfg80211_iter_combinations(local->hw.wiphy, &params,
- 					 ieee80211_iter_max_chans,
diff --git a/package/kernel/mac80211/patches/subsys/347-wifi-mac80211-move-code-in-ieee80211_link_reserve_ch.patch b/package/kernel/mac80211/patches/subsys/347-wifi-mac80211-move-code-in-ieee80211_link_reserve_ch.patch
deleted file mode 100644
index 9a85067602..0000000000
--- a/package/kernel/mac80211/patches/subsys/347-wifi-mac80211-move-code-in-ieee80211_link_reserve_ch.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 5 Jun 2024 10:49:22 +0200
-Subject: [PATCH] wifi: mac80211: move code in
- ieee80211_link_reserve_chanctx to a helper
-
-Reduces indentation in preparation for further changes
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -1033,6 +1033,71 @@ int ieee80211_link_unreserve_chanctx(str
- 	return 0;
- }
- 
-+static struct ieee80211_chanctx *
-+ieee80211_replace_chanctx(struct ieee80211_local *local,
-+			  const struct ieee80211_chan_req *chanreq,
-+			  enum ieee80211_chanctx_mode mode,
-+			  struct ieee80211_chanctx *curr_ctx)
-+{
-+	struct ieee80211_chanctx *new_ctx, *ctx;
-+
-+	if (!curr_ctx || (curr_ctx->replace_state ==
-+			  IEEE80211_CHANCTX_WILL_BE_REPLACED) ||
-+	    !list_empty(&curr_ctx->reserved_links)) {
-+		/*
-+		 * Another link already requested this context for a
-+		 * reservation. Find another one hoping all links assigned
-+		 * to it will also switch soon enough.
-+		 *
-+		 * TODO: This needs a little more work as some cases
-+		 * (more than 2 chanctx capable devices) may fail which could
-+		 * otherwise succeed provided some channel context juggling was
-+		 * performed.
-+		 *
-+		 * Consider ctx1..3, link1..6, each ctx has 2 links. link1 and
-+		 * link2 from ctx1 request new different chandefs starting 2
-+		 * in-place reserations with ctx4 and ctx5 replacing ctx1 and
-+		 * ctx2 respectively. Next link5 and link6 from ctx3 reserve
-+		 * ctx4. If link3 and link4 remain on ctx2 as they are then this
-+		 * fails unless `replace_ctx` from ctx5 is replaced with ctx3.
-+		 */
-+		list_for_each_entry(ctx, &local->chanctx_list, list) {
-+			if (ctx->replace_state !=
-+			    IEEE80211_CHANCTX_REPLACE_NONE)
-+				continue;
-+
-+			if (!list_empty(&ctx->reserved_links))
-+				continue;
-+
-+			curr_ctx = ctx;
-+			break;
-+		}
-+	}
-+
-+	/*
-+	 * If that's true then all available contexts already have reservations
-+	 * and cannot be used.
-+	 */
-+	if (!curr_ctx || (curr_ctx->replace_state ==
-+			  IEEE80211_CHANCTX_WILL_BE_REPLACED) ||
-+	    !list_empty(&curr_ctx->reserved_links))
-+		return ERR_PTR(-EBUSY);
-+
-+	new_ctx = ieee80211_alloc_chanctx(local, chanreq, mode, -1);
-+	if (!new_ctx)
-+		return ERR_PTR(-ENOMEM);
-+
-+	new_ctx->replace_ctx = curr_ctx;
-+	new_ctx->replace_state = IEEE80211_CHANCTX_REPLACES_OTHER;
-+
-+	curr_ctx->replace_ctx = new_ctx;
-+	curr_ctx->replace_state = IEEE80211_CHANCTX_WILL_BE_REPLACED;
-+
-+	list_add_rcu(&new_ctx->list, &local->chanctx_list);
-+
-+	return new_ctx;
-+}
-+
- int ieee80211_link_reserve_chanctx(struct ieee80211_link_data *link,
- 				   const struct ieee80211_chan_req *chanreq,
- 				   enum ieee80211_chanctx_mode mode,
-@@ -1040,7 +1105,7 @@ int ieee80211_link_reserve_chanctx(struc
- {
- 	struct ieee80211_sub_if_data *sdata = link->sdata;
- 	struct ieee80211_local *local = sdata->local;
--	struct ieee80211_chanctx *new_ctx, *curr_ctx, *ctx;
-+	struct ieee80211_chanctx *new_ctx, *curr_ctx;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
-@@ -1050,75 +1115,13 @@ int ieee80211_link_reserve_chanctx(struc
- 
- 	new_ctx = ieee80211_find_reservation_chanctx(local, chanreq, mode);
- 	if (!new_ctx) {
--		if (ieee80211_can_create_new_chanctx(local, -1)) {
-+		if (ieee80211_can_create_new_chanctx(local, -1))
- 			new_ctx = ieee80211_new_chanctx(local, chanreq, mode);
--			if (IS_ERR(new_ctx))
--				return PTR_ERR(new_ctx);
--		} else {
--			if (!curr_ctx ||
--			    (curr_ctx->replace_state ==
--			     IEEE80211_CHANCTX_WILL_BE_REPLACED) ||
--			    !list_empty(&curr_ctx->reserved_links)) {
--				/*
--				 * Another link already requested this context
--				 * for a reservation. Find another one hoping
--				 * all links assigned to it will also switch
--				 * soon enough.
--				 *
--				 * TODO: This needs a little more work as some
--				 * cases (more than 2 chanctx capable devices)
--				 * may fail which could otherwise succeed
--				 * provided some channel context juggling was
--				 * performed.
--				 *
--				 * Consider ctx1..3, link1..6, each ctx has 2
--				 * links. link1 and link2 from ctx1 request new
--				 * different chandefs starting 2 in-place
--				 * reserations with ctx4 and ctx5 replacing
--				 * ctx1 and ctx2 respectively. Next link5 and
--				 * link6 from ctx3 reserve ctx4. If link3 and
--				 * link4 remain on ctx2 as they are then this
--				 * fails unless `replace_ctx` from ctx5 is
--				 * replaced with ctx3.
--				 */
--				list_for_each_entry(ctx, &local->chanctx_list,
--						    list) {
--					if (ctx->replace_state !=
--					    IEEE80211_CHANCTX_REPLACE_NONE)
--						continue;
--
--					if (!list_empty(&ctx->reserved_links))
--						continue;
--
--					curr_ctx = ctx;
--					break;
--				}
--			}
--
--			/*
--			 * If that's true then all available contexts already
--			 * have reservations and cannot be used.
--			 */
--			if (!curr_ctx ||
--			    (curr_ctx->replace_state ==
--			     IEEE80211_CHANCTX_WILL_BE_REPLACED) ||
--			    !list_empty(&curr_ctx->reserved_links))
--				return -EBUSY;
--
--			new_ctx = ieee80211_alloc_chanctx(local, chanreq, mode, -1);
--			if (!new_ctx)
--				return -ENOMEM;
--
--			new_ctx->replace_ctx = curr_ctx;
--			new_ctx->replace_state =
--					IEEE80211_CHANCTX_REPLACES_OTHER;
--
--			curr_ctx->replace_ctx = new_ctx;
--			curr_ctx->replace_state =
--					IEEE80211_CHANCTX_WILL_BE_REPLACED;
--
--			list_add_rcu(&new_ctx->list, &local->chanctx_list);
--		}
-+		else
-+			new_ctx = ieee80211_replace_chanctx(local, chanreq,
-+							    mode, curr_ctx);
-+		if (IS_ERR(new_ctx))
-+			return PTR_ERR(new_ctx);
- 	}
- 
- 	list_add(&link->reserved_chanctx_list, &new_ctx->reserved_links);
diff --git a/package/kernel/mac80211/patches/subsys/348-wifi-mac80211-add-wiphy-radio-assignment-and-validat.patch b/package/kernel/mac80211/patches/subsys/348-wifi-mac80211-add-wiphy-radio-assignment-and-validat.patch
deleted file mode 100644
index c559f070e8..0000000000
--- a/package/kernel/mac80211/patches/subsys/348-wifi-mac80211-add-wiphy-radio-assignment-and-validat.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 5 Jun 2024 18:39:55 +0200
-Subject: [PATCH] wifi: mac80211: add wiphy radio assignment and
- validation
-
-Validate number of channels and interface combinations per radio.
-Assign each channel context to a radio.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -680,14 +680,15 @@ static int ieee80211_add_chanctx(struct
- static struct ieee80211_chanctx *
- ieee80211_new_chanctx(struct ieee80211_local *local,
- 		      const struct ieee80211_chan_req *chanreq,
--		      enum ieee80211_chanctx_mode mode)
-+		      enum ieee80211_chanctx_mode mode,
-+		      int radio_idx)
- {
- 	struct ieee80211_chanctx *ctx;
- 	int err;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
--	ctx = ieee80211_alloc_chanctx(local, chanreq, mode, -1);
-+	ctx = ieee80211_alloc_chanctx(local, chanreq, mode, radio_idx);
- 	if (!ctx)
- 		return ERR_PTR(-ENOMEM);
- 
-@@ -1040,6 +1041,8 @@ ieee80211_replace_chanctx(struct ieee802
- 			  struct ieee80211_chanctx *curr_ctx)
- {
- 	struct ieee80211_chanctx *new_ctx, *ctx;
-+	struct wiphy *wiphy = local->hw.wiphy;
-+	const struct wiphy_radio *radio;
- 
- 	if (!curr_ctx || (curr_ctx->replace_state ==
- 			  IEEE80211_CHANCTX_WILL_BE_REPLACED) ||
-@@ -1069,6 +1072,12 @@ ieee80211_replace_chanctx(struct ieee802
- 			if (!list_empty(&ctx->reserved_links))
- 				continue;
- 
-+			if (ctx->conf.radio_idx >= 0) {
-+				radio = &wiphy->radio[ctx->conf.radio_idx];
-+				if (!cfg80211_radio_chandef_valid(radio, &chanreq->oper))
-+					continue;
-+			}
-+
- 			curr_ctx = ctx;
- 			break;
- 		}
-@@ -1098,6 +1107,34 @@ ieee80211_replace_chanctx(struct ieee802
- 	return new_ctx;
- }
- 
-+static bool
-+ieee80211_find_available_radio(struct ieee80211_local *local,
-+			       const struct ieee80211_chan_req *chanreq,
-+			       int *radio_idx)
-+{
-+	struct wiphy *wiphy = local->hw.wiphy;
-+	const struct wiphy_radio *radio;
-+	int i;
-+
-+	*radio_idx = -1;
-+	if (!wiphy->n_radio)
-+		return true;
-+
-+	for (i = 0; i < wiphy->n_radio; i++) {
-+		radio = &wiphy->radio[i];
-+		if (!cfg80211_radio_chandef_valid(radio, &chanreq->oper))
-+			continue;
-+
-+		if (!ieee80211_can_create_new_chanctx(local, i))
-+			continue;
-+
-+		*radio_idx = i;
-+		return true;
-+	}
-+
-+	return false;
-+}
-+
- int ieee80211_link_reserve_chanctx(struct ieee80211_link_data *link,
- 				   const struct ieee80211_chan_req *chanreq,
- 				   enum ieee80211_chanctx_mode mode,
-@@ -1106,6 +1143,7 @@ int ieee80211_link_reserve_chanctx(struc
- 	struct ieee80211_sub_if_data *sdata = link->sdata;
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_chanctx *new_ctx, *curr_ctx;
-+	int radio_idx;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
- 
-@@ -1115,8 +1153,10 @@ int ieee80211_link_reserve_chanctx(struc
- 
- 	new_ctx = ieee80211_find_reservation_chanctx(local, chanreq, mode);
- 	if (!new_ctx) {
--		if (ieee80211_can_create_new_chanctx(local, -1))
--			new_ctx = ieee80211_new_chanctx(local, chanreq, mode);
-+		if (ieee80211_can_create_new_chanctx(local, -1) &&
-+		    ieee80211_find_available_radio(local, chanreq, &radio_idx))
-+			new_ctx = ieee80211_new_chanctx(local, chanreq, mode,
-+							radio_idx);
- 		else
- 			new_ctx = ieee80211_replace_chanctx(local, chanreq,
- 							    mode, curr_ctx);
-@@ -1724,6 +1764,7 @@ int ieee80211_link_use_channel(struct ie
- 	struct ieee80211_local *local = sdata->local;
- 	struct ieee80211_chanctx *ctx;
- 	u8 radar_detect_width = 0;
-+	int radio_idx;
- 	int ret;
- 
- 	lockdep_assert_wiphy(local->hw.wiphy);
-@@ -1751,8 +1792,12 @@ int ieee80211_link_use_channel(struct ie
- 	__ieee80211_link_release_channel(link);
- 
- 	ctx = ieee80211_find_chanctx(local, chanreq, mode);
--	if (!ctx)
--		ctx = ieee80211_new_chanctx(local, chanreq, mode);
-+	if (!ctx) {
-+		if (!ieee80211_find_available_radio(local, chanreq, &radio_idx))
-+			ctx = ERR_PTR(-EBUSY);
-+		else
-+			ctx = ieee80211_new_chanctx(local, chanreq, mode, radio_idx);
-+	}
- 	if (IS_ERR(ctx)) {
- 		ret = PTR_ERR(ctx);
- 		goto out;
diff --git a/package/kernel/mac80211/patches/subsys/349-wifi-mac80211_hwsim-add-support-for-multi-radio-wiph.patch b/package/kernel/mac80211/patches/subsys/349-wifi-mac80211_hwsim-add-support-for-multi-radio-wiph.patch
deleted file mode 100644
index 91fe6d83d9..0000000000
--- a/package/kernel/mac80211/patches/subsys/349-wifi-mac80211_hwsim-add-support-for-multi-radio-wiph.patch
+++ /dev/null
@@ -1,199 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Tue, 11 Jun 2024 09:02:55 +0200
-Subject: [PATCH] wifi: mac80211_hwsim: add support for multi-radio wiphy
-
-This registers one wiphy radio per supported band. Number of different
-channels is set per radio.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/drivers/net/wireless/virtual/mac80211_hwsim.c
-+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
-@@ -69,6 +69,10 @@ static bool mlo;
- module_param(mlo, bool, 0444);
- MODULE_PARM_DESC(mlo, "Support MLO");
- 
-+static bool multi_radio;
-+module_param(multi_radio, bool, 0444);
-+MODULE_PARM_DESC(mlo, "Support Multiple Radios per wiphy");
-+
- /**
-  * enum hwsim_regtest - the type of regulatory tests we offer
-  *
-@@ -669,6 +673,10 @@ struct mac80211_hwsim_data {
- 	struct ieee80211_iface_limit if_limits[3];
- 	int n_if_limits;
- 
-+	struct ieee80211_iface_combination if_combination_radio;
-+	struct wiphy_radio_freq_range radio_range[NUM_NL80211_BANDS];
-+	struct wiphy_radio radio[NUM_NL80211_BANDS];
-+
- 	u32 ciphers[ARRAY_SIZE(hwsim_ciphers)];
- 
- 	struct mac_address addresses[2];
-@@ -917,6 +925,7 @@ static const struct nla_policy hwsim_gen
- 	[HWSIM_ATTR_MLO_SUPPORT] = { .type = NLA_FLAG },
- 	[HWSIM_ATTR_PMSR_SUPPORT] = NLA_POLICY_NESTED(hwsim_pmsr_capa_policy),
- 	[HWSIM_ATTR_PMSR_RESULT] = NLA_POLICY_NESTED(hwsim_pmsr_peers_result_policy),
-+	[HWSIM_ATTR_MULTI_RADIO] = { .type = NLA_FLAG },
- };
- 
- #if IS_REACHABLE(CONFIG_VIRTIO)
-@@ -4007,6 +4016,7 @@ struct hwsim_new_radio_params {
- 	bool reg_strict;
- 	bool p2p_device;
- 	bool use_chanctx;
-+	bool multi_radio;
- 	bool destroy_on_close;
- 	const char *hwname;
- 	bool no_vif;
-@@ -4083,6 +4093,12 @@ static int append_radio_msg(struct sk_bu
- 			return ret;
- 	}
- 
-+	if (param->multi_radio) {
-+		ret = nla_put_flag(skb, HWSIM_ATTR_MULTI_RADIO);
-+		if (ret < 0)
-+			return ret;
-+	}
-+
- 	if (param->hwname) {
- 		ret = nla_put(skb, HWSIM_ATTR_RADIO_NAME,
- 			      strlen(param->hwname), param->hwname);
-@@ -5099,6 +5115,7 @@ static int mac80211_hwsim_new_radio(stru
- 	struct net *net;
- 	int idx, i;
- 	int n_limits = 0;
-+	int n_bands = 0;
- 
- 	if (WARN_ON(param->channels > 1 && !param->use_chanctx))
- 		return -EINVAL;
-@@ -5202,22 +5219,22 @@ static int mac80211_hwsim_new_radio(stru
- 		n_limits++;
- 	}
- 
-+	data->if_combination.radar_detect_widths =
-+				BIT(NL80211_CHAN_WIDTH_5) |
-+				BIT(NL80211_CHAN_WIDTH_10) |
-+				BIT(NL80211_CHAN_WIDTH_20_NOHT) |
-+				BIT(NL80211_CHAN_WIDTH_20) |
-+				BIT(NL80211_CHAN_WIDTH_40) |
-+				BIT(NL80211_CHAN_WIDTH_80) |
-+				BIT(NL80211_CHAN_WIDTH_160);
-+
- 	if (data->use_chanctx) {
- 		hw->wiphy->max_scan_ssids = 255;
- 		hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
- 		hw->wiphy->max_remain_on_channel_duration = 1000;
--		data->if_combination.radar_detect_widths = 0;
- 		data->if_combination.num_different_channels = data->channels;
- 	} else {
- 		data->if_combination.num_different_channels = 1;
--		data->if_combination.radar_detect_widths =
--					BIT(NL80211_CHAN_WIDTH_5) |
--					BIT(NL80211_CHAN_WIDTH_10) |
--					BIT(NL80211_CHAN_WIDTH_20_NOHT) |
--					BIT(NL80211_CHAN_WIDTH_20) |
--					BIT(NL80211_CHAN_WIDTH_40) |
--					BIT(NL80211_CHAN_WIDTH_80) |
--					BIT(NL80211_CHAN_WIDTH_160);
- 	}
- 
- 	if (!n_limits) {
-@@ -5333,6 +5350,9 @@ static int mac80211_hwsim_new_radio(stru
- 
- 	for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
- 		struct ieee80211_supported_band *sband = &data->bands[band];
-+		struct wiphy_radio_freq_range *radio_range;
-+		const struct ieee80211_channel *c;
-+		struct wiphy_radio *radio;
- 
- 		sband->band = band;
- 
-@@ -5406,8 +5426,36 @@ static int mac80211_hwsim_new_radio(stru
- 		mac80211_hwsim_sband_capab(sband);
- 
- 		hw->wiphy->bands[band] = sband;
-+
-+		if (!param->multi_radio)
-+			continue;
-+
-+		c = sband->channels;
-+		radio_range = &data->radio_range[n_bands];
-+		radio_range->start_freq = ieee80211_channel_to_khz(c) - 10000;
-+
-+		c += sband->n_channels - 1;
-+		radio_range->end_freq = ieee80211_channel_to_khz(c) + 10000;
-+
-+		radio = &data->radio[n_bands++];
-+		radio->freq_range = radio_range;
-+		radio->n_freq_range = 1;
-+		radio->iface_combinations = &data->if_combination_radio;
-+		radio->n_iface_combinations = 1;
- 	}
- 
-+	if (param->multi_radio) {
-+		hw->wiphy->radio = data->radio;
-+		hw->wiphy->n_radio = n_bands;
-+
-+		memcpy(&data->if_combination_radio, &data->if_combination,
-+		       sizeof(data->if_combination));
-+		data->if_combination.num_different_channels *= n_bands;
-+	}
-+
-+	if (data->use_chanctx)
-+		data->if_combination.radar_detect_widths = 0;
-+
- 	/* By default all radios belong to the first group */
- 	data->group = 1;
- 	mutex_init(&data->mutex);
-@@ -6025,6 +6073,9 @@ static int hwsim_new_radio_nl(struct sk_
- 	else
- 		param.use_chanctx = (param.channels > 1);
- 
-+	if (info->attrs[HWSIM_ATTR_MULTI_RADIO])
-+		param.multi_radio = true;
-+
- 	if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2])
- 		param.reg_alpha2 =
- 			nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]);
-@@ -6105,7 +6156,7 @@ static int hwsim_new_radio_nl(struct sk_
- 
- 	param.mlo = info->attrs[HWSIM_ATTR_MLO_SUPPORT];
- 
--	if (param.mlo)
-+	if (param.mlo || param.multi_radio)
- 		param.use_chanctx = true;
- 
- 	if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
-@@ -6802,7 +6853,8 @@ static int __init init_mac80211_hwsim(vo
- 
- 		param.p2p_device = support_p2p_device;
- 		param.mlo = mlo;
--		param.use_chanctx = channels > 1 || mlo;
-+		param.multi_radio = multi_radio;
-+		param.use_chanctx = channels > 1 || mlo || multi_radio;
- 		param.iftypes = HWSIM_IFTYPE_SUPPORT_MASK;
- 		if (param.p2p_device)
- 			param.iftypes |= BIT(NL80211_IFTYPE_P2P_DEVICE);
---- a/drivers/net/wireless/virtual/mac80211_hwsim.h
-+++ b/drivers/net/wireless/virtual/mac80211_hwsim.h
-@@ -157,6 +157,9 @@ enum hwsim_commands {
-  *	to provide details about peer measurement request (nl80211_peer_measurement_attrs)
-  * @HWSIM_ATTR_PMSR_RESULT: nested attributed used with %HWSIM_CMD_REPORT_PMSR
-  *	to provide peer measurement result (nl80211_peer_measurement_attrs)
-+ * @HWSIM_ATTR_MULTI_RADIO: Register multiple wiphy radios (flag).
-+ *	Adds one radio for each band. Number of supported channels will be set for
-+ *	each radio instead of for the wiphy.
-  * @__HWSIM_ATTR_MAX: enum limit
-  */
- enum hwsim_attrs {
-@@ -189,6 +192,7 @@ enum hwsim_attrs {
- 	HWSIM_ATTR_PMSR_SUPPORT,
- 	HWSIM_ATTR_PMSR_REQUEST,
- 	HWSIM_ATTR_PMSR_RESULT,
-+	HWSIM_ATTR_MULTI_RADIO,
- 	__HWSIM_ATTR_MAX,
- };
- #define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1)
diff --git a/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch b/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch
index 7a96f9f2be..55376362a5 100644
--- a/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch
+++ b/package/kernel/mac80211/patches/subsys/400-allow-ibss-mixed.patch
@@ -16,7 +16,7 @@ and we should ignore this.
 
 --- a/net/wireless/core.c
 +++ b/net/wireless/core.c
-@@ -651,21 +651,6 @@ static int wiphy_verify_combinations(str
+@@ -654,21 +654,6 @@ static int wiphy_verify_combinations(str
  				    c->limits[j].max > 1))
  				return -EINVAL;
  
diff --git a/package/kernel/mac80211/realtek.mk b/package/kernel/mac80211/realtek.mk
index 221158bee6..5aeddb99bc 100644
--- a/package/kernel/mac80211/realtek.mk
+++ b/package/kernel/mac80211/realtek.mk
@@ -1,10 +1,10 @@
 PKG_DRIVERS += \
-	rtlwifi rtlwifi-pci rtlwifi-btcoexist rtlwifi-usb rtl8192c-common \
+	rtlwifi rtlwifi-pci rtlwifi-btcoexist rtlwifi-usb rtl8192c-common rtl8192d-common \
 	rtl8192ce rtl8192se rtl8192de rtl8192cu rtl8723-common rtl8723be rtl8723bs rtl8821ae \
 	rtl8xxxu rtw88 rtw88-pci rtw88-usb rtw88-sdio rtw88-8821c rtw88-8822b rtw88-8822c \
-	rtw88-8723d rtw88-8821ce rtw88-8821cu rtw88-8822be rtw88-8822bu \
+	rtw88-8723x rtw88-8723d rtw88-8821ce rtw88-8821cu rtw88-8822be rtw88-8822bu \
 	rtw88-8822ce rtw88-8822cu rtw88-8723de rtw88-8723ds rtw88-8723du \
-	rtw89 rtw89-pci rtw89-8851be rtw89-8852ae rtw89-8852be rtw89-8852ce
+	rtw89 rtw89-pci rtw89-8851be rtw89-8852ae rtw89-8852b-common rtw89-8852be rtw89-8852ce
 
 config-$(call config_package,rtlwifi) += RTL_CARDS RTLWIFI
 config-$(call config_package,rtlwifi-pci) += RTLWIFI_PCI
@@ -13,6 +13,7 @@ config-$(call config_package,rtlwifi-usb) += RTLWIFI_USB
 config-$(call config_package,rtl8192c-common) += RTL8192C_COMMON
 config-$(call config_package,rtl8192ce) += RTL8192CE
 config-$(call config_package,rtl8192se) += RTL8192SE
+config-$(call config_package,rtl8192d-common) += RTL8192D_COMMON
 config-$(call config_package,rtl8192de) += RTL8192DE
 config-$(call config_package,rtl8192cu) += RTL8192CU
 config-$(call config_package,rtl8821ae) += RTL8821AE
@@ -40,6 +41,7 @@ config-$(call config_package,rtw88-8822bu) += RTW88_8822BU
 config-$(call config_package,rtw88-8822c) += RTW88_8822C
 config-$(call config_package,rtw88-8822ce) += RTW88_8822CE
 config-$(call config_package,rtw88-8822cu) += RTW88_8822CU
+config-$(call config_package,rtw88-8723x) += RTW88_8723X
 config-$(call config_package,rtw88-8723d) += RTW88_8723D
 config-$(call config_package,rtw88-8723de) += RTW88_8723DE
 config-$(call config_package,rtw88-8723ds) += RTW88_8723DS
@@ -51,6 +53,7 @@ config-$(call config_package,rtw89) += RTW89 RTW89_CORE
 config-$(call config_package,rtw89-pci) += RTW89_PCI
 config-$(call config_package,rtw89-8851be) += RTW89_8851B RTW89_8851BE
 config-$(call config_package,rtw89-8852ae) += RTW89_8852A RTW89_8852AE
+config-$(call config_package,rtw89-8852b-common) += RTW89_8852B_COMMON
 config-$(call config_package,rtw89-8852be) += RTW89_8852B RTW89_8852BE
 config-$(call config_package,rtw89-8852ce) += RTW89_8852C RTW89_8852CE
 config-$(CONFIG_PACKAGE_RTW89_DEBUG) += RTW89_DEBUG
@@ -125,10 +128,18 @@ define KernelPackage/rtl8192se
   AUTOLOAD:=$(call AutoProbe,rtl8192se)
 endef
 
+define KernelPackage/rtl8192d-common
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8192DE/RTL8192DU common support module
+  DEPENDS+= +kmod-rtlwifi
+  FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192d/rtl8192d-common.ko
+  HIDDEN:=1
+endef
+
 define KernelPackage/rtl8192de
   $(call KernelPackage/mac80211/Default)
   TITLE:=Realtek RTL8192DE/RTL8188DE support
-  DEPENDS+= +kmod-rtlwifi-pci +rtl8192de-firmware
+  DEPENDS+= +kmod-rtlwifi-pci +kmod-rtl8192d-common +rtl8192de-firmware
   FILES:= $(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtlwifi/rtl8192de/rtl8192de.ko
   AUTOLOAD:=$(call AutoProbe,rtl8192de)
 endef
@@ -260,10 +271,19 @@ define KernelPackage/rtw88-8822c
   HIDDEN:=1
 endef
 
+define KernelPackage/rtw88-8723x
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8723x family support
+  DEPENDS+= +kmod-rtw88
+  FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8723x.ko
+  AUTOLOAD:=$(call AutoProbe,rtw88_8723x)
+  HIDDEN:=1
+endef
+
 define KernelPackage/rtw88-8723d
   $(call KernelPackage/mac80211/Default)
   TITLE:=Realtek RTL8723D family support
-  DEPENDS+= +kmod-rtw88 +rtl8723de-firmware
+  DEPENDS+= +kmod-rtw88-8723x +rtl8723de-firmware
   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8723d.ko
   AUTOLOAD:=$(call AutoProbe,rtw88_8723d)
   HIDDEN:=1
@@ -431,10 +451,20 @@ define KernelPackage/rtw89-8852ae
   AUTOLOAD:=$(call AutoProbe,rtw89_8852ae)
 endef
 
+define KernelPackage/rtw89-8852b-common
+  $(call KernelPackage/mac80211/Default)
+  TITLE:=Realtek RTL8852B family support
+  DEPENDS+= +kmod-rtw89-pci
+  FILES:= \
+	$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw89/rtw89_8852b_common.ko
+  AUTOLOAD:=$(call AutoProbe,rtw89_8852b_common)
+  HIDDEN:=1
+endef
+
 define KernelPackage/rtw89-8852be
   $(call KernelPackage/mac80211/Default)
   TITLE:=Realtek RTL8852BE support
-  DEPENDS+= +kmod-rtw89-pci +rtl8852be-firmware
+  DEPENDS+= +kmod-rtw89-8852b-common +rtl8852be-firmware
   FILES:= \
 	$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw89/rtw89_8852b.ko \
 	$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw89/rtw89_8852be.ko
diff --git a/package/kernel/mt76/patches/100-api_update.patch b/package/kernel/mt76/patches/100-api_update.patch
new file mode 100644
index 0000000000..30f2eebcfa
--- /dev/null
+++ b/package/kernel/mt76/patches/100-api_update.patch
@@ -0,0 +1,216 @@
+--- a/mt76.h
++++ b/mt76.h
+@@ -14,6 +14,7 @@
+ #include <linux/usb.h>
+ #include <linux/average.h>
+ #include <linux/soc/mediatek/mtk_wed.h>
++#include <net/netlink.h>
+ #include <net/mac80211.h>
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(6,6,0)
+ #include <net/page_pool.h>
+@@ -1475,6 +1476,7 @@ static inline void mt76_testmode_reset(s
+ #endif
+ }
+ 
++extern const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS];
+ 
+ /* internal */
+ static inline struct ieee80211_hw *
+--- a/mt7603/main.c
++++ b/mt7603/main.c
+@@ -23,7 +23,7 @@ mt7603_start(struct ieee80211_hw *hw)
+ }
+ 
+ static void
+-mt7603_stop(struct ieee80211_hw *hw)
++mt7603_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt7603_dev *dev = hw->priv;
+ 
+--- a/mt7615/main.c
++++ b/mt7615/main.c
+@@ -91,7 +91,7 @@ out:
+ 	return ret;
+ }
+ 
+-static void mt7615_stop(struct ieee80211_hw *hw)
++static void mt7615_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt7615_dev *dev = mt7615_hw_dev(hw);
+ 	struct mt7615_phy *phy = mt7615_hw_phy(hw);
+--- a/mt7615/usb.c
++++ b/mt7615/usb.c
+@@ -79,7 +79,7 @@ static void mt7663u_copy(struct mt76_dev
+ 	mutex_unlock(&usb->usb_ctrl_mtx);
+ }
+ 
+-static void mt7663u_stop(struct ieee80211_hw *hw)
++static void mt7663u_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt7615_phy *phy = mt7615_hw_phy(hw);
+ 	struct mt7615_dev *dev = hw->priv;
+--- a/mt76x0/pci.c
++++ b/mt76x0/pci.c
+@@ -44,7 +44,7 @@ static void mt76x0e_stop_hw(struct mt76x
+ 	mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_RX_DMA_EN);
+ }
+ 
+-static void mt76x0e_stop(struct ieee80211_hw *hw)
++static void mt76x0e_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt76x02_dev *dev = hw->priv;
+ 
+--- a/mt76x0/usb.c
++++ b/mt76x0/usb.c
+@@ -77,7 +77,7 @@ static void mt76x0u_cleanup(struct mt76x
+ 	mt76u_queues_deinit(&dev->mt76);
+ }
+ 
+-static void mt76x0u_stop(struct ieee80211_hw *hw)
++static void mt76x0u_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt76x02_dev *dev = hw->priv;
+ 
+--- a/mt76x2/pci_main.c
++++ b/mt76x2/pci_main.c
+@@ -24,7 +24,7 @@ mt76x2_start(struct ieee80211_hw *hw)
+ }
+ 
+ static void
+-mt76x2_stop(struct ieee80211_hw *hw)
++mt76x2_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt76x02_dev *dev = hw->priv;
+ 
+--- a/mt76x2/usb_main.c
++++ b/mt76x2/usb_main.c
+@@ -22,7 +22,7 @@ static int mt76x2u_start(struct ieee8021
+ 	return 0;
+ }
+ 
+-static void mt76x2u_stop(struct ieee80211_hw *hw)
++static void mt76x2u_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt76x02_dev *dev = hw->priv;
+ 
+--- a/mt7915/main.c
++++ b/mt7915/main.c
+@@ -108,7 +108,7 @@ static int mt7915_start(struct ieee80211
+ 	return ret;
+ }
+ 
+-static void mt7915_stop(struct ieee80211_hw *hw)
++static void mt7915_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt7915_dev *dev = mt7915_hw_dev(hw);
+ 	struct mt7915_phy *phy = mt7915_hw_phy(hw);
+--- a/mt7915/mcu.c
++++ b/mt7915/mcu.c
+@@ -335,7 +335,7 @@ mt7915_mcu_cca_finish(void *priv, u8 *ma
+ 	if (!vif->bss_conf.color_change_active || vif->type == NL80211_IFTYPE_STATION)
+ 		return;
+ 
+-	ieee80211_color_change_finish(vif);
++	ieee80211_color_change_finish(vif, 0);
+ }
+ 
+ static void
+--- a/mt7921/main.c
++++ b/mt7921/main.c
+@@ -268,7 +268,7 @@ static int mt7921_start(struct ieee80211
+ 	return err;
+ }
+ 
+-static void mt7921_stop(struct ieee80211_hw *hw)
++static void mt7921_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt792x_dev *dev = mt792x_hw_dev(hw);
+ 	int err = 0;
+@@ -281,7 +281,7 @@ static void mt7921_stop(struct ieee80211
+ 			return;
+ 	}
+ 
+-	mt792x_stop(hw);
++	mt792x_stop(hw, false);
+ }
+ 
+ static int
+--- a/mt792x.h
++++ b/mt792x.h
+@@ -337,7 +337,7 @@ static inline bool mt792x_dma_need_reini
+ #define mt792x_mutex_release(dev)	\
+ 	mt76_connac_mutex_release(&(dev)->mt76, &(dev)->pm)
+ 
+-void mt792x_stop(struct ieee80211_hw *hw);
++void mt792x_stop(struct ieee80211_hw *hw, bool suspend);
+ void mt792x_pm_wake_work(struct work_struct *work);
+ void mt792x_pm_power_save_work(struct work_struct *work);
+ void mt792x_reset(struct mt76_dev *mdev);
+@@ -457,7 +457,7 @@ void mt792xu_wr(struct mt76_dev *dev, u3
+ u32 mt792xu_rmw(struct mt76_dev *dev, u32 addr, u32 mask, u32 val);
+ void mt792xu_copy(struct mt76_dev *dev, u32 offset, const void *data, int len);
+ void mt792xu_disconnect(struct usb_interface *usb_intf);
+-void mt792xu_stop(struct ieee80211_hw *hw);
++void mt792xu_stop(struct ieee80211_hw *hw, bool suspend);
+ 
+ static inline void
+ mt792x_skb_add_usb_sdio_hdr(struct mt792x_dev *dev, struct sk_buff *skb,
+--- a/mt792x_core.c
++++ b/mt792x_core.c
+@@ -113,7 +113,7 @@ void mt792x_tx(struct ieee80211_hw *hw,
+ }
+ EXPORT_SYMBOL_GPL(mt792x_tx);
+ 
+-void mt792x_stop(struct ieee80211_hw *hw)
++void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt792x_dev *dev = mt792x_hw_dev(hw);
+ 	struct mt792x_phy *phy = mt792x_hw_phy(hw);
+--- a/mt792x_usb.c
++++ b/mt792x_usb.c
+@@ -285,12 +285,12 @@ int mt792xu_init_reset(struct mt792x_dev
+ }
+ EXPORT_SYMBOL_GPL(mt792xu_init_reset);
+ 
+-void mt792xu_stop(struct ieee80211_hw *hw)
++void mt792xu_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt792x_dev *dev = mt792x_hw_dev(hw);
+ 
+ 	mt76u_stop_tx(&dev->mt76);
+-	mt792x_stop(hw);
++	mt792x_stop(hw, false);
+ }
+ EXPORT_SYMBOL_GPL(mt792xu_stop);
+ 
+--- a/mt7996/main.c
++++ b/mt7996/main.c
+@@ -93,7 +93,7 @@ static int mt7996_start(struct ieee80211
+ 	return ret;
+ }
+ 
+-static void mt7996_stop(struct ieee80211_hw *hw)
++static void mt7996_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	struct mt7996_dev *dev = mt7996_hw_dev(hw);
+ 	struct mt7996_phy *phy = mt7996_hw_phy(hw);
+--- a/mt7996/mcu.c
++++ b/mt7996/mcu.c
+@@ -421,7 +421,7 @@ mt7996_mcu_cca_finish(void *priv, u8 *ma
+ 	if (!vif->bss_conf.color_change_active || vif->type == NL80211_IFTYPE_STATION)
+ 		return;
+ 
+-	ieee80211_color_change_finish(vif);
++	ieee80211_color_change_finish(vif, 0);
+ }
+ 
+ static void
+--- a/testmode.h
++++ b/testmode.h
+@@ -193,6 +193,4 @@ enum mt76_testmode_tx_mode {
+ 	MT76_TM_TX_MODE_MAX = NUM_MT76_TM_TX_MODES - 1,
+ };
+ 
+-extern const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS];
+-
+ #endif
diff --git a/package/kernel/mwlwifi/patches/005-mac80211_update.patch b/package/kernel/mwlwifi/patches/005-mac80211_update.patch
index 877053fdf1..54dc4db783 100644
--- a/package/kernel/mwlwifi/patches/005-mac80211_update.patch
+++ b/package/kernel/mwlwifi/patches/005-mac80211_update.patch
@@ -358,6 +358,15 @@
 +}
 --- a/mac80211.c
 +++ b/mac80211.c
+@@ -159,7 +159,7 @@ fwcmd_fail:
+ 	return rc;
+ }
+ 
+-static void mwl_mac80211_stop(struct ieee80211_hw *hw)
++static void mwl_mac80211_stop(struct ieee80211_hw *hw, bool suspend)
+ {
+ 	mwl_fwcmd_radio_disable(hw);
+ 
 @@ -368,15 +368,15 @@ static void mwl_mac80211_bss_info_change
  		}
  	}




More information about the lede-commits mailing list