From e0506ac4d15c1c08c39a92ffd0ead4519a5da141 Mon Sep 17 00:00:00 2001
From: Josef Schlehofer <josef.schlehofer@nic.cz>
Date: Sun, 4 Dec 2022 10:19:19 +0100
Subject: [PATCH] patches/openwrt: 5.15: backported mac80211: rebase

---
 .../0005-Backport-mac80211.patch              | 7668 +++++------------
 1 file changed, 1966 insertions(+), 5702 deletions(-)

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 c6007fdae..755d26b72 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,15 +1,16 @@
-From 50473f5b24b0df9dc8ae8a3229d93f50e069d580 Mon Sep 17 00:00:00 2001
+From 2a59f03f5b7dd12b68e9bf16cec2975b7edea342 Mon Sep 17 00:00:00 2001
 From: Josef Schlehofer <pepe.schlehofer@gmail.com>
-Date: Wed, 9 Nov 2022 09:21:26 +0100
+Date: Sun, 4 Dec 2022 10:17:20 +0100
 Subject: [PATCH] mac80211: downgrade to version 5.15.81
 
 ---
- package/kernel/mac80211/Makefile              |   36 +-
- package/kernel/mac80211/ath.mk                |    4 +-
- package/kernel/mac80211/broadcom.mk           |    4 +-
+ package/kernel/mac80211/Makefile              |   38 +-
+ package/kernel/mac80211/ath.mk                |    7 +-
+ package/kernel/mac80211/broadcom.mk           |    5 +-
  .../mac80211/files/lib/netifd/mac80211.sh     |   36 -
- .../files/lib/netifd/wireless/mac80211.sh     |    7 +-
+ .../files/lib/netifd/wireless/mac80211.sh     |   20 +-
  .../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 +-
@@ -17,6 +18,10 @@ 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 +-
@@ -62,46 +67,37 @@ 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 +-
- ...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 ++--
- ...-run-Rt5592-IQ-calibration-on-MT7620.patch |   52 +
- ...-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 +
- ...t-TX_SW_CFG1-MAC-register-for-MT7620.patch |   52 +
- ...t-VGC-gain-for-both-chains-of-MT7620.patch |   50 +
- ...5-rt2x00-set-SoC-wmac-clock-register.patch |   70 +
- ...ectly-set-BBP-register-86-for-MT7620.patch |   79 +
- .../602-rt2x00-introduce-rt2x00eeprom.patch   |   16 +-
- .../603-rt2x00-of_load_eeprom_filename.patch  |    6 +-
+ ...ringified-name-of-command-in-error-l.patch |  189 +++
+ ...define-RF5592-in-init_eeprom-routine.patch |    2 +-
+ .../602-rt2x00-introduce-rt2x00eeprom.patch   |   10 +-
  ...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  |   44 -
+ .../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 +-
  ...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} |   28 +-
  ...ent-set_tim-by-update-beacon-content.patch |  118 --
  .../patches/subsys/010-sync-nl80211_h.patch   |  297 ----
  .../100-remove-cryptoapi-dependencies.patch   |  699 ---------
@@ -155,38 +151,19 @@ 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 --
  ...el_ht-increase-stats-update-interval.patch |   20 -
  ...l_ht-fix-rounding-error-in-throughpu.patch |   34 -
- ...80211-mesh-clean-up-rx_bcn_presp-API.patch |  110 ++
  ...l_ht-use-bitfields-to-encode-rate-in.patch |  412 -----
  ...l_ht-update-total-packets-counter-in.patch |   54 -
- ...ove-CRC-into-struct-ieee802_11_elems.patch |   82 +
  ...l_ht-reduce-the-need-to-sample-slowe.patch |  102 --
- ...11-mlme-find-auth-challenge-directly.patch |   80 +
- ...ays-allocate-struct-ieee802_11_elems.patch | 1143 ++++++++++++++
  ...l_ht-significantly-redesign-the-rate.patch |  767 ----------
- ...ix-memory-leaks-with-element-parsing.patch |  115 ++
+ .../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 ----
- ...x-u8-overflow-in-cfg80211_update_not.patch |   41 +
  ...l_ht-fix-regression-in-the-max_prob_.patch |   23 -
- ...-mac80211-reject-bad-MBSSID-elements.patch |   47 +
- ...11-fix-MBSSID-parsing-use-after-free.patch |   94 ++
- ...sure-length-byte-is-present-before-a.patch |   41 +
- ...fi-cfg80211-fix-BSS-refcounting-bugs.patch |   87 ++
- ...oid-nontransmitted-BSS-list-corrupti.patch |   48 +
- ...sim-avoid-mac80211-warning-on-bad-ra.patch |   31 +
- ...x-crash-in-beacon-protection-for-P2P.patch |   52 +
- ...update-hidden-BSSes-to-avoid-WARN_ON.patch |   85 ++
- ...emory-leak-where-sta_info-is-not-fre.patch |   77 +
- ...n-t-finalize-CSA-in-IBSS-mode-if-sta.patch |   47 +
- ...ac80211-Fix-UAF-in-ieee80211_scan_rx.patch |   55 +
  ...pply-flow-control-on-management-fram.patch |   60 -
  ...set-sk_pacing_shift-for-802.3-txpath.patch |   21 -
  ...-Rx-timestamp-calculation-for-all-pr.patch |  134 --
@@ -213,13 +190,18 @@ 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 +
- 210 files changed, 9695 insertions(+), 13476 deletions(-)
+ 188 files changed, 7086 insertions(+), 13056 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%)
@@ -265,30 +247,13 @@ 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/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%)
- create mode 100644 package/kernel/mac80211/patches/rt2x00/009-rt2x00-don-t-run-Rt5592-IQ-calibration-on-MT7620.patch
- 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
- create mode 100644 package/kernel/mac80211/patches/rt2x00/013-rt2x00-set-correct-TX_SW_CFG1-MAC-register-for-MT7620.patch
- create mode 100644 package/kernel/mac80211/patches/rt2x00/014-rt2x00-set-VGC-gain-for-both-chains-of-MT7620.patch
- create mode 100644 package/kernel/mac80211/patches/rt2x00/015-rt2x00-set-SoC-wmac-clock-register.patch
- create mode 100644 package/kernel/mac80211/patches/rt2x00/016-rt2x00-correctly-set-BBP-register-86-for-MT7620.patch
- delete mode 100644 package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.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
  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
@@ -338,38 +303,19 @@ 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
  delete mode 100644 package/kernel/mac80211/patches/subsys/344-mac80211-minstrel_ht-increase-stats-update-interval.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/346-mac80211-mesh-clean-up-rx_bcn_presp-API.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/346-mac80211-minstrel_ht-use-bitfields-to-encode-rate-in.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/347-mac80211-move-CRC-into-struct-ieee802_11_elems.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/348-mac80211-mlme-find-auth-challenge-directly.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/349-mac80211-always-allocate-struct-ieee802_11_elems.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-mac80211-fix-memory-leaks-with-element-parsing.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
- create mode 100644 package/kernel/mac80211/patches/subsys/351-wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_not.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/352-mac80211-minstrel_ht-fix-regression-in-the-max_prob_.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/352-wifi-cfg80211-mac80211-reject-bad-MBSSID-elements.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/353-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/354-wifi-cfg80211-ensure-length-byte-is-present-before-a.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/355-wifi-cfg80211-fix-BSS-refcounting-bugs.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/356-wifi-cfg80211-avoid-nontransmitted-BSS-list-corrupti.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/357-wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-ra.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/358-wifi-mac80211-fix-crash-in-beacon-protection-for-P2P.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/359-wifi-cfg80211-update-hidden-BSSes-to-avoid-WARN_ON.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/360-mac80211-fix-a-memory-leak-where-sta_info-is-not-fre.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/361-wifi-mac80211-Don-t-finalize-CSA-in-IBSS-mode-if-sta.patch
- create mode 100644 package/kernel/mac80211/patches/subsys/362-wifi-mac80211-Fix-UAF-in-ieee80211_scan_rx.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/372-mac80211-set-sk_pacing_shift-for-802.3-txpath.patch
  delete mode 100644 package/kernel/mac80211/patches/subsys/373-mac80211-support-Rx-timestamp-calculation-for-all-pr.patch
@@ -394,20 +340,21 @@ 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 014512c67b..c5b190dfa0 100644
+index e2505924cf..afc10bdb5c 100644
 --- a/package/kernel/mac80211/Makefile
 +++ b/package/kernel/mac80211/Makefile
 @@ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk
  
  PKG_NAME:=mac80211
  
--PKG_VERSION:=5.10.149-1
+-PKG_VERSION:=5.10.157-1
 +PKG_VERSION:=5.15.58-1
  PKG_RELEASE:=1
--PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.10.149/
--PKG_HASH:=80a68a78c9b18513bad0bbd0cb70907eadbfd9bba44c075a94f0795fd7f7be2a
+-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
  
@@ -458,6 +405,15 @@ index 014512c67b..c5b190dfa0 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
@@ -506,7 +462,7 @@ index 014512c67b..c5b190dfa0 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..50b1eed9c8 100644
+index e815f37e1c..9af8c4665d 100644
 --- a/package/kernel/mac80211/ath.mk
 +++ b/package/kernel/mac80211/ath.mk
 @@ -34,7 +34,7 @@ ifdef CONFIG_PACKAGE_MAC80211_TRACING
@@ -527,8 +483,18 @@ index e815f37e1c..50b1eed9c8 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..473bbf597c 100644
+index fb576c5809..5548f6e661 100644
 --- a/package/kernel/mac80211/broadcom.mk
 +++ b/package/kernel/mac80211/broadcom.mk
 @@ -209,7 +209,7 @@ config PACKAGE_B43_USE_BCMA
@@ -549,6 +515,14 @@ index fb576c5809..473bbf597c 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
@@ -592,7 +566,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..daa54949a0 100644
+index d69667bf8c..5d6ca7c0e3 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 @@
@@ -603,19 +577,63 @@ index d69667bf8c..daa54949a0 100644
  
  init_wireless_driver "$@"
  
