diff --git a/patches/openwrt/a-new-kernel-5.15/0005-Backport-mac80211.patch b/patches/openwrt/a-new-kernel-5.15/0005-Backport-mac80211.patch
index 755d26b72dc6ed89e6ff42bd4a7e432f104a7197..e88c3330ac6a7ef75c70975c76a66d65e43ceb6c 100644
--- a/patches/openwrt/a-new-kernel-5.15/0005-Backport-mac80211.patch
+++ b/patches/openwrt/a-new-kernel-5.15/0005-Backport-mac80211.patch
@@ -1,16 +1,15 @@
-From 2a59f03f5b7dd12b68e9bf16cec2975b7edea342 Mon Sep 17 00:00:00 2001
+From 799d3b4ffc93e40d00516906b4878ed8c281f666 Mon Sep 17 00:00:00 2001
 From: Josef Schlehofer <pepe.schlehofer@gmail.com>
-Date: Sun, 4 Dec 2022 10:17:20 +0100
-Subject: [PATCH] mac80211: downgrade to version 5.15.81
+Date: Thu, 8 Dec 2022 11:25:51 +0100
+Subject: [PATCH] mac80211: update to 5.15.81 version
 
 ---
- package/kernel/mac80211/Makefile              |   38 +-
- package/kernel/mac80211/ath.mk                |    7 +-
- package/kernel/mac80211/broadcom.mk           |    5 +-
+ package/kernel/mac80211/Makefile              |   36 +-
+ package/kernel/mac80211/ath.mk                |    4 +-
+ package/kernel/mac80211/broadcom.mk           |    4 +-
  .../mac80211/files/lib/netifd/mac80211.sh     |   36 -
- .../files/lib/netifd/wireless/mac80211.sh     |   20 +-
+ .../files/lib/netifd/wireless/mac80211.sh     |    7 +-
  .../mac80211/files/lib/wifi/mac80211.sh       |    5 +-
- package/kernel/mac80211/intel.mk              |    2 +-
  .../patches/ath/120-owl-loader-compat.patch   |   53 -
  .../patches/ath/402-ath_regd_optional.patch   |    8 +-
  .../patches/ath/404-regd_no_assoc_hints.patch |    4 +-
@@ -18,10 +17,6 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  .../ath/550-ath9k-disable-bands-via-dt.patch  |   15 -
  ...h10k-increase-rx-buffer-size-to-2048.patch |   37 -
  .../080-ath10k_thermal_config.patch           |    2 +-
- ...1-ath10k-improve-tx-status-reporting.patch |   69 +
- ...-ath10k-turn-rawmode-into-frame-mode.patch |   74 +
- ...-do-not-interpret-Eth-frames-as-WiFi.patch |  163 ++
- ...add-encapsulation-offloading-support.patch |  194 +++
  ...us-and-device-specific-API-1-BDF-sel.patch |   65 +
  ...calibration-data-via-nvmem-subsystem.patch |  162 ++
  ...21-ath10k_init_devices_synchronously.patch |    2 +-
@@ -67,37 +62,41 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  .../553-ath9k_of_gpio_mask.patch              |    4 +-
  ...calibration-data-via-nvmem-subsystem.patch |  154 ++
  ...-fetch-pci-init-values-through-nvmem.patch |  181 +++
- ...etting-wlan-MAC-address-using-device.patch |  103 ++
  .../brcm/812-b43-add-antenna-control.patch    |    8 +-
  ...-register-wiphy-s-during-module_init.patch |   18 +-
  ...62-brcmfmac-Disable-power-management.patch |    2 +-
  ...-in-driver-tables-with-country-codes.patch |   12 +-
- ...d-alternative-firmware-names-from-DT.patch |  196 +++
  .../mac80211/patches/brcm/998-survey.patch    |   12 +-
  .../build/003-remove_bogus_modparams.patch    |    2 +-
  .../build/004-kconfig_backport_fix.patch      |   28 -
  .../patches/build/010-disable_rfkill.patch    |   15 -
  .../patches/build/060-no_local_ssb_bcma.patch |   18 +-
  ...700-mwl8k-missing-pci-id-for-WNR854T.patch |    2 +-
- ...crease-the-global-limit-up-to-4-SSID.patch |   41 +
  ...940-mwl8k_init_devices_synchronously.patch |    4 +-
- ...ringified-name-of-command-in-error-l.patch |  189 +++
- ...define-RF5592-in-init_eeprom-routine.patch |    2 +-
- .../602-rt2x00-introduce-rt2x00eeprom.patch   |   10 +-
+ ...define-RF5592-in-init_eeprom-routine.patch |   52 +
+ ...02-rt2x00-add-throughput-LED-trigger.patch |   76 +
+ ...define-RF5592-in-init_eeprom-routine.patch |   51 -
+ ...d-support-for-external-PA-on-MT7620.patch} |   72 +-
+ ...ove-up-and-reuse-busy-wait-functions.patch |  178 +++
+ ...RF-self-TXDC-calibration-for-MT7620.patch} |   61 +-
+ ...rt2x00-add-r-calibration-for-MT7620.patch} |   93 +-
+ ...0-add-RXDCOC-calibration-for-MT7620.patch} |   62 +-
+ ...x00-add-RXIQ-calibration-for-MT7620.patch} |  285 ++--
+ ...-add-TX-LOFT-calibration-for-MT7620.patch} |  277 ++--
+ ...x00-move-helper-functions-up-in-file.patch |   94 ++
+ ...HT20-HT40-bandwidth-switch-on-MT7620.patch |   56 +
+ .../602-rt2x00-introduce-rt2x00eeprom.patch   |   16 +-
+ .../603-rt2x00-of_load_eeprom_filename.patch  |    6 +-
  ...isabling_bands_through_platform_data.patch |    4 +-
  ...07-rt2x00-add_platform_data_mac_addr.patch |   11 +-
  ...00-allow_disabling_bands_through_dts.patch |    2 +-
  ...0-rt2x00-change-led-polarity-from-OF.patch |    2 +-
  .../611-rt2x00-add-AP+STA-support.patch       |    2 +-
- .../612-rt2x00-led-tpt-trigger-support.patch  |    4 +-
- ...dd-support-for-external-PA-on-MT7620.patch |    8 +-
- ...-rt2x00-add-rf-self-txdc-calibration.patch |    4 +-
- .../rt2x00/983-rt2x00-add-r-calibration.patch |    4 +-
- .../984-rt2x00-add-rxdcoc-calibration.patch   |    4 +-
- .../985-rt2x00-add-rxiq-calibration.patch     |    4 +-
- .../986-rt2x00-add-TX-LOFT-calibration.patch  |    4 +-
- ...-differentiate-based-on-SoC-CHIP_VER.patch |   20 +-
+ .../612-rt2x00-led-tpt-trigger-support.patch  |   44 -
  ...ave-survey-for-every-channel-visited.patch |  183 ---
+ ...t-support-for-external-LNA-on-MT7620.patch |  161 ++
+ ...uce-accessors-for-CHIP_VER-register.patch} |    0
+ ...differentiate-based-on-SoC-CHIP_VER.patch} |   24 +-
  ...ent-set_tim-by-update-beacon-content.patch |  118 --
  .../patches/subsys/010-sync-nl80211_h.patch   |  297 ----
  .../100-remove-cryptoapi-dependencies.patch   |  699 ---------
@@ -151,16 +150,22 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  ...-multicast-packets-from-AQL-pending-.patch |   30 +
  ...-remove-legacy-minstrel-rate-control.patch | 1328 -----------------
  ...l_ht-remove-old-ewma-based-rate-aver.patch |   96 --
+ ...-not-abuse-fq.lock-in-ieee80211_do_s.patch |   46 +
+ ...dlock-Don-t-start-TX-while-holding-f.patch |   40 +
  ...l_ht-improve-ampdu-length-estimation.patch |   67 -
+ ...vif-queues-are-operational-after-sta.patch |   47 +
  ...rel_ht-improve-sample-rate-selection.patch |   31 -
  ...l_ht-fix-max-probability-rate-select.patch |  124 --
+ ...x-decap-offload-for-stations-on-AP_V.patch |   37 +
  ...el_ht-increase-stats-update-interval.patch |   20 -
+ ...x-ieee80211_data_to_8023_exthdr-hand.patch |   99 ++
  ...l_ht-fix-rounding-error-in-throughpu.patch |   34 -
+ ...-not-drop-packets-smaller-than-the-L.patch |   25 +
  ...l_ht-use-bitfields-to-encode-rate-in.patch |  412 -----
+ ...x-mesh-airtime-link-metric-estimatin.patch |   36 +
  ...l_ht-update-total-packets-counter-in.patch |   54 -
  ...l_ht-reduce-the-need-to-sample-slowe.patch |  102 --
  ...l_ht-significantly-redesign-the-rate.patch |  767 ----------
- .../subsys/350-bss-color-collision.patch      |  118 ++
  ...el_ht-show-sampling-rates-in-debugfs.patch |   58 -
  ...l_ht-remove-sample-rate-switching-co.patch |  279 ----
  ...l_ht-fix-regression-in-the-max_prob_.patch |   23 -
@@ -190,18 +195,13 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  .../patches/subsys/400-allow-ibss-mixed.patch |    2 +-
  .../500-mac80211_configure_antenna_gain.patch |   66 +-
  ...the-dst-buffer-to-of_get_mac_address.patch |   29 +
- .../patches/subsys/783-sync-nl80211.patch     |   22 +
  package/kernel/mac80211/realtek.mk            |   18 +
- 188 files changed, 7086 insertions(+), 13056 deletions(-)
+ 192 files changed, 7352 insertions(+), 13474 deletions(-)
  delete mode 100644 package/kernel/mac80211/files/lib/netifd/mac80211.sh
  delete mode 100644 package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch
  delete mode 100644 package/kernel/mac80211/patches/ath/550-ath9k-disable-bands-via-dt.patch
  delete mode 100644 package/kernel/mac80211/patches/ath/922-ath10k-increase-rx-buffer-size-to-2048.patch
  rename package/kernel/mac80211/patches/{ath => ath10k}/080-ath10k_thermal_config.patch (97%)
- create mode 100644 package/kernel/mac80211/patches/ath10k/081-01-ath10k-improve-tx-status-reporting.patch
- create mode 100644 package/kernel/mac80211/patches/ath10k/081-02-ath10k-turn-rawmode-into-frame-mode.patch
- create mode 100644 package/kernel/mac80211/patches/ath10k/081-03-ath10k-htt-tx-do-not-interpret-Eth-frames-as-WiFi.patch
- create mode 100644 package/kernel/mac80211/patches/ath10k/081-04-ath10k-add-encapsulation-offloading-support.patch
  create mode 100644 package/kernel/mac80211/patches/ath10k/100-ath10k-support-bus-and-device-specific-API-1-BDF-sel.patch
  create mode 100644 package/kernel/mac80211/patches/ath10k/120-ath10k-fetch-calibration-data-via-nvmem-subsystem.patch
  rename package/kernel/mac80211/patches/{ath => ath10k}/921-ath10k_init_devices_synchronously.patch (94%)
@@ -247,13 +247,25 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  rename package/kernel/mac80211/patches/{ath => ath9k}/553-ath9k_of_gpio_mask.patch (80%)
  create mode 100644 package/kernel/mac80211/patches/ath9k/600-v5.16-ath9k-fetch-calibration-data-via-nvmem-subsystem.patch
  create mode 100644 package/kernel/mac80211/patches/ath9k/601-v5.16-ath9k-owl-loader-fetch-pci-init-values-through-nvmem.patch
- create mode 100644 package/kernel/mac80211/patches/brcm/001-brcmfmac-allow-setting-wlan-MAC-address-using-device.patch
- create mode 100644 package/kernel/mac80211/patches/brcm/865-brcmfmac-Read-alternative-firmware-names-from-DT.patch
  delete mode 100644 package/kernel/mac80211/patches/build/004-kconfig_backport_fix.patch
  delete mode 100644 package/kernel/mac80211/patches/build/010-disable_rfkill.patch
- create mode 100644 package/kernel/mac80211/patches/mwl/900-mwifiex-increase-the-global-limit-up-to-4-SSID.patch
- create mode 100644 package/kernel/mac80211/patches/mwl/950-mwifiex-Print-stringified-name-of-command-in-error-l.patch
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch
+ delete mode 100644 package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch
+ rename package/kernel/mac80211/patches/rt2x00/{650-rt2x00-add-support-for-external-PA-on-MT7620.patch => 003-rt2x00-add-support-for-external-PA-on-MT7620.patch} (58%)
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch
+ rename package/kernel/mac80211/patches/rt2x00/{982-rt2x00-add-rf-self-txdc-calibration.patch => 005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch} (51%)
+ rename package/kernel/mac80211/patches/rt2x00/{983-rt2x00-add-r-calibration.patch => 006-rt2x00-add-r-calibration-for-MT7620.patch} (66%)
+ rename package/kernel/mac80211/patches/rt2x00/{984-rt2x00-add-rxdcoc-calibration.patch => 007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch} (50%)
+ rename package/kernel/mac80211/patches/rt2x00/{985-rt2x00-add-rxiq-calibration.patch => 008-rt2x00-add-RXIQ-calibration-for-MT7620.patch} (63%)
+ rename package/kernel/mac80211/patches/rt2x00/{986-rt2x00-add-TX-LOFT-calibration.patch => 010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch} (84%)
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch
+ delete mode 100644 package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch
  delete mode 100644 package/kernel/mac80211/patches/rt2x00/992-rt2x00-save-survey-for-every-channel-visited.patch
+ create mode 100644 package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
+ rename package/kernel/mac80211/patches/rt2x00/{990-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch => 995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch} (100%)
+ rename package/kernel/mac80211/patches/rt2x00/{991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch => 996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch} (95%)
  delete mode 100644 package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/010-sync-nl80211_h.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/100-remove-cryptoapi-dependencies.patch
@@ -303,16 +315,22 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  create mode 100644 package/kernel/mac80211/patches/subsys/339-mac80211-exclude-multicast-packets-from-AQL-pending-.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/339-mac80211-remove-legacy-minstrel-rate-control.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/340-mac80211-minstrel_ht-remove-old-ewma-based-rate-aver.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/341-mac80211-minstrel_ht-improve-ampdu-length-estimation.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/342-mac80211-minstrel_ht-improve-sample-rate-selection.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/343-mac80211-minstrel_ht-fix-max-probability-rate-select.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/344-mac80211-minstrel_ht-increase-stats-update-interval.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/345-mac80211-minstrel_ht-fix-rounding-error-in-throughpu.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/346-mac80211-minstrel_ht-use-bitfields-to-encode-rate-in.patch
+ create mode 100644 package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/350-bss-color-collision.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/350-mac80211-minstrel_ht-show-sampling-rates-in-debugfs.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/351-mac80211-minstrel_ht-remove-sample-rate-switching-co.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/352-mac80211-minstrel_ht-fix-regression-in-the-max_prob_.patch
@@ -340,10 +358,9 @@ Subject: [PATCH] mac80211: downgrade to version 5.15.81
  delete mode 100644 package/kernel/mac80211/patches/subsys/394-mac80211-fix-rate-control-for-retransmitted-frames.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/397-disable-mbssid.patch
  create mode 100644 package/kernel/mac80211/patches/subsys/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/783-sync-nl80211.patch
 
 diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
-index e2505924cf..afc10bdb5c 100644
+index e2505924cf..830e5052b8 100644
 --- a/package/kernel/mac80211/Makefile
 +++ b/package/kernel/mac80211/Makefile
 @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
@@ -351,12 +368,12 @@ index e2505924cf..afc10bdb5c 100644
  PKG_NAME:=mac80211
  
 -PKG_VERSION:=5.10.157-1
-+PKG_VERSION:=5.15.58-1
++PKG_VERSION:=5.15.81-1
  PKG_RELEASE:=1
 -PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.157/
 -PKG_HASH:=1ce937c49f2b39be00768fba83e214aad6612d469c92ccd06dc17b14e6cf3a64
-+PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.58/
-+PKG_HASH:=a3c2a2b7bbaf8943c65fd72f4e7d7ad5e205aeae28b26c835f9d8afa0f9810bf
++PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.81/
++PKG_HASH:=5227d3c35ccebacfaee6b8180b3a87b9910f3c94ee768ebc5c0fef3c86b6146d
  
  PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
  PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
@@ -405,15 +422,6 @@ index e2505924cf..afc10bdb5c 100644
  define KernelPackage/hermes
    $(call KernelPackage/mac80211/Default)
    TITLE:=Hermes 802.11b chipset support
-@@ -265,7 +252,7 @@ endef
- define KernelPackage/mac80211-hwsim
-   $(call KernelPackage/mac80211/Default)
-   TITLE:=mac80211 HW simulation device
--  DEPENDS+= +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
-+  DEPENDS+= +kmod-mac80211 +@DRIVER_11AX_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
-   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mac80211_hwsim.ko
-   AUTOLOAD:=$(call AutoProbe,mac80211_hwsim)
- endef
 @@ -406,8 +393,6 @@ endif
  
  config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP
