[openwrt/openwrt] mac80211: Update to version 5.9.12-1

LEDE Commits lede-commits at lists.infradead.org
Sun Feb 14 09:54:31 EST 2021


hauke pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/bf6f7cf29bdbf1fcd1176184d759d2a51a17b730

commit bf6f7cf29bdbf1fcd1176184d759d2a51a17b730
Author: Hauke Mehrtens <hauke at hauke-m.de>
AuthorDate: Sat Nov 7 17:50:20 2020 +0100

    mac80211: Update to version 5.9.12-1
    
    The removed patches were applied upstream.
    
    Remove the 300-mac80211-optimize-skb-resizing.patch.
    This patch was not applied upstream, but it conflicts with upstream
    changes and needs bigger changes. It was applied with Felix to remove
    this patch for now. It should be reworked and then send upstream later.
    
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 package/kernel/mac80211/Makefile                   |   8 +-
 .../patches/ath/404-regd_no_assoc_hints.patch      |   4 +-
 .../ath/930-ath10k_add_tpt_led_trigger.patch       |   4 +-
 .../975-ath10k-use-tpt-trigger-by-default.patch    |   2 +-
 .../ath/980-ath10k-fix-max-antenna-gain-unit.patch |   6 +-
 ...st-tx-power-reduction-for-US-regulatory-d.patch |   8 +-
 ...mfmac-register-wiphy-s-during-module_init.patch |   2 +-
 .../862-brcmfmac-Disable-power-management.patch    |   2 +-
 ...c-add-in-driver-tables-with-country-codes.patch |   2 +-
 .../kernel/mac80211/patches/brcm/998-survey.patch  |  12 +-
 .../mac80211/patches/build/015-ipw200-mtu.patch    |   4 +-
 .../patches/build/060-no_local_ssb_bcma.patch      |   8 +-
 .../rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch |   2 +-
 .../070-backports-add-netif_receive_skb_list.patch |  30 ---
 .../071-backports-add-skb_list_del_init.patch      |  24 ---
 .../072-backports-add-sched_set_fifo_low.patch     |  32 ----
 ...ports-backport-tasklet_setup-from_tasklet.patch |  35 ----
 .../subsys/100-remove-cryptoapi-dependencies.patch |   4 +-
 .../subsys/110-mac80211_keep_keys_on_stop_ap.patch |   2 +-
 .../mac80211/patches/subsys/210-ap_scan.patch      |   2 +-
 .../300-mac80211-optimize-skb-resizing.patch       | 201 ---------------------
 ...a-randomize-BA-session-dialog-token-alloc.patch |   2 +-
 ...ac80211-improve-AQL-tx-airtime-estimation.patch |  81 ---------
 ...d-a-function-for-running-rx-without-passi.patch | 186 -------------------
 ...-use-skb_get_hash-instead-of-skb_get_hash.patch |  55 ------
 ...calculcate-skb-hash-early-when-using-itxq.patch |  19 --
 ...e-rate-provided-via-status-rate-on-ieee80.patch | 151 ----------------
 ...ctor-out-code-to-look-up-the-average-pack.patch | 187 -------------------
 ...prove-AQL-aggregation-estimation-for-low-.patch |  67 -------
 ...d-missing-queue-hash-initialization-to-80.patch |  25 ---
 ...eck-and-refresh-aggregation-session-in-en.patch |   4 +-
 ...ip-encap-offload-for-tx-multicast-control.patch |   6 +-
 ...t-info-control.hw_key-for-encap-offload-p.patch |   4 +-
 ...80211-rework-tx-encapsulation-offload-API.patch |  52 +++---
 ...reduce-duplication-in-tx-status-functions.patch |  20 +-
 ...move-tx-status-call-to-ieee80211_sta_regi.patch |   2 +-
 ...80211-optimize-station-connection-monitor.patch |  12 +-
 ...ap-NEED_TXPROCESSING-and-HW_80211_ENCAP-t.patch |  32 ++--
 ...ify-802.3-offload-and-802.11-tx-status-co.patch |  12 +-
 ...pport-using-ieee80211_tx_status_ext-to-fr.patch |   6 +-
 ...tend-ieee80211_tx_status_ext-to-support-b.patch |   6 +-
 ...tify-the-driver-when-a-sta-uses-4-address.patch |  12 +-
 ...organize-code-to-remove-a-forward-declara.patch |  46 +++--
 ...tend-AQL-aggregation-estimation-to-HE-and.patch |  49 -----
 ...80211-add-AQL-support-for-VHT160-tx-rates.patch |  23 ---
 ...-fix-regression-in-sta-connection-monitor.patch |   6 +-
 ...x-memory-leak-on-filtered-powersave-frame.patch |   4 +-
 ...11-minstrel-remove-deferred-sampling-code.patch |  96 ----------
 ...nstrel-fix-tx-status-processing-corner-ca.patch |  26 ---
 ...-not-drop-tx-nulldata-packets-on-encrypte.patch |   2 +-
 ...nstrel_ht-improve-ampdu-length-estimation.patch |   6 +-
 ...nstrel_ht-significantly-redesign-the-rate.patch |  16 +-
 .../500-mac80211_configure_antenna_gain.patch      |  18 +-
 53 files changed, 177 insertions(+), 1450 deletions(-)

diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
index 096225754c..283e1798b2 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-1
-PKG_RELEASE:=5
-PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.8.18/
-PKG_HASH:=f04a8172423c6a945fc7d9844b04f33fda9ae574e552f8f18ee3bdfcfb494563
+PKG_VERSION:=5.9.12-1
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.9.12/
+PKG_HASH:=8cf3f23152a787eeec2df1d7b38a559b0d89bdc823d9ac99175a4eb76d2b619e
 
 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 020e2bbab5..646389a353 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 2b36a559d6..0abd66f85e 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 db9a88e000..dbd3be79e1 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 at 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 9498e02462..4c1963b828 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 fbb6fad660..ace2fd5481 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 1b965087d3..c18a5bfa4a 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 at 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 91bf464ede..bf8343790d 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 at 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 2613171a86..9658bda1c1 100644
--- a/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch
+++ b/package/kernel/mac80211/patches/brcm/863-brcmfmac-add-in-driver-tables-with-country-codes.patch
@@ -49,7 +49,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
  void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
  		    struct brcmf_mp_device *settings)
  {
-@@ -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 7feca97e9f..1c5255cce0 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 68db4f72d3..f80fda4360 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 c00ab7c786..1958ddad7d 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 da76b34fab..b6934d3954 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 b26a6bc389..0000000000
--- a/package/kernel/mac80211/patches/subsys/070-backports-add-netif_receive_skb_list.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Felix Fietkau <nbd at 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 at 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 ee7e63498a..0000000000
--- a/package/kernel/mac80211/patches/subsys/071-backports-add-skb_list_del_init.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Felix Fietkau <nbd at 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 at 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 9b266ffcb3..0000000000
--- a/package/kernel/mac80211/patches/subsys/072-backports-add-sched_set_fifo_low.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Felix Fietkau <nbd at 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 at 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 486d10ea58..0000000000
--- a/package/kernel/mac80211/patches/subsys/073-backports-backport-tasklet_setup-from_tasklet.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Felix Fietkau <nbd at 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 at 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 a94f9d8fdb..3c699dc648 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 2333ca2dad..0033837ce7 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 fccb1ebffa..c7da15fffc 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
deleted file mode 100644
index cb70670e52..0000000000
--- a/package/kernel/mac80211/patches/subsys/300-mac80211-optimize-skb-resizing.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Sun, 17 Mar 2019 18:11:30 +0100
-Subject: [PATCH] mac80211: optimize skb resizing
-
-When forwarding unicast packets from ethernet to batman-adv over 802.11s
-(with forwarding disabled), the typical required headroom to transmit
-encrypted packets on mt76 is 32 (802.11) + 6 (802.11s) + 8 (CCMP) +
-2 (padding) + 6 (LLC) + 18 (batman-adv) - 14 (old ethernet header) = 58 bytes.
-
-On systems where NET_SKB_PAD is 64 this leads to a call to pskb_expand_head
-for every packet, since mac80211 also tries to allocate 16 bytes status
-headroom for radiotap headers.
-
-This patch fixes these unnecessary reallocations by only requiring the extra
-status headroom in ieee80211_tx_monitor()
-If however a reallocation happens before that call, the status headroom gets
-added there as well, in order to avoid double reallocation.
-
-The patch also cleans up the code by moving the headroom calculation to
-ieee80211_skb_resize.
-
-Signed-off-by: Felix Fietkau <nbd at 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
- 			      u64 *cookie);
- int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
- 			      const u8 *buf, size_t len);
-+int ieee80211_skb_resize(struct ieee80211_local *local,
-+			 struct ieee80211_sub_if_data *sdata,
-+			 struct sk_buff *skb, int hdrlen, int hdr_add);
- 
- /* HT */
- 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
- 	struct net_device *prev_dev = NULL;
- 	int rtap_len;
- 
-+	if (ieee80211_skb_resize(local, NULL, skb, 0, 0)) {
-+		dev_kfree_skb(skb);
-+		return;
-+	}
-+
- 	/* send frame to monitor interfaces now */
- 	rtap_len = ieee80211_tx_radiotap_len(info, status);
- 	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
- }
- 
- /* device xmit handlers */
--
--static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
--				struct sk_buff *skb,
--				int head_need, bool may_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));
--
--	if (enc_tailroom) {
--		tail_need = IEEE80211_ENCRYPT_TAILROOM;
--		tail_need -= skb_tailroom(skb);
--		tail_need = max_t(int, tail_need, 0);
-+	int head_need, head_max;
-+	int tail_need, tail_max;
-+	bool enc_tailroom = false;
-+
-+	if (sdata && !hdr_len &&
-+	    !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) {
-+		hdr = (struct ieee80211_hdr *) skb->data;
-+		enc_tailroom = (sdata->crypto_tx_tailroom_needed_cnt ||
-+				ieee80211_is_mgmt(hdr->frame_control));
-+		hdr_len += sdata->encrypt_headroom;
-+	}
-+
-+	head_need = head_max = hdr_len;
-+	tail_need = tail_max = 0;
-+	if (!sdata) {
-+		head_need = head_max = local->tx_headroom;
-+	} else {
-+		head_max += hdr_extra;
-+		head_max += max_t(int, local->tx_headroom,
-+				  local->hw.extra_tx_headroom);
-+		head_need += local->hw.extra_tx_headroom;
-+
-+		tail_max = IEEE80211_ENCRYPT_TAILROOM;
-+		if (enc_tailroom)
-+			tail_need = tail_max;
- 	}
- 
- 	if (skb_cloned(skb) &&
- 	    (!ieee80211_hw_check(&local->hw, SUPPORTS_CLONED_SKBS) ||
- 	     !skb_clone_writable(skb, ETH_HLEN) || enc_tailroom))
- 		I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
--	else if (head_need || tail_need)
-+	else if (head_need > skb_headroom(skb) ||
-+		 tail_need > skb_tailroom(skb))
- 		I802_DEBUG_INC(local->tx_expand_skb_head);
- 	else
- 		return 0;
- 
--	if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) {
-+	head_max = max_t(int, 0, head_max - skb_headroom(skb));
-+	tail_max = max_t(int, 0, tail_max - skb_tailroom(skb));
-+
-+	if (pskb_expand_head(skb, head_max, tail_max, GFP_ATOMIC)) {
- 		wiphy_debug(local->hw.wiphy,
- 			    "failed to reallocate TX buffer\n");
- 		return -ENOMEM;
-@@ -1983,18 +1999,8 @@ 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;
--	int headroom;
--	bool may_encrypt;
--
--	may_encrypt = !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT);
- 
--	headroom = local->tx_headroom;
--	if (may_encrypt)
--		headroom += sdata->encrypt_headroom;
--	headroom -= skb_headroom(skb);
--	headroom = max_t(int, 0, headroom);
--
--	if (ieee80211_skb_resize(sdata, skb, headroom, may_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
- 	}
- 
- 	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
--	 * the needed header space that we don't need right away. If we
--	 * can, then we don't reallocate right now but only after the
--	 * frame arrives at the master device (if it does...)
--	 *
--	 * If we cannot, however, then we will reallocate to include all
--	 * the ever needed space. Also, if we need to reallocate it anyway,
--	 * make it big enough for everything we may ever need.
--	 */
--
--	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)) {
--			ieee80211_free_txskb(&local->hw, skb);
--			skb = NULL;
--			return ERR_PTR(-ENOMEM);
--		}
-+	if (ieee80211_skb_resize(local, sdata, skb, head_need,
-+				 sdata->encrypt_headroom)) {
-+		ieee80211_free_txskb(&local->hw, skb);
-+		skb = NULL;
-+		return ERR_PTR(-ENOMEM);
- 	}
- 
- 	if (encaps_data)
-@@ -3446,7 +3436,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);
--	int hw_headroom = sdata->local->hw.extra_tx_headroom;
- 	struct ethhdr eth;
- 	struct ieee80211_tx_info *info;
- 	struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-@@ -3498,10 +3487,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))) {
-+	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 10d8ad8d71..d09d70725e 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 at 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 bee43a60fa..0000000000
--- a/package/kernel/mac80211/patches/subsys/305-mac80211-improve-AQL-tx-airtime-estimation.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From: Felix Fietkau <nbd at 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 at 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 802d57497c..0000000000
--- 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 at 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 at 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 77ecc82302..0000000000
--- 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 at 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 at 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 92b136279a..0000000000
--- 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 at 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 at 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 ee1db716e0..0000000000
--- 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 at 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 at 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 06db852c30..0000000000
--- 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 at 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 at 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 a5df07e58d..0000000000
--- 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 at 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 at 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 eb56a2cac5..0000000000
--- 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 at 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 at 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 e411d59722..d121eec88e 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 at 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 at 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 6dce21db1e..e8763e6237 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 at 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 at 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 at 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 cb5a986312..077a82d5ee 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 at 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 at 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 7593c41da0..811c66499b 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 e13723b160..83522a7541 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 168d6458a5..9bd1765b16 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 at 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 f8287c53a7..48d7686863 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 at 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 at 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 at 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 at 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 at 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 at 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 8505ce56f6..d62621ca77 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 7bb54f499b..62bb917184 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 at 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 at 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 at 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 at 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 at 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 at 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 5469a419bf..ffb89a4d4a 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 at 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 at 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 at 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 e8b29bb4c5..b5dcb0b013 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 at 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 at 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 at 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 aa166c6431..f38afc7912 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 at 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 at 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 at 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 at 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 at 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 at 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 a3d600152c..0bfb10cdb0 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 3d687f8341..0000000000
--- 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 at 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 at 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 e22a09e711..0000000000
--- 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 at 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 at 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 cff8045c05..93a9eca51f 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 at 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 at 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 at 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 cdbbcf5d06..e518f5134f 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 at 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 at 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 e3a877fb94..0000000000
--- a/package/kernel/mac80211/patches/subsys/334-mac80211-minstrel-remove-deferred-sampling-code.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-From: Felix Fietkau <nbd at 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 at vger.kernel.org
-Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
-Signed-off-by: Felix Fietkau <nbd at 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 b1c339a1e6..0000000000
--- 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 at 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 at vger.kernel.org
-Fixes: cccf129f820e ("mac80211: add the 'minstrel' rate control algorithm")
-Signed-off-by: Felix Fietkau <nbd at 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/336-mac80211-do-not-drop-tx-nulldata-packets-on-encrypte.patch b/package/kernel/mac80211/patches/subsys/336-mac80211-do-not-drop-tx-nulldata-packets-on-encrypte.patch
index 378c37455d..d3fb3875f6 100644
--- a/package/kernel/mac80211/patches/subsys/336-mac80211-do-not-drop-tx-nulldata-packets-on-encrypte.patch
+++ b/package/kernel/mac80211/patches/subsys/336-mac80211-do-not-drop-tx-nulldata-packets-on-encrypte.patch
@@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -657,7 +657,7 @@ ieee80211_tx_h_select_key(struct ieee802
+@@ -658,7 +658,7 @@ ieee80211_tx_h_select_key(struct ieee802
  		if (!skip_hw && tx->key &&
  		    tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
  			info->control.hw_key = &tx->key->conf;
diff --git a/package/kernel/mac80211/patches/subsys/341-mac80211-minstrel_ht-improve-ampdu-length-estimation.patch b/package/kernel/mac80211/patches/subsys/341-mac80211-minstrel_ht-improve-ampdu-length-estimation.patch
index f450ca9ca9..a8e6e89954 100644
--- a/package/kernel/mac80211/patches/subsys/341-mac80211-minstrel_ht-improve-ampdu-length-estimation.patch
+++ b/package/kernel/mac80211/patches/subsys/341-mac80211-minstrel_ht-improve-ampdu-length-estimation.patch
@@ -27,8 +27,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 -	if (!mi->avg_ampdu_len)
 -		return AVG_AMPDU_SIZE;
 +	int duration;
- 
--	return MINSTREL_TRUNC(mi->avg_ampdu_len);
++
 +	if (mi->avg_ampdu_len)
 +		return MINSTREL_TRUNC(mi->avg_ampdu_len);
 +
@@ -36,7 +35,8 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 +		return 1;
 +
 +	duration = minstrel_get_duration(mi->max_tp_rate[0]);
-+
+ 
+-	return MINSTREL_TRUNC(mi->avg_ampdu_len);
 +	if (duration > 400 * 1000)
 +		return 2;
 +
diff --git a/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch b/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch
index 7af13661a8..09f6fd2214 100644
--- a/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch
+++ b/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch
@@ -179,14 +179,14 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 +	if (!rate)
  		return;
 -	}
- 
+-
 -	i = 0;
 -	if (n_rates > 1) {
 -		random = prandom_u32();
 -		i = random % n_rates;
 -	}
 -	probe_rate = rates[i];
--
+ 
 -out:
 -	mi->sample_rate = probe_rate;
 +	mi->sample_rate = rate;
@@ -584,13 +584,13 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 -
 -	if (!(mi->supported[sample_group] & BIT(sample_idx)))
 -		return -1;
--
++	u8 seq;
+ 
 -	mrs = &mg->rates[sample_idx];
 -	sample_idx += MI_RATE(sample_group, 0);
 -
 -	tp_rate1 = mi->max_tp_rate[0];
-+	u8 seq;
- 
+-
 -	/* Set tp_rate2 to the second highest max_tp_rate */
 -	if (minstrel_get_duration(mi->max_tp_rate[0]) >
 -	    minstrel_get_duration(mi->max_tp_rate[1])) {
@@ -673,8 +673,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 -	else
 -		sample_idx = minstrel_get_sample_rate(mp, mi);
 +		return;
- 
--	if (sample_idx < 0)
++
 +	if (mp->hw->max_rates == 1 && mp->sample_switch &&
 +	    (mi->total_packets_cur >= SAMPLE_SWITCH_THR ||
 +	     mp->sample_switch == 1))
@@ -682,7 +681,8 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
 +
 +	if (time_is_before_jiffies(mi->sample_time))
 +		return;
-+
+ 
+-	if (sample_idx < 0)
 +	mi->sample_time = jiffies + MINSTREL_SAMPLE_INTERVAL;
 +	sample_idx = minstrel_ht_get_sample_rate(mp, mi);
 +	if (!sample_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 6abf3a1261..683c9950d6 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 */



More information about the lede-commits mailing list