-@@ -414,9 +413,9 @@ mac80211_hostapd_setup_base() {
- 			he_spr_non_srg_obss_pd_max_offset:1 \
- 			he_bss_color
+@@ -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"
  
--		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)
++	[ "$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_mac_cap=${he_mac_cap:2}
  
  		append base_cfg "ieee80211ax=1" "$N"
-@@ -563,7 +562,7 @@ mac80211_generate_mac() {
+-		[ -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() {
  find_phy() {
  	[ -n "$phy" -a -d /sys/class/ieee80211/$phy ] && return 0
  	[ -n "$path" ] && {
@@ -652,6 +670,19 @@ 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
@@ -752,13 +783,13 @@ 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 dfe324caf8..02281adf4a 100644
+index bacaf92b5e..02281adf4a 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
--@@ -3257,6 +3257,8 @@ void regulatory_hint_country_ie(struct w
+-@@ -3263,6 +3263,8 @@ void regulatory_hint_country_ie(struct w
 +@@ -3309,6 +3309,8 @@ void regulatory_hint_country_ie(struct w
   	enum environment_cap env = ENVIRON_ANY;
   	struct regulatory_request *request = NULL, *lr;
@@ -767,7 +798,7 @@ index dfe324caf8..02281adf4a 100644
   	/* IE len must be evenly divisible by 2 */
   	if (country_ie_len & 0x01)
   		return;
--@@ -3508,6 +3510,7 @@ static bool is_wiphy_all_set_reg_flag(en
+-@@ -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
   
   void regulatory_hint_disconnect(void)
@@ -865,9 +896,533 @@ 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..74d5b374fb
+index 0000000000..7ef418e506
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/100-ath10k-support-bus-and-device-specific-API-1-BDF-sel.patch
 @@ -0,0 +1,65 @@
@@ -907,7 +1462,7 @@ index 0000000000..74d5b374fb
 +
 +--- a/drivers/net/wireless/ath/ath10k/core.c
 ++++ b/drivers/net/wireless/ath/ath10k/core.c
-+@@ -1199,6 +1199,7 @@ success:
++@@ -1202,6 +1202,7 @@ success:
 + static int ath10k_core_fetch_board_data_api_1(struct ath10k *ar, int bd_ie_type)
 + {
 + 	const struct firmware *fw;
@@ -915,7 +1470,7 @@ index 0000000000..74d5b374fb
 + 
 + 	if (bd_ie_type == ATH10K_BD_IE_BOARD) {
 + 		if (!ar->hw_params.fw.board) {
-+@@ -1206,9 +1207,19 @@ static int ath10k_core_fetch_board_data_
++@@ -1209,9 +1210,19 @@ static int ath10k_core_fetch_board_data_
 + 			return -EINVAL;
 + 		}
 + 
@@ -938,7 +1493,7 @@ index 0000000000..74d5b374fb
 + 
 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..ab42c6e1e0
+index 0000000000..c7a00b7e4b
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/120-ath10k-fetch-calibration-data-via-nvmem-subsystem.patch
 @@ -0,0 +1,162 @@
@@ -978,7 +1533,7 @@ index 0000000000..ab42c6e1e0
 + #include <asm/byteorder.h>
 + 
 + #include "core.h"
-+@@ -952,7 +953,8 @@ static int ath10k_core_get_board_id_from
++@@ -955,7 +956,8 @@ static int ath10k_core_get_board_id_from
 + 	}
 + 
 + 	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
@@ -988,7 +1543,7 @@ index 0000000000..ab42c6e1e0
 + 		bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
 + 	else
 + 		bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
-+@@ -1754,7 +1756,8 @@ static int ath10k_download_and_run_otp(s
++@@ -1757,7 +1759,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 ||
@@ -998,7 +1553,7 @@ index 0000000000..ab42c6e1e0
 + 		bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
 + 
 + 	ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
-+@@ -1881,6 +1884,39 @@ out_free:
++@@ -1884,6 +1887,39 @@ out_free:
 + 	return ret;
 + }
 + 
@@ -1038,7 +1593,7 @@ index 0000000000..ab42c6e1e0
 + int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
 + 				     struct ath10k_fw_file *fw_file)
 + {
-+@@ -2115,6 +2151,18 @@ static int ath10k_core_pre_cal_download(
++@@ -2118,6 +2154,18 @@ static int ath10k_core_pre_cal_download(
 + {
 + 	int ret;
 + 
@@ -1057,7 +1612,7 @@ index 0000000000..ab42c6e1e0
 + 	ret = ath10k_download_cal_file(ar, ar->pre_cal_file);
 + 	if (ret == 0) {
 + 		ar->cal_mode = ATH10K_PRE_CAL_MODE_FILE;
-+@@ -2181,6 +2229,18 @@ static int ath10k_download_cal_data(stru
++@@ -2184,6 +2232,18 @@ static int ath10k_download_cal_data(stru
 + 		   "pre cal download procedure failed, try cal file: %d\n",
 + 		   ret);
 + 
@@ -1108,7 +1663,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..5362c2436d 100644
+index 2b8fe7816f..e47fb012fa 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>
@@ -1116,7 +1671,7 @@ index 2b8fe7816f..5362c2436d 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 *
-+@@ -3440,6 +3440,16 @@ int ath10k_core_register(struct ath10k *
++@@ -3443,6 +3443,16 @@ int ath10k_core_register(struct ath10k *
   
   	queue_work(ar->workqueue, &ar->register_work);
   
@@ -1124,14 +1679,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 8da72a4fe1..200b310305 100644
+index 2fc83182b6..9dfde4385e 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
--@@ -9748,6 +9748,21 @@ static int ath10k_mac_init_rd(struct ath
-+@@ -9859,6 +9859,21 @@ static int ath10k_mac_init_rd(struct ath
+-@@ -9752,6 +9752,21 @@ static int ath10k_mac_init_rd(struct ath
++@@ -9894,6 +9894,21 @@ static int ath10k_mac_init_rd(struct ath
   	return 0;
   }
   
@@ -1139,8 +1694,8 @@ index 8da72a4fe1..200b310305 100644
   int ath10k_mac_register(struct ath10k *ar)
   {
   	static const u32 cipher_suites[] = {
--@@ -10097,6 +10112,12 @@ int ath10k_mac_register(struct ath10k *a
-+@@ -10211,6 +10226,12 @@ int ath10k_mac_register(struct ath10k *a
+-@@ -10101,6 +10116,12 @@ int ath10k_mac_register(struct ath10k *a
++@@ -10252,6 +10267,12 @@ int ath10k_mac_register(struct ath10k *a
   
   	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
   
@@ -1148,7 +1703,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..35927e7850 100644
+index d8c8a8abc0..47b52416ab 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:
@@ -1183,7 +1738,7 @@ index d8c8a8abc0..35927e7850 100644
   unsigned int ath10k_debug_mask;
   EXPORT_SYMBOL(ath10k_debug_mask);
 -@@ -61,6 +62,7 @@ static const struct ath10k_hw_params ath
-+@@ -62,6 +63,7 @@ static const struct ath10k_hw_params ath
++@@ -65,6 +66,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA988X_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca988x hw2.0",
@@ -1192,7 +1747,7 @@ index d8c8a8abc0..35927e7850 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
 -@@ -132,6 +134,7 @@ static const struct ath10k_hw_params ath
-+@@ -135,6 +137,7 @@ static const struct ath10k_hw_params ath
++@@ -138,6 +140,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9887_1_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9887 hw1.0",
@@ -1201,7 +1756,7 @@ index d8c8a8abc0..35927e7850 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
 -@@ -343,6 +346,7 @@ static const struct ath10k_hw_params ath
-+@@ -352,6 +355,7 @@ static const struct ath10k_hw_params ath
++@@ -355,6 +358,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA99X0_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca99x0 hw2.0",
@@ -1210,7 +1765,7 @@ index d8c8a8abc0..35927e7850 100644
   		.uart_pin = 7,
   		.otp_exe_param = 0x00000700,
 -@@ -384,6 +388,7 @@ static const struct ath10k_hw_params ath
-+@@ -394,6 +398,7 @@ static const struct ath10k_hw_params ath
++@@ -397,6 +401,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9984_1_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9984/qca9994 hw1.0",
@@ -1219,7 +1774,7 @@ index d8c8a8abc0..35927e7850 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 -@@ -432,6 +437,7 @@ static const struct ath10k_hw_params ath
-+@@ -443,6 +448,7 @@ static const struct ath10k_hw_params ath
++@@ -446,6 +451,7 @@ static const struct ath10k_hw_params ath
   		.dev_id = QCA9888_2_0_DEVICE_ID,
   		.bus = ATH10K_BUS_PCI,
   		.name = "qca9888 hw2.0",
@@ -1228,7 +1783,7 @@ index d8c8a8abc0..35927e7850 100644
   		.uart_pin = 7,
   		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
 -@@ -2921,6 +2927,10 @@ int ath10k_core_start(struct ath10k *ar,
-+@@ -3155,6 +3161,10 @@ int ath10k_core_start(struct ath10k *ar,
++@@ -3158,6 +3164,10 @@ int ath10k_core_start(struct ath10k *ar,
   		goto err_hif_stop;
   	}
   
@@ -1237,7 +1792,7 @@ index d8c8a8abc0..35927e7850 100644
   
   err_hif_stop:
 -@@ -3179,9 +3189,18 @@ static void ath10k_core_register_work(st
-+@@ -3413,9 +3423,18 @@ static void ath10k_core_register_work(st
++@@ -3416,9 +3426,18 @@ static void ath10k_core_register_work(st
   		goto err_spectral_destroy;
   	}
   
@@ -1246,7 +1801,7 @@ index d8c8a8abc0..35927e7850 100644
   	ath10k_spectral_destroy(ar);
   err_debug_destroy:
 -@@ -3227,6 +3246,8 @@ void ath10k_core_unregister(struct ath10
-+@@ -3461,6 +3480,8 @@ void ath10k_core_unregister(struct ath10
++@@ -3464,6 +3483,8 @@ void ath10k_core_unregister(struct ath10
   	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
   		return;
   
@@ -1263,7 +1818,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 005feda798..d4b46d943e 100644
+index ef98539f99..842853ddf4 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>
@@ -1283,8 +1838,8 @@ index 005feda798..d4b46d943e 100644
   	if (ret)
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
--@@ -10114,7 +10114,7 @@ int ath10k_mac_register(struct ath10k *a
-+@@ -10228,7 +10228,7 @@ int ath10k_mac_register(struct ath10k *a
+-@@ -10118,7 +10118,7 @@ int ath10k_mac_register(struct ath10k *a
++@@ -10269,7 +10269,7 @@ int ath10k_mac_register(struct ath10k *a
   	ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
   
   #ifdef CPTCFG_MAC80211_LEDS
@@ -1292,14 +1847,14 @@ 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 1f19765891..a45addf119 100644
+index f5c1fb2a2b..a45addf119 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
  
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
--@@ -1010,6 +1010,40 @@ static inline int ath10k_vdev_setup_sync
+-@@ -1017,6 +1017,40 @@ static inline int ath10k_vdev_setup_sync
 +@@ -1021,6 +1021,40 @@ static inline int ath10k_vdev_setup_sync
   	return ar->last_wmi_vdev_start_status;
   }
@@ -1308,7 +1863,7 @@ index 1f19765891..a45addf119 100644
   static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
   {
   	struct cfg80211_chan_def *chandef = NULL;
--@@ -1042,7 +1076,8 @@ static int ath10k_monitor_vdev_start(str
+-@@ -1049,7 +1083,8 @@ static int ath10k_monitor_vdev_start(str
 +@@ -1053,7 +1087,8 @@ static int ath10k_monitor_vdev_start(str
   	arg.channel.min_power = 0;
   	arg.channel.max_power = channel->max_power * 2;
@@ -1317,7 +1872,7 @@ index 1f19765891..a45addf119 100644
   
   	reinit_completion(&ar->vdev_setup_done);
   	reinit_completion(&ar->vdev_delete_done);
--@@ -1488,7 +1523,8 @@ static int ath10k_vdev_start_restart(str
+-@@ -1495,7 +1530,8 @@ static int ath10k_vdev_start_restart(str
 +@@ -1499,7 +1534,8 @@ static int ath10k_vdev_start_restart(str
   	arg.channel.min_power = 0;
   	arg.channel.max_power = chandef->chan->max_power * 2;
@@ -1326,14 +1881,14 @@ index 1f19765891..a45addf119 100644
   
   	if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
   		arg.ssid = arvif->u.ap.ssid;
--@@ -3259,7 +3295,8 @@ static int ath10k_update_channel_list(st
+-@@ -3266,7 +3302,8 @@ static int ath10k_update_channel_list(st
 +@@ -3427,7 +3463,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..d94a8a8596
+index 0000000000..80da07de8a
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch
 @@ -0,0 +1,37 @@
@@ -1365,7 +1920,7 @@ index 0000000000..d94a8a8596
 + #include <linux/property.h>
 + #include <linux/dmi.h>
 + #include <linux/ctype.h>
-+@@ -3331,6 +3332,8 @@ static int ath10k_core_probe_fw(struct a
++@@ -3334,6 +3335,8 @@ static int ath10k_core_probe_fw(struct a
 + 
 + 	device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
 + 
@@ -2395,6 +2950,115 @@ 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
@@ -2505,7 +3169,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..835c870a65 100644
+index 9658bda1c1..1ddc78f7ca 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>
@@ -2515,7 +3179,7 @@ index 9658bda1c1..835c870a65 100644
 -@@ -12,6 +12,36 @@
 - #include "common.h"
 - #include "of.h"
-+@@ -58,6 +58,36 @@ static int brcmf_of_get_country_codes(st
++@@ -59,6 +59,36 @@ static int brcmf_of_get_country_codes(st
 + 	return 0;
 + }
   
@@ -2526,7 +3190,7 @@ index 9658bda1c1..835c870a65 100644
   		    struct brcmf_mp_device *settings)
   {
 -@@ -43,6 +73,8 @@ void brcmf_of_probe(struct device *dev,
-+@@ -90,6 +120,8 @@ void brcmf_of_probe(struct device *dev,
++@@ -91,6 +121,8 @@ void brcmf_of_probe(struct device *dev,
   		of_node_put(root);
   	}
   
@@ -2537,8 +3201,210 @@ index 9658bda1c1..835c870a65 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 25a12c783e..a5efc08015 100644
+index beaf1ac872..d194e25177 100644
 --- a/package/kernel/mac80211/patches/brcm/998-survey.patch
 +++ b/package/kernel/mac80211/patches/brcm/998-survey.patch
 @@ -1,6 +1,6 @@
@@ -2580,8 +3446,8 @@ index 25a12c783e..a5efc08015 100644
   	.add_key = brcmf_cfg80211_add_key,
  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
--@@ -1356,6 +1356,8 @@ int brcmf_attach(struct device *dev)
-+@@ -1361,6 +1361,8 @@ int brcmf_attach(struct device *dev)
+-@@ -1357,6 +1357,8 @@ int brcmf_attach(struct device *dev)
++@@ -1363,6 +1363,8 @@ int brcmf_attach(struct device *dev)
   
   	/* Link to bus module */
   	drvr->hdrlen = 0;
@@ -2589,8 +3455,8 @@ index 25a12c783e..a5efc08015 100644
   
   	/* Attach and link in the protocol */
   	ret = brcmf_proto_attach(drvr);
--@@ -1438,6 +1440,12 @@ void brcmf_detach(struct device *dev)
-+@@ -1443,6 +1445,12 @@ void brcmf_detach(struct device *dev)
+-@@ -1439,6 +1441,12 @@ void brcmf_detach(struct device *dev)
++@@ -1445,6 +1447,12 @@ void brcmf_detach(struct device *dev)
   	if (drvr == NULL)
   		return;
   
@@ -2725,6 +3591,53 @@ 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
@@ -2746,2633 +3659,604 @@ index a35cf1875a..96b1ce77e9 100644
   		return;
   	priv = hw->priv;
   
-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
+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
 new file mode 100644
-index 0000000000..351e24a4d5
+index 0000000000..8fa3924e60
 --- /dev/null
-+++ 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"
++++ 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
 +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>
 +
-+Fix incorrect RF value encoded in EEPROM on devices with Ralink Rt5592
-+PCIe radio (a single chip 2T2R 802.11abgn solution).
++Failed hex command number in error log is hard to understand.
++So add also more human readable stringified command name into error log.
 +
-+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>
++Signed-off-by: Pali Rohár <pali@kernel.org>
 +---
-+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 ++
-+ 1 file changed, 2 insertions(+)
++ 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(-)
 +
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -9435,6 +9435,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);
++--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
+++++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
++@@ -28,6 +28,85 @@
 + 
-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);
-+ }
++ static void mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter);
 + 
-++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 },
-++};
+++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 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
++ /*
++  * 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;
++ 	}
 + 
-+ #undef RT2X00_TASKLET_INIT
++--- 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;
++ 	}
 + 
-++	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
-deleted file mode 100644
-index a50a195285..0000000000
+index 13298d3ce8..96eeb37dc6 100644
 --- a/package/kernel/mac80211/patches/rt2x00/002-rt2x00-define-RF5592-in-init_eeprom-routine.patch
-+++ /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
--@@ -9416,6 +9416,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 20452cd8a7..216f583063 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(-)
++++ 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/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
--@@ -4356,6 +4356,45 @@ static void rt2800_config_channel(struct
-+@@ -4368,6 +4368,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);
--@@ -9559,7 +9598,8 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9566,7 +9603,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,
--@@ -9570,6 +9610,18 @@ static int rt2800_init_eeprom(struct rt2
-+@@ -9577,6 +9615,18 @@ static int rt2800_init_eeprom(struct rt2
-  			      &rt2x00dev->cap_flags);
-  	}
+-@@ -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=
+  RT2X00_LIB_CRYPTO=
+  RT2X00_LIB_LEDS=
+  RT2X00_LIB_DEBUGFS=
+@@ -105,7 +105,7 @@
+  	.drv_init_registers	= rt2800mmio_init_registers,
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
++@@ -703,6 +703,7 @@ enum rt2x00_capability_flags {
+  	REQUIRE_HT_TX_DESC,
+  	REQUIRE_PS_AUTOWAKE,
+  	REQUIRE_DELAYED_RFKILL,
+@@ -113,7 +113,7 @@
   
- +	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..da453074a1
---- /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;
-++}
+  	/*
+  	 * Capabilities
+-@@ -970,6 +971,11 @@ struct rt2x00_dev {
++@@ -980,6 +981,11 @@ struct rt2x00_dev {
+  	const struct firmware *fw;
+  
+  	/*
+@@ -127,7 +127,7 @@
+  	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
+ --- 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
+  	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
+  	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
+  
+@@ -138,7 +138,7 @@
+  	/*
+  	 * 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_
+  	 * Free the driver data.
+  	 */
+  	kfree(rt2x00dev->drv_data);
+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
++++ b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
+@@ -12,7 +12,7 @@
+  #endif /* _RT2X00_PLATFORM_H */
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -1012,6 +1012,22 @@ static int rt2x00lib_probe_hw_modes(stru
++@@ -1007,6 +1007,22 @@ static int rt2x00lib_probe_hw_modes(stru
+  	unsigned int num_rates;
+  	unsigned int i;
+  
+@@ -37,7 +37,7 @@
+  		num_rates += 4;
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
+-@@ -399,6 +399,7 @@ struct hw_mode_spec {
++@@ -408,6 +408,7 @@ struct hw_mode_spec {
+  	unsigned int supported_bands;
+  #define SUPPORT_BAND_2GHZ	0x00000001
+  #define SUPPORT_BAND_5GHZ	0x00000002
+diff --git a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
+index b5b2c61037..37553bb80a 100644
+--- a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
++++ b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
+@@ -1,19 +1,18 @@
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -990,8 +990,13 @@ static void rt2x00lib_rate(struct ieee80
++@@ -989,6 +989,12 @@ static void rt2x00lib_rate(struct ieee80
+  
+  void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
+  {
+ +	struct rt2x00_platform_data *pdata;
+- 	const char *mac_addr;
+- 
 ++
-+ 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);
-+@@ -6249,46 +6282,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)
-+ {
-+@@ -9110,7 +9103,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;
+ +	pdata = rt2x00dev->dev->platform_data;
+ +	if (pdata && pdata->mac_address)
+ +		ether_addr_copy(eeprom_mac_addr, pdata->mac_address);
+ +
+- 	mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
+- 	if (!IS_ERR(mac_addr))
+- 		ether_addr_copy(eeprom_mac_addr, mac_addr);
++ 	of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
 + 
-+ 	/*
-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 6be847478e..4e98d6a375 100644
++ 	if (!is_valid_ether_addr(eeprom_mac_addr)) {
+ --- a/include/linux/rt2x00_platform.h
+ +++ b/include/linux/rt2x00_platform.h
+ @@ -14,6 +14,7 @@
+diff --git a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
+index ff8b2c947b..6211809c0a 100644
+--- a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
++++ b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
+@@ -1,6 +1,6 @@
+ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+ +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
+-@@ -1016,6 +1016,16 @@ static int rt2x00lib_probe_hw_modes(stru
++@@ -1012,6 +1012,16 @@ static int rt2x00lib_probe_hw_modes(stru
+  	struct ieee80211_rate *rates;
+  	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
+--- 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 @@
+  
+  #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
+  	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
+--- 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
+  	 */
+  	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
+--- 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
+-@@ -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;
+-@@ -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/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(+)
-+
++++ 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
--@@ -8419,6 +8419,56 @@ static void rt2800_init_rfcsr_5592(struc
-+@@ -8428,6 +8428,53 @@ static void rt2800_init_rfcsr_5592(struc
+-@@ -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);
   }
   
-@@ -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");
- +}
- +
+@@ -57,7 +57,7 @@
   static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
   				       bool set_bw, bool is_ht40)
   {
--@@ -9026,6 +9076,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9035,6 +9082,7 @@ static void rt2800_init_rfcsr_6352(struc
+-@@ -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/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 3ed0ff7ef5..7c69970166 100644
+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/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:
++++ 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
--@@ -8469,6 +8469,155 @@ static void rt2800_rf_self_txdc_cal(stru
-- 	rt2x00_info(rt2x00dev, "RF Tx self calibration end\n");
-+@@ -8475,6 +8475,138 @@ static void rt2800_rf_self_txdc_cal(stru
-+ 	rt2800_register_write(rt2x00dev, RF_BYPASS2, mac052c);
+-@@ -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");
   }
   
- +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 @@
+@@ -156,7 +156,7 @@
   static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
   				       bool set_bw, bool is_ht40)
   {
--@@ -9076,6 +9225,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9082,6 +9214,7 @@ static void rt2800_init_rfcsr_6352(struc
+-@@ -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/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 77be986d18..8da41e875a 100644
+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/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(+)
-+
++++ 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
--@@ -8618,6 +8618,70 @@ static void rt2800_r_calibration(struct
-+@@ -8607,6 +8607,65 @@ static void rt2800_r_calibration(struct
+-@@ -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);
   }
   
- +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 @@
+@@ -71,7 +71,7 @@
   static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
   				       bool set_bw, bool is_ht40)
   {
--@@ -9227,6 +9291,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9216,6 +9275,7 @@ static void rt2800_init_rfcsr_6352(struc
+-@@ -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/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 7352ad036c..dc516da43a 100644
+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/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(+)
-+
++++ 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
--@@ -8682,6 +8682,384 @@ static void rt2800_rxdcoc_calibration(st
-+@@ -8666,6 +8666,380 @@ static void rt2800_rxdcoc_calibration(st
+-@@ -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);
   }
   
--+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 @@
+@@ -385,7 +385,7 @@
   static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
   				       bool set_bw, bool is_ht40)
   {
--@@ -9294,6 +9672,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9278,6 +9652,7 @@ static void rt2800_init_rfcsr_6352(struc
+-@@ -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/009-rt2x00-don-t-run-Rt5592-IQ-calibration-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/009-rt2x00-don-t-run-Rt5592-IQ-calibration-on-MT7620.patch
-new file mode 100644
-index 0000000000..6b27f6a705
---- /dev/null
-+++ b/package/kernel/mac80211/patches/rt2x00/009-rt2x00-don-t-run-Rt5592-IQ-calibration-on-MT7620.patch
-@@ -0,0 +1,52 @@
-+From patchwork Sat Sep 17 20:28:29 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: 12979250
-+X-Patchwork-Delegate: kvalo@adurom.com
-+Return-Path: <linux-wireless-owner@kernel.org>
-+Date: Sat, 17 Sep 2022 21:28:29 +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 09/16] rt2x00: don't run Rt5592 IQ calibration on MT7620
-+Message-ID: 
-+ <31a1c34ddbd296b82f38c18c9ae7339059215fdc.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
-+
-+The function rt2800_iq_calibrate is intended for Rt5592 only.
-+Don't call it for MT7620 which has it's own calibration functions.
-+
-+Reported-by: Serge Vasilugin <vasilugin@yandex.ru>
-+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
-+---
-+v2: test for RT5592 instead of !RT6352
-+
-+ drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 3 ++-
-+ 1 file changed, 2 insertions(+), 1 deletion(-)
-+
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -4398,7 +4398,8 @@ static void rt2800_config_channel(struct
-+ 		reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain;
-+ 		rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
-+ 
-+-		rt2800_iq_calibrate(rt2x00dev, rf->channel);
-++		if (rt2x00_rt(rt2x00dev, RT5592))
-++			rt2800_iq_calibrate(rt2x00dev, rf->channel);
-+ 	}
-+ 
-+ 	if (rt2x00_rt(rt2x00dev, RT6352)) {
-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 fe0961baa7..bb01ff1dca 100644
+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/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(+)
-+
++++ 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
--@@ -9060,6 +9060,943 @@ restore_value:
-+@@ -9041,6 +9041,907 @@ restore_value:
+-@@ -9086,6 +9086,943 @@ restore_value:
++@@ -9079,6 +9079,943 @@ 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;
- +}
- +
+@@ -944,7 +944,7 @@
   static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
   				       bool set_bw, bool is_ht40)
   {
--@@ -9672,6 +10609,7 @@ static void rt2800_init_rfcsr_6352(struc
-+@@ -9653,6 +10554,7 @@ static void rt2800_init_rfcsr_6352(struc
+-@@ -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);
-@@ -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;
-++};
+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);
   
-  /* 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..07a32b17be
---- /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)
-+ {
-+@@ -6947,26 +6967,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/013-rt2x00-set-correct-TX_SW_CFG1-MAC-register-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/013-rt2x00-set-correct-TX_SW_CFG1-MAC-register-for-MT7620.patch
-new file mode 100644
-index 0000000000..3d7af17b16
---- /dev/null
-+++ b/package/kernel/mac80211/patches/rt2x00/013-rt2x00-set-correct-TX_SW_CFG1-MAC-register-for-MT7620.patch
-@@ -0,0 +1,52 @@
-+From patchwork Sat Sep 17 20:29:26 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: 12979254
-+X-Patchwork-Delegate: kvalo@adurom.com
-+Return-Path: <linux-wireless-owner@kernel.org>
-+Date: Sat, 17 Sep 2022 21:29: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 13/16] rt2x00: set correct TX_SW_CFG1 MAC register for
-+ MT7620
-+Message-ID: 
-+ <4be38975ce600a34249e12d09a3cb758c6e71071.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
-+
-+Set correct TX_SW_CFG1 MAC register as it is done also in v3 of the
-+vendor driver[1].
-+
-+[1]: https://gitlab.com/dm38/padavan-ng/-/blob/master/trunk/proprietary/rt_wifi/rtpci/3.0.X.X/mt76x2/chips/rt6352.c#L531
-+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 | 2 +-
-+ 1 file changed, 1 insertion(+), 1 deletion(-)
-+
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -5966,7 +5966,7 @@ static int rt2800_init_registers(struct
-+ 		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, 0x000C0000);
-++		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
-+ 		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);
-diff --git a/package/kernel/mac80211/patches/rt2x00/014-rt2x00-set-VGC-gain-for-both-chains-of-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/014-rt2x00-set-VGC-gain-for-both-chains-of-MT7620.patch
-new file mode 100644
-index 0000000000..27b8d92cd2
---- /dev/null
-+++ b/package/kernel/mac80211/patches/rt2x00/014-rt2x00-set-VGC-gain-for-both-chains-of-MT7620.patch
-@@ -0,0 +1,50 @@
-+From patchwork Sat Sep 17 20:29: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: 12979255
-+X-Patchwork-Delegate: kvalo@adurom.com
-+Return-Path: <linux-wireless-owner@kernel.org>
-+Date: Sat, 17 Sep 2022 21:29: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 14/16] rt2x00: set VGC gain for both chains of MT7620
-+Message-ID: 
-+ <29e161397e5c9d9399da0fe87d44458aa2b90a78.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
-+
-+Set bbp66 for all chains of the 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 | 3 ++-
-+ 1 file changed, 2 insertions(+), 1 deletion(-)
-+
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -5743,7 +5743,8 @@ static inline void rt2800_set_vgc(struct
-+ 	if (qual->vgc_level != vgc_level) {
-+ 		if (rt2x00_rt(rt2x00dev, RT3572) ||
-+ 		    rt2x00_rt(rt2x00dev, RT3593) ||
-+-		    rt2x00_rt(rt2x00dev, RT3883)) {
-++		    rt2x00_rt(rt2x00dev, RT3883) ||
-++		    rt2x00_rt(rt2x00dev, RT6352)) {
-+ 			rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
-+ 						       vgc_level);
-+ 		} else if (rt2x00_rt(rt2x00dev, RT5592)) {
-diff --git a/package/kernel/mac80211/patches/rt2x00/015-rt2x00-set-SoC-wmac-clock-register.patch b/package/kernel/mac80211/patches/rt2x00/015-rt2x00-set-SoC-wmac-clock-register.patch
-new file mode 100644
-index 0000000000..3cadc91da6
---- /dev/null
-+++ b/package/kernel/mac80211/patches/rt2x00/015-rt2x00-set-SoC-wmac-clock-register.patch
-@@ -0,0 +1,70 @@
-+From patchwork Sat Sep 17 20:29:55 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: 12979256
-+X-Patchwork-Delegate: kvalo@adurom.com
-+Return-Path: <linux-wireless-owner@kernel.org>
-+Date: Sat, 17 Sep 2022 21:29:55 +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 15/16] rt2x00: set SoC wmac clock register
-+Message-ID: 
-+ <3e275d259f476f597dab91a9c395015ef3fe3284.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
-+
-+Instead of using the default value 33 (pci), set US_CYC_CNT init based
-+on Programming guide:
-+If available, set chipset bus clock with fallback to cpu clock/3.
-+
-+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    | 21 +++++++++++++++++++
-+ 1 file changed, 21 insertions(+)
-+
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -6229,6 +6229,27 @@ static int rt2800_init_registers(struct
-+ 		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
-+ 		rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 125);
-+ 		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
-++	} else if (rt2x00_is_soc(rt2x00dev)) {
-++		struct clk *clk = clk_get_sys("bus", NULL);
-++		int rate;
-++
-++		if (IS_ERR(clk)) {
-++			clk = clk_get_sys("cpu", NULL);
-++
-++			if (IS_ERR(clk)) {
-++				rate = 125;
-++			} else {
-++				rate = clk_get_rate(clk) / 3000000;
-++				clk_put(clk);
-++			}
-++		} else {
-++			rate = clk_get_rate(clk) / 1000000;
-++			clk_put(clk);
-++		}
-++
-++		reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
-++		rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, rate);
-++		rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
-+ 	}
-+ 
-+ 	reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG0);
-diff --git a/package/kernel/mac80211/patches/rt2x00/016-rt2x00-correctly-set-BBP-register-86-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/016-rt2x00-correctly-set-BBP-register-86-for-MT7620.patch
-new file mode 100644
-index 0000000000..5ddbbf1dd6
---- /dev/null
-+++ b/package/kernel/mac80211/patches/rt2x00/016-rt2x00-correctly-set-BBP-register-86-for-MT7620.patch
-@@ -0,0 +1,79 @@
-+From patchwork Sat Sep 17 20:30:09 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: 12979257
-+X-Patchwork-Delegate: kvalo@adurom.com
-+Return-Path: <linux-wireless-owner@kernel.org>
-+X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on
-+	aws-us-west-2-korg-lkml-1.web.codeaurora.org
-+Received: from vger.kernel.org (vger.kernel.org [23.128.96.18])
-+	by smtp.lore.kernel.org (Postfix) with ESMTP id E9118ECAAA1
-+	for <linux-wireless@archiver.kernel.org>;
-+ Sat, 17 Sep 2022 20:30:22 +0000 (UTC)
-+Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
-+        id S229639AbiIQUaV (ORCPT
-+        <rfc822;linux-wireless@archiver.kernel.org>);
-+        Sat, 17 Sep 2022 16:30:21 -0400
-+Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53912 "EHLO
-+        lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
-+        with ESMTP id S229628AbiIQUaT (ORCPT
-+        <rfc822;linux-wireless@vger.kernel.org>);
-+        Sat, 17 Sep 2022 16:30:19 -0400
-+Received: from fudo.makrotopia.org (fudo.makrotopia.org
-+ [IPv6:2a07:2ec0:3002::71])
-+        by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1AEA822B27
-+        for <linux-wireless@vger.kernel.org>;
-+ Sat, 17 Sep 2022 13:30:16 -0700 (PDT)
-+Received: from local
-+        by fudo.makrotopia.org with esmtpsa
-+ (TLS1.3:TLS_AES_256_GCM_SHA384:256)
-+         (Exim 4.96)
-+        (envelope-from <daniel@makrotopia.org>)
-+        id 1oZeS7-0003ra-0k;
-+        Sat, 17 Sep 2022 22:30:15 +0200
-+Date: Sat, 17 Sep 2022 21:30:09 +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 16/16] rt2x00: correctly set BBP register 86 for MT7620
-+Message-ID: 
-+ <257267247ee4fa7ebc6a5d0c4948b3f8119c0d77.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
-+
-+Instead of 0 set the correct value for BBP register 86 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 | 5 ++++-
-+ 1 file changed, 4 insertions(+), 1 deletion(-)
-+
-+--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-++++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
-+@@ -4225,7 +4225,10 @@ static void rt2800_config_channel(struct
-+ 		rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
-+ 		rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
-+ 		rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
-+-		rt2800_bbp_write(rt2x00dev, 86, 0);
-++		if (rt2x00_rt(rt2x00dev, RT6352))
-++			rt2800_bbp_write(rt2x00dev, 86, 0x38);
-++		else
-++			rt2800_bbp_write(rt2x00dev, 86, 0);
-+ 	}
-+ 
-+ 	if (rf->channel <= 14) {
-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];
-  };
+@@ -39,7 +39,7 @@
   
-@@ -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;
+  	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);
+  	}
   
-@@ -105,7 +105,7 @@
-  	.drv_init_registers	= rt2800mmio_init_registers,
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
--@@ -694,6 +694,7 @@ enum rt2x00_capability_flags {
-+@@ -703,6 +703,7 @@ enum rt2x00_capability_flags {
-  	REQUIRE_HT_TX_DESC,
-  	REQUIRE_PS_AUTOWAKE,
-  	REQUIRE_DELAYED_RFKILL,
-@@ -113,7 +113,7 @@
+@@ -73,7 +73,7 @@
   
-  	/*
-  	 * Capabilities
--@@ -970,6 +971,11 @@ struct rt2x00_dev {
-+@@ -980,6 +981,11 @@ struct rt2x00_dev {
-  	const struct firmware *fw;
+  	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");
   
-  	/*
-@@ -127,7 +127,7 @@
-  	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
- --- 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
-+@@ -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);
+@@ -121,12 +121,12 @@
+  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
   
-@@ -138,7 +138,7 @@
-  	/*
-  	 * Let the driver probe the device to detect the capabilities.
-  	 */
--@@ -1549,6 +1553,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 @@
+  	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);
   
-  #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;
+@@ -192,7 +192,7 @@
   
---	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;
-  }
+  	/* 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);
   
-- 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
-+++ b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch
-@@ -12,7 +12,7 @@
-  #endif /* _RT2X00_PLATFORM_H */
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
--@@ -1012,6 +1012,22 @@ static int rt2x00lib_probe_hw_modes(stru
-+@@ -1007,6 +1007,22 @@ static int rt2x00lib_probe_hw_modes(stru
-  	unsigned int num_rates;
-  	unsigned int i;
+@@ -254,7 +254,7 @@
   
-@@ -37,7 +37,7 @@
-  		num_rates += 4;
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
--@@ -399,6 +399,7 @@ struct hw_mode_spec {
-+@@ -408,6 +408,7 @@ struct hw_mode_spec {
-  	unsigned int supported_bands;
-  #define SUPPORT_BAND_2GHZ	0x00000001
-  #define SUPPORT_BAND_5GHZ	0x00000002
-diff --git a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
-index b5b2c61037..37553bb80a 100644
---- a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch
-@@ -1,19 +1,18 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
--@@ -990,8 +990,13 @@ static void rt2x00lib_rate(struct ieee80
-+@@ -989,6 +989,12 @@ static void rt2x00lib_rate(struct ieee80
+  	/* 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
   
-  void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
-  {
- +	struct rt2x00_platform_data *pdata;
-- 	const char *mac_addr;
-- 
-++
- +	pdata = rt2x00dev->dev->platform_data;
- +	if (pdata && pdata->mac_address)
- +		ether_addr_copy(eeprom_mac_addr, pdata->mac_address);
- +
-- 	mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
-- 	if (!IS_ERR(mac_addr))
-- 		ether_addr_copy(eeprom_mac_addr, mac_addr);
-+ 	of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
-+ 
-+ 	if (!is_valid_ether_addr(eeprom_mac_addr)) {
- --- a/include/linux/rt2x00_platform.h
- +++ b/include/linux/rt2x00_platform.h
- @@ -14,6 +14,7 @@
-diff --git a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
-index ff8b2c947b..6211809c0a 100644
---- a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
-+++ b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch
-@@ -1,6 +1,6 @@
- --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
- +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
--@@ -1016,6 +1016,16 @@ static int rt2x00lib_probe_hw_modes(stru
-+@@ -1012,6 +1012,16 @@ static int rt2x00lib_probe_hw_modes(stru
-  	struct ieee80211_rate *rates;
-  	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 039c6f6afc..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 @@
+  	rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
   
-  #include "rt2x00.h"
-  #include "rt2800lib.h"
--@@ -9530,6 +9531,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);
+@@ -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);
   
-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..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
-+@@ -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
-deleted file mode 100644
-index fca1fb2cd4..0000000000
---- a/package/kernel/mac80211/patches/rt2x00/612-rt2x00-led-tpt-trigger-support.patch
-+++ /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
-- 	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
-- 
-- #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 31a7baeee7..0000000000
+index b73af6e8c6..0000000000
 --- a/package/kernel/mac80211/patches/rt2x00/992-rt2x00-save-survey-for-every-channel-visited.patch
 +++ /dev/null
 @@ -1,183 +0,0 @@
@@ -5406,7 +4290,7 @@ index 31a7baeee7..0000000000
 - static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
 - 					  unsigned int index)
 - {
--@@ -12199,26 +12213,30 @@ int rt2800_get_survey(struct ieee80211_h
+-@@ -12225,26 +12239,30 @@ int rt2800_get_survey(struct ieee80211_h
 - {
 - 	struct rt2x00_dev *rt2x00dev = hw->priv;
 - 	struct ieee80211_conf *conf = &hw->conf;
@@ -5559,290 +4443,6 @@ index 31a7baeee7..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 3de00b2267..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,12 +121,12 @@
-  	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
-  
-  	rt2800_vco_calibration(rt2x00dev);
--@@ -5887,18 +5898,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)) {
- -		rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
---		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
-+-		rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
- -		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, 0x000C0000);
-++			rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001);
- +			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);
--@@ -7042,14 +7068,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);
--@@ -10388,31 +10416,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);
--@@ -10478,63 +10511,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);
--@@ -10597,12 +10638,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
@@ -7291,7 +5891,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 8d086625e4..2dc6ab3601 100644
+index 27c5048de9..2dc6ab3601 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 @@
@@ -7335,7 +5935,7 @@ index 8d086625e4..2dc6ab3601 100644
    fail_ifa:
   #endif
   	wiphy_unregister(local->hw.wiphy);
--@@ -1365,10 +1365,10 @@ void ieee80211_unregister_hw(struct ieee
+-@@ -1367,10 +1367,10 @@ void ieee80211_unregister_hw(struct ieee
 +@@ -1371,10 +1371,10 @@ void ieee80211_unregister_hw(struct ieee
   	tasklet_kill(&local->tx_pending_tasklet);
   	tasklet_kill(&local->tasklet);
@@ -12742,7 +11342,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..11889d1e89
+index 0000000000..0ca53860a5
 --- /dev/null
 +++ b/package/kernel/mac80211/patches/subsys/330-mac80211-switch-airtime-fairness-back-to-deficit-rou.patch
 @@ -0,0 +1,1249 @@
@@ -13310,7 +11910,7 @@ index 0000000000..11889d1e89
 + void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
 +--- a/net/mac80211/iface.c
 ++++ b/net/mac80211/iface.c
-+@@ -2190,9 +2190,6 @@ int ieee80211_if_add(struct ieee80211_lo
++@@ -2192,9 +2192,6 @@ int ieee80211_if_add(struct ieee80211_lo
 + 		}
 + 	}
 + 
@@ -16945,104 +15545,6 @@ 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
@@ -17116,59 +15618,6 @@ 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
@@ -17402,122 +15851,6 @@ index 1df5dec039..0000000000
 - }
 - 
 - /*
-diff --git a/package/kernel/mac80211/patches/subsys/346-mac80211-mesh-clean-up-rx_bcn_presp-API.patch b/package/kernel/mac80211/patches/subsys/346-mac80211-mesh-clean-up-rx_bcn_presp-API.patch
-new file mode 100644
-index 0000000000..3fa70b05fd
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/346-mac80211-mesh-clean-up-rx_bcn_presp-API.patch
-@@ -0,0 +1,110 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Mon, 20 Sep 2021 15:40:07 +0200
-+Subject: [PATCH] mac80211: mesh: clean up rx_bcn_presp API
-+
-+commit a5b983c6073140b624f64e79fea6d33c3e4315a0 upstream.
-+
-+We currently pass the entire elements to the rx_bcn_presp()
-+method, but only need mesh_config. Additionally, we use the
-+length of the elements to calculate back the entire frame's
-+length, but that's confusing - just pass the length of the
-+frame instead.
-+
-+Link: https://lore.kernel.org/r/20210920154009.a18ed3d2da6c.I1824b773a0fbae4453e1433c184678ca14e8df45@changeid
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/ieee80211_i.h
-++++ b/net/mac80211/ieee80211_i.h
-+@@ -645,10 +645,9 @@ struct ieee80211_if_ocb {
-+  */
-+ struct ieee802_11_elems;
-+ struct ieee80211_mesh_sync_ops {
-+-	void (*rx_bcn_presp)(struct ieee80211_sub_if_data *sdata,
-+-			     u16 stype,
-+-			     struct ieee80211_mgmt *mgmt,
-+-			     struct ieee802_11_elems *elems,
-++	void (*rx_bcn_presp)(struct ieee80211_sub_if_data *sdata, u16 stype,
-++			     struct ieee80211_mgmt *mgmt, unsigned int len,
-++			     const struct ieee80211_meshconf_ie *mesh_cfg,
-+ 			     struct ieee80211_rx_status *rx_status);
-+ 
-+ 	/* should be called with beacon_data under RCU read lock */
-+--- a/net/mac80211/mesh.c
-++++ b/net/mac80211/mesh.c
-+@@ -1354,8 +1354,8 @@ static void ieee80211_mesh_rx_bcn_presp(
-+ 	}
-+ 
-+ 	if (ifmsh->sync_ops)
-+-		ifmsh->sync_ops->rx_bcn_presp(sdata,
-+-			stype, mgmt, &elems, rx_status);
-++		ifmsh->sync_ops->rx_bcn_presp(sdata, stype, mgmt, len,
-++					      elems.mesh_config, rx_status);
-+ }
-+ 
-+ int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata)
-+--- a/net/mac80211/mesh_sync.c
-++++ b/net/mac80211/mesh_sync.c
-+@@ -3,6 +3,7 @@
-+  * Copyright 2011-2012, Pavel Zubarev <pavel.zubarev@gmail.com>
-+  * Copyright 2011-2012, Marco Porsch <marco.porsch@s2005.tu-chemnitz.de>
-+  * Copyright 2011-2012, cozybit Inc.
-++ * Copyright (C) 2021 Intel Corporation
-+  */
-+ 
-+ #include "ieee80211_i.h"
-+@@ -35,12 +36,12 @@ struct sync_method {
-+ /**
-+  * mesh_peer_tbtt_adjusting - check if an mp is currently adjusting its TBTT
-+  *
-+- * @ie: information elements of a management frame from the mesh peer
-++ * @cfg: mesh config element from the mesh peer (or %NULL)
-+  */
-+-static bool mesh_peer_tbtt_adjusting(struct ieee802_11_elems *ie)
-++static bool mesh_peer_tbtt_adjusting(const struct ieee80211_meshconf_ie *cfg)
-+ {
-+-	return (ie->mesh_config->meshconf_cap &
-+-			IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING) != 0;
-++	return cfg &&
-++	       (cfg->meshconf_cap & IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING);
-+ }
-+ 
-+ void mesh_sync_adjust_tsf(struct ieee80211_sub_if_data *sdata)
-+@@ -76,11 +77,11 @@ void mesh_sync_adjust_tsf(struct ieee802
-+ 	}
-+ }
-+ 
-+-static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
-+-				   u16 stype,
-+-				   struct ieee80211_mgmt *mgmt,
-+-				   struct ieee802_11_elems *elems,
-+-				   struct ieee80211_rx_status *rx_status)
-++static void
-++mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, u16 stype,
-++			      struct ieee80211_mgmt *mgmt, unsigned int len,
-++			      const struct ieee80211_meshconf_ie *mesh_cfg,
-++			      struct ieee80211_rx_status *rx_status)
-+ {
-+ 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+ 	struct ieee80211_local *local = sdata->local;
-+@@ -101,10 +102,7 @@ static void mesh_sync_offset_rx_bcn_pres
-+ 	 */
-+ 	if (ieee80211_have_rx_timestamp(rx_status))
-+ 		t_r = ieee80211_calculate_rx_timestamp(local, rx_status,
-+-						       24 + 12 +
-+-						       elems->total_len +
-+-						       FCS_LEN,
-+-						       24);
-++						       len + FCS_LEN, 24);
-+ 	else
-+ 		t_r = drv_get_tsf(local, sdata);
-+ 
-+@@ -119,7 +117,7 @@ static void mesh_sync_offset_rx_bcn_pres
-+ 	 * dot11MeshNbrOffsetMaxNeighbor non-peer non-MBSS neighbors
-+ 	 */
-+ 
-+-	if (elems->mesh_config && mesh_peer_tbtt_adjusting(elems)) {
-++	if (mesh_peer_tbtt_adjusting(mesh_cfg)) {
-+ 		msync_dbg(sdata, "STA %pM : is adjusting TBTT\n",
-+ 			  sta->sta.addr);
-+ 		goto no_sync;
 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
@@ -17884,1549 +16217,226 @@ index 6aa6f0ed93..0000000000
 --	j = mi->max_tp_rate[0] % MCS_GROUP_RATES;
 -+	i = MI_RATE_GROUP(mi->max_tp_rate[0]);
 -+	j = MI_RATE_IDX(mi->max_tp_rate[0]);
-- 	prob = mi->groups[i].rates[j].prob_avg;
-- 
-- 	/* convert tp_avg from pkt per second in kbps */
----- a/net/mac80211/rc80211_minstrel_ht.h
--+++ b/net/mac80211/rc80211_minstrel_ht.h
--@@ -6,6 +6,8 @@
-- #ifndef __RC_MINSTREL_HT_H
-- #define __RC_MINSTREL_HT_H
-- 
--+#include <linux/bitfield.h>
--+
-- /* number of highest throughput rates to consider*/
-- #define MAX_THR_RATES 4
-- #define SAMPLE_COLUMNS	10	/* number of columns in sample table */
--@@ -57,6 +59,17 @@
-- 
-- #define MCS_GROUP_RATES		10
-- 
--+#define MI_RATE_IDX_MASK	GENMASK(3, 0)
--+#define MI_RATE_GROUP_MASK	GENMASK(15, 4)
--+
--+#define MI_RATE(_group, _idx)				\
--+	(FIELD_PREP(MI_RATE_GROUP_MASK, _group) |	\
--+	 FIELD_PREP(MI_RATE_IDX_MASK, _idx))
--+
--+#define MI_RATE_IDX(_rate) FIELD_GET(MI_RATE_IDX_MASK, _rate)
--+#define MI_RATE_GROUP(_rate) FIELD_GET(MI_RATE_GROUP_MASK, _rate)
--+
--+
-- struct minstrel_priv {
-- 	struct ieee80211_hw *hw;
-- 	bool has_mrr;
----- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
--+++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
--@@ -56,7 +56,7 @@ minstrel_ht_stats_dump(struct minstrel_h
-- 
-- 	for (j = 0; j < MCS_GROUP_RATES; j++) {
-- 		struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
---		int idx = i * MCS_GROUP_RATES + j;
--+		int idx = MI_RATE(i, j);
-- 		unsigned int duration;
-- 
-- 		if (!(mi->supported[i] & BIT(j)))
--@@ -201,7 +201,7 @@ minstrel_ht_stats_csv_dump(struct minstr
-- 
-- 	for (j = 0; j < MCS_GROUP_RATES; j++) {
-- 		struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
---		int idx = i * MCS_GROUP_RATES + j;
--+		int idx = MI_RATE(i, j);
-- 		unsigned int duration;
-- 
-- 		if (!(mi->supported[i] & BIT(j)))
-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
---- a/package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch
-+++ /dev/null
-@@ -1,54 +0,0 @@
--From: Felix Fietkau <nbd@nbd.name>
--Date: Fri, 22 Jan 2021 18:21:13 +0100
--Subject: [PATCH] mac80211: minstrel_ht: update total packets counter in tx
-- status path
--
--Keep the update in one place and prepare for further rework
--
--Signed-off-by: Felix Fietkau <nbd@nbd.name>
-----
--
----- a/net/mac80211/rc80211_minstrel_ht.c
--+++ b/net/mac80211/rc80211_minstrel_ht.c
--@@ -1092,6 +1092,16 @@ minstrel_ht_tx_status(void *priv, struct
-- 		info->status.ampdu_len = 1;
-- 	}
-- 
--+	/* wraparound */
--+	if (mi->total_packets >= ~0 - info->status.ampdu_len) {
--+		mi->total_packets = 0;
--+		mi->sample_packets = 0;
--+	}
--+
--+	mi->total_packets += info->status.ampdu_len;
--+	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
--+		mi->sample_packets += info->status.ampdu_len;
--+
-- 	mi->ampdu_packets++;
-- 	mi->ampdu_len += info->status.ampdu_len;
-- 
--@@ -1103,9 +1113,6 @@ minstrel_ht_tx_status(void *priv, struct
-- 		mi->sample_count--;
-- 	}
-- 
---	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
---		mi->sample_packets += info->status.ampdu_len;
---
-- 	if (mi->sample_mode != MINSTREL_SAMPLE_IDLE)
-- 		rate_sample = minstrel_get_ratestats(mi, mi->sample_rate);
-- 
--@@ -1503,14 +1510,6 @@ minstrel_ht_get_rate(void *priv, struct
-- 	else
-- 		sample_idx = minstrel_get_sample_rate(mp, mi);
-- 
---	mi->total_packets++;
---
---	/* wraparound */
---	if (mi->total_packets == ~0) {
---		mi->total_packets = 0;
---		mi->sample_packets = 0;
---	}
---
-- 	if (sample_idx < 0)
-- 		return;
-- 
-diff --git a/package/kernel/mac80211/patches/subsys/347-mac80211-move-CRC-into-struct-ieee802_11_elems.patch b/package/kernel/mac80211/patches/subsys/347-mac80211-move-CRC-into-struct-ieee802_11_elems.patch
-new file mode 100644
-index 0000000000..e44aac5cba
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/347-mac80211-move-CRC-into-struct-ieee802_11_elems.patch
-@@ -0,0 +1,82 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Mon, 20 Sep 2021 15:40:08 +0200
-+Subject: [PATCH] mac80211: move CRC into struct ieee802_11_elems
-+
-+commit c6e37ed498f958254b5459253199e816b6bfc52f upstream.
-+
-+We're currently returning this value, but to prepare for
-+returning the allocated structure, move it into there.
-+
-+Link: https://lore.kernel.org/r/20210920154009.479b8ebf999d.If0d4ba75ee38998dc3eeae25058aa748efcb2fc9@changeid
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/ieee80211_i.h
-++++ b/net/mac80211/ieee80211_i.h
-+@@ -1530,6 +1530,7 @@ struct ieee80211_csa_ie {
-+ struct ieee802_11_elems {
-+ 	const u8 *ie_start;
-+ 	size_t total_len;
-++	u32 crc;
-+ 
-+ 	/* pointers to IEs */
-+ 	const struct ieee80211_tdls_lnkie *lnk_id;
-+@@ -2089,10 +2090,10 @@ static inline void ieee80211_tx_skb(stru
-+ 	ieee80211_tx_skb_tid(sdata, skb, 7);
-+ }
-+ 
-+-u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-+-			       struct ieee802_11_elems *elems,
-+-			       u64 filter, u32 crc, u8 *transmitter_bssid,
-+-			       u8 *bss_bssid);
-++void ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-++				struct ieee802_11_elems *elems,
-++				u64 filter, u32 crc, u8 *transmitter_bssid,
-++				u8 *bss_bssid);
-+ static inline void ieee802_11_parse_elems(const u8 *start, size_t len,
-+ 					  bool action,
-+ 					  struct ieee802_11_elems *elems,
-+--- a/net/mac80211/mlme.c
-++++ b/net/mac80211/mlme.c
-+@@ -4102,10 +4102,11 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 	 */
-+ 	if (!ieee80211_is_s1g_beacon(hdr->frame_control))
-+ 		ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4);
-+-	ncrc = ieee802_11_parse_elems_crc(variable,
-+-					  len - baselen, false, &elems,
-+-					  care_about_ies, ncrc,
-+-					  mgmt->bssid, bssid);
-++	ieee802_11_parse_elems_crc(variable,
-++				   len - baselen, false, &elems,
-++				   care_about_ies, ncrc,
-++				   mgmt->bssid, bssid);
-++	ncrc = elems.crc;
-+ 
-+ 	if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
-+ 	    ieee80211_check_tim(elems.tim, elems.tim_len, bss_conf->aid)) {
-+--- a/net/mac80211/util.c
-++++ b/net/mac80211/util.c
-+@@ -1469,10 +1469,10 @@ static size_t ieee802_11_find_bssid_prof
-+ 	return found ? profile_len : 0;
-+ }
-+ 
-+-u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-+-			       struct ieee802_11_elems *elems,
-+-			       u64 filter, u32 crc, u8 *transmitter_bssid,
-+-			       u8 *bss_bssid)
-++void ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-++				struct ieee802_11_elems *elems,
-++				u64 filter, u32 crc, u8 *transmitter_bssid,
-++				u8 *bss_bssid)
-+ {
-+ 	const struct element *non_inherit = NULL;
-+ 	u8 *nontransmitted_profile;
-+@@ -1524,7 +1524,7 @@ u32 ieee802_11_parse_elems_crc(const u8
-+ 
-+ 	kfree(nontransmitted_profile);
-+ 
-+-	return crc;
-++	elems->crc = crc;
-+ }
-+ 
-+ void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
-diff --git a/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch b/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
-deleted file mode 100644
-index dc6f11e4b9..0000000000
---- a/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
-+++ /dev/null
-@@ -1,102 +0,0 @@
--From: Felix Fietkau <nbd@nbd.name>
--Date: Fri, 22 Jan 2021 19:24:59 +0100
--Subject: [PATCH] mac80211: minstrel_ht: reduce the need to sample slower
-- rates
--
--In order to more gracefully be able to fall back to lower rates without too
--much throughput fluctuations, initialize all untested rates below tested ones
--to the maximum probabilty of higher rates.
--Usually this leads to untested lower rates getting initialized with a
--probability value of 100%, making them better candidates for fallback without
--having to rely on random probing
--
--Signed-off-by: Felix Fietkau <nbd@nbd.name>
-----
--
----- a/net/mac80211/rc80211_minstrel_ht.c
--+++ b/net/mac80211/rc80211_minstrel_ht.c
--@@ -791,14 +791,11 @@ minstrel_ht_calc_rate_stats(struct minst
-- 	unsigned int cur_prob;
-- 
-- 	if (unlikely(mrs->attempts > 0)) {
---		mrs->sample_skipped = 0;
-- 		cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
-- 		minstrel_filter_avg_add(&mrs->prob_avg,
-- 					&mrs->prob_avg_1, cur_prob);
-- 		mrs->att_hist += mrs->attempts;
-- 		mrs->succ_hist += mrs->success;
---	} else {
---		mrs->sample_skipped++;
-- 	}
-- 
-- 	mrs->last_success = mrs->success;
--@@ -851,7 +848,6 @@ minstrel_ht_update_stats(struct minstrel
-- 		mi->ampdu_packets = 0;
-- 	}
-- 
---	mi->sample_slow = 0;
-- 	mi->sample_count = 0;
-- 
-- 	if (mi->supported[MINSTREL_CCK_GROUP])
--@@ -882,6 +878,7 @@ minstrel_ht_update_stats(struct minstrel
-- 	/* Find best rate sets within all MCS groups*/
-- 	for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
-- 		u16 *tp_rate = tmp_mcs_tp_rate;
--+		u16 last_prob = 0;
-- 
-- 		mg = &mi->groups[group];
-- 		if (!mi->supported[group])
--@@ -896,7 +893,7 @@ minstrel_ht_update_stats(struct minstrel
-- 		if (group == MINSTREL_CCK_GROUP && ht_supported)
-- 			tp_rate = tmp_legacy_tp_rate;
-- 
---		for (i = 0; i < MCS_GROUP_RATES; i++) {
--+		for (i = MCS_GROUP_RATES - 1; i >= 0; i--) {
-- 			if (!(mi->supported[group] & BIT(i)))
-- 				continue;
-- 
--@@ -905,6 +902,11 @@ minstrel_ht_update_stats(struct minstrel
-- 			mrs = &mg->rates[i];
-- 			mrs->retry_updated = false;
-- 			minstrel_ht_calc_rate_stats(mp, mrs);
--+
--+			if (mrs->att_hist)
--+				last_prob = max(last_prob, mrs->prob_avg);
--+			else
--+				mrs->prob_avg = max(last_prob, mrs->prob_avg);
-- 			cur_prob = mrs->prob_avg;
-- 
-- 			if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0)
--@@ -1469,13 +1471,9 @@ minstrel_get_sample_rate(struct minstrel
-- 	if (sample_dur >= minstrel_get_duration(tp_rate2) &&
-- 	    (cur_max_tp_streams - 1 <
-- 	     minstrel_mcs_groups[sample_group].streams ||
---	     sample_dur >= minstrel_get_duration(mi->max_prob_rate))) {
---		if (mrs->sample_skipped < 20)
--+	     sample_dur >= minstrel_get_duration(mi->max_prob_rate)))
-- 			return -1;
-- 
---		if (mi->sample_slow++ > 2)
---			return -1;
---	}
-- 	mi->sample_tries--;
-- 
-- 	return sample_idx;
----- a/net/mac80211/rc80211_minstrel_ht.h
--+++ b/net/mac80211/rc80211_minstrel_ht.h
--@@ -123,7 +123,6 @@ struct minstrel_rate_stats {
-- 	u8 retry_count;
-- 	u8 retry_count_rtscts;
-- 
---	u8 sample_skipped;
-- 	bool retry_updated;
-- };
-- 
--@@ -179,7 +178,6 @@ struct minstrel_ht_sta {
-- 	u8 sample_wait;
-- 	u8 sample_tries;
-- 	u8 sample_count;
---	u8 sample_slow;
-- 
-- 	enum minstrel_sample_mode sample_mode;
-- 	u16 sample_rate;
-diff --git a/package/kernel/mac80211/patches/subsys/348-mac80211-mlme-find-auth-challenge-directly.patch b/package/kernel/mac80211/patches/subsys/348-mac80211-mlme-find-auth-challenge-directly.patch
-new file mode 100644
-index 0000000000..3432c25a91
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/348-mac80211-mlme-find-auth-challenge-directly.patch
-@@ -0,0 +1,80 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Mon, 20 Sep 2021 15:40:09 +0200
-+Subject: [PATCH] mac80211: mlme: find auth challenge directly
-+
-+commit 49a765d6785e99157ff5091cc37485732496864e upstream.
-+
-+There's no need to parse all elements etc. just to find the
-+authentication challenge - use cfg80211_find_elem() instead.
-+This also allows us to remove WLAN_EID_CHALLENGE handling
-+from the element parsing entirely.
-+
-+Link: https://lore.kernel.org/r/20210920154009.45f9b3a15722.Ice3159ffad03a007d6154cbf1fb3a8c48489e86f@changeid
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/ieee80211_i.h
-++++ b/net/mac80211/ieee80211_i.h
-+@@ -1540,7 +1540,6 @@ struct ieee802_11_elems {
-+ 	const u8 *supp_rates;
-+ 	const u8 *ds_params;
-+ 	const struct ieee80211_tim_ie *tim;
-+-	const u8 *challenge;
-+ 	const u8 *rsn;
-+ 	const u8 *rsnx;
-+ 	const u8 *erp_info;
-+@@ -1594,7 +1593,6 @@ struct ieee802_11_elems {
-+ 	u8 ssid_len;
-+ 	u8 supp_rates_len;
-+ 	u8 tim_len;
-+-	u8 challenge_len;
-+ 	u8 rsn_len;
-+ 	u8 rsnx_len;
-+ 	u8 ext_supp_rates_len;
-+--- a/net/mac80211/mlme.c
-++++ b/net/mac80211/mlme.c
-+@@ -2889,17 +2889,17 @@ static void ieee80211_auth_challenge(str
-+ {
-+ 	struct ieee80211_local *local = sdata->local;
-+ 	struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
-++	const struct element *challenge;
-+ 	u8 *pos;
-+-	struct ieee802_11_elems elems;
-+ 	u32 tx_flags = 0;
-+ 	struct ieee80211_prep_tx_info info = {
-+ 		.subtype = IEEE80211_STYPE_AUTH,
-+ 	};
-+ 
-+ 	pos = mgmt->u.auth.variable;
-+-	ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems,
-+-			       mgmt->bssid, auth_data->bss->bssid);
-+-	if (!elems.challenge)
-++	challenge = cfg80211_find_elem(WLAN_EID_CHALLENGE, pos,
-++				       len - (pos - (u8 *)mgmt));
-++	if (!challenge)
-+ 		return;
-+ 	auth_data->expected_transaction = 4;
-+ 	drv_mgd_prepare_tx(sdata->local, sdata, &info);
-+@@ -2907,7 +2907,8 @@ static void ieee80211_auth_challenge(str
-+ 		tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
-+ 			   IEEE80211_TX_INTFL_MLME_CONN_TX;
-+ 	ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
-+-			    elems.challenge - 2, elems.challenge_len + 2,
-++			    (void *)challenge,
-++			    challenge->datalen + sizeof(*challenge),
-+ 			    auth_data->bss->bssid, auth_data->bss->bssid,
-+ 			    auth_data->key, auth_data->key_len,
-+ 			    auth_data->key_idx, tx_flags);
-+--- a/net/mac80211/util.c
-++++ b/net/mac80211/util.c
-+@@ -1120,10 +1120,6 @@ _ieee802_11_parse_elems_crc(const u8 *st
-+ 			} else
-+ 				elem_parse_failed = true;
-+ 			break;
-+-		case WLAN_EID_CHALLENGE:
-+-			elems->challenge = pos;
-+-			elems->challenge_len = elen;
-+-			break;
-+ 		case WLAN_EID_VENDOR_SPECIFIC:
-+ 			if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
-+ 			    pos[2] == 0xf2) {
-diff --git a/package/kernel/mac80211/patches/subsys/349-mac80211-always-allocate-struct-ieee802_11_elems.patch b/package/kernel/mac80211/patches/subsys/349-mac80211-always-allocate-struct-ieee802_11_elems.patch
-new file mode 100644
-index 0000000000..75655279a9
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/349-mac80211-always-allocate-struct-ieee802_11_elems.patch
-@@ -0,0 +1,1143 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Mon, 20 Sep 2021 15:40:10 +0200
-+Subject: [PATCH] mac80211: always allocate struct ieee802_11_elems
-+
-+As the 802.11 spec evolves, we need to parse more and more
-+elements. This is causing the struct to grow, and we can no
-+longer get away with putting it on the stack.
-+
-+Change the API to always dynamically allocate and return an
-+allocated pointer that must be kfree()d later.
-+
-+As an alternative, I contemplated a scheme whereby we'd say
-+in the code which elements we needed, e.g.
-+
-+    DECLARE_ELEMENT_PARSER(elems,
-+                           SUPPORTED_CHANNELS,
-+                           CHANNEL_SWITCH,
-+                           EXT(KEY_DELIVERY));
-+
-+    ieee802_11_parse_elems(..., &elems, ...);
-+
-+and while I think this is possible and will save us a lot
-+since most individual places only care about a small subset
-+of the elements, it ended up being a bit more work since a
-+lot of places do the parsing and then pass the struct to
-+other functions, sometimes with multiple levels.
-+
-+Link: https://lore.kernel.org/r/20210920154009.26caff6b5998.I05ae58768e990e611aee8eca8abefd9d7bc15e05@changeid
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/agg-rx.c
-++++ b/net/mac80211/agg-rx.c
-+@@ -478,7 +478,7 @@ void ieee80211_process_addba_request(str
-+ 				     size_t len)
-+ {
-+ 	u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num;
-+-	struct ieee802_11_elems elems = { };
-++	struct ieee802_11_elems *elems = NULL;
-+ 	u8 dialog_token;
-+ 	int ies_len;
-+ 
-+@@ -496,16 +496,17 @@ void ieee80211_process_addba_request(str
-+ 	ies_len = len - offsetof(struct ieee80211_mgmt,
-+ 				 u.action.u.addba_req.variable);
-+ 	if (ies_len) {
-+-		ieee802_11_parse_elems(mgmt->u.action.u.addba_req.variable,
-+-                                ies_len, true, &elems, mgmt->bssid, NULL);
-+-		if (elems.parse_error)
-++		elems = ieee802_11_parse_elems(mgmt->u.action.u.addba_req.variable,
-++					       ies_len, true, mgmt->bssid, NULL);
-++		if (!elems || elems->parse_error)
-+ 			return;
-+ 	}
-+ 
-+ 	__ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
-+ 					start_seq_num, ba_policy, tid,
-+ 					buf_size, true, false,
-+-					elems.addba_ext_ie);
-++					elems ? elems->addba_ext_ie : NULL);
-++	kfree(elems);
-+ }
-+ 
-+ void ieee80211_manage_rx_ba_offl(struct ieee80211_vif *vif,
-+--- a/net/mac80211/ibss.c
-++++ b/net/mac80211/ibss.c
-+@@ -9,7 +9,7 @@
-+  * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
-+  * Copyright 2013-2014  Intel Mobile Communications GmbH
-+  * Copyright(c) 2016 Intel Deutschland GmbH
-+- * Copyright(c) 2018-2020 Intel Corporation
-++ * Copyright(c) 2018-2021 Intel Corporation
-+  */
-+ 
-+ #include <linux/delay.h>
-+@@ -1589,7 +1589,7 @@ void ieee80211_rx_mgmt_probe_beacon(stru
-+ 				    struct ieee80211_rx_status *rx_status)
-+ {
-+ 	size_t baselen;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 
-+ 	BUILD_BUG_ON(offsetof(typeof(mgmt->u.probe_resp), variable) !=
-+ 		     offsetof(typeof(mgmt->u.beacon), variable));
-+@@ -1602,10 +1602,14 @@ void ieee80211_rx_mgmt_probe_beacon(stru
-+ 	if (baselen > len)
-+ 		return;
-+ 
-+-	ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
-+-			       false, &elems, mgmt->bssid, NULL);
-+-
-+-	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
-++	elems = ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
-++				       len - baselen, false,
-++				       mgmt->bssid, NULL);
-++
-++	if (elems) {
-++		ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, elems);
-++		kfree(elems);
-++	}
-+ }
-+ 
-+ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
-+@@ -1614,7 +1618,7 @@ void ieee80211_ibss_rx_queued_mgmt(struc
-+ 	struct ieee80211_rx_status *rx_status;
-+ 	struct ieee80211_mgmt *mgmt;
-+ 	u16 fc;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	int ies_len;
-+ 
-+ 	rx_status = IEEE80211_SKB_RXCB(skb);
-+@@ -1651,15 +1655,16 @@ void ieee80211_ibss_rx_queued_mgmt(struc
-+ 			if (ies_len < 0)
-+ 				break;
-+ 
-+-			ieee802_11_parse_elems(
-++			elems = ieee802_11_parse_elems(
-+ 				mgmt->u.action.u.chan_switch.variable,
-+-				ies_len, true, &elems, mgmt->bssid, NULL);
-++				ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (elems.parse_error)
-++			if (!elems || elems->parse_error)
-+ 				break;
-+ 
-+ 			ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt, skb->len,
-+-							rx_status, &elems);
-++							rx_status, elems);
-++			kfree(elems);
-+ 			break;
-+ 		}
-+ 	}
-+--- a/net/mac80211/ieee80211_i.h
-++++ b/net/mac80211/ieee80211_i.h
-+@@ -2088,18 +2088,18 @@ static inline void ieee80211_tx_skb(stru
-+ 	ieee80211_tx_skb_tid(sdata, skb, 7);
-+ }
-+ 
-+-void ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-+-				struct ieee802_11_elems *elems,
-+-				u64 filter, u32 crc, u8 *transmitter_bssid,
-+-				u8 *bss_bssid);
-+-static inline void ieee802_11_parse_elems(const u8 *start, size_t len,
-+-					  bool action,
-+-					  struct ieee802_11_elems *elems,
-+-					  u8 *transmitter_bssid,
-+-					  u8 *bss_bssid)
-++struct ieee802_11_elems *ieee802_11_parse_elems_crc(const u8 *start, size_t len,
-++						    bool action,
-++						    u64 filter, u32 crc,
-++						    const u8 *transmitter_bssid,
-++						    const u8 *bss_bssid);
-++static inline struct ieee802_11_elems *
-++ieee802_11_parse_elems(const u8 *start, size_t len, bool action,
-++		       const u8 *transmitter_bssid,
-++		       const u8 *bss_bssid)
-+ {
-+-	ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0,
-+-				   transmitter_bssid, bss_bssid);
-++	return ieee802_11_parse_elems_crc(start, len, action, 0, 0,
-++					  transmitter_bssid, bss_bssid);
-+ }
-+ 
-+ 
-+--- a/net/mac80211/mesh.c
-++++ b/net/mac80211/mesh.c
-+@@ -1247,7 +1247,7 @@ ieee80211_mesh_rx_probe_req(struct ieee8
-+ 	struct sk_buff *presp;
-+ 	struct beacon_data *bcn;
-+ 	struct ieee80211_mgmt *hdr;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	size_t baselen;
-+ 	u8 *pos;
-+ 
-+@@ -1256,22 +1256,24 @@ ieee80211_mesh_rx_probe_req(struct ieee8
-+ 	if (baselen > len)
-+ 		return;
-+ 
-+-	ieee802_11_parse_elems(pos, len - baselen, false, &elems, mgmt->bssid,
-+-			       NULL);
-+-
-+-	if (!elems.mesh_id)
-++	elems = ieee802_11_parse_elems(pos, len - baselen, false, mgmt->bssid,
-++				       NULL);
-++	if (!elems)
-+ 		return;
-+ 
-++	if (!elems->mesh_id)
-++		goto free;
-++
-+ 	/* 802.11-2012 10.1.4.3.2 */
-+ 	if ((!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
-+ 	     !is_broadcast_ether_addr(mgmt->da)) ||
-+-	    elems.ssid_len != 0)
-+-		return;
-++	    elems->ssid_len != 0)
-++		goto free;
-+ 
-+-	if (elems.mesh_id_len != 0 &&
-+-	    (elems.mesh_id_len != ifmsh->mesh_id_len ||
-+-	     memcmp(elems.mesh_id, ifmsh->mesh_id, ifmsh->mesh_id_len)))
-+-		return;
-++	if (elems->mesh_id_len != 0 &&
-++	    (elems->mesh_id_len != ifmsh->mesh_id_len ||
-++	     memcmp(elems->mesh_id, ifmsh->mesh_id, ifmsh->mesh_id_len)))
-++		goto free;
-+ 
-+ 	rcu_read_lock();
-+ 	bcn = rcu_dereference(ifmsh->beacon);
-+@@ -1295,6 +1297,8 @@ ieee80211_mesh_rx_probe_req(struct ieee8
-+ 	ieee80211_tx_skb(sdata, presp);
-+ out:
-+ 	rcu_read_unlock();
-++free:
-++	kfree(elems);
-+ }
-+ 
-+ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
-+@@ -1305,7 +1309,7 @@ static void ieee80211_mesh_rx_bcn_presp(
-+ {
-+ 	struct ieee80211_local *local = sdata->local;
-+ 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	struct ieee80211_channel *channel;
-+ 	size_t baselen;
-+ 	int freq;
-+@@ -1320,42 +1324,47 @@ static void ieee80211_mesh_rx_bcn_presp(
-+ 	if (baselen > len)
-+ 		return;
-+ 
-+-	ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
-+-			       false, &elems, mgmt->bssid, NULL);
-++	elems = ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
-++				       len - baselen,
-++				       false, mgmt->bssid, NULL);
-++	if (!elems)
-++		return;
-+ 
-+ 	/* ignore non-mesh or secure / unsecure mismatch */
-+-	if ((!elems.mesh_id || !elems.mesh_config) ||
-+-	    (elems.rsn && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) ||
-+-	    (!elems.rsn && sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE))
-+-		return;
-++	if ((!elems->mesh_id || !elems->mesh_config) ||
-++	    (elems->rsn && sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) ||
-++	    (!elems->rsn && sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE))
-++		goto free;
-+ 
-+-	if (elems.ds_params)
-+-		freq = ieee80211_channel_to_frequency(elems.ds_params[0], band);
-++	if (elems->ds_params)
-++		freq = ieee80211_channel_to_frequency(elems->ds_params[0], band);
-+ 	else
-+ 		freq = rx_status->freq;
-+ 
-+ 	channel = ieee80211_get_channel(local->hw.wiphy, freq);
-+ 
-+ 	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
-+-		return;
-++		goto free;
-+ 
-+-	if (mesh_matches_local(sdata, &elems)) {
-++	if (mesh_matches_local(sdata, elems)) {
-+ 		mpl_dbg(sdata, "rssi_threshold=%d,rx_status->signal=%d\n",
-+ 			sdata->u.mesh.mshcfg.rssi_threshold, rx_status->signal);
-+ 		if (!sdata->u.mesh.user_mpm ||
-+ 		    sdata->u.mesh.mshcfg.rssi_threshold == 0 ||
-+ 		    sdata->u.mesh.mshcfg.rssi_threshold < rx_status->signal)
-+-			mesh_neighbour_update(sdata, mgmt->sa, &elems,
-++			mesh_neighbour_update(sdata, mgmt->sa, elems,
-+ 					      rx_status);
-+ 
-+ 		if (ifmsh->csa_role != IEEE80211_MESH_CSA_ROLE_INIT &&
-+ 		    !sdata->vif.csa_active)
-+-			ieee80211_mesh_process_chnswitch(sdata, &elems, true);
-++			ieee80211_mesh_process_chnswitch(sdata, elems, true);
-+ 	}
-+ 
-+ 	if (ifmsh->sync_ops)
-+ 		ifmsh->sync_ops->rx_bcn_presp(sdata, stype, mgmt, len,
-+-					      elems.mesh_config, rx_status);
-++					      elems->mesh_config, rx_status);
-++free:
-++	kfree(elems);
-+ }
-+ 
-+ int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata)
-+@@ -1447,7 +1456,7 @@ static void mesh_rx_csa_frame(struct iee
-+ 			      struct ieee80211_mgmt *mgmt, size_t len)
-+ {
-+ 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	u16 pre_value;
-+ 	bool fwd_csa = true;
-+ 	size_t baselen;
-+@@ -1460,33 +1469,37 @@ static void mesh_rx_csa_frame(struct iee
-+ 	pos = mgmt->u.action.u.chan_switch.variable;
-+ 	baselen = offsetof(struct ieee80211_mgmt,
-+ 			   u.action.u.chan_switch.variable);
-+-	ieee802_11_parse_elems(pos, len - baselen, true, &elems,
-+-			       mgmt->bssid, NULL);
-+-
-+-	if (!mesh_matches_local(sdata, &elems))
-++	elems = ieee802_11_parse_elems(pos, len - baselen, true,
-++				       mgmt->bssid, NULL);
-++	if (!elems)
-+ 		return;
-+ 
-+-	ifmsh->chsw_ttl = elems.mesh_chansw_params_ie->mesh_ttl;
-++	if (!mesh_matches_local(sdata, elems))
-++		goto free;
-++
-++	ifmsh->chsw_ttl = elems->mesh_chansw_params_ie->mesh_ttl;
-+ 	if (!--ifmsh->chsw_ttl)
-+ 		fwd_csa = false;
-+ 
-+-	pre_value = le16_to_cpu(elems.mesh_chansw_params_ie->mesh_pre_value);
-++	pre_value = le16_to_cpu(elems->mesh_chansw_params_ie->mesh_pre_value);
-+ 	if (ifmsh->pre_value >= pre_value)
-+-		return;
-++		goto free;
-+ 
-+ 	ifmsh->pre_value = pre_value;
-+ 
-+ 	if (!sdata->vif.csa_active &&
-+-	    !ieee80211_mesh_process_chnswitch(sdata, &elems, false)) {
-++	    !ieee80211_mesh_process_chnswitch(sdata, elems, false)) {
-+ 		mcsa_dbg(sdata, "Failed to process CSA action frame");
-+-		return;
-++		goto free;
-+ 	}
-+ 
-+ 	/* forward or re-broadcast the CSA frame */
-+ 	if (fwd_csa) {
-+-		if (mesh_fwd_csa_frame(sdata, mgmt, len, &elems) < 0)
-++		if (mesh_fwd_csa_frame(sdata, mgmt, len, elems) < 0)
-+ 			mcsa_dbg(sdata, "Failed to forward the CSA frame");
-+ 	}
-++free:
-++	kfree(elems);
-+ }
-+ 
-+ static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata,
-+--- a/net/mac80211/mesh_hwmp.c
-++++ b/net/mac80211/mesh_hwmp.c
-+@@ -1,7 +1,7 @@
-+ // SPDX-License-Identifier: GPL-2.0-only
-+ /*
-+  * Copyright (c) 2008, 2009 open80211s Ltd.
-+- * Copyright (C) 2019 Intel Corporation
-++ * Copyright (C) 2019, 2021 Intel Corporation
-+  * Author:     Luis Carlos Cobo <luisca@cozybit.com>
-+  */
-+ 
-+@@ -908,7 +908,7 @@ static void hwmp_rann_frame_process(stru
-+ void mesh_rx_path_sel_frame(struct ieee80211_sub_if_data *sdata,
-+ 			    struct ieee80211_mgmt *mgmt, size_t len)
-+ {
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	size_t baselen;
-+ 	u32 path_metric;
-+ 	struct sta_info *sta;
-+@@ -926,37 +926,41 @@ void mesh_rx_path_sel_frame(struct ieee8
-+ 	rcu_read_unlock();
-+ 
-+ 	baselen = (u8 *) mgmt->u.action.u.mesh_action.variable - (u8 *) mgmt;
-+-	ieee802_11_parse_elems(mgmt->u.action.u.mesh_action.variable,
-+-			       len - baselen, false, &elems, mgmt->bssid, NULL);
-++	elems = ieee802_11_parse_elems(mgmt->u.action.u.mesh_action.variable,
-++				       len - baselen, false, mgmt->bssid, NULL);
-++	if (!elems)
-++		return;
-+ 
-+-	if (elems.preq) {
-+-		if (elems.preq_len != 37)
-++	if (elems->preq) {
-++		if (elems->preq_len != 37)
-+ 			/* Right now we support just 1 destination and no AE */
-+-			return;
-+-		path_metric = hwmp_route_info_get(sdata, mgmt, elems.preq,
-++			goto free;
-++		path_metric = hwmp_route_info_get(sdata, mgmt, elems->preq,
-+ 						  MPATH_PREQ);
-+ 		if (path_metric)
-+-			hwmp_preq_frame_process(sdata, mgmt, elems.preq,
-++			hwmp_preq_frame_process(sdata, mgmt, elems->preq,
-+ 						path_metric);
-+ 	}
-+-	if (elems.prep) {
-+-		if (elems.prep_len != 31)
-++	if (elems->prep) {
-++		if (elems->prep_len != 31)
-+ 			/* Right now we support no AE */
-+-			return;
-+-		path_metric = hwmp_route_info_get(sdata, mgmt, elems.prep,
-++			goto free;
-++		path_metric = hwmp_route_info_get(sdata, mgmt, elems->prep,
-+ 						  MPATH_PREP);
-+ 		if (path_metric)
-+-			hwmp_prep_frame_process(sdata, mgmt, elems.prep,
-++			hwmp_prep_frame_process(sdata, mgmt, elems->prep,
-+ 						path_metric);
-+ 	}
-+-	if (elems.perr) {
-+-		if (elems.perr_len != 15)
-++	if (elems->perr) {
-++		if (elems->perr_len != 15)
-+ 			/* Right now we support only one destination per PERR */
-+-			return;
-+-		hwmp_perr_frame_process(sdata, mgmt, elems.perr);
-++			goto free;
-++		hwmp_perr_frame_process(sdata, mgmt, elems->perr);
-+ 	}
-+-	if (elems.rann)
-+-		hwmp_rann_frame_process(sdata, mgmt, elems.rann);
-++	if (elems->rann)
-++		hwmp_rann_frame_process(sdata, mgmt, elems->rann);
-++free:
-++	kfree(elems);
-+ }
-+ 
-+ /**
-+--- a/net/mac80211/mesh_plink.c
-++++ b/net/mac80211/mesh_plink.c
-+@@ -1,7 +1,7 @@
-+ // SPDX-License-Identifier: GPL-2.0-only
-+ /*
-+  * Copyright (c) 2008, 2009 open80211s Ltd.
-+- * Copyright (C) 2019 Intel Corporation
-++ * Copyright (C) 2019, 2021 Intel Corporation
-+  * Author:     Luis Carlos Cobo <luisca@cozybit.com>
-+  */
-+ #include <linux/gfp.h>
-+@@ -1200,7 +1200,7 @@ void mesh_rx_plink_frame(struct ieee8021
-+ 			 struct ieee80211_mgmt *mgmt, size_t len,
-+ 			 struct ieee80211_rx_status *rx_status)
-+ {
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	size_t baselen;
-+ 	u8 *baseaddr;
-+ 
-+@@ -1228,7 +1228,8 @@ void mesh_rx_plink_frame(struct ieee8021
-+ 		if (baselen > len)
-+ 			return;
-+ 	}
-+-	ieee802_11_parse_elems(baseaddr, len - baselen, true, &elems,
-+-			       mgmt->bssid, NULL);
-+-	mesh_process_plink_frame(sdata, mgmt, &elems, rx_status);
-++	elems = ieee802_11_parse_elems(baseaddr, len - baselen, true,
-++				       mgmt->bssid, NULL);
-++	mesh_process_plink_frame(sdata, mgmt, elems, rx_status);
-++	kfree(elems);
-+ }
-+--- a/net/mac80211/mlme.c
-++++ b/net/mac80211/mlme.c
-+@@ -3317,8 +3317,11 @@ static bool ieee80211_assoc_success(stru
-+ 		aid = 0; /* TODO */
-+ 	}
-+ 	capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
-+-	ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, elems,
-+-			       mgmt->bssid, assoc_data->bss->bssid);
-++	elems = ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false,
-++				       mgmt->bssid, assoc_data->bss->bssid);
-++
-++	if (!elems)
-++		return false;
-+ 
-+ 	if (elems->aid_resp)
-+ 		aid = le16_to_cpu(elems->aid_resp->aid);
-+@@ -3340,7 +3343,8 @@ static bool ieee80211_assoc_success(stru
-+ 
-+ 	if (!is_s1g && !elems->supp_rates) {
-+ 		sdata_info(sdata, "no SuppRates element in AssocResp\n");
-+-		return false;
-++		ret = false;
-++		goto out;
-+ 	}
-+ 
-+ 	sdata->vif.bss_conf.aid = aid;
-+@@ -3362,7 +3366,7 @@ static bool ieee80211_assoc_success(stru
-+ 	     (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
-+ 	      (!elems->vht_cap_elem || !elems->vht_operation)))) {
-+ 		const struct cfg80211_bss_ies *ies;
-+-		struct ieee802_11_elems bss_elems;
-++		struct ieee802_11_elems *bss_elems;
-+ 
-+ 		rcu_read_lock();
-+ 		ies = rcu_dereference(cbss->ies);
-+@@ -3373,13 +3377,17 @@ static bool ieee80211_assoc_success(stru
-+ 		if (!bss_ies)
-+ 			return false;
-+ 
-+-		ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
-+-				       false, &bss_elems,
-+-				       mgmt->bssid,
-+-				       assoc_data->bss->bssid);
-++		bss_elems = ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
-++						   false, mgmt->bssid,
-++						   assoc_data->bss->bssid);
-++		if (!bss_elems) {
-++			ret = false;
-++			goto out;
-++		}
-++
-+ 		if (assoc_data->wmm &&
-+-		    !elems->wmm_param && bss_elems.wmm_param) {
-+-			elems->wmm_param = bss_elems.wmm_param;
-++		    !elems->wmm_param && bss_elems->wmm_param) {
-++			elems->wmm_param = bss_elems->wmm_param;
-+ 			sdata_info(sdata,
-+ 				   "AP bug: WMM param missing from AssocResp\n");
-+ 		}
-+@@ -3388,30 +3396,32 @@ static bool ieee80211_assoc_success(stru
-+ 		 * Also check if we requested HT/VHT, otherwise the AP doesn't
-+ 		 * have to include the IEs in the (re)association response.
-+ 		 */
-+-		if (!elems->ht_cap_elem && bss_elems.ht_cap_elem &&
-++		if (!elems->ht_cap_elem && bss_elems->ht_cap_elem &&
-+ 		    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
-+-			elems->ht_cap_elem = bss_elems.ht_cap_elem;
-++			elems->ht_cap_elem = bss_elems->ht_cap_elem;
-+ 			sdata_info(sdata,
-+ 				   "AP bug: HT capability missing from AssocResp\n");
-+ 		}
-+-		if (!elems->ht_operation && bss_elems.ht_operation &&
-++		if (!elems->ht_operation && bss_elems->ht_operation &&
-+ 		    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
-+-			elems->ht_operation = bss_elems.ht_operation;
-++			elems->ht_operation = bss_elems->ht_operation;
-+ 			sdata_info(sdata,
-+ 				   "AP bug: HT operation missing from AssocResp\n");
-+ 		}
-+-		if (!elems->vht_cap_elem && bss_elems.vht_cap_elem &&
-++		if (!elems->vht_cap_elem && bss_elems->vht_cap_elem &&
-+ 		    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
-+-			elems->vht_cap_elem = bss_elems.vht_cap_elem;
-++			elems->vht_cap_elem = bss_elems->vht_cap_elem;
-+ 			sdata_info(sdata,
-+ 				   "AP bug: VHT capa missing from AssocResp\n");
-+ 		}
-+-		if (!elems->vht_operation && bss_elems.vht_operation &&
-++		if (!elems->vht_operation && bss_elems->vht_operation &&
-+ 		    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
-+-			elems->vht_operation = bss_elems.vht_operation;
-++			elems->vht_operation = bss_elems->vht_operation;
-+ 			sdata_info(sdata,
-+ 				   "AP bug: VHT operation missing from AssocResp\n");
-+ 		}
-++
-++		kfree(bss_elems);
-+ 	}
-+ 
-+ 	/*
-+@@ -3662,6 +3672,7 @@ static bool ieee80211_assoc_success(stru
-+ 
-+ 	ret = true;
-+  out:
-++	kfree(elems);
-+ 	kfree(bss_ies);
-+ 	return ret;
-+ }
-+@@ -3673,7 +3684,7 @@ static void ieee80211_rx_mgmt_assoc_resp
-+ 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-+ 	struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
-+ 	u16 capab_info, status_code, aid;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	int ac, uapsd_queues = -1;
-+ 	u8 *pos;
-+ 	bool reassoc;
-+@@ -3730,14 +3741,16 @@ static void ieee80211_rx_mgmt_assoc_resp
-+ 	    fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0)
-+ 		return;
-+ 
-+-	ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems,
-+-			       mgmt->bssid, assoc_data->bss->bssid);
-++	elems = ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false,
-++				       mgmt->bssid, assoc_data->bss->bssid);
-++	if (!elems)
-++		goto notify_driver;
-+ 
-+ 	if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
-+-	    elems.timeout_int &&
-+-	    elems.timeout_int->type == WLAN_TIMEOUT_ASSOC_COMEBACK) {
-++	    elems->timeout_int &&
-++	    elems->timeout_int->type == WLAN_TIMEOUT_ASSOC_COMEBACK) {
-+ 		u32 tu, ms;
-+-		tu = le32_to_cpu(elems.timeout_int->value);
-++		tu = le32_to_cpu(elems->timeout_int->value);
-+ 		ms = tu * 1024 / 1000;
-+ 		sdata_info(sdata,
-+ 			   "%pM rejected association temporarily; comeback duration %u TU (%u ms)\n",
-+@@ -3757,7 +3770,7 @@ static void ieee80211_rx_mgmt_assoc_resp
-+ 		event.u.mlme.reason = status_code;
-+ 		drv_event_callback(sdata->local, sdata, &event);
-+ 	} else {
-+-		if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, &elems)) {
-++		if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, elems)) {
-+ 			/* oops -- internal error -- send timeout for now */
-+ 			ieee80211_destroy_assoc_data(sdata, false, false);
-+ 			cfg80211_assoc_timeout(sdata->dev, cbss);
-+@@ -3787,6 +3800,7 @@ static void ieee80211_rx_mgmt_assoc_resp
-+ 			       ifmgd->assoc_req_ies, ifmgd->assoc_req_ies_len);
-+ notify_driver:
-+ 	drv_mgd_complete_tx(sdata->local, sdata, &info);
-++	kfree(elems);
-+ }
-+ 
-+ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
-+@@ -3991,7 +4005,7 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 	struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
-+ 	struct ieee80211_mgmt *mgmt = (void *) hdr;
-+ 	size_t baselen;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	struct ieee80211_local *local = sdata->local;
-+ 	struct ieee80211_chanctx_conf *chanctx_conf;
-+ 	struct ieee80211_channel *chan;
-+@@ -4037,15 +4051,16 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 
-+ 	if (ifmgd->assoc_data && ifmgd->assoc_data->need_beacon &&
-+ 	    ieee80211_rx_our_beacon(bssid, ifmgd->assoc_data->bss)) {
-+-		ieee802_11_parse_elems(variable,
-+-				       len - baselen, false, &elems,
-+-				       bssid,
-+-				       ifmgd->assoc_data->bss->bssid);
-++		elems = ieee802_11_parse_elems(variable, len - baselen, false,
-++					       bssid,
-++					       ifmgd->assoc_data->bss->bssid);
-++		if (!elems)
-++			return;
-+ 
-+ 		ieee80211_rx_bss_info(sdata, mgmt, len, rx_status);
-+ 
-+-		if (elems.dtim_period)
-+-			ifmgd->dtim_period = elems.dtim_period;
-++		if (elems->dtim_period)
-++			ifmgd->dtim_period = elems->dtim_period;
-+ 		ifmgd->have_beacon = true;
-+ 		ifmgd->assoc_data->need_beacon = false;
-+ 		if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
-+@@ -4053,17 +4068,17 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 				le64_to_cpu(mgmt->u.beacon.timestamp);
-+ 			sdata->vif.bss_conf.sync_device_ts =
-+ 				rx_status->device_timestamp;
-+-			sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count;
-++			sdata->vif.bss_conf.sync_dtim_count = elems->dtim_count;
-+ 		}
-+ 
-+-		if (elems.mbssid_config_ie)
-++		if (elems->mbssid_config_ie)
-+ 			bss_conf->profile_periodicity =
-+-				elems.mbssid_config_ie->profile_periodicity;
-++				elems->mbssid_config_ie->profile_periodicity;
-+ 		else
-+ 			bss_conf->profile_periodicity = 0;
-+ 
-+-		if (elems.ext_capab_len >= 11 &&
-+-		    (elems.ext_capab[10] & WLAN_EXT_CAPA11_EMA_SUPPORT))
-++		if (elems->ext_capab_len >= 11 &&
-++		    (elems->ext_capab[10] & WLAN_EXT_CAPA11_EMA_SUPPORT))
-+ 			bss_conf->ema_ap = true;
-+ 		else
-+ 			bss_conf->ema_ap = false;
-+@@ -4072,6 +4087,7 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 		ifmgd->assoc_data->timeout = jiffies;
-+ 		ifmgd->assoc_data->timeout_started = true;
-+ 		run_again(sdata, ifmgd->assoc_data->timeout);
-++		kfree(elems);
-+ 		return;
-+ 	}
-+ 
-+@@ -4103,14 +4119,15 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 	 */
-+ 	if (!ieee80211_is_s1g_beacon(hdr->frame_control))
-+ 		ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4);
-+-	ieee802_11_parse_elems_crc(variable,
-+-				   len - baselen, false, &elems,
-+-				   care_about_ies, ncrc,
-+-				   mgmt->bssid, bssid);
-+-	ncrc = elems.crc;
-++	elems = ieee802_11_parse_elems_crc(variable, len - baselen,
-++					   false, care_about_ies, ncrc,
-++					   mgmt->bssid, bssid);
-++	if (!elems)
-++		return;
-++	ncrc = elems->crc;
-+ 
-+ 	if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
-+-	    ieee80211_check_tim(elems.tim, elems.tim_len, bss_conf->aid)) {
-++	    ieee80211_check_tim(elems->tim, elems->tim_len, bss_conf->aid)) {
-+ 		if (local->hw.conf.dynamic_ps_timeout > 0) {
-+ 			if (local->hw.conf.flags & IEEE80211_CONF_PS) {
-+ 				local->hw.conf.flags &= ~IEEE80211_CONF_PS;
-+@@ -4180,12 +4197,12 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 			le64_to_cpu(mgmt->u.beacon.timestamp);
-+ 		sdata->vif.bss_conf.sync_device_ts =
-+ 			rx_status->device_timestamp;
-+-		sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count;
-++		sdata->vif.bss_conf.sync_dtim_count = elems->dtim_count;
-+ 	}
-+ 
-+ 	if ((ncrc == ifmgd->beacon_crc && ifmgd->beacon_crc_valid) ||
-+ 	    ieee80211_is_s1g_short_beacon(mgmt->frame_control))
-+-		return;
-++		goto free;
-+ 	ifmgd->beacon_crc = ncrc;
-+ 	ifmgd->beacon_crc_valid = true;
-+ 
-+@@ -4193,12 +4210,12 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 
-+ 	ieee80211_sta_process_chanswitch(sdata, rx_status->mactime,
-+ 					 rx_status->device_timestamp,
-+-					 &elems, true);
-++					 elems, true);
-+ 
-+ 	if (!(ifmgd->flags & IEEE80211_STA_DISABLE_WMM) &&
-+-	    ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
-+-				     elems.wmm_param_len,
-+-				     elems.mu_edca_param_set))
-++	    ieee80211_sta_wmm_params(local, sdata, elems->wmm_param,
-++				     elems->wmm_param_len,
-++				     elems->mu_edca_param_set))
-+ 		changed |= BSS_CHANGED_QOS;
-+ 
-+ 	/*
-+@@ -4207,7 +4224,7 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 	 */
-+ 	if (!ifmgd->have_beacon) {
-+ 		/* a few bogus AP send dtim_period = 0 or no TIM IE */
-+-		bss_conf->dtim_period = elems.dtim_period ?: 1;
-++		bss_conf->dtim_period = elems->dtim_period ?: 1;
-+ 
-+ 		changed |= BSS_CHANGED_BEACON_INFO;
-+ 		ifmgd->have_beacon = true;
-+@@ -4219,9 +4236,9 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 		ieee80211_recalc_ps_vif(sdata);
-+ 	}
-+ 
-+-	if (elems.erp_info) {
-++	if (elems->erp_info) {
-+ 		erp_valid = true;
-+-		erp_value = elems.erp_info[0];
-++		erp_value = elems->erp_info[0];
-+ 	} else {
-+ 		erp_valid = false;
-+ 	}
-+@@ -4234,12 +4251,12 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 	mutex_lock(&local->sta_mtx);
-+ 	sta = sta_info_get(sdata, bssid);
-+ 
-+-	changed |= ieee80211_recalc_twt_req(sdata, sta, &elems);
-++	changed |= ieee80211_recalc_twt_req(sdata, sta, elems);
-+ 
-+-	if (ieee80211_config_bw(sdata, sta, elems.ht_cap_elem,
-+-				elems.vht_cap_elem, elems.ht_operation,
-+-				elems.vht_operation, elems.he_operation,
-+-				elems.s1g_oper, bssid, &changed)) {
-++	if (ieee80211_config_bw(sdata, sta, elems->ht_cap_elem,
-++				elems->vht_cap_elem, elems->ht_operation,
-++				elems->vht_operation, elems->he_operation,
-++				elems->s1g_oper, bssid, &changed)) {
-+ 		mutex_unlock(&local->sta_mtx);
-+ 		sdata_info(sdata,
-+ 			   "failed to follow AP %pM bandwidth change, disconnect\n",
-+@@ -4251,21 +4268,23 @@ static void ieee80211_rx_mgmt_beacon(str
-+ 					    sizeof(deauth_buf), true,
-+ 					    WLAN_REASON_DEAUTH_LEAVING,
-+ 					    false);
-+-		return;
-++		goto free;
-+ 	}
-+ 
-+-	if (sta && elems.opmode_notif)
-+-		ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif,
-++	if (sta && elems->opmode_notif)
-++		ieee80211_vht_handle_opmode(sdata, sta, *elems->opmode_notif,
-+ 					    rx_status->band);
-+ 	mutex_unlock(&local->sta_mtx);
-+ 
-+ 	changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt,
-+-					       elems.country_elem,
-+-					       elems.country_elem_len,
-+-					       elems.pwr_constr_elem,
-+-					       elems.cisco_dtpc_elem);
-++					       elems->country_elem,
-++					       elems->country_elem_len,
-++					       elems->pwr_constr_elem,
-++					       elems->cisco_dtpc_elem);
-+ 
-+ 	ieee80211_bss_info_change_notify(sdata, changed);
-++free:
-++	kfree(elems);
-+ }
-+ 
-+ void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata,
-+@@ -4294,7 +4313,6 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 	struct ieee80211_rx_status *rx_status;
-+ 	struct ieee80211_mgmt *mgmt;
-+ 	u16 fc;
-+-	struct ieee802_11_elems elems;
-+ 	int ies_len;
-+ 
-+ 	rx_status = (struct ieee80211_rx_status *) skb->cb;
-+@@ -4326,6 +4344,8 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 		break;
-+ 	case IEEE80211_STYPE_ACTION:
-+ 		if (mgmt->u.action.category == WLAN_CATEGORY_SPECTRUM_MGMT) {
-++			struct ieee802_11_elems *elems;
-++
-+ 			ies_len = skb->len -
-+ 				  offsetof(struct ieee80211_mgmt,
-+ 					   u.action.u.chan_switch.variable);
-+@@ -4334,18 +4354,21 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 				break;
-+ 
-+ 			/* CSA IE cannot be overridden, no need for BSSID */
-+-			ieee802_11_parse_elems(
-+-				mgmt->u.action.u.chan_switch.variable,
-+-				ies_len, true, &elems, mgmt->bssid, NULL);
-++			elems = ieee802_11_parse_elems(
-++					mgmt->u.action.u.chan_switch.variable,
-++					ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (elems.parse_error)
-++			if (!elems || elems->parse_error)
-+ 				break;
-+ 
-+ 			ieee80211_sta_process_chanswitch(sdata,
-+ 						 rx_status->mactime,
-+ 						 rx_status->device_timestamp,
-+-						 &elems, false);
-++						 elems, false);
-++			kfree(elems);
-+ 		} else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
-++			struct ieee802_11_elems *elems;
-++
-+ 			ies_len = skb->len -
-+ 				  offsetof(struct ieee80211_mgmt,
-+ 					   u.action.u.ext_chan_switch.variable);
-+@@ -4357,21 +4380,22 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 			 * extended CSA IE can't be overridden, no need for
-+ 			 * BSSID
-+ 			 */
-+-			ieee802_11_parse_elems(
-+-				mgmt->u.action.u.ext_chan_switch.variable,
-+-				ies_len, true, &elems, mgmt->bssid, NULL);
-++			elems = ieee802_11_parse_elems(
-++					mgmt->u.action.u.ext_chan_switch.variable,
-++					ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (elems.parse_error)
-++			if (!elems || elems->parse_error)
-+ 				break;
-+ 
-+ 			/* for the handling code pretend this was also an IE */
-+-			elems.ext_chansw_ie =
-++			elems->ext_chansw_ie =
-+ 				&mgmt->u.action.u.ext_chan_switch.data;
-+ 
-+ 			ieee80211_sta_process_chanswitch(sdata,
-+ 						 rx_status->mactime,
-+ 						 rx_status->device_timestamp,
-+-						 &elems, false);
-++						 elems, false);
-++			kfree(elems);
-+ 		}
-+ 		break;
-+ 	}
-+--- a/net/mac80211/scan.c
-++++ b/net/mac80211/scan.c
-+@@ -9,7 +9,7 @@
-+  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
-+  * Copyright 2013-2015  Intel Mobile Communications GmbH
-+  * Copyright 2016-2017  Intel Deutschland GmbH
-+- * Copyright (C) 2018-2020 Intel Corporation
-++ * Copyright (C) 2018-2021 Intel Corporation
-+  */
-+ 
-+ #include <linux/if_arp.h>
-+@@ -155,7 +155,7 @@ ieee80211_bss_info_update(struct ieee802
-+ 	};
-+ 	bool signal_valid;
-+ 	struct ieee80211_sub_if_data *scan_sdata;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	size_t baselen;
-+ 	u8 *elements;
-+ 
-+@@ -209,8 +209,10 @@ ieee80211_bss_info_update(struct ieee802
-+ 	if (baselen > len)
-+ 		return NULL;
-+ 
-+-	ieee802_11_parse_elems(elements, len - baselen, false, &elems,
-+-			       mgmt->bssid, cbss->bssid);
-++	elems = ieee802_11_parse_elems(elements, len - baselen, false,
-++				       mgmt->bssid, cbss->bssid);
-++	if (!elems)
-++		return NULL;
-+ 
-+ 	/* In case the signal is invalid update the status */
-+ 	signal_valid = channel == cbss->channel;
-+@@ -218,15 +220,17 @@ ieee80211_bss_info_update(struct ieee802
-+ 		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
-+ 
-+ 	bss = (void *)cbss->priv;
-+-	ieee80211_update_bss_from_elems(local, bss, &elems, rx_status, beacon);
-++	ieee80211_update_bss_from_elems(local, bss, elems, rx_status, beacon);
-+ 
-+ 	list_for_each_entry(non_tx_cbss, &cbss->nontrans_list, nontrans_list) {
-+ 		non_tx_bss = (void *)non_tx_cbss->priv;
-+ 
-+-		ieee80211_update_bss_from_elems(local, non_tx_bss, &elems,
-++		ieee80211_update_bss_from_elems(local, non_tx_bss, elems,
-+ 						rx_status, beacon);
-+ 	}
-+ 
-++	kfree(elems);
-++
-+ 	return bss;
-+ }
-+ 
-+--- a/net/mac80211/tdls.c
-++++ b/net/mac80211/tdls.c
-+@@ -6,7 +6,7 @@
-+  * Copyright 2014, Intel Corporation
-+  * Copyright 2014  Intel Mobile Communications GmbH
-+  * Copyright 2015 - 2016 Intel Deutschland GmbH
-+- * Copyright (C) 2019 Intel Corporation
-++ * Copyright (C) 2019, 2021 Intel Corporation
-+  */
-+ 
-+ #include <linux/ieee80211.h>
-+@@ -1684,7 +1684,7 @@ ieee80211_process_tdls_channel_switch_re
-+ 					   struct sk_buff *skb)
-+ {
-+ 	struct ieee80211_local *local = sdata->local;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems = NULL;
-+ 	struct sta_info *sta;
-+ 	struct ieee80211_tdls_data *tf = (void *)skb->data;
-+ 	bool local_initiator;
-+@@ -1718,16 +1718,20 @@ ieee80211_process_tdls_channel_switch_re
-+ 		goto call_drv;
-+ 	}
-+ 
-+-	ieee802_11_parse_elems(tf->u.chan_switch_resp.variable,
-+-			       skb->len - baselen, false, &elems,
-+-			       NULL, NULL);
-+-	if (elems.parse_error) {
-++	elems = ieee802_11_parse_elems(tf->u.chan_switch_resp.variable,
-++				       skb->len - baselen, false, NULL, NULL);
-++	if (!elems) {
-++		ret = -ENOMEM;
-++		goto out;
-++	}
-++
-++	if (elems->parse_error) {
-+ 		tdls_dbg(sdata, "Invalid IEs in TDLS channel switch resp\n");
-+ 		ret = -EINVAL;
-+ 		goto out;
-+ 	}
-+ 
-+-	if (!elems.ch_sw_timing || !elems.lnk_id) {
-++	if (!elems->ch_sw_timing || !elems->lnk_id) {
-+ 		tdls_dbg(sdata, "TDLS channel switch resp - missing IEs\n");
-+ 		ret = -EINVAL;
-+ 		goto out;
-+@@ -1735,15 +1739,15 @@ ieee80211_process_tdls_channel_switch_re
-+ 
-+ 	/* validate the initiator is set correctly */
-+ 	local_initiator =
-+-		!memcmp(elems.lnk_id->init_sta, sdata->vif.addr, ETH_ALEN);
-++		!memcmp(elems->lnk_id->init_sta, sdata->vif.addr, ETH_ALEN);
-+ 	if (local_initiator == sta->sta.tdls_initiator) {
-+ 		tdls_dbg(sdata, "TDLS chan switch invalid lnk-id initiator\n");
-+ 		ret = -EINVAL;
-+ 		goto out;
-+ 	}
-+ 
-+-	params.switch_time = le16_to_cpu(elems.ch_sw_timing->switch_time);
-+-	params.switch_timeout = le16_to_cpu(elems.ch_sw_timing->switch_timeout);
-++	params.switch_time = le16_to_cpu(elems->ch_sw_timing->switch_time);
-++	params.switch_timeout = le16_to_cpu(elems->ch_sw_timing->switch_timeout);
-+ 
-+ 	params.tmpl_skb =
-+ 		ieee80211_tdls_ch_sw_resp_tmpl_get(sta, &params.ch_sw_tm_ie);
-+@@ -1763,6 +1767,7 @@ call_drv:
-+ out:
-+ 	mutex_unlock(&local->sta_mtx);
-+ 	dev_kfree_skb_any(params.tmpl_skb);
-++	kfree(elems);
-+ 	return ret;
-+ }
-+ 
-+@@ -1771,7 +1776,7 @@ ieee80211_process_tdls_channel_switch_re
-+ 					  struct sk_buff *skb)
-+ {
-+ 	struct ieee80211_local *local = sdata->local;
-+-	struct ieee802_11_elems elems;
-++	struct ieee802_11_elems *elems;
-+ 	struct cfg80211_chan_def chandef;
-+ 	struct ieee80211_channel *chan;
-+ 	enum nl80211_channel_type chan_type;
-+@@ -1831,22 +1836,27 @@ ieee80211_process_tdls_channel_switch_re
-+ 		return -EINVAL;
-+ 	}
-+ 
-+-	ieee802_11_parse_elems(tf->u.chan_switch_req.variable,
-+-			       skb->len - baselen, false, &elems, NULL, NULL);
-+-	if (elems.parse_error) {
-++	elems = ieee802_11_parse_elems(tf->u.chan_switch_req.variable,
-++				       skb->len - baselen, false, NULL, NULL);
-++	if (!elems)
-++		return -ENOMEM;
-++
-++	if (elems->parse_error) {
-+ 		tdls_dbg(sdata, "Invalid IEs in TDLS channel switch req\n");
-+-		return -EINVAL;
-++		ret = -EINVAL;
-++		goto free;
-+ 	}
-+ 
-+-	if (!elems.ch_sw_timing || !elems.lnk_id) {
-++	if (!elems->ch_sw_timing || !elems->lnk_id) {
-+ 		tdls_dbg(sdata, "TDLS channel switch req - missing IEs\n");
-+-		return -EINVAL;
-++		ret = -EINVAL;
-++		goto free;
-+ 	}
-+ 
-+-	if (!elems.sec_chan_offs) {
-++	if (!elems->sec_chan_offs) {
-+ 		chan_type = NL80211_CHAN_HT20;
-+ 	} else {
-+-		switch (elems.sec_chan_offs->sec_chan_offs) {
-++		switch (elems->sec_chan_offs->sec_chan_offs) {
-+ 		case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
-+ 			chan_type = NL80211_CHAN_HT40PLUS;
-+ 			break;
-+@@ -1865,7 +1875,8 @@ ieee80211_process_tdls_channel_switch_re
-+ 	if (!cfg80211_reg_can_beacon_relax(sdata->local->hw.wiphy, &chandef,
-+ 					   sdata->wdev.iftype)) {
-+ 		tdls_dbg(sdata, "TDLS chan switch to forbidden channel\n");
-+-		return -EINVAL;
-++		ret = -EINVAL;
-++		goto free;
-+ 	}
-+ 
-+ 	mutex_lock(&local->sta_mtx);
-+@@ -1881,7 +1892,7 @@ ieee80211_process_tdls_channel_switch_re
-+ 
-+ 	/* validate the initiator is set correctly */
-+ 	local_initiator =
-+-		!memcmp(elems.lnk_id->init_sta, sdata->vif.addr, ETH_ALEN);
-++		!memcmp(elems->lnk_id->init_sta, sdata->vif.addr, ETH_ALEN);
-+ 	if (local_initiator == sta->sta.tdls_initiator) {
-+ 		tdls_dbg(sdata, "TDLS chan switch invalid lnk-id initiator\n");
-+ 		ret = -EINVAL;
-+@@ -1889,16 +1900,16 @@ ieee80211_process_tdls_channel_switch_re
-+ 	}
-+ 
-+ 	/* peer should have known better */
-+-	if (!sta->sta.ht_cap.ht_supported && elems.sec_chan_offs &&
-+-	    elems.sec_chan_offs->sec_chan_offs) {
-++	if (!sta->sta.ht_cap.ht_supported && elems->sec_chan_offs &&
-++	    elems->sec_chan_offs->sec_chan_offs) {
-+ 		tdls_dbg(sdata, "TDLS chan switch - wide chan unsupported\n");
-+ 		ret = -ENOTSUPP;
-+ 		goto out;
-+ 	}
-+ 
-+ 	params.chandef = &chandef;
-+-	params.switch_time = le16_to_cpu(elems.ch_sw_timing->switch_time);
-+-	params.switch_timeout = le16_to_cpu(elems.ch_sw_timing->switch_timeout);
-++	params.switch_time = le16_to_cpu(elems->ch_sw_timing->switch_time);
-++	params.switch_timeout = le16_to_cpu(elems->ch_sw_timing->switch_timeout);
-+ 
-+ 	params.tmpl_skb =
-+ 		ieee80211_tdls_ch_sw_resp_tmpl_get(sta,
-+@@ -1917,6 +1928,8 @@ ieee80211_process_tdls_channel_switch_re
-+ out:
-+ 	mutex_unlock(&local->sta_mtx);
-+ 	dev_kfree_skb_any(params.tmpl_skb);
-++free:
-++	kfree(elems);
-+ 	return ret;
-+ }
-+ 
-+--- a/net/mac80211/util.c
-++++ b/net/mac80211/util.c
-+@@ -1399,8 +1399,8 @@ _ieee802_11_parse_elems_crc(const u8 *st
-+ 
-+ static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len,
-+ 					    struct ieee802_11_elems *elems,
-+-					    u8 *transmitter_bssid,
-+-					    u8 *bss_bssid,
-++					    const u8 *transmitter_bssid,
-++					    const u8 *bss_bssid,
-+ 					    u8 *nontransmitted_profile)
-+ {
-+ 	const struct element *elem, *sub;
-+@@ -1465,16 +1465,20 @@ static size_t ieee802_11_find_bssid_prof
-+ 	return found ? profile_len : 0;
-+ }
-+ 
-+-void ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-+-				struct ieee802_11_elems *elems,
-+-				u64 filter, u32 crc, u8 *transmitter_bssid,
-+-				u8 *bss_bssid)
-++struct ieee802_11_elems *ieee802_11_parse_elems_crc(const u8 *start, size_t len,
-++						    bool action, u64 filter,
-++						    u32 crc,
-++						    const u8 *transmitter_bssid,
-++						    const u8 *bss_bssid)
-+ {
-++	struct ieee802_11_elems *elems;
-+ 	const struct element *non_inherit = NULL;
-+ 	u8 *nontransmitted_profile;
-+ 	int nontransmitted_profile_len = 0;
-+ 
-+-	memset(elems, 0, sizeof(*elems));
-++	elems = kzalloc(sizeof(*elems), GFP_ATOMIC);
-++	if (!elems)
-++		return NULL;
-+ 	elems->ie_start = start;
-+ 	elems->total_len = len;
-+ 
-+@@ -1521,6 +1525,8 @@ void ieee802_11_parse_elems_crc(const u8
-+ 	kfree(nontransmitted_profile);
-+ 
-+ 	elems->crc = crc;
-++
-++	return elems;
-+ }
-+ 
-+ void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
+- 	prob = mi->groups[i].rates[j].prob_avg;
+- 
+- 	/* convert tp_avg from pkt per second in kbps */
+---- a/net/mac80211/rc80211_minstrel_ht.h
+-+++ b/net/mac80211/rc80211_minstrel_ht.h
+-@@ -6,6 +6,8 @@
+- #ifndef __RC_MINSTREL_HT_H
+- #define __RC_MINSTREL_HT_H
+- 
+-+#include <linux/bitfield.h>
+-+
+- /* number of highest throughput rates to consider*/
+- #define MAX_THR_RATES 4
+- #define SAMPLE_COLUMNS	10	/* number of columns in sample table */
+-@@ -57,6 +59,17 @@
+- 
+- #define MCS_GROUP_RATES		10
+- 
+-+#define MI_RATE_IDX_MASK	GENMASK(3, 0)
+-+#define MI_RATE_GROUP_MASK	GENMASK(15, 4)
+-+
+-+#define MI_RATE(_group, _idx)				\
+-+	(FIELD_PREP(MI_RATE_GROUP_MASK, _group) |	\
+-+	 FIELD_PREP(MI_RATE_IDX_MASK, _idx))
+-+
+-+#define MI_RATE_IDX(_rate) FIELD_GET(MI_RATE_IDX_MASK, _rate)
+-+#define MI_RATE_GROUP(_rate) FIELD_GET(MI_RATE_GROUP_MASK, _rate)
+-+
+-+
+- struct minstrel_priv {
+- 	struct ieee80211_hw *hw;
+- 	bool has_mrr;
+---- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
+-+++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
+-@@ -56,7 +56,7 @@ minstrel_ht_stats_dump(struct minstrel_h
+- 
+- 	for (j = 0; j < MCS_GROUP_RATES; j++) {
+- 		struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
+--		int idx = i * MCS_GROUP_RATES + j;
+-+		int idx = MI_RATE(i, j);
+- 		unsigned int duration;
+- 
+- 		if (!(mi->supported[i] & BIT(j)))
+-@@ -201,7 +201,7 @@ minstrel_ht_stats_csv_dump(struct minstr
+- 
+- 	for (j = 0; j < MCS_GROUP_RATES; j++) {
+- 		struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
+--		int idx = i * MCS_GROUP_RATES + j;
+-+		int idx = MI_RATE(i, j);
+- 		unsigned int duration;
+- 
+- 		if (!(mi->supported[i] & BIT(j)))
+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
+--- a/package/kernel/mac80211/patches/subsys/347-mac80211-minstrel_ht-update-total-packets-counter-in.patch
++++ /dev/null
+@@ -1,54 +0,0 @@
+-From: Felix Fietkau <nbd@nbd.name>
+-Date: Fri, 22 Jan 2021 18:21:13 +0100
+-Subject: [PATCH] mac80211: minstrel_ht: update total packets counter in tx
+- status path
+-
+-Keep the update in one place and prepare for further rework
+-
+-Signed-off-by: Felix Fietkau <nbd@nbd.name>
+----
+-
+---- a/net/mac80211/rc80211_minstrel_ht.c
+-+++ b/net/mac80211/rc80211_minstrel_ht.c
+-@@ -1092,6 +1092,16 @@ minstrel_ht_tx_status(void *priv, struct
+- 		info->status.ampdu_len = 1;
+- 	}
+- 
+-+	/* wraparound */
+-+	if (mi->total_packets >= ~0 - info->status.ampdu_len) {
+-+		mi->total_packets = 0;
+-+		mi->sample_packets = 0;
+-+	}
+-+
+-+	mi->total_packets += info->status.ampdu_len;
+-+	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
+-+		mi->sample_packets += info->status.ampdu_len;
+-+
+- 	mi->ampdu_packets++;
+- 	mi->ampdu_len += info->status.ampdu_len;
+- 
+-@@ -1103,9 +1113,6 @@ minstrel_ht_tx_status(void *priv, struct
+- 		mi->sample_count--;
+- 	}
+- 
+--	if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
+--		mi->sample_packets += info->status.ampdu_len;
+--
+- 	if (mi->sample_mode != MINSTREL_SAMPLE_IDLE)
+- 		rate_sample = minstrel_get_ratestats(mi, mi->sample_rate);
+- 
+-@@ -1503,14 +1510,6 @@ minstrel_ht_get_rate(void *priv, struct
+- 	else
+- 		sample_idx = minstrel_get_sample_rate(mp, mi);
+- 
+--	mi->total_packets++;
+--
+--	/* wraparound */
+--	if (mi->total_packets == ~0) {
+--		mi->total_packets = 0;
+--		mi->sample_packets = 0;
+--	}
+--
+- 	if (sample_idx < 0)
+- 		return;
+- 
+diff --git a/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch b/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
+deleted file mode 100644
+index dc6f11e4b9..0000000000
+--- a/package/kernel/mac80211/patches/subsys/348-mac80211-minstrel_ht-reduce-the-need-to-sample-slowe.patch
++++ /dev/null
+@@ -1,102 +0,0 @@
+-From: Felix Fietkau <nbd@nbd.name>
+-Date: Fri, 22 Jan 2021 19:24:59 +0100
+-Subject: [PATCH] mac80211: minstrel_ht: reduce the need to sample slower
+- rates
+-
+-In order to more gracefully be able to fall back to lower rates without too
+-much throughput fluctuations, initialize all untested rates below tested ones
+-to the maximum probabilty of higher rates.
+-Usually this leads to untested lower rates getting initialized with a
+-probability value of 100%, making them better candidates for fallback without
+-having to rely on random probing
+-
+-Signed-off-by: Felix Fietkau <nbd@nbd.name>
+----
+-
+---- a/net/mac80211/rc80211_minstrel_ht.c
+-+++ b/net/mac80211/rc80211_minstrel_ht.c
+-@@ -791,14 +791,11 @@ minstrel_ht_calc_rate_stats(struct minst
+- 	unsigned int cur_prob;
+- 
+- 	if (unlikely(mrs->attempts > 0)) {
+--		mrs->sample_skipped = 0;
+- 		cur_prob = MINSTREL_FRAC(mrs->success, mrs->attempts);
+- 		minstrel_filter_avg_add(&mrs->prob_avg,
+- 					&mrs->prob_avg_1, cur_prob);
+- 		mrs->att_hist += mrs->attempts;
+- 		mrs->succ_hist += mrs->success;
+--	} else {
+--		mrs->sample_skipped++;
+- 	}
+- 
+- 	mrs->last_success = mrs->success;
+-@@ -851,7 +848,6 @@ minstrel_ht_update_stats(struct minstrel
+- 		mi->ampdu_packets = 0;
+- 	}
+- 
+--	mi->sample_slow = 0;
+- 	mi->sample_count = 0;
+- 
+- 	if (mi->supported[MINSTREL_CCK_GROUP])
+-@@ -882,6 +878,7 @@ minstrel_ht_update_stats(struct minstrel
+- 	/* Find best rate sets within all MCS groups*/
+- 	for (group = 0; group < ARRAY_SIZE(minstrel_mcs_groups); group++) {
+- 		u16 *tp_rate = tmp_mcs_tp_rate;
+-+		u16 last_prob = 0;
+- 
+- 		mg = &mi->groups[group];
+- 		if (!mi->supported[group])
+-@@ -896,7 +893,7 @@ minstrel_ht_update_stats(struct minstrel
+- 		if (group == MINSTREL_CCK_GROUP && ht_supported)
+- 			tp_rate = tmp_legacy_tp_rate;
+- 
+--		for (i = 0; i < MCS_GROUP_RATES; i++) {
+-+		for (i = MCS_GROUP_RATES - 1; i >= 0; i--) {
+- 			if (!(mi->supported[group] & BIT(i)))
+- 				continue;
+- 
+-@@ -905,6 +902,11 @@ minstrel_ht_update_stats(struct minstrel
+- 			mrs = &mg->rates[i];
+- 			mrs->retry_updated = false;
+- 			minstrel_ht_calc_rate_stats(mp, mrs);
+-+
+-+			if (mrs->att_hist)
+-+				last_prob = max(last_prob, mrs->prob_avg);
+-+			else
+-+				mrs->prob_avg = max(last_prob, mrs->prob_avg);
+- 			cur_prob = mrs->prob_avg;
+- 
+- 			if (minstrel_ht_get_tp_avg(mi, group, i, cur_prob) == 0)
+-@@ -1469,13 +1471,9 @@ minstrel_get_sample_rate(struct minstrel
+- 	if (sample_dur >= minstrel_get_duration(tp_rate2) &&
+- 	    (cur_max_tp_streams - 1 <
+- 	     minstrel_mcs_groups[sample_group].streams ||
+--	     sample_dur >= minstrel_get_duration(mi->max_prob_rate))) {
+--		if (mrs->sample_skipped < 20)
+-+	     sample_dur >= minstrel_get_duration(mi->max_prob_rate)))
+- 			return -1;
+- 
+--		if (mi->sample_slow++ > 2)
+--			return -1;
+--	}
+- 	mi->sample_tries--;
+- 
+- 	return sample_idx;
+---- a/net/mac80211/rc80211_minstrel_ht.h
+-+++ b/net/mac80211/rc80211_minstrel_ht.h
+-@@ -123,7 +123,6 @@ struct minstrel_rate_stats {
+- 	u8 retry_count;
+- 	u8 retry_count_rtscts;
+- 
+--	u8 sample_skipped;
+- 	bool retry_updated;
+- };
+- 
+-@@ -179,7 +178,6 @@ struct minstrel_ht_sta {
+- 	u8 sample_wait;
+- 	u8 sample_tries;
+- 	u8 sample_count;
+--	u8 sample_slow;
+- 
+- 	enum minstrel_sample_mode sample_mode;
+- 	u16 sample_rate;
 diff --git a/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch b/package/kernel/mac80211/patches/subsys/349-mac80211-minstrel_ht-significantly-redesign-the-rate.patch
 deleted file mode 100644
 index 09f6fd2214..0000000000
@@ -20200,127 +17210,130 @@ index 09f6fd2214..0000000000
 - 	u8 band;
 - 
 - 	/* Bitfield of supported MCS rates of all groups */
-diff --git a/package/kernel/mac80211/patches/subsys/350-mac80211-fix-memory-leaks-with-element-parsing.patch b/package/kernel/mac80211/patches/subsys/350-mac80211-fix-memory-leaks-with-element-parsing.patch
+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..f4906e8c03
+index 0000000000..1e3486accd
 --- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/350-mac80211-fix-memory-leaks-with-element-parsing.patch
-@@ -0,0 +1,115 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Fri, 1 Oct 2021 21:11:08 +0200
-+Subject: [PATCH] mac80211: fix memory leaks with element parsing
-+
-+commit 8223ac199a3849257e86ec27865dc63f034b1cf1 upstream.
-+
-+My previous commit 5d24828d05f3 ("mac80211: always allocate
-+struct ieee802_11_elems") had a few bugs and leaked the new
-+allocated struct in a few error cases, fix that.
-+
-+Fixes: 5d24828d05f3 ("mac80211: always allocate struct ieee802_11_elems")
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+Link: https://lore.kernel.org/r/20211001211108.9839928e42e0.Ib81ca187d3d3af7ed1bfeac2e00d08a4637c8025@changeid
++++ 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/net/mac80211/agg-rx.c
-++++ b/net/mac80211/agg-rx.c
-+@@ -499,13 +499,14 @@ void ieee80211_process_addba_request(str
-+ 		elems = ieee802_11_parse_elems(mgmt->u.action.u.addba_req.variable,
-+ 					       ies_len, true, mgmt->bssid, NULL);
-+ 		if (!elems || elems->parse_error)
-+-			return;
-++			goto free;
-+ 	}
++--- 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
++ };
 + 
-+ 	__ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
-+ 					start_seq_num, ba_policy, tid,
-+ 					buf_size, true, false,
-+ 					elems ? elems->addba_ext_ie : NULL);
-++free:
-+ 	kfree(elems);
++--- 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);
 + }
 + 
-+--- a/net/mac80211/ibss.c
-++++ b/net/mac80211/ibss.c
-+@@ -1659,11 +1659,11 @@ void ieee80211_ibss_rx_queued_mgmt(struc
-+ 				mgmt->u.action.u.chan_switch.variable,
-+ 				ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (!elems || elems->parse_error)
-+-				break;
-+-
-+-			ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt, skb->len,
-+-							rx_status, elems);
-++			if (elems && !elems->parse_error)
-++				ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
-++								skb->len,
-++								rx_status,
-++								elems);
-+ 			kfree(elems);
-+ 			break;
-+ 		}
-+--- a/net/mac80211/mlme.c
-++++ b/net/mac80211/mlme.c
-+@@ -3374,8 +3374,10 @@ static bool ieee80211_assoc_success(stru
-+ 			bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
-+ 					  GFP_ATOMIC);
-+ 		rcu_read_unlock();
-+-		if (!bss_ies)
-+-			return false;
-++		if (!bss_ies) {
-++			ret = false;
-++			goto out;
-++		}
-+ 
-+ 		bss_elems = ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
-+ 						   false, mgmt->bssid,
-+@@ -4358,13 +4360,11 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 					mgmt->u.action.u.chan_switch.variable,
-+ 					ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (!elems || elems->parse_error)
-+-				break;
-+-
-+-			ieee80211_sta_process_chanswitch(sdata,
-+-						 rx_status->mactime,
-+-						 rx_status->device_timestamp,
-+-						 elems, false);
-++			if (elems && !elems->parse_error)
-++				ieee80211_sta_process_chanswitch(sdata,
-++								 rx_status->mactime,
-++								 rx_status->device_timestamp,
-++								 elems, false);
-+ 			kfree(elems);
-+ 		} else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
-+ 			struct ieee802_11_elems *elems;
-+@@ -4384,17 +4384,17 @@ void ieee80211_sta_rx_queued_mgmt(struct
-+ 					mgmt->u.action.u.ext_chan_switch.variable,
-+ 					ies_len, true, mgmt->bssid, NULL);
-+ 
-+-			if (!elems || elems->parse_error)
-+-				break;
-++			if (elems && !elems->parse_error) {
-++				/* for the handling code pretend it was an IE */
-++				elems->ext_chansw_ie =
-++					&mgmt->u.action.u.ext_chan_switch.data;
-++
-++				ieee80211_sta_process_chanswitch(sdata,
-++								 rx_status->mactime,
-++								 rx_status->device_timestamp,
-++								 elems, false);
-++			}
+++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;
 + 
-+-			/* for the handling code pretend this was also an IE */
-+-			elems->ext_chansw_ie =
-+-				&mgmt->u.action.u.ext_chan_switch.data;
-+-
-+-			ieee80211_sta_process_chanswitch(sdata,
-+-						 rx_status->mactime,
-+-						 rx_status->device_timestamp,
-+-						 elems, false);
-+ 			kfree(elems);
-+ 		}
-+ 		break;
+++		/* 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
@@ -20670,53 +17683,6 @@ index 8170ff85f8..0000000000
 - 
 - 	/* Bitfield of supported MCS rates of all groups */
 - 	u16 supported[MINSTREL_GROUPS_NB];
-diff --git a/package/kernel/mac80211/patches/subsys/351-wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_not.patch b/package/kernel/mac80211/patches/subsys/351-wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_not.patch
-new file mode 100644
-index 0000000000..9e1f781367
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/351-wifi-cfg80211-fix-u8-overflow-in-cfg80211_update_not.patch
-@@ -0,0 +1,41 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 28 Sep 2022 21:56:15 +0200
-+Subject: [PATCH] wifi: cfg80211: fix u8 overflow in
-+ cfg80211_update_notlisted_nontrans()
-+
-+commit aebe9f4639b13a1f4e9a6b42cdd2e38c617b442d upstream.
-+
-+In the copy code of the elements, we do the following calculation
-+to reach the end of the MBSSID element:
-+
-+	/* copy the IEs after MBSSID */
-+	cpy_len = mbssid[1] + 2;
-+
-+This looks fine, however, cpy_len is a u8, the same as mbssid[1],
-+so the addition of two can overflow. In this case the subsequent
-+memcpy() will overflow the allocated buffer, since it copies 256
-+bytes too much due to the way the allocation and memcpy() sizes
-+are calculated.
-+
-+Fix this by using size_t for the cpy_len variable.
-+
-+This fixes CVE-2022-41674.
-+
-+Reported-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
-+Tested-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
-+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
-+Reviewed-by: Kees Cook <keescook@chromium.org>
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -2238,7 +2238,7 @@ cfg80211_update_notlisted_nontrans(struc
-+ 	size_t new_ie_len;
-+ 	struct cfg80211_bss_ies *new_ies;
-+ 	const struct cfg80211_bss_ies *old;
-+-	u8 cpy_len;
-++	size_t cpy_len;
-+ 
-+ 	lockdep_assert_held(&wiphy_to_rdev(wiphy)->bss_lock);
-+ 
 diff --git a/package/kernel/mac80211/patches/subsys/352-mac80211-minstrel_ht-fix-regression-in-the-max_prob_.patch b/package/kernel/mac80211/patches/subsys/352-mac80211-minstrel_ht-fix-regression-in-the-max_prob_.patch
 deleted file mode 100644
 index a366a921d4..0000000000
@@ -20746,736 +17712,6 @@ index a366a921d4..0000000000
 - 
 - 		max_gpr_tp_avg = minstrel_ht_get_tp_avg(mi, max_gpr_group,
 - 							max_gpr_idx,
-diff --git a/package/kernel/mac80211/patches/subsys/352-wifi-cfg80211-mac80211-reject-bad-MBSSID-elements.patch b/package/kernel/mac80211/patches/subsys/352-wifi-cfg80211-mac80211-reject-bad-MBSSID-elements.patch
-new file mode 100644
-index 0000000000..4c8e05e9ba
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/352-wifi-cfg80211-mac80211-reject-bad-MBSSID-elements.patch
-@@ -0,0 +1,47 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 28 Sep 2022 22:01:37 +0200
-+Subject: [PATCH] wifi: cfg80211/mac80211: reject bad MBSSID elements
-+
-+commit 8f033d2becc24aa6bfd2a5c104407963560caabc upstream
-+
-+Per spec, the maximum value for the MaxBSSID ('n') indicator is 8,
-+and the minimum is 1 since a multiple BSSID set with just one BSSID
-+doesn't make sense (the # of BSSIDs is limited by 2^n).
-+
-+Limit this in the parsing in both cfg80211 and mac80211, rejecting
-+any elements with an invalid value.
-+
-+This fixes potentially bad shifts in the processing of these inside
-+the cfg80211_gen_new_bssid() function later.
-+
-+I found this during the investigation of CVE-2022-41674 fixed by the
-+previous patch.
-+
-+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
-+Fixes: 78ac51f81532 ("mac80211: support multi-bssid")
-+Reviewed-by: Kees Cook <keescook@chromium.org>
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/util.c
-++++ b/net/mac80211/util.c
-+@@ -1413,6 +1413,8 @@ static size_t ieee802_11_find_bssid_prof
-+ 	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) {
-+ 		if (elem->datalen < 2)
-+ 			continue;
-++		if (elem->data[0] < 1 || elem->data[0] > 8)
-++			continue;
-+ 
-+ 		for_each_element(sub, elem->data + 1, elem->datalen - 1) {
-+ 			u8 new_bssid[ETH_ALEN];
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -2103,6 +2103,8 @@ static void cfg80211_parse_mbssid_data(s
-+ 	for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, ie, ielen) {
-+ 		if (elem->datalen < 4)
-+ 			continue;
-++		if (elem->data[0] < 1 || (int)elem->data[0] > 8)
-++			continue;
-+ 		for_each_element(sub, elem->data + 1, elem->datalen - 1) {
-+ 			u8 profile_len;
-+ 
-diff --git a/package/kernel/mac80211/patches/subsys/353-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch b/package/kernel/mac80211/patches/subsys/353-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch
-new file mode 100644
-index 0000000000..6e97150e90
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/353-wifi-mac80211-fix-MBSSID-parsing-use-after-free.patch
-@@ -0,0 +1,94 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 28 Sep 2022 22:07:15 +0200
-+Subject: [PATCH] wifi: mac80211: fix MBSSID parsing use-after-free
-+
-+commit ff05d4b45dd89b922578dac497dcabf57cf771c6
-+
-+When we parse a multi-BSSID element, we might point some
-+element pointers into the allocated nontransmitted_profile.
-+However, we free this before returning, causing UAF when the
-+relevant pointers in the parsed elements are accessed.
-+
-+Fix this by not allocating the scratch buffer separately but
-+as part of the returned structure instead, that way, there
-+are no lifetime issues with it.
-+
-+The scratch buffer introduction as part of the returned data
-+here is taken from MLO feature work done by Ilan.
-+
-+This fixes CVE-2022-42719.
-+
-+Fixes: 5023b14cf4df ("mac80211: support profile split between elements")
-+Co-developed-by: Ilan Peer <ilan.peer@intel.com>
-+Signed-off-by: Ilan Peer <ilan.peer@intel.com>
-+Reviewed-by: Kees Cook <keescook@chromium.org>
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/ieee80211_i.h
-++++ b/net/mac80211/ieee80211_i.h
-+@@ -1611,6 +1611,14 @@ struct ieee802_11_elems {
-+ 
-+ 	/* whether a parse error occurred while retrieving these elements */
-+ 	bool parse_error;
-++
-++	/*
-++	 * scratch buffer that can be used for various element parsing related
-++	 * tasks, e.g., element de-fragmentation etc.
-++	 */
-++	size_t scratch_len;
-++	u8 *scratch_pos;
-++	u8 scratch[];
-+ };
-+ 
-+ static inline struct ieee80211_local *hw_to_local(
-+--- a/net/mac80211/util.c
-++++ b/net/mac80211/util.c
-+@@ -1478,24 +1478,25 @@ struct ieee802_11_elems *ieee802_11_pars
-+ 	u8 *nontransmitted_profile;
-+ 	int nontransmitted_profile_len = 0;
-+ 
-+-	elems = kzalloc(sizeof(*elems), GFP_ATOMIC);
-++	elems = kzalloc(sizeof(*elems) + len, GFP_ATOMIC);
-+ 	if (!elems)
-+ 		return NULL;
-+ 	elems->ie_start = start;
-+ 	elems->total_len = len;
-+ 
-+-	nontransmitted_profile = kmalloc(len, GFP_ATOMIC);
-+-	if (nontransmitted_profile) {
-+-		nontransmitted_profile_len =
-+-			ieee802_11_find_bssid_profile(start, len, elems,
-+-						      transmitter_bssid,
-+-						      bss_bssid,
-+-						      nontransmitted_profile);
-+-		non_inherit =
-+-			cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
-+-					       nontransmitted_profile,
-+-					       nontransmitted_profile_len);
-+-	}
-++	elems->scratch_len = len;
-++	elems->scratch_pos = elems->scratch;
-++
-++	nontransmitted_profile = elems->scratch_pos;
-++	nontransmitted_profile_len =
-++		ieee802_11_find_bssid_profile(start, len, elems,
-++					      transmitter_bssid,
-++					      bss_bssid,
-++					      nontransmitted_profile);
-++	non_inherit =
-++		cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
-++				       nontransmitted_profile,
-++				       nontransmitted_profile_len);
-+ 
-+ 	crc = _ieee802_11_parse_elems_crc(start, len, action, elems, filter,
-+ 					  crc, non_inherit);
-+@@ -1524,8 +1525,6 @@ struct ieee802_11_elems *ieee802_11_pars
-+ 	    offsetofend(struct ieee80211_bssid_index, dtim_count))
-+ 		elems->dtim_count = elems->bssid_index->dtim_count;
-+ 
-+-	kfree(nontransmitted_profile);
-+-
-+ 	elems->crc = crc;
-+ 
-+ 	return elems;
-diff --git a/package/kernel/mac80211/patches/subsys/354-wifi-cfg80211-ensure-length-byte-is-present-before-a.patch b/package/kernel/mac80211/patches/subsys/354-wifi-cfg80211-ensure-length-byte-is-present-before-a.patch
-new file mode 100644
-index 0000000000..da94840dac
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/354-wifi-cfg80211-ensure-length-byte-is-present-before-a.patch
-@@ -0,0 +1,41 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Thu, 29 Sep 2022 21:50:44 +0200
-+Subject: [PATCH] wifi: cfg80211: ensure length byte is present before
-+ access
-+
-+commit 567e14e39e8f8c6997a1378bc3be615afca86063 upstream.
-+
-+When iterating the elements here, ensure the length byte is
-+present before checking it to see if the entire element will
-+fit into the buffer.
-+
-+Longer term, we should rewrite this code using the type-safe
-+element iteration macros that check all of this.
-+
-+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
-+Reported-by: Soenke Huster <shuster@seemoo.tu-darmstadt.de>
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -304,7 +304,8 @@ static size_t cfg80211_gen_new_ie(const
-+ 	tmp_old = cfg80211_find_ie(WLAN_EID_SSID, ie, ielen);
-+ 	tmp_old = (tmp_old) ? tmp_old + tmp_old[1] + 2 : ie;
-+ 
-+-	while (tmp_old + tmp_old[1] + 2 - ie <= ielen) {
-++	while (tmp_old + 2 - ie <= ielen &&
-++	       tmp_old + tmp_old[1] + 2 - ie <= ielen) {
-+ 		if (tmp_old[0] == 0) {
-+ 			tmp_old++;
-+ 			continue;
-+@@ -364,7 +365,8 @@ static size_t cfg80211_gen_new_ie(const
-+ 	 * copied to new ie, skip ssid, capability, bssid-index ie
-+ 	 */
-+ 	tmp_new = sub_copy;
-+-	while (tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
-++	while (tmp_new + 2 - sub_copy <= subie_len &&
-++	       tmp_new + tmp_new[1] + 2 - sub_copy <= subie_len) {
-+ 		if (!(tmp_new[0] == WLAN_EID_NON_TX_BSSID_CAP ||
-+ 		      tmp_new[0] == WLAN_EID_SSID)) {
-+ 			memcpy(pos, tmp_new, tmp_new[1] + 2);
-diff --git a/package/kernel/mac80211/patches/subsys/355-wifi-cfg80211-fix-BSS-refcounting-bugs.patch b/package/kernel/mac80211/patches/subsys/355-wifi-cfg80211-fix-BSS-refcounting-bugs.patch
-new file mode 100644
-index 0000000000..4680e1e815
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/355-wifi-cfg80211-fix-BSS-refcounting-bugs.patch
-@@ -0,0 +1,87 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Fri, 30 Sep 2022 23:44:23 +0200
-+Subject: [PATCH] wifi: cfg80211: fix BSS refcounting bugs
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+commit 0b7808818cb9df6680f98996b8e9a439fa7bcc2f upstream.
-+
-+There are multiple refcounting bugs related to multi-BSSID:
-+ - In bss_ref_get(), if the BSS has a hidden_beacon_bss, then
-+   the bss pointer is overwritten before checking for the
-+   transmitted BSS, which is clearly wrong. Fix this by using
-+   the bss_from_pub() macro.
-+
-+ - In cfg80211_bss_update() we copy the transmitted_bss pointer
-+   from tmp into new, but then if we release new, we'll unref
-+   it erroneously. We already set the pointer and ref it, but
-+   need to NULL it since it was copied from the tmp data.
-+
-+ - In cfg80211_inform_single_bss_data(), if adding to the non-
-+   transmitted list fails, we unlink the BSS and yet still we
-+   return it, but this results in returning an entry without
-+   a reference. We shouldn't return it anyway if it was broken
-+   enough to not get added there.
-+
-+This fixes CVE-2022-42720.
-+
-+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Fixes: a3584f56de1c ("cfg80211: Properly track transmitting and non-transmitting BSS")
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -143,18 +143,12 @@ static inline void bss_ref_get(struct cf
-+ 	lockdep_assert_held(&rdev->bss_lock);
-+ 
-+ 	bss->refcount++;
-+-	if (bss->pub.hidden_beacon_bss) {
-+-		bss = container_of(bss->pub.hidden_beacon_bss,
-+-				   struct cfg80211_internal_bss,
-+-				   pub);
-+-		bss->refcount++;
-+-	}
-+-	if (bss->pub.transmitted_bss) {
-+-		bss = container_of(bss->pub.transmitted_bss,
-+-				   struct cfg80211_internal_bss,
-+-				   pub);
-+-		bss->refcount++;
-+-	}
-++
-++	if (bss->pub.hidden_beacon_bss)
-++		bss_from_pub(bss->pub.hidden_beacon_bss)->refcount++;
-++
-++	if (bss->pub.transmitted_bss)
-++		bss_from_pub(bss->pub.transmitted_bss)->refcount++;
-+ }
-+ 
-+ static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
-+@@ -1743,6 +1737,8 @@ cfg80211_bss_update(struct cfg80211_regi
-+ 		new->refcount = 1;
-+ 		INIT_LIST_HEAD(&new->hidden_list);
-+ 		INIT_LIST_HEAD(&new->pub.nontrans_list);
-++		/* we'll set this later if it was non-NULL */
-++		new->pub.transmitted_bss = NULL;
-+ 
-+ 		if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
-+ 			hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
-+@@ -1983,10 +1979,15 @@ cfg80211_inform_single_bss_data(struct w
-+ 		spin_lock_bh(&rdev->bss_lock);
-+ 		if (cfg80211_add_nontrans_list(non_tx_data->tx_bss,
-+ 					       &res->pub)) {
-+-			if (__cfg80211_unlink_bss(rdev, res))
-++			if (__cfg80211_unlink_bss(rdev, res)) {
-+ 				rdev->bss_generation++;
-++				res = NULL;
-++			}
-+ 		}
-+ 		spin_unlock_bh(&rdev->bss_lock);
-++
-++		if (!res)
-++			return NULL;
-+ 	}
-+ 
-+ 	trace_cfg80211_return_bss(&res->pub);
-diff --git a/package/kernel/mac80211/patches/subsys/356-wifi-cfg80211-avoid-nontransmitted-BSS-list-corrupti.patch b/package/kernel/mac80211/patches/subsys/356-wifi-cfg80211-avoid-nontransmitted-BSS-list-corrupti.patch
-new file mode 100644
-index 0000000000..db0e51edc2
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/356-wifi-cfg80211-avoid-nontransmitted-BSS-list-corrupti.patch
-@@ -0,0 +1,48 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Sat, 1 Oct 2022 00:01:44 +0200
-+Subject: [PATCH] wifi: cfg80211: avoid nontransmitted BSS list
-+ corruption
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+commit bcca852027e5878aec911a347407ecc88d6fff7f upstream.
-+
-+If a non-transmitted BSS shares enough information (both
-+SSID and BSSID!) with another non-transmitted BSS of a
-+different AP, then we can find and update it, and then
-+try to add it to the non-transmitted BSS list. We do a
-+search for it on the transmitted BSS, but if it's not
-+there (but belongs to another transmitted BSS), the list
-+gets corrupted.
-+
-+Since this is an erroneous situation, simply fail the
-+list insertion in this case and free the non-transmitted
-+BSS.
-+
-+This fixes CVE-2022-42721.
-+
-+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -425,6 +425,15 @@ cfg80211_add_nontrans_list(struct cfg802
-+ 
-+ 	rcu_read_unlock();
-+ 
-++	/*
-++	 * This is a bit weird - it's not on the list, but already on another
-++	 * one! The only way that could happen is if there's some BSSID/SSID
-++	 * shared by multiple APs in their multi-BSSID profiles, potentially
-++	 * with hidden SSID mixed in ... ignore it.
-++	 */
-++	if (!list_empty(&nontrans_bss->nontrans_list))
-++		return -EINVAL;
-++
-+ 	/* add to the list */
-+ 	list_add_tail(&nontrans_bss->nontrans_list, &trans_bss->nontrans_list);
-+ 	return 0;
-diff --git a/package/kernel/mac80211/patches/subsys/357-wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-ra.patch b/package/kernel/mac80211/patches/subsys/357-wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-ra.patch
-new file mode 100644
-index 0000000000..ed834ff296
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/357-wifi-mac80211_hwsim-avoid-mac80211-warning-on-bad-ra.patch
-@@ -0,0 +1,31 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 5 Oct 2022 15:10:09 +0200
-+Subject: [PATCH] wifi: mac80211_hwsim: avoid mac80211 warning on bad
-+ rate
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+commit 1833b6f46d7e2830251a063935ab464256defe22 upstream.
-+
-+If the tool on the other side (e.g. wmediumd) gets confused
-+about the rate, we hit a warning in mac80211. Silence that
-+by effectively duplicating the check here and dropping the
-+frame silently (in mac80211 it's dropped with the warning).
-+
-+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/drivers/net/wireless/mac80211_hwsim.c
-++++ b/drivers/net/wireless/mac80211_hwsim.c
-+@@ -3760,6 +3760,8 @@ static int hwsim_cloned_frame_received_n
-+ 
-+ 	rx_status.band = channel->band;
-+ 	rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
-++	if (rx_status.rate_idx >= data2->hw->wiphy->bands[rx_status.band]->n_bitrates)
-++		goto out;
-+ 	rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
-+ 
-+ 	hdr = (void *)skb->data;
-diff --git a/package/kernel/mac80211/patches/subsys/358-wifi-mac80211-fix-crash-in-beacon-protection-for-P2P.patch b/package/kernel/mac80211/patches/subsys/358-wifi-mac80211-fix-crash-in-beacon-protection-for-P2P.patch
-new file mode 100644
-index 0000000000..44b8729977
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/358-wifi-mac80211-fix-crash-in-beacon-protection-for-P2P.patch
-@@ -0,0 +1,52 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 5 Oct 2022 21:24:10 +0200
-+Subject: [PATCH] wifi: mac80211: fix crash in beacon protection for
-+ P2P-device
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+commit b2d03cabe2b2e150ff5a381731ea0355459be09f upstream.
-+
-+If beacon protection is active but the beacon cannot be
-+decrypted or is otherwise malformed, we call the cfg80211
-+API to report this to userspace, but that uses a netdev
-+pointer, which isn't present for P2P-Device. Fix this to
-+call it only conditionally to ensure cfg80211 won't crash
-+in the case of P2P-Device.
-+
-+This fixes CVE-2022-42722.
-+
-+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Fixes: 9eaf183af741 ("mac80211: Report beacon protection failures to user space")
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/mac80211/rx.c
-++++ b/net/mac80211/rx.c
-+@@ -1986,10 +1986,11 @@ ieee80211_rx_h_decrypt(struct ieee80211_
-+ 
-+ 		if (mmie_keyidx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS ||
-+ 		    mmie_keyidx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
-+-		    NUM_DEFAULT_BEACON_KEYS) {
-+-			cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
-+-						     skb->data,
-+-						     skb->len);
-++				   NUM_DEFAULT_BEACON_KEYS) {
-++			if (rx->sdata->dev)
-++				cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
-++							     skb->data,
-++							     skb->len);
-+ 			return RX_DROP_MONITOR; /* unexpected BIP keyidx */
-+ 		}
-+ 
-+@@ -2137,7 +2138,8 @@ ieee80211_rx_h_decrypt(struct ieee80211_
-+ 	/* either the frame has been decrypted or will be dropped */
-+ 	status->flag |= RX_FLAG_DECRYPTED;
-+ 
-+-	if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE))
-++	if (unlikely(ieee80211_is_beacon(fc) && result == RX_DROP_UNUSABLE &&
-++		     rx->sdata->dev))
-+ 		cfg80211_rx_unprot_mlme_mgmt(rx->sdata->dev,
-+ 					     skb->data, skb->len);
-+ 
-diff --git a/package/kernel/mac80211/patches/subsys/359-wifi-cfg80211-update-hidden-BSSes-to-avoid-WARN_ON.patch b/package/kernel/mac80211/patches/subsys/359-wifi-cfg80211-update-hidden-BSSes-to-avoid-WARN_ON.patch
-new file mode 100644
-index 0000000000..c689fac854
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/359-wifi-cfg80211-update-hidden-BSSes-to-avoid-WARN_ON.patch
-@@ -0,0 +1,85 @@
-+From: Johannes Berg <johannes.berg@intel.com>
-+Date: Wed, 5 Oct 2022 23:11:43 +0200
-+Subject: [PATCH] wifi: cfg80211: update hidden BSSes to avoid WARN_ON
-+MIME-Version: 1.0
-+Content-Type: text/plain; charset=UTF-8
-+Content-Transfer-Encoding: 8bit
-+
-+commit c90b93b5b782891ebfda49d4e5da36632fefd5d1 upstream.
-+
-+When updating beacon elements in a non-transmitted BSS,
-+also update the hidden sub-entries to the same beacon
-+elements, so that a future update through other paths
-+won't trigger a WARN_ON().
-+
-+The warning is triggered because the beacon elements in
-+the hidden BSSes that are children of the BSS should
-+always be the same as in the parent.
-+
-+Reported-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Tested-by: Sönke Huster <shuster@seemoo.tu-darmstadt.de>
-+Fixes: 0b8fb8235be8 ("cfg80211: Parsing of Multiple BSSID information in scanning")
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+---
-+
-+--- a/net/wireless/scan.c
-++++ b/net/wireless/scan.c
-+@@ -1609,6 +1609,23 @@ struct cfg80211_non_tx_bss {
-+ 	u8 bssid_index;
-+ };
-+ 
-++static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
-++					 const struct cfg80211_bss_ies *new_ies,
-++					 const struct cfg80211_bss_ies *old_ies)
-++{
-++	struct cfg80211_internal_bss *bss;
-++
-++	/* Assign beacon IEs to all sub entries */
-++	list_for_each_entry(bss, &known->hidden_list, hidden_list) {
-++		const struct cfg80211_bss_ies *ies;
-++
-++		ies = rcu_access_pointer(bss->pub.beacon_ies);
-++		WARN_ON(ies != old_ies);
-++
-++		rcu_assign_pointer(bss->pub.beacon_ies, new_ies);
-++	}
-++}
-++
-+ static bool
-+ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
-+ 			  struct cfg80211_internal_bss *known,
-+@@ -1632,7 +1649,6 @@ cfg80211_update_known_bss(struct cfg8021
-+ 			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
-+ 	} else if (rcu_access_pointer(new->pub.beacon_ies)) {
-+ 		const struct cfg80211_bss_ies *old;
-+-		struct cfg80211_internal_bss *bss;
-+ 
-+ 		if (known->pub.hidden_beacon_bss &&
-+ 		    !list_empty(&known->hidden_list)) {
-+@@ -1660,16 +1676,7 @@ cfg80211_update_known_bss(struct cfg8021
-+ 		if (old == rcu_access_pointer(known->pub.ies))
-+ 			rcu_assign_pointer(known->pub.ies, new->pub.beacon_ies);
-+ 
-+-		/* Assign beacon IEs to all sub entries */
-+-		list_for_each_entry(bss, &known->hidden_list, hidden_list) {
-+-			const struct cfg80211_bss_ies *ies;
-+-
-+-			ies = rcu_access_pointer(bss->pub.beacon_ies);
-+-			WARN_ON(ies != old);
-+-
-+-			rcu_assign_pointer(bss->pub.beacon_ies,
-+-					   new->pub.beacon_ies);
-+-		}
-++		cfg80211_update_hidden_bsses(known, new->pub.beacon_ies, old);
-+ 
-+ 		if (old)
-+ 			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
-+@@ -2319,6 +2326,8 @@ cfg80211_update_notlisted_nontrans(struc
-+ 	} else {
-+ 		old = rcu_access_pointer(nontrans_bss->beacon_ies);
-+ 		rcu_assign_pointer(nontrans_bss->beacon_ies, new_ies);
-++		cfg80211_update_hidden_bsses(bss_from_pub(nontrans_bss),
-++					     new_ies, old);
-+ 		rcu_assign_pointer(nontrans_bss->ies, new_ies);
-+ 		if (old)
-+ 			kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
-diff --git a/package/kernel/mac80211/patches/subsys/360-mac80211-fix-a-memory-leak-where-sta_info-is-not-fre.patch b/package/kernel/mac80211/patches/subsys/360-mac80211-fix-a-memory-leak-where-sta_info-is-not-fre.patch
-new file mode 100644
-index 0000000000..ff3cb7be53
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/360-mac80211-fix-a-memory-leak-where-sta_info-is-not-fre.patch
-@@ -0,0 +1,77 @@
-+From 4db561ae4a90c2d0e15996634567559e292dc9e5 Mon Sep 17 00:00:00 2001
-+From: Ahmed Zaki <anzaki@gmail.com>
-+Date: Sat, 2 Oct 2021 08:53:29 -0600
-+Subject: [PATCH] mac80211: fix a memory leak where sta_info is not freed
-+
-+commit 8f9dcc29566626f683843ccac6113a12208315ca upstream.
-+
-+The following is from a system that went OOM due to a memory leak:
-+
-+wlan0: Allocated STA 74:83:c2:64:0b:87
-+wlan0: Allocated STA 74:83:c2:64:0b:87
-+wlan0: IBSS finish 74:83:c2:64:0b:87 (---from ieee80211_ibss_add_sta)
-+wlan0: Adding new IBSS station 74:83:c2:64:0b:87
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 2
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 3
-+wlan0: Inserted STA 74:83:c2:64:0b:87
-+wlan0: IBSS finish 74:83:c2:64:0b:87 (---from ieee80211_ibss_work)
-+wlan0: Adding new IBSS station 74:83:c2:64:0b:87
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 2
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 3
-+.
-+.
-+wlan0: expiring inactive not authorized STA 74:83:c2:64:0b:87
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 2
-+wlan0: moving STA 74:83:c2:64:0b:87 to state 1
-+wlan0: Removed STA 74:83:c2:64:0b:87
-+wlan0: Destroyed STA 74:83:c2:64:0b:87
-+
-+The ieee80211_ibss_finish_sta() is called twice on the same STA from 2
-+different locations. On the second attempt, the allocated STA is not
-+destroyed creating a kernel memory leak.
-+
-+This is happening because sta_info_insert_finish() does not call
-+sta_info_free() the second time when the STA already exists (returns
-+-EEXIST). Note that the caller sta_info_insert_rcu() assumes STA is
-+destroyed upon errors.
-+
-+Same fix is applied to -ENOMEM.
-+
-+Signed-off-by: Ahmed Zaki <anzaki@gmail.com>
-+Link: https://lore.kernel.org/r/20211002145329.3125293-1-anzaki@gmail.com
-+[change the error path label to use the existing code]
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+Signed-off-by: Viacheslav Sablin <sablin@ispras.ru>
-+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-+---
-+ net/mac80211/sta_info.c | 6 +++---
-+ 1 file changed, 3 insertions(+), 3 deletions(-)
-+
-+--- a/net/mac80211/sta_info.c
-++++ b/net/mac80211/sta_info.c
-+@@ -646,13 +646,13 @@ static int sta_info_insert_finish(struct
-+ 	/* check if STA exists already */
-+ 	if (sta_info_get_bss(sdata, sta->sta.addr)) {
-+ 		err = -EEXIST;
-+-		goto out_err;
-++		goto out_cleanup;
-+ 	}
-+ 
-+ 	sinfo = kzalloc(sizeof(struct station_info), GFP_KERNEL);
-+ 	if (!sinfo) {
-+ 		err = -ENOMEM;
-+-		goto out_err;
-++		goto out_cleanup;
-+ 	}
-+ 
-+ 	local->num_sta++;
-+@@ -708,8 +708,8 @@ static int sta_info_insert_finish(struct
-+  out_drop_sta:
-+ 	local->num_sta--;
-+ 	synchronize_net();
-++ out_cleanup:
-+ 	cleanup_single_sta(sta);
-+- out_err:
-+ 	mutex_unlock(&local->sta_mtx);
-+ 	kfree(sinfo);
-+ 	rcu_read_lock();
-diff --git a/package/kernel/mac80211/patches/subsys/361-wifi-mac80211-Don-t-finalize-CSA-in-IBSS-mode-if-sta.patch b/package/kernel/mac80211/patches/subsys/361-wifi-mac80211-Don-t-finalize-CSA-in-IBSS-mode-if-sta.patch
-new file mode 100644
-index 0000000000..dd3e934c00
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/361-wifi-mac80211-Don-t-finalize-CSA-in-IBSS-mode-if-sta.patch
-@@ -0,0 +1,47 @@
-+From 552ba102a6898630a7d16887f29e606d6fabe508 Mon Sep 17 00:00:00 2001
-+From: Siddh Raman Pant <code@siddh.me>
-+Date: Sun, 14 Aug 2022 20:45:12 +0530
-+Subject: [PATCH] wifi: mac80211: Don't finalize CSA in IBSS mode if state is
-+ disconnected
-+
-+commit 15bc8966b6d3a5b9bfe4c9facfa02f2b69b1e5f0 upstream.
-+
-+When we are not connected to a channel, sending channel "switch"
-+announcement doesn't make any sense.
-+
-+The BSS list is empty in that case. This causes the for loop in
-+cfg80211_get_bss() to be bypassed, so the function returns NULL
-+(check line 1424 of net/wireless/scan.c), causing the WARN_ON()
-+in ieee80211_ibss_csa_beacon() to get triggered (check line 500
-+of net/mac80211/ibss.c), which was consequently reported on the
-+syzkaller dashboard.
-+
-+Thus, check if we have an existing connection before generating
-+the CSA beacon in ieee80211_ibss_finish_csa().
-+
-+Cc: stable@vger.kernel.org
-+Fixes: cd7760e62c2a ("mac80211: add support for CSA in IBSS mode")
-+Link: https://syzkaller.appspot.com/bug?id=05603ef4ae8926761b678d2939a3b2ad28ab9ca6
-+Reported-by: syzbot+b6c9fe29aefe68e4ad34@syzkaller.appspotmail.com
-+Signed-off-by: Siddh Raman Pant <code@siddh.me>
-+Tested-by: syzbot+b6c9fe29aefe68e4ad34@syzkaller.appspotmail.com
-+Link: https://lore.kernel.org/r/20220814151512.9985-1-code@siddh.me
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-+---
-+ net/mac80211/ibss.c | 4 ++++
-+ 1 file changed, 4 insertions(+)
-+
-+--- a/net/mac80211/ibss.c
-++++ b/net/mac80211/ibss.c
-+@@ -534,6 +534,10 @@ int ieee80211_ibss_finish_csa(struct iee
-+ 
-+ 	sdata_assert_lock(sdata);
-+ 
-++	/* When not connected/joined, sending CSA doesn't make sense. */
-++	if (ifibss->state != IEEE80211_IBSS_MLME_JOINED)
-++		return -ENOLINK;
-++
-+ 	/* update cfg80211 bss information with the new channel */
-+ 	if (!is_zero_ether_addr(ifibss->bssid)) {
-+ 		cbss = cfg80211_get_bss(sdata->local->hw.wiphy,
-diff --git a/package/kernel/mac80211/patches/subsys/362-wifi-mac80211-Fix-UAF-in-ieee80211_scan_rx.patch b/package/kernel/mac80211/patches/subsys/362-wifi-mac80211-Fix-UAF-in-ieee80211_scan_rx.patch
-new file mode 100644
-index 0000000000..50b6b94fbf
---- /dev/null
-+++ b/package/kernel/mac80211/patches/subsys/362-wifi-mac80211-Fix-UAF-in-ieee80211_scan_rx.patch
-@@ -0,0 +1,55 @@
-+From 5d20c6f932f2758078d0454729129c894fe353e7 Mon Sep 17 00:00:00 2001
-+From: Siddh Raman Pant <code@siddh.me>
-+Date: Sat, 20 Aug 2022 01:33:40 +0530
-+Subject: [PATCH] wifi: mac80211: Fix UAF in ieee80211_scan_rx()
-+
-+commit 60deb9f10eec5c6a20252ed36238b55d8b614a2c upstream.
-+
-+ieee80211_scan_rx() tries to access scan_req->flags after a
-+null check, but a UAF is observed when the scan is completed
-+and __ieee80211_scan_completed() executes, which then calls
-+cfg80211_scan_done() leading to the freeing of scan_req.
-+
-+Since scan_req is rcu_dereference()'d, prevent the racing in
-+__ieee80211_scan_completed() by ensuring that from mac80211's
-+POV it is no longer accessed from an RCU read critical section
-+before we call cfg80211_scan_done().
-+
-+Cc: stable@vger.kernel.org
-+Link: https://syzkaller.appspot.com/bug?extid=f9acff9bf08a845f225d
-+Reported-by: syzbot+f9acff9bf08a845f225d@syzkaller.appspotmail.com
-+Suggested-by: Johannes Berg <johannes@sipsolutions.net>
-+Signed-off-by: Siddh Raman Pant <code@siddh.me>
-+Link: https://lore.kernel.org/r/20220819200340.34826-1-code@siddh.me
-+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-+---
-+ net/mac80211/scan.c | 11 +++++++----
-+ 1 file changed, 7 insertions(+), 4 deletions(-)
-+
-+--- a/net/mac80211/scan.c
-++++ b/net/mac80211/scan.c
-+@@ -465,16 +465,19 @@ static void __ieee80211_scan_completed(s
-+ 	scan_req = rcu_dereference_protected(local->scan_req,
-+ 					     lockdep_is_held(&local->mtx));
-+ 
-+-	if (scan_req != local->int_scan_req) {
-+-		local->scan_info.aborted = aborted;
-+-		cfg80211_scan_done(scan_req, &local->scan_info);
-+-	}
-+ 	RCU_INIT_POINTER(local->scan_req, NULL);
-+ 	RCU_INIT_POINTER(local->scan_sdata, NULL);
-+ 
-+ 	local->scanning = 0;
-+ 	local->scan_chandef.chan = NULL;
-+ 
-++	synchronize_rcu();
-++
-++	if (scan_req != local->int_scan_req) {
-++		local->scan_info.aborted = aborted;
-++		cfg80211_scan_done(scan_req, &local->scan_info);
-++	}
-++
-+ 	/* Set power back to normal operating levels. */
-+ 	ieee80211_hw_config(local, 0);
-+ 
 diff --git a/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch b/package/kernel/mac80211/patches/subsys/371-mac80211-don-t-apply-flow-control-on-management-fram.patch
 deleted file mode 100644
 index 0d3b42f3b9..0000000000
@@ -24091,7 +20327,7 @@ index c77bb9ec53..0000000000
 - #undef TRACE_INCLUDE_PATH
 diff --git a/package/kernel/mac80211/patches/subsys/385-mac80211-add-ieee80211_set_sar_specs.patch b/package/kernel/mac80211/patches/subsys/385-mac80211-add-ieee80211_set_sar_specs.patch
 deleted file mode 100644
-index c351bc812a..0000000000
+index 2d93f1e248..0000000000
 --- a/package/kernel/mac80211/patches/subsys/385-mac80211-add-ieee80211_set_sar_specs.patch
 +++ /dev/null
 @@ -1,51 +0,0 @@
@@ -24122,7 +20358,7 @@ index c351bc812a..0000000000
 - 				      struct ieee80211_sta *sta, bool enabled);
 ---- a/net/mac80211/cfg.c
 -+++ b/net/mac80211/cfg.c
--@@ -4136,6 +4136,17 @@ static int ieee80211_reset_tid_config(st
+-@@ -4133,6 +4133,17 @@ static int ieee80211_reset_tid_config(st
 - 	return ret;
 - }
 - 
@@ -24140,7 +20376,7 @@ index c351bc812a..0000000000
 - const struct cfg80211_ops mac80211_config_ops = {
 - 	.add_virtual_intf = ieee80211_add_iface,
 - 	.del_virtual_intf = ieee80211_del_iface,
--@@ -4239,4 +4250,5 @@ const struct cfg80211_ops mac80211_confi
+-@@ -4236,4 +4247,5 @@ const struct cfg80211_ops mac80211_confi
 - 	.probe_mesh_link = ieee80211_probe_mesh_link,
 - 	.set_tid_config = ieee80211_set_tid_config,
 - 	.reset_tid_config = ieee80211_reset_tid_config,
@@ -24671,7 +20907,7 @@ index b5fb5546ca..0000000000
 - #undef TRACE_INCLUDE_PATH
 diff --git a/package/kernel/mac80211/patches/subsys/388-mac80211-add-support-for-BSS-color-change.patch b/package/kernel/mac80211/patches/subsys/388-mac80211-add-support-for-BSS-color-change.patch
 deleted file mode 100644
-index 60e1c8f3c6..0000000000
+index efb974ddd6..0000000000
 --- a/package/kernel/mac80211/patches/subsys/388-mac80211-add-support-for-BSS-color-change.patch
 +++ /dev/null
 @@ -1,524 +0,0 @@
@@ -24856,7 +21092,7 @@ index 60e1c8f3c6..0000000000
 - 		if (err < 0) {
 - 			kfree(sdata->u.ap.next_beacon);
 - 			return err;
--@@ -3428,6 +3436,15 @@ static int ieee80211_set_csa_beacon(stru
+-@@ -3425,6 +3433,15 @@ static int ieee80211_set_csa_beacon(stru
 - 	return 0;
 - }
 - 
@@ -24872,7 +21108,7 @@ index 60e1c8f3c6..0000000000
 - static int
 - __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
 - 			   struct cfg80211_csa_settings *params)
--@@ -3496,6 +3513,10 @@ __ieee80211_channel_switch(struct wiphy
+-@@ -3493,6 +3510,10 @@ __ieee80211_channel_switch(struct wiphy
 - 		goto out;
 - 	}
 - 
@@ -24883,7 +21119,7 @@ index 60e1c8f3c6..0000000000
 - 	err = ieee80211_set_csa_beacon(sdata, params, &changed);
 - 	if (err) {
 - 		ieee80211_vif_unreserve_chanctx(sdata);
--@@ -4147,6 +4168,196 @@ static int ieee80211_set_sar_specs(struc
+-@@ -4144,6 +4165,196 @@ static int ieee80211_set_sar_specs(struc
 - 	return local->ops->set_sar_specs(&local->hw, sar);
 - }
 - 
@@ -25080,7 +21316,7 @@ index 60e1c8f3c6..0000000000
 - const struct cfg80211_ops mac80211_config_ops = {
 - 	.add_virtual_intf = ieee80211_add_iface,
 - 	.del_virtual_intf = ieee80211_del_iface,
--@@ -4251,4 +4462,5 @@ const struct cfg80211_ops mac80211_confi
+-@@ -4248,4 +4459,5 @@ const struct cfg80211_ops mac80211_confi
 - 	.set_tid_config = ieee80211_set_tid_config,
 - 	.reset_tid_config = ieee80211_reset_tid_config,
 - 	.set_sar_specs = ieee80211_set_sar_specs,
@@ -25901,7 +22137,7 @@ index 973d665002..0000000000
 - #undef TRACE_INCLUDE_PATH
 diff --git a/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch b/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch
 deleted file mode 100644
-index 031669b961..0000000000
+index 1d9416c239..0000000000
 --- a/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch
 +++ /dev/null
 @@ -1,196 +0,0 @@
@@ -25919,7 +22155,7 @@ index 031669b961..0000000000
 -
 ---- a/drivers/net/wireless/ath/ath11k/mac.c
 -+++ b/drivers/net/wireless/ath/ath11k/mac.c
--@@ -3633,7 +3633,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee
+-@@ -3648,7 +3648,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee
 - 	    IEEE80211_HE_MAC_CAP4_BQR;
 - 	he_cap_elem->mac_cap_info[4] &= ~m;
 - 
@@ -25928,7 +22164,7 @@ index 031669b961..0000000000
 - 	    IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU |
 - 	    IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING |
 - 	    IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX;
--@@ -3643,7 +3643,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee
+-@@ -3658,7 +3658,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee
 - 	    IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
 - 	he_cap_elem->phy_cap_info[2] &= ~m;
 - 
@@ -25937,7 +22173,7 @@ index 031669b961..0000000000
 - 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK |
 - 	    IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK;
 - 	he_cap_elem->phy_cap_info[3] &= ~m;
--@@ -3655,13 +3655,13 @@ ath11k_mac_filter_he_cap_mesh(struct iee
+-@@ -3670,13 +3670,13 @@ ath11k_mac_filter_he_cap_mesh(struct iee
 - 	he_cap_elem->phy_cap_info[5] &= ~m;
 - 
 - 	m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
@@ -26103,7 +22339,7 @@ index 031669b961..0000000000
 - 				.phy_cap_info[8] =
 diff --git a/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch b/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch
 deleted file mode 100644
-index e90177e379..0000000000
+index e2811302c6..0000000000
 --- a/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch
 +++ /dev/null
 @@ -1,113 +0,0 @@
@@ -26184,7 +22420,7 @@ index e90177e379..0000000000
 - 
 ---- a/drivers/net/wireless/mac80211_hwsim.c
 -+++ b/drivers/net/wireless/mac80211_hwsim.c
--@@ -2759,7 +2759,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2764,7 +2764,7 @@ static const struct ieee80211_sband_ifty
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
 - 					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
@@ -26193,7 +22429,7 @@ index e90177e379..0000000000
 - 				.phy_cap_info[1] =
 - 					IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
 - 					IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
--@@ -2803,7 +2803,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2808,7 +2808,7 @@ static const struct ieee80211_sband_ifty
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
 - 					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
@@ -26202,7 +22438,7 @@ index e90177e379..0000000000
 - 				.phy_cap_info[1] =
 - 					IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
 - 					IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
--@@ -2849,7 +2849,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2854,7 +2854,7 @@ static const struct ieee80211_sband_ifty
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
 - 					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
@@ -26211,7 +22447,7 @@ index e90177e379..0000000000
 - 				.phy_cap_info[0] =
 - 					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
 - 					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
--@@ -2897,7 +2897,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2902,7 +2902,7 @@ static const struct ieee80211_sband_ifty
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
 - 					IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2,
@@ -26222,7 +22458,7 @@ index e90177e379..0000000000
 - 					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
 diff --git a/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch b/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch
 deleted file mode 100644
-index ecd544324c..0000000000
+index 9327fa1173..0000000000
 --- a/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch
 +++ /dev/null
 @@ -1,148 +0,0 @@
@@ -26275,7 +22511,7 @@ index ecd544324c..0000000000
 - 				.mac_cap_info[5] =
 ---- a/drivers/net/wireless/mac80211_hwsim.c
 -+++ b/drivers/net/wireless/mac80211_hwsim.c
--@@ -2758,7 +2758,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2763,7 +2763,7 @@ static const struct ieee80211_sband_ifty
 - 					IEEE80211_HE_MAC_CAP2_ACK_EN,
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
@@ -26284,7 +22520,7 @@ index ecd544324c..0000000000
 - 				.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
 - 				.phy_cap_info[1] =
 - 					IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
--@@ -2802,7 +2802,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2807,7 +2807,7 @@ static const struct ieee80211_sband_ifty
 - 					IEEE80211_HE_MAC_CAP2_ACK_EN,
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
@@ -26293,7 +22529,7 @@ index ecd544324c..0000000000
 - 				.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
 - 				.phy_cap_info[1] =
 - 					IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
--@@ -2848,7 +2848,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2853,7 +2853,7 @@ static const struct ieee80211_sband_ifty
 - 					IEEE80211_HE_MAC_CAP2_ACK_EN,
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
@@ -26302,7 +22538,7 @@ index ecd544324c..0000000000
 - 				.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
 - 				.phy_cap_info[0] =
 - 					IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
--@@ -2896,7 +2896,7 @@ static const struct ieee80211_sband_ifty
+-@@ -2901,7 +2901,7 @@ static const struct ieee80211_sband_ifty
 - 					IEEE80211_HE_MAC_CAP2_ACK_EN,
 - 				.mac_cap_info[3] =
 - 					IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
@@ -26417,7 +22653,7 @@ index cd91a925f3..0000000000
 - 	CALL_TXH(ieee80211_tx_h_fragment);
 diff --git a/package/kernel/mac80211/patches/subsys/397-disable-mbssid.patch b/package/kernel/mac80211/patches/subsys/397-disable-mbssid.patch
 deleted file mode 100644
-index c4a8d30d7c..0000000000
+index 1582be891b..0000000000
 --- a/package/kernel/mac80211/patches/subsys/397-disable-mbssid.patch
 +++ /dev/null
 @@ -1,44 +0,0 @@
@@ -26433,7 +22669,7 @@ index c4a8d30d7c..0000000000
 - 			continue;
 ---- a/net/wireless/scan.c
 -+++ b/net/wireless/scan.c
--@@ -2010,6 +2010,7 @@ static const struct element
+-@@ -2012,6 +2012,7 @@ static const struct element
 - 	const struct element *next_mbssid;
 - 	const struct element *next_sub;
 - 
@@ -26441,7 +22677,7 @@ index c4a8d30d7c..0000000000
 - 	next_mbssid = cfg80211_find_elem(WLAN_EID_MULTIPLE_BSSID,
 - 					 mbssid_end,
 - 					 ielen - (mbssid_end - ie));
--@@ -2091,6 +2092,7 @@ static void cfg80211_parse_mbssid_data(s
+-@@ -2093,6 +2094,7 @@ static void cfg80211_parse_mbssid_data(s
 - 	u16 capability;
 - 	struct cfg80211_bss *bss;
 - 
@@ -26449,7 +22685,7 @@ index c4a8d30d7c..0000000000
 - 	if (!non_tx_data)
 - 		return;
 - 	if (!cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ie, ielen))
--@@ -2251,6 +2253,7 @@ cfg80211_update_notlisted_nontrans(struc
+-@@ -2253,6 +2255,7 @@ cfg80211_update_notlisted_nontrans(struc
 - 	const struct cfg80211_bss_ies *old;
 - 	size_t cpy_len;
 - 
@@ -26457,7 +22693,7 @@ index c4a8d30d7c..0000000000
 - 	lockdep_assert_held(&wiphy_to_rdev(wiphy)->bss_lock);
 - 
 - 	ie = mgmt->u.probe_resp.variable;
--@@ -2468,6 +2471,7 @@ cfg80211_inform_bss_frame_data(struct wi
+-@@ -2470,6 +2473,7 @@ cfg80211_inform_bss_frame_data(struct wi
 - 
 - 	res = cfg80211_inform_single_bss_frame_data(wiphy, data, mgmt,
 - 						    len, gfp);
@@ -26479,7 +22715,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 4a0bb1a933..50c24a7746 100644
+index fe23a289d3..50c24a7746 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 @@
@@ -26566,7 +22802,7 @@ index 4a0bb1a933..50c24a7746 100644
 - 				  const u8 *addr)
 + static void ieee80211_rfkill_poll(struct wiphy *wiphy)
   {
--@@ -4413,6 +4426,7 @@ const struct cfg80211_ops mac80211_confi
+-@@ -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
   	.set_wiphy_params = ieee80211_set_wiphy_params,
@@ -26674,6 +22910,34 @@ 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
-- 
GitLab