@@ -462,7 +470,7 @@ index e2505924cf..afc10bdb5c 100644
  	$(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
  	$(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect
 diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk
-index e815f37e1c..9af8c4665d 100644
+index e815f37e1c..50b1eed9c8 100644
 --- a/package/kernel/mac80211/ath.mk
 +++ b/package/kernel/mac80211/ath.mk
 @@ -34,7 +34,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING
@@ -483,18 +491,8 @@ index e815f37e1c..9af8c4665d 100644
  config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG
  config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
  config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99
-@@ -260,7 +260,8 @@ define KernelPackage/ath10k
-   FILES:= \
- 	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \
- 	$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko
--  AUTOLOAD:=$(call AutoProbe,ath10k_pci)
-+  AUTOLOAD:=$(call AutoProbe,ath10k_core ath10k_pci)
-+  MODPARAMS.ath10k_core:=frame_mode=2
-   VARIANT:=regular
- endef
- 
 diff --git a/package/kernel/mac80211/broadcom.mk b/package/kernel/mac80211/broadcom.mk
-index fb576c5809..5548f6e661 100644
+index fb576c5809..473bbf597c 100644
 --- a/package/kernel/mac80211/broadcom.mk
 +++ b/package/kernel/mac80211/broadcom.mk
 @@ -209,7 +209,7 @@ config PACKAGE_B43_USE_BCMA
@@ -515,14 +513,6 @@ index fb576c5809..5548f6e661 100644
  		    A  => A-PHY
  		    AG => Dual A-PHY G-PHY
  		    G  => G-PHY
-@@ -450,6 +450,7 @@ define KernelPackage/brcmfmac/config
- 	config BRCMFMAC_SDIO
- 		bool "Enable SDIO bus interface support"
- 		default y if TARGET_bcm27xx
-+		default y if TARGET_imx_cortexa7
- 		default y if TARGET_sunxi
- 		default n
- 		help
 diff --git a/package/kernel/mac80211/files/lib/netifd/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/mac80211.sh
 deleted file mode 100644
 index 92e5c0e395..0000000000
@@ -566,7 +556,7 @@ index 92e5c0e395..0000000000
 -	done
 -}
 diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
-index d69667bf8c..5d6ca7c0e3 100644
+index d69667bf8c..daa54949a0 100644
 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
 +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
 @@ -1,7 +1,6 @@
@@ -577,63 +567,19 @@ index d69667bf8c..5d6ca7c0e3 100644
  
  init_wireless_driver "$@"
  
-@@ -29,8 +28,8 @@ drv_mac80211_init_device_config() {
- 	config_add_string tx_burst
- 	config_add_string distance
- 	config_add_int beacon_int chanbw frag rts
--	config_add_int rxantenna txantenna antenna_gain txpower
--	config_add_boolean noscan ht_coex acs_exclude_dfs
-+	config_add_int rxantenna txantenna antenna_gain txpower min_tx_power
-+	config_add_boolean noscan ht_coex acs_exclude_dfs background_radar
- 	config_add_array ht_capab
- 	config_add_array channels
- 	config_add_array scan_list
-@@ -138,13 +137,15 @@ mac80211_hostapd_setup_base() {
- 	[ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
- 		append base_cfg "acs_exclude_dfs=1" "$N"
- 
--	json_get_vars noscan ht_coex
-+	json_get_vars noscan ht_coex min_tx_power:0
- 	json_get_values ht_capab_list ht_capab tx_burst
- 	json_get_values channel_list channels
- 
- 	[ "$auto_channel" = 0 ] && [ -z "$channel_list" ] && \
- 		channel_list="$channel"
+@@ -414,9 +413,9 @@ mac80211_hostapd_setup_base() {
+ 			he_spr_non_srg_obss_pd_max_offset:1 \
+ 			he_bss_color
  
-+	[ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power"
-+
- 	set_default noscan 0
- 
- 	[ "$noscan" -gt 0 ] && hostapd_noscan=1
-@@ -274,6 +275,11 @@ mac80211_hostapd_setup_base() {
- 			vht_center_seg0=$idx
- 		;;
- 	esac
-+	[ "$band" = "5g" ] && {
-+		json_get_vars background_radar:0
-+
-+		[ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N"
-+	}
- 	[ "$band" = "6g" ] && {
- 		op_class=
- 		case "$htmode" in
-@@ -420,12 +426,14 @@ mac80211_hostapd_setup_base() {
+-		he_phy_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
++		he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
+ 		he_phy_cap=${he_phy_cap:2}
+-		he_mac_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
++		he_mac_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
  		he_mac_cap=${he_mac_cap:2}
  
  		append base_cfg "ieee80211ax=1" "$N"
--		[ -n "$he_bss_color" ] && append base_cfg "he_bss_color=$he_bss_color" "$N"
- 		[ "$hwmode" = "a" ] && {
- 			append base_cfg "he_oper_chwidth=$vht_oper_chwidth" "$N"
- 			append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
- 		}
- 
-+		set_default he_bss_color 128
-+		append base_cfg "he_bss_color=$he_bss_color" "$N"
-+
- 		mac80211_add_he_capabilities \
- 			he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
- 			he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
-@@ -563,7 +571,7 @@ mac80211_generate_mac() {
+@@ -563,7 +562,7 @@ mac80211_generate_mac() {
  find_phy() {
  	[ -n "$phy" -a -d /sys/class/ieee80211/$phy ] && return 0
  	[ -n "$path" ] && {
@@ -670,19 +616,6 @@ index 5eb7cc4c61..6aa46b0c74 100644
  		if [ -n "$path" ]; then
  			dev_id="set wireless.radio${devidx}.path='$path'"
  		else
-diff --git a/package/kernel/mac80211/intel.mk b/package/kernel/mac80211/intel.mk
-index 8bab727a41..a915f94bf9 100644
---- a/package/kernel/mac80211/intel.mk
-+++ b/package/kernel/mac80211/intel.mk
-@@ -15,7 +15,7 @@ config-$(call config_package,ipw2200) += IPW2200
- 
- define KernelPackage/iwlwifi
-   $(call KernelPackage/mac80211/Default)
--  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT
-+  DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT
-   TITLE:=Intel AGN Wireless support
-   FILES:= \
- 	$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \
 diff --git a/package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch b/package/kernel/mac80211/patches/ath/120-owl-loader-compat.patch
 deleted file mode 100644
 index d1d6c9e2e3..0000000000
@@ -783,14 +716,14 @@ index bf87d3551a..4ea33365d1 100644
   WLAN_VENDOR_ATH=
   ATH_DEBUG=
 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 bacaf92b5e..02281adf4a 100644
+index bacaf92b5e..c66301efa7 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
 -@@ -3263,6 +3263,8 @@ void regulatory_hint_country_ie(struct w
-+@@ -3309,6 +3309,8 @@ void regulatory_hint_country_ie(struct w
++@@ -3315,6 +3315,8 @@ void regulatory_hint_country_ie(struct w
   	enum environment_cap env = ENVIRON_ANY;
   	struct regulatory_request *request = NULL, *lr;
   
@@ -799,7 +732,7 @@ index bacaf92b5e..02281adf4a 100644
   	if (country_ie_len & 0x01)
   		return;
 -@@ -3514,6 +3516,7 @@ static bool is_wiphy_all_set_reg_flag(en
-+@@ -3560,6 +3562,7 @@ static bool is_wiphy_all_set_reg_flag(en
++@@ -3566,6 +3568,7 @@ static bool is_wiphy_all_set_reg_flag(en
   
   void regulatory_hint_disconnect(void)
   {
@@ -896,533 +829,9 @@ index de6f9d9bb0..d9a3cd534c 100644
   ATH10K_DEBUG=
   ATH10K_DEBUGFS=
   ATH10K_SPECTRAL=
-diff --git a/package/kernel/mac80211/patches/ath10k/081-01-ath10k-improve-tx-status-reporting.patch b/package/kernel/mac80211/patches/ath10k/081-01-ath10k-improve-tx-status-reporting.patch
-new file mode 100644
-index 0000000000..c024850918
---- /dev/null
-+++ b/package/kernel/mac80211/patches/ath10k/081-01-ath10k-improve-tx-status-reporting.patch
-@@ -0,0 +1,69 @@
-+From 2587d5198aa5adcbd8896aae4a2404dc13d48637 Mon Sep 17 00:00:00 2001
-+From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Date: Wed, 18 May 2022 10:27:26 +0300
-+Subject: ath10k: improve tx status reporting
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+We use ieee80211_tx_status() to report each completed tx frame.
-+Internally, this function calls sta_info_get_by_addrs(), what has a
-+couple of drawbacks:
-+1. additional station lookup causes a performance degradation;
-+2. mac80211 can not properly account Ethernet encapsulated frames due
-+   to the inability to properly determine the destination (station) MAC
-+   address since ieee80211_tx_status() assumes the frame has a 802.11
-+   header.
-+
-+The latter is especially destructive if we want to use hardware frames
-+encapsulation.
-+
-+To fix both of these issues, replace ieee80211_tx_status() with
-+ieee80211_tx_status_ext() call and feed it station pointer from the tx
-+queue associated with the transmitted frame.
-+
-+Tested-on: QCA9888 hw2.0 PCI 10.4-3.9.0.2-00131
-+Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00157-QCARMSWPZ-1
-+
-+Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Tested-by: Oldřich Jedlička <oldium.pro@gmail.com> # TP-Link Archer C7 v4 & v5 (QCA9563 + QCA9880)
-+Tested-by: Edward Matijevic <motolav@gmail.com> # TP-Link Archer C2600 (IPQ8064 + QCA9980 10.4.1.00030-1)
-+Tested-by: Edward Matijevic <motolav@gmail.com> # QCA9377 PCI in Sta mode
-+Tested-by: Zhijun You <hujy652@gmail.com> # NETGEAR R7800 (QCA9984 10.4-3.9.0.2-00159)
-+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
-+Link: https://lore.kernel.org/r/20220516032519.29831-2-ryazanov.s.a@gmail.com
-+---
-+ drivers/net/wireless/ath/ath10k/txrx.c | 15 ++++++++++++++-
-+ 1 file changed, 14 insertions(+), 1 deletion(-)
-+
-+--- a/drivers/net/wireless/ath/ath10k/txrx.c
-++++ b/drivers/net/wireless/ath/ath10k/txrx.c
-+@@ -43,6 +43,7 @@ out:
-+ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
-+ 			 const struct htt_tx_done *tx_done)
-+ {
-++	struct ieee80211_tx_status status;
-+ 	struct ath10k *ar = htt->ar;
-+ 	struct device *dev = ar->dev;
-+ 	struct ieee80211_tx_info *info;
-+@@ -128,7 +129,19 @@ int ath10k_txrx_tx_unref(struct ath10k_h
-+ 		info->status.is_valid_ack_signal = true;
-+ 	}
-+ 
-+-	ieee80211_tx_status(htt->ar->hw, msdu);
-++	memset(&status, 0, sizeof(status));
-++	status.skb = msdu;
-++	status.info = info;
-++
-++	rcu_read_lock();
-++
-++	if (txq)
-++		status.sta = txq->sta;
-++
-++	ieee80211_tx_status_ext(htt->ar->hw, &status);
-++
-++	rcu_read_unlock();
-++
-+ 	/* we do not own the msdu anymore */
-+ 
-+ 	return 0;
-diff --git a/package/kernel/mac80211/patches/ath10k/081-02-ath10k-turn-rawmode-into-frame-mode.patch b/package/kernel/mac80211/patches/ath10k/081-02-ath10k-turn-rawmode-into-frame-mode.patch
-new file mode 100644
-index 0000000000..e672815522
---- /dev/null
-+++ b/package/kernel/mac80211/patches/ath10k/081-02-ath10k-turn-rawmode-into-frame-mode.patch
-@@ -0,0 +1,74 @@
-+From a09740548275a74b897654b3aca5af589289b57a Mon Sep 17 00:00:00 2001
-+From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Date: Mon, 16 May 2022 13:26:00 +0300
-+Subject: ath10k: turn rawmode into frame_mode
-+
-+Turn boolean rawmode module param into integer frame_mode param that
-+contains value from ath10k_hw_txrx_mode enum. As earlier the default
-+param value is non-RAW (native Wi-Fi) encapsulation. The param name
-+is selected to be consistent with the similar ath11k param.
-+
-+This is a preparation step for upcoming encapsulation offloading
-+support.
-+
-+Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
-+Link: https://lore.kernel.org/r/20220516032519.29831-4-ryazanov.s.a@gmail.com
-+---
-+ drivers/net/wireless/ath/ath10k/core.c | 11 +++++++----
-+ drivers/net/wireless/ath/ath10k/core.h |  1 +
-+ 2 files changed, 8 insertions(+), 4 deletions(-)
-+
-+--- a/drivers/net/wireless/ath/ath10k/core.c
-++++ b/drivers/net/wireless/ath/ath10k/core.c
-+@@ -32,9 +32,11 @@ EXPORT_SYMBOL(ath10k_debug_mask);
-+ static unsigned int ath10k_cryptmode_param;
-+ static bool uart_print;
-+ static bool skip_otp;
-+-static bool rawmode;
-+ static bool fw_diag_log;
-+ 
-++/* frame mode values are mapped as per enum ath10k_hw_txrx_mode */
-++unsigned int ath10k_frame_mode = ATH10K_HW_TXRX_NATIVE_WIFI;
-++
-+ unsigned long ath10k_coredump_mask = BIT(ATH10K_FW_CRASH_DUMP_REGISTERS) |
-+ 				     BIT(ATH10K_FW_CRASH_DUMP_CE_DATA);
-+ 
-+@@ -43,15 +45,16 @@ module_param_named(debug_mask, ath10k_de
-+ module_param_named(cryptmode, ath10k_cryptmode_param, uint, 0644);
-+ module_param(uart_print, bool, 0644);
-+ module_param(skip_otp, bool, 0644);
-+-module_param(rawmode, bool, 0644);
-+ module_param(fw_diag_log, bool, 0644);
-++module_param_named(frame_mode, ath10k_frame_mode, uint, 0644);
-+ module_param_named(coredump_mask, ath10k_coredump_mask, ulong, 0444);
-+ 
-+ MODULE_PARM_DESC(debug_mask, "Debugging mask");
-+ MODULE_PARM_DESC(uart_print, "Uart target debugging");
-+ MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
-+ MODULE_PARM_DESC(cryptmode, "Crypto mode: 0-hardware, 1-software");
-+-MODULE_PARM_DESC(rawmode, "Use raw 802.11 frame datapath");
-++MODULE_PARM_DESC(frame_mode,
-++		 "Datapath frame mode (0: raw, 1: native wifi (default))");
-+ MODULE_PARM_DESC(coredump_mask, "Bitfield of what to include in firmware crash file");
-+ MODULE_PARM_DESC(fw_diag_log, "Diag based fw log debugging");
-+ 
-+@@ -2487,7 +2490,7 @@ static int ath10k_core_init_firmware_fea
-+ 	ar->htt.max_num_amsdu = ATH10K_HTT_MAX_NUM_AMSDU_DEFAULT;
-+ 	ar->htt.max_num_ampdu = ATH10K_HTT_MAX_NUM_AMPDU_DEFAULT;
-+ 
-+-	if (rawmode) {
-++	if (ath10k_frame_mode == ATH10K_HW_TXRX_RAW) {
-+ 		if (!test_bit(ATH10K_FW_FEATURE_RAW_MODE_SUPPORT,
-+ 			      fw_file->fw_features)) {
-+ 			ath10k_err(ar, "rawmode = 1 requires support from firmware");
-+--- a/drivers/net/wireless/ath/ath10k/core.h
-++++ b/drivers/net/wireless/ath/ath10k/core.h
-+@@ -1311,6 +1311,7 @@ static inline bool ath10k_peer_stats_ena
-+ 	return false;
-+ }
-+ 
-++extern unsigned int ath10k_frame_mode;
-+ extern unsigned long ath10k_coredump_mask;
-+ 
-+ void ath10k_core_napi_sync_disable(struct ath10k *ar);
-diff --git a/package/kernel/mac80211/patches/ath10k/081-03-ath10k-htt-tx-do-not-interpret-Eth-frames-as-WiFi.patch b/package/kernel/mac80211/patches/ath10k/081-03-ath10k-htt-tx-do-not-interpret-Eth-frames-as-WiFi.patch
-new file mode 100644
-index 0000000000..a669c77fe2
---- /dev/null
-+++ b/package/kernel/mac80211/patches/ath10k/081-03-ath10k-htt-tx-do-not-interpret-Eth-frames-as-WiFi.patch
-@@ -0,0 +1,163 @@
-+From 70f119fb82af7f7417dc659faf02c91e1f853739 Mon Sep 17 00:00:00 2001
-+From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Date: Mon, 16 May 2022 13:26:00 +0300
-+Subject: ath10k: htt_tx: do not interpret Eth frames as WiFi
-+
-+The xmit path for the Ethernet encapsulated frames become more or less
-+usable since d740d8fd2439 ("ath10k: unify tx mode and dispatch"). This
-+change reorganize the xmit path in a manageable way to properly support
-+various tx modes, but misses that the Ethernet encapsulated frame is a
-+special case. We do not have an IEEE 802.11 header at the begining of
-+them. But the HTT Tx handler still interprets first bytes of each frame
-+as an IEEE 802.11 Frame Control field.
-+
-+Than this code was copied by e62ee5c381c5 ("ath10k: Add support for
-+htt_data_tx_desc_64 descriptor") and a2097d6444c3 ("ath10k: htt: High
-+latency TX support") to another handlers. In fact the issue in the high
-+latency (HL) handler was introduced by 83ac260151e7 ("ath10k: add mic
-+bytes for pmf management packet").
-+
-+Ethernet encapsulated frame tx mode stay unused until 75d85fd9993c
-+("ath10k: introduce basic tdls functionality") started using it for TDLS
-+frames to avoid key selection issue in some firmwares.
-+
-+Trying to interpret the begining of an Ethernet encapsulated frame as an
-+IEEE 802.11 header was not hurt us noticeably since we need to meet two
-+conditions: (1) xmit should be performed towards a TDLS peer, and (2)
-+the TDLS peer should have a specific OUI part of its MAC address. Looks
-+like that the rareness in TDLS communications of OUIs that can be
-+interpreted as an 802.11 management frame saves users from facing this
-+issue earlier.
-+
-+Improve Ethernet tx mode support in the HTT Tx handler by avoiding
-+interpreting its first bytes as an IEEE 802.11 header. While at it, make
-+the ieee80211_hdr variable local to the code block that is guarded by
-+!is_eth check. In this way, we clarify in which cases a frame can be
-+interpreted as IEEE 802.11, and saves us from similar issues in the
-+future.
-+
-+Credits: this change as part of xmit encapsulation offloading support
-+was originally made by QCA and then submitted for inclusion by John
-+Crispin [1]. But the whole work was not accepted due to the lack of a
-+part for 64-bits descriptors [2]. Zhijun You then pointed this out to me
-+in a reply to my initial RFC patch series. And I made this slightly
-+reworked version that covered all the HTT Tx handler variants.
-+
-+1. https://lore.kernel.org/all/20191216092207.31032-1-john@phrozen.org/
-+2. https://patchwork.kernel.org/project/linux-wireless/patch/20191216092207.31032-1-john@phrozen.org/
-+
-+Reported-by: Zhijun You <hujy652@gmail.com>
-+Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
-+Signed-off-by: John Crispin <john@phrozen.org>
-+Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
-+Link: https://lore.kernel.org/r/20220516032519.29831-3-ryazanov.s.a@gmail.com
-+---
-+ drivers/net/wireless/ath/ath10k/htt_tx.c | 61 ++++++++++++++++++--------------
-+ 1 file changed, 35 insertions(+), 26 deletions(-)
-+
-+--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
-++++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
-+@@ -1295,7 +1295,6 @@ static int ath10k_htt_tx_hl(struct ath10
-+ 	struct ath10k *ar = htt->ar;
-+ 	int res, data_len;
-+ 	struct htt_cmd_hdr *cmd_hdr;
-+-	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-+ 	struct htt_data_tx_desc *tx_desc;
-+ 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
-+ 	struct sk_buff *tmp_skb;
-+@@ -1306,11 +1305,15 @@ static int ath10k_htt_tx_hl(struct ath10
-+ 	u16 flags1 = 0;
-+ 	u16 msdu_id = 0;
-+ 
-+-	if ((ieee80211_is_action(hdr->frame_control) ||
-+-	     ieee80211_is_deauth(hdr->frame_control) ||
-+-	     ieee80211_is_disassoc(hdr->frame_control)) &&
-+-	     ieee80211_has_protected(hdr->frame_control)) {
-+-		skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++	if (!is_eth) {
-++		struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-++
-++		if ((ieee80211_is_action(hdr->frame_control) ||
-++		     ieee80211_is_deauth(hdr->frame_control) ||
-++		     ieee80211_is_disassoc(hdr->frame_control)) &&
-++		     ieee80211_has_protected(hdr->frame_control)) {
-++			skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++		}
-+ 	}
-+ 
-+ 	data_len = msdu->len;
-+@@ -1407,7 +1410,6 @@ static int ath10k_htt_tx_32(struct ath10
-+ {
-+ 	struct ath10k *ar = htt->ar;
-+ 	struct device *dev = ar->dev;
-+-	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-+ 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
-+ 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
-+ 	struct ath10k_hif_sg_item sg_items[2];
-+@@ -1439,15 +1441,19 @@ static int ath10k_htt_tx_32(struct ath10
-+ 	txbuf_paddr = htt->txbuf.paddr +
-+ 		      (sizeof(struct ath10k_htt_txbuf_32) * msdu_id);
-+ 
-+-	if ((ieee80211_is_action(hdr->frame_control) ||
-+-	     ieee80211_is_deauth(hdr->frame_control) ||
-+-	     ieee80211_is_disassoc(hdr->frame_control)) &&
-+-	     ieee80211_has_protected(hdr->frame_control)) {
-+-		skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-+-	} else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
-+-		   txmode == ATH10K_HW_TXRX_RAW &&
-+-		   ieee80211_has_protected(hdr->frame_control)) {
-+-		skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++	if (!is_eth) {
-++		struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-++
-++		if ((ieee80211_is_action(hdr->frame_control) ||
-++		     ieee80211_is_deauth(hdr->frame_control) ||
-++		     ieee80211_is_disassoc(hdr->frame_control)) &&
-++		     ieee80211_has_protected(hdr->frame_control)) {
-++			skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++		} else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
-++			   txmode == ATH10K_HW_TXRX_RAW &&
-++			   ieee80211_has_protected(hdr->frame_control)) {
-++			skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++		}
-+ 	}
-+ 
-+ 	skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
-+@@ -1609,7 +1615,6 @@ static int ath10k_htt_tx_64(struct ath10
-+ {
-+ 	struct ath10k *ar = htt->ar;
-+ 	struct device *dev = ar->dev;
-+-	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-+ 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
-+ 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
-+ 	struct ath10k_hif_sg_item sg_items[2];
-+@@ -1641,15 +1646,19 @@ static int ath10k_htt_tx_64(struct ath10
-+ 	txbuf_paddr = htt->txbuf.paddr +
-+ 		      (sizeof(struct ath10k_htt_txbuf_64) * msdu_id);
-+ 
-+-	if ((ieee80211_is_action(hdr->frame_control) ||
-+-	     ieee80211_is_deauth(hdr->frame_control) ||
-+-	     ieee80211_is_disassoc(hdr->frame_control)) &&
-+-	     ieee80211_has_protected(hdr->frame_control)) {
-+-		skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-+-	} else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
-+-		   txmode == ATH10K_HW_TXRX_RAW &&
-+-		   ieee80211_has_protected(hdr->frame_control)) {
-+-		skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++	if (!is_eth) {
-++		struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
-++
-++		if ((ieee80211_is_action(hdr->frame_control) ||
-++		     ieee80211_is_deauth(hdr->frame_control) ||
-++		     ieee80211_is_disassoc(hdr->frame_control)) &&
-++		     ieee80211_has_protected(hdr->frame_control)) {
-++			skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++		} else if (!(skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT) &&
-++			   txmode == ATH10K_HW_TXRX_RAW &&
-++			   ieee80211_has_protected(hdr->frame_control)) {
-++			skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
-++		}
-+ 	}
-+ 
-+ 	skb_cb->paddr = dma_map_single(dev, msdu->data, msdu->len,
-diff --git a/package/kernel/mac80211/patches/ath10k/081-04-ath10k-add-encapsulation-offloading-support.patch b/package/kernel/mac80211/patches/ath10k/081-04-ath10k-add-encapsulation-offloading-support.patch
-new file mode 100644
-index 0000000000..abca7aac9e
---- /dev/null
-+++ b/package/kernel/mac80211/patches/ath10k/081-04-ath10k-add-encapsulation-offloading-support.patch
-@@ -0,0 +1,194 @@
-+From af6d8265c47e46881b80c6b073f53c8c4af52d28 Mon Sep 17 00:00:00 2001
-+From: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Date: Mon, 16 May 2022 13:26:00 +0300
-+Subject: ath10k: add encapsulation offloading support
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+Frame encapsulation from Ethernet into the IEEE 802.11 frame format
-+takes a considerable host CPU time on the xmit path. The firmware is
-+able to do this operation for us, so enable encapsulation offloading for
-+AP and Sta interface types to improve overall system performance.
-+
-+The driver is almost ready for encapsulation offloading support. There
-+are only a few places where the driver assumes the frame format is IEEE
-+802.11 that need to be fixed.
-+
-+Encapsulation offloading is currently disabled by default and the driver
-+utilizes mac80211 encapsulation support. To activate offloading, the
-+frame_mode=2 parameter should be passed during module loading.
-+
-+On a QCA9563+QCA9888-based access point in bridged mode, encapsulation
-+offloading increases TCP 16-streams DL throughput from 365 to 396 mbps
-+(+8%) and UDP DL throughput from 436 to 483 mbps (+11%).
-+
-+Tested-on: QCA9888 hw2.0 PCI 10.4-3.9.0.2-00131
-+Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00157-QCARMSWPZ-1
-+Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
-+Tested-by: Oldřich Jedlička <oldium.pro@gmail.com> # TP-Link Archer C7 v4 & v5 (QCA9563 + QCA9880)
-+Tested-by: Edward Matijevic <motolav@gmail.com> # TP-Link Archer C2600 (IPQ8064 + QCA9980 10.4.1.00030-1)
-+Tested-by: Edward Matijevic <motolav@gmail.com> # QCA9377 PCI in Sta mode
-+Tested-by: Zhijun You <hujy652@gmail.com> # NETGEAR R7800 (QCA9984 10.4-3.9.0.2-00159)
-+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
-+Link: https://lore.kernel.org/r/20220516032519.29831-5-ryazanov.s.a@gmail.com
-+---
-+ drivers/net/wireless/ath/ath10k/core.c |  2 +-
-+ drivers/net/wireless/ath/ath10k/mac.c  | 67 +++++++++++++++++++++++++++-------
-+ 2 files changed, 55 insertions(+), 14 deletions(-)
-+
-+--- a/drivers/net/wireless/ath/ath10k/core.c
-++++ b/drivers/net/wireless/ath/ath10k/core.c
-+@@ -54,7 +54,7 @@ MODULE_PARM_DESC(uart_print, "Uart targe
-+ MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
-+ MODULE_PARM_DESC(cryptmode, "Crypto mode: 0-hardware, 1-software");
-+ MODULE_PARM_DESC(frame_mode,
-+-		 "Datapath frame mode (0: raw, 1: native wifi (default))");
-++		 "Datapath frame mode (0: raw, 1: native wifi (default), 2: ethernet)");
-+ MODULE_PARM_DESC(coredump_mask, "Bitfield of what to include in firmware crash file");
-+ MODULE_PARM_DESC(fw_diag_log, "Diag based fw log debugging");
-+ 
-+--- a/drivers/net/wireless/ath/ath10k/mac.c
-++++ b/drivers/net/wireless/ath/ath10k/mac.c
-+@@ -3710,6 +3710,9 @@ ath10k_mac_tx_h_get_txmode(struct ath10k
-+ 	const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
-+ 	__le16 fc = hdr->frame_control;
-+ 
-++	if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
-++		return ATH10K_HW_TXRX_ETHERNET;
-++
-+ 	if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
-+ 		return ATH10K_HW_TXRX_RAW;
-+ 
-+@@ -3870,6 +3873,12 @@ static void ath10k_mac_tx_h_fill_cb(stru
-+ 	bool noack = false;
-+ 
-+ 	cb->flags = 0;
-++
-++	if (info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
-++		cb->flags |= ATH10K_SKB_F_QOS;	/* Assume data frames are QoS */
-++		goto finish_cb_fill;
-++	}
-++
-+ 	if (!ath10k_tx_h_use_hwcrypto(vif, skb))
-+ 		cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
-+ 
-+@@ -3908,6 +3917,7 @@ static void ath10k_mac_tx_h_fill_cb(stru
-+ 		cb->flags |= ATH10K_SKB_F_RAW_TX;
-+ 	}
-+ 
-++finish_cb_fill:
-+ 	cb->vif = vif;
-+ 	cb->txq = txq;
-+ 	cb->airtime_est = airtime;
-+@@ -4031,7 +4041,11 @@ static int ath10k_mac_tx(struct ath10k *
-+ 		ath10k_tx_h_seq_no(vif, skb);
-+ 		break;
-+ 	case ATH10K_HW_TXRX_ETHERNET:
-+-		ath10k_tx_h_8023(skb);
-++		/* Convert 802.11->802.3 header only if the frame was erlier
-++		 * encapsulated to 802.11 by mac80211. Otherwise pass it as is.
-++		 */
-++		if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
-++			ath10k_tx_h_8023(skb);
-+ 		break;
-+ 	case ATH10K_HW_TXRX_RAW:
-+ 		if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
-+@@ -4643,12 +4657,10 @@ static void ath10k_mac_op_tx(struct ieee
-+ 	struct ieee80211_vif *vif = info->control.vif;
-+ 	struct ieee80211_sta *sta = control->sta;
-+ 	struct ieee80211_txq *txq = NULL;
-+-	struct ieee80211_hdr *hdr = (void *)skb->data;
-+ 	enum ath10k_hw_txrx_mode txmode;
-+ 	enum ath10k_mac_tx_path txpath;
-+ 	bool is_htt;
-+ 	bool is_mgmt;
-+-	bool is_presp;
-+ 	int ret;
-+ 	u16 airtime;
-+ 
-+@@ -4662,8 +4674,14 @@ static void ath10k_mac_op_tx(struct ieee
-+ 	is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
-+ 
-+ 	if (is_htt) {
-++		bool is_presp = false;
-++
-+ 		spin_lock_bh(&ar->htt.tx_lock);
-+-		is_presp = ieee80211_is_probe_resp(hdr->frame_control);
-++		if (!(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)) {
-++			struct ieee80211_hdr *hdr = (void *)skb->data;
-++
-++			is_presp = ieee80211_is_probe_resp(hdr->frame_control);
-++		}
-+ 
-+ 		ret = ath10k_htt_tx_inc_pending(htt);
-+ 		if (ret) {
-+@@ -5463,6 +5481,30 @@ static int ath10k_mac_set_txbf_conf(stru
-+ 					 ar->wmi.vdev_param->txbf, value);
-+ }
-+ 
-++static void ath10k_update_vif_offload(struct ieee80211_hw *hw,
-++				      struct ieee80211_vif *vif)
-++{
-++	struct ath10k_vif *arvif = (void *)vif->drv_priv;
-++	struct ath10k *ar = hw->priv;
-++	u32 vdev_param;
-++	int ret;
-++
-++	if (ath10k_frame_mode != ATH10K_HW_TXRX_ETHERNET ||
-++	    ar->wmi.vdev_param->tx_encap_type == WMI_VDEV_PARAM_UNSUPPORTED ||
-++	     (vif->type != NL80211_IFTYPE_STATION &&
-++	      vif->type != NL80211_IFTYPE_AP))
-++		vif->offload_flags &= ~IEEE80211_OFFLOAD_ENCAP_ENABLED;
-++
-++	vdev_param = ar->wmi.vdev_param->tx_encap_type;
-++	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
-++					ATH10K_HW_TXRX_NATIVE_WIFI);
-++	/* 10.X firmware does not support this VDEV parameter. Do not warn */
-++	if (ret && ret != -EOPNOTSUPP) {
-++		ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
-++			    arvif->vdev_id, ret);
-++	}
-++}
-++
-+ /*
-+  * TODO:
-+  * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
-+@@ -5672,15 +5714,7 @@ static int ath10k_add_interface(struct i
-+ 
-+ 	arvif->def_wep_key_idx = -1;
-+ 
-+-	vdev_param = ar->wmi.vdev_param->tx_encap_type;
-+-	ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
-+-					ATH10K_HW_TXRX_NATIVE_WIFI);
-+-	/* 10.X firmware does not support this VDEV parameter. Do not warn */
-+-	if (ret && ret != -EOPNOTSUPP) {
-+-		ath10k_warn(ar, "failed to set vdev %i TX encapsulation: %d\n",
-+-			    arvif->vdev_id, ret);
-+-		goto err_vdev_delete;
-+-	}
-++	ath10k_update_vif_offload(hw, vif);
-+ 
-+ 	/* Configuring number of spatial stream for monitor interface is causing
-+ 	 * target assert in qca9888 and qca6174.
-+@@ -9368,6 +9402,7 @@ static const struct ieee80211_ops ath10k
-+ 	.stop				= ath10k_stop,
-+ 	.config				= ath10k_config,
-+ 	.add_interface			= ath10k_add_interface,
-++	.update_vif_offload		= ath10k_update_vif_offload,
-+ 	.remove_interface		= ath10k_remove_interface,
-+ 	.configure_filter		= ath10k_configure_filter,
-+ 	.bss_info_changed		= ath10k_bss_info_changed,
-+@@ -10037,6 +10072,12 @@ int ath10k_mac_register(struct ath10k *a
-+ 	if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
-+ 		ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
-+ 
-++	if (ath10k_frame_mode == ATH10K_HW_TXRX_ETHERNET) {
-++		if (ar->wmi.vdev_param->tx_encap_type !=
-++		    WMI_VDEV_PARAM_UNSUPPORTED)
-++			ieee80211_hw_set(ar->hw, SUPPORTS_TX_ENCAP_OFFLOAD);
-++	}
-++
-+ 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
-+ 	ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
-+ 	ar->hw->wiphy->max_remain_on_channel_duration = 5000;
 diff --git a/package/kernel/mac80211/patches/ath10k/100-ath10k-support-bus-and-device-specific-API-1-BDF-sel.patch b/package/kernel/mac80211/patches/ath10k/100-ath10k-support-bus-and-device-specific-API-1-BDF-sel.patch
 new file mode 100644
-index 0000000000..7ef418e506
+index 0000000000..74d5b374fb
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/100-ath10k-support-bus-and-device-specific-API-1-BDF-sel.patch
 @@ -0,0 +1,65 @@
@@ -1462,7 +871,7 @@ index 0000000000..7ef418e506
 +
 +--- a/drivers/net/wireless/ath/ath10k/core.c
 ++++ b/drivers/net/wireless/ath/ath10k/core.c
-+@@ -1202,6 +1202,7 @@ success:
++@@ -1199,6 +1199,7 @@ success:
 + static int ath10k_core_fetch_board_data_api_1(struct ath10k *ar, int bd_ie_type)
 + {
 + 	const struct firmware *fw;
@@ -1470,7 +879,7 @@ index 0000000000..7ef418e506
 + 
 + 	if (bd_ie_type == ATH10K_BD_IE_BOARD) {
 + 		if (!ar->hw_params.fw.board) {
-+@@ -1209,9 +1210,19 @@ static int ath10k_core_fetch_board_data_
++@@ -1206,9 +1207,19 @@ static int ath10k_core_fetch_board_data_
 + 			return -EINVAL;
 + 		}
 + 
@@ -1493,7 +902,7 @@ index 0000000000..7ef418e506
 + 
 diff --git a/package/kernel/mac80211/patches/ath10k/120-ath10k-fetch-calibration-data-via-nvmem-subsystem.patch b/package/kernel/mac80211/patches/ath10k/120-ath10k-fetch-calibration-data-via-nvmem-subsystem.patch
 new file mode 100644
-index 0000000000..c7a00b7e4b
+index 0000000000..ab42c6e1e0
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/120-ath10k-fetch-calibration-data-via-nvmem-subsystem.patch
 @@ -0,0 +1,162 @@
@@ -1533,7 +942,7 @@ index 0000000000..c7a00b7e4b
 + #include <asm/byteorder.h>
 + 
 + #include "core.h"
-+@@ -955,7 +956,8 @@ static int ath10k_core_get_board_id_from
++@@ -952,7 +953,8 @@ static int ath10k_core_get_board_id_from
 + 	}
 + 
 + 	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
@@ -1543,7 +952,7 @@ index 0000000000..c7a00b7e4b
 + 		bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
 + 	else
 + 		bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
-+@@ -1757,7 +1759,8 @@ static int ath10k_download_and_run_otp(s
++@@ -1754,7 +1756,8 @@ static int ath10k_download_and_run_otp(s
 + 
 + 	/* As of now pre-cal is valid for 10_4 variants */
 + 	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
@@ -1553,7 +962,7 @@ index 0000000000..c7a00b7e4b
 + 		bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
 + 
 + 	ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
-+@@ -1884,6 +1887,39 @@ out_free:
++@@ -1881,6 +1884,39 @@ out_free:
 + 	return ret;
 + }
 + 
@@ -1593,7 +1002,7 @@ index 0000000000..c7a00b7e4b
 + int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
 + 				     struct ath10k_fw_file *fw_file)
 + {
-+@@ -2118,6 +2154,18 @@ static int ath10k_core_pre_cal_download(
++@@ -2115,6 +2151,18 @@ static int ath10k_core_pre_cal_download(
 + {
 + 	int ret;
 + 
@@ -1612,7 +1021,7 @@ index 0000000000..c7a00b7e4b
 + 	ret = ath10k_download_cal_file(ar, ar->pre_cal_file);
 + 	if (ret == 0) {
 + 		ar->cal_mode = ATH10K_PRE_CAL_MODE_FILE;
-+@@ -2184,6 +2232,18 @@ static int ath10k_download_cal_data(stru
++@@ -2181,6 +2229,18 @@ static int ath10k_download_cal_data(stru
 + 		   "pre cal download procedure failed, try cal file: %d\n",
 + 		   ret);
 + 
@@ -1663,7 +1072,7 @@ diff --git a/package/kernel/mac80211/patches/ath/921-ath10k_init_devices_synchro
 similarity index 94%
 rename from package/kernel/mac80211/patches/ath/921-ath10k_init_devices_synchronously.patch
 rename to package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch
-index 2b8fe7816f..e47fb012fa 100644
+index 2b8fe7816f..5362c2436d 100644
 --- a/package/kernel/mac80211/patches/ath/921-ath10k_init_devices_synchronously.patch
 +++ b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch
 @@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
@@ -1671,7 +1080,7 @@ index 2b8fe7816f..e47fb012fa 100644
  --- a/drivers/net/wireless/ath/ath10k/core.c
  +++ b/drivers/net/wireless/ath/ath10k/core.c
 -@@ -3206,6 +3206,16 @@ int ath10k_core_register(struct ath10k *
-+@@ -3443,6 +3443,16 @@ int ath10k_core_register(struct ath10k *
++@@ -3440,6 +3440,16 @@ int ath10k_core_register(struct ath10k *
   
   	queue_work(ar->workqueue, &ar->register_work);
   
@@ -1679,14 +1088,14 @@ diff --git a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.
 similarity index 89%
 rename from package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
 rename to package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
-index 2fc83182b6..9dfde4385e 100644
+index 2fc83182b6..c225df719f 100644
 --- a/package/kernel/mac80211/patches/ath/930-ath10k_add_tpt_led_trigger.patch
 +++ b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
 @@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
 -@@ -9752,6 +9752,21 @@ static int ath10k_mac_init_rd(struct ath
-+@@ -9894,6 +9894,21 @@ static int ath10k_mac_init_rd(struct ath
++@@ -9863,6 +9863,21 @@ static int ath10k_mac_init_rd(struct ath
   	return 0;
   }
   
@@ -1695,7 +1104,7 @@ index 2fc83182b6..9dfde4385e 100644
   {
   	static const u32 cipher_suites[] = {
 -@@ -10101,6 +10116,12 @@ int ath10k_mac_register(struct ath10k *a
-+@@ -10252,6 +10267,12 @@ int ath10k_mac_register(struct ath10k *a
++@@ -10215,6 +10230,12 @@ int ath10k_mac_register(struct ath10k *a
   
   	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
   
@@ -1703,7 +1112,7 @@ diff --git a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-con
 similarity index 96%
 rename from package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch
 rename to package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch
-index d8c8a8abc0..47b52416ab 100644
+index d8c8a8abc0..35927e7850 100644
 --- a/package/kernel/mac80211/patches/ath/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch
 +++ b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch
 @@ -85,7 +85,7 @@ v13:
@@ -1738,7 +1147,7 @@ index d8c8a8abc0..47b52416ab 100644
   unsigned int ath10k_debug_mask;
   EXPORT_SYMBOL(ath10k_debug_mask);
 -@@ -61,6 +62,7 @@ static const struct ath10k_hw_params ath
-+@@ -65,6 +66,7 @@ static const struct ath10k_hw_params ath
++@@ -62,6 +63,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA988X_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca988x hw2.0",
@@ -1747,7 +1156,7 @@ index d8c8a8abc0..47b52416ab 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
 -@@ -132,6 +134,7 @@ static const struct ath10k_hw_params ath
-+@@ -138,6 +140,7 @@ static const struct ath10k_hw_params ath
++@@ -135,6 +137,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9887_1_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9887 hw1.0",
@@ -1756,7 +1165,7 @@ index d8c8a8abc0..47b52416ab 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
 -@@ -343,6 +346,7 @@ static const struct ath10k_hw_params ath
-+@@ -355,6 +358,7 @@ static const struct ath10k_hw_params ath
++@@ -352,6 +355,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA99X0_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca99x0 hw2.0",
@@ -1765,7 +1174,7 @@ index d8c8a8abc0..47b52416ab 100644
   		.uart_pin = 7,
   		.otp_exe_param = 0x00000700,
 -@@ -384,6 +388,7 @@ static const struct ath10k_hw_params ath
-+@@ -397,6 +401,7 @@ static const struct ath10k_hw_params ath
++@@ -394,6 +398,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9984_1_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9984/qca9994 hw1.0",
@@ -1774,7 +1183,7 @@ index d8c8a8abc0..47b52416ab 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 -@@ -432,6 +437,7 @@ static const struct ath10k_hw_params ath
-+@@ -446,6 +451,7 @@ static const struct ath10k_hw_params ath
++@@ -443,6 +448,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9888_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9888 hw2.0",
@@ -1783,7 +1192,7 @@ index d8c8a8abc0..47b52416ab 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 -@@ -2921,6 +2927,10 @@ int ath10k_core_start(struct ath10k *ar,
-+@@ -3158,6 +3164,10 @@ int ath10k_core_start(struct ath10k *ar,
++@@ -3155,6 +3161,10 @@ int ath10k_core_start(struct ath10k *ar,
   		goto err_hif_stop;
   	}
   
@@ -1792,7 +1201,7 @@ index d8c8a8abc0..47b52416ab 100644
   
   err_hif_stop:
 -@@ -3179,9 +3189,18 @@ static void ath10k_core_register_work(st
-+@@ -3416,9 +3426,18 @@ static void ath10k_core_register_work(st
++@@ -3413,9 +3423,18 @@ static void ath10k_core_register_work(st
   		goto err_spectral_destroy;
   	}
   
@@ -1801,7 +1210,7 @@ index d8c8a8abc0..47b52416ab 100644
   	ath10k_spectral_destroy(ar);
   err_debug_destroy:
 -@@ -3227,6 +3246,8 @@ void ath10k_core_unregister(struct ath10
-+@@ -3464,6 +3483,8 @@ void ath10k_core_unregister(struct ath10
++@@ -3461,6 +3480,8 @@ void ath10k_core_unregister(struct ath10
   	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
   		return;
   
@@ -1818,7 +1227,7 @@ diff --git a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-d
 similarity index 92%
 rename from package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch
 rename to package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
-index ef98539f99..842853ddf4 100644
+index ef98539f99..00bac4ffd7 100644
 --- a/package/kernel/mac80211/patches/ath/975-ath10k-use-tpt-trigger-by-default.patch
 +++ b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
 @@ -16,9 +16,9 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
@@ -1839,7 +1248,7 @@ index ef98539f99..842853ddf4 100644
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
 -@@ -10118,7 +10118,7 @@ int ath10k_mac_register(struct ath10k *a
-+@@ -10269,7 +10269,7 @@ int ath10k_mac_register(struct ath10k *a
++@@ -10232,7 +10232,7 @@ int ath10k_mac_register(struct ath10k *a
   	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
   
   #ifdef CPTCFG_MAC80211_LEDS
@@ -1847,7 +1256,7 @@ diff --git a/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-redu
 similarity index 93%
 rename from package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
 rename to package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
-index f5c1fb2a2b..a45addf119 100644
+index f5c1fb2a2b..424985f114 100644
 --- a/package/kernel/mac80211/patches/ath/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
 +++ b/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch
 @@ -28,7 +28,7 @@ Forwarded: no
@@ -1855,7 +1264,7 @@ index f5c1fb2a2b..a45addf119 100644
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
 -@@ -1017,6 +1017,40 @@ static inline int ath10k_vdev_setup_sync
-+@@ -1021,6 +1021,40 @@ static inline int ath10k_vdev_setup_sync
++@@ -1028,6 +1028,40 @@ static inline int ath10k_vdev_setup_sync
   	return ar->last_wmi_vdev_start_status;
   }
   
@@ -1864,7 +1273,7 @@ index f5c1fb2a2b..a45addf119 100644
   {
   	struct cfg80211_chan_def *chandef = NULL;
 -@@ -1049,7 +1083,8 @@ static int ath10k_monitor_vdev_start(str
-+@@ -1053,7 +1087,8 @@ static int ath10k_monitor_vdev_start(str
++@@ -1060,7 +1094,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;
@@ -1873,7 +1282,7 @@ index f5c1fb2a2b..a45addf119 100644
   	reinit_completion(&ar->vdev_setup_done);
   	reinit_completion(&ar->vdev_delete_done);
 -@@ -1495,7 +1530,8 @@ static int ath10k_vdev_start_restart(str
-+@@ -1499,7 +1534,8 @@ static int ath10k_vdev_start_restart(str
++@@ -1506,7 +1541,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;
@@ -1882,13 +1291,13 @@ index f5c1fb2a2b..a45addf119 100644
   	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
   		arg.ssid = arvif->u.ap.ssid;
 -@@ -3266,7 +3302,8 @@ static int ath10k_update_channel_list(st
-+@@ -3427,7 +3463,8 @@ static int ath10k_update_channel_list(st
++@@ -3434,7 +3470,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/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
 new file mode 100644
-index 0000000000..80da07de8a
+index 0000000000..d94a8a8596
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
 @@ -0,0 +1,37 @@
@@ -1920,7 +1329,7 @@ index 0000000000..80da07de8a
 + #include <linux/property.h>
 + #include <linux/dmi.h>
 + #include <linux/ctype.h>
-+@@ -3334,6 +3335,8 @@ static int ath10k_core_probe_fw(struct a
++@@ -3331,6 +3332,8 @@ static int ath10k_core_probe_fw(struct a
 + 
 + 	device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
 + 
@@ -2950,115 +2359,6 @@ index 0000000000..62c561d619
 + 	if (err)
 + 		dev_err(&pdev->dev, "failed to request caldata (%d).\n", err);
 + 
-diff --git a/package/kernel/mac80211/patches/brcm/001-brcmfmac-allow-setting-wlan-MAC-address-using-device.patch b/package/kernel/mac80211/patches/brcm/001-brcmfmac-allow-setting-wlan-MAC-address-using-device.patch
-new file mode 100644
-index 0000000000..03d9f8ecd8
---- /dev/null
-+++ b/package/kernel/mac80211/patches/brcm/001-brcmfmac-allow-setting-wlan-MAC-address-using-device.patch
-@@ -0,0 +1,103 @@
-+From 716c220b4d990a4fe7800d0685ca69dee99e4e8f Mon Sep 17 00:00:00 2001
-+From: =?UTF-8?q?Pavel=20L=C3=B6bl?= <pavel@loebl.cz>
-+Date: Fri, 6 May 2022 06:42:46 +0200
-+Subject: [PATCH] brcmfmac: allow setting wlan MAC address using device tree
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+This allows firmware to provide MAC address using device tree. Like in
-+case there is no MAC burned in wlan NVRAM.
-+
-+Signed-off-by: Pavel Löbl <pavel@loebl.cz>
-+Signed-off-by: Kalle Valo <kvalo@kernel.org>
-+Link: https://lore.kernel.org/r/20220506044246.67146-1-pavel@loebl.cz
-+---
-+ .../broadcom/brcm80211/brcmfmac/common.c      | 23 ++++++++++++++-----
-+ .../broadcom/brcm80211/brcmfmac/common.h      |  1 +
-+ .../broadcom/brcm80211/brcmfmac/core.c        |  4 +++-
-+ .../wireless/broadcom/brcm80211/brcmfmac/of.c |  3 +++
-+ 4 files changed, 24 insertions(+), 7 deletions(-)
-+
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
-+@@ -202,13 +202,24 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
-+ 	char *ptr;
-+ 	s32 err;
-+ 
-+-	/* retreive mac address */
-+-	err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
-+-				       sizeof(ifp->mac_addr));
-+-	if (err < 0) {
-+-		bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
-+-		goto done;
-++	if (is_valid_ether_addr(ifp->mac_addr)) {
-++		/* set mac address */
-++		err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
-++					       ETH_ALEN);
-++		if (err < 0) {
-++			bphy_err(ifp->drvr, "Setting cur_etheraddr failed, %d\n", err);
-++			goto done;
-++		}
-++	} else {
-++		/* retrieve mac address */
-++		err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
-++					       sizeof(ifp->mac_addr));
-++		if (err < 0) {
-++			bphy_err(drvr, "Retrieving cur_etheraddr failed, %d\n", err);
-++			goto done;
-++		}
-+ 	}
-++
-+ 	memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
-+ 	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
-+ 
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
-+@@ -50,6 +50,7 @@ struct brcmf_mp_device {
-+ 	bool		ignore_probe_fail;
-+ 	struct brcmfmac_pd_cc *country_codes;
-+ 	const char	*board_type;
-++	unsigned char	mac[ETH_ALEN];
-+ 	union {
-+ 		struct brcmfmac_sdio_pd sdio;
-+ 	} bus;
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+@@ -7,6 +7,7 @@
-+ #include <linux/etherdevice.h>
-+ #include <linux/module.h>
-+ #include <linux/inetdevice.h>
-++#include <linux/property.h>
-+ #include <net/cfg80211.h>
-+ #include <net/rtnetlink.h>
-+ #include <net/addrconf.h>
-+@@ -1226,7 +1227,8 @@ static int brcmf_bus_started(struct brcm
-+ 	brcmf_dbg(TRACE, "\n");
-+ 
-+ 	/* add primary networking interface */
-+-	ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
-++	ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d",
-++			   is_valid_ether_addr(drvr->settings->mac) ? drvr->settings->mac : NULL);
-+ 	if (IS_ERR(ifp))
-+ 		return PTR_ERR(ifp);
-+ 
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-+@@ -5,6 +5,7 @@
-+ #include <linux/init.h>
-+ #include <linux/of.h>
-+ #include <linux/of_irq.h>
-++#include <linux/of_net.h>
-+ 
-+ #include <defs.h>
-+ #include "debug.h"
-+@@ -97,6 +98,8 @@ void brcmf_of_probe(struct device *dev,
-+ 	if (err)
-+ 		brcmf_err("failed to get OF country code map (err=%d)\n", err);
-+ 
-++	of_get_mac_address(np, settings->mac);
-++
-+ 	if (bus_type != BRCMF_BUSTYPE_SDIO)
-+ 		return;
-+ 
 diff --git a/package/kernel/mac80211/patches/brcm/812-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/brcm/812-b43-add-antenna-control.patch
 index 52ae7a8eba..5dc04ecc88 100644
 --- a/package/kernel/mac80211/patches/brcm/812-b43-add-antenna-control.patch
@@ -3169,7 +2469,7 @@ index 774656f1fd..88465f256b 100644
   	 * 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 9658bda1c1..1ddc78f7ca 100644
+index 9658bda1c1..835c870a65 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
 @@ -12,9 +12,9 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
@@ -3179,7 +2479,7 @@ index 9658bda1c1..1ddc78f7ca 100644
 -@@ -12,6 +12,36 @@
 - #include "common.h"
 - #include "of.h"
-+@@ -59,6 +59,36 @@ static int brcmf_of_get_country_codes(st
++@@ -58,6 +58,36 @@ static int brcmf_of_get_country_codes(st
 + 	return 0;
 + }
   
@@ -3190,7 +2490,7 @@ index 9658bda1c1..1ddc78f7ca 100644
   		    struct brcmf_mp_device *settings)
   {
 -@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
-+@@ -91,6 +121,8 @@ void brcmf_of_probe(struct device *dev,
++@@ -90,6 +120,8 @@ void brcmf_of_probe(struct device *dev,
   		of_node_put(root);
   	}
   
@@ -3201,210 +2501,8 @@ index 9658bda1c1..1ddc78f7ca 100644
 + 	if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
   		return;
 + 
-diff --git a/package/kernel/mac80211/patches/brcm/865-brcmfmac-Read-alternative-firmware-names-from-DT.patch b/package/kernel/mac80211/patches/brcm/865-brcmfmac-Read-alternative-firmware-names-from-DT.patch
-new file mode 100644
-index 0000000000..8adb8c42a1
---- /dev/null
-+++ b/package/kernel/mac80211/patches/brcm/865-brcmfmac-Read-alternative-firmware-names-from-DT.patch
-@@ -0,0 +1,196 @@
-+From 4e32024cbb14230af3048e249e84f8c2b25ce45a Mon Sep 17 00:00:00 2001
-+From: Phil Elwell <phil@raspberrypi.com>
-+Date: Thu, 28 Oct 2021 15:03:16 +0100
-+Subject: [PATCH] brcmfmac: Read alternative firmware names from DT
-+
-+Add the ability to load the names of alternative firmwares from the
-+Device Tree node. This permits separate firmwares for 43436s and 43438
-+and allows downstream firmwares to coexist with upstream.
-+
-+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
-+---
-+ .../wireless/broadcom/brcm80211/brcmfmac/of.c | 36 ++++++++++++++
-+ .../wireless/broadcom/brcm80211/brcmfmac/of.h |  7 +++
-+ .../broadcom/brcm80211/brcmfmac/sdio.c        | 47 +++++++++++++++++--
-+ 3 files changed, 87 insertions(+), 3 deletions(-)
-+
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-+@@ -11,6 +11,7 @@
-+ #include "debug.h"
-+ #include "core.h"
-+ #include "common.h"
-++#include "firmware.h"
-+ #include "of.h"
-+ 
-+ static int brcmf_of_get_country_codes(struct device *dev,
-+@@ -153,3 +154,38 @@ void brcmf_of_probe(struct device *dev,
-+ 	sdio->oob_irq_nr = irq;
-+ 	sdio->oob_irq_flags = irqf;
-+ }
-++
-++struct brcmf_firmware_mapping *
-++brcmf_of_fwnames(struct device *dev, u32 *fwname_count)
-++{
-++	struct device_node *np = dev->of_node;
-++	struct brcmf_firmware_mapping *fwnames;
-++	struct device_node *map_np, *fw_np;
-++	int of_count;
-++	int count = 0;
-++
-++	map_np = of_get_child_by_name(np, "firmwares");
-++	of_count = of_get_child_count(map_np);
-++	if (!of_count)
-++		return NULL;
-++
-++	fwnames = devm_kcalloc(dev, of_count,
-++			       sizeof(struct brcmf_firmware_mapping),
-++			       GFP_KERNEL);
-++
-++	for_each_child_of_node(map_np, fw_np)
-++	{
-++		struct brcmf_firmware_mapping *cur = &fwnames[count];
-++
-++		if (of_property_read_u32(fw_np, "chipid", &cur->chipid) ||
-++		    of_property_read_u32(fw_np, "revmask", &cur->revmask))
-++			continue;
-++		cur->fw_base = of_get_property(fw_np, "fw_base", NULL);
-++		if (cur->fw_base)
-++			count++;
-++	}
-++
-++	*fwname_count = count;
-++
-++	return count ? fwnames : NULL;
-++}
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h
-+@@ -5,9 +5,16 @@
-+ #ifdef CONFIG_OF
-+ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-+ 		    struct brcmf_mp_device *settings);
-++struct brcmf_firmware_mapping *
-++brcmf_of_fwnames(struct device *dev, u32 *map_count);
-+ #else
-+ static void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-+ 			   struct brcmf_mp_device *settings)
-+ {
-+ }
-++static struct brcmf_firmware_mapping *
-++brcmf_of_fwnames(struct device *dev, u32 *map_count)
-++{
-++	return NULL;
-++}
-+ #endif /* CONFIG_OF */
-+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
-+@@ -35,6 +35,7 @@
-+ #include "core.h"
-+ #include "common.h"
-+ #include "bcdc.h"
-++#include "of.h"
-+ 
-+ #define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
-+ #define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
-+@@ -633,7 +634,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "b
-+ /* per-board firmware binaries */
-+ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-sdio.*.bin");
-+ 
-+-static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
-++static const struct brcmf_firmware_mapping sdio_fwnames[] = {
-+ 	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
-+ 	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
-+ 	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
-+@@ -659,6 +660,9 @@ static const struct brcmf_firmware_mappi
-+ 	BRCMF_FW_ENTRY(CY_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752)
-+ };
-+ 
-++static const struct brcmf_firmware_mapping *brcmf_sdio_fwnames = sdio_fwnames;
-++static u32 brcmf_sdio_fwnames_count = ARRAY_SIZE(sdio_fwnames);
-++
-+ #define TXCTL_CREDITS	2
-+ 
-+ static void pkt_align(struct sk_buff *p, int len, int align)
-+@@ -4140,7 +4144,7 @@ int brcmf_sdio_get_fwname(struct device
-+ 
-+ 	fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
-+ 				       brcmf_sdio_fwnames,
-+-				       ARRAY_SIZE(brcmf_sdio_fwnames),
-++				       brcmf_sdio_fwnames_count,
-+ 				       fwnames, ARRAY_SIZE(fwnames));
-+ 	if (!fwreq)
-+ 		return -ENOMEM;
-+@@ -4196,6 +4200,9 @@ static const struct brcmf_bus_ops brcmf_
-+ #define BRCMF_SDIO_FW_CODE	0
-+ #define BRCMF_SDIO_FW_NVRAM	1
-+ 
-++static struct brcmf_fw_request *
-++brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus);
-++
-+ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
-+ 					 struct brcmf_fw_request *fwreq)
-+ {
-+@@ -4211,6 +4218,22 @@ static void brcmf_sdio_firmware_callback
-+ 
-+ 	brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err);
-+ 
-++	if (err && brcmf_sdio_fwnames != sdio_fwnames) {
-++		/* Try again with the standard firmware names */
-++		brcmf_sdio_fwnames = sdio_fwnames;
-++		brcmf_sdio_fwnames_count = ARRAY_SIZE(sdio_fwnames);
-++		kfree(fwreq);
-++		fwreq = brcmf_sdio_prepare_fw_request(bus);
-++		if (!fwreq) {
-++			err = -ENOMEM;
-++			goto fail;
-++		}
-++		err = brcmf_fw_get_firmwares(dev, fwreq,
-++					     brcmf_sdio_firmware_callback);
-++		if (!err)
-++			return;
-++	}
-++
-+ 	if (err)
-+ 		goto fail;
-+ 
-+@@ -4419,7 +4442,7 @@ brcmf_sdio_prepare_fw_request(struct brc
-+ 
-+ 	fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
-+ 				       brcmf_sdio_fwnames,
-+-				       ARRAY_SIZE(brcmf_sdio_fwnames),
-++				       brcmf_sdio_fwnames_count,
-+ 				       fwnames, ARRAY_SIZE(fwnames));
-+ 	if (!fwreq)
-+ 		return NULL;
-+@@ -4437,6 +4460,9 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
-+ 	struct brcmf_sdio *bus;
-+ 	struct workqueue_struct *wq;
-+ 	struct brcmf_fw_request *fwreq;
-++	struct brcmf_firmware_mapping *of_fwnames, *fwnames = NULL;
-++	const int fwname_size = sizeof(struct brcmf_firmware_mapping);
-++	u32 of_fw_count;
-+ 
-+ 	brcmf_dbg(TRACE, "Enter\n");
-+ 
-+@@ -4519,6 +4545,21 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
-+ 
-+ 	brcmf_dbg(INFO, "completed!!\n");
-+ 
-++	of_fwnames = brcmf_of_fwnames(sdiodev->dev, &of_fw_count);
-++	if (of_fwnames)
-++		fwnames = devm_kcalloc(sdiodev->dev,
-++				       of_fw_count + brcmf_sdio_fwnames_count,
-++				       fwname_size, GFP_KERNEL);
-++
-++	if (fwnames) {
-++		/* The array is scanned in order, so overrides come first */
-++		memcpy(fwnames, of_fwnames, of_fw_count * fwname_size);
-++		memcpy(fwnames + of_fw_count, sdio_fwnames,
-++		       brcmf_sdio_fwnames_count * fwname_size);
-++		brcmf_sdio_fwnames = fwnames;
-++		brcmf_sdio_fwnames_count += of_fw_count;
-++	}
-++
-+ 	fwreq = brcmf_sdio_prepare_fw_request(bus);
-+ 	if (!fwreq) {
-+ 		ret = -ENOMEM;
 diff --git a/package/kernel/mac80211/patches/brcm/998-survey.patch b/package/kernel/mac80211/patches/brcm/998-survey.patch
-index beaf1ac872..d194e25177 100644
+index beaf1ac872..74aa3e3925 100644
 --- a/package/kernel/mac80211/patches/brcm/998-survey.patch
 +++ b/package/kernel/mac80211/patches/brcm/998-survey.patch
 @@ -1,6 +1,6 @@
@@ -3447,7 +2545,7 @@ index beaf1ac872..d194e25177 100644
  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 -@@ -1357,6 +1357,8 @@ int brcmf_attach(struct device *dev)
-+@@ -1363,6 +1363,8 @@ int brcmf_attach(struct device *dev)
++@@ -1362,6 +1362,8 @@ int brcmf_attach(struct device *dev)
   
   	/* Link to bus module */
   	drvr->hdrlen = 0;
@@ -3456,7 +2554,7 @@ index beaf1ac872..d194e25177 100644
   	/* Attach and link in the protocol */
   	ret = brcmf_proto_attach(drvr);
 -@@ -1439,6 +1441,12 @@ void brcmf_detach(struct device *dev)
-+@@ -1445,6 +1447,12 @@ void brcmf_detach(struct device *dev)
++@@ -1444,6 +1446,12 @@ void brcmf_detach(struct device *dev)
   	if (drvr == NULL)
   		return;
   
@@ -3591,53 +2689,6 @@ index d358cfe367..140949f9a8 100644
   MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
   
   static const struct pci_device_id mwl8k_pci_id_table[] = {
-diff --git a/package/kernel/mac80211/patches/mwl/900-mwifiex-increase-the-global-limit-up-to-4-SSID.patch b/package/kernel/mac80211/patches/mwl/900-mwifiex-increase-the-global-limit-up-to-4-SSID.patch
-new file mode 100644
-index 0000000000..4115eeccbb
---- /dev/null
-+++ b/package/kernel/mac80211/patches/mwl/900-mwifiex-increase-the-global-limit-up-to-4-SSID.patch
-@@ -0,0 +1,41 @@
-+From ef8098cd6cb8b5989afef2e8461fe6ba9570a854 Mon Sep 17 00:00:00 2001
-+From: Josef Schlehofer <pepe.schlehofer@gmail.com>
-+Date: Wed, 24 Nov 2021 12:47:40 +0100
-+Subject: [PATCH] mwifiex: increase the global limit up to 4 SSID
-+
-+Firmware for SDIO (88W8997), which is used in Turris MOX SDIO addon [1],
-+allows up to 4 SSID. Unfortunately, driver (even in mainline kernel)
-+has a global limit for all Marvell cards up to 3 SSID.
-+
-+Pali Rohár tested this patch and verified that the SDIO Wi-Fi addon works
-+with the 4 SSID. So, let's increase the global limit from 3 to 4.
-+
-+Ideally, this patch should be done differently before sending
-+it to Linux kernel. It means that limit definition should be moved to
-+the card-specific structure.
-+
-+[1] https://docs.turris.cz/hw/mox/addons/#wi-fi-sdio
-+---
-+ drivers/net/wireless/marvell/mwifiex/decl.h | 4 ++--
-+ 1 file changed, 2 insertions(+), 2 deletions(-)
-+
-+--- a/drivers/net/wireless/marvell/mwifiex/decl.h
-++++ b/drivers/net/wireless/marvell/mwifiex/decl.h
-+@@ -30,7 +30,7 @@
-+ #include <net/cfg80211.h>
-+ 
-+ #define MWIFIEX_BSS_COEX_COUNT	     2
-+-#define MWIFIEX_MAX_BSS_NUM         (3)
-++#define MWIFIEX_MAX_BSS_NUM         (4)
-+ 
-+ #define MWIFIEX_DMA_ALIGN_SZ	    64
-+ #define MWIFIEX_RX_HEADROOM	    64
-+@@ -112,7 +112,7 @@
-+ #define MWIFIEX_RATE_INDEX_OFDM0   4
-+ 
-+ #define MWIFIEX_MAX_STA_NUM		3
-+-#define MWIFIEX_MAX_UAP_NUM		3
-++#define MWIFIEX_MAX_UAP_NUM		4
-+ #define MWIFIEX_MAX_P2P_NUM		3
-+ 
-+ #define MWIFIEX_A_BAND_START_FREQ	5000
 diff --git a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch
 index a35cf1875a..96b1ce77e9 100644
 --- a/package/kernel/mac80211/patches/mwl/940-mwl8k_init_devices_synchronously.patch
@@ -3659,226 +2710,2085 @@ index a35cf1875a..96b1ce77e9 100644
   		return;
   	priv = hw->priv;
   
-diff --git a/package/kernel/mac80211/patches/mwl/950-mwifiex-Print-stringified-name-of-command-in-error-l.patch b/package/kernel/mac80211/patches/mwl/950-mwifiex-Print-stringified-name-of-command-in-error-l.patch
+diff --git a/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch b/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch
 new file mode 100644
-index 0000000000..8fa3924e60
+index 0000000000..4d5b670279
 --- /dev/null
-+++ b/package/kernel/mac80211/patches/mwl/950-mwifiex-Print-stringified-name-of-command-in-error-l.patch
-@@ -0,0 +1,189 @@
-+From f7252b1b5755150535af226e806594bbefd45e0f Mon Sep 17 00:00:00 2001
-+From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
-+Date: Sun, 26 Sep 2021 14:39:44 +0200
-+Subject: [PATCH] mwifiex: Print stringified name of command in error log
++++ b/package/kernel/mac80211/patches/rt2x00/001-rt2x00-define-RF5592-in-init_eeprom-routine.patch
+@@ -0,0 +1,52 @@
++From patchwork Sat Sep 17 20:26:27 2022
++Content-Type: text/plain; charset="utf-8"
 +MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
 +Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979242
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:26:27 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 01/16] rt2x00: define RF5592 in init_eeprom routine
++Message-ID: 
++ <d7eccb2c7b8ec4cd360fa2007796abffc35abb0d.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
 +
-+Failed hex command number in error log is hard to understand.
-+So add also more human readable stringified command name into error log.
++Fix incorrect RF value encoded in EEPROM on devices with Ralink Rt5592
++PCIe radio (a single chip 2T2R 802.11abgn solution).
 +
-+Signed-off-by: Pali Rohár <pali@kernel.org>
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
 +---
-+ drivers/net/wireless/marvell/mwifiex/cmdevt.c | 96 +++++++++++++++++--
-+ drivers/net/wireless/marvell/mwifiex/main.h   |  2 +
-+ .../wireless/marvell/mwifiex/sta_cmdresp.c    |  5 +-
-+ .../net/wireless/marvell/mwifiex/uap_cmd.c    |  3 +-
-+ 4 files changed, 95 insertions(+), 11 deletions(-)
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
++ 1 file changed, 2 insertions(+)
 +
-+--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
-++++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
-+@@ -28,6 +28,85 @@
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -9461,6 +9461,8 @@ static int rt2800_init_eeprom(struct rt2
++ 		rf = RF3853;
++ 	else if (rt2x00_rt(rt2x00dev, RT5350))
++ 		rf = RF5350;
+++	else if (rt2x00_rt(rt2x00dev, RT5592))
+++		rf = RF5592;
++ 	else
++ 		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
 + 
-+ static void mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter);
+diff --git a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch b/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch
+new file mode 100644
+index 0000000000..02d1f7a2e5
+--- /dev/null
++++ b/package/kernel/mac80211/patches/rt2x00/002-rt2x00-add-throughput-LED-trigger.patch
+@@ -0,0 +1,76 @@
++From patchwork Sat Sep 17 20:26:40 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 7bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979243
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:26:40 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 02/16] rt2x00: add throughput LED trigger
++Message-ID: 
++ <73f5ba4134e621462a26186449400cf0c1ac1730.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: David Bauer <mail@david-bauer.net>
++
++This adds a (currently missing) throughput LED trigger for the rt2x00
++driver. Previously, LED triggers had to be assigned to the netdev, which
++was limited to a single VAP.
++
++Tested-by: Christoph Krapp <achterin@googlemail.com>
++Signed-off-by: David Bauer <mail@david-bauer.net>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 18 ++++++++++++++++++
++ 1 file changed, 18 insertions(+)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++@@ -1093,6 +1093,19 @@ static void rt2x00lib_remove_hw(struct r
++ 	kfree(rt2x00dev->spec.channels_info);
++ }
 + 
-++const char *
-++mwifiex_cmd_to_str(u16 command)
-++{
-++	switch (command) {
-++	case HostCmd_CMD_GET_HW_SPEC:			return "GET_HW_SPEC";
-++	case HostCmd_CMD_802_11_SCAN:			return "SCAN";
-++	case HostCmd_CMD_802_11_GET_LOG:		return "GET_LOG";
-++	case HostCmd_CMD_MAC_MULTICAST_ADR:		return "MAC_MULTICAST_ADR";
-++	case HostCmd_CMD_802_11_EEPROM_ACCESS:		return "EEPROM_ACCESS";
-++	case HostCmd_CMD_802_11_ASSOCIATE:		return "ASSOCIATE";
-++	case HostCmd_CMD_802_11_SNMP_MIB:		return "SNMP_MIB";
-++	case HostCmd_CMD_MAC_REG_ACCESS:		return "MAC_REG_ACCESS";
-++	case HostCmd_CMD_BBP_REG_ACCESS:		return "BBP_REG_ACCESS";
-++	case HostCmd_CMD_RF_REG_ACCESS:			return "RF_REG_ACCESS";
-++	case HostCmd_CMD_PMIC_REG_ACCESS:		return "PMIC_REG_ACCESS";
-++	case HostCmd_CMD_RF_TX_PWR:			return "RF_TX_PWR";
-++	case HostCmd_CMD_RF_ANTENNA:			return "RF_ANTENNA";
-++	case HostCmd_CMD_802_11_DEAUTHENTICATE:		return "DEAUTHENTICATE";
-++	case HostCmd_CMD_MAC_CONTROL:			return "MAC_CONTROL";
-++	case HostCmd_CMD_802_11_AD_HOC_START:		return "AD_HOC_START";
-++	case HostCmd_CMD_802_11_AD_HOC_JOIN:		return "AD_HOC_JOIN";
-++	case HostCmd_CMD_802_11_AD_HOC_STOP:		return "AD_HOC_STOP";
-++	case HostCmd_CMD_802_11_MAC_ADDRESS:		return "MAC_ADDRESS";
-++	case HostCmd_CMD_802_11D_DOMAIN_INFO:		return "DOMAIN_INFO";
-++	case HostCmd_CMD_802_11_KEY_MATERIAL:		return "KEY_MATERIAL";
-++	case HostCmd_CMD_802_11_BG_SCAN_CONFIG:		return "BG_SCAN_CONFIG";
-++	case HostCmd_CMD_802_11_BG_SCAN_QUERY:		return "BG_SCAN_QUERY";
-++	case HostCmd_CMD_WMM_GET_STATUS:		return "WMM_GET_STATUS";
-++	case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:	return "SUBSCRIBE_EVENT";
-++	case HostCmd_CMD_802_11_TX_RATE_QUERY:		return "TX_RATE_QUERY";
-++	case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:	return "IBSS_COALESCING_STATUS";
-++	case HostCmd_CMD_MEM_ACCESS:			return "MEM_ACCESS";
-++	case HostCmd_CMD_CFG_DATA:			return "CFG_DATA";
-++	case HostCmd_CMD_VERSION_EXT:			return "VERSION_EXT";
-++	case HostCmd_CMD_MEF_CFG:			return "MEF_CFG";
-++	case HostCmd_CMD_RSSI_INFO:			return "RSSI_INFO";
-++	case HostCmd_CMD_FUNC_INIT:			return "FUNC_INIT";
-++	case HostCmd_CMD_FUNC_SHUTDOWN:			return "FUNC_SHUTDOWN";
-++	case HOST_CMD_APCMD_SYS_RESET:			return "SYS_RESET";
-++	case HostCmd_CMD_UAP_SYS_CONFIG:		return "UAP_SYS_CONFIG";
-++	case HostCmd_CMD_UAP_BSS_START:			return "UAP_BSS_START";
-++	case HostCmd_CMD_UAP_BSS_STOP:			return "UAP_BSS_STOP";
-++	case HOST_CMD_APCMD_STA_LIST:			return "STA_LIST";
-++	case HostCmd_CMD_UAP_STA_DEAUTH:		return "UAP_STA_DEAUTH";
-++	case HostCmd_CMD_11N_CFG:			return "11N_CFG";
-++	case HostCmd_CMD_11N_ADDBA_REQ:			return "ADDBA_REQ";
-++	case HostCmd_CMD_11N_ADDBA_RSP:			return "ADDBA_RSP";
-++	case HostCmd_CMD_11N_DELBA:			return "DELBA";
-++	case HostCmd_CMD_RECONFIGURE_TX_BUFF:		return "RECONFIGURE_TX_BUFF";
-++	case HostCmd_CMD_CHAN_REPORT_REQUEST:		return "CHAN_REPORT_REQUEST";
-++	case HostCmd_CMD_AMSDU_AGGR_CTRL:		return "AMSDU_AGGR_CTRL";
-++	case HostCmd_CMD_TXPWR_CFG:			return "TXPWR_CFG";
-++	case HostCmd_CMD_TX_RATE_CFG:			return "TX_RATE_CFG";
-++	case HostCmd_CMD_ROBUST_COEX:			return "ROBUST_COEX";
-++	case HostCmd_CMD_802_11_PS_MODE_ENH:		return "PS_MODE_ENH";
-++	case HostCmd_CMD_802_11_HS_CFG_ENH:		return "HS_CFG_ENH";
-++	case HostCmd_CMD_P2P_MODE_CFG:			return "P2P_MODE_CFG";
-++	case HostCmd_CMD_CAU_REG_ACCESS:		return "CAU_REG_ACCESS";
-++	case HostCmd_CMD_SET_BSS_MODE:			return "SET_BSS_MODE";
-++	case HostCmd_CMD_PCIE_DESC_DETAILS:		return "PCIE_DESC_DETAILS";
-++	case HostCmd_CMD_802_11_SCAN_EXT:		return "SCAN_EXT";
-++	case HostCmd_CMD_COALESCE_CFG:			return "COALESCE_CFG";
-++	case HostCmd_CMD_MGMT_FRAME_REG:		return "MGMT_FRAME_REG";
-++	case HostCmd_CMD_REMAIN_ON_CHAN:		return "REMAIN_ON_CHAN";
-++	case HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG:		return "GTK_REKEY_OFFLOAD_CFG";
-++	case HostCmd_CMD_11AC_CFG:			return "11AC_CFG";
-++	case HostCmd_CMD_HS_WAKEUP_REASON:		return "HS_WAKEUP_REASON";
-++	case HostCmd_CMD_TDLS_CONFIG:			return "TDLS_CONFIG";
-++	case HostCmd_CMD_MC_POLICY:			return "MC_POLICY";
-++	case HostCmd_CMD_TDLS_OPER:			return "TDLS_OPER";
-++	case HostCmd_CMD_FW_DUMP_EVENT:			return "FW_DUMP_EVENT";
-++	case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:		return "SDIO_SP_RX_AGGR_CFG";
-++	case HostCmd_CMD_STA_CONFIGURE:			return "STA_CONFIGURE";
-++	case HostCmd_CMD_CHAN_REGION_CFG:		return "CHAN_REGION_CFG";
-++	case HostCmd_CMD_PACKET_AGGR_CTRL:		return "PACKET_AGGR_CTRL";
-++	default:					return "UNKNOWN";
-++	}
-++}
+++static const struct ieee80211_tpt_blink rt2x00_tpt_blink[] = {
+++	{ .throughput = 0 * 1024, .blink_time = 334 },
+++	{ .throughput = 1 * 1024, .blink_time = 260 },
+++	{ .throughput = 2 * 1024, .blink_time = 220 },
+++	{ .throughput = 5 * 1024, .blink_time = 190 },
+++	{ .throughput = 10 * 1024, .blink_time = 170 },
+++	{ .throughput = 25 * 1024, .blink_time = 150 },
+++	{ .throughput = 54 * 1024, .blink_time = 130 },
+++	{ .throughput = 120 * 1024, .blink_time = 110 },
+++	{ .throughput = 265 * 1024, .blink_time = 80 },
+++	{ .throughput = 586 * 1024, .blink_time = 50 },
+++};
 ++
-+ /*
-+  * This function initializes a command node.
-+  *
-+@@ -205,8 +284,8 @@ static int mwifiex_dnld_cmd_to_fw(struct
-+ 	    cmd_code != HostCmd_CMD_FUNC_SHUTDOWN &&
-+ 	    cmd_code != HostCmd_CMD_FUNC_INIT) {
-+ 		mwifiex_dbg(adapter, ERROR,
-+-			    "DNLD_CMD: FW in reset state, ignore cmd %#x\n",
-+-			cmd_code);
-++			    "DNLD_CMD: FW in reset state, ignore cmd %s (%#x)\n",
-++			    mwifiex_cmd_to_str(cmd_code), cmd_code);
-+ 		mwifiex_recycle_cmd_node(adapter, cmd_node);
-+ 		queue_work(adapter->workqueue, &adapter->main_work);
-+ 		return -1;
-+@@ -660,8 +739,8 @@ int mwifiex_send_cmd(struct mwifiex_priv
-+ 	/* Return error, since the command preparation failed */
-+ 	if (ret) {
-+ 		mwifiex_dbg(adapter, ERROR,
-+-			    "PREP_CMD: cmd %#x preparation failed\n",
-+-			cmd_no);
-++			    "PREP_CMD: cmd %s (%#x) preparation failed\n",
-++			    mwifiex_cmd_to_str(cmd_no), cmd_no);
-+ 		mwifiex_insert_cmd_to_free_q(adapter, cmd_node);
-+ 		return -1;
-+ 	}
-+@@ -900,8 +979,9 @@ int mwifiex_process_cmdresp(struct mwifi
-+ 	if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
-+ 		if (ret) {
-+ 			mwifiex_dbg(adapter, ERROR,
-+-				    "%s: cmd %#x failed during\t"
-+-				    "initialization\n", __func__, cmdresp_no);
-++				    "%s: cmd %s (%#x) failed during\t"
-++				    "initialization\n", __func__,
-++				    mwifiex_cmd_to_str(cmdresp_no), cmdresp_no);
-+ 			mwifiex_init_fw_complete(adapter);
-+ 			return -1;
-+ 		} else if (adapter->last_init_cmd == cmdresp_no)
-+@@ -1264,8 +1344,8 @@ mwifiex_process_sleep_confirm_resp(struc
-+ 
-+ 	if (command != HostCmd_CMD_802_11_PS_MODE_ENH) {
-+ 		mwifiex_dbg(adapter, ERROR,
-+-			    "%s: rcvd unexpected resp for cmd %#x, result = %x\n",
-+-			    __func__, command, result);
-++			    "%s: rcvd unexpected resp for cmd %s (%#x), result = %x\n",
-++			    __func__, mwifiex_cmd_to_str(command), command, result);
-+ 		return;
-+ 	}
++ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
++ {
++ 	struct hw_mode_spec *spec = &rt2x00dev->spec;
++@@ -1174,6 +1187,11 @@ static int rt2x00lib_probe_hw(struct rt2
 + 
-+--- a/drivers/net/wireless/marvell/mwifiex/main.h
-++++ b/drivers/net/wireless/marvell/mwifiex/main.h
-+@@ -1106,6 +1106,8 @@ void mwifiex_cancel_all_pending_cmd(stru
-+ void mwifiex_cancel_pending_scan_cmd(struct mwifiex_adapter *adapter);
-+ void mwifiex_cancel_scan(struct mwifiex_adapter *adapter);
-+ 
-++const char *mwifiex_cmd_to_str(u16 command);
-++
-+ void mwifiex_recycle_cmd_node(struct mwifiex_adapter *adapter,
-+ 			      struct cmd_ctrl_node *cmd_node);
-+ 
-+--- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
-++++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
-+@@ -48,8 +48,9 @@ mwifiex_process_cmdresp_error(struct mwi
-+ 	struct host_cmd_ds_802_11_ps_mode_enh *pm;
-+ 
-+ 	mwifiex_dbg(adapter, ERROR,
-+-		    "CMD_RESP: cmd %#x error, result=%#x\n",
-+-		    resp->command, resp->result);
-++		    "CMD_RESP: cmd %s (%#x) error, result=%#x\n",
-++		    mwifiex_cmd_to_str(le16_to_cpu(resp->command)),
-++		    le16_to_cpu(resp->command), le16_to_cpu(resp->result));
-+ 
-+ 	if (adapter->curr_cmd->wait_q_enabled)
-+ 		adapter->cmd_wait_q.status = -1;
-+--- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
-++++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
-+@@ -806,7 +806,8 @@ int mwifiex_uap_prepare_cmd(struct mwifi
-+ 		break;
-+ 	default:
-+ 		mwifiex_dbg(priv->adapter, ERROR,
-+-			    "PREP_CMD: unknown cmd %#x\n", cmd_no);
-++			    "PREP_CMD: unknown cmd (%s) %#x\n",
-++			    mwifiex_cmd_to_str(cmd_no), cmd_no);
-+ 		return -1;
-+ 	}
++ #undef RT2X00_TASKLET_INIT
 + 
+++	ieee80211_create_tpt_led_trigger(rt2x00dev->hw,
+++					 IEEE80211_TPT_LEDTRIG_FL_RADIO,
+++					 rt2x00_tpt_blink,
+++					 ARRAY_SIZE(rt2x00_tpt_blink));
+++
++ 	/*
++ 	 * Register HW.
++ 	 */
 diff --git a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch b/package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch
-index 13298d3ce8..96eeb37dc6 100644
+deleted file mode 100644
+index 13298d3ce8..0000000000
 --- a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch
-@@ -40,7 +40,7 @@ Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
- 
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -9442,6 +9442,8 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9435,6 +9435,8 @@ static int rt2800_init_eeprom(struct rt2
-  		rf = RF3853;
-  	else if (rt2x00_rt(rt2x00dev, RT5350))
-  		rf = RF5350;
-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 e74d9a9aa0..bd33b2efbd 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
--@@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE=
-+@@ -345,6 +345,7 @@ RT2X00_LIB_FIRMWARE=
++++ /dev/null
+@@ -1,51 +0,0 @@
+-From patchwork Thu Dec 27 14:05:26 2018
+-Content-Type: text/plain; charset="utf-8"
+-MIME-Version: 1.0
+-Content-Transfer-Encoding: 8bit
+-X-Patchwork-Submitter: Tom Psyborg <pozega.tomislav@gmail.com>
+-X-Patchwork-Id: 10743707
+-X-Patchwork-Delegate: kvalo@adurom.com
+-From: =?utf-8?q?Tomislav_Po=C5=BEega?= <pozega.tomislav@gmail.com>
+-To: linux-wireless@vger.kernel.org
+-Cc: kvalo@codeaurora.org, hauke@hauke-m.de, nbd@nbd.name,
+-        john@phrozen.org, sgruszka@redhat.com, daniel@makrotopia.org
+-Subject: [PATCH 2/2] rt2x00: define RF5592 in init_eeprom routine
+-Date: Thu, 27 Dec 2018 15:05:26 +0100
+-Message-Id: <1545919526-4074-2-git-send-email-pozega.tomislav@gmail.com>
+-X-Mailer: git-send-email 1.7.0.4
+-In-Reply-To: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
+-References: <1545919526-4074-1-git-send-email-pozega.tomislav@gmail.com>
+-MIME-Version: 1.0
+-Sender: linux-wireless-owner@vger.kernel.org
+-Precedence: bulk
+-List-ID: <linux-wireless.vger.kernel.org>
+-X-Mailing-List: linux-wireless@vger.kernel.org
+-X-Virus-Scanned: ClamAV using ClamSMTP
+-
+-This patch fixes following crash on Linksys EA2750 during 5GHz wifi
+-init:
+-
+-[    7.955153] rt2800pci 0000:01:00.0: card - bus=0x1, slot = 0x0 irq=4
+-[    7.962259] rt2800pci 0000:01:00.0: loaded eeprom from mtd device "Factory"
+-[    7.969435] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 5592, rev 0222 detected
+-[    7.977348] ieee80211 phy0: rt2800_init_eeprom: Error - Invalid RF chipset 0x0000 detected
+-[    7.985793] ieee80211 phy0: rt2x00lib_probe_dev: Error - Failed to allocate device
+-[    7.993569] CPU 0 Unable to handle kernel paging request at virtual address 00000024, epc == 800c8f54, ra == 80249ff8
+-[    8.004408] Oops[#1]:
+-
+-Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
+----
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c |    2 ++
+- 1 files changed, 2 insertions(+), 0 deletions(-)
+-
+---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -9442,6 +9442,8 @@ static int rt2800_init_eeprom(struct rt2
+- 		rf = RF3853;
+- 	else if (rt2x00_rt(rt2x00dev, RT5350))
+- 		rf = RF5350;
+-+	else if (rt2x00_rt(rt2x00dev, RT5592))
+-+		rf = RF5592;
+- 	else
+- 		rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
+- 
+diff --git a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch
+similarity index 58%
+rename from package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
+rename to package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch
+index 3de562df8c..26c2020918 100644
+--- a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
++++ b/package/kernel/mac80211/patches/rt2x00/003-rt2x00-add-support-for-external-PA-on-MT7620.patch
+@@ -1,22 +1,42 @@
+-From 9782a7f7488443568fa4d6088b73c9aff7eb8510 Mon Sep 17 00:00:00 2001
++From patchwork Sat Sep 17 20:26:55 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979244
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:26:55 +0100
+ From: Daniel Golle <daniel@makrotopia.org>
+-Date: Wed, 19 Apr 2017 16:14:53 +0200
+-Subject: [PATCH] rt2x00: add support for external PA on MT7620
+-To: Stanislaw Gruszka <sgruszka@redhat.com>
+-Cc: Helmut Schaa <helmut.schaa@googlemail.com>,
+-    linux-wireless@vger.kernel.org,
+-    Kalle Valo <kvalo@codeaurora.org>
+-Content-Type: text/plain; charset="UTF-8"
+-Content-Transfer-Encoding: quoted-printable
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 03/16] rt2x00: add support for external PA on MT7620
++Message-ID: 
++ <af2c68ff831816a86fc39b0c10911c129a1f03dc.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
+ 
+-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+-Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
+-[pozega.tomislav@gmail.com: use chanreg and dccal helpers.]
++Implement support for external PA connected to MT7620A.
+ 
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++[pozega.tomislav@gmail.com: use chanreg and dccal helpers.]
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
+ ---
+- drivers/net/wireless/ralink/rt2x00/rt2800.h    |  1 +
+- drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 70 +++++++++++++++++++++++++-
+- 2 files changed, 70 insertions(+), 1 deletion(-)
++ drivers/net/wireless/ralink/rt2x00/rt2800.h   |  1 +
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 52 ++++++++++++++++++-
++ 2 files changed, 52 insertions(+), 1 deletion(-)
+ 
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+@@ -24,21 +44,19 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
+  #define EEPROM_NIC_CONF2_RX_STREAM	FIELD16(0x000f)
+  #define EEPROM_NIC_CONF2_TX_STREAM	FIELD16(0x00f0)
+  #define EEPROM_NIC_CONF2_CRYSTAL	FIELD16(0x0600)
+-+#define EEPROM_NIC_CONF2_EXTERNAL_PA	FIELD16(0xc000)
+++#define EEPROM_NIC_CONF2_EXTERNAL_PA	FIELD16(0x8000)
+  
+  /*
+   * EEPROM LNA
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -4360,6 +4360,45 @@ static void rt2800_config_channel(struct
++@@ -4372,6 +4372,43 @@ static void rt2800_config_channel(struct
+  			rt2800_iq_calibrate(rt2x00dev, rf->channel);
+  	}
+  
+ +	if (rt2x00_rt(rt2x00dev, RT6352)) {
+ +		if (test_bit(CAPABILITY_EXTERNAL_PA_TX0,
+ +			     &rt2x00dev->cap_flags)) {
+-+			rt2x00_warn(rt2x00dev, "Using incomplete support for " \
+-+					       "external PA\n");
+ +			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
+ +			reg |= 0x00000101;
+ +			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
+@@ -76,7 +94,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
+  	bbp = rt2800_bbp_read(rt2x00dev, 4);
+  	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
+  	rt2800_bbp_write(rt2x00dev, 4, bbp);
+-@@ -9585,7 +9624,8 @@ static int rt2800_init_eeprom(struct rt2
++@@ -9592,7 +9629,8 @@ static int rt2800_init_eeprom(struct rt2
+  	 */
+  	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
+  
+@@ -86,19 +104,19 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
+  		if (rt2x00_get_field16(eeprom,
+  		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
+  		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
+-@@ -9596,6 +9636,18 @@ static int rt2800_init_eeprom(struct rt2
++@@ -9603,6 +9641,18 @@ static int rt2800_init_eeprom(struct rt2
+  			      &rt2x00dev->cap_flags);
+  	}
+  
+ +	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF2);
+ +
+ +	if (rt2x00_rt(rt2x00dev, RT6352) && eeprom != 0 && eeprom != 0xffff) {
+-+		if (rt2x00_get_field16(eeprom,
+-+		    EEPROM_NIC_CONF2_EXTERNAL_PA)) {
+-+		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
+-+			      &rt2x00dev->cap_flags);
+-+		    __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
+-+			      &rt2x00dev->cap_flags);
+++		if (!rt2x00_get_field16(eeprom,
+++					EEPROM_NIC_CONF2_EXTERNAL_PA)) {
+++			__clear_bit(CAPABILITY_EXTERNAL_PA_TX0,
+++				    &rt2x00dev->cap_flags);
+++			__clear_bit(CAPABILITY_EXTERNAL_PA_TX1,
+++				    &rt2x00dev->cap_flags);
+ +		}
+ +	}
+ +
+diff --git a/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch b/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch
+new file mode 100644
+index 0000000000..c9b0d82b64
+--- /dev/null
++++ b/package/kernel/mac80211/patches/rt2x00/004-rt2x00-move-up-and-reuse-busy-wait-functions.patch
+@@ -0,0 +1,178 @@
++From patchwork Sat Sep 17 20:27:10 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 7bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979245
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:27:10 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 04/16] rt2x00: move up and reuse busy wait functions
++Message-ID: 
++ <3fdb9dc15e76a9f9c1948b4a3a1308a7a5677bb8.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++Move bbp_ready and rf_ready busy wait functions up in the code so they
++can more easily be used. Allow specifying register mask in rf_ready
++function which is useful for calibration routines which will be added
++in follow-up commits.
++
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 99 +++++++++----------
++ 1 file changed, 46 insertions(+), 53 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -2143,6 +2143,48 @@ void rt2800_config_erp(struct rt2x00_dev
++ }
++ EXPORT_SYMBOL_GPL(rt2800_config_erp);
++ 
+++static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev,
+++				    const struct rt2x00_field32 mask)
+++{
+++	unsigned int i;
+++	u32 reg;
+++
+++	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
+++		reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+++		if (!rt2x00_get_field32(reg, mask))
+++			return 0;
+++
+++		udelay(REGISTER_BUSY_DELAY);
+++	}
+++
+++	rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n");
+++	return -EACCES;
+++}
+++
+++static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
+++{
+++	unsigned int i;
+++	u8 value;
+++
+++	/*
+++	 * BBP was enabled after firmware was loaded,
+++	 * but we need to reactivate it now.
+++	 */
+++	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
+++	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
+++	msleep(1);
+++
+++	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
+++		value = rt2800_bbp_read(rt2x00dev, 0);
+++		if ((value != 0xff) && (value != 0x00))
+++			return 0;
+++		udelay(REGISTER_BUSY_DELAY);
+++	}
+++
+++	rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
+++	return -EACCES;
+++}
+++
++ static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev)
++ {
++ 	u32 reg;
++@@ -3799,10 +3841,9 @@ static void rt2800_config_alc(struct rt2
++ 			      struct ieee80211_channel *chan,
++ 			      int power_level) {
++ 	u16 eeprom, target_power, max_power;
++-	u32 mac_sys_ctrl, mac_status;
+++	u32 mac_sys_ctrl;
++ 	u32 reg;
++ 	u8 bbp;
++-	int i;
++ 
++ 	/* hardware unit is 0.5dBm, limited to 23.5dBm */
++ 	power_level *= 2;
++@@ -3838,16 +3879,8 @@ static void rt2800_config_alc(struct rt2
++ 	/* Disable Tx/Rx */
++ 	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0);
++ 	/* Check MAC Tx/Rx idle */
++-	for (i = 0; i < 10000; i++) {
++-		mac_status = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
++-		if (mac_status & 0x3)
++-			usleep_range(50, 200);
++-		else
++-			break;
++-	}
++-
++-	if (i == 10000)
++-		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
+++		rt2x00_warn(rt2x00dev, "RF busy while configuring ALC\n");
++ 
++ 	if (chan->center_freq > 2457) {
++ 		bbp = rt2800_bbp_read(rt2x00dev, 30);
++@@ -6275,46 +6308,6 @@ static int rt2800_init_registers(struct
++ 	return 0;
++ }
++ 
++-static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
++-{
++-	unsigned int i;
++-	u32 reg;
++-
++-	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
++-		reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
++-		if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY))
++-			return 0;
++-
++-		udelay(REGISTER_BUSY_DELAY);
++-	}
++-
++-	rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n");
++-	return -EACCES;
++-}
++-
++-static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
++-{
++-	unsigned int i;
++-	u8 value;
++-
++-	/*
++-	 * BBP was enabled after firmware was loaded,
++-	 * but we need to reactivate it now.
++-	 */
++-	rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
++-	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
++-	msleep(1);
++-
++-	for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
++-		value = rt2800_bbp_read(rt2x00dev, 0);
++-		if ((value != 0xff) && (value != 0x00))
++-			return 0;
++-		udelay(REGISTER_BUSY_DELAY);
++-	}
++-
++-	rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
++-	return -EACCES;
++-}
++ 
++ static void rt2800_bbp4_mac_if_ctrl(struct rt2x00_dev *rt2x00dev)
++ {
++@@ -9136,7 +9129,7 @@ int rt2800_enable_radio(struct rt2x00_de
++ 	/*
++ 	 * Wait BBP/RF to wake up.
++ 	 */
++-	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev)))
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
++ 		return -EIO;
++ 
++ 	/*
+diff --git a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch
+similarity index 51%
+rename from package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch
+rename to package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch
+index 8064c4fe3a..9ba16bee12 100644
+--- a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch
++++ b/package/kernel/mac80211/patches/rt2x00/005-rt2x00-add-RF-self-TXDC-calibration-for-MT7620.patch
+@@ -1,6 +1,48 @@
++From patchwork Sat Sep 17 20:27:26 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979246
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:27:26 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 05/16] rt2x00: add RF self TXDC calibration for MT7620
++Message-ID: 
++ <dbb6e5a0c12d6101477bd09e83253091d21512c9.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++
++Add TX self calibration based on mtk driver.
++
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++v2: use ++i instead of i = i + 1 in loops
++
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 48 +++++++++++++++++++
++ 1 file changed, 48 insertions(+)
++
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8445,6 +8445,56 @@ static void rt2800_init_rfcsr_5592(struc
++@@ -8454,6 +8454,53 @@ static void rt2800_init_rfcsr_5592(struc
+  	rt2800_led_open_drain_enable(rt2x00dev);
+  }
+  
+@@ -10,7 +52,6 @@
+ +	u32 mac0518, mac051c, mac0528, mac052c;
+ +	u8 i;
+ +
+-+	rt2x00_info(rt2x00dev, "RF Tx self calibration start\n");
+ +	mac0518 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
+ +	mac051c = rt2800_register_read(rt2x00dev, RF_BYPASS0);
+ +	mac0528 = rt2800_register_read(rt2x00dev, RF_CONTROL2);
+@@ -27,19 +68,19 @@
+ +	rfb7r1_org = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1);
+ +
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, 0x4);
+-+	for (i = 0; i < 100; i = i + 1) {
+-+		udelay(50);
+++	for (i = 0; i < 100; ++i) {
+++		usleep_range(50, 100);
+ +		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
+-+		if((rfvalue & 0x04) != 0x4)
+++		if ((rfvalue & 0x04) != 0x4)
+ +			break;
+ +	}
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rfb5r1_org);
+ +
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, 0x4);
+-+	for (i = 0; i < 100; i = i + 1) {
+-+		udelay(50);
+++	for (i = 0; i < 100; ++i) {
+++		usleep_range(50, 100);
+ +		rfvalue = rt2800_rfcsr_read_bank(rt2x00dev, 7, 1);
+-+		if((rfvalue & 0x04) != 0x4)
+++		if ((rfvalue & 0x04) != 0x4)
+ +			break;
+ +	}
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 7, 1, rfb7r1_org);
+@@ -50,14 +91,12 @@
+ +	rt2800_register_write(rt2x00dev, RF_BYPASS0, mac051c);
+ +	rt2800_register_write(rt2x00dev, RF_CONTROL2, mac0528);
+ +	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
+-+
+-+	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
+ +}
+ +
+  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
+  				       bool set_bw, bool is_ht40)
+  {
+-@@ -9052,6 +9102,7 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -9061,6 +9108,7 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
+  
+diff --git a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch b/package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch
+similarity index 66%
+rename from package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch
+rename to package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch
+index 539a1b53b3..e15de28ea0 100644
+--- a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch
++++ b/package/kernel/mac80211/patches/rt2x00/006-rt2x00-add-r-calibration-for-MT7620.patch
+@@ -1,14 +1,68 @@
++From patchwork Sat Sep 17 20:27:41 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979247
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:27:41 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 06/16] rt2x00: add r calibration for MT7620
++Message-ID: 
++ <e0c34f233089bec4eb73826bc4f512166ee25934.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++
++Add r calibration code as found in mtk driver.
++
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++v2: use rt2800_wait_bbp_rf_ready()
++
++ drivers/net/wireless/ralink/rt2x00/rt2800.h   |   2 +
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 133 ++++++++++++++++++
++ 2 files changed, 135 insertions(+)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
++@@ -1016,6 +1016,8 @@
++  */
++ #define MAC_STATUS_CFG			0x1200
++ #define MAC_STATUS_CFG_BBP_RF_BUSY	FIELD32(0x00000003)
+++#define MAC_STATUS_CFG_BBP_RF_BUSY_TX	FIELD32(0x00000001)
+++#define MAC_STATUS_CFG_BBP_RF_BUSY_RX	FIELD32(0x00000002)
++ 
++ /*
++  * PWR_PIN_CFG:
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8495,6 +8495,155 @@ static void rt2800_rf_self_txdc_cal(stru
+- 	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
++@@ -8501,6 +8501,138 @@ static void rt2800_rf_self_txdc_cal(stru
++ 	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
+  }
+  
+ +static int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2)
+ +{
+-+	int calcode;
+-+	calcode = ((d2 - d1) * 1000) / 43;
+-+	if ((calcode%10) >= 5)
+++	int calcode = ((d2 - d1) * 1000) / 43;
+++
+++	if ((calcode % 10) >= 5)
+ +		calcode += 10;
+ +	calcode = (calcode / 10);
+ +
+@@ -28,8 +82,7 @@
+ +	char d1 = 0, d2 = 0;
+ +	u8 rfvalue;
+ +	u32 MAC_RF_BYPASS0, MAC_RF_CONTROL0, MAC_PWR_PIN_CFG;
+-+	u32 maccfg, macstatus;
+-+	int i;
+++	u32 maccfg;
+ +
+ +	saverfb0r1 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 1);
+ +	saverfb0r34 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 34);
+@@ -53,30 +106,14 @@
+ +	maccfg &= (~0x04);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg);
+ +
+-+	for (i = 0; i < 10000; i++) {
+-+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macstatus & 0x1)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+-+
+-+	if (i == 10000)
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX)))
+ +		rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n");
+ +
+ +	maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	maccfg &= (~0x04);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg);
+ +
+-+	for (i = 0; i < 10000; i++) {
+-+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macstatus & 0x2)
+-+			udelay(50);
+-+		else
+-+			break;
+-+		}
+-+
+-+	if (i == 10000)
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX)))
+ +		rt2x00_warn(rt2x00dev, "Wait MAC Rx Status to MAX !!!\n");
+ +
+ +	rfvalue = (MAC_RF_BYPASS0 | 0x3004);
+@@ -98,7 +135,7 @@
+ +
+ +	rt2800_bbp_write(rt2x00dev, 47, 0x04);
+ +	rt2800_bbp_write(rt2x00dev, 22, 0x80);
+-+	udelay(100);
+++	usleep_range(100, 200);
+ +	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
+ +	if (bytevalue > 128)
+ +		d1 = bytevalue - 256;
+@@ -108,7 +145,7 @@
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 0, 35, 0x01);
+ +
+ +	rt2800_bbp_write(rt2x00dev, 22, 0x80);
+-+	udelay(100);
+++	usleep_range(100, 200);
+ +	bytevalue = rt2800_bbp_read(rt2x00dev, 49);
+ +	if (bytevalue > 128)
+ +		d2 = bytevalue - 256;
+@@ -156,7 +193,7 @@
+  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
+  				       bool set_bw, bool is_ht40)
+  {
+-@@ -9102,6 +9251,7 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -9108,6 +9240,7 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
+  
+diff --git a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch
+similarity index 50%
+rename from package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch
+rename to package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch
+index a45e7aec32..a09d0abed0 100644
+--- a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch
++++ b/package/kernel/mac80211/patches/rt2x00/007-rt2x00-add-RXDCOC-calibration-for-MT7620.patch
+@@ -1,13 +1,54 @@
++From patchwork Sat Sep 17 20:27:56 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979248
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:27:56 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 07/16] rt2x00: add RXDCOC calibration for MT7620
++Message-ID: 
++ <850b30f652e88de30d79e968af4eb47aa5bc2511.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++
++Add RXDCOC calibration code from mtk driver.
++
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++[fixed typo reported by Serge Vasilugin <vasilugin@yandex.ru>]
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 60 +++++++++++++++++++
++ 1 file changed, 60 insertions(+)
++
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8644,6 +8644,70 @@ static void rt2800_r_calibration(struct
++@@ -8633,6 +8633,65 @@ static void rt2800_r_calibration(struct
+  	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
+  }
+  
+ +static void rt2800_rxdcoc_calibration(struct rt2x00_dev *rt2x00dev)
+ +{
+ +	u8 bbpreg = 0;
+-+	u32 macvalue = 0, macvalue1 = 0;
+++	u32 macvalue = 0;
+ +	u8 saverfb0r2, saverfb5r4, saverfb7r4, rfvalue;
+ +	int i;
+ +
+@@ -24,15 +65,10 @@
+ +	macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x8);
+ +
+-+	for (i = 0; i < 10000; i++) {
+-+		macvalue1 = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macvalue1 & 0x1)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX)))
+++		rt2x00_warn(rt2x00dev, "RF TX busy in RX RXDCOC calibration\n");
+ +
+-+	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
+++	saverfb5r4 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);
+ +	saverfb7r4 = rt2800_rfcsr_read_bank(rt2x00dev, 7, 4);
+ +	saverfb5r4 = saverfb5r4 & (~0x40);
+ +	saverfb7r4 = saverfb7r4 & (~0x40);
+@@ -49,9 +85,9 @@
+ +
+ +	for (i = 0; i < 10000; i++) {
+ +		bbpreg = rt2800_bbp_read(rt2x00dev, 159);
+-+		if ((bbpreg & 0x40)==0)
+++		if ((bbpreg & 0x40) == 0)
+ +			break;
+-+		udelay(50);
+++		usleep_range(50, 100);
+ +	}
+ +
+ +	bbpreg = rt2800_bbp_read(rt2x00dev, 159);
+@@ -71,7 +107,7 @@
+  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
+  				       bool set_bw, bool is_ht40)
+  {
+-@@ -9253,6 +9317,7 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -9242,6 +9301,7 @@ static void rt2800_init_rfcsr_6352(struc
+  
+  	rt2800_r_calibration(rt2x00dev);
+  	rt2800_rf_self_txdc_cal(rt2x00dev);
+diff --git a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch b/package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch
+similarity index 63%
+rename from package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch
+rename to package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch
+index bc03d720be..c532ba512b 100644
+--- a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch
++++ b/package/kernel/mac80211/patches/rt2x00/008-rt2x00-add-RXIQ-calibration-for-MT7620.patch
+@@ -1,17 +1,62 @@
++From patchwork Sat Sep 17 20:28:10 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979249
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:28:10 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 08/16] rt2x00: add RXIQ calibration for MT7620
++Message-ID: 
++ <033a39a697d51f6df258acea4c33608e0944fe4c.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++
++Add RXIQ calibration found in mtk driver. With old openwrt builds this
++gets us ~8Mbps more of RX bandwidth (test with iPA/eLNA layout).
++
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++v2: use rt2800_wait_bbp_rf_ready(), fix indentation
++
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 375 ++++++++++++++++++
++ 1 file changed, 375 insertions(+)
++
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -8708,6 +8708,384 @@ static void rt2800_rxdcoc_calibration(st
++@@ -8692,6 +8692,380 @@ static void rt2800_rxdcoc_calibration(st
+  	rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
+  }
+  
+-+static u32 rt2800_do_sqrt_accumulation(u32 si) {
+++static u32 rt2800_do_sqrt_accumulation(u32 si)
+++{
+ +	u32 root, root_pre, bit;
+ +	char i;
+++
+ +	bit = 1 << 15;
+ +	root = 0;
+ +	for (i = 15; i >= 0; i = i - 1) {
+ +		root_pre = root + bit;
+-+		if ((root_pre*root_pre) <= si)
+++		if ((root_pre * root_pre) <= si)
+ +			root = root_pre;
+ +		bit = bit >> 1;
+ +	}
+@@ -19,7 +64,8 @@
+ +	return root;
+ +}
+ +
+-+static void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev) {
+++static void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev)
+++{
+ +	u8 rfb0r1, rfb0r2, rfb0r42;
+ +	u8 rfb4r0, rfb4r19;
+ +	u8 rfb5r3, rfb5r4, rfb5r17, rfb5r18, rfb5r19, rfb5r20;
+@@ -43,8 +89,8 @@
+ +	u32 orig_RF_BYPASS1 = 0;
+ +	u32 orig_RF_CONTROL3 = 0;
+ +	u32 orig_RF_BYPASS3 = 0;
+-+	u32 macstatus, bbpval1 = 0;
+-+	u8 rf_vga_table[] = {0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
+++	u32 bbpval1 = 0;
+++	static const u8 rf_vga_table[] = {0x20, 0x21, 0x22, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
+ +
+ +	savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	orig_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
+@@ -59,16 +105,8 @@
+ +
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x0);
+ +
+-+	for (i = 0; i < 10000; i++) {
+-+		macstatus = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macstatus & 0x3)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+-+
+-+	if (i == 10000)
+-+		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
+++		rt2x00_warn(rt2x00dev, "Timeout waiting for MAC status in RXIQ calibration\n");
+ +
+ +	bbpval = bbp4 & (~0x18);
+ +	bbpval = bbp4 | 0x00;
+@@ -165,7 +203,7 @@
+ +			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006);
+ +			udelay(1);
+ +
+-+			bbpval = bbp1 & (~ 0x18);
+++			bbpval = bbp1 & (~0x18);
+ +			bbpval = bbpval | 0x00;
+ +			rt2800_bbp_write(rt2x00dev, 1, bbpval);
+ +
+@@ -184,132 +222,133 @@
+ +			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006);
+ +			udelay(1);
+ +
+-+			bbpval = bbp1 & (~ 0x18);
+++			bbpval = bbp1 & (~0x18);
+ +			bbpval = bbpval | 0x08;
+ +			rt2800_bbp_write(rt2x00dev, 1, bbpval);
+ +
+ +			rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x01);
+ +		}
+-+		udelay(500);
+++		usleep_range(500, 1500);
+ +
+ +		vga_idx = 0;
+-+			while (vga_idx < 11) {
+-+				rt2800_rfcsr_write_dccal(rt2x00dev, 3, rf_vga_table[vga_idx]);
+-+				rt2800_rfcsr_write_dccal(rt2x00dev, 4, rf_vga_table[vga_idx]);
+-+
+-+				rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x93);
+-+
+-+				for (i = 0; i < 10000; i++) {
+-+					bbpval = rt2800_bbp_read(rt2x00dev, 159);
+-+					if ((bbpval & 0xff) == 0x93)
+-+						udelay(50);
+-+					else
+-+						break;
+-+					}
+-+
+-+				if ((bbpval & 0xff) == 0x93) {
+-+					rt2x00_warn(rt2x00dev, "Fatal Error: Calibration doesn't finish");
+-+					goto restore_value;
+-+				}
+++		while (vga_idx < 11) {
+++			rt2800_rfcsr_write_dccal(rt2x00dev, 3, rf_vga_table[vga_idx]);
+++			rt2800_rfcsr_write_dccal(rt2x00dev, 4, rf_vga_table[vga_idx]);
+ +
+-+				for (i = 0; i < 5; i++) {
+-+					u32 bbptemp = 0;
+-+					u8 value = 0;
+-+					int result = 0;
+-+
+-+					rt2800_bbp_write(rt2x00dev, 158, 0x1e);
+-+					rt2800_bbp_write(rt2x00dev, 159, i);
+-+					rt2800_bbp_write(rt2x00dev, 158, 0x22);
+-+					value = rt2800_bbp_read(rt2x00dev, 159);
+-+					bbptemp = bbptemp + (value << 24);
+-+					rt2800_bbp_write(rt2x00dev, 158, 0x21);
+-+					value = rt2800_bbp_read(rt2x00dev, 159);
+-+					bbptemp = bbptemp + (value << 16);
+-+					rt2800_bbp_write(rt2x00dev, 158, 0x20);
+-+					value = rt2800_bbp_read(rt2x00dev, 159);
+-+					bbptemp = bbptemp + (value << 8);
+-+					rt2800_bbp_write(rt2x00dev, 158, 0x1f);
+-+					value = rt2800_bbp_read(rt2x00dev, 159);
+-+					bbptemp = bbptemp + value;
+-+
+-+					if ((i < 2) && (bbptemp & 0x800000))
+-+						result = (bbptemp & 0xffffff) - 0x1000000;
+-+					else if (i == 4)
+-+						result = bbptemp;
+-+					else
+-+						result = bbptemp;
+-+
+-+					if (i == 0)
+-+						mi = result/4096;
+-+					else if (i == 1)
+-+						mq = result/4096;
+-+					else if (i == 2)
+-+						si = bbptemp/4096;
+-+					else if (i == 3)
+-+						sq = bbptemp/4096;
+-+					else
+-+						riq = result/4096;
+-+				}
+-+
+-+				bbpval1 = si - mi*mi;
+-+				rt2x00_dbg(rt2x00dev, "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d", si, sq, riq, bbpval1, vga_idx);
+++			rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x93);
+ +
+-+				if (bbpval1 >= (100*100))
+++			for (i = 0; i < 10000; i++) {
+++				bbpval = rt2800_bbp_read(rt2x00dev, 159);
+++				if ((bbpval & 0xff) == 0x93)
+++					usleep_range(50, 100);
+++				else
+ +					break;
+++				}
+ +
+-+				if (bbpval1 <= 100)
+-+					vga_idx = vga_idx + 9;
+-+				else if (bbpval1 <= 158)
+-+					vga_idx = vga_idx + 8;
+-+				else if (bbpval1 <= 251)
+-+					vga_idx = vga_idx + 7;
+-+				else if (bbpval1 <= 398)
+-+					vga_idx = vga_idx + 6;
+-+				else if (bbpval1 <= 630)
+-+					vga_idx = vga_idx + 5;
+-+				else if (bbpval1 <= 1000)
+-+					vga_idx = vga_idx + 4;
+-+				else if (bbpval1 <= 1584)
+-+					vga_idx = vga_idx + 3;
+-+				else if (bbpval1 <= 2511)
+-+					vga_idx = vga_idx + 2;
+++			if ((bbpval & 0xff) == 0x93) {
+++				rt2x00_warn(rt2x00dev, "Fatal Error: Calibration doesn't finish");
+++				goto restore_value;
+++			}
+++			for (i = 0; i < 5; i++) {
+++				u32 bbptemp = 0;
+++				u8 value = 0;
+++				int result = 0;
+++
+++				rt2800_bbp_write(rt2x00dev, 158, 0x1e);
+++				rt2800_bbp_write(rt2x00dev, 159, i);
+++				rt2800_bbp_write(rt2x00dev, 158, 0x22);
+++				value = rt2800_bbp_read(rt2x00dev, 159);
+++				bbptemp = bbptemp + (value << 24);
+++				rt2800_bbp_write(rt2x00dev, 158, 0x21);
+++				value = rt2800_bbp_read(rt2x00dev, 159);
+++				bbptemp = bbptemp + (value << 16);
+++				rt2800_bbp_write(rt2x00dev, 158, 0x20);
+++				value = rt2800_bbp_read(rt2x00dev, 159);
+++				bbptemp = bbptemp + (value << 8);
+++				rt2800_bbp_write(rt2x00dev, 158, 0x1f);
+++				value = rt2800_bbp_read(rt2x00dev, 159);
+++				bbptemp = bbptemp + value;
+++
+++				if (i < 2 && (bbptemp & 0x800000))
+++					result = (bbptemp & 0xffffff) - 0x1000000;
+++				else if (i == 4)
+++					result = bbptemp;
+++				else
+++					result = bbptemp;
+++
+++				if (i == 0)
+++					mi = result / 4096;
+++				else if (i == 1)
+++					mq = result / 4096;
+++				else if (i == 2)
+++					si = bbptemp / 4096;
+++				else if (i == 3)
+++					sq = bbptemp / 4096;
+ +				else
+-+					vga_idx = vga_idx + 1;
+++					riq = result / 4096;
+ +			}
+ +
+-+		sigma_i = rt2800_do_sqrt_accumulation(100*(si - mi*mi));
+-+		sigma_q = rt2800_do_sqrt_accumulation(100*(sq - mq*mq));
+-+		r_iq = 10*(riq-(mi*mq));
+++			bbpval1 = si - mi * mi;
+++			rt2x00_dbg(rt2x00dev,
+++				   "RXIQ si=%d, sq=%d, riq=%d, bbpval %d, vga_idx %d",
+++				   si, sq, riq, bbpval1, vga_idx);
+++
+++			if (bbpval1 >= (100 * 100))
+++				break;
+++
+++			if (bbpval1 <= 100)
+++				vga_idx = vga_idx + 9;
+++			else if (bbpval1 <= 158)
+++				vga_idx = vga_idx + 8;
+++			else if (bbpval1 <= 251)
+++				vga_idx = vga_idx + 7;
+++			else if (bbpval1 <= 398)
+++				vga_idx = vga_idx + 6;
+++			else if (bbpval1 <= 630)
+++				vga_idx = vga_idx + 5;
+++			else if (bbpval1 <= 1000)
+++				vga_idx = vga_idx + 4;
+++			else if (bbpval1 <= 1584)
+++				vga_idx = vga_idx + 3;
+++			else if (bbpval1 <= 2511)
+++				vga_idx = vga_idx + 2;
+++			else
+++				vga_idx = vga_idx + 1;
+++		}
+++
+++		sigma_i = rt2800_do_sqrt_accumulation(100 * (si - mi * mi));
+++		sigma_q = rt2800_do_sqrt_accumulation(100 * (sq - mq * mq));
+++		r_iq = 10 * (riq - (mi * mq));
+ +
+ +		rt2x00_dbg(rt2x00dev, "Sigma_i=%d, Sigma_q=%d, R_iq=%d", sigma_i, sigma_q, r_iq);
+ +
+-+		if (((sigma_i <= 1400 ) && (sigma_i >= 1000))
+-+			&& ((sigma_i - sigma_q) <= 112)
+-+			&& ((sigma_i - sigma_q) >= -112)
+-+			&& ((mi <= 32) && (mi >= -32))
+-+			&& ((mq <= 32) && (mq >= -32))) {
+-+				r_iq = 10*(riq-(mi*mq));
+-+				rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", sigma_i, sigma_q, r_iq);
+-+
+-+				g_rx = (1000 * sigma_q) / sigma_i;
+-+				g_imb = ((-2) * 128 * (1000 - g_rx)) / (1000 + g_rx);
+-+				ph_rx = (r_iq * 2292) / (sigma_i * sigma_q);
+-+				rt2x00_info(rt2x00dev, "RXIQ G_imb=%d, Ph_rx=%d\n", g_imb, ph_rx);
+-+
+-+				if ((ph_rx > 20) || (ph_rx < -20)) {
+-+					ph_rx = 0;
+-+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
+-+				}
+++		if (sigma_i <= 1400 && sigma_i >= 1000 &&
+++		    (sigma_i - sigma_q) <= 112 &&
+++		    (sigma_i - sigma_q) >= -112 &&
+++		    mi <= 32 && mi >= -32 &&
+++		    mq <= 32 && mq >= -32) {
+++			r_iq = 10 * (riq - (mi * mq));
+++			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n",
+++				   sigma_i, sigma_q, r_iq);
+++
+++			g_rx = (1000 * sigma_q) / sigma_i;
+++			g_imb = ((-2) * 128 * (1000 - g_rx)) / (1000 + g_rx);
+++			ph_rx = (r_iq * 2292) / (sigma_i * sigma_q);
+++
+++			if (ph_rx > 20 || ph_rx < -20) {
+++				ph_rx = 0;
+++				rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
+++			}
+ +
+-+				if ((g_imb > 12) || (g_imb < -12)) {
+-+					g_imb = 0;
+-+					rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
+-+				}
+++			if (g_imb > 12 || g_imb < -12) {
+++				g_imb = 0;
+++				rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
+ +			}
+-+		else {
+++		} else {
+ +			g_imb = 0;
+ +			ph_rx = 0;
+-+			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n", sigma_i, sigma_q, r_iq);
+++			rt2x00_dbg(rt2x00dev, "RXIQ Sigma_i=%d, Sigma_q=%d, R_iq=%d\n",
+++				   sigma_i, sigma_q, r_iq);
+ +			rt2x00_warn(rt2x00dev, "RXIQ calibration FAIL");
+ +		}
+ +
+@@ -385,7 +424,7 @@
+  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
+  				       bool set_bw, bool is_ht40)
+  {
+-@@ -9320,6 +9698,7 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -9304,6 +9678,7 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rxdcoc_calibration(rt2x00dev);
+  	rt2800_bw_filter_calibration(rt2x00dev, true);
+  	rt2800_bw_filter_calibration(rt2x00dev, false);
+diff --git a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch b/package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch
+similarity index 84%
+rename from package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch
+rename to package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch
+index bd664d044e..092d91afb6 100644
+--- a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch
++++ b/package/kernel/mac80211/patches/rt2x00/010-rt2x00-add-TX-LOFT-calibration-for-MT7620.patch
+@@ -1,10 +1,56 @@
++From patchwork Sat Sep 17 20:28:43 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 8bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979251
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:28:43 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 10/16] rt2x00: add TX LOFT calibration for MT7620
++Message-ID: 
++ <d9295a9138a1f552b648aacb84e1419d38f5c896.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++From: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++
++Add TX LOFT calibration from mtk driver.
++
++Signed-off-by: Tomislav PoĹľega <pozega.tomislav@gmail.com>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++v2: use helper functions, make tables static const, remove useless
++    debug prints
++v3: don't export function not used anywhere else
++Reported-by: kernel test robot <lkp@intel.com>
++
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 902 ++++++++++++++++++
++ .../net/wireless/ralink/rt2x00/rt2800lib.h    |  10 +
++ 2 files changed, 912 insertions(+)
++
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -9086,6 +9086,943 @@ restore_value:
++@@ -9066,6 +9066,907 @@ restore_value:
+  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
+  }
+  
+-+static void rt2800_rf_configstore(struct rt2x00_dev *rt2x00dev, rf_reg_pair rf_reg_record[][13], u8 chain)
+++static void rt2800_rf_configstore(struct rt2x00_dev *rt2x00dev,
+++				  struct rf_reg_pair rf_reg_record[][13], u8 chain)
+ +{
+ +	u8 rfvalue = 0;
+ +
+@@ -116,13 +162,11 @@
+ +		rf_reg_record[CHAIN_1][12].value = rfvalue;
+ +	} else {
+ +		rt2x00_warn(rt2x00dev, "Unknown chain = %u\n", chain);
+-+		return;
+ +	}
+-+
+-+	return;
+ +}
+ +
+-+static void rt2800_rf_configrecover(struct rt2x00_dev *rt2x00dev, rf_reg_pair rf_record[][13])
+++static void rt2800_rf_configrecover(struct rt2x00_dev *rt2x00dev,
+++				    struct rf_reg_pair rf_record[][13])
+ +{
+ +	u8 chain_index = 0, record_index = 0;
+ +	u8 bank = 0, rf_register = 0, value = 0;
+@@ -133,11 +177,10 @@
+ +			rf_register = rf_record[chain_index][record_index].reg;
+ +			value = rf_record[chain_index][record_index].value;
+ +			rt2800_rfcsr_write_bank(rt2x00dev, bank, rf_register, value);
+-+			rt2x00_dbg(rt2x00dev, "bank: %d, rf_register: %d, value: %x\n", bank, rf_register, value);
+++			rt2x00_dbg(rt2x00dev, "bank: %d, rf_register: %d, value: %x\n",
+++				   bank, rf_register, value);
+ +		}
+ +	}
+-+
+-+	return;
+ +}
+ +
+ +static void rt2800_setbbptonegenerator(struct rt2x00_dev *rt2x00dev)
+@@ -155,15 +198,13 @@
+ +	rt2800_bbp_write(rt2x00dev, 159, 0x3F);
+ +
+ +	rt2800_bbp_write(rt2x00dev, 244, 0x40);
+-+
+-+	return;
+ +}
+ +
+ +static u32 rt2800_do_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx, u8 read_neg)
+ +{
+ +	u32 macvalue = 0;
+ +	int fftout_i = 0, fftout_q = 0;
+-+	u32 ptmp=0, pint = 0;
+++	u32 ptmp = 0, pint = 0;
+ +	u8 bbp = 0;
+ +	u8 tidxi;
+ +
+@@ -173,7 +214,7 @@
+ +	bbp = 0x9b;
+ +
+ +	while (bbp == 0x9b) {
+-+		udelay(10);
+++		usleep_range(10, 50);
+ +		bbp = rt2800_bbp_read(rt2x00dev, 159);
+ +		bbp = bbp & 0xff;
+ +	}
+@@ -218,10 +259,11 @@
+ +	return pint;
+ +}
+ +
+-+static u32 rt2800_read_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx) {
+++static u32 rt2800_read_fft_accumulation(struct rt2x00_dev *rt2x00dev, u8 tidx)
+++{
+ +	u32 macvalue = 0;
+ +	int fftout_i = 0, fftout_q = 0;
+-+	u32 ptmp=0, pint = 0;
+++	u32 ptmp = 0, pint = 0;
+ +
+ +	rt2800_bbp_write(rt2x00dev, 158, 0xBA);
+ +	rt2800_bbp_write(rt2x00dev, 159, tidx);
+@@ -237,7 +279,6 @@
+ +	ptmp = (fftout_i * fftout_i);
+ +	ptmp = ptmp + (fftout_q * fftout_q);
+ +	pint = ptmp;
+-+	rt2x00_info(rt2x00dev, "I = %d,  Q = %d, power = %x\n", fftout_i, fftout_q, pint);
+ +
+ +	return pint;
+ +}
+@@ -251,18 +292,17 @@
+ +	rt2800_bbp_write(rt2x00dev, 159, bbp);
+ +
+ +	if (ch_idx == 0)
+-+		bbp = (iorq == 0) ? 0xb1: 0xb2;
+++		bbp = (iorq == 0) ? 0xb1 : 0xb2;
+ +	else
+-+		bbp = (iorq == 0) ? 0xb8: 0xb9;
+++		bbp = (iorq == 0) ? 0xb8 : 0xb9;
+ +
+ +	rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +	bbp = dc;
+ +	rt2800_bbp_write(rt2x00dev, 159, bbp);
+-+
+-+	return;
+ +}
+ +
+-+static void rt2800_loft_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 alc_idx, u8 dc_result[][RF_ALC_NUM][2])
+++static void rt2800_loft_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx,
+++			       u8 alc_idx, u8 dc_result[][RF_ALC_NUM][2])
+ +{
+ +	u32 p0 = 0, p1 = 0, pf = 0;
+ +	char idx0 = 0, idx1 = 0;
+@@ -276,8 +316,6 @@
+ +
+ +	for (bidx = 5; bidx >= 0; bidx--) {
+ +		for (iorq = 0; iorq <= 1; iorq++) {
+-+			rt2x00_dbg(rt2x00dev, "\n========================================================\n");
+-+
+ +			if (idxf[iorq] == 0x20) {
+ +				idx0 = 0x20;
+ +				p0 = pf;
+@@ -288,16 +326,17 @@
+ +				p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
+ +			}
+ +
+-+			idx1 = idxf[iorq] + ((bidx == 5) ? 0 : ibit);
+++			idx1 = idxf[iorq] + (bidx == 5 ? 0 : ibit);
+ +			idx1 = idx1 & 0x3F;
+ +			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idx1);
+ +			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
+ +
+-+			rt2x00_dbg(rt2x00dev, "alc=%u, IorQ=%u, idx_final=%2x\n", alc_idx, iorq, idxf[iorq]);
+-+			rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pf=%x, idx_0=%x, idx_1=%x, ibit=%x !\n", p0, p1, pf, idx0, idx1, ibit);
+++			rt2x00_dbg(rt2x00dev, "alc=%u, IorQ=%u, idx_final=%2x\n",
+++				   alc_idx, iorq, idxf[iorq]);
+++			rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pf=%x, idx_0=%x, idx_1=%x, ibit=%x\n",
+++				   p0, p1, pf, idx0, idx1, ibit);
+ +
+-+			if ((bidx != 5) && (pf <= p0) && (pf < p1)) {
+-+				pf = pf;
+++			if (bidx != 5 && pf <= p0 && pf < p1) {
+ +				idxf[iorq] = idxf[iorq];
+ +			} else if (p0 < p1) {
+ +				pf = p0;
+@@ -306,17 +345,15 @@
+ +				pf = p1;
+ +				idxf[iorq] = idx1 & 0x3F;
+ +			}
+-+			rt2x00_dbg(rt2x00dev, "IorQ=%u, idx_final[%u]:%x, pf:%8x\n", iorq, iorq, idxf[iorq], pf);
+++			rt2x00_dbg(rt2x00dev, "IorQ=%u, idx_final[%u]:%x, pf:%8x\n",
+++				   iorq, iorq, idxf[iorq], pf);
+ +
+ +			rt2800_write_dc(rt2x00dev, ch_idx, 0, iorq, idxf[iorq]);
+-+
+ +		}
+ +		ibit = ibit >> 1;
+ +	}
+ +	dc_result[ch_idx][alc_idx][0] = idxf[0];
+ +	dc_result[ch_idx][alc_idx][1] = idxf[1];
+-+
+-+	return;
+ +}
+ +
+ +static void rt2800_iq_search(struct rt2x00_dev *rt2x00dev, u8 ch_idx, u8 *ges, u8 *pes)
+@@ -334,26 +371,25 @@
+ +	u8 bbp = 0;
+ +	char bidx;
+ +
+-+	rt2x00_info(rt2x00dev, "IQCalibration Start!\n");
+ +	for (bidx = 5; bidx >= 1; bidx--) {
+ +		for (gop = 0; gop < 2; gop++) {
+-+			rt2x00_dbg(rt2x00dev, "\n========================================================\n");
+-+
+-+			if ((gop == 1) || (bidx < 4)) {
+++			if (gop == 1 || bidx < 4) {
+ +				if (gop == 0)
+ +					iq_err = gerr;
+ +				else
+ +					iq_err = perr;
+ +
+ +				first_search = (gop == 0) ? (bidx == 3) : (bidx == 5);
+-+				touch_neg_max = (gop) ? ((iq_err & 0x0F) == 0x08) : ((iq_err & 0x3F) == 0x20);
+++				touch_neg_max = (gop) ? ((iq_err & 0x0F) == 0x08) :
+++							((iq_err & 0x3F) == 0x20);
+ +
+ +				if (touch_neg_max) {
+ +					p0 = pf;
+ +					idx0 = iq_err;
+ +				} else {
+ +					idx0 = iq_err - ibit;
+-+					bbp = (ch_idx == 0) ? ((gop == 0) ? 0x28 : 0x29): ((gop == 0) ? 0x46 : 0x47);
+++					bbp = (ch_idx == 0) ? ((gop == 0) ? 0x28 : 0x29) :
+++							      ((gop == 0) ? 0x46 : 0x47);
+ +
+ +					rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +					rt2800_bbp_write(rt2x00dev, 159, idx0);
+@@ -364,26 +400,30 @@
+ +				idx1 = iq_err + (first_search ? 0 : ibit);
+ +				idx1 = (gop == 0) ? (idx1 & 0x0F) : (idx1 & 0x3F);
+ +
+-+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : (gop == 0) ? 0x46 : 0x47;
+++				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 :
+++				      (gop == 0) ? 0x46 : 0x47;
+ +
+ +				rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +				rt2800_bbp_write(rt2x00dev, 159, idx1);
+ +
+ +				p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
+ +
+-+				rt2x00_dbg(rt2x00dev, "p0=%x, p1=%x, pwer_final=%x, idx0=%x, idx1=%x, iq_err=%x, gop=%d, ibit=%x !\n", p0, p1, pf, idx0, idx1, iq_err, gop, ibit);
+-+
+-+				if ((!first_search) && (pf <= p0) && (pf < p1)) {
+-+					pf = pf;
+-+				} else if (p0 < p1) {
+-+					pf = p0;
+-+					iq_err = idx0;
+-+				} else {
+-+					pf = p1;
+-+					iq_err = idx1;
+++				rt2x00_dbg(rt2x00dev,
+++					   "p0=%x, p1=%x, pwer_final=%x, idx0=%x, idx1=%x, iq_err=%x, gop=%d, ibit=%x\n",
+++					   p0, p1, pf, idx0, idx1, iq_err, gop, ibit);
+++
+++				if (!(!first_search && pf <= p0 && pf < p1)) {
+++					if (p0 < p1) {
+++						pf = p0;
+++						iq_err = idx0;
+++					} else {
+++						pf = p1;
+++						iq_err = idx1;
+++					}
+ +				}
+ +
+-+				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 : (gop == 0) ? 0x46 : 0x47;
+++				bbp = (ch_idx == 0) ? (gop == 0) ? 0x28 : 0x29 :
+++						      (gop == 0) ? 0x46 : 0x47;
+ +
+ +				rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +				rt2800_bbp_write(rt2x00dev, 159, iq_err);
+@@ -393,8 +433,8 @@
+ +				else
+ +					perr = iq_err;
+ +
+-+				rt2x00_dbg(rt2x00dev, "IQCalibration pf=%8x (%2x, %2x) !\n", pf, gerr & 0x0F, perr & 0x3F);
+-+
+++				rt2x00_dbg(rt2x00dev, "IQCalibration pf=%8x (%2x, %2x) !\n",
+++					   pf, gerr & 0x0F, perr & 0x3F);
+ +			}
+ +		}
+ +
+@@ -423,25 +463,21 @@
+ +			rt2800_bbp_write(rt2x00dev, 159, pef & 0x3F);
+ +
+ +			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 1);
+-+			if ((gef == gsta) && (pef == psta)) {
+++			if (gef == gsta && pef == psta) {
+ +				pf = p1;
+ +				gerr = gef;
+ +				perr = pef;
+-+			}
+-+			else if (pf > p1){
+++			} else if (pf > p1) {
+ +				pf = p1;
+ +				gerr = gef;
+ +				perr = pef;
+ +			}
+-+			rt2x00_dbg(rt2x00dev, "Fine IQCalibration p1=%8x pf=%8x (%2x, %2x) !\n", p1, pf, gef & 0x0F, pef & 0x3F);
+++			rt2x00_dbg(rt2x00dev, "Fine IQCalibration p1=%8x pf=%8x (%2x, %2x) !\n",
+++				   p1, pf, gef & 0x0F, pef & 0x3F);
+ +		}
+ +
+ +	ges[ch_idx] = gerr & 0x0F;
+ +	pes[ch_idx] = perr & 0x3F;
+-+
+-+	rt2x00_info(rt2x00dev, "IQCalibration Done! CH = %u, (gain=%2x, phase=%2x)\n", ch_idx, gerr & 0x0F, perr & 0x3F);
+-+
+-+	return;
+ +}
+ +
+ +static void rt2800_rf_aux_tx0_loopback(struct rt2x00_dev *rt2x00dev)
+@@ -478,9 +514,9 @@
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 7, 20, 0x20);
+ +}
+ +
+-+void rt2800_loft_iq_calibration(struct rt2x00_dev *rt2x00dev)
+++static void rt2800_loft_iq_calibration(struct rt2x00_dev *rt2x00dev)
+ +{
+-+	rf_reg_pair rf_store[CHAIN_NUM][13];
+++	struct rf_reg_pair rf_store[CHAIN_NUM][13];
+ +	u32 macorg1 = 0;
+ +	u32 macorg2 = 0;
+ +	u32 macorg3 = 0;
+@@ -489,7 +525,7 @@
+ +	u32 orig528 = 0;
+ +	u32 orig52c = 0;
+ +
+-+	u32 savemacsysctrl = 0, mtxcycle = 0;
+++	u32 savemacsysctrl = 0;
+ +	u32 macvalue = 0;
+ +	u32 mac13b8 = 0;
+ +	u32 p0 = 0, p1 = 0;
+@@ -498,11 +534,8 @@
+ +	u8 rfvalue;
+ +	u8 loft_dc_search_result[CHAIN_NUM][RF_ALC_NUM][2];
+ +	u8 ger[CHAIN_NUM], per[CHAIN_NUM];
+-+	u8 rf_gain[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x0c};
+-+	u8 rfvga_gain_table[] = {0x24, 0x25, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3F};
+ +
+ +	u8 vga_gain[] = {14, 14};
+-+	u8 bbp_2324gain[] = {0x16, 0x14, 0x12, 0x10, 0x0c, 0x08};
+ +	u8 bbp = 0, ch_idx = 0, rf_alc_idx = 0, idx = 0;
+ +	u8 bbpr30, rfb0r39, rfb0r42;
+ +	u8 bbpr1;
+@@ -510,6 +543,11 @@
+ +	u8 bbpr241, bbpr242;
+ +	u8 count_step;
+ +
+++	static const u8 rf_gain[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x0c};
+++	static const u8 rfvga_gain_table[] = {0x24, 0x25, 0x26, 0x27, 0x28, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
+++					      0x31, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3F};
+++	static const u8 bbp_2324gain[] = {0x16, 0x14, 0x12, 0x10, 0x0c, 0x08};
+++
+ +	savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
+ +	macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
+@@ -524,29 +562,18 @@
+ +	macvalue &= (~0x04);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue);
+ +
+-+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
+-+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macvalue & 0x01)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX)))
+++		rt2x00_warn(rt2x00dev, "RF TX busy in LOFT IQ calibration\n");
+ +
+ +	macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	macvalue &= (~0x08);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue);
+ +
+-+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
+-+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macvalue & 0x02)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX)))
+++		rt2x00_warn(rt2x00dev, "RF RX busy in LOFT IQ calibration\n");
+ +
+-+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
+++	for (ch_idx = 0; ch_idx < 2; ch_idx++)
+ +		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
+-+	}
+ +
+ +	bbpr30 = rt2800_bbp_read(rt2x00dev, 30);
+ +	rfb0r39 = rt2800_rfcsr_read_bank(rt2x00dev, 0, 39);
+@@ -561,7 +588,7 @@
+ +
+ +	rt2800_setbbptonegenerator(rt2x00dev);
+ +
+-+	for (ch_idx = 0; ch_idx < 2; ch_idx ++) {
+++	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
+ +		rt2800_bbp_write(rt2x00dev, 23, 0x00);
+ +		rt2800_bbp_write(rt2x00dev, 24, 0x00);
+ +		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00);
+@@ -571,18 +598,17 @@
+ +		rt2800_register_write(rt2x00dev, 0x13b8, 0x10);
+ +		udelay(1);
+ +
+-+		if (ch_idx == 0) {
+++		if (ch_idx == 0)
+ +			rt2800_rf_aux_tx0_loopback(rt2x00dev);
+-+		} else {
+++		else
+ +			rt2800_rf_aux_tx1_loopback(rt2x00dev);
+-+		}
+++
+ +		udelay(1);
+ +
+-+		if (ch_idx == 0) {
+++		if (ch_idx == 0)
+ +			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001004);
+-+		} else {
+++		else
+ +			rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002004);
+-+		}
+ +
+ +		rt2800_bbp_write(rt2x00dev, 158, 0x05);
+ +		rt2800_bbp_write(rt2x00dev, 159, 0x00);
+@@ -608,7 +634,8 @@
+ +
+ +			if (rf_alc_idx == 0) {
+ +				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x21);
+-+				for (;vga_gain[ch_idx] > 0;vga_gain[ch_idx] = vga_gain[ch_idx] - 2) {
+++				for (; vga_gain[ch_idx] > 0;
+++				     vga_gain[ch_idx] = vga_gain[ch_idx] - 2) {
+ +					rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
+ +					rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
+ +					rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
+@@ -618,19 +645,19 @@
+ +					rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x21);
+ +					p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x0A, 0);
+ +					rt2x00_dbg(rt2x00dev, "LOFT AGC %d %d\n", p0, p1);
+-+					if ((p0 < 7000*7000) && (p1 < (7000*7000))) {
+++					if ((p0 < 7000 * 7000) && (p1 < (7000 * 7000)))
+ +						break;
+-+					}
+ +				}
+ +
+ +				rt2800_write_dc(rt2x00dev, ch_idx, 0, 0, 0x00);
+ +				rt2800_write_dc(rt2x00dev, ch_idx, 0, 1, 0x00);
+ +
+-+				rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n",vga_gain[ch_idx], rfvga_gain_table[vga_gain[ch_idx]]);
+++				rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx],
+++					   rfvga_gain_table[vga_gain[ch_idx]]);
+ +
+ +				if (vga_gain[ch_idx] < 0)
+ +					vga_gain[ch_idx] = 0;
+-+		 	}
+++			}
+ +
+ +			rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
+ +
+@@ -644,7 +671,7 @@
+ +	for (rf_alc_idx = 0; rf_alc_idx < 3; rf_alc_idx++) {
+ +		for (idx = 0; idx < 4; idx++) {
+ +			rt2800_bbp_write(rt2x00dev, 158, 0xB0);
+-+			bbp = (idx<<2) + rf_alc_idx;
+++			bbp = (idx << 2) + rf_alc_idx;
+ +			rt2800_bbp_write(rt2x00dev, 159, bbp);
+ +			rt2x00_dbg(rt2x00dev, " ALC %2x,", bbp);
+ +
+@@ -705,8 +732,6 @@
+ +	rt2800_register_write(rt2x00dev, RF_BYPASS2, orig52c);
+ +	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
+ +
+-+	rt2x00_info(rt2x00dev, "LOFT Calibration Done!\n");
+-+
+ +	savemacsysctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	macorg1 = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
+ +	macorg2 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
+@@ -723,24 +748,16 @@
+ +	macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	macvalue &= (~0x04);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue);
+-+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
+-+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macvalue & 0x01)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+++
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_TX)))
+++		rt2x00_warn(rt2x00dev, "RF TX busy in LOFT IQ calibration\n");
+ +
+ +	macvalue = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
+ +	macvalue &= (~0x08);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, macvalue);
+-+	for (mtxcycle = 0; mtxcycle < 10000; mtxcycle++) {
+-+		macvalue = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
+-+		if (macvalue & 0x02)
+-+			udelay(50);
+-+		else
+-+			break;
+-+	}
+++
+++	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX)))
+++		rt2x00_warn(rt2x00dev, "RF RX busy in LOFT IQ calibration\n");
+ +
+ +	if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
+ +		rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x00000101);
+@@ -776,9 +793,8 @@
+ +
+ +	rt2800_register_write(rt2x00dev, 0x13b8, 0x00000010);
+ +
+-+	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
+++	for (ch_idx = 0; ch_idx < 2; ch_idx++)
+ +		rt2800_rf_configstore(rt2x00dev, rf_store, ch_idx);
+-+	}
+ +
+ +	rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x3B);
+ +	rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x3B);
+@@ -788,7 +804,7 @@
+ +	rt2800_bbp_write(rt2x00dev, 158, 0xB0);
+ +	rt2800_bbp_write(rt2x00dev, 159, 0x80);
+ +
+-+	for (ch_idx = 0; ch_idx < 2; ch_idx ++) {
+++	for (ch_idx = 0; ch_idx < 2; ch_idx++) {
+ +		rt2800_bbp_write(rt2x00dev, 23, 0x00);
+ +		rt2800_bbp_write(rt2x00dev, 24, 0x00);
+ +
+@@ -831,7 +847,7 @@
+ +			count_step = 2;
+ +		}
+ +
+-+		for (;vga_gain[ch_idx] < 19; vga_gain[ch_idx]=(vga_gain[ch_idx] + count_step)) {
+++		for (; vga_gain[ch_idx] < 19; vga_gain[ch_idx] = (vga_gain[ch_idx] + count_step)) {
+ +			rfvalue = rfvga_gain_table[vga_gain[ch_idx]];
+ +			rt2800_rfcsr_write_dccal(rt2x00dev, 3, rfvalue);
+ +			rt2800_rfcsr_write_dccal(rt2x00dev, 4, rfvalue);
+@@ -840,37 +856,35 @@
+ +			rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +			rt2800_bbp_write(rt2x00dev, 159, 0x00);
+ +			p0 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
+-+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
+++			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags))
+ +				p0_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
+-+			}
+ +
+ +			bbp = (ch_idx == 0) ? 0x29 : 0x47;
+ +			rt2800_bbp_write(rt2x00dev, 158, bbp);
+ +			rt2800_bbp_write(rt2x00dev, 159, 0x21);
+ +			p1 = rt2800_do_fft_accumulation(rt2x00dev, 0x14, 0);
+-+			if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags)) {
+++			if (test_bit(CAPABILITY_EXTERNAL_PA_TX1, &rt2x00dev->cap_flags))
+ +				p1_idx10 = rt2800_read_fft_accumulation(rt2x00dev, 0x0A);
+-+			}
+ +
+ +			rt2x00_dbg(rt2x00dev, "IQ AGC %d %d\n", p0, p1);
+ +
+ +			if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
+ +				rt2x00_dbg(rt2x00dev, "IQ AGC IDX 10 %d %d\n", p0_idx10, p1_idx10);
+-+				if ((p0_idx10 > 7000*7000) || (p1_idx10 > 7000*7000)) {
+-+					if (vga_gain[ch_idx]!=0)
+-+						vga_gain[ch_idx] = vga_gain[ch_idx]-1;
+++				if ((p0_idx10 > 7000 * 7000) || (p1_idx10 > 7000 * 7000)) {
+++					if (vga_gain[ch_idx] != 0)
+++						vga_gain[ch_idx] = vga_gain[ch_idx] - 1;
+ +					break;
+ +				}
+ +			}
+ +
+-+			if ((p0 > 2500*2500) || (p1 > 2500*2500)) {
+++			if ((p0 > 2500 * 2500) || (p1 > 2500 * 2500))
+ +				break;
+-+			}
+ +		}
+ +
+ +		if (vga_gain[ch_idx] > 18)
+ +			vga_gain[ch_idx] = 18;
+-+		rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n",vga_gain[ch_idx], rfvga_gain_table[vga_gain[ch_idx]]);
+++		rt2x00_dbg(rt2x00dev, "Used VGA %d %x\n", vga_gain[ch_idx],
+++			   rfvga_gain_table[vga_gain[ch_idx]]);
+ +
+ +		bbp = (ch_idx == 0) ? 0x29 : 0x47;
+ +		rt2800_bbp_write(rt2x00dev, 158, bbp);
+@@ -915,9 +929,8 @@
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 0, 39, rfb0r39);
+ +	rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfb0r42);
+ +
+-+	if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags)) {
+++	if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, &rt2x00dev->cap_flags))
+ +		rt2800_bbp_write(rt2x00dev, 4, bbpr4);
+-+	}
+ +
+ +	rt2800_bbp_write(rt2x00dev, 21, 0x01);
+ +	udelay(1);
+@@ -935,16 +948,12 @@
+ +	rt2800_register_write(rt2x00dev, RF_BYPASS3, macorg5);
+ +	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
+ +	rt2800_register_write(rt2x00dev, 0x13b8, mac13b8);
+-+
+-+	rt2x00_info(rt2x00dev, "TX IQ Calibration Done!\n");
+-+
+-+	return;
+ +}
+ +
+  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
+  				       bool set_bw, bool is_ht40)
+  {
+-@@ -9698,6 +10635,7 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -9678,6 +10579,7 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rxdcoc_calibration(rt2x00dev);
+  	rt2800_bw_filter_calibration(rt2x00dev, true);
+  	rt2800_bw_filter_calibration(rt2x00dev, false);
+@@ -963,11 +972,11 @@
+ +#define RF_ALC_NUM	6
+ +#define CHAIN_NUM	2
+ +
+-+typedef struct rf_reg_pair {
+++struct rf_reg_pair {
+ +	u8 bank;
+ +	u8 reg;
+ +	u8 value;
+-+} rf_reg_pair;
+++};
+  
+  /* RT2800 driver data structure */
+  struct rt2800_drv_data {
+diff --git a/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch b/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch
+new file mode 100644
+index 0000000000..b07d449d6d
+--- /dev/null
++++ b/package/kernel/mac80211/patches/rt2x00/011-rt2x00-move-helper-functions-up-in-file.patch
+@@ -0,0 +1,94 @@
++From patchwork Sat Sep 17 20:28:58 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 7bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979252
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:28:58 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 11/16] rt2x00: move helper functions up in file
++Message-ID: 
++ <c27baa8efd5c29e2bcb2432925d9cdc5c913a125.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++Move register access helper functions up to the head of the file so
++they can be used in all functions.
++
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 40 +++++++++----------
++ 1 file changed, 20 insertions(+), 20 deletions(-)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -198,6 +198,26 @@ static void rt2800_rfcsr_write_dccal(str
++ 	rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value);
++ }
++ 
+++static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
+++				  const u8 reg, const u8 value)
+++{
+++	rt2800_bbp_write(rt2x00dev, 158, reg);
+++	rt2800_bbp_write(rt2x00dev, 159, value);
+++}
+++
+++static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
+++{
+++	rt2800_bbp_write(rt2x00dev, 158, reg);
+++	return rt2800_bbp_read(rt2x00dev, 159);
+++}
+++
+++static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
+++				  const u8 reg, const u8 value)
+++{
+++	rt2800_bbp_write(rt2x00dev, 195, reg);
+++	rt2800_bbp_write(rt2x00dev, 196, value);
+++}
+++
++ static u8 rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
++ 			    const unsigned int word)
++ {
++@@ -6972,26 +6992,6 @@ static void rt2800_init_bbp_5592(struct
++ 		rt2800_bbp_write(rt2x00dev, 103, 0xc0);
++ }
++ 
++-static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
++-				  const u8 reg, const u8 value)
++-{
++-	rt2800_bbp_write(rt2x00dev, 195, reg);
++-	rt2800_bbp_write(rt2x00dev, 196, value);
++-}
++-
++-static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
++-				  const u8 reg, const u8 value)
++-{
++-	rt2800_bbp_write(rt2x00dev, 158, reg);
++-	rt2800_bbp_write(rt2x00dev, 159, value);
++-}
++-
++-static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
++-{
++-	rt2800_bbp_write(rt2x00dev, 158, reg);
++-	return rt2800_bbp_read(rt2x00dev, 159);
++-}
++-
++ static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
++ {
++ 	u8 bbp;
+diff --git a/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch
+new file mode 100644
+index 0000000000..e989205ba2
+--- /dev/null
++++ b/package/kernel/mac80211/patches/rt2x00/012-rt2x00-fix-HT20-HT40-bandwidth-switch-on-MT7620.patch
+@@ -0,0 +1,56 @@
++From patchwork Sat Sep 17 20:29:13 2022
++Content-Type: text/plain; charset="utf-8"
++MIME-Version: 1.0
++Content-Transfer-Encoding: 7bit
++X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
++X-Patchwork-Id: 12979253
++X-Patchwork-Delegate: kvalo@adurom.com
++Return-Path: <linux-wireless-owner@kernel.org>
++Date: Sat, 17 Sep 2022 21:29:13 +0100
++From: Daniel Golle <daniel@makrotopia.org>
++To: linux-wireless@vger.kernel.org, Stanislaw Gruszka <stf_xl@wp.pl>,
++        Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++        "David S. Miller" <davem@davemloft.net>,
++        Eric Dumazet <edumazet@google.com>,
++        Jakub Kicinski <kuba@kernel.org>,
++        Paolo Abeni <pabeni@redhat.com>,
++        Johannes Berg <johannes.berg@intel.com>
++Subject: [PATCH v3 12/16] rt2x00: fix HT20/HT40 bandwidth switch on MT7620
++Message-ID: 
++ <1664d89ba149f7b0bcec18b2a2abaedf49654507.1663445157.git.daniel@makrotopia.org>
++References: <cover.1663445157.git.daniel@makrotopia.org>
++MIME-Version: 1.0
++Content-Disposition: inline
++In-Reply-To: <cover.1663445157.git.daniel@makrotopia.org>
++Precedence: bulk
++List-ID: <linux-wireless.vger.kernel.org>
++X-Mailing-List: linux-wireless@vger.kernel.org
++
++Add missing configuration of the channel bandwidth filter to the
++channel setup function for MT7620.
++
++Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
++---
++ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 8 ++++++++
++ 1 file changed, 8 insertions(+)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -3855,6 +3855,14 @@ static void rt2800_config_channel_rf7620
++ 		rfcsr |= tx_agc_fc;
++ 		rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr);
++ 	}
+++
+++	if (conf_is_ht40(conf)) {
+++		rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10);
+++		rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f);
+++	} else {
+++		rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a);
+++		rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40);
+++	}
++ }
++ 
++ static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
+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 e74d9a9aa0..ba16e85510 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
+-@@ -332,6 +332,7 @@ RT2X00_LIB_FIRMWARE=
++@@ -345,6 +345,7 @@ RT2X00_LIB_FIRMWARE=
   RT2X00_LIB_CRYPTO=
   RT2X00_LIB_LEDS=
   RT2X00_LIB_DEBUGFS=
+@@ -48,7 +48,7 @@
+  obj-$(CPTCFG_RT2X00_LIB_MMIO)		+= rt2x00mmio.o
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h
+-@@ -37,6 +37,8 @@ struct rt2800_drv_data {
++@@ -47,6 +47,8 @@ struct rt2800_drv_data {
+  	struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE];
+  };
+  
+@@ -57,7 +57,7 @@
+  struct rt2800_ops {
+  	u32 (*register_read)(struct rt2x00_dev *rt2x00dev,
+  			      const unsigned int offset);
+-@@ -135,6 +137,15 @@ static inline int rt2800_read_eeprom(str
++@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str
+  {
+  	const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
+  
 @@ -105,7 +105,7 @@
   	.drv_init_registers	= rt2800mmio_init_registers,
  --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
@@ -3902,7 +4812,7 @@ index e74d9a9aa0..bd33b2efbd 100644
  --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
  +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 -@@ -1406,6 +1406,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
-+@@ -1401,6 +1401,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
++@@ -1419,6 +1419,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
   	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
   	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
   
@@ -3911,10 +4821,48 @@ index e74d9a9aa0..bd33b2efbd 100644
   	 * Let the driver probe the device to detect the capabilities.
   	 */
 -@@ -1549,6 +1553,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
-+@@ -1541,6 +1545,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
++@@ -1559,6 +1563,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
   	 * Free the driver data.
   	 */
   	kfree(rt2x00dev->drv_data);
+@@ -193,7 +193,7 @@
+ +	if (pdata && pdata->eeprom_file_name)
+ +		return pdata->eeprom_file_name;
+ +
+-+	return NULL
+++	return NULL;
+ +}
+ +
+ +static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
+diff --git a/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch b/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch
+index 9dffef1812..431e090237 100644
+--- a/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch
++++ b/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch
+@@ -8,7 +8,7 @@
+  
+  #include "rt2x00.h"
+  #include "rt2x00lib.h"
+-@@ -34,11 +35,21 @@ static const char *
++@@ -34,10 +35,20 @@ static const char *
+  rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
+  {
+  	struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data;
+@@ -20,14 +20,12 @@
+  	if (pdata && pdata->eeprom_file_name)
+  		return pdata->eeprom_file_name;
+  
+--	return NULL
+ +#ifdef CONFIG_OF
+ +	np = rt2x00dev->dev->of_node;
+ +	if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0)
+ +	    return eep;
+ +#endif
+ +
+-+	return NULL;
++ 	return NULL;
+  }
+  
+- static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev)
 diff --git a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
 index 6a8e594d5e..ffee2189d2 100644
 --- a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
@@ -3979,7 +4927,7 @@ index ff8b2c947b..6211809c0a 100644
   	unsigned int num_rates;
   	unsigned int i;
 diff --git a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch
-index 87f1ab4681..d78b76d7f5 100644
+index 87f1ab4681..acc8a8edb8 100644
 --- a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch
 +++ b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch
 @@ -8,7 +8,7 @@
@@ -3987,273 +4935,72 @@ index 87f1ab4681..d78b76d7f5 100644
   #include "rt2x00.h"
   #include "rt2800lib.h"
 -@@ -9556,6 +9557,17 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9549,6 +9550,17 @@ static int rt2800_init_eeprom(struct rt2
++@@ -11131,6 +11132,17 @@ static int rt2800_init_eeprom(struct rt2
   	rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
   	rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
   
 diff --git a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch
-index 88d6dd559b..0da9356e0c 100644
+index 88d6dd559b..5ef5fc8def 100644
 --- a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch
 +++ b/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch
 @@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
  +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 -@@ -1344,7 +1344,7 @@ static inline void rt2x00lib_set_if_comb
-+@@ -1340,7 +1340,7 @@ static inline void rt2x00lib_set_if_comb
++@@ -1358,7 +1358,7 @@ static inline void rt2x00lib_set_if_comb
   	 */
   	if_limit = &rt2x00dev->if_limits_ap;
   	if_limit->max = rt2x00dev->ops->max_ap_intf;
 diff --git a/package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch b/package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch
-index fca1fb2cd4..6e6564f870 100644
+deleted file mode 100644
+index fca1fb2cd4..0000000000
 --- a/package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch
-@@ -11,7 +11,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
- 
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
++++ /dev/null
+@@ -1,44 +0,0 @@
+-From: David Bauer <mail@david-bauer.net>
+-Date: Mon, 16 Dec 2019 20:47:06 +0100
+-Subject: [PATCH] rt2x00: add throughput LED trigger
+-
+-This adds a (currently missing) throughput LED trigger for the rt2x00
+-driver. Previously, LED triggers had to be assigned to the netdev, which
+-was limited to a single VAP.
+-
+-Signed-off-by: David Bauer <mail@david-bauer.net>
+-Tested-by: Christoph Krapp <achterin@googlemail.com>
+-
+---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
 -@@ -1129,6 +1129,19 @@ static void rt2x00lib_remove_hw(struct r
-+@@ -1125,6 +1125,19 @@ static void rt2x00lib_remove_hw(struct r
-  	kfree(rt2x00dev->spec.channels_info);
-  }
-  
-@@ -31,7 +31,7 @@ Tested-by: Christoph Krapp <achterin@googlemail.com>
-  static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
-  {
-  	struct hw_mode_spec *spec = &rt2x00dev->spec;
+- 	kfree(rt2x00dev->spec.channels_info);
+- }
+- 
+-+static const struct ieee80211_tpt_blink rt2x00_tpt_blink[] = {
+-+	{ .throughput = 0 * 1024, .blink_time = 334 },
+-+	{ .throughput = 1 * 1024, .blink_time = 260 },
+-+	{ .throughput = 2 * 1024, .blink_time = 220 },
+-+	{ .throughput = 5 * 1024, .blink_time = 190 },
+-+	{ .throughput = 10 * 1024, .blink_time = 170 },
+-+	{ .throughput = 25 * 1024, .blink_time = 150 },
+-+	{ .throughput = 54 * 1024, .blink_time = 130 },
+-+	{ .throughput = 120 * 1024, .blink_time = 110 },
+-+	{ .throughput = 265 * 1024, .blink_time = 80 },
+-+	{ .throughput = 586 * 1024, .blink_time = 50 },
+-+};
+-+
+- static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
+- {
+- 	struct hw_mode_spec *spec = &rt2x00dev->spec;
 -@@ -1210,6 +1223,10 @@ static int rt2x00lib_probe_hw(struct rt2
-+@@ -1206,6 +1219,10 @@ static int rt2x00lib_probe_hw(struct rt2
-  
-  #undef RT2X00_TASKLET_INIT
-  
-diff --git a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
-index 3de562df8c..8814c02532 100644
---- a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch
-@@ -30,8 +30,8 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
-   * EEPROM LNA
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -4360,6 +4360,45 @@ static void rt2800_config_channel(struct
-- 			rt2800_iq_calibrate(rt2x00dev, rf->channel);
-+@@ -4369,6 +4369,45 @@ static void rt2800_config_channel(struct
-+ 		rt2800_iq_calibrate(rt2x00dev, rf->channel);
-  	}
-  
- +	if (rt2x00_rt(rt2x00dev, RT6352)) {
-@@ -76,7 +76,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
-  	bbp = rt2800_bbp_read(rt2x00dev, 4);
-  	rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
-  	rt2800_bbp_write(rt2x00dev, 4, bbp);
--@@ -9585,7 +9624,8 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9578,7 +9617,8 @@ static int rt2800_init_eeprom(struct rt2
-  	 */
-  	eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
-  
-@@ -86,7 +86,7 @@ Signed-off-by: Tomislav Po=C5=BEega <pozega.tomislav@gmail.com>
-  		if (rt2x00_get_field16(eeprom,
-  		    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
-  		    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
--@@ -9596,6 +9636,18 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9589,6 +9629,18 @@ static int rt2800_init_eeprom(struct rt2
-  			      &rt2x00dev->cap_flags);
-  	}
-  
-diff --git a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch
-index 8064c4fe3a..b798dcc6d8 100644
---- a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -8445,6 +8445,56 @@ static void rt2800_init_rfcsr_5592(struc
-+@@ -8438,6 +8438,56 @@ static void rt2800_init_rfcsr_5592(struc
-  	rt2800_led_open_drain_enable(rt2x00dev);
-  }
-  
-@@ -57,7 +57,7 @@
-  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
-  				       bool set_bw, bool is_ht40)
-  {
--@@ -9052,6 +9102,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9045,6 +9095,7 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
-  
-diff --git a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch b/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch
-index 539a1b53b3..cf21c39a6c 100644
---- a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -8495,6 +8495,155 @@ static void rt2800_rf_self_txdc_cal(stru
-+@@ -8488,6 +8488,155 @@ static void rt2800_rf_self_txdc_cal(stru
-  	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
-  }
-  
-@@ -156,7 +156,7 @@
-  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
-  				       bool set_bw, bool is_ht40)
-  {
--@@ -9102,6 +9251,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9095,6 +9244,7 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
-  
-diff --git a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch
-index a45e7aec32..1f8684b0bf 100644
---- a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -8644,6 +8644,70 @@ static void rt2800_r_calibration(struct
-+@@ -8637,6 +8637,70 @@ static void rt2800_r_calibration(struct
-  	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, MAC_PWR_PIN_CFG);
-  }
-  
-@@ -71,7 +71,7 @@
-  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
-  				       bool set_bw, bool is_ht40)
-  {
--@@ -9253,6 +9317,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9246,6 +9310,7 @@ static void rt2800_init_rfcsr_6352(struc
-  
-  	rt2800_r_calibration(rt2x00dev);
-  	rt2800_rf_self_txdc_cal(rt2x00dev);
-diff --git a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch b/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch
-index bc03d720be..98f2e245ce 100644
---- a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -8708,6 +8708,384 @@ static void rt2800_rxdcoc_calibration(st
-+@@ -8701,6 +8701,384 @@ static void rt2800_rxdcoc_calibration(st
-  	rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, saverfb0r2);
-  }
-  
-@@ -385,7 +385,7 @@
-  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
-  				       bool set_bw, bool is_ht40)
-  {
--@@ -9320,6 +9698,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9313,6 +9691,7 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rxdcoc_calibration(rt2x00dev);
-  	rt2800_bw_filter_calibration(rt2x00dev, true);
-  	rt2800_bw_filter_calibration(rt2x00dev, false);
-diff --git a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch b/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch
-index bd664d044e..6a685f80ab 100644
---- a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -9086,6 +9086,943 @@ restore_value:
-+@@ -9079,6 +9079,943 @@ restore_value:
-  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, savemacsysctrl);
-  }
-  
-@@ -944,7 +944,7 @@
-  static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
-  				       bool set_bw, bool is_ht40)
-  {
--@@ -9698,6 +10635,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9691,6 +10628,7 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rxdcoc_calibration(rt2x00dev);
-  	rt2800_bw_filter_calibration(rt2x00dev, true);
-  	rt2800_bw_filter_calibration(rt2x00dev, false);
-diff --git a/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch b/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
-index a724232c44..40b20ec594 100644
---- a/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
-@@ -14,7 +14,7 @@
-   */
- --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
--@@ -3685,14 +3685,16 @@ static void rt2800_config_channel_rf7620
-+@@ -3698,14 +3698,16 @@ static void rt2800_config_channel_rf7620
-  	rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
-  	rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
-  
-@@ -39,7 +39,7 @@
-  
-  	rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
-  	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
--@@ -3726,18 +3728,23 @@ static void rt2800_config_channel_rf7620
-+@@ -3739,18 +3741,23 @@ static void rt2800_config_channel_rf7620
-  		rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
-  	}
-  
-@@ -73,7 +73,7 @@
-  
-  	if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
-  		if (conf_is_ht40(conf)) {
--@@ -3837,25 +3844,29 @@ static void rt2800_config_alc(struct rt2
-+@@ -3850,25 +3857,29 @@ static void rt2800_config_alc(struct rt2
-  	if (i == 10000)
-  		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
-  
-@@ -121,12 +121,12 @@
-  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
-  
-  	rt2800_vco_calibration(rt2x00dev);
--@@ -5892,18 +5903,33 @@ static int rt2800_init_registers(struct
-+@@ -5906,18 +5917,33 @@ static int rt2800_init_registers(struct
-  	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
-  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
-  	} else if (rt2x00_rt(rt2x00dev, RT6352)) {
- -		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
---		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
-+-		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
- -		rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
- -		rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
- -		rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
-@@ -150,7 +150,7 @@
- +					      0x00550055);
- +		} else {
- +			rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
--+			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
-++			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
- +			rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
- +			rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
- +			rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
-@@ -167,7 +167,7 @@
-  		reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
-  		rt2x00_set_field32(&reg, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
-  		rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
--@@ -7068,14 +7094,16 @@ static void rt2800_init_bbp_6352(struct
-+@@ -7061,14 +7087,16 @@ static void rt2800_init_bbp_6352(struct
-  	rt2800_bbp_write(rt2x00dev, 188, 0x00);
-  	rt2800_bbp_write(rt2x00dev, 189, 0x00);
-  
-@@ -192,7 +192,7 @@
-  
-  	/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
-  	rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
--@@ -10414,31 +10442,36 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -10407,31 +10435,36 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
-  	rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
-  
-@@ -254,7 +254,7 @@
-  
-  	/* Initialize RF channel register to default value */
-  	rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
--@@ -10504,63 +10537,71 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -10497,63 +10530,71 @@ static void rt2800_init_rfcsr_6352(struc
-  
-  	rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
-  
-@@ -383,7 +383,7 @@
-  
-  	/* Initialize RF DC calibration register to default value */
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
--@@ -10623,12 +10664,17 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -10616,12 +10657,17 @@ static void rt2800_init_rfcsr_6352(struc
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
-  	rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
-  
+- 
+- #undef RT2X00_TASKLET_INIT
+- 
+-+	ieee80211_create_tpt_led_trigger(rt2x00dev->hw,
+-+		IEEE80211_TPT_LEDTRIG_FL_RADIO, rt2x00_tpt_blink,
+-+		ARRAY_SIZE(rt2x00_tpt_blink));
+-+
+- 	/*
+- 	 * Register HW.
+- 	 */
 diff --git a/package/kernel/mac80211/patches/rt2x00/992-rt2x00-save-survey-for-every-channel-visited.patch b/package/kernel/mac80211/patches/rt2x00/992-rt2x00-save-survey-for-every-channel-visited.patch
 deleted file mode 100644
 index b73af6e8c6..0000000000
@@ -4443,6 +5190,275 @@ index b73af6e8c6..0000000000
 - 	 * Some configuration parameters (e.g. channel and antenna values) can
 - 	 * only be set when the radio is enabled, but do require the RX to
 - 	 * be off. During this period we should keep link tuning enabled,
+diff --git a/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
+new file mode 100644
+index 0000000000..deaa03be6c
+--- /dev/null
++++ b/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch
+@@ -0,0 +1,161 @@
++From 0fce1109f894ec7fcd72cb098843a1eff786716a Mon Sep 17 00:00:00 2001
++From: Daniel Golle <daniel@makrotopia.org>
++Date: Fri, 16 Sep 2022 20:49:42 +0100
++Subject: [PATCH 16/16] rt2x00: import support for external LNA on MT7620
++To: linux-wireless@vger.kernel.org,
++    Stanislaw Gruszka <stf_xl@wp.pl>,
++    Helmut Schaa <helmut.schaa@googlemail.com>
++Cc: Kalle Valo <kvalo@kernel.org>,
++    David S. Miller <davem@davemloft.net>,
++    Eric Dumazet <edumazet@google.com>,
++    Jakub Kicinski <kuba@kernel.org>,
++    Paolo Abeni <pabeni@redhat.com>,
++    Johannes Berg <johannes.berg@intel.com>
++
++In order to carry out calibration on boards with ePA or eLNA the PA pin
++needs to be switch to GPIO mode on MT7620. Implement that by selecting
++pinctrl state "pa_gpio" which should be defined for MT7620 boards with
++eLNA or ePA beside the "default" state.
++
++Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
++Signed-off-by: Daniel Golle <daniel@makrotopia.org>
++---
++ .../net/wireless/ralink/rt2x00/rt2800lib.c    | 58 +++++++++++++++++++
++ drivers/net/wireless/ralink/rt2x00/rt2x00.h   |  5 ++
++ .../net/wireless/ralink/rt2x00/rt2x00soc.c    | 15 +++++
++ 3 files changed, 78 insertions(+)
++
++--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
++@@ -304,6 +304,24 @@ static void rt2800_rf_write(struct rt2x0
++ 	mutex_unlock(&rt2x00dev->csr_mutex);
++ }
++ 
+++void rt6352_enable_pa_pin(struct rt2x00_dev *rt2x00dev, int enable)
+++{
+++	if (!rt2x00dev->pinctrl)
+++		return;
+++
+++	if (enable) {
+++		if (!rt2x00dev->pins_default)
+++			return;
+++
+++		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_default);
+++	} else {
+++		if (!rt2x00dev->pins_pa_gpio)
+++			return;
+++
+++		pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_pa_gpio);
+++	}
+++}
+++
++ static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
++ 	[EEPROM_CHIP_ID]		= 0x0000,
++ 	[EEPROM_VERSION]		= 0x0001,
++@@ -4469,6 +4487,29 @@ static void rt2800_config_channel(struct
++ 			rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN,
++ 					      0x6C6C6B6C);
++ 		}
+++
+++		if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+++			reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
+++			reg |= 0x00000101;
+++			rt2800_register_write(rt2x00dev, RF_CONTROL3, reg);
+++
+++			reg = rt2800_register_read(rt2x00dev, RF_BYPASS3);
+++			reg |= 0x00000101;
+++			rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
+++
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
+++			rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
+++			rt2800_bbp_write(rt2x00dev, 75, 0x68);
+++			rt2800_bbp_write(rt2x00dev, 76, 0x4C);
+++			rt2800_bbp_write(rt2x00dev, 79, 0x1C);
+++			rt2800_bbp_write(rt2x00dev, 80, 0x0C);
+++			rt2800_bbp_write(rt2x00dev, 82, 0xB6);
+++			/* bank 0 RF reg 42 and glrt BBP reg 141 will be set in
+++			 * config channel function in dependence of channel and
+++			 * HT20/HT40 so don't touch it
+++			 */
+++		}
++ 	}
++ 
++ 	bbp = rt2800_bbp_read(rt2x00dev, 4);
++@@ -10583,6 +10624,7 @@ static void rt2800_init_rfcsr_6352(struc
++ 	rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
++ 	rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
++ 
+++	rt6352_enable_pa_pin(rt2x00dev, 0);
++ 	rt2800_r_calibration(rt2x00dev);
++ 	rt2800_rf_self_txdc_cal(rt2x00dev);
++ 	rt2800_rxdcoc_calibration(rt2x00dev);
++@@ -10590,6 +10632,22 @@ static void rt2800_init_rfcsr_6352(struc
++ 	rt2800_bw_filter_calibration(rt2x00dev, false);
++ 	rt2800_loft_iq_calibration(rt2x00dev);
++ 	rt2800_rxiq_calibration(rt2x00dev);
+++	rt6352_enable_pa_pin(rt2x00dev, 1);
+++
+++	if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
+++		rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
+++		rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
+++		rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
+++		rt2800_bbp_write(rt2x00dev, 75, 0x68);
+++		rt2800_bbp_write(rt2x00dev, 76, 0x4C);
+++		rt2800_bbp_write(rt2x00dev, 79, 0x1C);
+++		rt2800_bbp_write(rt2x00dev, 80, 0x0C);
+++		rt2800_bbp_write(rt2x00dev, 82, 0xB6);
+++		/* bank 0 RF reg 42 and glrt BBP reg 141 will be set in config
+++		 * channel function in dependence of channel and HT20/HT40,
+++		 * so don't touch them here.
+++		 */
+++	}
++ }
++ 
++ static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
++--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
++@@ -28,6 +28,7 @@
++ #include <linux/average.h>
++ #include <linux/usb.h>
++ #include <linux/clk.h>
+++#include <linux/pinctrl/consumer.h>
++ #include <linux/rt2x00_platform.h>
++ 
++ #include <net/mac80211.h>
++@@ -1029,6 +1030,11 @@ struct rt2x00_dev {
++ 
++ 	/* Clock for System On Chip devices. */
++ 	struct clk *clk;
+++
+++	/* pinctrl and states for System On Chip devices with PA/LNA. */
+++	struct pinctrl *pinctrl;
+++	struct pinctrl_state *pins_default;
+++	struct pinctrl_state *pins_pa_gpio;
++ };
++ 
++ struct rt2x00_bar_list_entry {
++--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
+++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
++@@ -97,6 +97,21 @@ int rt2x00soc_probe(struct platform_devi
++ 	if (retval)
++ 		goto exit_free_reg;
++ 
+++	rt2x00dev->pinctrl = devm_pinctrl_get(&pdev->dev);
+++	if (IS_ERR(rt2x00dev->pinctrl)) {
+++		rt2x00dev->pinctrl = NULL;
+++		rt2x00dev->pins_default = NULL;
+++		rt2x00dev->pins_pa_gpio = NULL;
+++	} else {
+++		rt2x00dev->pins_default = pinctrl_lookup_state(rt2x00dev->pinctrl, "default");
+++		if (IS_ERR(rt2x00dev->pins_default))
+++			rt2x00dev->pins_default = NULL;
+++
+++		rt2x00dev->pins_pa_gpio = pinctrl_lookup_state(rt2x00dev->pinctrl, "pa_gpio");
+++		if (IS_ERR(rt2x00dev->pins_pa_gpio))
+++			rt2x00dev->pins_pa_gpio = NULL;
+++	}
+++
++ 	return 0;
++ 
++ exit_free_reg:
+diff --git a/package/kernel/mac80211/patches/rt2x00/990-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch b/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch
+similarity index 100%
+rename from package/kernel/mac80211/patches/rt2x00/990-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch
+rename to package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch
+diff --git a/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch b/package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
+similarity index 95%
+rename from package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
+rename to package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
+index a724232c44..dab6e05ffd 100644
+--- a/package/kernel/mac80211/patches/rt2x00/991-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
++++ b/package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch
+@@ -1,6 +1,6 @@
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
+-@@ -1042,6 +1042,11 @@
++@@ -1044,6 +1044,11 @@
+  #define MIMO_PS_CFG_RX_STBY_POL		FIELD32(0x00000010)
+  #define MIMO_PS_CFG_RX_RX_STBY0		FIELD32(0x00000020)
+  
+@@ -14,7 +14,7 @@
+   */
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
+-@@ -3685,14 +3685,16 @@ static void rt2800_config_channel_rf7620
++@@ -3778,14 +3778,16 @@ static void rt2800_config_channel_rf7620
+  	rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
+  	rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
+  
+@@ -39,7 +39,7 @@
+  
+  	rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
+  	rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
+-@@ -3726,18 +3728,23 @@ static void rt2800_config_channel_rf7620
++@@ -3819,18 +3821,23 @@ static void rt2800_config_channel_rf7620
+  		rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
+  	}
+  
+@@ -73,9 +73,9 @@
+  
+  	if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
+  		if (conf_is_ht40(conf)) {
+-@@ -3837,25 +3844,29 @@ static void rt2800_config_alc(struct rt2
+- 	if (i == 10000)
+- 		rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
++@@ -3929,25 +3936,29 @@ static void rt2800_config_alc(struct rt2
++ 	if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY)))
++ 		rt2x00_warn(rt2x00dev, "RF busy while configuring ALC\n");
+  
+ -	if (chan->center_freq > 2457) {
+ -		bbp = rt2800_bbp_read(rt2x00dev, 30);
+@@ -121,7 +121,7 @@
+  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
+  
+  	rt2800_vco_calibration(rt2x00dev);
+-@@ -5892,18 +5903,33 @@ static int rt2800_init_registers(struct
++@@ -6011,18 +6022,33 @@ static int rt2800_init_registers(struct
+  	} else if (rt2x00_rt(rt2x00dev, RT5350)) {
+  		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
+  	} else if (rt2x00_rt(rt2x00dev, RT6352)) {
+@@ -167,7 +167,7 @@
+  		reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
+  		rt2x00_set_field32(&reg, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
+  		rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
+-@@ -7068,14 +7094,16 @@ static void rt2800_init_bbp_6352(struct
++@@ -7127,14 +7153,16 @@ static void rt2800_init_bbp_6352(struct
+  	rt2800_bbp_write(rt2x00dev, 188, 0x00);
+  	rt2800_bbp_write(rt2x00dev, 189, 0x00);
+  
+@@ -192,7 +192,7 @@
+  
+  	/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
+  	rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
+-@@ -10414,31 +10442,36 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -10408,31 +10436,36 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
+  	rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
+  
+@@ -254,7 +254,7 @@
+  
+  	/* Initialize RF channel register to default value */
+  	rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
+-@@ -10504,63 +10537,71 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -10498,63 +10531,71 @@ static void rt2800_init_rfcsr_6352(struc
+  
+  	rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
+  
+@@ -383,7 +383,7 @@
+  
+  	/* Initialize RF DC calibration register to default value */
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
+-@@ -10623,12 +10664,17 @@ static void rt2800_init_rfcsr_6352(struc
++@@ -10617,12 +10658,17 @@ static void rt2800_init_rfcsr_6352(struc
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
+  	rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
+  
+@@ -404,5 +404,5 @@
+ +		rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
+ +	}
+  
++ 	rt6352_enable_pa_pin(rt2x00dev, 0);
+  	rt2800_r_calibration(rt2x00dev);
+- 	rt2800_rf_self_txdc_cal(rt2x00dev);
 diff --git a/package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch b/package/kernel/mac80211/patches/rtl/002-v5.13-rtlwifi-implement-set_tim-by-update-beacon-content.patch
 deleted file mode 100644
 index 3daf65e967..0000000000
@@ -5891,7 +6907,7 @@ index df67d2f101..0000000000
 - 	help
 - 	  This option enables the hardware independent IEEE 802.11
 diff --git a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch
-index 27c5048de9..2dc6ab3601 100644
+index 27c5048de9..5a7da84506 100644
 --- a/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch
 +++ b/package/kernel/mac80211/patches/subsys/150-disable_addr_notifier.patch
 @@ -1,6 +1,6 @@
@@ -5936,7 +6952,7 @@ index 27c5048de9..2dc6ab3601 100644
   #endif
   	wiphy_unregister(local->hw.wiphy);
 -@@ -1367,10 +1367,10 @@ void ieee80211_unregister_hw(struct ieee
-+@@ -1371,10 +1371,10 @@ void ieee80211_unregister_hw(struct ieee
++@@ -1373,10 +1373,10 @@ void ieee80211_unregister_hw(struct ieee
   	tasklet_kill(&local->tx_pending_tasklet);
   	tasklet_kill(&local->tasklet);
   
@@ -6602,7 +7618,7 @@ diff --git a/package/kernel/mac80211/patches/subsys/306-mac80211-set-up-the-fwd_
 similarity index 97%
 rename from package/kernel/mac80211/patches/subsys/306-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch
 rename to package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch
-index 9370a5846d..1ceb2be25c 100644
+index 9370a5846d..159aad564b 100644
 --- a/package/kernel/mac80211/patches/subsys/306-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch
 +++ b/package/kernel/mac80211/patches/subsys/303-mac80211-set-up-the-fwd_skb-dev-for-mesh-forwarding.patch
 @@ -52,7 +52,7 @@ Signed-off-by: Xing Song <xing.song@mediatek.com>
@@ -6610,7 +7626,7 @@ index 9370a5846d..1ceb2be25c 100644
  --- a/net/mac80211/rx.c
  +++ b/net/mac80211/rx.c
 -@@ -2942,6 +2942,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
-+@@ -2948,6 +2948,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
++@@ -2950,6 +2950,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
   	if (!fwd_skb)
   		goto out;
   
@@ -6668,7 +7684,7 @@ index 1c940d3db2..c43cd3acb9 100644
   
 diff --git a/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch b/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch
 new file mode 100644
-index 0000000000..fba0912e80
+index 0000000000..9c3b38adbf
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/307-mac80211_hwsim-make-6-GHz-channels-usable.patch
 @@ -0,0 +1,74 @@
@@ -6685,7 +7701,7 @@ index 0000000000..fba0912e80
 +
 +--- a/drivers/net/wireless/mac80211_hwsim.c
 ++++ b/drivers/net/wireless/mac80211_hwsim.c
-+@@ -3004,15 +3004,19 @@ static void mac80211_hwsim_he_capab(stru
++@@ -3008,15 +3008,19 @@ static void mac80211_hwsim_he_capab(stru
 + {
 + 	u16 n_iftype_data;
 + 
@@ -6708,7 +7724,7 @@ index 0000000000..fba0912e80
 + 		return;
 + 	}
 + 
-+@@ -3302,6 +3306,12 @@ static int mac80211_hwsim_new_radio(stru
++@@ -3306,6 +3310,12 @@ static int mac80211_hwsim_new_radio(stru
 + 			sband->vht_cap.vht_mcs.tx_mcs_map =
 + 				sband->vht_cap.vht_mcs.rx_mcs_map;
 + 			break;
@@ -6721,7 +7737,7 @@ index 0000000000..fba0912e80
 + 		case NL80211_BAND_S1GHZ:
 + 			memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
 + 			       sizeof(sband->s1g_cap));
-+@@ -3312,6 +3322,13 @@ static int mac80211_hwsim_new_radio(stru
++@@ -3316,6 +3326,13 @@ static int mac80211_hwsim_new_radio(stru
 + 			continue;
 + 		}
 + 
@@ -6735,7 +7751,7 @@ index 0000000000..fba0912e80
 + 		sband->ht_cap.ht_supported = true;
 + 		sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
 + 				    IEEE80211_HT_CAP_GRN_FLD |
-+@@ -3325,10 +3342,6 @@ static int mac80211_hwsim_new_radio(stru
++@@ -3329,10 +3346,6 @@ static int mac80211_hwsim_new_radio(stru
 + 		sband->ht_cap.mcs.rx_mask[0] = 0xff;
 + 		sband->ht_cap.mcs.rx_mask[1] = 0xff;
 + 		sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
@@ -6748,7 +7764,7 @@ index 0000000000..fba0912e80
 + 	/* By default all radios belong to the first group */
 diff --git a/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch b/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch
 new file mode 100644
-index 0000000000..4b9d874cfe
+index 0000000000..a9a6182ab2
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/308-mac80211-add-support-for-.ndo_fill_forward_path.patch
 @@ -0,0 +1,178 @@
@@ -6823,7 +7839,7 @@ index 0000000000..4b9d874cfe
 + #endif /* __MAC80211_DRIVER_OPS */
 +--- a/net/mac80211/ieee80211_i.h
 ++++ b/net/mac80211/ieee80211_i.h
-+@@ -1490,7 +1490,7 @@ struct ieee80211_local {
++@@ -1489,7 +1489,7 @@ struct ieee80211_local {
 + };
 + 
 + static inline struct ieee80211_sub_if_data *
@@ -10116,7 +11132,7 @@ index 0000000000..a1b6e3c80d
 + 		.cmd = NL80211_CMD_GET_PROTOCOL_FEATURES,
 diff --git a/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch b/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch
 new file mode 100644
-index 0000000000..eb80afbccb
+index 0000000000..6197abda56
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/319-mac80211-introduce-set_radar_offchan-callback.patch
 @@ -0,0 +1,67 @@
@@ -10162,7 +11178,7 @@ index 0000000000..eb80afbccb
 + 				     struct ieee80211_vif *vif,
 +--- a/net/mac80211/cfg.c
 ++++ b/net/mac80211/cfg.c
-+@@ -4344,6 +4344,18 @@ out:
++@@ -4341,6 +4341,18 @@ out:
 + 	return err;
 + }
 + 
@@ -10181,7 +11197,7 @@ index 0000000000..eb80afbccb
 + const struct cfg80211_ops mac80211_config_ops = {
 + 	.add_virtual_intf = ieee80211_add_iface,
 + 	.del_virtual_intf = ieee80211_del_iface,
-+@@ -4448,4 +4460,5 @@ const struct cfg80211_ops mac80211_confi
++@@ -4445,4 +4457,5 @@ const struct cfg80211_ops mac80211_confi
 + 	.reset_tid_config = ieee80211_reset_tid_config,
 + 	.set_sar_specs = ieee80211_set_sar_specs,
 + 	.color_change = ieee80211_color_change,
@@ -10189,7 +11205,7 @@ index 0000000000..eb80afbccb
 + };
 diff --git a/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch b/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch
 new file mode 100644
-index 0000000000..483b87cd88
+index 0000000000..608e72468d
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/320-cfg80211-rename-offchannel_chain-structs-to-backgrou.patch
 @@ -0,0 +1,532 @@
@@ -10351,7 +11367,7 @@ index 0000000000..483b87cd88
 + 	NUM_NL80211_EXT_FEATURES,
 +--- a/net/mac80211/cfg.c
 ++++ b/net/mac80211/cfg.c
-+@@ -4345,15 +4345,15 @@ out:
++@@ -4342,15 +4342,15 @@ out:
 + }
 + 
 + static int
@@ -10371,7 +11387,7 @@ index 0000000000..483b87cd88
 + }
 + 
 + const struct cfg80211_ops mac80211_config_ops = {
-+@@ -4460,5 +4460,5 @@ const struct cfg80211_ops mac80211_confi
++@@ -4457,5 +4457,5 @@ const struct cfg80211_ops mac80211_confi
 + 	.reset_tid_config = ieee80211_reset_tid_config,
 + 	.set_sar_specs = ieee80211_set_sar_specs,
 + 	.color_change = ieee80211_color_change,
@@ -10877,7 +11893,7 @@ index 0000000000..a135e3d1b5
 + 	wiphy_lock(sdata->local->hw.wiphy);
 diff --git a/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch b/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch
 new file mode 100644
-index 0000000000..fdbcce9450
+index 0000000000..a8fc02f92d
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/324-mac80211-MBSSID-beacon-handling-in-AP-mode.patch
 @@ -0,0 +1,326 @@
@@ -11078,7 +12094,7 @@ index 0000000000..fdbcce9450
 + 			return err;
 + 		}
 + 		*changed |= err;
-+@@ -3463,8 +3528,11 @@ static int ieee80211_set_csa_beacon(stru
++@@ -3460,8 +3525,11 @@ static int ieee80211_set_csa_beacon(stru
 + static void ieee80211_color_change_abort(struct ieee80211_sub_if_data  *sdata)
 + {
 + 	sdata->vif.color_change_active = false;
@@ -11092,7 +12108,7 @@ index 0000000000..fdbcce9450
 + 
 + 	cfg80211_color_change_aborted_notify(sdata->dev);
 + }
-+@@ -4202,8 +4270,11 @@ ieee80211_set_after_color_change_beacon(
++@@ -4199,8 +4267,11 @@ ieee80211_set_after_color_change_beacon(
 + 
 + 		ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
 + 					      NULL, NULL);
@@ -11106,7 +12122,7 @@ index 0000000000..fdbcce9450
 + 
 + 		if (ret < 0)
 + 			return ret;
-+@@ -4246,7 +4317,11 @@ ieee80211_set_color_change_beacon(struct
++@@ -4243,7 +4314,11 @@ ieee80211_set_color_change_beacon(struct
 + 		err = ieee80211_assign_beacon(sdata, &params->beacon_color_change,
 + 					      NULL, &color_change);
 + 		if (err < 0) {
@@ -11129,7 +12145,7 @@ index 0000000000..fdbcce9450
 + 	struct rcu_head rcu_head;
 + };
 + 
-+@@ -1083,6 +1084,20 @@ ieee80211_vif_get_shift(struct ieee80211
++@@ -1082,6 +1083,20 @@ ieee80211_vif_get_shift(struct ieee80211
 + 	return shift;
 + }
 + 
@@ -11342,7 +12358,7 @@ index 0000000000..f0150ddef0
 + 
 diff --git a/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch b/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch
 new file mode 100644
-index 0000000000..0ca53860a5
+index 0000000000..e59036f5a2
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch
 @@ -0,0 +1,1249 @@
@@ -11675,7 +12691,7 @@ index 0000000000..0ca53860a5
 + 
 +--- a/net/mac80211/ieee80211_i.h
 ++++ b/net/mac80211/ieee80211_i.h
-+@@ -863,16 +863,20 @@ enum txq_info_flags {
++@@ -862,16 +862,20 @@ enum txq_info_flags {
 +  * @def_flow: used as a fallback flow when a packet destined to @tin hashes to
 +  *	a fq_flow which is already owned by a different tin
 +  * @def_cvars: codel vars for @def_flow
@@ -11698,7 +12714,7 @@ index 0000000000..0ca53860a5
 + 	unsigned long flags;
 + 
 + 	/* keep last! */
-+@@ -949,8 +953,6 @@ struct ieee80211_sub_if_data {
++@@ -948,8 +952,6 @@ struct ieee80211_sub_if_data {
 + 	struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
 + 	struct mac80211_qos_map __rcu *qos_map;
 + 
@@ -11707,7 +12723,7 @@ index 0000000000..0ca53860a5
 + 	struct work_struct csa_finalize_work;
 + 	bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
 + 	struct cfg80211_chan_def csa_chandef;
-+@@ -1185,44 +1187,6 @@ enum mac80211_scan_state {
++@@ -1184,44 +1186,6 @@ enum mac80211_scan_state {
 + 	SCAN_ABORT,
 + };
 + 
@@ -11752,7 +12768,7 @@ index 0000000000..0ca53860a5
 + DECLARE_STATIC_KEY_FALSE(aql_disable);
 + 
 + struct ieee80211_local {
-+@@ -1236,8 +1200,13 @@ struct ieee80211_local {
++@@ -1235,8 +1199,13 @@ struct ieee80211_local {
 + 	struct codel_params cparams;
 + 
 + 	/* protects active_txqs and txqi->schedule_order */
@@ -11767,7 +12783,7 @@ index 0000000000..0ca53860a5
 + 	u32 aql_threshold;
 + 	atomic_t aql_total_pending_airtime;
 + 
-+@@ -1654,125 +1623,6 @@ static inline bool txq_has_queue(struct
++@@ -1660,125 +1629,6 @@ static inline bool txq_has_queue(struct
 + 	return !(skb_queue_empty(&txqi->frags) && !txqi->tin.backlog_packets);
 + }
 + 
@@ -11893,7 +12909,7 @@ index 0000000000..0ca53860a5
 + static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr)
 + {
 + 	return ether_addr_equal(raddr, addr) ||
-+@@ -2018,14 +1868,6 @@ int ieee80211_tx_control_port(struct wip
++@@ -2024,14 +1874,6 @@ 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);
@@ -12833,7 +13849,7 @@ index 0000000000..317e4f0653
 + 	spin_unlock_bh(&local->active_txq_lock[txq->ac]);
 diff --git a/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch b/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch
 new file mode 100644
-index 0000000000..42e1671ed6
+index 0000000000..fb6fd6eac6
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/334-mac80211-add-a-per-PHY-AQL-limit-to-improve-fairness.patch
 @@ -0,0 +1,131 @@
@@ -12854,7 +13870,7 @@ index 0000000000..42e1671ed6
 +
 +--- a/net/mac80211/ieee80211_i.h
 ++++ b/net/mac80211/ieee80211_i.h
-+@@ -1216,6 +1216,7 @@ struct ieee80211_local {
++@@ -1215,6 +1215,7 @@ struct ieee80211_local {
 + 	u32 aql_txq_limit_high[IEEE80211_NUM_ACS];
 + 	u32 aql_threshold;
 + 	atomic_t aql_total_pending_airtime;
@@ -15545,6 +16561,104 @@ index 9b6a614aa8..0000000000
 - 	u32 sample_switch;
 - 	unsigned int cw_min;
 - 	unsigned int cw_max;
+diff --git a/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch b/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch
+new file mode 100644
+index 0000000000..82243f1d98
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/340-wifi-mac80211-do-not-abuse-fq.lock-in-ieee80211_do_s.patch
+@@ -0,0 +1,46 @@
++From aa40d5a43526cca9439a2b45fcfdcd016594dece Mon Sep 17 00:00:00 2001
++From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
++Date: Sun, 17 Jul 2022 21:21:52 +0900
++Subject: [PATCH] wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop()
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++lockdep complains use of uninitialized spinlock at ieee80211_do_stop() [1],
++for commit f856373e2f31ffd3 ("wifi: mac80211: do not wake queues on a vif
++that is being stopped") guards clear_bit() using fq.lock even before
++fq_init() from ieee80211_txq_setup_flows() initializes this spinlock.
++
++According to discussion [2], Toke was not happy with expanding usage of
++fq.lock. Since __ieee80211_wake_txqs() is called under RCU read lock, we
++can instead use synchronize_rcu() for flushing ieee80211_wake_txqs().
++
++Link: https://syzkaller.appspot.com/bug?extid=eceab52db7c4b961e9d6 [1]
++Link: https://lkml.kernel.org/r/874k0zowh2.fsf@toke.dk [2]
++Reported-by: syzbot <syzbot+eceab52db7c4b961e9d6@syzkaller.appspotmail.com>
++Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
++Fixes: f856373e2f31ffd3 ("wifi: mac80211: do not wake queues on a vif that is being stopped")
++Tested-by: syzbot <syzbot+eceab52db7c4b961e9d6@syzkaller.appspotmail.com>
++Acked-by: Toke Høiland-Jørgensen <toke@kernel.org>
++Signed-off-by: Kalle Valo <kvalo@kernel.org>
++Link: https://lore.kernel.org/r/9cc9b81d-75a3-3925-b612-9d0ad3cab82b@I-love.SAKURA.ne.jp
++[ pick up commit 3598cb6e1862 ("wifi: mac80211: do not abuse fq.lock in ieee80211_do_stop()") from -next]
++Link: https://lore.kernel.org/all/87o7xcq6qt.fsf@kernel.org/
++Signed-off-by: Jakub Kicinski <kuba@kernel.org>
++---
++ net/mac80211/iface.c | 3 +--
++ 1 file changed, 1 insertion(+), 2 deletions(-)
++
++--- a/net/mac80211/iface.c
+++++ b/net/mac80211/iface.c
++@@ -377,9 +377,8 @@ static void ieee80211_do_stop(struct iee
++ 	bool cancel_scan;
++ 	struct cfg80211_nan_func *func;
++ 
++-	spin_lock_bh(&local->fq.lock);
++ 	clear_bit(SDATA_STATE_RUNNING, &sdata->state);
++-	spin_unlock_bh(&local->fq.lock);
+++	synchronize_rcu(); /* flush _ieee80211_wake_txqs() */
++ 
++ 	cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata;
++ 	if (cancel_scan)
+diff --git a/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch b/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch
+new file mode 100644
+index 0000000000..8c56acbf88
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/341-mac80211-Fix-deadlock-Don-t-start-TX-while-holding-f.patch
+@@ -0,0 +1,40 @@
++From: Alexander Wetzel <alexander@wetzel-home.de>
++Date: Thu, 15 Sep 2022 14:41:20 +0200
++Subject: [PATCH] mac80211: Fix deadlock: Don't start TX while holding
++ fq->lock
++
++ieee80211_txq_purge() calls fq_tin_reset() and
++ieee80211_purge_tx_queue(); Both are then calling
++ieee80211_free_txskb(). Which can decide to TX the skb again.
++
++There are at least two ways to get a deadlock:
++
++1) When we have a TDLS teardown packet queued in either tin or frags
++   ieee80211_tdls_td_tx_handle() will call ieee80211_subif_start_xmit()
++   while we still hold fq->lock. ieee80211_txq_enqueue() will thus
++   deadlock.
++
++2) A variant of the above happens if aggregation is up and running:
++   In that case ieee80211_iface_work() will deadlock with the original
++   task: The original tasks already holds fq->lock and tries to get
++   sta->lock after kicking off ieee80211_iface_work(). But the worker
++   can get sta->lock prior to the original task and will then spin for
++   fq->lock.
++
++Avoid these deadlocks by not sending out any skbs when called via
++ieee80211_free_txskb().
++
++Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
++---
++
++--- a/net/mac80211/status.c
+++++ b/net/mac80211/status.c
++@@ -698,7 +698,7 @@ static void ieee80211_report_used_skb(st
++ 
++ 		if (!sdata) {
++ 			skb->dev = NULL;
++-		} else {
+++		} else if (!dropped) {
++ 			unsigned int hdr_size =
++ 				ieee80211_hdrlen(hdr->frame_control);
++ 
 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
 deleted file mode 100644
 index a8e6e89954..0000000000
@@ -15618,6 +16732,59 @@ index a8e6e89954..0000000000
 - static bool
 - minstrel_ht_probe_group(struct minstrel_ht_sta *mi, const struct mcs_group *tp_group,
 - 						int tp_idx, const struct mcs_group *group)
+diff --git a/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch b/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch
+new file mode 100644
+index 0000000000..4310329319
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/342-mac80211-Ensure-vif-queues-are-operational-after-sta.patch
+@@ -0,0 +1,47 @@
++From: Alexander Wetzel <alexander@wetzel-home.de>
++Date: Thu, 15 Sep 2022 15:09:46 +0200
++Subject: [PATCH] mac80211: Ensure vif queues are operational after start
++
++Make sure local->queue_stop_reasons and vif.txqs_stopped stay in sync.
++
++When a new vif is created the queues may end up in an inconsistent state
++and be inoperable:
++Communication not using iTXQ will work, allowing to e.g. complete the
++association. But the 4-way handshake will time out. The sta will not
++send out any skbs queued in iTXQs.
++
++All normal attempts to start the queues will fail when reaching this
++state.
++local->queue_stop_reasons will have marked all queues as operational but
++vif.txqs_stopped will still be set, creating an inconsistent internal
++state.
++
++In reality this seems to be race between the mac80211 function
++ieee80211_do_open() setting SDATA_STATE_RUNNING and the wake_txqs_tasklet:
++Depending on the driver and the timing the queues may end up to be
++operational or not.
++
++Cc: stable@vger.kernel.org
++Fixes: f856373e2f31 ("wifi: mac80211: do not wake queues on a vif that is being stopped")
++Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de>
++---
++
++--- a/net/mac80211/util.c
+++++ b/net/mac80211/util.c
++@@ -301,14 +301,14 @@ static void __ieee80211_wake_txqs(struct
++ 	local_bh_disable();
++ 	spin_lock(&fq->lock);
++ 
+++	sdata->vif.txqs_stopped[ac] = false;
+++
++ 	if (!test_bit(SDATA_STATE_RUNNING, &sdata->state))
++ 		goto out;
++ 
++ 	if (sdata->vif.type == NL80211_IFTYPE_AP)
++ 		ps = &sdata->bss->ps;
++ 
++-	sdata->vif.txqs_stopped[ac] = false;
++-
++ 	list_for_each_entry_rcu(sta, &local->sta_list, list) {
++ 		if (sdata != sta->sdata)
++ 			continue;
 diff --git a/package/kernel/mac80211/patches/subsys/342-mac80211-minstrel_ht-improve-sample-rate-selection.patch b/package/kernel/mac80211/patches/subsys/342-mac80211-minstrel_ht-improve-sample-rate-selection.patch
 deleted file mode 100644
 index e084525235..0000000000
@@ -15785,6 +16952,49 @@ index 0dbfa9d4fb..0000000000
 - 	/* Try to increase robustness of max_prob_rate*/
 - 	minstrel_ht_prob_rate_reduce_streams(mi);
 - 
+diff --git a/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch b/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch
+new file mode 100644
+index 0000000000..0246785475
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/343-wifi-mac80211-fix-decap-offload-for-stations-on-AP_V.patch
+@@ -0,0 +1,37 @@
++From: Felix Fietkau <nbd@nbd.name>
++Date: Wed, 28 Sep 2022 13:50:34 +0200
++Subject: [PATCH] wifi: mac80211: fix decap offload for stations on AP_VLAN
++ interfaces
++
++Since AP_VLAN interfaces are not passed to the driver, check offload_flags
++on the bss vif instead.
++
++Reported-by: Howard Hsu <howard-yh.hsu@mediatek.com>
++Fixes: 80a915ec4427 ("mac80211: add rx decapsulation offload support")
++Signed-off-by: Felix Fietkau <nbd@nbd.name>
++---
++
++--- a/net/mac80211/rx.c
+++++ b/net/mac80211/rx.c
++@@ -4267,6 +4267,7 @@ void ieee80211_check_fast_rx(struct sta_
++ 		.vif_type = sdata->vif.type,
++ 		.control_port_protocol = sdata->control_port_protocol,
++ 	}, *old, *new = NULL;
+++	u32 offload_flags;
++ 	bool set_offload = false;
++ 	bool assign = false;
++ 	bool offload;
++@@ -4382,10 +4383,10 @@ void ieee80211_check_fast_rx(struct sta_
++ 	if (assign)
++ 		new = kmemdup(&fastrx, sizeof(fastrx), GFP_KERNEL);
++ 
++-	offload = assign &&
++-		  (sdata->vif.offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED);
+++	offload_flags = get_bss_sdata(sdata)->vif.offload_flags;
+++	offload = offload_flags & IEEE80211_OFFLOAD_DECAP_ENABLED;
++ 
++-	if (offload)
+++	if (assign && offload)
++ 		set_offload = !test_and_set_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD);
++ 	else
++ 		set_offload = test_and_clear_sta_flag(sta, WLAN_STA_DECAP_OFFLOAD);
 diff --git a/package/kernel/mac80211/patches/subsys/344-mac80211-minstrel_ht-increase-stats-update-interval.patch b/package/kernel/mac80211/patches/subsys/344-mac80211-minstrel_ht-increase-stats-update-interval.patch
 deleted file mode 100644
 index 9972a9414e..0000000000
@@ -15811,6 +17021,111 @@ index 9972a9414e..0000000000
 - 
 - 	minstrel_ht_init_cck_rates(mp);
 - 	for (i = 0; i < ARRAY_SIZE(mp->hw->wiphy->bands); i++)
+diff --git a/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch b/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch
+new file mode 100644
+index 0000000000..161c7d6c8f
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/344-wifi-cfg80211-fix-ieee80211_data_to_8023_exthdr-hand.patch
+@@ -0,0 +1,99 @@
++From: Felix Fietkau <nbd@nbd.name>
++Date: Fri, 7 Oct 2022 10:54:47 +0200
++Subject: [PATCH] wifi: cfg80211: fix ieee80211_data_to_8023_exthdr
++ handling of small packets
++
++STP topology change notification packets only have a payload of 7 bytes,
++so they get dropped due to the skb->len < hdrlen + 8 check.
++Fix this by removing skb->len based checks and instead check the return code
++on the skb_copy_bits calls.
++
++Fixes: 2d1c304cb2d5 ("cfg80211: add function for 802.3 conversion with separate output buffer")
++Reported-by: Chad Monroe <chad.monroe@smartrg.com>
++Signed-off-by: Felix Fietkau <nbd@nbd.name>
++---
++
++--- a/net/wireless/util.c
+++++ b/net/wireless/util.c
++@@ -557,7 +557,7 @@ int ieee80211_data_to_8023_exthdr(struct
++ 		return -1;
++ 
++ 	hdrlen = ieee80211_hdrlen(hdr->frame_control) + data_offset;
++-	if (skb->len < hdrlen + 8)
+++	if (skb->len < hdrlen)
++ 		return -1;
++ 
++ 	/* convert IEEE 802.11 header + possible LLC headers into Ethernet
++@@ -572,8 +572,9 @@ int ieee80211_data_to_8023_exthdr(struct
++ 	memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN);
++ 	memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN);
++ 
++-	if (iftype == NL80211_IFTYPE_MESH_POINT)
++-		skb_copy_bits(skb, hdrlen, &mesh_flags, 1);
+++	if (iftype == NL80211_IFTYPE_MESH_POINT &&
+++	    skb_copy_bits(skb, hdrlen, &mesh_flags, 1) < 0)
+++		return -1;
++ 
++ 	mesh_flags &= MESH_FLAGS_AE;
++ 
++@@ -593,11 +594,12 @@ int ieee80211_data_to_8023_exthdr(struct
++ 		if (iftype == NL80211_IFTYPE_MESH_POINT) {
++ 			if (mesh_flags == MESH_FLAGS_AE_A4)
++ 				return -1;
++-			if (mesh_flags == MESH_FLAGS_AE_A5_A6) {
++-				skb_copy_bits(skb, hdrlen +
++-					offsetof(struct ieee80211s_hdr, eaddr1),
++-					tmp.h_dest, 2 * ETH_ALEN);
++-			}
+++			if (mesh_flags == MESH_FLAGS_AE_A5_A6 &&
+++			    skb_copy_bits(skb, hdrlen +
+++					  offsetof(struct ieee80211s_hdr, eaddr1),
+++					  tmp.h_dest, 2 * ETH_ALEN) < 0)
+++				return -1;
+++
++ 			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
++ 		}
++ 		break;
++@@ -611,10 +613,11 @@ int ieee80211_data_to_8023_exthdr(struct
++ 		if (iftype == NL80211_IFTYPE_MESH_POINT) {
++ 			if (mesh_flags == MESH_FLAGS_AE_A5_A6)
++ 				return -1;
++-			if (mesh_flags == MESH_FLAGS_AE_A4)
++-				skb_copy_bits(skb, hdrlen +
++-					offsetof(struct ieee80211s_hdr, eaddr1),
++-					tmp.h_source, ETH_ALEN);
+++			if (mesh_flags == MESH_FLAGS_AE_A4 &&
+++			    skb_copy_bits(skb, hdrlen +
+++					  offsetof(struct ieee80211s_hdr, eaddr1),
+++					  tmp.h_source, ETH_ALEN) < 0)
+++				return -1;
++ 			hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags);
++ 		}
++ 		break;
++@@ -626,18 +629,18 @@ int ieee80211_data_to_8023_exthdr(struct
++ 		break;
++ 	}
++ 
++-	skb_copy_bits(skb, hdrlen, &payload, sizeof(payload));
++-	tmp.h_proto = payload.proto;
++-
++-	if (likely((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) &&
++-		    tmp.h_proto != htons(ETH_P_AARP) &&
++-		    tmp.h_proto != htons(ETH_P_IPX)) ||
++-		   ether_addr_equal(payload.hdr, bridge_tunnel_header)))
+++	if (likely(skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)) == 0 &&
+++	           ((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) &&
+++		     payload.proto != htons(ETH_P_AARP) &&
+++		     payload.proto != htons(ETH_P_IPX)) ||
+++		    ether_addr_equal(payload.hdr, bridge_tunnel_header)))) {
++ 		/* remove RFC1042 or Bridge-Tunnel encapsulation and
++ 		 * replace EtherType */
++ 		hdrlen += ETH_ALEN + 2;
++-	else
+++		tmp.h_proto = payload.proto;
+++	} else {
++ 		tmp.h_proto = htons(skb->len - hdrlen);
+++	}
++ 
++ 	pskb_pull(skb, hdrlen);
++ 
 diff --git a/package/kernel/mac80211/patches/subsys/345-mac80211-minstrel_ht-fix-rounding-error-in-throughpu.patch b/package/kernel/mac80211/patches/subsys/345-mac80211-minstrel_ht-fix-rounding-error-in-throughpu.patch
 deleted file mode 100644
 index 1df5dec039..0000000000
@@ -15851,6 +17166,37 @@ index 1df5dec039..0000000000
 - }
 - 
 - /*
+diff --git a/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch b/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch
+new file mode 100644
+index 0000000000..23047f68c9
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/345-wifi-mac80211-do-not-drop-packets-smaller-than-the-L.patch
+@@ -0,0 +1,25 @@
++From: Felix Fietkau <nbd@nbd.name>
++Date: Fri, 7 Oct 2022 10:58:26 +0200
++Subject: [PATCH] wifi: mac80211: do not drop packets smaller than the
++ LLC-SNAP header on fast-rx
++
++Since STP TCN frames are only 7 bytes, the pskb_may_pull call returns an error.
++Instead of dropping those packets, bump them back to the slow path for proper
++processing.
++
++Fixes: 49ddf8e6e234 ("mac80211: add fast-rx path")
++Reported-by: Chad Monroe <chad.monroe@smartrg.com>
++Signed-off-by: Felix Fietkau <nbd@nbd.name>
++---
++
++--- a/net/mac80211/rx.c
+++++ b/net/mac80211/rx.c
++@@ -4603,7 +4603,7 @@ static bool ieee80211_invoke_fast_rx(str
++ 
++ 	if (!(status->rx_flags & IEEE80211_RX_AMSDU)) {
++ 		if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
++-			goto drop;
+++			return false;
++ 
++ 		payload = (void *)(skb->data + snap_offs);
++ 
 diff --git a/package/kernel/mac80211/patches/subsys/346-mac80211-minstrel_ht-use-bitfields-to-encode-rate-in.patch b/package/kernel/mac80211/patches/subsys/346-mac80211-minstrel_ht-use-bitfields-to-encode-rate-in.patch
 deleted file mode 100644
 index 6aa6f0ed93..0000000000
@@ -16269,6 +17615,48 @@ index 6aa6f0ed93..0000000000
 - 		unsigned int duration;
 - 
 - 		if (!(mi->supported[i] & BIT(j)))
+diff --git a/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch b/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch
+new file mode 100644
+index 0000000000..7185a7fed6
+--- /dev/null
++++ b/package/kernel/mac80211/patches/subsys/346-v6.0-wifi-mac80211-fix-mesh-airtime-link-metric-estimatin.patch
+@@ -0,0 +1,36 @@
++From: Aditya Kumar Singh <quic_adisi@quicinc.com>
++Date: Fri, 1 Jul 2022 19:06:11 +0530
++Subject: [PATCH] wifi: mac80211: fix mesh airtime link metric estimating
++
++ieee80211s_update_metric function uses sta_set_rate_info_tx
++function to get struct rate_info data from ieee80211_tx_rate
++struct, present in ieee80211_sta->deflink.tx_stats. However,
++drivers can skip tx rate calculation by setting rate idx as
++-1. Such drivers provides rate_info directly and hence
++ieee80211s metric is updated incorrectly since ieee80211_tx_rate
++has inconsistent data.
++
++Add fix to use rate_info directly if present instead of
++sta_set_rate_info_tx for updating ieee80211s metric.
++
++Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
++Link: https://lore.kernel.org/r/20220701133611.544-1-quic_adisi@quicinc.com
++Signed-off-by: Johannes Berg <johannes.berg@intel.com>
++---
++
++--- a/net/mac80211/mesh_hwmp.c
+++++ b/net/mac80211/mesh_hwmp.c
++@@ -310,7 +310,12 @@ void ieee80211s_update_metric(struct iee
++ 			LINK_FAIL_THRESH)
++ 		mesh_plink_broken(sta);
++ 
++-	sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo);
+++	/* use rate info set by the driver directly if present */
+++	if (st->rate)
+++		rinfo = sta->tx_stats.last_rate_info;
+++	else
+++		sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo);
+++
++ 	ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg,
++ 				  cfg80211_calculate_bitrate(&rinfo));
++ }
 diff --git a/package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch b/package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch
 deleted file mode 100644
 index dce8104934..0000000000
@@ -17210,130 +18598,6 @@ index 09f6fd2214..0000000000
 - 	u8 band;
 - 
 - 	/* Bitfield of supported MCS rates of all groups */
-diff --git a/package/kernel/mac80211/patches/subsys/350-bss-color-collision.patch b/package/kernel/mac80211/patches/subsys/350-bss-color-collision.patch
-new file mode 100644
-index 0000000000..1e3486accd
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/350-bss-color-collision.patch
-@@ -0,0 +1,118 @@
-+From 6d945a33f2b0aa24fc210dadaa0af3e8218e7002 Mon Sep 17 00:00:00 2001
-+From: Lorenzo Bianconi <lorenzo@kernel.org>
-+Date: Fri, 25 Mar 2022 11:42:41 +0100
-+Subject: [PATCH] mac80211: introduce BSS color collision detection
-+
-+Add ieee80211_rx_check_bss_color_collision routine in order to introduce
-+BSS color collision detection in mac80211 if it is not supported in HW/FW
-+(e.g. for mt7915 chipset).
-+Add IEEE80211_HW_DETECTS_COLOR_COLLISION flag to let the driver notify
-+BSS color collision detection is supported in HW/FW. Set this for ath11k
-+which apparently didn't need this code.
-+
-+Tested-by: Peter Chiu <Chui-Hao.Chiu@mediatek.com>
-+Co-developed-by: Ryder Lee <ryder.lee@mediatek.com>
-+Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
-+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-+Link: https://lore.kernel.org/r/a05eeeb1841a84560dc5aaec77894fcb69a54f27.1648204871.git.lorenzo@kernel.org
-+[clarify commit message a bit, move flag to mac80211]
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+ drivers/net/wireless/ath/ath11k/mac.c |  5 ++-
-+ include/net/mac80211.h                |  4 +++
-+ net/mac80211/debugfs.c                |  1 +
-+ net/mac80211/rx.c                     | 46 +++++++++++++++++++++++++++
-+ 4 files changed, 55 insertions(+), 1 deletion(-)
-+
-+--- a/include/net/mac80211.h
-++++ b/include/net/mac80211.h
-+@@ -2418,6 +2418,9 @@ struct ieee80211_txq {
-+  *	usage and 802.11 frames with %RX_FLAG_ONLY_MONITOR set for monitor to
-+  *	the stack.
-+  *
-++ * @IEEE80211_HW_DETECTS_COLOR_COLLISION: HW/driver has support for BSS color
-++ *	collision detection and doesn't need it in software.
-++ *
-+  * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
-+  */
-+ enum ieee80211_hw_flags {
-+@@ -2473,6 +2476,7 @@ enum ieee80211_hw_flags {
-+ 	IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
-+ 	IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
-+ 	IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP,
-++	IEEE80211_HW_DETECTS_COLOR_COLLISION,
-+ 
-+ 	/* keep last, obviously */
-+ 	NUM_IEEE80211_HW_FLAGS
-+--- a/net/mac80211/debugfs.c
-++++ b/net/mac80211/debugfs.c
-+@@ -494,6 +494,7 @@ static const char *hw_flag_names[] = {
-+ 	FLAG(SUPPORTS_TX_ENCAP_OFFLOAD),
-+ 	FLAG(SUPPORTS_RX_DECAP_OFFLOAD),
-+ 	FLAG(SUPPORTS_CONC_MON_RX_DECAP),
-++	FLAG(DETECTS_COLOR_COLLISION),
-+ #undef FLAG
-+ };
-+ 
-+--- a/net/mac80211/rx.c
-++++ b/net/mac80211/rx.c
-+@@ -3180,6 +3180,49 @@ static void ieee80211_process_sa_query_r
-+ 	ieee80211_tx_skb(sdata, skb);
-+ }
-+ 
-++static void
-++ieee80211_rx_check_bss_color_collision(struct ieee80211_rx_data *rx)
-++{
-++	struct ieee80211_mgmt *mgmt = (void *)rx->skb->data;
-++	const struct element *ie;
-++	size_t baselen;
-++
-++	if (!wiphy_ext_feature_isset(rx->local->hw.wiphy,
-++				     NL80211_EXT_FEATURE_BSS_COLOR))
-++		return;
-++
-++	if (ieee80211_hw_check(&rx->local->hw, DETECTS_COLOR_COLLISION))
-++		return;
-++
-++	if (rx->sdata->vif.csa_active)
-++		return;
-++
-++	baselen = mgmt->u.beacon.variable - rx->skb->data;
-++	if (baselen > rx->skb->len)
-++		return;
-++
-++	ie = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION,
-++				    mgmt->u.beacon.variable,
-++				    rx->skb->len - baselen);
-++	if (ie && ie->datalen >= sizeof(struct ieee80211_he_operation) &&
-++	    ie->datalen >= ieee80211_he_oper_size(ie->data + 1)) {
-++		struct ieee80211_bss_conf *bss_conf = &rx->sdata->vif.bss_conf;
-++		const struct ieee80211_he_operation *he_oper;
-++		u8 color;
-++
-++		he_oper = (void *)(ie->data + 1);
-++		if (le32_get_bits(he_oper->he_oper_params,
-++				  IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED))
-++			return;
-++
-++		color = le32_get_bits(he_oper->he_oper_params,
-++				      IEEE80211_HE_OPERATION_BSS_COLOR_MASK);
-++		if (color == bss_conf->he_bss_color.color)
-++			ieeee80211_obss_color_collision_notify(&rx->sdata->vif,
-++							       BIT_ULL(color));
-++	}
-++}
-++
-+ static ieee80211_rx_result debug_noinline
-+ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
-+ {
-+@@ -3205,6 +3248,9 @@ ieee80211_rx_h_mgmt_check(struct ieee802
-+ 	    !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
-+ 		int sig = 0;
-+ 
-++		/* sw bss color collision detection */
-++		ieee80211_rx_check_bss_color_collision(rx);
-++
-+ 		if (ieee80211_hw_check(&rx->local->hw, SIGNAL_DBM) &&
-+ 		    !(status->flag & RX_FLAG_NO_SIGNAL_VAL))
-+ 			sig = status->signal;
 diff --git a/package/kernel/mac80211/patches/subsys/350-mac80211-minstrel_ht-show-sampling-rates-in-debugfs.patch b/package/kernel/mac80211/patches/subsys/350-mac80211-minstrel_ht-show-sampling-rates-in-debugfs.patch
 deleted file mode 100644
 index 041ba31a37..0000000000
@@ -22715,7 +23979,7 @@ index 974595e11a..f2ed528d23 100644
   				return -EINVAL;
   
 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 fe23a289d3..50c24a7746 100644
+index fe23a289d3..962ae93cc7 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,24 +1,24 @@
@@ -22804,7 +24068,7 @@ index fe23a289d3..50c24a7746 100644
   {
 -@@ -4410,6 +4423,7 @@ const struct cfg80211_ops mac80211_confi
 + 	struct ieee80211_local *local = wiphy_priv(wiphy);
-+@@ -4516,6 +4529,7 @@ const struct cfg80211_ops mac80211_confi
++@@ -4513,6 +4526,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,
@@ -22816,7 +24080,7 @@ index fe23a289d3..50c24a7746 100644
  --- a/net/mac80211/ieee80211_i.h
  +++ b/net/mac80211/ieee80211_i.h
 -@@ -1440,6 +1440,7 @@ struct ieee80211_local {
-+@@ -1448,6 +1448,7 @@ struct ieee80211_local {
++@@ -1447,6 +1447,7 @@ struct ieee80211_local {
   	int dynamic_ps_forced_timeout;
   
   	int user_power_level; /* in dBm, for all interfaces */
@@ -22910,34 +24174,6 @@ index 0000000000..26af6a2fb9
 +-#endif /* < 5.2 */
 +-
 +-#endif /* _BP_OF_NET_H */
-diff --git a/package/kernel/mac80211/patches/subsys/783-sync-nl80211.patch b/package/kernel/mac80211/patches/subsys/783-sync-nl80211.patch
-new file mode 100644
-index 0000000000..dc2b05b1a3
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/783-sync-nl80211.patch
-@@ -0,0 +1,22 @@
-+--- a/include/uapi/linux/nl80211.h
-++++ b/include/uapi/linux/nl80211.h
-+@@ -6027,6 +6027,11 @@ enum nl80211_feature_flags {
-+  * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision
-+  *	detection and change announcemnts.
-+  *
-++ * @NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD: Driver running in AP mode supports
-++ *	FILS encryption and decryption for (Re)Association Request and Response
-++ *	frames. Userspace has to share FILS AAD details to the driver by using
-++ *	@NL80211_CMD_SET_FILS_AAD.
-++ *
-+  * @NL80211_EXT_FEATURE_RADAR_BACKGROUND: Device supports background radar/CAC
-+  *	detection.
-+  *
-+@@ -6095,6 +6100,7 @@ enum nl80211_ext_feature_index {
-+ 	NL80211_EXT_FEATURE_SECURE_RTT,
-+ 	NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
-+ 	NL80211_EXT_FEATURE_BSS_COLOR,
-++	NL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD,
-+ 	NL80211_EXT_FEATURE_RADAR_BACKGROUND,
-+ 
-+ 	/* add new features before the definition below */
 diff --git a/package/kernel/mac80211/realtek.mk b/package/kernel/mac80211/realtek.mk
 index 75cb94d7b6..44c6c25b08 100644
 --- a/package/kernel/mac80211/realtek.mk