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