diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index e0d2e4087883..ef28c21d7e27 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=5.8.18-test2
+PKG_VERSION:=5.9.11-test3
 PKG_RELEASE:=1
 PKG_SOURCE_URL:=https://hauke-m.de/files/backports-test/
-PKG_HASH:=8bbb49a25b7138eae3a3557915264b0cb6ccc81bdfbc663f707f242e03fdf5a7
+PKG_HASH:=dd16123a154d2d94c51f0023dcf50d60824c93df926597abd9480677147e442f
 
 PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
diff --git a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch
index 020e2bbab51b..646389a35314 100644
--- a/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch
+++ b/package/kernel/mac80211/patches/ath/404-regd_no_assoc_hints.patch
@@ -1,6 +1,6 @@
 --- a/net/wireless/reg.c
 +++ b/net/wireless/reg.c
-@@ -3045,6 +3045,8 @@ void regulatory_hint_country_ie(struct w
+@@ -3047,6 +3047,8 @@ void regulatory_hint_country_ie(struct w
  	enum environment_cap env = ENVIRON_ANY;
  	struct regulatory_request *request = NULL, *lr;
  
@@ -9,7 +9,7 @@
  	/* IE len must be evenly divisible by 2 */
  	if (country_ie_len & 0x01)
  		return;
-@@ -3296,6 +3298,7 @@ static bool is_wiphy_all_set_reg_flag(en
+@@ -3298,6 +3300,7 @@ static bool is_wiphy_all_set_reg_flag(en
  
  void regulatory_hint_disconnect(void)
  {
diff --git a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
index 2b36a559d676..0abd66f85edf 100644
--- a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
+++ b/package/kernel/mac80211/patches/ath/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
-@@ -9053,6 +9053,21 @@ static int ath10k_mac_init_rd(struct ath
+@@ -9049,6 +9049,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[] = {
-@@ -9380,6 +9395,12 @@ int ath10k_mac_register(struct ath10k *a
+@@ -9376,6 +9391,12 @@ int ath10k_mac_register(struct ath10k *a
  
  	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
  
diff --git a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch
index db9a88e000e5..dbd3be79e1f5 100644
--- a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch
+++ b/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch
@@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
  	if (ret)
 --- a/drivers/net/wireless/ath/ath10k/mac.c
 +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -9397,7 +9397,7 @@ int ath10k_mac_register(struct ath10k *a
+@@ -9393,7 +9393,7 @@ int ath10k_mac_register(struct ath10k *a
  	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
  
  #ifdef CPTCFG_MAC80211_LEDS
diff --git a/package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch b/package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch
index 9498e02462b0..4c1963b82825 100644
--- a/package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch
+++ b/package/kernel/mac80211/patches/ath/980-ath10k-fix-max-antenna-gain-unit.patch
@@ -20,7 +20,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
 
 --- a/drivers/net/wireless/ath/ath10k/mac.c
 +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -1043,7 +1043,7 @@ static int ath10k_monitor_vdev_start(str
+@@ -1038,7 +1038,7 @@ static int ath10k_monitor_vdev_start(str
  	arg.channel.min_power = 0;
  	arg.channel.max_power = channel->max_power * 2;
  	arg.channel.max_reg_power = channel->max_reg_power * 2;
@@ -29,7 +29,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
  
  	reinit_completion(&ar->vdev_setup_done);
  	reinit_completion(&ar->vdev_delete_done);
-@@ -1489,7 +1489,7 @@ static int ath10k_vdev_start_restart(str
+@@ -1484,7 +1484,7 @@ static int ath10k_vdev_start_restart(str
  	arg.channel.min_power = 0;
  	arg.channel.max_power = chandef->chan->max_power * 2;
  	arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
@@ -38,7 +38,7 @@ Forwarded: https://patchwork.kernel.org/patch/10986723/
  
  	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
  		arg.ssid = arvif->u.ap.ssid;
-@@ -3194,7 +3194,7 @@ static int ath10k_update_channel_list(st
+@@ -3189,7 +3189,7 @@ static int ath10k_update_channel_list(st
  			ch->min_power = 0;
  			ch->max_power = channel->max_power * 2;
  			ch->max_reg_power = channel->max_reg_power * 2;
diff --git a/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch b/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
index fbb6fad660a6..ace2fd548155 100644
--- a/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
+++ b/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
@@ -28,7 +28,7 @@ Forwarded: no
 
 --- a/drivers/net/wireless/ath/ath10k/mac.c
 +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -1011,6 +1011,40 @@ static inline int ath10k_vdev_setup_sync
+@@ -1006,6 +1006,40 @@ static inline int ath10k_vdev_setup_sync
  	return ar->last_wmi_vdev_start_status;
  }
  
@@ -69,7 +69,7 @@ Forwarded: no
  static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
  {
  	struct cfg80211_chan_def *chandef = NULL;
-@@ -1043,7 +1077,8 @@ static int ath10k_monitor_vdev_start(str
+@@ -1038,7 +1072,8 @@ static int ath10k_monitor_vdev_start(str
  	arg.channel.min_power = 0;
  	arg.channel.max_power = channel->max_power * 2;
  	arg.channel.max_reg_power = channel->max_reg_power * 2;
@@ -79,7 +79,7 @@ Forwarded: no
  
  	reinit_completion(&ar->vdev_setup_done);
  	reinit_completion(&ar->vdev_delete_done);
-@@ -1489,7 +1524,8 @@ static int ath10k_vdev_start_restart(str
+@@ -1484,7 +1519,8 @@ static int ath10k_vdev_start_restart(str
  	arg.channel.min_power = 0;
  	arg.channel.max_power = chandef->chan->max_power * 2;
  	arg.channel.max_reg_power = chandef->chan->max_reg_power * 2;
@@ -89,7 +89,7 @@ Forwarded: no
  
  	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
  		arg.ssid = arvif->u.ap.ssid;
-@@ -3194,7 +3230,8 @@ static int ath10k_update_channel_list(st
+@@ -3189,7 +3225,8 @@ static int ath10k_update_channel_list(st
  			ch->min_power = 0;
  			ch->max_power = channel->max_power * 2;
  			ch->max_reg_power = channel->max_reg_power * 2;
diff --git a/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch
index 1b965087d3e2..c18a5bfa4af5 100644
--- a/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch
+++ b/package/kernel/mac80211/patches/brcm/860-brcmfmac-register-wiphy-s-during-module_init.patch
@@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1551,6 +1551,7 @@ int __init brcmf_core_init(void)
+@@ -1554,6 +1554,7 @@ int __init brcmf_core_init(void)
  {
  	if (!schedule_work(&brcmf_driver_work))
  		return -EBUSY;
diff --git a/package/kernel/mac80211/patches/brcm/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/brcm/862-brcmfmac-Disable-power-management.patch
index 91bf464ede55..bf8343790d86 100644
--- a/package/kernel/mac80211/patches/brcm/862-brcmfmac-Disable-power-management.patch
+++ b/package/kernel/mac80211/patches/brcm/862-brcmfmac-Disable-power-management.patch
@@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2955,6 +2955,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
+@@ -2956,6 +2956,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
  	 * preference in cfg struct to apply this to
  	 * FW later while initializing the dongle
  	 */
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 2613171a86ec..9658bda1c178 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@milecki.pl>
  void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
  		    struct brcmf_mp_device *settings)
  {
-@@ -30,6 +60,8 @@ void brcmf_of_probe(struct device *dev,
+@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
  		of_node_put(root);
  	}
  
diff --git a/package/kernel/mac80211/patches/brcm/998-survey.patch b/package/kernel/mac80211/patches/brcm/998-survey.patch
index 7feca97e9fed..1c5255cce06a 100644
--- a/package/kernel/mac80211/patches/brcm/998-survey.patch
+++ b/package/kernel/mac80211/patches/brcm/998-survey.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2907,6 +2907,63 @@ done:
+@@ -2908,6 +2908,63 @@ done:
  }
  
  static int
@@ -64,7 +64,7 @@
  brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
  			    int idx, u8 *mac, struct station_info *sinfo)
  {
-@@ -3002,6 +3059,7 @@ static s32 brcmf_inform_single_bss(struc
+@@ -3003,6 +3060,7 @@ static s32 brcmf_inform_single_bss(struc
  	struct brcmu_chan ch;
  	u16 channel;
  	u32 freq;
@@ -72,7 +72,7 @@
  	u16 notify_capability;
  	u16 notify_interval;
  	u8 *notify_ie;
-@@ -3026,6 +3084,17 @@ static s32 brcmf_inform_single_bss(struc
+@@ -3027,6 +3085,17 @@ static s32 brcmf_inform_single_bss(struc
  		band = NL80211_BAND_5GHZ;
  
  	freq = ieee80211_channel_to_frequency(channel, band);
@@ -90,7 +90,7 @@
  	bss_data.chan = ieee80211_get_channel(wiphy, freq);
  	bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
  	bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
-@@ -5478,6 +5547,7 @@ static struct cfg80211_ops brcmf_cfg8021
+@@ -5481,6 +5550,7 @@ static struct cfg80211_ops brcmf_cfg8021
  	.leave_ibss = brcmf_cfg80211_leave_ibss,
  	.get_station = brcmf_cfg80211_get_station,
  	.dump_station = brcmf_cfg80211_dump_station,
@@ -100,7 +100,7 @@
  	.add_key = brcmf_cfg80211_add_key,
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1349,6 +1349,8 @@ int brcmf_attach(struct device *dev)
+@@ -1352,6 +1352,8 @@ int brcmf_attach(struct device *dev)
  
  	/* Link to bus module */
  	drvr->hdrlen = 0;
@@ -109,7 +109,7 @@
  
  	/* Attach and link in the protocol */
  	ret = brcmf_proto_attach(drvr);
-@@ -1431,6 +1433,12 @@ void brcmf_detach(struct device *dev)
+@@ -1434,6 +1436,12 @@ void brcmf_detach(struct device *dev)
  	if (drvr == NULL)
  		return;
  
diff --git a/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch b/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch
index 68db4f72d379..f80fda43605f 100644
--- a/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch
+++ b/package/kernel/mac80211/patches/build/015-ipw200-mtu.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
 +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
-@@ -11470,6 +11470,15 @@ static const struct attribute_group ipw_
+@@ -11472,6 +11472,15 @@ static const struct attribute_group ipw_
  	.attrs = ipw_sysfs_entries,
  };
  
@@ -16,7 +16,7 @@
  #ifdef CPTCFG_IPW2200_PROMISCUOUS
  static int ipw_prom_open(struct net_device *dev)
  {
-@@ -11518,15 +11527,6 @@ static netdev_tx_t ipw_prom_hard_start_x
+@@ -11520,15 +11529,6 @@ static netdev_tx_t ipw_prom_hard_start_x
  	return NETDEV_TX_OK;
  }
  
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
index c00ab7c78644..1958ddad7d60 100644
--- a/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch
+++ b/package/kernel/mac80211/patches/build/060-no_local_ssb_bcma.patch
@@ -1,6 +1,6 @@
 --- a/local-symbols
 +++ b/local-symbols
-@@ -424,43 +424,6 @@ USB_SIERRA_NET=
+@@ -435,43 +435,6 @@ USB_SIERRA_NET=
  USB_VL600=
  USB_NET_CH9200=
  USB_NET_AQC111=
@@ -160,8 +160,8 @@
  	gpiodev = bus->chipco.dev ? : pcidev;
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/led.h
-@@ -22,7 +22,7 @@ struct brcms_led {
- 	bool active_low;
+@@ -24,7 +24,7 @@ struct brcms_led {
+ 	struct gpio_desc *gpiod;
  };
  
 -#ifdef CPTCFG_BCMA_DRIVER_GPIO
@@ -192,7 +192,7 @@
  	select BRCMUTIL
 --- a/Kconfig.local
 +++ b/Kconfig.local
-@@ -1276,117 +1276,6 @@ config BACKPORTED_USB_NET_CH9200
+@@ -1309,117 +1309,6 @@ config BACKPORTED_USB_NET_CH9200
  config BACKPORTED_USB_NET_AQC111
  	tristate
  	default USB_NET_AQC111
diff --git a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
index da76b34fab36..b6934d39548b 100644
--- a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
+++ b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch
@@ -1,6 +1,6 @@
 --- a/local-symbols
 +++ b/local-symbols
-@@ -321,6 +321,7 @@ RT2X00_LIB_FIRMWARE=
+@@ -330,6 +330,7 @@ RT2X00_LIB_FIRMWARE=
  RT2X00_LIB_CRYPTO=
  RT2X00_LIB_LEDS=
  RT2X00_LIB_DEBUGFS=
diff --git a/package/kernel/mac80211/patches/subsys/070-backports-add-netif_receive_skb_list.patch b/package/kernel/mac80211/patches/subsys/070-backports-add-netif_receive_skb_list.patch
deleted file mode 100644
index b26a6bc38988..000000000000
--- a/package/kernel/mac80211/patches/subsys/070-backports-add-netif_receive_skb_list.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 14 Aug 2020 16:13:45 +0200
-Subject: [PATCH] backports: add netif_receive_skb_list
-
-It will be needed by pending mac80211 changes
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/backport-include/linux/netdevice.h
-+++ b/backport-include/linux/netdevice.h
-@@ -372,6 +372,18 @@ static inline int _bp_netdev_upper_dev_l
- 	macro_dispatcher(netdev_upper_dev_link, __VA_ARGS__)(__VA_ARGS__)
- #endif
- 
-+#if LINUX_VERSION_IS_LESS(4,19,0)
-+static inline void netif_receive_skb_list(struct list_head *head)
-+{
-+	struct sk_buff *skb, *next;
-+
-+	list_for_each_entry_safe(skb, next, head, list) {
-+		skb_list_del_init(skb);
-+		netif_receive_skb(skb);
-+	}
-+}
-+#endif
-+
- #if LINUX_VERSION_IS_LESS(5,0,0)
- static inline int backport_dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
- {
diff --git a/package/kernel/mac80211/patches/subsys/071-backports-add-skb_list_del_init.patch b/package/kernel/mac80211/patches/subsys/071-backports-add-skb_list_del_init.patch
deleted file mode 100644
index ee7e63498a11..000000000000
--- a/package/kernel/mac80211/patches/subsys/071-backports-add-skb_list_del_init.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 14 Aug 2020 16:13:55 +0200
-Subject: [PATCH] backports: add skb_list_del_init
-
-It will be needed by pending mac80211 changes
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/backport-include/linux/skbuff.h
-+++ b/backport-include/linux/skbuff.h
-@@ -384,6 +384,12 @@ static inline void skb_mark_not_on_list(
- {
- 	skb->next = NULL;
- }
-+
-+static inline void skb_list_del_init(struct sk_buff *skb)
-+{
-+	__list_del_entry(&skb->list);
-+	skb_mark_not_on_list(skb);
-+}
- #endif /* 4.19.10 <= x < 4.20 */
- #endif
- 
diff --git a/package/kernel/mac80211/patches/subsys/072-backports-add-sched_set_fifo_low.patch b/package/kernel/mac80211/patches/subsys/072-backports-add-sched_set_fifo_low.patch
deleted file mode 100644
index 9b266ffcb3ee..000000000000
--- a/package/kernel/mac80211/patches/subsys/072-backports-add-sched_set_fifo_low.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 28 Sep 2020 08:35:28 +0200
-Subject: [PATCH] backports: add sched_set_fifo_low
-
-It is needed for mt76
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- create mode 100644 backport/backport-include/linux/sched.h
-
---- /dev/null
-+++ b/backport-include/linux/sched.h
-@@ -0,0 +1,19 @@
-+#ifndef __BACKPORT_LINUX_SCHED_H
-+#define __BACKPORT_LINUX_SCHED_H
-+
-+#include_next <linux/sched.h>
-+#include <linux/version.h>
-+
-+#if LINUX_VERSION_IS_LESS(5,9,0)
-+#include <uapi/linux/sched/types.h>
-+
-+static inline void sched_set_fifo_low(struct task_struct *p)
-+{
-+	struct sched_param sparam = {.sched_priority = 1};
-+
-+	sched_setscheduler(p, SCHED_FIFO, &sparam);
-+}
-+
-+#endif
-+
-+#endif
diff --git a/package/kernel/mac80211/patches/subsys/073-backports-backport-tasklet_setup-from_tasklet.patch b/package/kernel/mac80211/patches/subsys/073-backports-backport-tasklet_setup-from_tasklet.patch
deleted file mode 100644
index 486d10ea58f8..000000000000
--- a/package/kernel/mac80211/patches/subsys/073-backports-backport-tasklet_setup-from_tasklet.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 11 Nov 2020 13:34:26 +0100
-Subject: [PATCH] backports: backport tasklet_setup, from_tasklet
-
-Backport the new tasklet API
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/backport-include/linux/interrupt.h
-+++ b/backport-include/linux/interrupt.h
-@@ -31,6 +31,23 @@ static inline void backport_hrtimer_star
- 	hrtimer_start(timer, _time, mode);
- }
- #define hrtimer_start LINUX_BACKPORT(hrtimer_start)
-+
-+#endif
-+
-+#if LINUX_VERSION_IS_LESS(5,9,0)
-+
-+static inline void
-+tasklet_setup(struct tasklet_struct *t,
-+	      void (*callback)(struct tasklet_struct *))
-+{
-+	void (*cb)(unsigned long data) = (void *)callback;
-+
-+	tasklet_init(t, cb, (unsigned long)t);
-+}
-+
-+#define from_tasklet(var, callback_tasklet, tasklet_fieldname) \
-+	container_of(callback_tasklet, typeof(*var), tasklet_fieldname)
-+
- #endif
- 
- #endif /* _BP_LINUX_INTERRUPT_H */
diff --git a/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch
index a94f9d8fdb6e..3c699dc648e6 100644
--- a/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch
+++ b/package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch
@@ -64,7 +64,7 @@
 -	aead_request_set_ad(aead_req, sg[0].length);
 -
 -	crypto_aead_encrypt(aead_req);
--	kzfree(aead_req);
+-	kfree_sensitive(aead_req);
 -
 -	return 0;
 -}
@@ -99,7 +99,7 @@
 -	aead_request_set_ad(aead_req, sg[0].length);
 -
 -	err = crypto_aead_decrypt(aead_req);
--	kzfree(aead_req);
+-	kfree_sensitive(aead_req);
 -
 -	return err;
 -}
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 2333ca2dad0e..0033837ce745 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
@@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1198,7 +1198,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1200,7 +1200,6 @@ static int ieee80211_stop_ap(struct wiph
  	sdata->vif.bss_conf.ftmr_params = NULL;
  
  	__sta_info_flush(sdata, true);
diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
index fccb1ebffabf..c7da15fffc5a 100644
--- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
+++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
@@ -1,6 +1,6 @@
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2346,7 +2346,7 @@ static int ieee80211_scan(struct wiphy *
+@@ -2353,7 +2353,7 @@ static int ieee80211_scan(struct wiphy *
  		 * the  frames sent while scanning on other channel will be
  		 * lost)
  		 */
diff --git a/package/kernel/mac80211/patches/subsys/300-mac80211-optimize-skb-resizing.patch b/package/kernel/mac80211/patches/subsys/300-mac80211-optimize-skb-resizing.patch
index cb70670e5288..22c3e80a5efb 100644
--- a/package/kernel/mac80211/patches/subsys/300-mac80211-optimize-skb-resizing.patch
+++ b/package/kernel/mac80211/patches/subsys/300-mac80211-optimize-skb-resizing.patch
@@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1809,6 +1809,9 @@ int ieee80211_tx_control_port(struct wip
+@@ -1812,6 +1812,9 @@ int ieee80211_tx_control_port(struct wip
  			      u64 *cookie);
  int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
  			      const u8 *buf, size_t len);
@@ -36,7 +36,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -846,6 +846,11 @@ void ieee80211_tx_monitor(struct ieee802
+@@ -844,6 +844,11 @@ void ieee80211_tx_monitor(struct ieee802
  	struct net_device *prev_dev = NULL;
  	int rtap_len;
  
@@ -50,33 +50,39 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) {
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -1937,37 +1937,53 @@ static bool ieee80211_tx(struct ieee8021
+@@ -1937,42 +1937,53 @@ static bool ieee80211_tx(struct ieee8021
  }
  
  /* device xmit handlers */
 -
+-enum ieee80211_encrypt {
+-	ENCRYPT_NO,
+-	ENCRYPT_MGMT,
+-	ENCRYPT_DATA,
+-};
+-
 -static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
 -				struct sk_buff *skb,
--				int head_need, bool may_encrypt)
+-				int head_need,
+-				enum ieee80211_encrypt encrypt)
 +int ieee80211_skb_resize(struct ieee80211_local *local,
 +			 struct ieee80211_sub_if_data *sdata,
 +			 struct sk_buff *skb, int hdr_len, int hdr_extra)
  {
 -	struct ieee80211_local *local = sdata->local;
-+	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- 	struct ieee80211_hdr *hdr;
 -	bool enc_tailroom;
 -	int tail_need = 0;
 -
--	hdr = (struct ieee80211_hdr *) skb->data;
--	enc_tailroom = may_encrypt &&
--		       (sdata->crypto_tx_tailroom_needed_cnt ||
--			ieee80211_is_mgmt(hdr->frame_control));
+-	enc_tailroom = encrypt == ENCRYPT_MGMT ||
+-		       (encrypt == ENCRYPT_DATA &&
+-			sdata->crypto_tx_tailroom_needed_cnt);
 -
 -	if (enc_tailroom) {
 -		tail_need = IEEE80211_ENCRYPT_TAILROOM;
 -		tail_need -= skb_tailroom(skb);
 -		tail_need = max_t(int, tail_need, 0);
++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++	struct ieee80211_hdr *hdr;
 +	int head_need, head_max;
 +	int tail_need, tail_max;
 +	bool enc_tailroom = false;
@@ -123,33 +129,39 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		wiphy_debug(local->hw.wiphy,
  			    "failed to reallocate TX buffer\n");
  		return -ENOMEM;
-@@ -1983,18 +1999,8 @@ void ieee80211_xmit(struct ieee80211_sub
+@@ -1986,24 +1997,9 @@ void ieee80211_xmit(struct ieee80211_sub
+ {
  	struct ieee80211_local *local = sdata->local;
  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- 	struct ieee80211_hdr *hdr;
+-	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 -	int headroom;
--	bool may_encrypt;
+-	enum ieee80211_encrypt encrypt;
+-
+-	if (info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)
+-		encrypt = ENCRYPT_NO;
+-	else if (ieee80211_is_mgmt(hdr->frame_control))
+-		encrypt = ENCRYPT_MGMT;
+-	else
+-		encrypt = ENCRYPT_DATA;
 -
--	may_encrypt = !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT);
- 
 -	headroom = local->tx_headroom;
--	if (may_encrypt)
+-	if (encrypt != ENCRYPT_NO)
 -		headroom += sdata->encrypt_headroom;
 -	headroom -= skb_headroom(skb);
 -	headroom = max_t(int, 0, headroom);
--
--	if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) {
++	struct ieee80211_hdr *hdr;
+ 
+-	if (ieee80211_skb_resize(sdata, skb, headroom, encrypt)) {
 +	if (ieee80211_skb_resize(local, sdata, skb, 0, 0)) {
  		ieee80211_free_txskb(&local->hw, skb);
  		return;
  	}
-@@ -2809,29 +2815,13 @@ static struct sk_buff *ieee80211_build_h
+@@ -2815,29 +2811,13 @@ static struct sk_buff *ieee80211_build_h
  	}
  
  	skb_pull(skb, skip_header_bytes);
 -	head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb);
-+	head_need = hdrlen + encaps_len + meshhdrlen;
- 
+-
 -	/*
 -	 * So we need to modify the skb header and hence need a copy of
 -	 * that. The head_need variable above doesn't, so far, include
@@ -161,12 +173,13 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -	 * the ever needed space. Also, if we need to reallocate it anyway,
 -	 * make it big enough for everything we may ever need.
 -	 */
--
++	head_need = hdrlen + encaps_len + meshhdrlen;
+ 
 -	if (head_need > 0 || skb_cloned(skb)) {
 -		head_need += sdata->encrypt_headroom;
 -		head_need += local->tx_headroom;
 -		head_need = max_t(int, 0, head_need);
--		if (ieee80211_skb_resize(sdata, skb, head_need, true)) {
+-		if (ieee80211_skb_resize(sdata, skb, head_need, ENCRYPT_DATA)) {
 -			ieee80211_free_txskb(&local->hw, skb);
 -			skb = NULL;
 -			return ERR_PTR(-ENOMEM);
@@ -179,7 +192,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	}
  
  	if (encaps_data)
-@@ -3446,7 +3436,6 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3452,7 +3432,6 @@ static bool ieee80211_xmit_fast(struct i
  	struct ieee80211_local *local = sdata->local;
  	u16 ethertype = (skb->data[12] << 8) | skb->data[13];
  	int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
@@ -187,14 +200,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	struct ethhdr eth;
  	struct ieee80211_tx_info *info;
  	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-@@ -3498,10 +3487,7 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3504,10 +3483,7 @@ static bool ieee80211_xmit_fast(struct i
  	 * as the may-encrypt argument for the resize to not account for
  	 * more room than we already have in 'extra_head'
  	 */
 -	if (unlikely(ieee80211_skb_resize(sdata, skb,
 -					  max_t(int, extra_head + hw_headroom -
 -						     skb_headroom(skb), 0),
--					  false))) {
+-					  ENCRYPT_NO))) {
 +	if (unlikely(ieee80211_skb_resize(local, sdata, skb, extra_head, 0))) {
  		kfree_skb(skb);
  		return true;
diff --git a/package/kernel/mac80211/patches/subsys/304-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch b/package/kernel/mac80211/patches/subsys/304-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
index 10d8ad8d716f..d09d70725e55 100644
--- a/package/kernel/mac80211/patches/subsys/304-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
+++ b/package/kernel/mac80211/patches/subsys/304-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
@@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
 
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -339,6 +339,7 @@ struct sta_info *sta_info_alloc(struct i
+@@ -357,6 +357,7 @@ struct sta_info *sta_info_alloc(struct i
  	INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
  	INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
  	mutex_init(&sta->ampdu_mlme.mtx);
diff --git a/package/kernel/mac80211/patches/subsys/305-mac80211-improve-AQL-tx-airtime-estimation.patch b/package/kernel/mac80211/patches/subsys/305-mac80211-improve-AQL-tx-airtime-estimation.patch
deleted file mode 100644
index bee43a60fa6d..000000000000
--- a/package/kernel/mac80211/patches/subsys/305-mac80211-improve-AQL-tx-airtime-estimation.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 24 Jul 2020 20:25:07 +0200
-Subject: [PATCH] mac80211: improve AQL tx airtime estimation
-
-AQL does not take into account that most HT/VHT/HE traffic is A-MPDU aggregated.
-Because of that, the per-packet airtime overhead is vastly overestimated.
-Improve it by assuming an average aggregation length of 16 for non-legacy
-traffic if not using the VO AC queue.
-This should improve performance with high data rates, especially with multiple
-stations
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -551,7 +551,7 @@ EXPORT_SYMBOL_GPL(ieee80211_calc_tx_airt
- u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
- 				       struct ieee80211_vif *vif,
- 				       struct ieee80211_sta *pubsta,
--				       int len)
-+				       int len, bool ampdu)
- {
- 	struct ieee80211_supported_band *sband;
- 	struct ieee80211_chanctx_conf *conf;
-@@ -572,10 +572,26 @@ u32 ieee80211_calc_expected_tx_airtime(s
- 	if (pubsta) {
- 		struct sta_info *sta = container_of(pubsta, struct sta_info,
- 						    sta);
-+		struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
-+		u32 airtime;
- 
--		return ieee80211_calc_tx_airtime_rate(hw,
--						      &sta->tx_stats.last_rate,
--						      band, len);
-+		if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
-+				     IEEE80211_TX_RC_MCS)))
-+			ampdu = false;
-+
-+		/*
-+		 * Assume that HT/VHT transmission on any AC except VO will
-+		 * use aggregation. Since we don't have reliable reporting
-+		 * of aggregation length, assume an average of 16.
-+		 * This will not be very accurate, but much better than simply
-+		 * assuming un-aggregated tx.
-+		 */
-+		airtime = ieee80211_calc_tx_airtime_rate(hw, rate, band,
-+							 ampdu ? len * 16 : len);
-+		if (ampdu)
-+			airtime /= 16;
-+
-+		return airtime;
- 	}
- 
- 	if (!conf)
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2294,7 +2294,7 @@ extern const struct ethtool_ops ieee8021
- u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
- 				       struct ieee80211_vif *vif,
- 				       struct ieee80211_sta *pubsta,
--				       int len);
-+				       int len, bool ampdu);
- #ifdef CPTCFG_MAC80211_NOINLINE
- #define debug_noinline noinline
- #else
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -3707,10 +3707,11 @@ encap_out:
- 
- 	if (vif &&
- 	    wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL)) {
-+		bool ampdu = txq->ac != IEEE80211_AC_VO;
- 		u32 airtime;
- 
- 		airtime = ieee80211_calc_expected_tx_airtime(hw, vif, txq->sta,
--							     skb->len);
-+							     skb->len, ampdu);
- 		if (airtime) {
- 			airtime = ieee80211_info_set_tx_time_est(info, airtime);
- 			ieee80211_sta_update_pending_airtime(local, tx.sta,
diff --git a/package/kernel/mac80211/patches/subsys/307-mac80211-add-a-function-for-running-rx-without-passi.patch b/package/kernel/mac80211/patches/subsys/307-mac80211-add-a-function-for-running-rx-without-passi.patch
deleted file mode 100644
index 802d57497cc9..000000000000
--- a/package/kernel/mac80211/patches/subsys/307-mac80211-add-a-function-for-running-rx-without-passi.patch
+++ /dev/null
@@ -1,186 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 25 Jul 2020 20:53:23 +0200
-Subject: [PATCH] mac80211: add a function for running rx without passing skbs
- to the stack
-
-This can be used to run mac80211 rx processing on a batch of frames in NAPI
-poll before passing them to the network stack in a large batch.
-This can improve icache footprint, or it can be used to pass frames via
-netif_receive_skb_list.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -4358,6 +4358,31 @@ void ieee80211_free_hw(struct ieee80211_
- void ieee80211_restart_hw(struct ieee80211_hw *hw);
- 
- /**
-+ * ieee80211_rx_list - receive frame and store processed skbs in a list
-+ *
-+ * Use this function to hand received frames to mac80211. The receive
-+ * buffer in @skb must start with an IEEE 802.11 header. In case of a
-+ * paged @skb is used, the driver is recommended to put the ieee80211
-+ * header of the frame on the linear part of the @skb to avoid memory
-+ * allocation and/or memcpy by the stack.
-+ *
-+ * This function may not be called in IRQ context. Calls to this function
-+ * for a single hardware must be synchronized against each other. Calls to
-+ * this function, ieee80211_rx_ni() and ieee80211_rx_irqsafe() may not be
-+ * mixed for a single hardware. Must not run concurrently with
-+ * ieee80211_tx_status() or ieee80211_tx_status_ni().
-+ *
-+ * This function must be called with BHs disabled and RCU read lock
-+ *
-+ * @hw: the hardware this frame came in on
-+ * @sta: the station the frame was received from, or %NULL
-+ * @skb: the buffer to receive, owned by mac80211 after this call
-+ * @list: the destination list
-+ */
-+void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
-+		       struct sk_buff *skb, struct list_head *list);
-+
-+/**
-  * ieee80211_rx_napi - receive frame from NAPI context
-  *
-  * Use this function to hand received frames to mac80211. The receive
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -218,7 +218,7 @@ enum ieee80211_rx_flags {
- };
- 
- struct ieee80211_rx_data {
--	struct napi_struct *napi;
-+	struct list_head *list;
- 	struct sk_buff *skb;
- 	struct ieee80211_local *local;
- 	struct ieee80211_sub_if_data *sdata;
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2579,8 +2579,8 @@ static void ieee80211_deliver_skb_to_loc
- 		memset(skb->cb, 0, sizeof(skb->cb));
- 
- 		/* deliver to local stack */
--		if (rx->napi)
--			napi_gro_receive(rx->napi, skb);
-+		if (rx->list)
-+			list_add_tail(&skb->list, rx->list);
- 		else
- 			netif_receive_skb(skb);
- 	}
-@@ -3870,7 +3870,6 @@ void ieee80211_release_reorder_timeout(s
- 		/* This is OK -- must be QoS data frame */
- 		.security_idx = tid,
- 		.seqno_idx = tid,
--		.napi = NULL, /* must be NULL to not have races */
- 	};
- 	struct tid_ampdu_rx *tid_agg_rx;
- 
-@@ -4480,8 +4479,8 @@ static bool ieee80211_invoke_fast_rx(str
- 	/* deliver to local stack */
- 	skb->protocol = eth_type_trans(skb, fast_rx->dev);
- 	memset(skb->cb, 0, sizeof(skb->cb));
--	if (rx->napi)
--		napi_gro_receive(rx->napi, skb);
-+	if (rx->list)
-+		list_add_tail(&skb->list, rx->list);
- 	else
- 		netif_receive_skb(skb);
- 
-@@ -4548,7 +4547,7 @@ static bool ieee80211_prepare_and_rx_han
- static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
- 					 struct ieee80211_sta *pubsta,
- 					 struct sk_buff *skb,
--					 struct napi_struct *napi)
-+					 struct list_head *list)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
- 	struct ieee80211_sub_if_data *sdata;
-@@ -4563,7 +4562,7 @@ static void __ieee80211_rx_handle_packet
- 	memset(&rx, 0, sizeof(rx));
- 	rx.skb = skb;
- 	rx.local = local;
--	rx.napi = napi;
-+	rx.list = list;
- 
- 	if (ieee80211_is_data(fc) || ieee80211_is_mgmt(fc))
- 		I802_DEBUG_INC(local->dot11ReceivedFragmentCount);
-@@ -4671,8 +4670,8 @@ static void __ieee80211_rx_handle_packet
-  * This is the receive path handler. It is called by a low level driver when an
-  * 802.11 MPDU is received from the hardware.
-  */
--void ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
--		       struct sk_buff *skb, struct napi_struct *napi)
-+void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
-+		       struct sk_buff *skb, struct list_head *list)
- {
- 	struct ieee80211_local *local = hw_to_local(hw);
- 	struct ieee80211_rate *rate = NULL;
-@@ -4764,36 +4763,53 @@ void ieee80211_rx_napi(struct ieee80211_
- 	status->rx_flags = 0;
- 
- 	/*
--	 * key references and virtual interfaces are protected using RCU
--	 * and this requires that we are in a read-side RCU section during
--	 * receive processing
--	 */
--	rcu_read_lock();
--
--	/*
- 	 * Frames with failed FCS/PLCP checksum are not returned,
- 	 * all other frames are returned without radiotap header
- 	 * if it was previously present.
- 	 * Also, frames with less than 16 bytes are dropped.
- 	 */
- 	skb = ieee80211_rx_monitor(local, skb, rate);
--	if (!skb) {
--		rcu_read_unlock();
-+	if (!skb)
- 		return;
--	}
- 
- 	ieee80211_tpt_led_trig_rx(local,
- 			((struct ieee80211_hdr *)skb->data)->frame_control,
- 			skb->len);
- 
--	__ieee80211_rx_handle_packet(hw, pubsta, skb, napi);
--
--	rcu_read_unlock();
-+	__ieee80211_rx_handle_packet(hw, pubsta, skb, list);
- 
- 	return;
-  drop:
- 	kfree_skb(skb);
- }
-+EXPORT_SYMBOL(ieee80211_rx_list);
-+
-+void ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
-+		       struct sk_buff *skb, struct napi_struct *napi)
-+{
-+	struct sk_buff *tmp;
-+	LIST_HEAD(list);
-+
-+
-+	/*
-+	 * key references and virtual interfaces are protected using RCU
-+	 * and this requires that we are in a read-side RCU section during
-+	 * receive processing
-+	 */
-+	rcu_read_lock();
-+	ieee80211_rx_list(hw, pubsta, skb, &list);
-+	rcu_read_unlock();
-+
-+	if (!napi) {
-+		netif_receive_skb_list(&list);
-+		return;
-+	}
-+
-+	list_for_each_entry_safe(skb, tmp, &list, list) {
-+		skb_list_del_init(skb);
-+		napi_gro_receive(napi, skb);
-+	}
-+}
- EXPORT_SYMBOL(ieee80211_rx_napi);
- 
- /* This is a version of the rx handler that can be called from hard irq
diff --git a/package/kernel/mac80211/patches/subsys/308-net-fq_impl-use-skb_get_hash-instead-of-skb_get_hash.patch b/package/kernel/mac80211/patches/subsys/308-net-fq_impl-use-skb_get_hash-instead-of-skb_get_hash.patch
deleted file mode 100644
index 77ecc82302f8..000000000000
--- a/package/kernel/mac80211/patches/subsys/308-net-fq_impl-use-skb_get_hash-instead-of-skb_get_hash.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 26 Jul 2020 14:37:02 +0200
-Subject: [PATCH] net/fq_impl: use skb_get_hash instead of
- skb_get_hash_perturb
-
-This avoids unnecessary regenerating of the skb flow hash
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/fq.h
-+++ b/include/net/fq.h
-@@ -69,15 +69,6 @@ struct fq {
- 	struct list_head backlogs;
- 	spinlock_t lock;
- 	u32 flows_cnt;
--#if LINUX_VERSION_IS_GEQ(5,3,10) || \
--    LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \
--    LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \
--    LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \
--    LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0)
--	siphash_key_t	perturbation;
--#else
--	u32 perturbation;
--#endif
- 	u32 limit;
- 	u32 memory_limit;
- 	u32 memory_usage;
---- a/include/net/fq_impl.h
-+++ b/include/net/fq_impl.h
-@@ -108,15 +108,7 @@ begin:
- 
- static u32 fq_flow_idx(struct fq *fq, struct sk_buff *skb)
- {
--#if LINUX_VERSION_IS_GEQ(5,3,10) || \
--    LINUX_VERSION_IN_RANGE(4,19,83, 4,20,0) || \
--    LINUX_VERSION_IN_RANGE(4,14,153, 4,15,0) || \
--    LINUX_VERSION_IN_RANGE(4,9,200, 4,10,0) || \
--    LINUX_VERSION_IN_RANGE(4,4,200, 4,5,0)
--	u32 hash = skb_get_hash_perturb(skb, &fq->perturbation);
--#else
--	u32 hash = skb_get_hash_perturb(skb, fq->perturbation);
--#endif
-+	u32 hash = skb_get_hash(skb);
- 
- 	return reciprocal_scale(hash, fq->flows_cnt);
- }
-@@ -316,7 +308,6 @@ static int fq_init(struct fq *fq, int fl
- 	INIT_LIST_HEAD(&fq->backlogs);
- 	spin_lock_init(&fq->lock);
- 	fq->flows_cnt = max_t(u32, flows_cnt, 1);
--	get_random_bytes(&fq->perturbation, sizeof(fq->perturbation));
- 	fq->quantum = 300;
- 	fq->limit = 8192;
- 	fq->memory_limit = 16 << 20; /* 16 MBytes */
diff --git a/package/kernel/mac80211/patches/subsys/309-mac80211-calculcate-skb-hash-early-when-using-itxq.patch b/package/kernel/mac80211/patches/subsys/309-mac80211-calculcate-skb-hash-early-when-using-itxq.patch
deleted file mode 100644
index 92b136279a58..000000000000
--- a/package/kernel/mac80211/patches/subsys/309-mac80211-calculcate-skb-hash-early-when-using-itxq.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 26 Jul 2020 14:42:58 +0200
-Subject: [PATCH] mac80211: calculcate skb hash early when using itxq
-
-This avoids flow separation issues when using software encryption
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -3937,6 +3937,7 @@ void __ieee80211_subif_start_xmit(struct
- 	if (local->ops->wake_tx_queue) {
- 		u16 queue = __ieee80211_select_queue(sdata, sta, skb);
- 		skb_set_queue_mapping(skb, queue);
-+		skb_get_hash(skb);
- 	}
- 
- 	if (sta) {
diff --git a/package/kernel/mac80211/patches/subsys/311-mac80211-use-rate-provided-via-status-rate-on-ieee80.patch b/package/kernel/mac80211/patches/subsys/311-mac80211-use-rate-provided-via-status-rate-on-ieee80.patch
deleted file mode 100644
index ee1db716e0fa..000000000000
--- a/package/kernel/mac80211/patches/subsys/311-mac80211-use-rate-provided-via-status-rate-on-ieee80.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 12 Aug 2020 17:04:22 +0200
-Subject: [PATCH] mac80211: use rate provided via status->rate on
- ieee80211_tx_status_ext for AQL
-
-Since ieee80211_tx_info does not have enough room to encode HE rates, HE
-drivers use status->rate to provide rate info.
-Store it in struct sta_info and use it for AQL.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -487,14 +487,61 @@ u32 ieee80211_calc_rx_airtime(struct iee
- }
- EXPORT_SYMBOL_GPL(ieee80211_calc_rx_airtime);
- 
-+static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
-+				     struct ieee80211_rx_status *stat, u8 band,
-+				     struct rate_info *ri)
-+{
-+	struct ieee80211_supported_band *sband = hw->wiphy->bands[band];
-+	int i;
-+
-+	if (!ri || !sband)
-+	    return false;
-+
-+	stat->bw = ri->bw;
-+	stat->nss = ri->nss;
-+	stat->rate_idx = ri->mcs;
-+
-+	if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
-+		stat->encoding = RX_ENC_HE;
-+	else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
-+		stat->encoding = RX_ENC_VHT;
-+	else if (ri->flags & RATE_INFO_FLAGS_MCS)
-+		stat->encoding = RX_ENC_HT;
-+	else
-+		stat->encoding = RX_ENC_LEGACY;
-+
-+	if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
-+		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
-+
-+	stat->he_gi = ri->he_gi;
-+
-+	if (stat->encoding != RX_ENC_LEGACY)
-+		return true;
-+
-+	stat->rate_idx = 0;
-+	for (i = 0; i < sband->n_bitrates; i++) {
-+		if (ri->legacy != sband->bitrates[i].bitrate)
-+			continue;
-+
-+		stat->rate_idx = i;
-+		return true;
-+	}
-+
-+	return false;
-+}
-+
- static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
- 					  struct ieee80211_tx_rate *rate,
-+					  struct rate_info *ri,
- 					  u8 band, int len)
- {
- 	struct ieee80211_rx_status stat = {
- 		.band = band,
- 	};
- 
-+	if (ieee80211_fill_rate_info(hw, &stat, band, ri))
-+		goto out;
-+
- 	if (rate->idx < 0 || !rate->count)
- 		return 0;
- 
-@@ -522,6 +569,7 @@ static u32 ieee80211_calc_tx_airtime_rat
- 		stat.encoding = RX_ENC_LEGACY;
- 	}
- 
-+out:
- 	return ieee80211_calc_rx_airtime(hw, &stat, len);
- }
- 
-@@ -536,7 +584,7 @@ u32 ieee80211_calc_tx_airtime(struct iee
- 		struct ieee80211_tx_rate *rate = &info->status.rates[i];
- 		u32 cur_duration;
- 
--		cur_duration = ieee80211_calc_tx_airtime_rate(hw, rate,
-+		cur_duration = ieee80211_calc_tx_airtime_rate(hw, rate, NULL,
- 							      info->band, len);
- 		if (!cur_duration)
- 			break;
-@@ -573,6 +621,7 @@ u32 ieee80211_calc_expected_tx_airtime(s
- 		struct sta_info *sta = container_of(pubsta, struct sta_info,
- 						    sta);
- 		struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
-+		struct rate_info *ri = &sta->tx_stats.last_rate_info;
- 		u32 airtime;
- 
- 		if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
-@@ -586,7 +635,7 @@ u32 ieee80211_calc_expected_tx_airtime(s
- 		 * This will not be very accurate, but much better than simply
- 		 * assuming un-aggregated tx.
- 		 */
--		airtime = ieee80211_calc_tx_airtime_rate(hw, rate, band,
-+		airtime = ieee80211_calc_tx_airtime_rate(hw, rate, ri, band,
- 							 ampdu ? len * 16 : len);
- 		if (ampdu)
- 			airtime /= 16;
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -609,6 +609,7 @@ struct sta_info {
- 		u64 packets[IEEE80211_NUM_ACS];
- 		u64 bytes[IEEE80211_NUM_ACS];
- 		struct ieee80211_tx_rate last_rate;
-+		struct rate_info last_rate_info;
- 		u64 msdu[IEEE80211_NUM_TIDS + 1];
- 	} tx_stats;
- 	u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1];
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -1147,9 +1147,17 @@ void ieee80211_tx_status_ext(struct ieee
- 	struct ieee80211_tx_info *info = status->info;
- 	struct ieee80211_sta *pubsta = status->sta;
- 	struct ieee80211_supported_band *sband;
-+	struct sta_info *sta;
- 	int retry_count;
- 	bool acked, noack_success;
- 
-+	if (pubsta) {
-+		sta = container_of(pubsta, struct sta_info, sta);
-+
-+		if (status->rate)
-+			sta->tx_stats.last_rate_info = *status->rate;
-+	}
-+
- 	if (status->skb)
- 		return __ieee80211_tx_status(hw, status);
- 
-@@ -1164,10 +1172,6 @@ void ieee80211_tx_status_ext(struct ieee
- 	noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
- 
- 	if (pubsta) {
--		struct sta_info *sta;
--
--		sta = container_of(pubsta, struct sta_info, sta);
--
- 		if (!acked && !noack_success)
- 			sta->status_stats.retry_failed++;
- 		sta->status_stats.retry_count += retry_count;
diff --git a/package/kernel/mac80211/patches/subsys/312-mac80211-factor-out-code-to-look-up-the-average-pack.patch b/package/kernel/mac80211/patches/subsys/312-mac80211-factor-out-code-to-look-up-the-average-pack.patch
deleted file mode 100644
index 06db852c3046..000000000000
--- a/package/kernel/mac80211/patches/subsys/312-mac80211-factor-out-code-to-look-up-the-average-pack.patch
+++ /dev/null
@@ -1,187 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 12 Aug 2020 17:06:12 +0200
-Subject: [PATCH] mac80211: factor out code to look up the average packet
- length duration for a rate
-
-This will be used to enhance AQL estimated aggregation length
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -405,18 +405,14 @@ ieee80211_calc_legacy_rate_duration(u16
- 	return duration;
- }
- 
--u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
--			      struct ieee80211_rx_status *status,
--			      int len)
-+static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
-+				       struct ieee80211_rx_status *status,
-+				       u32 *overhead)
- {
--	struct ieee80211_supported_band *sband;
--	const struct ieee80211_rate *rate;
- 	bool sgi = status->enc_flags & RX_ENC_FLAG_SHORT_GI;
--	bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
- 	int bw, streams;
- 	int group, idx;
- 	u32 duration;
--	bool cck;
- 
- 	switch (status->bw) {
- 	case RATE_INFO_BW_20:
-@@ -437,20 +433,6 @@ u32 ieee80211_calc_rx_airtime(struct iee
- 	}
- 
- 	switch (status->encoding) {
--	case RX_ENC_LEGACY:
--		if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
--			return 0;
--
--		sband = hw->wiphy->bands[status->band];
--		if (!sband || status->rate_idx >= sband->n_bitrates)
--			return 0;
--
--		rate = &sband->bitrates[status->rate_idx];
--		cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
--
--		return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
--							   cck, len);
--
- 	case RX_ENC_VHT:
- 		streams = status->nss;
- 		idx = status->rate_idx;
-@@ -477,13 +459,47 @@ u32 ieee80211_calc_rx_airtime(struct iee
- 
- 	duration = airtime_mcs_groups[group].duration[idx];
- 	duration <<= airtime_mcs_groups[group].shift;
-+	*overhead = 36 + (streams << 2);
-+
-+	return duration;
-+}
-+
-+
-+u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
-+			      struct ieee80211_rx_status *status,
-+			      int len)
-+{
-+	struct ieee80211_supported_band *sband;
-+	u32 duration, overhead = 0;
-+
-+	if (status->encoding == RX_ENC_LEGACY) {
-+		const struct ieee80211_rate *rate;
-+		bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
-+		bool cck;
-+
-+		if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
-+			return 0;
-+
-+		sband = hw->wiphy->bands[status->band];
-+		if (!sband || status->rate_idx >= sband->n_bitrates)
-+			return 0;
-+
-+		rate = &sband->bitrates[status->rate_idx];
-+		cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
-+
-+		return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
-+							   cck, len);
-+	}
-+
-+	duration = ieee80211_get_rate_duration(hw, status, &overhead);
-+	if (!duration)
-+		return 0;
-+
- 	duration *= len;
- 	duration /= AVG_PKT_SIZE;
- 	duration /= 1024;
- 
--	duration += 36 + (streams << 2);
--
--	return duration;
-+	return duration + overhead;
- }
- EXPORT_SYMBOL_GPL(ieee80211_calc_rx_airtime);
- 
-@@ -530,46 +546,57 @@ static bool ieee80211_fill_rate_info(str
- 	return false;
- }
- 
--static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
--					  struct ieee80211_tx_rate *rate,
--					  struct rate_info *ri,
--					  u8 band, int len)
-+static int ieee80211_fill_rx_status(struct ieee80211_rx_status *stat,
-+				    struct ieee80211_hw *hw,
-+				    struct ieee80211_tx_rate *rate,
-+				    struct rate_info *ri, u8 band, int len)
- {
--	struct ieee80211_rx_status stat = {
--		.band = band,
--	};
-+	memset(stat, 0, sizeof(*stat));
-+	stat->band = band;
- 
--	if (ieee80211_fill_rate_info(hw, &stat, band, ri))
--		goto out;
-+	if (ieee80211_fill_rate_info(hw, stat, band, ri))
-+		return 0;
- 
- 	if (rate->idx < 0 || !rate->count)
--		return 0;
-+		return -1;
- 
- 	if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
--		stat.bw = RATE_INFO_BW_80;
-+		stat->bw = RATE_INFO_BW_80;
- 	else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
--		stat.bw = RATE_INFO_BW_40;
-+		stat->bw = RATE_INFO_BW_40;
- 	else
--		stat.bw = RATE_INFO_BW_20;
-+		stat->bw = RATE_INFO_BW_20;
- 
--	stat.enc_flags = 0;
-+	stat->enc_flags = 0;
- 	if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
--		stat.enc_flags |= RX_ENC_FLAG_SHORTPRE;
-+		stat->enc_flags |= RX_ENC_FLAG_SHORTPRE;
- 	if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
--		stat.enc_flags |= RX_ENC_FLAG_SHORT_GI;
-+		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
- 
--	stat.rate_idx = rate->idx;
-+	stat->rate_idx = rate->idx;
- 	if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
--		stat.encoding = RX_ENC_VHT;
--		stat.rate_idx = ieee80211_rate_get_vht_mcs(rate);
--		stat.nss = ieee80211_rate_get_vht_nss(rate);
-+		stat->encoding = RX_ENC_VHT;
-+		stat->rate_idx = ieee80211_rate_get_vht_mcs(rate);
-+		stat->nss = ieee80211_rate_get_vht_nss(rate);
- 	} else if (rate->flags & IEEE80211_TX_RC_MCS) {
--		stat.encoding = RX_ENC_HT;
-+		stat->encoding = RX_ENC_HT;
- 	} else {
--		stat.encoding = RX_ENC_LEGACY;
-+		stat->encoding = RX_ENC_LEGACY;
- 	}
- 
--out:
-+	return 0;
-+}
-+
-+static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
-+					  struct ieee80211_tx_rate *rate,
-+					  struct rate_info *ri,
-+					  u8 band, int len)
-+{
-+	struct ieee80211_rx_status stat;
-+
-+	if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
-+		return 0;
-+
- 	return ieee80211_calc_rx_airtime(hw, &stat, len);
- }
- 
diff --git a/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch b/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch
deleted file mode 100644
index a5df07e58d60..000000000000
--- a/package/kernel/mac80211/patches/subsys/313-mac80211-improve-AQL-aggregation-estimation-for-low-.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 12 Aug 2020 17:07:10 +0200
-Subject: [PATCH] mac80211: improve AQL aggregation estimation for low data
- rates
-
-Links with low data rates use much smaller aggregates and are much more
-sensitive to latency added by bufferbloat.
-Tune the assumed aggregation length based on the tx rate duration.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -647,27 +647,41 @@ u32 ieee80211_calc_expected_tx_airtime(s
- 	if (pubsta) {
- 		struct sta_info *sta = container_of(pubsta, struct sta_info,
- 						    sta);
-+		struct ieee80211_rx_status stat;
- 		struct ieee80211_tx_rate *rate = &sta->tx_stats.last_rate;
- 		struct rate_info *ri = &sta->tx_stats.last_rate_info;
--		u32 airtime;
-+		u32 duration, overhead;
-+		u8 agg_shift;
- 
--		if (!(rate->flags & (IEEE80211_TX_RC_VHT_MCS |
--				     IEEE80211_TX_RC_MCS)))
--			ampdu = false;
-+		if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
-+			return 0;
- 
-+		if (stat.encoding == RX_ENC_LEGACY || !ampdu)
-+			return ieee80211_calc_rx_airtime(hw, &stat, len);
-+
-+		duration = ieee80211_get_rate_duration(hw, &stat, &overhead);
- 		/*
- 		 * Assume that HT/VHT transmission on any AC except VO will
- 		 * use aggregation. Since we don't have reliable reporting
--		 * of aggregation length, assume an average of 16.
-+		 * of aggregation length, assume an average size based on the
-+		 * tx rate.
- 		 * This will not be very accurate, but much better than simply
--		 * assuming un-aggregated tx.
-+		 * assuming un-aggregated tx in all cases.
- 		 */
--		airtime = ieee80211_calc_tx_airtime_rate(hw, rate, ri, band,
--							 ampdu ? len * 16 : len);
--		if (ampdu)
--			airtime /= 16;
-+		if (duration > 400) /* <= VHT20 MCS2 1S */
-+			agg_shift = 1;
-+		else if (duration > 250) /* <= VHT20 MCS3 1S or MCS1 2S */
-+			agg_shift = 2;
-+		else if (duration > 150) /* <= VHT20 MCS5 1S or MCS3 2S */
-+			agg_shift = 3;
-+		else
-+			agg_shift = 4;
-+
-+		duration *= len;
-+		duration /= AVG_PKT_SIZE;
-+		duration /= 1024;
- 
--		return airtime;
-+		return duration + (overhead >> agg_shift);
- 	}
- 
- 	if (!conf)
diff --git a/package/kernel/mac80211/patches/subsys/314-mac80211-add-missing-queue-hash-initialization-to-80.patch b/package/kernel/mac80211/patches/subsys/314-mac80211-add-missing-queue-hash-initialization-to-80.patch
deleted file mode 100644
index eb56a2cac58d..000000000000
--- a/package/kernel/mac80211/patches/subsys/314-mac80211-add-missing-queue-hash-initialization-to-80.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 17 Aug 2020 13:55:56 +0200
-Subject: [PATCH] mac80211: add missing queue/hash initialization to
- 802.3 xmit
-
-Fixes AQL for encap-offloaded tx
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -4200,6 +4200,12 @@ static void ieee80211_8023_xmit(struct i
- 	if (is_zero_ether_addr(ra))
- 		goto out_free;
- 
-+	if (local->ops->wake_tx_queue) {
-+		u16 queue = __ieee80211_select_queue(sdata, sta, skb);
-+		skb_set_queue_mapping(skb, queue);
-+		skb_get_hash(skb);
-+	}
-+
- 	multicast = is_multicast_ether_addr(ra);
- 
- 	if (sta)
diff --git a/package/kernel/mac80211/patches/subsys/315-mac80211-check-and-refresh-aggregation-session-in-en.patch b/package/kernel/mac80211/patches/subsys/315-mac80211-check-and-refresh-aggregation-session-in-en.patch
index e411d597224a..d121eec88ef3 100644
--- a/package/kernel/mac80211/patches/subsys/315-mac80211-check-and-refresh-aggregation-session-in-en.patch
+++ b/package/kernel/mac80211/patches/subsys/315-mac80211-check-and-refresh-aggregation-session-in-en.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4189,6 +4189,8 @@ static void ieee80211_8023_xmit(struct i
+@@ -4186,6 +4186,8 @@ static void ieee80211_8023_xmit(struct i
  	bool authorized = false;
  	bool multicast;
  	unsigned char *ra = ehdr->h_dest;
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (IS_ERR(sta) || (sta && !sta->uploaded))
  		sta = NULL;
-@@ -4226,6 +4228,22 @@ static void ieee80211_8023_xmit(struct i
+@@ -4223,6 +4225,22 @@ static void ieee80211_8023_xmit(struct i
  
  	memset(info, 0, sizeof(*info));
  
diff --git a/package/kernel/mac80211/patches/subsys/316-mac80211-skip-encap-offload-for-tx-multicast-control.patch b/package/kernel/mac80211/patches/subsys/316-mac80211-skip-encap-offload-for-tx-multicast-control.patch
index 6dce21db1e2f..e8763e62377f 100644
--- a/package/kernel/mac80211/patches/subsys/316-mac80211-skip-encap-offload-for-tx-multicast-control.patch
+++ b/package/kernel/mac80211/patches/subsys/316-mac80211-skip-encap-offload-for-tx-multicast-control.patch
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4184,88 +4184,47 @@ static void ieee80211_8023_xmit(struct i
+@@ -4181,88 +4181,47 @@ static void ieee80211_8023_xmit(struct i
  				struct sk_buff *skb)
  {
  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
@@ -115,7 +115,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  		sdata = container_of(sdata->bss,
-@@ -4286,6 +4245,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
+@@ -4283,6 +4242,7 @@ netdev_tx_t ieee80211_subif_start_xmit_8
  					    struct net_device *dev)
  {
  	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
@@ -123,7 +123,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	struct sta_info *sta;
  
  	if (WARN_ON(!sdata->hw_80211_encap)) {
-@@ -4302,6 +4262,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
+@@ -4299,6 +4259,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
  
  	if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
  		kfree_skb(skb);
diff --git a/package/kernel/mac80211/patches/subsys/317-mac80211-set-info-control.hw_key-for-encap-offload-p.patch b/package/kernel/mac80211/patches/subsys/317-mac80211-set-info-control.hw_key-for-encap-offload-p.patch
index cb5a98631239..077a82d5ee68 100644
--- a/package/kernel/mac80211/patches/subsys/317-mac80211-set-info-control.hw_key-for-encap-offload-p.patch
+++ b/package/kernel/mac80211/patches/subsys/317-mac80211-set-info-control.hw_key-for-encap-offload-p.patch
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4185,6 +4185,7 @@ static void ieee80211_8023_xmit(struct i
+@@ -4182,6 +4182,7 @@ static void ieee80211_8023_xmit(struct i
  {
  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  	struct ieee80211_local *local = sdata->local;
@@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	struct tid_ampdu_tx *tid_tx;
  	u8 tid;
  
-@@ -4233,6 +4234,10 @@ static void ieee80211_8023_xmit(struct i
+@@ -4230,6 +4231,10 @@ static void ieee80211_8023_xmit(struct i
  	info->control.flags |= IEEE80211_TX_CTRL_HW_80211_ENCAP;
  	info->control.vif = &sdata->vif;
  
diff --git a/package/kernel/mac80211/patches/subsys/318-mac80211-rework-tx-encapsulation-offload-API.patch b/package/kernel/mac80211/patches/subsys/318-mac80211-rework-tx-encapsulation-offload-API.patch
index 7593c41da068..811c66499bbe 100644
--- a/package/kernel/mac80211/patches/subsys/318-mac80211-rework-tx-encapsulation-offload-API.patch
+++ b/package/kernel/mac80211/patches/subsys/318-mac80211-rework-tx-encapsulation-offload-API.patch
@@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/drivers/net/wireless/ath/ath11k/mac.c
 +++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -4150,6 +4150,35 @@ static int ath11k_set_he_mu_sounding_mod
+@@ -4304,6 +4304,35 @@ static int ath11k_set_he_mu_sounding_mod
  	return ret;
  }
  
@@ -62,7 +62,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,
  				       struct ieee80211_vif *vif)
  {
-@@ -4159,7 +4188,6 @@ static int ath11k_mac_op_add_interface(s
+@@ -4313,7 +4342,6 @@ static int ath11k_mac_op_add_interface(s
  	struct vdev_create_params vdev_param = {0};
  	struct peer_create_params peer_param;
  	u32 param_id, param_value;
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	u16 nss;
  	int i;
  	int ret;
-@@ -4253,30 +4281,7 @@ static int ath11k_mac_op_add_interface(s
+@@ -4407,30 +4435,7 @@ static int ath11k_mac_op_add_interface(s
  	list_add(&arvif->list, &ar->arvifs);
  	spin_unlock_bh(&ar->data_lock);
  
@@ -102,7 +102,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	nss = get_num_chains(ar->cfg_tx_chainmask) ? : 1;
  	ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
-@@ -5599,6 +5604,7 @@ static const struct ieee80211_ops ath11k
+@@ -5753,6 +5758,7 @@ static const struct ieee80211_ops ath11k
  	.reconfig_complete              = ath11k_mac_op_reconfig_complete,
  	.add_interface                  = ath11k_mac_op_add_interface,
  	.remove_interface		= ath11k_mac_op_remove_interface,
@@ -110,7 +110,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	.config                         = ath11k_mac_op_config,
  	.bss_info_changed               = ath11k_mac_op_bss_info_changed,
  	.configure_filter		= ath11k_mac_op_configure_filter,
-@@ -5852,6 +5858,7 @@ static int __ath11k_mac_register(struct
+@@ -6034,6 +6040,7 @@ static int __ath11k_mac_register(struct
  	ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
  	ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
  	ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK);
@@ -120,7 +120,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		ieee80211_hw_set(ar->hw, TX_AMPDU_SETUP_IN_HW);
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1603,6 +1603,21 @@ enum ieee80211_vif_flags {
+@@ -1606,6 +1606,21 @@ enum ieee80211_vif_flags {
  	IEEE80211_VIF_GET_NOA_UPDATE		= BIT(3),
  };
  
@@ -142,7 +142,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  /**
   * struct ieee80211_vif - per-interface data
   *
-@@ -1623,6 +1638,11 @@ enum ieee80211_vif_flags {
+@@ -1626,6 +1641,11 @@ enum ieee80211_vif_flags {
   *	these need to be set (or cleared) when the interface is added
   *	or, if supported by the driver, the interface type is changed
   *	at runtime, mac80211 will never touch this field
@@ -154,7 +154,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
   * @hw_queue: hardware queue for each AC
   * @cab_queue: content-after-beacon (DTIM beacon really) queue, AP mode only
   * @chanctx_conf: The channel context this interface is assigned to, or %NULL
-@@ -1659,6 +1679,7 @@ struct ieee80211_vif {
+@@ -1662,6 +1682,7 @@ struct ieee80211_vif {
  	struct ieee80211_chanctx_conf __rcu *chanctx_conf;
  
  	u32 driver_flags;
@@ -162,7 +162,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  #ifdef CPTCFG_MAC80211_DEBUGFS
  	struct dentry *debugfs_dir;
-@@ -2325,6 +2346,9 @@ struct ieee80211_txq {
+@@ -2328,6 +2349,9 @@ struct ieee80211_txq {
   *	aggregating MPDUs with the same keyid, allowing mac80211 to keep Tx
   *	A-MPDU sessions active while rekeying with Extended Key ID.
   *
@@ -172,7 +172,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
   * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
   */
  enum ieee80211_hw_flags {
-@@ -2377,6 +2401,7 @@ enum ieee80211_hw_flags {
+@@ -2380,6 +2404,7 @@ enum ieee80211_hw_flags {
  	IEEE80211_HW_SUPPORTS_MULTI_BSSID,
  	IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
  	IEEE80211_HW_AMPDU_KEYBORDER_SUPPORT,
@@ -180,7 +180,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	/* keep last, obviously */
  	NUM_IEEE80211_HW_FLAGS
-@@ -3811,6 +3836,8 @@ enum ieee80211_reconfig_type {
+@@ -3814,6 +3839,8 @@ enum ieee80211_reconfig_type {
   * @set_tid_config: Apply TID specific configurations. This callback may sleep.
   * @reset_tid_config: Reset TID specific configuration for the peer.
   *	This callback may sleep.
@@ -189,7 +189,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
   */
  struct ieee80211_ops {
  	void (*tx)(struct ieee80211_hw *hw,
-@@ -4122,6 +4149,8 @@ struct ieee80211_ops {
+@@ -4125,6 +4152,8 @@ struct ieee80211_ops {
  	int (*reset_tid_config)(struct ieee80211_hw *hw,
  				struct ieee80211_vif *vif,
  				struct ieee80211_sta *sta, u8 tids);
@@ -210,7 +210,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
 --- a/net/mac80211/driver-ops.h
 +++ b/net/mac80211/driver-ops.h
-@@ -1385,4 +1385,19 @@ static inline int drv_reset_tid_config(s
+@@ -1384,4 +1384,19 @@ static inline int drv_reset_tid_config(s
  
  	return ret;
  }
@@ -232,7 +232,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  #endif /* __MAC80211_DRIVER_OPS */
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -990,8 +990,6 @@ struct ieee80211_sub_if_data {
+@@ -993,8 +993,6 @@ struct ieee80211_sub_if_data {
  	} debugfs;
  #endif
  
@@ -241,7 +241,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	/* must be last, dynamically sized area in this! */
  	struct ieee80211_vif vif;
  };
-@@ -1769,6 +1767,7 @@ void ieee80211_del_virtual_monitor(struc
+@@ -1772,6 +1770,7 @@ void ieee80211_del_virtual_monitor(struc
  bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata);
  void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata,
  			      bool update_bss);
@@ -375,7 +375,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  			res = ieee80211_check_queues(sdata,
  				ieee80211_vif_type_p2p(&sdata->vif));
  			if (res)
-@@ -1286,61 +1371,6 @@ static const struct net_device_ops ieee8
+@@ -1293,61 +1378,6 @@ static const struct net_device_ops ieee8
  
  };
  
@@ -437,7 +437,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static void ieee80211_if_free(struct net_device *dev)
  {
  	free_percpu(netdev_tstats(dev));
-@@ -1371,6 +1401,32 @@ static void ieee80211_if_setup_no_queue(
+@@ -1378,6 +1408,32 @@ static void ieee80211_if_setup_no_queue(
  #endif
  }
  
@@ -470,7 +470,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static void ieee80211_iface_work(struct work_struct *work)
  {
  	struct ieee80211_sub_if_data *sdata =
-@@ -1553,7 +1609,6 @@ static void ieee80211_setup_sdata(struct
+@@ -1560,7 +1616,6 @@ static void ieee80211_setup_sdata(struct
  	sdata->vif.bss_conf.txpower = INT_MIN; /* unset */
  
  	sdata->noack_map = 0;
@@ -478,7 +478,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	/* only monitor/p2p-device differ */
  	if (sdata->dev) {
-@@ -1688,6 +1743,7 @@ static int ieee80211_runtime_change_ifty
+@@ -1695,6 +1750,7 @@ static int ieee80211_runtime_change_ifty
  
  	ieee80211_teardown_sdata(sdata);
  
@@ -486,7 +486,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	ret = drv_change_interface(local, sdata, internal_type, p2p);
  	if (ret)
  		type = ieee80211_vif_type_p2p(&sdata->vif);
-@@ -1700,6 +1756,7 @@ static int ieee80211_runtime_change_ifty
+@@ -1707,6 +1763,7 @@ static int ieee80211_runtime_change_ifty
  	ieee80211_check_queues(sdata, type);
  
  	ieee80211_setup_sdata(sdata, type);
@@ -520,14 +520,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -		 */
 -		if (sdata->hw_80211_encap)
 -			return -EINVAL;
--		/* Fall through */
+-		fallthrough;
 -
  	case WLAN_CIPHER_SUITE_AES_CMAC:
  	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
  	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
 --- a/net/mac80211/trace.h
 +++ b/net/mac80211/trace.h
-@@ -2733,6 +2733,12 @@ TRACE_EVENT(drv_get_ftm_responder_stats,
+@@ -2734,6 +2734,12 @@ TRACE_EVENT(drv_get_ftm_responder_stats,
  	)
  );
  
@@ -542,7 +542,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  #undef TRACE_INCLUDE_PATH
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4181,11 +4181,10 @@ static bool ieee80211_tx_8023(struct iee
+@@ -4178,11 +4178,10 @@ static bool ieee80211_tx_8023(struct iee
  
  static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
  				struct net_device *dev, struct sta_info *sta,
@@ -555,7 +555,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	struct tid_ampdu_tx *tid_tx;
  	u8 tid;
  
-@@ -4234,7 +4233,6 @@ static void ieee80211_8023_xmit(struct i
+@@ -4231,7 +4230,6 @@ static void ieee80211_8023_xmit(struct i
  	info->control.flags |= IEEE80211_TX_CTRL_HW_80211_ENCAP;
  	info->control.vif = &sdata->vif;
  
@@ -563,7 +563,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (key)
  		info->control.hw_key = &key->conf;
  
-@@ -4251,12 +4249,9 @@ netdev_tx_t ieee80211_subif_start_xmit_8
+@@ -4248,12 +4246,9 @@ netdev_tx_t ieee80211_subif_start_xmit_8
  {
  	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  	struct ethhdr *ehdr = (struct ethhdr *)skb->data;
@@ -578,7 +578,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (unlikely(skb->len < ETH_HLEN)) {
  		kfree_skb(skb);
-@@ -4265,15 +4260,26 @@ netdev_tx_t ieee80211_subif_start_xmit_8
+@@ -4262,15 +4257,26 @@ netdev_tx_t ieee80211_subif_start_xmit_8
  
  	rcu_read_lock();
  
diff --git a/package/kernel/mac80211/patches/subsys/319-mac80211-reduce-duplication-in-tx-status-functions.patch b/package/kernel/mac80211/patches/subsys/319-mac80211-reduce-duplication-in-tx-status-functions.patch
index e13723b160ec..83522a754186 100644
--- a/package/kernel/mac80211/patches/subsys/319-mac80211-reduce-duplication-in-tx-status-functions.patch
+++ b/package/kernel/mac80211/patches/subsys/319-mac80211-reduce-duplication-in-tx-status-functions.patch
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (ieee80211_is_data_qos(mgmt->frame_control)) {
  		struct ieee80211_hdr *hdr = (void *) skb->data;
-@@ -899,7 +887,8 @@ void ieee80211_tx_monitor(struct ieee802
+@@ -897,7 +885,8 @@ void ieee80211_tx_monitor(struct ieee802
  }
  
  static void __ieee80211_tx_status(struct ieee80211_hw *hw,
@@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  {
  	struct sk_buff *skb = status->skb;
  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-@@ -908,8 +897,6 @@ static void __ieee80211_tx_status(struct
+@@ -906,8 +895,6 @@ static void __ieee80211_tx_status(struct
  	struct sta_info *sta;
  	__le16 fc;
  	struct ieee80211_supported_band *sband;
@@ -49,7 +49,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	bool send_to_cooked;
  	bool acked;
  	bool noack_success;
-@@ -918,8 +905,6 @@ static void __ieee80211_tx_status(struct
+@@ -916,8 +903,6 @@ static void __ieee80211_tx_status(struct
  	int tid = IEEE80211_NUM_TIDS;
  	u16 tx_time_est;
  
@@ -58,7 +58,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	sband = local->hw.wiphy->bands[info->band];
  	fc = hdr->frame_control;
  
-@@ -996,24 +981,14 @@ static void __ieee80211_tx_status(struct
+@@ -994,24 +979,14 @@ static void __ieee80211_tx_status(struct
  		if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
  			ieee80211_handle_filtered_frame(local, sta, skb);
  			return;
@@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
  			ieee80211_frame_acked(sta, skb);
  
-@@ -1038,20 +1013,6 @@ static void __ieee80211_tx_status(struct
+@@ -1036,20 +1011,6 @@ static void __ieee80211_tx_status(struct
  							     true);
  			ieee80211_info_set_tx_time_est(info, 0);
  		}
@@ -108,7 +108,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	}
  
  	/* SNMP counters
-@@ -1135,7 +1096,7 @@ void ieee80211_tx_status(struct ieee8021
+@@ -1133,7 +1094,7 @@ void ieee80211_tx_status(struct ieee8021
  	if (sta)
  		status.sta = &sta->sta;
  
@@ -117,7 +117,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	rcu_read_unlock();
  }
  EXPORT_SYMBOL(ieee80211_tx_status);
-@@ -1148,7 +1109,7 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1146,7 +1107,7 @@ void ieee80211_tx_status_ext(struct ieee
  	struct ieee80211_sta *pubsta = status->sta;
  	struct ieee80211_supported_band *sband;
  	struct sta_info *sta;
@@ -126,7 +126,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	bool acked, noack_success;
  
  	if (pubsta) {
-@@ -1158,13 +1119,7 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1156,13 +1117,7 @@ void ieee80211_tx_status_ext(struct ieee
  			sta->tx_stats.last_rate_info = *status->rate;
  	}
  
@@ -141,7 +141,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	sband = hw->wiphy->bands[info->band];
  
-@@ -1176,20 +1131,30 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1174,20 +1129,30 @@ void ieee80211_tx_status_ext(struct ieee
  			sta->status_stats.retry_failed++;
  		sta->status_stats.retry_count += retry_count;
  
@@ -184,7 +184,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		}
  
  		rate_control_tx_status(local, sband, status);
-@@ -1197,6 +1162,10 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1195,6 +1160,10 @@ void ieee80211_tx_status_ext(struct ieee
  			ieee80211s_update_metric(local, sta, status);
  	}
  
diff --git a/package/kernel/mac80211/patches/subsys/320-mac80211-remove-tx-status-call-to-ieee80211_sta_regi.patch b/package/kernel/mac80211/patches/subsys/320-mac80211-remove-tx-status-call-to-ieee80211_sta_regi.patch
index 168d6458a523..9bd1765b1676 100644
--- a/package/kernel/mac80211/patches/subsys/320-mac80211-remove-tx-status-call-to-ieee80211_sta_regi.patch
+++ b/package/kernel/mac80211/patches/subsys/320-mac80211-remove-tx-status-call-to-ieee80211_sta_regi.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -997,12 +997,6 @@ static void __ieee80211_tx_status(struct
+@@ -995,12 +995,6 @@ static void __ieee80211_tx_status(struct
  			ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
  						acked, info->status.tx_time);
  
diff --git a/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch b/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
index f8287c53a7ac..48d76868634e 100644
--- a/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
+++ b/package/kernel/mac80211/patches/subsys/321-mac80211-optimize-station-connection-monitor.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -2045,8 +2045,6 @@ void ieee80211_dynamic_ps_timer(struct t
+@@ -2047,8 +2047,6 @@ void ieee80211_dynamic_ps_timer(struct t
  void ieee80211_send_nullfunc(struct ieee80211_local *local,
  			     struct ieee80211_sub_if_data *sdata,
  			     bool powersave);
@@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  }
  
  static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata,
-@@ -3600,8 +3575,8 @@ static bool ieee80211_assoc_success(stru
+@@ -3605,8 +3580,8 @@ static bool ieee80211_assoc_success(stru
  	 * Start timer to probe the connection to the AP now.
  	 * Also start the timer that will detect beacon loss.
  	 */
@@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	ret = true;
   out:
-@@ -4569,10 +4544,26 @@ static void ieee80211_sta_conn_mon_timer
+@@ -4577,10 +4552,26 @@ static void ieee80211_sta_conn_mon_timer
  		from_timer(sdata, t, u.mgd.conn_mon_timer);
  	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
  	struct ieee80211_local *local = sdata->local;
@@ -122,7 +122,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	sta->rx_stats.fragments++;
  
  	u64_stats_update_begin(&rx->sta->rx_stats.syncp);
-@@ -4149,7 +4146,6 @@ void ieee80211_check_fast_rx(struct sta_
+@@ -4153,7 +4150,6 @@ void ieee80211_check_fast_rx(struct sta_
  			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr2);
  			fastrx.expected_ds_bits = 0;
  		} else {
@@ -130,7 +130,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  			fastrx.da_offs = offsetof(struct ieee80211_hdr, addr1);
  			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr3);
  			fastrx.expected_ds_bits =
-@@ -4379,11 +4375,6 @@ static bool ieee80211_invoke_fast_rx(str
+@@ -4383,11 +4379,6 @@ static bool ieee80211_invoke_fast_rx(str
  	    pskb_trim(skb, skb->len - fast_rx->icv_len))
  		goto drop;
  
@@ -162,7 +162,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	u8 da_offs, sa_offs;
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -1227,9 +1227,6 @@ void ieee80211_tx_status_8023(struct iee
+@@ -1225,9 +1225,6 @@ void ieee80211_tx_status_8023(struct iee
  	sta->status_stats.retry_count += retry_count;
  
  	if (ieee80211_hw_check(hw, REPORTS_TX_ACK_STATUS)) {
diff --git a/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch b/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch
index 8505ce56f690..d62621ca778b 100644
--- a/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch
+++ b/package/kernel/mac80211/patches/subsys/322-mac80211-swap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch
@@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
 --- a/drivers/net/wireless/ath/ath11k/mac.c
 +++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -3749,7 +3749,7 @@ static int ath11k_mac_mgmt_tx_wmi(struct
+@@ -3898,7 +3898,7 @@ static int ath11k_mac_mgmt_tx_wmi(struct
  		return -ENOSPC;
  
  	info = IEEE80211_SKB_CB(skb);
@@ -43,7 +43,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		if ((ieee80211_is_action(hdr->frame_control) ||
  		     ieee80211_is_deauth(hdr->frame_control) ||
  		     ieee80211_is_disassoc(hdr->frame_control)) &&
-@@ -3876,7 +3876,7 @@ static void ath11k_mac_op_tx(struct ieee
+@@ -4025,7 +4025,7 @@ static void ath11k_mac_op_tx(struct ieee
  	bool is_prb_rsp;
  	int ret;
  
@@ -84,18 +84,18 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 + * @IEEE80211_TX_INTCFL_NEED_TXPROCESSING: completely internal to mac80211,
 + *	used to indicate that a pending frame requires TX processing before
 + *	it can be sent out.
+  * @IEEE80211_TX_CTRL_NO_SEQNO: Do not overwrite the sequence number that
+  *	has already been assigned to this frame.
   *
-  * These flags are used in tx_info->control.flags.
-  */
-@@ -835,7 +835,7 @@ enum mac80211_tx_control_flags {
+@@ -837,7 +837,7 @@ enum mac80211_tx_control_flags {
  	IEEE80211_TX_CTRL_AMSDU			= BIT(3),
  	IEEE80211_TX_CTRL_FAST_XMIT		= BIT(4),
  	IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP	= BIT(5),
 -	IEEE80211_TX_CTRL_HW_80211_ENCAP	= BIT(6),
 +	IEEE80211_TX_INTCFL_NEED_TXPROCESSING	= BIT(6),
+ 	IEEE80211_TX_CTRL_NO_SEQNO		= BIT(7),
  };
  
- /*
 --- a/net/mac80211/mesh_hwmp.c
 +++ b/net/mac80211/mesh_hwmp.c
 @@ -212,7 +212,7 @@ static void prepare_frame_for_deferred_t
@@ -129,7 +129,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  }
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2897,7 +2897,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+@@ -2901,7 +2901,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
  	fwd_hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_RETRY);
  	info = IEEE80211_SKB_CB(fwd_skb);
  	memset(info, 0, sizeof(*info));
@@ -153,7 +153,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	sta->status_stats.filtered++;
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -530,7 +530,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
+@@ -531,7 +531,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
  
  		info->control.jiffies = jiffies;
  		info->control.vif = &tx->sdata->vif;
@@ -162,7 +162,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
  		skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
  		spin_unlock(&sta->ps_lock);
-@@ -1132,7 +1132,7 @@ static bool ieee80211_tx_prep_agg(struct
+@@ -1134,7 +1134,7 @@ static bool ieee80211_tx_prep_agg(struct
  				       tx->sta->sta.addr, tx->sta->sta.aid);
  			}
  			info->control.vif = &tx->sdata->vif;
@@ -171,7 +171,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  			info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
  			__skb_queue_tail(&tid_tx->pending, skb);
  			if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
-@@ -1177,7 +1177,7 @@ ieee80211_tx_prepare(struct ieee80211_su
+@@ -1179,7 +1179,7 @@ ieee80211_tx_prepare(struct ieee80211_su
  	 * we are doing the needed processing, so remove the flag
  	 * now.
  	 */
@@ -180,7 +180,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	hdr = (struct ieee80211_hdr *) skb->data;
  
-@@ -1256,7 +1256,7 @@ static struct txq_info *ieee80211_get_tx
+@@ -1258,7 +1258,7 @@ static struct txq_info *ieee80211_get_tx
  	    (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE))
  		return NULL;
  
@@ -189,7 +189,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	    unlikely(!ieee80211_is_data_present(hdr->frame_control))) {
  		if ((!ieee80211_is_mgmt(hdr->frame_control) ||
  		     ieee80211_is_bufferable_mmpdu(hdr->frame_control) ||
-@@ -3640,7 +3640,7 @@ begin:
+@@ -3637,7 +3637,7 @@ begin:
  	else
  		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
  
@@ -198,7 +198,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		goto encap_out;
  
  	if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
-@@ -4230,7 +4230,7 @@ static void ieee80211_8023_xmit(struct i
+@@ -4227,7 +4227,7 @@ static void ieee80211_8023_xmit(struct i
  		sdata = container_of(sdata->bss,
  				     struct ieee80211_sub_if_data, u.ap);
  
@@ -207,7 +207,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	info->control.vif = &sdata->vif;
  
  	if (key)
-@@ -4355,7 +4355,7 @@ static bool ieee80211_tx_pending_skb(str
+@@ -4352,7 +4352,7 @@ static bool ieee80211_tx_pending_skb(str
  
  	sdata = vif_to_sdata(info->control.vif);
  
@@ -216,10 +216,10 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
  		if (unlikely(!chanctx_conf)) {
  			dev_kfree_skb(skb);
-@@ -4363,7 +4363,7 @@ static bool ieee80211_tx_pending_skb(str
+@@ -4360,7 +4360,7 @@ static bool ieee80211_tx_pending_skb(str
  		}
  		info->band = chanctx_conf->def.chan->band;
- 		result = ieee80211_tx(sdata, NULL, skb, true, 0);
+ 		result = ieee80211_tx(sdata, NULL, skb, true);
 -	} else if (info->control.flags & IEEE80211_TX_CTRL_HW_80211_ENCAP) {
 +	} else if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
  		if (ieee80211_lookup_ra_sta(sdata, skb, &sta)) {
diff --git a/package/kernel/mac80211/patches/subsys/323-mac80211-unify-802.3-offload-and-802.11-tx-status-co.patch b/package/kernel/mac80211/patches/subsys/323-mac80211-unify-802.3-offload-and-802.11-tx-status-co.patch
index 7bb54f499bae..62bb917184ff 100644
--- a/package/kernel/mac80211/patches/subsys/323-mac80211-unify-802.3-offload-and-802.11-tx-status-co.patch
+++ b/package/kernel/mac80211/patches/subsys/323-mac80211-unify-802.3-offload-and-802.11-tx-status-co.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -903,7 +903,6 @@ static void __ieee80211_tx_status(struct
+@@ -901,7 +901,6 @@ static void __ieee80211_tx_status(struct
  	struct ieee80211_bar *bar;
  	int shift = 0;
  	int tid = IEEE80211_NUM_TIDS;
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	sband = local->hw.wiphy->bands[info->band];
  	fc = hdr->frame_control;
-@@ -996,17 +995,6 @@ static void __ieee80211_tx_status(struct
+@@ -994,17 +993,6 @@ static void __ieee80211_tx_status(struct
  		    ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
  			ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
  						acked, info->status.tx_time);
@@ -37,7 +37,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	}
  
  	/* SNMP counters
-@@ -1102,9 +1090,11 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1100,9 +1088,11 @@ void ieee80211_tx_status_ext(struct ieee
  	struct ieee80211_tx_info *info = status->info;
  	struct ieee80211_sta *pubsta = status->sta;
  	struct ieee80211_supported_band *sband;
@@ -50,7 +50,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  	if (pubsta) {
  		sta = container_of(pubsta, struct sta_info, sta);
-@@ -1156,7 +1146,18 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1154,7 +1144,18 @@ void ieee80211_tx_status_ext(struct ieee
  			ieee80211s_update_metric(local, sta, status);
  	}
  
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		return __ieee80211_tx_status(hw, status, rates_idx,
  					     retry_count);
  
-@@ -1171,6 +1172,12 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1169,6 +1170,12 @@ void ieee80211_tx_status_ext(struct ieee
  	} else {
  		I802_DEBUG_INC(local->dot11FailedCount);
  	}
@@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  }
  EXPORT_SYMBOL(ieee80211_tx_status_ext);
  
-@@ -1197,66 +1204,23 @@ void ieee80211_tx_status_8023(struct iee
+@@ -1195,66 +1202,23 @@ void ieee80211_tx_status_8023(struct iee
  			      struct ieee80211_vif *vif,
  			      struct sk_buff *skb)
  {
diff --git a/package/kernel/mac80211/patches/subsys/324-mac80211-support-using-ieee80211_tx_status_ext-to-fr.patch b/package/kernel/mac80211/patches/subsys/324-mac80211-support-using-ieee80211_tx_status_ext-to-fr.patch
index 5469a419bfef..ffb89a4d4aa4 100644
--- a/package/kernel/mac80211/patches/subsys/324-mac80211-support-using-ieee80211_tx_status_ext-to-fr.patch
+++ b/package/kernel/mac80211/patches/subsys/324-mac80211-support-using-ieee80211_tx_status_ext-to-fr.patch
@@ -13,7 +13,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -1103,6 +1103,21 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1101,6 +1101,21 @@ void ieee80211_tx_status_ext(struct ieee
  			sta->tx_stats.last_rate_info = *status->rate;
  	}
  
@@ -35,7 +35,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
  
  	sband = hw->wiphy->bands[info->band];
-@@ -1146,17 +1161,6 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1144,17 +1159,6 @@ void ieee80211_tx_status_ext(struct ieee
  			ieee80211s_update_metric(local, sta, status);
  	}
  
@@ -53,7 +53,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
  		return __ieee80211_tx_status(hw, status, rates_idx,
  					     retry_count);
-@@ -1173,6 +1177,7 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1171,6 +1175,7 @@ void ieee80211_tx_status_ext(struct ieee
  		I802_DEBUG_INC(local->dot11FailedCount);
  	}
  
diff --git a/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch b/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch
index e8b29bb4c540..b5dcb0b013f1 100644
--- a/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch
+++ b/package/kernel/mac80211/patches/subsys/325-mac80211-extend-ieee80211_tx_status_ext-to-support-b.patch
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1092,12 +1092,14 @@ ieee80211_info_get_tx_time_est(struct ie
+@@ -1095,12 +1095,14 @@ ieee80211_info_get_tx_time_est(struct ie
   * @info: Basic tx status information
   * @skb: Packet skb (can be NULL if not provided by the driver)
   * @rate: The TX rate that was used when sending the packet
@@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  /**
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -1053,7 +1053,10 @@ static void __ieee80211_tx_status(struct
+@@ -1051,7 +1051,10 @@ static void __ieee80211_tx_status(struct
  	 * with this test...
  	 */
  	if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
@@ -39,7 +39,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		return;
  	}
  
-@@ -1182,7 +1185,10 @@ free:
+@@ -1180,7 +1183,10 @@ free:
  		return;
  
  	ieee80211_report_used_skb(local, skb, false);
diff --git a/package/kernel/mac80211/patches/subsys/326-mac80211-notify-the-driver-when-a-sta-uses-4-address.patch b/package/kernel/mac80211/patches/subsys/326-mac80211-notify-the-driver-when-a-sta-uses-4-address.patch
index aa166c6431a2..f38afc791267 100644
--- a/package/kernel/mac80211/patches/subsys/326-mac80211-notify-the-driver-when-a-sta-uses-4-address.patch
+++ b/package/kernel/mac80211/patches/subsys/326-mac80211-notify-the-driver-when-a-sta-uses-4-address.patch
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -3840,6 +3840,8 @@ enum ieee80211_reconfig_type {
+@@ -3843,6 +3843,8 @@ enum ieee80211_reconfig_type {
   *	This callback may sleep.
   * @update_vif_config: Update virtual interface offload flags
   *	This callback may sleep.
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
   */
  struct ieee80211_ops {
  	void (*tx)(struct ieee80211_hw *hw,
-@@ -4153,6 +4155,8 @@ struct ieee80211_ops {
+@@ -4156,6 +4158,8 @@ struct ieee80211_ops {
  				struct ieee80211_sta *sta, u8 tids);
  	void (*update_vif_offload)(struct ieee80211_hw *hw,
  				   struct ieee80211_vif *vif);
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  /**
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1694,6 +1694,7 @@ static int ieee80211_change_station(stru
+@@ -1696,6 +1696,7 @@ static int ieee80211_change_station(stru
  
  			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
  			__ieee80211_check_fast_rx_iface(vlansdata);
@@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
 --- a/net/mac80211/driver-ops.h
 +++ b/net/mac80211/driver-ops.h
-@@ -1400,4 +1400,18 @@ static inline void drv_update_vif_offloa
+@@ -1399,4 +1399,18 @@ static inline void drv_update_vif_offloa
  	trace_drv_return_void(local);
  }
  
@@ -61,7 +61,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  #endif /* __MAC80211_DRIVER_OPS */
 --- a/net/mac80211/mlme.c
 +++ b/net/mac80211/mlme.c
-@@ -3518,6 +3518,9 @@ static bool ieee80211_assoc_success(stru
+@@ -3523,6 +3523,9 @@ static bool ieee80211_assoc_success(stru
  		goto out;
  	}
  
@@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	/*
 --- a/net/mac80211/trace.h
 +++ b/net/mac80211/trace.h
-@@ -2739,6 +2739,33 @@ DEFINE_EVENT(local_sdata_addr_evt, drv_u
+@@ -2740,6 +2740,33 @@ DEFINE_EVENT(local_sdata_addr_evt, drv_u
  	TP_ARGS(local, sdata)
  );
  
diff --git a/package/kernel/mac80211/patches/subsys/327-mac80211-reorganize-code-to-remove-a-forward-declara.patch b/package/kernel/mac80211/patches/subsys/327-mac80211-reorganize-code-to-remove-a-forward-declara.patch
index a3d600152c22..0bfb10cdb014 100644
--- a/package/kernel/mac80211/patches/subsys/327-mac80211-reorganize-code-to-remove-a-forward-declara.patch
+++ b/package/kernel/mac80211/patches/subsys/327-mac80211-reorganize-code-to-remove-a-forward-declara.patch
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)
  {
-@@ -349,6 +348,511 @@ static int ieee80211_check_queues(struct
+@@ -349,6 +348,518 @@ static int ieee80211_check_queues(struct
  	return 0;
  }
  
@@ -220,7 +220,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +	case NL80211_IFTYPE_P2P_DEVICE:
 +		/* relies on synchronize_rcu() below */
 +		RCU_INIT_POINTER(local->p2p_sdata, NULL);
-+		/* fall through */
++		fallthrough;
 +	default:
 +		cancel_work_sync(&sdata->work);
 +		/*
@@ -290,7 +290,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +		if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
 +			break;
 +
-+		/* fall through */
++		fallthrough;
 +	default:
 +		if (going_down)
 +			drv_remove_interface(local, sdata);
@@ -481,17 +481,24 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +{
 +	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 +	struct ieee80211_local *local = sdata->local;
++	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 +	struct ieee80211_hdr *hdr;
-+	struct ieee80211_radiotap_header *rtap = (void *)skb->data;
++	int len_rthdr;
 +
 +	if (local->hw.queues < IEEE80211_NUM_ACS)
 +		return 0;
 +
-+	if (skb->len < 4 ||
-+	    skb->len < le16_to_cpu(rtap->it_len) + 2 /* frame control */)
++	/* reset flags and info before parsing radiotap header */
++	memset(info, 0, sizeof(*info));
++
++	if (!ieee80211_parse_tx_radiotap(skb, dev))
 +		return 0; /* doesn't matter, frame will be dropped */
 +
-+	hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
++	len_rthdr = ieee80211_get_radiotap_len(skb->data);
++	hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);
++	if (skb->len < len_rthdr + 2 ||
++	    skb->len < len_rthdr + ieee80211_hdrlen(hdr->frame_control))
++		return 0; /* doesn't matter, frame will be dropped */
 +
 +	return ieee80211_select_queue_80211(sdata, skb, hdr);
 +}
@@ -531,7 +538,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static bool ieee80211_iftype_supports_encap_offload(enum nl80211_iftype iftype)
  {
  	switch (iftype) {
-@@ -389,6 +893,31 @@ static bool ieee80211_set_sdata_offload_
+@@ -389,6 +900,31 @@ static bool ieee80211_set_sdata_offload_
  	return true;
  }
  
@@ -563,7 +570,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
  static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata)
  {
-@@ -866,511 +1395,6 @@ int ieee80211_do_open(struct wireless_de
+@@ -866,518 +1402,6 @@ int ieee80211_do_open(struct wireless_de
  	return res;
  }
  
@@ -764,7 +771,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -	case NL80211_IFTYPE_P2P_DEVICE:
 -		/* relies on synchronize_rcu() below */
 -		RCU_INIT_POINTER(local->p2p_sdata, NULL);
--		/* fall through */
+-		fallthrough;
 -	default:
 -		cancel_work_sync(&sdata->work);
 -		/*
@@ -834,7 +841,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -		if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
 -			break;
 -
--		/* fall through */
+-		fallthrough;
 -	default:
 -		if (going_down)
 -			drv_remove_interface(local, sdata);
@@ -1025,17 +1032,24 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -{
 -	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 -	struct ieee80211_local *local = sdata->local;
+-	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 -	struct ieee80211_hdr *hdr;
--	struct ieee80211_radiotap_header *rtap = (void *)skb->data;
+-	int len_rthdr;
 -
 -	if (local->hw.queues < IEEE80211_NUM_ACS)
 -		return 0;
 -
--	if (skb->len < 4 ||
--	    skb->len < le16_to_cpu(rtap->it_len) + 2 /* frame control */)
+-	/* reset flags and info before parsing radiotap header */
+-	memset(info, 0, sizeof(*info));
+-
+-	if (!ieee80211_parse_tx_radiotap(skb, dev))
 -		return 0; /* doesn't matter, frame will be dropped */
 -
--	hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
+-	len_rthdr = ieee80211_get_radiotap_len(skb->data);
+-	hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);
+-	if (skb->len < len_rthdr + 2 ||
+-	    skb->len < len_rthdr + ieee80211_hdrlen(hdr->frame_control))
+-		return 0; /* doesn't matter, frame will be dropped */
 -
 -	return ieee80211_select_queue_80211(sdata, skb, hdr);
 -}
@@ -1075,7 +1089,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  static void ieee80211_if_free(struct net_device *dev)
  {
  	free_percpu(netdev_tstats(dev));
-@@ -1401,32 +1425,6 @@ static void ieee80211_if_setup_no_queue(
+@@ -1408,32 +1432,6 @@ static void ieee80211_if_setup_no_queue(
  #endif
  }
  
diff --git a/package/kernel/mac80211/patches/subsys/328-mac80211-extend-AQL-aggregation-estimation-to-HE-and.patch b/package/kernel/mac80211/patches/subsys/328-mac80211-extend-AQL-aggregation-estimation-to-HE-and.patch
deleted file mode 100644
index 3d687f834117..000000000000
--- a/package/kernel/mac80211/patches/subsys/328-mac80211-extend-AQL-aggregation-estimation-to-HE-and.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 27 Aug 2020 12:44:36 +0200
-Subject: [PATCH] mac80211: extend AQL aggregation estimation to HE and fix
- unit mismatch
-
-The unit of the return value of ieee80211_get_rate_duration is nanoseconds, not
-milliseconds. Adjust the duration checks to account for that.
-For higher data rates, allow larger estimated aggregation sizes, and add some
-values for HE as well, which can use much larger aggregates.
-Since small packets with high data rates can now lead to duration values too
-small for info->tx_time_est, return a minimum of 4us.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -668,20 +668,26 @@ u32 ieee80211_calc_expected_tx_airtime(s
- 		 * This will not be very accurate, but much better than simply
- 		 * assuming un-aggregated tx in all cases.
- 		 */
--		if (duration > 400) /* <= VHT20 MCS2 1S */
-+		if (duration > 400 * 1024) /* <= VHT20 MCS2 1S */
- 			agg_shift = 1;
--		else if (duration > 250) /* <= VHT20 MCS3 1S or MCS1 2S */
-+		else if (duration > 250 * 1024) /* <= VHT20 MCS3 1S or MCS1 2S */
- 			agg_shift = 2;
--		else if (duration > 150) /* <= VHT20 MCS5 1S or MCS3 2S */
-+		else if (duration > 150 * 1024) /* <= VHT20 MCS5 1S or MCS2 2S */
- 			agg_shift = 3;
--		else
-+		else if (duration > 70 * 1024) /* <= VHT20 MCS5 2S */
- 			agg_shift = 4;
-+		else if (stat.encoding != RX_ENC_HE ||
-+			 duration > 20 * 1024) /* <= HE40 MCS6 2S */
-+			agg_shift = 5;
-+		else
-+			agg_shift = 6;
- 
- 		duration *= len;
- 		duration /= AVG_PKT_SIZE;
- 		duration /= 1024;
-+		duration += (overhead >> agg_shift);
- 
--		return duration + (overhead >> agg_shift);
-+		return max_t(u32, duration, 4);
- 	}
- 
- 	if (!conf)
diff --git a/package/kernel/mac80211/patches/subsys/329-mac80211-add-AQL-support-for-VHT160-tx-rates.patch b/package/kernel/mac80211/patches/subsys/329-mac80211-add-AQL-support-for-VHT160-tx-rates.patch
deleted file mode 100644
index e22a09e711e6..000000000000
--- a/package/kernel/mac80211/patches/subsys/329-mac80211-add-AQL-support-for-VHT160-tx-rates.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 27 Aug 2020 12:47:48 +0200
-Subject: [PATCH] mac80211: add AQL support for VHT160 tx rates
-
-When converting from struct ieee80211_tx_rate to ieee80211_rx_status,
-there was one check missing to fill in the bandwidth for 160 MHz
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/airtime.c
-+++ b/net/mac80211/airtime.c
-@@ -560,7 +560,9 @@ static int ieee80211_fill_rx_status(stru
- 	if (rate->idx < 0 || !rate->count)
- 		return -1;
- 
--	if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
-+	if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
-+		stat->bw = RATE_INFO_BW_160;
-+	else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
- 		stat->bw = RATE_INFO_BW_80;
- 	else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
- 		stat->bw = RATE_INFO_BW_40;
diff --git a/package/kernel/mac80211/patches/subsys/332-mac80211-fix-regression-in-sta-connection-monitor.patch b/package/kernel/mac80211/patches/subsys/332-mac80211-fix-regression-in-sta-connection-monitor.patch
index cff8045c0586..93a9eca51f0e 100644
--- a/package/kernel/mac80211/patches/subsys/332-mac80211-fix-regression-in-sta-connection-monitor.patch
+++ b/package/kernel/mac80211/patches/subsys/332-mac80211-fix-regression-in-sta-connection-monitor.patch
@@ -13,7 +13,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -991,10 +991,6 @@ static void __ieee80211_tx_status(struct
+@@ -989,10 +989,6 @@ static void __ieee80211_tx_status(struct
  		if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
  			ieee80211_frame_acked(sta, skb);
  
@@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  	}
  
  	/* SNMP counters
-@@ -1129,11 +1125,18 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1127,11 +1123,18 @@ void ieee80211_tx_status_ext(struct ieee
  	noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
  
  	if (pubsta) {
@@ -43,7 +43,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  			if (acked) {
  				sta->status_stats.last_ack = jiffies;
  
-@@ -1143,6 +1146,11 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1141,6 +1144,11 @@ void ieee80211_tx_status_ext(struct ieee
  				/* Track when last packet was ACKed */
  				sta->status_stats.last_pkt_time = jiffies;
  
diff --git a/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch b/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch
index cdbbcf5d065b..e518f5134ff0 100644
--- a/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch
+++ b/package/kernel/mac80211/patches/subsys/333-mac80211-fix-memory-leak-on-filtered-powersave-frame.patch
@@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		ieee80211_free_txskb(&local->hw, skb);
  		return;
  	}
-@@ -924,15 +925,6 @@ static void __ieee80211_tx_status(struct
+@@ -922,15 +923,6 @@ static void __ieee80211_tx_status(struct
  			ieee80211_mpsp_trigger_process(
  				ieee80211_get_qos_ctl(hdr), sta, true, acked);
  
@@ -40,7 +40,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  		if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
  		    (ieee80211_is_data(hdr->frame_control)) &&
  		    (rates_idx != -1))
-@@ -1159,6 +1151,12 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1157,6 +1149,12 @@ void ieee80211_tx_status_ext(struct ieee
  							    -info->status.ack_signal);
  				}
  			} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
diff --git a/package/kernel/mac80211/patches/subsys/334-mac80211-minstrel-remove-deferred-sampling-code.patch b/package/kernel/mac80211/patches/subsys/334-mac80211-minstrel-remove-deferred-sampling-code.patch
deleted file mode 100644
index e3a877fb94bb..000000000000
--- a/package/kernel/mac80211/patches/subsys/334-mac80211-minstrel-remove-deferred-sampling-code.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 11 Nov 2020 19:17:44 +0100
-Subject: [PATCH] mac80211: minstrel: remove deferred sampling code
-
-Deferring sampling attempts to the second stage has some bad interactions
-with drivers that process the rate table in hardware and use the probe flag
-to indicate probing packets (e.g. most mt76 drivers). On affected drivers
-it can lead to probing not working at all.
-
-If the link conditions turn worse, it might not be such a good idea to
-do a lot of sampling for lower rates in this case.
-
-Fix this by simply skipping the sample attempt instead of deferring it,
-but keep the checks that would allow it to be sampled if it was skipped
-too often, but only if it has less than 95% success probability.
-
-Also ensure that IEEE80211_TX_CTL_RATE_CTRL_PROBE is set for all probing
-packets.
-
-Cc: stable@vger.kernel.org
-Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rc80211_minstrel.c
-+++ b/net/mac80211/rc80211_minstrel.c
-@@ -287,12 +287,6 @@ minstrel_tx_status(void *priv, struct ie
- 			mi->r[ndx].stats.success += success;
- 	}
- 
--	if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))
--		mi->sample_packets++;
--
--	if (mi->sample_deferred > 0)
--		mi->sample_deferred--;
--
- 	if (time_after(jiffies, mi->last_stats_update +
- 				mp->update_interval / (mp->new_avg ? 2 : 1)))
- 		minstrel_update_stats(mp, mi);
-@@ -367,7 +361,7 @@ minstrel_get_rate(void *priv, struct iee
- 		return;
- 
- 	delta = (mi->total_packets * sampling_ratio / 100) -
--			(mi->sample_packets + mi->sample_deferred / 2);
-+			mi->sample_packets;
- 
- 	/* delta < 0: no sampling required */
- 	prev_sample = mi->prev_sample;
-@@ -376,7 +370,6 @@ minstrel_get_rate(void *priv, struct iee
- 		return;
- 
- 	if (mi->total_packets >= 10000) {
--		mi->sample_deferred = 0;
- 		mi->sample_packets = 0;
- 		mi->total_packets = 0;
- 	} else if (delta > mi->n_rates * 2) {
-@@ -401,19 +394,8 @@ minstrel_get_rate(void *priv, struct iee
- 	 * rate sampling method should be used.
- 	 * Respect such rates that are not sampled for 20 interations.
- 	 */
--	if (mrr_capable &&
--	    msr->perfect_tx_time > mr->perfect_tx_time &&
--	    msr->stats.sample_skipped < 20) {
--		/* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark
--		 * packets that have the sampling rate deferred to the
--		 * second MRR stage. Increase the sample counter only
--		 * if the deferred sample rate was actually used.
--		 * Use the sample_deferred counter to make sure that
--		 * the sampling is not done in large bursts */
--		info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
--		rate++;
--		mi->sample_deferred++;
--	} else {
-+	if (msr->perfect_tx_time < mr->perfect_tx_time ||
-+	    msr->stats.sample_skipped >= 20) {
- 		if (!msr->sample_limit)
- 			return;
- 
-@@ -433,6 +415,7 @@ minstrel_get_rate(void *priv, struct iee
- 
- 	rate->idx = mi->r[ndx].rix;
- 	rate->count = minstrel_get_retry_count(&mi->r[ndx], info);
-+	info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
- }
- 
- 
---- a/net/mac80211/rc80211_minstrel.h
-+++ b/net/mac80211/rc80211_minstrel.h
-@@ -126,7 +126,6 @@ struct minstrel_sta_info {
- 	u8 max_prob_rate;
- 	unsigned int total_packets;
- 	unsigned int sample_packets;
--	int sample_deferred;
- 
- 	unsigned int sample_row;
- 	unsigned int sample_column;
diff --git a/package/kernel/mac80211/patches/subsys/335-mac80211-minstrel-fix-tx-status-processing-corner-ca.patch b/package/kernel/mac80211/patches/subsys/335-mac80211-minstrel-fix-tx-status-processing-corner-ca.patch
deleted file mode 100644
index b1c339a1e60b..000000000000
--- a/package/kernel/mac80211/patches/subsys/335-mac80211-minstrel-fix-tx-status-processing-corner-ca.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 11 Nov 2020 19:25:39 +0100
-Subject: [PATCH] mac80211: minstrel: fix tx status processing corner case
-
-Some drivers fill the status rate list without setting the rate index after
-the final rate to -1. minstrel_ht already deals with this, but minstrel
-doesn't, which causes it to get stuck at the lowest rate on these drivers.
-
-Fix this by checking the count as well.
-
-Cc: stable@vger.kernel.org
-Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/rc80211_minstrel.c
-+++ b/net/mac80211/rc80211_minstrel.c
-@@ -274,7 +274,7 @@ minstrel_tx_status(void *priv, struct ie
- 	success = !!(info->flags & IEEE80211_TX_STAT_ACK);
- 
- 	for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
--		if (ar[i].idx < 0)
-+		if (ar[i].idx < 0 || !ar[i].count)
- 			break;
- 
- 		ndx = rix_to_ndx(mi, ar[i].idx);
diff --git a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch
index 6abf3a126188..683c9950d63c 100644
--- a/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch
+++ b/package/kernel/mac80211/patches/subsys/500-mac80211_configure_antenna_gain.patch
@@ -1,6 +1,6 @@
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -3610,6 +3610,7 @@ struct mgmt_frame_regs {
+@@ -3637,6 +3637,7 @@ struct mgmt_frame_regs {
   *	(as advertised by the nl80211 feature flag.)
   * @get_tx_power: store the current TX power into the dbm variable;
   *	return 0 if successful
@@ -8,7 +8,7 @@
   *
   * @set_wds_peer: set the WDS peer for a WDS interface
   *
-@@ -3932,6 +3933,7 @@ struct cfg80211_ops {
+@@ -3959,6 +3960,7 @@ struct cfg80211_ops {
  				enum nl80211_tx_power_setting type, int mbm);
  	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  				int *dbm);
@@ -18,7 +18,7 @@
  				const u8 *addr);
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
-@@ -1521,6 +1521,7 @@ enum ieee80211_smps_mode {
+@@ -1524,6 +1524,7 @@ enum ieee80211_smps_mode {
   *
   * @power_level: requested transmit power (in dBm), backward compatibility
   *	value only that is set to the minimum of all interfaces
@@ -26,7 +26,7 @@
   *
   * @chandef: the channel definition to tune to
   * @radar_enabled: whether radar detection is enabled
-@@ -1541,6 +1542,7 @@ enum ieee80211_smps_mode {
+@@ -1544,6 +1545,7 @@ enum ieee80211_smps_mode {
  struct ieee80211_conf {
  	u32 flags;
  	int power_level, dynamic_ps_timeout;
@@ -36,7 +36,7 @@
  	u8 ps_dtim_period;
 --- a/include/uapi/linux/nl80211.h
 +++ b/include/uapi/linux/nl80211.h
-@@ -2505,6 +2505,9 @@ enum nl80211_commands {
+@@ -2515,6 +2515,9 @@ enum nl80211_commands {
   * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
   *	association request when used with NL80211_CMD_NEW_STATION).
   *
@@ -46,7 +46,7 @@
   * @NUM_NL80211_ATTR: total number of nl80211_attrs available
   * @NL80211_ATTR_MAX: highest attribute number currently defined
   * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -2987,6 +2990,8 @@ enum nl80211_attrs {
+@@ -2997,6 +3000,8 @@ enum nl80211_attrs {
  
  	NL80211_ATTR_HE_6GHZ_CAPABILITY,
  
@@ -57,7 +57,7 @@
  	__NL80211_ATTR_AFTER_LAST,
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -2612,6 +2612,19 @@ static int ieee80211_get_tx_power(struct
+@@ -2619,6 +2619,19 @@ static int ieee80211_get_tx_power(struct
  	return 0;
  }
  
@@ -77,7 +77,7 @@
  static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  				  const u8 *addr)
  {
-@@ -4042,6 +4055,7 @@ const struct cfg80211_ops mac80211_confi
+@@ -4049,6 +4062,7 @@ const struct cfg80211_ops mac80211_confi
  	.set_wiphy_params = ieee80211_set_wiphy_params,
  	.set_tx_power = ieee80211_set_tx_power,
  	.get_tx_power = ieee80211_get_tx_power,
@@ -87,7 +87,7 @@
  	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1383,6 +1383,7 @@ struct ieee80211_local {
+@@ -1386,6 +1386,7 @@ struct ieee80211_local {
  	int dynamic_ps_forced_timeout;
  
  	int user_power_level; /* in dBm, for all interfaces */
