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(®, 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(®, 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(®, 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(®, 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, ¶ms.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