mac80211: update to version 6.14.5

namiltd namiltd at yahoo.com
Tue Jun 24 23:59:35 PDT 2025


 From 174aece047fc78687b701bd795ee3d909bf1ae2a Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Sat, 24 May 2025 14:58:18 +0200
Subject: [PATCH 01/14] mac80211: update to version 6.14.5

Update to version 6.14.5

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  package/kernel/mac80211/Makefile | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/package/kernel/mac80211/Makefile 
b/package/kernel/mac80211/Makefile
index c3ffb8dc06ca7c..2b3d7750201cbe 100644
--- a/package/kernel/mac80211/Makefile
+++ b/package/kernel/mac80211/Makefile
@@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk

  PKG_NAME:=mac80211

-PKG_VERSION:=6.12.6
-PKG_RELEASE:=2
+PKG_VERSION:=6.14.5
+PKG_RELEASE:=1
  PKG_LICENSE:=GPL-2.0-only
  PKG_LICENSE_FILES:=COPYING

  PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources/
-PKG_HASH:=28ec39425a1b3270e1422d92a8131a6a3d8919cc13e8ee250c315e55d922ba68
+PKG_HASH:=520e4a90a4cbd364559c9b8c2fbc4beaffb30b8574b418c6425bb8cd27e8b0ef

  PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
  PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if 
$(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)

 From b53839fbbd56f7d13e12d893a4419ebe1a91eee3 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Sun, 8 Jun 2025 17:11:13 +0200
Subject: [PATCH 02/14] mac80211: drop patches accepted upstream

Drop patches accepted upstream

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  ...allocation-to-resolve-SWIOTLB-issues.patch |   91 -
  ...i-ath12k-fix-handling-of-6-GHz-rules.patch |  140 -
  ...-fix-linux-acpi_amd_wbrf.h-inclusion.patch |   32 -
  ...w88-Constify-some-arrays-and-structs.patch |  374 ---
  ...-the-RX-descriptor-with-a-single-fun.patch |  560 ----
  ...tor-looping-in-rtw_phy_store_tx_powe.patch |   34 -
  ...t-the-signal-strength-only-if-it-s-k.patch |   39 -
  ...ome-definitions-for-RTL8821AU-RTL881.patch |  490 ---
  ...-the-HW-features-only-for-some-chips.patch |   93 -
  ...-Allow-different-C2H-RA-report-sizes.patch |  175 -
  ...d-the-init-table-parsing-for-RTL8812.patch |  165 -
  ...-rtw_chip_info.ltecoex_addr-to-be-NU.patch |   58 -
  ...ach-driver-control-the-power-on-off-.patch |  272 --
  ...e-data-rate-fallback-for-older-chips.patch |  194 --
  ...w88-Make-txagc_remnant_ofdm-an-array.patch |   85 -
  ...upport-TX-page-sizes-bigger-than-128.patch |  115 -
  ...-pwr_track_tbl-to-struct-rtw_rfe_def.patch |  297 --
  ...et-pkt_info.ls-for-the-reserved-page.patch |   27 -
  ...t-beacon-loss-with-chips-other-than-.patch |   63 -
  ...x-Support-chips-without-a-scoreboard.patch |   66 -
  ...1a-Regularly-ask-for-BT-info-updates.patch |   67 -
  ...ifi-rtw88-8812a-Mitigate-beacon-loss.patch |   37 -
  ...3-wifi-rtw88-Add-rtw8812a_table.-c-h.patch | 2862 -----------------
  ...3-wifi-rtw88-Add-rtw8821a_table.-c-h.patch | 2395 --------------
  ...1-v6.13-wifi-rtw88-Add-rtw88xxa.-c-h.patch | 2187 -------------
  ...2-v6.13-wifi-rtw88-Add-rtw8821a.-c-h.patch | 1230 -------
  ...3-v6.13-wifi-rtw88-Add-rtw8812a.-c-h.patch | 1135 -------
  ...tw88-Add-rtw8821au.c-and-rtw8812au.c.patch |   80 -
  ...e-the-new-RTL8821AU-RTL8812AU-driver.patch |  153 -
  ...u-Add-additional-devices-to-the-USB_.patch |   79 -
  ...ifi-rtw88-8812au-Add-more-device-IDs.patch |   93 -
  ...Add-additional-USB-IDs-for-RTL8812BU.patch |   33 -
  ...w88-usb-Support-USB-3-with-RTL8812AU.patch |   85 -
  ...8821ae-phy-restore-removed-code-to-f.patch |   34 -
  ...nable-RX-aggregation-for-8821au-8812.patch |   65 -
  ..._packed-attribute-to-efuse-layout-st.patch |  195 --
  ...-wifi-rtw88-8812a-Support-RFE-type-2.patch |   28 -
  ...8821a-8812a-Set-ptct_efuse_size-to-0.patch |   51 -
  ...b-Copy-instead-of-cloning-the-RX-skb.patch |  130 -
  ...wifi-rtw88-Add-USB-PHY-configuration.patch |  141 -
  ...e-rf_type-member-of-struct-rtw_sta_i.patch |   60 -
  ...14-wifi-rtw88-8703b-Fix-RX-TX-issues.patch |   59 -
  ...-Fix-disconnection-after-beacon-loss.patch |   31 -
  ...i-rtw88-Add-support-for-LED-blinking.patch |  424 ---
  ...TW88_LEDS-depends-on-LEDS_CLASS-to-K.patch |   73 -
  ...upport-for-Mercusys-MA30N-and-D-Link.patch |   31 -
  ...ll-rate_control_rate_update-for-link.patch |  548 ----
  ...11-add-option-for-vif-allowed-radios.patch |  309 --
  ...e-vif-radio-mask-to-limit-ibss-scan-.patch |   79 -
  ...e-vif-radio-mask-to-limit-chanctx-an.patch |   52 -
  ...11-remove-status-ampdu_delimiter_crc.patch |   67 -
  ...s-net_device-to-.set_monitor_channel.patch |  165 -
  ...d-flag-to-opt-out-of-virtual-monitor.patch |  337 --
  ...fi-cfg80211-add-monitor-SKIP_TX-flag.patch |   56 -
  ...d-support-for-the-monitor-SKIP_TX-fl.patch |   54 -
  ...c80211-refactor-ieee80211_rx_monitor.patch |   94 -
  ...lter-on-monitor-interfaces-based-on-.patch |   29 -
  ...-report-per-wiphy-radio-antenna-mask.patch |   64 -
  ...x-vif-addr-when-switching-from-monit.patch |   63 -
  59 files changed, 17045 deletions(-)
  delete mode 100644 
package/kernel/mac80211/patches/ath11k/001-wifi-ath11k-Fix-DMA-buffer-allocation-to-resolve-SWIOTLB-issues.patch
  delete mode 100644 
package/kernel/mac80211/patches/ath12k/003-wifi-ath12k-fix-handling-of-6-GHz-rules.patch
  delete mode 100644 
package/kernel/mac80211/patches/build/110-backport-include-fix-linux-acpi_amd_wbrf.h-inclusion.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/017-v6.13-wifi-rtw88-Constify-some-arrays-and-structs.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/019-v6.13-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/022-v6.13-wifi-rtw88-Refactor-looping-in-rtw_phy_store_tx_powe.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/023-v6.13-wifi-rtw88-Report-the-signal-strength-only-if-it-s-k.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/024-v6.13-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/025-v6.13-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/026-v6.13-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/027-v6.13-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/028-v6.13-wifi-rtw88-Allow-rtw_chip_info.ltecoex_addr-to-be-NU.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/029-v6.13-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/030-v6.13-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/031-v6.13-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/032-v6.13-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/033-v6.13-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/034-v6.13-wifi-rtw88-usb-Set-pkt_info.ls-for-the-reserved-page.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/035-v6.13-wifi-rtw88-Detect-beacon-loss-with-chips-other-than-.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/036-v6.13-wifi-rtw88-coex-Support-chips-without-a-scoreboard.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/037-v6.13-wifi-rtw88-8821a-Regularly-ask-for-BT-info-updates.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/038-v6.13-wifi-rtw88-8812a-Mitigate-beacon-loss.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/039-v6.13-wifi-rtw88-Add-rtw8812a_table.-c-h.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/040-v6.13-wifi-rtw88-Add-rtw8821a_table.-c-h.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/041-v6.13-wifi-rtw88-Add-rtw88xxa.-c-h.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/042-v6.13-wifi-rtw88-Add-rtw8821a.-c-h.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/043-v6.13-wifi-rtw88-Add-rtw8812a.-c-h.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/044-v6.13-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/046-v6.14-wifi-rtw88-8821au-Add-additional-devices-to-the-USB_.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/047-v6.14-wifi-rtw88-8812au-Add-more-device-IDs.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/048-v6.14-wifi-rtw88-Add-additional-USB-IDs-for-RTL8812BU.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/049-v6.14-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/050-v6.14-wifi-rtlwifi-rtl8821ae-phy-restore-removed-code-to-f.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/051-v6.14-wifi-rtw88-usb-Enable-RX-aggregation-for-8821au-8812.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/052-v6.14-wifi-rtw88-add-__packed-attribute-to-efuse-layout-st.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/053-v6.14-wifi-rtw88-8812a-Support-RFE-type-2.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/054-v6.14-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/055-v6.14-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/058-v6.14-wifi-rtw88-Add-USB-PHY-configuration.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/059-v6.14-wifi-rtw88-Delete-rf_type-member-of-struct-rtw_sta_i.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/060-v6.14-wifi-rtw88-8703b-Fix-RX-TX-issues.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/061-v6.14-wifi-rtw88-sdio-Fix-disconnection-after-beacon-loss.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/062-v6.14-wifi-rtw88-Add-support-for-LED-blinking.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/063-v6.14-wifi-rtw88-add-RTW88_LEDS-depends-on-LEDS_CLASS-to-K.patch
  delete mode 100644 
package/kernel/mac80211/patches/rtl/076-v6.14-wifi-rtw88-Add-support-for-Mercusys-MA30N-and-D-Link.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/306-wifi-mac80211-call-rate_control_rate_update-for-link.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/330-wifi-cfg80211-add-option-for-vif-allowed-radios.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/331-wifi-mac80211-use-vif-radio-mask-to-limit-ibss-scan-.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/332-wifi-mac80211-use-vif-radio-mask-to-limit-chanctx-an.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/333-wifi-mac80211-remove-status-ampdu_delimiter_crc.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/334-wifi-cfg80211-pass-net_device-to-.set_monitor_channel.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-flag-to-opt-out-of-virtual-monitor.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/336-wifi-cfg80211-add-monitor-SKIP_TX-flag.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/337-wifi-mac80211-add-support-for-the-monitor-SKIP_TX-fl.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/338-wifi-mac80211-refactor-ieee80211_rx_monitor.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/339-wifi-mac80211-filter-on-monitor-interfaces-based-on-.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/340-wifi-cfg80211-report-per-wiphy-radio-antenna-mask.patch
  delete mode 100644 
package/kernel/mac80211/patches/subsys/341-wifi-mac80211-fix-vif-addr-when-switching-from-monit.patch

diff --git 
a/package/kernel/mac80211/patches/ath11k/001-wifi-ath11k-Fix-DMA-buffer-allocation-to-resolve-SWIOTLB-issues.patch 
b/package/kernel/mac80211/patches/ath11k/001-wifi-ath11k-Fix-DMA-buffer-allocation-to-resolve-SWIOTLB-issues.patch
deleted file mode 100644
index d5d80a395d75e8..00000000000000
--- 
a/package/kernel/mac80211/patches/ath11k/001-wifi-ath11k-Fix-DMA-buffer-allocation-to-resolve-SWIOTLB-issues.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-wifi: ath11k: Fix DMA buffer allocation to resolve SWIOTLB issues
-Currently, the driver allocates cacheable DMA buffers for rings like
-HAL_REO_DST and HAL_WBM2SW_RELEASE. The buffers for HAL_WBM2SW_RELEASE
-are large (1024 KiB), exceeding the SWIOTLB slot size of 256 KiB. This
-leads to "swiotlb buffer is full" error messages on systems without an
-IOMMU that use SWIOTLB, causing driver initialization failures. The driver
-calls dma_map_single() with these large buffers obtained from kzalloc(),
-resulting in ring initialization errors on systems without an IOMMU that
-use SWIOTLB.
-
-To address these issues, replace the flawed buffer allocation mechanism
-with the appropriate DMA API. Specifically, use dma_alloc_noncoherent()
-for cacheable DMA buffers, ensuring proper freeing of buffers with
-dma_free_noncoherent().
-
-Error log:
-[   10.194343] ath11k_pci 0000:04:00.0: swiotlb buffer is full 
(sz:1048583 bytes), total 32768 (slots), used 2529 (slots)
-[   10.194406] ath11k_pci 0000:04:00.0: failed to set up tcl_comp ring 
(0) :-12
-[   10.194781] ath11k_pci 0000:04:00.0: failed to init DP: -12
-
-Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
-Tested-on: WCN6855 hw2.0 PCI 
WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
-
-Reported-by: Tim Harvey <tharvey at gateworks.com>
-Closes: https://lore.kernel.org/all/20241210041133.GA17116@lst.de/
-Signed-off-by: P Praneesh <quic_ppranees at quicinc.com>
-Tested-by: Tim Harvey <tharvey at gateworks.com>
-Link: 
https://patch.msgid.link/20250119164219.647059-2-quic_ppranees@quicinc.com
-Signed-off-by: Jeff Johnson <jeff.johnson at oss.qualcomm.com>
---- a/drivers/net/wireless/ath/ath11k/dp.c
-+++ b/drivers/net/wireless/ath/ath11k/dp.c
-@@ -1,7 +1,7 @@
- // SPDX-License-Identifier: BSD-3-Clause-Clear
- /*
-  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
-- * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights 
reserved.
-+ * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights 
reserved.
-  */
-
- #include <crypto/hash.h>
-@@ -104,14 +104,12 @@ void ath11k_dp_srng_cleanup(struct ath11
-     if (!ring->vaddr_unaligned)
-         return;
-
--    if (ring->cached) {
--        dma_unmap_single(ab->dev, ring->paddr_unaligned, ring->size,
--                 DMA_FROM_DEVICE);
--        kfree(ring->vaddr_unaligned);
--    } else {
-+    if (ring->cached)
-+        dma_free_noncoherent(ab->dev, ring->size, ring->vaddr_unaligned,
-+                     ring->paddr_unaligned, DMA_FROM_DEVICE);
-+    else
-         dma_free_coherent(ab->dev, ring->size, ring->vaddr_unaligned,
-                   ring->paddr_unaligned);
--    }
-
-     ring->vaddr_unaligned = NULL;
- }
-@@ -249,25 +247,14 @@ int ath11k_dp_srng_setup(struct ath11k_b
-         default:
-             cached = false;
-         }
--
--        if (cached) {
--            ring->vaddr_unaligned = kzalloc(ring->size, GFP_KERNEL);
--            if (!ring->vaddr_unaligned)
--                return -ENOMEM;
--
--            ring->paddr_unaligned = dma_map_single(ab->dev,
--                                   ring->vaddr_unaligned,
--                                   ring->size,
--                                   DMA_FROM_DEVICE);
--            if (dma_mapping_error(ab->dev, ring->paddr_unaligned)) {
--                kfree(ring->vaddr_unaligned);
--                ring->vaddr_unaligned = NULL;
--                return -ENOMEM;
--            }
--        }
-     }
-
--    if (!cached)
-+    if (cached)
-+        ring->vaddr_unaligned = dma_alloc_noncoherent(ab->dev, ring->size,
-+                                  &ring->paddr_unaligned,
-+                                  DMA_FROM_DEVICE,
-+                                  GFP_KERNEL);
-+    else
-         ring->vaddr_unaligned = dma_alloc_coherent(ab->dev, ring->size,
-                                &ring->paddr_unaligned,
-                                GFP_KERNEL);
diff --git 
a/package/kernel/mac80211/patches/ath12k/003-wifi-ath12k-fix-handling-of-6-GHz-rules.patch 
b/package/kernel/mac80211/patches/ath12k/003-wifi-ath12k-fix-handling-of-6-GHz-rules.patch
deleted file mode 100644
index 8df49d38d31407..00000000000000
--- 
a/package/kernel/mac80211/patches/ath12k/003-wifi-ath12k-fix-handling-of-6-GHz-rules.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-From 64a1ba4072b34af1b76bf15fca5c2075b8cc4d64 Mon Sep 17 00:00:00 2001
-From: Aditya Kumar Singh <aditya.kumar.singh at oss.qualcomm.com>
-Date: Thu, 23 Jan 2025 21:51:38 +0530
-Subject: [PATCH] wifi: ath12k: fix handling of 6 GHz rules
-
-In the US country code, to avoid including 6 GHz rules in the 5 GHz rules
-list, the number of 5 GHz rules is set to a default constant value of 4
-(REG_US_5G_NUM_REG_RULES). However, if there are more than 4 valid 5 GHz
-rules, the current logic will bypass the legitimate 6 GHz rules.
-
-For example, if there are 5 valid 5 GHz rules and 1 valid 6 GHz rule, the
-current logic will only consider 4 of the 5 GHz rules, treating the last
-valid rule as a 6 GHz rule. Consequently, the actual 6 GHz rule is never
-processed, leading to the eventual disabling of 6 GHz channels.
-
-To fix this issue, instead of hardcoding the value to 4, use a helper
-function to determine the number of 6 GHz rules present in the 5 GHz rules
-list and ignore only those rules.
-
-Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
-
-Cc: stable at vger.kernel.org
-Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
-Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh at oss.qualcomm.com>
-Link: 
https://patch.msgid.link/20250123-fix_6ghz_rules_handling-v1-1-d734bfa58ff4@oss.qualcomm.com
-Signed-off-by: Jeff Johnson <jeff.johnson at oss.qualcomm.com>
----
- drivers/net/wireless/ath/ath12k/wmi.c | 61 
++++++++++++++++++++++++++---------
- drivers/net/wireless/ath/ath12k/wmi.h |  1 -
- 2 files changed, 45 insertions(+), 17 deletions(-)
-
---- a/drivers/net/wireless/ath/ath12k/wmi.c
-+++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -4790,6 +4790,22 @@ static struct ath12k_reg_rule
-     return reg_rule_ptr;
- }
-
-+static u8 ath12k_wmi_ignore_num_extra_rules(struct 
ath12k_wmi_reg_rule_ext_params *rule,
-+                        u32 num_reg_rules)
-+{
-+    u8 num_invalid_5ghz_rules = 0;
-+    u32 count, start_freq;
-+
-+    for (count = 0; count < num_reg_rules; count++) {
-+        start_freq = le32_get_bits(rule[count].freq_info, 
REG_RULE_START_FREQ);
-+
-+        if (start_freq >= ATH12K_MIN_6G_FREQ)
-+            num_invalid_5ghz_rules++;
-+    }
-+
-+    return num_invalid_5ghz_rules;
-+}
-+
- static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab,
-                            struct sk_buff *skb,
-                            struct ath12k_reg_info *reg_info)
-@@ -4800,6 +4816,7 @@ static int ath12k_pull_reg_chan_list_ext
-     u32 num_2g_reg_rules, num_5g_reg_rules;
-     u32 num_6g_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE];
-     u32 
num_6g_reg_rules_cl[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
-+    u8 num_invalid_5ghz_ext_rules;
-     u32 total_reg_rules = 0;
-     int ret, i, j;
-
-@@ -4893,20 +4910,6 @@ static int ath12k_pull_reg_chan_list_ext
-
-     memcpy(reg_info->alpha2, &ev->alpha2, REG_ALPHA2_LEN);
-
--    /* FIXME: Currently FW includes 6G reg rule also in 5G rule
--     * list for country US.
--     * Having same 6G reg rule in 5G and 6G rules list causes
--     * intersect check to be true, and same rules will be shown
--     * multiple times in iw cmd. So added hack below to avoid
--     * parsing 6G rule from 5G reg rule list, and this can be
--     * removed later, after FW updates to remove 6G reg rule
--     * from 5G rules list.
--     */
--    if (memcmp(reg_info->alpha2, "US", 2) == 0) {
--        reg_info->num_5g_reg_rules = REG_US_5G_NUM_REG_RULES;
--        num_5g_reg_rules = reg_info->num_5g_reg_rules;
--    }
--
-     reg_info->dfs_region = le32_to_cpu(ev->dfs_region);
-     reg_info->phybitmap = le32_to_cpu(ev->phybitmap);
-     reg_info->num_phy = le32_to_cpu(ev->num_phy);
-@@ -5009,8 +5012,29 @@ static int ath12k_pull_reg_chan_list_ext
-         }
-     }
-
-+    ext_wmi_reg_rule += num_2g_reg_rules;
-+
-+    /* Firmware might include 6 GHz reg rule in 5 GHz rule list
-+     * for few countries along with separate 6 GHz rule.
-+     * Having same 6 GHz reg rule in 5 GHz and 6 GHz rules list
-+     * causes intersect check to be true, and same rules will be
-+     * shown multiple times in iw cmd.
-+     * Hence, avoid parsing 6 GHz rule from 5 GHz reg rule list
-+     */
-+    num_invalid_5ghz_ext_rules = 
ath12k_wmi_ignore_num_extra_rules(ext_wmi_reg_rule,
-+                                       num_5g_reg_rules);
-+
-+    if (num_invalid_5ghz_ext_rules) {
-+        ath12k_dbg(ab, ATH12K_DBG_WMI,
-+               "CC: %s 5 GHz reg rules number %d from fw, %d number of 
invalid 5 GHz rules",
-+               reg_info->alpha2, reg_info->num_5g_reg_rules,
-+               num_invalid_5ghz_ext_rules);
-+
-+        num_5g_reg_rules = num_5g_reg_rules - num_invalid_5ghz_ext_rules;
-+        reg_info->num_5g_reg_rules = num_5g_reg_rules;
-+    }
-+
-     if (num_5g_reg_rules) {
--        ext_wmi_reg_rule += num_2g_reg_rules;
-         reg_info->reg_rules_5g_ptr =
-             create_ext_reg_rules_from_wmi(num_5g_reg_rules,
-                               ext_wmi_reg_rule);
-@@ -5022,7 +5046,12 @@ static int ath12k_pull_reg_chan_list_ext
-         }
-     }
-
--    ext_wmi_reg_rule += num_5g_reg_rules;
-+    /* We have adjusted the number of 5 GHz reg rules above. But still 
those
-+     * many rules needs to be adjusted in ext_wmi_reg_rule.
-+     *
-+     * NOTE: num_invalid_5ghz_ext_rules will be 0 for rest other cases.
-+     */
-+    ext_wmi_reg_rule += (num_5g_reg_rules + num_invalid_5ghz_ext_rules);
-
-     for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) {
-         reg_info->reg_rules_6g_ap_ptr[i] =
---- a/drivers/net/wireless/ath/ath12k/wmi.h
-+++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -3965,7 +3965,6 @@ struct ath12k_wmi_eht_rate_set_params {
- #define MAX_REG_RULES 10
- #define REG_ALPHA2_LEN 2
- #define MAX_6G_REG_RULES 5
--#define REG_US_5G_NUM_REG_RULES 4
-
- struct wmi_set_current_country_arg {
-     u8 alpha2[REG_ALPHA2_LEN];
diff --git 
a/package/kernel/mac80211/patches/build/110-backport-include-fix-linux-acpi_amd_wbrf.h-inclusion.patch 
b/package/kernel/mac80211/patches/build/110-backport-include-fix-linux-acpi_amd_wbrf.h-inclusion.patch
deleted file mode 100644
index d8d3783ed607e0..00000000000000
--- 
a/package/kernel/mac80211/patches/build/110-backport-include-fix-linux-acpi_amd_wbrf.h-inclusion.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Tue, 14 Jan 2025 11:42:25 +0100
-Subject: [PATCH] backport-include: fix linux/acpi_amd_wbrf.h inclusion
-
-Fix building for kernel >= 6.8 by adjusting incorrect guard usage,
-otherwise an #include_next header is masked and compilation will fail
-for net/mac80211/wbrf.c in the mac80211 kernel module.
-
-Fixes: 52cdcaab ("backport-include: backport linux/acpi_amd_wbrf.h")
-Reported-by: Tony Ambardar <itugrok at yahoo.com>
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/backport-include/linux/acpi_amd_wbrf.h
-+++ b/backport-include/linux/acpi_amd_wbrf.h
-@@ -4,8 +4,8 @@
-  * Copyright (C) 2023 Advanced Micro Devices
-  */
-
--#ifndef _ACPI_AMD_WBRF_H
--#define _ACPI_AMD_WBRF_H
-+#ifndef __BACKPORT_ACPI_AMD_WBRF_H
-+#define __BACKPORT_ACPI_AMD_WBRF_H
-
- #if LINUX_VERSION_IS_GEQ(6,8,0)
- #include_next <linux/acpi_amd_wbrf.h>
-@@ -83,4 +83,4 @@ int amd_wbrf_unregister_notifier(struct
- }
-
- #endif /* >=6,8,0 */
--#endif /* _ACPI_AMD_WBRF_H */
-+#endif /* __BACKPORT_ACPI_AMD_WBRF_H */
diff --git 
a/package/kernel/mac80211/patches/rtl/017-v6.13-wifi-rtw88-Constify-some-arrays-and-structs.patch 
b/package/kernel/mac80211/patches/rtl/017-v6.13-wifi-rtw88-Constify-some-arrays-and-structs.patch
deleted file mode 100644
index 8d2bb9aa7a918c..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/017-v6.13-wifi-rtw88-Constify-some-arrays-and-structs.patch
+++ /dev/null
@@ -1,374 +0,0 @@
-From 140403599b74839b0a57c5397b7e8579e5332364 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 18 Sep 2024 01:53:55 +0300
-Subject: [PATCH] wifi: rtw88: Constify some arrays and structs
-
-These are never modified, so make them const:
-
-card_enable_flow_8703b
-card_disable_flow_8703b
-rtw8703b_ops
-
-rtw8723d_ops
-card_enable_flow_8723d
-card_disable_flow_8723d
-
-trans_carddis_to_cardemu_8821c
-trans_cardemu_to_act_8821c
-trans_act_to_cardemu_8821c
-trans_cardemu_to_carddis_8821c
-card_enable_flow_8821c
-card_disable_flow_8821c
-rtw8821c_dig
-page_table_8821c
-rqpn_table_8821c
-prioq_addrs_8821c
-rtw8821c_ops
-
-card_enable_flow_8822b
-card_disable_flow_8822b
-prioq_addrs_8822b
-rtw8822b_ops
-rtw8822b_edcca_th
-
-card_enable_flow_8822c
-card_disable_flow_8822c
-prioq_addrs_8822c
-rtw8822c_ops
-rtw8822c_edcca_th
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/dae7994f-3491-40de-b537-ebf68df084bb@gmail.com
----
- drivers/net/wireless/realtek/rtw88/fw.c       |  2 +-
- drivers/net/wireless/realtek/rtw88/mac.c      |  4 ++--
- drivers/net/wireless/realtek/rtw88/main.h     |  8 +++----
- drivers/net/wireless/realtek/rtw88/phy.c      |  2 +-
- drivers/net/wireless/realtek/rtw88/rtw8703b.c |  6 ++---
- drivers/net/wireless/realtek/rtw88/rtw8723d.c |  6 ++---
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 22 +++++++++----------
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 ++++-----
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 10 ++++-----
- 9 files changed, 35 insertions(+), 35 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/fw.c
-+++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -267,7 +267,7 @@ static void rtw_fw_scan_result(struct rt
- static void rtw_fw_adaptivity_result(struct rtw_dev *rtwdev, u8 *payload,
-                      u8 length)
- {
--    struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
-+    const struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
-     struct rtw_c2h_adaptivity *result = (struct rtw_c2h_adaptivity 
*)payload;
-
-     rtw_dbg(rtwdev, RTW_DBG_ADAPTIVITY,
---- a/drivers/net/wireless/realtek/rtw88/mac.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac.c
-@@ -228,7 +228,7 @@ static int rtw_sub_pwr_seq_parser(struct
- }
-
- static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
--                  const struct rtw_pwr_seq_cmd **cmd_seq)
-+                  const struct rtw_pwr_seq_cmd * const *cmd_seq)
- {
-     u8 cut_mask;
-     u8 intf_mask;
-@@ -271,7 +271,7 @@ static int rtw_pwr_seq_parser(struct rtw
- static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
- {
-     const struct rtw_chip_info *chip = rtwdev->chip;
--    const struct rtw_pwr_seq_cmd **pwr_seq;
-+    const struct rtw_pwr_seq_cmd * const *pwr_seq;
-     u32 imr = 0;
-     u8 rpwm;
-     bool cur_pwr;
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1167,7 +1167,7 @@ enum rtw_fwcd_item {
-
- /* hardware configuration for each IC */
- struct rtw_chip_info {
--    struct rtw_chip_ops *ops;
-+    const struct rtw_chip_ops *ops;
-     u8 id;
-
-     const char *fw_name;
-@@ -1209,8 +1209,8 @@ struct rtw_chip_info {
-
-     /* init values */
-     u8 sys_func_en;
--    const struct rtw_pwr_seq_cmd **pwr_on_seq;
--    const struct rtw_pwr_seq_cmd **pwr_off_seq;
-+    const struct rtw_pwr_seq_cmd * const *pwr_on_seq;
-+    const struct rtw_pwr_seq_cmd * const *pwr_off_seq;
-     const struct rtw_rqpn *rqpn_table;
-     const struct rtw_prioq_addrs *prioq_addrs;
-     const struct rtw_page_table *page_table;
-@@ -1242,7 +1242,7 @@ struct rtw_chip_info {
-     u8 bfer_su_max_num;
-     u8 bfer_mu_max_num;
-
--    struct rtw_hw_reg_offset *edcca_th;
-+    const struct rtw_hw_reg_offset *edcca_th;
-     s8 l2h_th_ini_cs;
-     s8 l2h_th_ini_ad;
-
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -123,7 +123,7 @@ static void rtw_phy_cck_pd_init(struct r
-
- void rtw_phy_set_edcca_th(struct rtw_dev *rtwdev, u8 l2h, u8 h2l)
- {
--    struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
-+    const struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
-
-     rtw_write32_mask(rtwdev,
-              edcca_th[EDCCA_TH_L2H_IDX].hw_reg.addr,
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -481,14 +481,14 @@ static const struct rtw_pwr_seq_cmd tran
-     {TRANS_SEQ_END},
- };
-
--static const struct rtw_pwr_seq_cmd *card_enable_flow_8703b[] = {
-+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8703b[] = {
-     trans_pre_enable_8703b,
-     trans_carddis_to_cardemu_8703b,
-     trans_cardemu_to_act_8703b,
-     NULL
- };
-
--static const struct rtw_pwr_seq_cmd *card_disable_flow_8703b[] = {
-+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8703b[] = {
-     trans_act_to_lps_8703b,
-     trans_act_to_reset_mcu_8703b,
-     trans_act_to_cardemu_8703b,
-@@ -1941,7 +1941,7 @@ static const struct coex_tdma_para tdma_
-     { {0x61, 0x08, 0x03, 0x11, 0x11} },
- };
-
--static struct rtw_chip_ops rtw8703b_ops = {
-+static const struct rtw_chip_ops rtw8703b_ops = {
-     .mac_init        = rtw8723x_mac_init,
-     .dump_fw_crash        = NULL,
-     .shutdown        = NULL,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -1430,7 +1430,7 @@ static void rtw8723d_pwr_track(struct rt
-     dm_info->pwr_trk_triggered = false;
- }
-
--static struct rtw_chip_ops rtw8723d_ops = {
-+static const struct rtw_chip_ops rtw8723d_ops = {
-     .phy_set_param        = rtw8723d_phy_set_param,
-     .read_efuse        = rtw8723x_read_efuse,
-     .query_rx_desc        = rtw8723d_query_rx_desc,
-@@ -1788,7 +1788,7 @@ static const struct rtw_pwr_seq_cmd tran
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
-+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8723d[] = {
-     trans_carddis_to_cardemu_8723d,
-     trans_cardemu_to_act_8723d,
-     NULL
-@@ -2004,7 +2004,7 @@ static const struct rtw_pwr_seq_cmd tran
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
-+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8723d[] = {
-     trans_act_to_lps_8723d,
-     trans_act_to_pre_carddis_8723d,
-     trans_act_to_cardemu_8723d,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1254,7 +1254,7 @@ static void rtw8821c_fill_txdesc_checksu
-     fill_txdesc_checksum_common(txdesc, 16);
- }
-
--static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
-+static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
-     {0x0086,
-      RTW_PWR_CUT_ALL_MSK,
-      RTW_PWR_INTF_SDIO_MSK,
-@@ -1292,7 +1292,7 @@ static struct rtw_pwr_seq_cmd trans_card
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
-     {0x0020,
-      RTW_PWR_CUT_ALL_MSK,
-      RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-@@ -1396,7 +1396,7 @@ static struct rtw_pwr_seq_cmd trans_card
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
-+static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
-     {0x0093,
-      RTW_PWR_CUT_ALL_MSK,
-      RTW_PWR_INTF_ALL_MSK,
-@@ -1454,7 +1454,7 @@ static struct rtw_pwr_seq_cmd trans_act_
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
-     {0x0007,
-      RTW_PWR_CUT_ALL_MSK,
-      RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-@@ -1567,13 +1567,13 @@ static struct rtw_pwr_seq_cmd trans_card
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static const struct rtw_pwr_seq_cmd *card_enable_flow_8821c[] = {
-+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8821c[] = {
-     trans_carddis_to_cardemu_8821c,
-     trans_cardemu_to_act_8821c,
-     NULL
- };
-
--static const struct rtw_pwr_seq_cmd *card_disable_flow_8821c[] = {
-+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8821c[] = {
-     trans_act_to_cardemu_8821c,
-     trans_cardemu_to_carddis_8821c,
-     NULL
-@@ -1629,7 +1629,7 @@ static const struct rtw_rfe_def rtw8821c
-     [6] = RTW_DEF_RFE(8821c, 0, 0),
- };
-
--static struct rtw_hw_reg rtw8821c_dig[] = {
-+static const struct rtw_hw_reg rtw8821c_dig[] = {
-     [0] = { .addr = 0xc50, .mask = 0x7f },
- };
-
-@@ -1639,7 +1639,7 @@ static const struct rtw_ltecoex_addr rtw
-     .rdata = LTECOEX_READ_DATA,
- };
-
--static struct rtw_page_table page_table_8821c[] = {
-+static const struct rtw_page_table page_table_8821c[] = {
-     /* not sure what [0] stands for */
-     {16, 16, 16, 14, 1},
-     {16, 16, 16, 14, 1},
-@@ -1648,7 +1648,7 @@ static struct rtw_page_table page_table_
-     {16, 16, 16, 14, 1},
- };
-
--static struct rtw_rqpn rqpn_table_8821c[] = {
-+static const struct rtw_rqpn rqpn_table_8821c[] = {
-     /* not sure what [0] stands for */
-     {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-      RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-@@ -1667,7 +1667,7 @@ static struct rtw_rqpn rqpn_table_8821c[
-      RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
- };
-
--static struct rtw_prioq_addrs prioq_addrs_8821c = {
-+static const struct rtw_prioq_addrs prioq_addrs_8821c = {
-     .prio[RTW_DMA_MAPPING_EXTRA] = {
-         .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
-     },
-@@ -1683,7 +1683,7 @@ static struct rtw_prioq_addrs prioq_addr
-     .wsize = true,
- };
-
--static struct rtw_chip_ops rtw8821c_ops = {
-+static const struct rtw_chip_ops rtw8821c_ops = {
-     .phy_set_param        = rtw8821c_phy_set_param,
-     .read_efuse        = rtw8821c_read_efuse,
-     .query_rx_desc        = rtw8821c_query_rx_desc,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -1978,13 +1978,13 @@ static const struct rtw_pwr_seq_cmd tran
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
-+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8822b[] = {
-     trans_carddis_to_cardemu_8822b,
-     trans_cardemu_to_act_8822b,
-     NULL
- };
-
--static const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
-+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8822b[] = {
-     trans_act_to_cardemu_8822b,
-     trans_cardemu_to_carddis_8822b,
-     NULL
-@@ -2156,7 +2156,7 @@ static const struct rtw_rqpn rqpn_table_
-      RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
- };
-
--static struct rtw_prioq_addrs prioq_addrs_8822b = {
-+static const struct rtw_prioq_addrs prioq_addrs_8822b = {
-     .prio[RTW_DMA_MAPPING_EXTRA] = {
-         .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
-     },
-@@ -2172,7 +2172,7 @@ static struct rtw_prioq_addrs prioq_addr
-     .wsize = true,
- };
-
--static struct rtw_chip_ops rtw8822b_ops = {
-+static const struct rtw_chip_ops rtw8822b_ops = {
-     .phy_set_param        = rtw8822b_phy_set_param,
-     .read_efuse        = rtw8822b_read_efuse,
-     .query_rx_desc        = rtw8822b_query_rx_desc,
-@@ -2521,7 +2521,7 @@ static const struct rtw_reg_domain coex_
-     {0xc50,  MASKBYTE0, RTW_REG_DOMAIN_MAC8},
- };
-
--static struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
-+static const struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
-     [EDCCA_TH_L2H_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE0}, .offset 
= 0},
-     [EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset 
= 0},
- };
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -4874,13 +4874,13 @@ static const struct rtw_pwr_seq_cmd tran
-      RTW_PWR_CMD_END, 0, 0},
- };
-
--static const struct rtw_pwr_seq_cmd *card_enable_flow_8822c[] = {
-+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8822c[] = {
-     trans_carddis_to_cardemu_8822c,
-     trans_cardemu_to_act_8822c,
-     NULL
- };
-
--static const struct rtw_pwr_seq_cmd *card_disable_flow_8822c[] = {
-+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8822c[] = {
-     trans_act_to_cardemu_8822c,
-     trans_cardemu_to_carddis_8822c,
-     NULL
-@@ -4972,7 +4972,7 @@ static const struct rtw_rqpn rqpn_table_
-      RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
- };
-
--static struct rtw_prioq_addrs prioq_addrs_8822c = {
-+static const struct rtw_prioq_addrs prioq_addrs_8822c = {
-     .prio[RTW_DMA_MAPPING_EXTRA] = {
-         .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
-     },
-@@ -4988,7 +4988,7 @@ static struct rtw_prioq_addrs prioq_addr
-     .wsize = true,
- };
-
--static struct rtw_chip_ops rtw8822c_ops = {
-+static const struct rtw_chip_ops rtw8822c_ops = {
-     .phy_set_param        = rtw8822c_phy_set_param,
-     .read_efuse        = rtw8822c_read_efuse,
-     .query_rx_desc        = rtw8822c_query_rx_desc,
-@@ -5301,7 +5301,7 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
- };
-
--static struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
-+static const struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
-     [EDCCA_TH_L2H_IDX] = {
-         {.addr = 0x84c, .mask = MASKBYTE2}, .offset = 0x80
-     },
diff --git 
a/package/kernel/mac80211/patches/rtl/019-v6.13-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch 
b/package/kernel/mac80211/patches/rtl/019-v6.13-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch
deleted file mode 100644
index 4a32831ea3e31d..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/019-v6.13-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch
+++ /dev/null
@@ -1,560 +0,0 @@
-From bbb6f9be7f99464d5ab7e2f321fa728d33eeec9a Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Fri, 20 Sep 2024 22:27:30 +0300
-Subject: [PATCH] wifi: rtw88: Parse the RX descriptor with a single 
function
-
-rtw8703b_query_rx_desc(), rtw8723d_query_rx_desc(),
-rtw8821c_query_rx_desc(), rtw8822b_query_rx_desc(), and
-rtw8822c_query_rx_desc() are almost identical, so replace them all with
-a single function, rtw_rx_query_rx_desc().
-
-Also, access the RX descriptor using a struct with __le32 members and
-le32_get_bits().
-
-Tested with RTL8811CU, RTL8811AU, and RTL8812AU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Tested-by: Ping-Ke Shih <pkshih at realtek.com> # RTL8723DE and RTL8822CE
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/913f1747-38fc-4409-85a4-57bb9cee506b@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.h     |  5 +-
- drivers/net/wireless/realtek/rtw88/pci.c      |  2 +-
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 56 +--------------
- drivers/net/wireless/realtek/rtw88/rtw8723d.c | 43 +-----------
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 43 +-----------
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 43 +-----------
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 44 +-----------
- drivers/net/wireless/realtek/rtw88/rx.c       | 70 +++++++++++++++++--
- drivers/net/wireless/realtek/rtw88/rx.h       | 64 ++++++++---------
- drivers/net/wireless/realtek/rtw88/sdio.c     |  3 +-
- drivers/net/wireless/realtek/rtw88/usb.c      |  4 +-
- 11 files changed, 106 insertions(+), 271 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -848,9 +848,8 @@ struct rtw_chip_ops {
-     void (*phy_set_param)(struct rtw_dev *rtwdev);
-     void (*set_channel)(struct rtw_dev *rtwdev, u8 channel,
-                 u8 bandwidth, u8 primary_chan_idx);
--    void (*query_rx_desc)(struct rtw_dev *rtwdev, u8 *rx_desc,
--                  struct rtw_rx_pkt_stat *pkt_stat,
--                  struct ieee80211_rx_status *rx_status);
-+    void (*query_phy_status)(struct rtw_dev *rtwdev, u8 *phy_status,
-+                 struct rtw_rx_pkt_stat *pkt_stat);
-     u32 (*read_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
-                u32 addr, u32 mask);
-     bool (*write_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
---- a/drivers/net/wireless/realtek/rtw88/pci.c
-+++ b/drivers/net/wireless/realtek/rtw88/pci.c
-@@ -1065,7 +1065,7 @@ static u32 rtw_pci_rx_napi(struct rtw_de
-         dma_sync_single_for_cpu(rtwdev->dev, dma, RTK_PCI_RX_BUF_SIZE,
-                     DMA_FROM_DEVICE);
-         rx_desc = skb->data;
--        chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
-+        rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
-
-         /* offset from rx_desc to payload */
-         pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -29,9 +29,6 @@
- #define TBTT_PROHIBIT_HOLD_TIME 0x80
- #define TBTT_PROHIBIT_HOLD_TIME_STOP_BCN 0x64
-
--/* raw pkt_stat->drv_info_sz is in unit of 8-bytes */
--#define RX_DRV_INFO_SZ_UNIT_8703B 8
--
- #define TRANS_SEQ_END            \
-     0xFFFF,                \
-     RTW_PWR_CUT_ALL_MSK,        \
-@@ -1032,57 +1029,6 @@ static void query_phy_status(struct rtw_
-         query_phy_status_ofdm(rtwdev, phy_status, pkt_stat);
- }
-
--static void rtw8703b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
--                   struct rtw_rx_pkt_stat *pkt_stat,
--                   struct ieee80211_rx_status *rx_status)
--{
--    struct ieee80211_hdr *hdr;
--    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
--    u8 *phy_status = NULL;
--
--    memset(pkt_stat, 0, sizeof(*pkt_stat));
--
--    pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
--    pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
--    pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
--    pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
--                  GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
--    pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
--    pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
--    pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
--    pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
--    pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
--    pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
--    pkt_stat->ppdu_cnt = 0;
--    pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
--
--    pkt_stat->drv_info_sz *= RX_DRV_INFO_SZ_UNIT_8703B;
--
--    if (pkt_stat->is_c2h)
--        return;
--
--    hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
--                       pkt_stat->drv_info_sz);
--
--    pkt_stat->bw = GET_RX_DESC_BW(rx_desc);
--
--    if (pkt_stat->phy_status) {
--        phy_status = rx_desc + desc_sz + pkt_stat->shift;
--        query_phy_status(rtwdev, phy_status, pkt_stat);
--    }
--
--    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
--
--    /* Rtl8723cs driver checks for size < 14 or size > 8192 and
--     * simply drops the packet. Maybe this should go into
--     * rtw_rx_fill_rx_status()?
--     */
--    if (pkt_stat->pkt_len == 0) {
--        rx_status->flag |= RX_FLAG_NO_PSDU;
--        rtw_dbg(rtwdev, RTW_DBG_RX, "zero length packet");
--    }
--}
--
- #define ADDA_ON_VAL_8703B 0x03c00014
-
- static
-@@ -1948,7 +1894,7 @@ static const struct rtw_chip_ops rtw8703
-     .read_efuse        = rtw8703b_read_efuse,
-     .phy_set_param        = rtw8703b_phy_set_param,
-     .set_channel        = rtw8703b_set_channel,
--    .query_rx_desc        = rtw8703b_query_rx_desc,
-+    .query_phy_status    = query_phy_status,
-     .read_rf        = rtw_phy_read_rf_sipi,
-     .write_rf        = rtw_phy_write_rf_reg_sipi,
-     .set_tx_power_index    = rtw8723x_set_tx_power_index,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -227,47 +227,6 @@ static void query_phy_status(struct rtw_
-     }
- }
-
--static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
--                   struct rtw_rx_pkt_stat *pkt_stat,
--                   struct ieee80211_rx_status *rx_status)
--{
--    struct ieee80211_hdr *hdr;
--    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
--    u8 *phy_status = NULL;
--
--    memset(pkt_stat, 0, sizeof(*pkt_stat));
--
--    pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
--    pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
--    pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
--    pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
--                  GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
--    pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
--    pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
--    pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
--    pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
--    pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
--    pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
--    pkt_stat->ppdu_cnt = 0;
--    pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
--
--    /* drv_info_sz is in unit of 8-bytes */
--    pkt_stat->drv_info_sz *= 8;
--
--    /* c2h cmd pkt's rx/phy status is not interested */
--    if (pkt_stat->is_c2h)
--        return;
--
--    hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
--                       pkt_stat->drv_info_sz);
--    if (pkt_stat->phy_status) {
--        phy_status = rx_desc + desc_sz + pkt_stat->shift;
--        query_phy_status(rtwdev, phy_status, pkt_stat);
--    }
--
--    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
--}
--
- static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
-                      u8 channel, u32 thres)
- {
-@@ -1433,7 +1392,7 @@ static void rtw8723d_pwr_track(struct rt
- static const struct rtw_chip_ops rtw8723d_ops = {
-     .phy_set_param        = rtw8723d_phy_set_param,
-     .read_efuse        = rtw8723x_read_efuse,
--    .query_rx_desc        = rtw8723d_query_rx_desc,
-+    .query_phy_status    = query_phy_status,
-     .set_channel        = rtw8723d_set_channel,
-     .mac_init        = rtw8723x_mac_init,
-     .shutdown        = rtw8723d_shutdown,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -679,47 +679,6 @@ static void query_phy_status(struct rtw_
-     }
- }
-
--static void rtw8821c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
--                   struct rtw_rx_pkt_stat *pkt_stat,
--                   struct ieee80211_rx_status *rx_status)
--{
--    struct ieee80211_hdr *hdr;
--    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
--    u8 *phy_status = NULL;
--
--    memset(pkt_stat, 0, sizeof(*pkt_stat));
--
--    pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
--    pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
--    pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
--    pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
--                  GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
--    pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
--    pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
--    pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
--    pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
--    pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
--    pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
--    pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
--    pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
--
--    /* drv_info_sz is in unit of 8-bytes */
--    pkt_stat->drv_info_sz *= 8;
--
--    /* c2h cmd pkt's rx/phy status is not interested */
--    if (pkt_stat->is_c2h)
--        return;
--
--    hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
--                       pkt_stat->drv_info_sz);
--    if (pkt_stat->phy_status) {
--        phy_status = rx_desc + desc_sz + pkt_stat->shift;
--        query_phy_status(rtwdev, phy_status, pkt_stat);
--    }
--
--    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
--}
--
- static void
- rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, 
u8 rs)
- {
-@@ -1686,7 +1645,7 @@ static const struct rtw_prioq_addrs prio
- static const struct rtw_chip_ops rtw8821c_ops = {
-     .phy_set_param        = rtw8821c_phy_set_param,
-     .read_efuse        = rtw8821c_read_efuse,
--    .query_rx_desc        = rtw8821c_query_rx_desc,
-+    .query_phy_status    = query_phy_status,
-     .set_channel        = rtw8821c_set_channel,
-     .mac_init        = rtw8821c_mac_init,
-     .read_rf        = rtw_phy_read_rf,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -934,47 +934,6 @@ static void query_phy_status(struct rtw_
-     }
- }
-
--static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
--                   struct rtw_rx_pkt_stat *pkt_stat,
--                   struct ieee80211_rx_status *rx_status)
--{
--    struct ieee80211_hdr *hdr;
--    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
--    u8 *phy_status = NULL;
--
--    memset(pkt_stat, 0, sizeof(*pkt_stat));
--
--    pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
--    pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
--    pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
--    pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
--                  GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
--    pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
--    pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
--    pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
--    pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
--    pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
--    pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
--    pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
--    pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
--
--    /* drv_info_sz is in unit of 8-bytes */
--    pkt_stat->drv_info_sz *= 8;
--
--    /* c2h cmd pkt's rx/phy status is not interested */
--    if (pkt_stat->is_c2h)
--        return;
--
--    hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
--                       pkt_stat->drv_info_sz);
--    if (pkt_stat->phy_status) {
--        phy_status = rx_desc + desc_sz + pkt_stat->shift;
--        query_phy_status(rtwdev, phy_status, pkt_stat);
--    }
--
--    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
--}
--
- static void
- rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, 
u8 rs)
- {
-@@ -2175,7 +2134,7 @@ static const struct rtw_prioq_addrs prio
- static const struct rtw_chip_ops rtw8822b_ops = {
-     .phy_set_param        = rtw8822b_phy_set_param,
-     .read_efuse        = rtw8822b_read_efuse,
--    .query_rx_desc        = rtw8822b_query_rx_desc,
-+    .query_phy_status    = query_phy_status,
-     .set_channel        = rtw8822b_set_channel,
-     .mac_init        = rtw8822b_mac_init,
-     .read_rf        = rtw_phy_read_rf,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -2690,48 +2690,6 @@ static void query_phy_status(struct rtw_
-     }
- }
-
--static void rtw8822c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
--                   struct rtw_rx_pkt_stat *pkt_stat,
--                   struct ieee80211_rx_status *rx_status)
--{
--    struct ieee80211_hdr *hdr;
--    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
--    u8 *phy_status = NULL;
--
--    memset(pkt_stat, 0, sizeof(*pkt_stat));
--
--    pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
--    pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
--    pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
--    pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
--                  GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
--    pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
--    pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
--    pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
--    pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
--    pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
--    pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
--    pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
--    pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
--
--    /* drv_info_sz is in unit of 8-bytes */
--    pkt_stat->drv_info_sz *= 8;
--
--    /* c2h cmd pkt's rx/phy status is not interested */
--    if (pkt_stat->is_c2h)
--        return;
--
--    hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
--                       pkt_stat->drv_info_sz);
--    pkt_stat->hdr = hdr;
--    if (pkt_stat->phy_status) {
--        phy_status = rx_desc + desc_sz + pkt_stat->shift;
--        query_phy_status(rtwdev, phy_status, pkt_stat);
--    }
--
--    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
--}
--
- static void
- rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 
*tx_pwr_ref_cck,
-                 u8 *tx_pwr_ref_ofdm)
-@@ -4991,7 +4949,7 @@ static const struct rtw_prioq_addrs prio
- static const struct rtw_chip_ops rtw8822c_ops = {
-     .phy_set_param        = rtw8822c_phy_set_param,
-     .read_efuse        = rtw8822c_read_efuse,
--    .query_rx_desc        = rtw8822c_query_rx_desc,
-+    .query_phy_status    = query_phy_status,
-     .set_channel        = rtw8822c_set_channel,
-     .mac_init        = rtw8822c_mac_init,
-     .dump_fw_crash        = rtw8822c_dump_fw_crash,
---- a/drivers/net/wireless/realtek/rtw88/rx.c
-+++ b/drivers/net/wireless/realtek/rtw88/rx.c
-@@ -187,11 +187,10 @@ fill_rx_status:
- }
- EXPORT_SYMBOL(rtw_update_rx_freq_from_ie);
-
--void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
--               struct rtw_rx_pkt_stat *pkt_stat,
--               struct ieee80211_hdr *hdr,
--               struct ieee80211_rx_status *rx_status,
--               u8 *phy_status)
-+static void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
-+                  struct rtw_rx_pkt_stat *pkt_stat,
-+                  struct ieee80211_hdr *hdr,
-+                  struct ieee80211_rx_status *rx_status)
- {
-     struct ieee80211_hw *hw = rtwdev->hw;
-     u8 path;
-@@ -242,5 +241,64 @@ void rtw_rx_fill_rx_status(struct rtw_de
-     }
-
-     rtw_rx_addr_match(rtwdev, pkt_stat, hdr);
-+
-+    /* Rtl8723cs driver checks for size < 14 or size > 8192 and
-+     * simply drops the packet.
-+     */
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8703B && pkt_stat->pkt_len 
== 0) {
-+        rx_status->flag |= RX_FLAG_NO_PSDU;
-+        rtw_dbg(rtwdev, RTW_DBG_RX, "zero length packet");
-+    }
-+}
-+
-+void rtw_rx_query_rx_desc(struct rtw_dev *rtwdev, void *rx_desc8,
-+              struct rtw_rx_pkt_stat *pkt_stat,
-+              struct ieee80211_rx_status *rx_status)
-+{
-+    u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
-+    struct rtw_rx_desc *rx_desc = rx_desc8;
-+    struct ieee80211_hdr *hdr;
-+    u32 enc_type, swdec;
-+    void *phy_status;
-+
-+    memset(pkt_stat, 0, sizeof(*pkt_stat));
-+
-+    pkt_stat->pkt_len = le32_get_bits(rx_desc->w0, 
RTW_RX_DESC_W0_PKT_LEN);
-+    pkt_stat->crc_err = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_CRC32);
-+    pkt_stat->icv_err = le32_get_bits(rx_desc->w0, 
RTW_RX_DESC_W0_ICV_ERR);
-+    pkt_stat->drv_info_sz = le32_get_bits(rx_desc->w0,
-+                          RTW_RX_DESC_W0_DRV_INFO_SIZE);
-+    enc_type = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_ENC_TYPE);
-+    pkt_stat->shift = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SHIFT);
-+    pkt_stat->phy_status = le32_get_bits(rx_desc->w0, 
RTW_RX_DESC_W0_PHYST);
-+    swdec = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SWDEC);
-+    pkt_stat->decrypted = !swdec && enc_type != RX_DESC_ENC_NONE;
-+
-+    pkt_stat->cam_id = le32_get_bits(rx_desc->w1, RTW_RX_DESC_W1_MACID);
-+
-+    pkt_stat->is_c2h = le32_get_bits(rx_desc->w2, RTW_RX_DESC_W2_C2H);
-+    pkt_stat->ppdu_cnt = le32_get_bits(rx_desc->w2, 
RTW_RX_DESC_W2_PPDU_CNT);
-+
-+    pkt_stat->rate = le32_get_bits(rx_desc->w3, RTW_RX_DESC_W3_RX_RATE);
-+
-+    pkt_stat->bw = le32_get_bits(rx_desc->w4, RTW_RX_DESC_W4_BW);
-+
-+    pkt_stat->tsf_low = le32_get_bits(rx_desc->w5, RTW_RX_DESC_W5_TSFL);
-+
-+    /* drv_info_sz is in unit of 8-bytes */
-+    pkt_stat->drv_info_sz *= 8;
-+
-+    /* c2h cmd pkt's rx/phy status is not interested */
-+    if (pkt_stat->is_c2h)
-+        return;
-+
-+    phy_status = rx_desc8 + desc_sz + pkt_stat->shift;
-+    hdr = phy_status + pkt_stat->drv_info_sz;
-+    pkt_stat->hdr = hdr;
-+
-+    if (pkt_stat->phy_status)
-+        rtwdev->chip->ops->query_phy_status(rtwdev, phy_status, pkt_stat);
-+
-+    rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status);
- }
--EXPORT_SYMBOL(rtw_rx_fill_rx_status);
-+EXPORT_SYMBOL(rtw_rx_query_rx_desc);
---- a/drivers/net/wireless/realtek/rtw88/rx.h
-+++ b/drivers/net/wireless/realtek/rtw88/rx.h
-@@ -14,42 +14,40 @@ enum rtw_rx_desc_enc {
-     RX_DESC_ENC_WEP104    = 5,
- };
-
--#define GET_RX_DESC_PHYST(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(26))
--#define GET_RX_DESC_ICV_ERR(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(15))
--#define GET_RX_DESC_CRC32(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(14))
--#define GET_RX_DESC_SWDEC(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(27))
--#define GET_RX_DESC_C2H(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x02), BIT(28))
--#define GET_RX_DESC_PKT_LEN(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(13, 0))
--#define GET_RX_DESC_DRV_INFO_SIZE(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(19, 16))
--#define GET_RX_DESC_SHIFT(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(25, 24))
--#define GET_RX_DESC_ENC_TYPE(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(22, 20))
--#define GET_RX_DESC_RX_RATE(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x03), GENMASK(6, 0))
--#define GET_RX_DESC_MACID(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x01), GENMASK(6, 0))
--#define GET_RX_DESC_PPDU_CNT(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x02), GENMASK(30, 29))
--#define GET_RX_DESC_TSFL(rxdesc) \
--    le32_get_bits(*((__le32 *)(rxdesc) + 0x05), GENMASK(31, 0))
--#define GET_RX_DESC_BW(rxdesc) \
--    (le32_get_bits(*((__le32 *)(rxdesc) + 0x04), GENMASK(5, 4)))
-+struct rtw_rx_desc {
-+    __le32 w0;
-+    __le32 w1;
-+    __le32 w2;
-+    __le32 w3;
-+    __le32 w4;
-+    __le32 w5;
-+} __packed;
-+
-+#define RTW_RX_DESC_W0_PKT_LEN        GENMASK(13, 0)
-+#define RTW_RX_DESC_W0_CRC32        BIT(14)
-+#define RTW_RX_DESC_W0_ICV_ERR        BIT(15)
-+#define RTW_RX_DESC_W0_DRV_INFO_SIZE    GENMASK(19, 16)
-+#define RTW_RX_DESC_W0_ENC_TYPE        GENMASK(22, 20)
-+#define RTW_RX_DESC_W0_SHIFT        GENMASK(25, 24)
-+#define RTW_RX_DESC_W0_PHYST        BIT(26)
-+#define RTW_RX_DESC_W0_SWDEC        BIT(27)
-+
-+#define RTW_RX_DESC_W1_MACID        GENMASK(6, 0)
-+
-+#define RTW_RX_DESC_W2_C2H        BIT(28)
-+#define RTW_RX_DESC_W2_PPDU_CNT        GENMASK(30, 29)
-+
-+#define RTW_RX_DESC_W3_RX_RATE        GENMASK(6, 0)
-+
-+#define RTW_RX_DESC_W4_BW        GENMASK(5, 4)
-+
-+#define RTW_RX_DESC_W5_TSFL        GENMASK(31, 0)
-
- void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
-           struct sk_buff *skb);
--void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
--               struct rtw_rx_pkt_stat *pkt_stat,
--               struct ieee80211_hdr *hdr,
--               struct ieee80211_rx_status *rx_status,
--               u8 *phy_status);
-+void rtw_rx_query_rx_desc(struct rtw_dev *rtwdev, void *rx_desc8,
-+              struct rtw_rx_pkt_stat *pkt_stat,
-+              struct ieee80211_rx_status *rx_status);
- void rtw_update_rx_freq_from_ie(struct rtw_dev *rtwdev, struct sk_buff 
*skb,
-                 struct ieee80211_rx_status *rx_status,
-                 struct rtw_rx_pkt_stat *pkt_stat);
---- a/drivers/net/wireless/realtek/rtw88/sdio.c
-+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
-@@ -981,8 +981,7 @@ static void rtw_sdio_rxfifo_recv(struct
-
-     while (true) {
-         rx_desc = skb->data;
--        chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
--                     &rx_status);
-+        rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
-         pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
-                  pkt_stat.shift;
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -571,8 +571,8 @@ static void rtw_usb_rx_handler(struct wo
-
-         do {
-             rx_desc = skb->data;
--            chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
--                         &rx_status);
-+            rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat,
-+                         &rx_status);
-             pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
-                      pkt_stat.shift;
-
diff --git 
a/package/kernel/mac80211/patches/rtl/022-v6.13-wifi-rtw88-Refactor-looping-in-rtw_phy_store_tx_powe.patch 
b/package/kernel/mac80211/patches/rtl/022-v6.13-wifi-rtw88-Refactor-looping-in-rtw_phy_store_tx_powe.patch
deleted file mode 100644
index 4f019617d4799f..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/022-v6.13-wifi-rtw88-Refactor-looping-in-rtw_phy_store_tx_powe.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 7846f0b63562f4db45f712cc7dab091985baf07b Mon Sep 17 00:00:00 2001
-From: Mohammed Anees <pvmohammedanees2003 at gmail.com>
-Date: Thu, 17 Oct 2024 13:36:38 +0530
-Subject: [PATCH] wifi: rtw88: Refactor looping in
- rtw_phy_store_tx_power_by_rate
-
-The previous implementation included an unnecessary else
-condition paired with a continue statement. Since a check
-is already performed to determine if the band is either
-2G or 5G, the else condition will never be triggered.
-We can remove this check.
-
-Signed-off-by: Mohammed Anees <pvmohammedanees2003 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/20241017080638.13074-1-pvmohammedanees2003@gmail.com
----
- drivers/net/wireless/realtek/rtw88/phy.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -1470,10 +1470,8 @@ static void rtw_phy_store_tx_power_by_ra
-         rate = rates[i];
-         if (band == PHY_BAND_2G)
-             hal->tx_pwr_by_rate_offset_2g[rfpath][rate] = offset;
--        else if (band == PHY_BAND_5G)
--            hal->tx_pwr_by_rate_offset_5g[rfpath][rate] = offset;
-         else
--            continue;
-+            hal->tx_pwr_by_rate_offset_5g[rfpath][rate] = offset;
-     }
- }
-
diff --git 
a/package/kernel/mac80211/patches/rtl/023-v6.13-wifi-rtw88-Report-the-signal-strength-only-if-it-s-k.patch 
b/package/kernel/mac80211/patches/rtl/023-v6.13-wifi-rtw88-Report-the-signal-strength-only-if-it-s-k.patch
deleted file mode 100644
index accbf2b484f7f1..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/023-v6.13-wifi-rtw88-Report-the-signal-strength-only-if-it-s-k.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 47f754b3f838205f3b25c4839f74801d180995bf Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Tue, 22 Oct 2024 20:20:26 +0300
-Subject: [PATCH] wifi: rtw88: Report the signal strength only if it's known
-
-RTL8811CU doesn't report the signal strength for many (any?) data
-frames. When the signal strength is not known, set
-RX_FLAG_NO_SIGNAL_VAL in order to avoid reporting a signal
-strength of 0.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/f7e1e448-2c9b-498f-b8b1-a14dd967d7d3@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rx.c | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/rx.c
-+++ b/drivers/net/wireless/realtek/rtw88/rx.c
-@@ -234,10 +234,14 @@ static void rtw_rx_fill_rx_status(struct
-     else
-         rx_status->bw = RATE_INFO_BW_20;
-
--    rx_status->signal = pkt_stat->signal_power;
--    for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
--        rx_status->chains |= BIT(path);
--        rx_status->chain_signal[path] = pkt_stat->rx_power[path];
-+    if (pkt_stat->phy_status) {
-+        rx_status->signal = pkt_stat->signal_power;
-+        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
-+            rx_status->chains |= BIT(path);
-+            rx_status->chain_signal[path] = pkt_stat->rx_power[path];
-+        }
-+    } else {
-+        rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
-     }
-
-     rtw_rx_addr_match(rtwdev, pkt_stat, hdr);
diff --git 
a/package/kernel/mac80211/patches/rtl/024-v6.13-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch 
b/package/kernel/mac80211/patches/rtl/024-v6.13-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch
deleted file mode 100644
index bf3d2fe267f4b2..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/024-v6.13-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch
+++ /dev/null
@@ -1,490 +0,0 @@
-From d12722830ea4f562e91586927ec21b64d0369544 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:00:59 +0300
-Subject: [PATCH] wifi: rtw88: Add some definitions for RTL8821AU/RTL8812AU
-
-Add 8821A and 8812A chip type enums.
-
-Add cck_high_power member to struct rtw_hal. This will be used to
-calculate the RX signal strength of RTL8812AU.
-
-Add various register definitions which will be used by the new drivers.
-
-Move some existing register definitions from rtw8821c.h and rtw8822b.h.
-They were duplicated in those headers and will also be used by the new
-drivers.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/9279a9cd-6f86-4dc3-a095-7c36cb9b9d06@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.h     |   3 +
- drivers/net/wireless/realtek/rtw88/reg.h      | 174 ++++++++++++++++++
- drivers/net/wireless/realtek/rtw88/rtw8821c.h |  24 ---
- drivers/net/wireless/realtek/rtw88/rtw8822b.h |  12 --
- 4 files changed, 177 insertions(+), 36 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -189,6 +189,8 @@ enum rtw_chip_type {
-     RTW_CHIP_TYPE_8723D,
-     RTW_CHIP_TYPE_8821C,
-     RTW_CHIP_TYPE_8703B,
-+    RTW_CHIP_TYPE_8821A,
-+    RTW_CHIP_TYPE_8812A,
- };
-
- enum rtw_tx_queue_type {
-@@ -1934,6 +1936,7 @@ struct rtw_hal {
-     u32 antenna_rx;
-     u8 bfee_sts_cap;
-     bool txrx_1ss;
-+    bool cck_high_power;
-
-     /* protect tx power section */
-     struct mutex tx_power_mutex;
---- a/drivers/net/wireless/realtek/rtw88/reg.h
-+++ b/drivers/net/wireless/realtek/rtw88/reg.h
-@@ -9,6 +9,7 @@
- #define BIT_FEN_EN_25_1        BIT(13)
- #define BIT_FEN_ELDR        BIT(12)
- #define BIT_FEN_CPUEN        BIT(2)
-+#define BIT_FEN_USBA        BIT(2)
- #define BIT_FEN_BB_GLB_RST    BIT(1)
- #define BIT_FEN_BB_RSTB        BIT(0)
- #define BIT_R_DIS_PRST        BIT(6)
-@@ -16,6 +17,10 @@
- #define REG_SYS_PW_CTRL        0x0004
- #define BIT_PFM_WOWL        BIT(3)
- #define BIT_APFM_OFFMAC        BIT(9)
-+#define REG_APS_FSMCO        0x0004
-+#define APS_FSMCO_MAC_ENABLE    BIT(8)
-+#define APS_FSMCO_MAC_OFF    BIT(9)
-+#define APS_FSMCO_HW_POWERDOWN    BIT(15)
- #define REG_SYS_CLK_CTRL    0x0008
- #define BIT_CPU_CLK_EN        BIT(14)
-
-@@ -58,6 +63,8 @@
- #define BIT_SHIFT_LDO25_VOLTAGE    4
- #define BIT_LDO25_EN        BIT(7)
-
-+#define REG_ACLK_MON        0x3e
-+
- #define REG_GPIO_MUXCFG        0x0040
- #define BIT_FSPI_EN        BIT(19)
- #define BIT_EN_SIC        BIT(12)
-@@ -90,6 +97,8 @@
- #define BIT_USB_SUS_DIS        BIT(8)
- #define BIT_SDIO_PAD_E5        BIT(18)
-
-+#define REG_RF_B_CTRL        0x76
-+
- #define REG_AFE_CTRL_4        0x0078
- #define BIT_CK320M_AFE_EN    BIT(4)
- #define BIT_EN_SYN        BIT(15)
-@@ -134,6 +143,11 @@
- #define REG_PMC_DBG_CTRL1    0xa8
- #define BITS_PMC_BT_IQK_STS    GENMASK(22, 21)
-
-+#define REG_HIMR0        0xb0
-+#define REG_HISR0        0xb4
-+#define REG_HIMR1        0xb8
-+#define REG_HISR1        0xbc
-+
- #define REG_PAD_CTRL2        0x00C4
- #define BIT_RSM_EN_V1        BIT(16)
- #define BIT_NO_PDN_CHIPOFF_V1    BIT(17)
-@@ -185,6 +199,15 @@
- #define MAC_TRX_ENABLE    (BIT_HCI_TXDMA_EN | BIT_HCI_RXDMA_EN | 
BIT_TXDMA_EN | \
-             BIT_RXDMA_EN | BIT_PROTOCOL_EN | BIT_SCHEDULE_EN | \
-             BIT_MACTXEN | BIT_MACRXEN)
-+#define REG_PBP            0x104
-+#define PBP_RX_MASK        0x0f
-+#define PBP_TX_MASK        0xf0
-+#define PBP_64            0x0
-+#define PBP_128            0x1
-+#define PBP_256            0x2
-+#define PBP_512            0x3
-+#define PBP_1024        0x4
-+
- #define BIT_SHIFT_TXDMA_VOQ_MAP    4
- #define BIT_MASK_TXDMA_VOQ_MAP    0x3
- #define BIT_TXDMA_VOQ_MAP(x) \
-@@ -256,6 +279,8 @@
- #define REG_HMEBOX1        0x01D4
- #define REG_HMEBOX2        0x01D8
- #define REG_HMEBOX3        0x01DC
-+#define REG_LLT_INIT        0x01E0
-+#define BIT_LLT_WRITE_ACCESS    BIT(30)
- #define REG_HMEBOX0_EX        0x01F0
- #define REG_HMEBOX1_EX        0x01F4
- #define REG_HMEBOX2_EX        0x01F8
-@@ -298,6 +323,7 @@
-
- #define REG_AUTO_LLT        0x0224
- #define BIT_AUTO_INIT_LLT    BIT(16)
-+#define REG_DWBCN1_CTRL        0x0228
- #define REG_RQPN_CTRL_1        0x0228
- #define REG_RQPN_CTRL_2        0x022C
- #define BIT_LD_RQPN        BIT(31)
-@@ -329,6 +355,7 @@
- #define BIT_DMA_BURST_SIZE_1024    0
-
- #define REG_RXPKTNUM        0x02B0
-+#define REG_EARLY_MODE_CONTROL    0x02BC
-
- #define REG_INT_MIG        0x0304
- #define REG_HCI_MIX_CFG        0x03FC
-@@ -336,6 +363,7 @@
-
- #define REG_BCNQ_INFO        0x0418
- #define BIT_MGQ_CPU_EMPTY    BIT(24)
-+#define REG_TXPKT_EMPTY        0x041A
- #define REG_FWHW_TXQ_CTRL    0x0420
- #define BIT_EN_BCNQ_DL        BIT(22)
- #define BIT_EN_WR_FREE_TAIL    BIT(20)
-@@ -362,10 +390,12 @@
- #define REG_AMPDU_MAX_TIME_V1    0x0455
- #define REG_BCNQ1_BDNY_V1    0x0456
- #define REG_AMPDU_MAX_TIME    0x0456
-+#define REG_AMPDU_MAX_LENGTH    0x0458
- #define REG_WMAC_LBK_BF_HD    0x045D
- #define REG_TX_HANG_CTRL    0x045E
- #define BIT_EN_GNT_BT_AWAKE    BIT(3)
- #define BIT_EN_EOF_V1        BIT(2)
-+#define REG_FAST_EDCA_CTRL    0x0460
- #define REG_DATA_SC        0x0483
- #define REG_ARFR2_V1        0x048C
- #define REG_ARFRH2_V1        0x0490
-@@ -390,6 +420,8 @@
- #define REG_PRECNT_CTRL        0x04E5
- #define BIT_BTCCA_CTRL        (BIT(0) | BIT(1))
- #define BIT_EN_PRECNT        BIT(11)
-+#define REG_TX_RPT_CTRL        0x04EC
-+#define REG_TX_RPT_TIME        0x04F0
- #define REG_DUMMY_PAGE4_V1    0x04FC
-
- #define REG_EDCA_VO_PARAM    0x0500
-@@ -400,6 +432,7 @@
- #define BIT_MASK_CWMAX        GENMASK(15, 12)
- #define BIT_MASK_CWMIN        GENMASK(11, 8)
- #define BIT_MASK_AIFS        GENMASK(7, 0)
-+#define REG_BCNTCFG        0x0510
- #define REG_PIFS        0x0512
- #define REG_SIFS        0x0514
- #define BIT_SHIFT_SIFS_OFDM_CTX    8
-@@ -526,6 +559,8 @@
- #define REG_BT_COEX_V2        0x0762
- #define BIT_GNT_BT_POLARITY    BIT(12)
- #define BIT_LTE_COEX_EN        BIT(7)
-+#define REG_GNT_BT        0x0765
-+#define BIT_PTA_SW_CTL        GENMASK(4, 3)
- #define REG_BT_COEX_ENH_INTR_CTRL    0x76E
- #define BIT_R_GRANTALL_WLMASK    BIT(3)
- #define BIT_STATIS_BT_EN    BIT(2)
-@@ -543,14 +578,43 @@
- #define REG_FPGA0_RFMOD        0x0800
- #define BIT_CCKEN        BIT(24)
- #define BIT_OFDMEN        BIT(25)
-+#define REG_CCK_RPT_FORMAT    0x0804
-+#define BIT_CCK_RPT_FORMAT    BIT(16)
-+#define REG_RXPSEL        0x0808
-+#define BIT_RX_PSEL_RST        (BIT(28) | BIT(29))
-+#define REG_TXPSEL        0x080C
- #define REG_RX_GAIN_EN        0x081c
-+#define REG_CCASEL        0x082C
-+#define REG_PDMFTH        0x0830
-+#define REG_BWINDICATION    0x0834
-+#define REG_CCA2ND        0x0838
-+#define REG_L1PKTH        0x0848
-+#define REG_CLKTRK        0x0860
-+#define REG_ADCCLK        0x08AC
-+#define REG_HSSI_READ        0x08B0
-+#define REG_FPGA0_XCD_RF_PARA    0x08B4
-+#define REG_RX_MCS_LIMIT    0x08BC
-+#define REG_ADC160        0x08C4
-+#define REG_ANTSEL_SW        0x0900
-+#define REG_DAC_RSTB        0x090c
-+#define REG_SINGLE_TONE_CONT_TX    0x0914
-
- #define REG_RFE_CTRL_E        0x0974
- #define REG_2ND_CCA_CTRL    0x0976
-+#define REG_IQK_COM00        0x0978
-+#define REG_IQK_COM32        0x097c
-+#define REG_IQK_COM64        0x0980
-+#define REG_IQK_COM96        0x0984
-+
-+#define REG_FAS            0x09a4
-+#define REG_RXSB        0x0a00
-+#define REG_CCK_RX        0x0a04
-+#define REG_CCK_PD_TH        0x0a0a
-
- #define REG_CCK0_FAREPORT    0xa2c
- #define BIT_CCK0_2RX        BIT(18)
- #define BIT_CCK0_MRC        BIT(22)
-+#define REG_FA_CCK        0x0a5c
-
- #define REG_DIS_DPD        0x0a70
- #define DIS_DPD_MASK        GENMASK(9, 0)
-@@ -566,13 +630,109 @@
- #define DIS_DPD_RATEVHT2SS_MCS1    BIT(9)
- #define DIS_DPD_RATEALL        GENMASK(9, 0)
-
-+#define REG_CNTRST        0x0b58
-+
-+#define REG_3WIRE_SWA        0x0c00
-+#define REG_RX_IQC_AB_A        0x0c10
-+#define REG_TXSCALE_A        0x0c1c
-+#define BB_SWING_MASK        GENMASK(31, 21)
-+#define REG_TX_AGC_A_CCK_11_CCK_1        0xc20
-+#define REG_TX_AGC_A_OFDM18_OFDM6        0xc24
-+#define REG_TX_AGC_A_OFDM54_OFDM24        0xc28
-+#define REG_TX_AGC_A_MCS3_MCS0            0xc2c
-+#define REG_TX_AGC_A_MCS7_MCS4            0xc30
-+#define REG_TX_AGC_A_MCS11_MCS8            0xc34
-+#define REG_TX_AGC_A_MCS15_MCS12        0xc38
-+#define REG_TX_AGC_A_NSS1_INDEX3_NSS1_INDEX0    0xc3c
-+#define REG_TX_AGC_A_NSS1_INDEX7_NSS1_INDEX4    0xc40
-+#define REG_TX_AGC_A_NSS2_INDEX1_NSS1_INDEX8    0xc44
-+#define REG_TX_AGC_A_NSS2_INDEX5_NSS2_INDEX2    0xc48
-+#define REG_TX_AGC_A_NSS2_INDEX9_NSS2_INDEX6    0xc4c
-+#define REG_RXIGI_A        0x0c50
-+#define REG_TX_PWR_TRAINING_A    0x0c54
-+#define REG_CK_MONHA        0x0c5c
-+#define REG_AFE_PWR1_A        0x0c60
-+#define REG_AFE_PWR2_A        0x0c64
-+#define REG_RX_WAIT_CCA_TX_CCK_RFON_A    0x0c68
-+#define REG_OFDM0_XA_TX_IQ_IMBALANCE    0x0c80
-+#define REG_OFDM0_A_TX_AFE    0x0c84
-+#define REG_OFDM0_XB_TX_IQ_IMBALANCE    0x0c88
-+#define REG_TSSI_TRK_SW        0x0c8c
-+#define REG_LSSI_WRITE_A    0x0c90
-+#define REG_PREDISTA        0x0c90
-+#define REG_TXAGCIDX        0x0c94
-+
-+#define REG_RFE_PINMUX_A    0x0cb0
-+#define REG_RFE_INV_A        0x0cb4
- #define REG_RFE_CTRL8        0x0cb4
- #define BIT_MASK_RFE_SEL89    GENMASK(7, 0)
-+#define PTA_CTRL_PIN        0x66
-+#define DPDT_CTRL_PIN        0x77
-+#define RFE_INV_MASK        0x3ff00000
-+#define REG_RFECTL_A        0x0cb8
- #define REG_RFE_INV8        0x0cbd
- #define BIT_MASK_RFE_INV89    GENMASK(1, 0)
- #define REG_RFE_INV16        0x0cbe
- #define BIT_RFE_BUF_EN        BIT(3)
-
-+#define REG_IQK_DPD_CFG        0x0cc4
-+#define REG_CFG_PMPD        0x0cc8
-+#define REG_IQC_Y        0x0ccc
-+#define REG_IQC_X        0x0cd4
-+#define REG_INTPO_SETA        0x0ce8
-+
-+#define REG_IQKA_END        0x0d00
-+#define REG_PI_READ_A        0x0d04
-+#define REG_SI_READ_A        0x0d08
-+#define REG_IQKB_END        0x0d40
-+#define REG_PI_READ_B        0x0d44
-+#define REG_SI_READ_B        0x0d48
-+
-+#define REG_3WIRE_SWB        0x0e00
-+#define REG_RX_IQC_AB_B        0x0e10
-+#define REG_TXSCALE_B        0x0e1c
-+#define REG_TX_AGC_B_CCK_11_CCK_1        0xe20
-+#define REG_TX_AGC_B_OFDM18_OFDM6        0xe24
-+#define REG_TX_AGC_B_OFDM54_OFDM24        0xe28
-+#define REG_TX_AGC_B_MCS3_MCS0            0xe2c
-+#define REG_TX_AGC_B_MCS7_MCS4            0xe30
-+#define REG_TX_AGC_B_MCS11_MCS8            0xe34
-+#define REG_TX_AGC_B_MCS15_MCS12        0xe38
-+#define REG_TX_AGC_B_NSS1_INDEX3_NSS1_INDEX0    0xe3c
-+#define REG_TX_AGC_B_NSS1_INDEX7_NSS1_INDEX4    0xe40
-+#define REG_TX_AGC_B_NSS2_INDEX1_NSS1_INDEX8    0xe44
-+#define REG_TX_AGC_B_NSS2_INDEX5_NSS2_INDEX2    0xe48
-+#define REG_TX_AGC_B_NSS2_INDEX9_NSS2_INDEX6    0xe4c
-+#define REG_RXIGI_B        0x0e50
-+#define REG_TX_PWR_TRAINING_B    0x0e54
-+#define REG_CK_MONHB        0x0e5c
-+#define REG_AFE_PWR1_B        0x0e60
-+#define REG_AFE_PWR2_B        0x0e64
-+#define REG_RX_WAIT_CCA_TX_CCK_RFON_B    0x0e68
-+#define REG_TXTONEB        0x0e80
-+#define REG_RXTONEB        0x0e84
-+#define REG_TXPITMB        0x0e88
-+#define REG_RXPITMB        0x0e8c
-+#define REG_LSSI_WRITE_B    0x0e90
-+#define REG_PREDISTB        0x0e90
-+#define REG_INIDLYB        0x0e94
-+#define REG_RFE_PINMUX_B    0x0eb0
-+#define REG_RFE_INV_B        0x0eb4
-+#define REG_RFECTL_B        0x0eb8
-+#define REG_BPBDB        0x0ec4
-+#define REG_PHYTXONB        0x0ec8
-+#define REG_IQKYB        0x0ecc
-+#define REG_IQKXB        0x0ed4
-+#define REG_INTPO_SETB        0x0ee8
-+
-+#define REG_CRC_CCK        0x0f04
-+#define REG_CCA_OFDM        0x0f08
-+#define REG_CRC_VHT        0x0f0c
-+#define REG_CRC_HT        0x0f10
-+#define REG_CRC_OFDM        0x0f14
-+#define REG_FA_OFDM        0x0f48
-+#define REG_CCA_CCK        0x0fcc
-+
- #define REG_ANAPARSW_MAC_0    0x1010
- #define BIT_CF_L_V2        GENMASK(29, 28)
-
-@@ -709,6 +869,10 @@
-
- #define REG_IGN_GNTBT4    0x4160
-
-+#define REG_USB_MOD    0xf008
-+#define REG_USB3_RXITV    0xf050
-+#define REG_USB_HRPWM    0xfe58
-+
- #define RF_MODE        0x00
- #define RF_MODOPT    0x01
- #define RF_WLINT    0x01
-@@ -716,7 +880,13 @@
- #define RF_DTXLOK    0x08
- #define RF_CFGCH    0x18
- #define BIT_BAND    GENMASK(18, 16)
-+#define RF18_BAND_MASK    (BIT(16) | BIT(9) | BIT(8))
-+#define RF18_CHANNEL_MASK    (MASKBYTE0)
-+#define RF18_RFSI_MASK    (BIT(18) | BIT(17))
- #define RF_RCK        0x1d
-+#define RF_MODE_TABLE_ADDR    0x30
-+#define RF_MODE_TABLE_DATA0    0x31
-+#define RF_MODE_TABLE_DATA1    0x32
- #define RF_LUTWA    0x33
- #define RF_LUTWD1    0x3e
- #define RF_LUTWD0    0x3f
-@@ -725,10 +895,14 @@
- #define RF_T_METER    0x42
- #define RF_BSPAD    0x54
- #define RF_GAINTX    0x56
-+#define RF_TXMOD    0x58
- #define RF_TXATANK    0x64
-+#define RF_TXA_PREPAD    0x65
- #define RF_TRXIQ    0x66
- #define RF_RXIQGEN    0x8d
-+#define RF_RXBB2    0x8f
- #define RF_SYN_PFD    0xb0
-+#define RF_LCK        0xb4
- #define RF_XTALX2    0xb8
- #define RF_SYN_CTRL    0xbb
- #define RF_MALSEL    0xbe
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
-@@ -214,19 +214,10 @@ extern const struct rtw_chip_info rtw882
- #define BIT_FEN_EN    BIT(26)
- #define REG_INIRTS_RATE_SEL 0x0480
- #define REG_HTSTFWT    0x800
--#define REG_RXPSEL    0x808
--#define BIT_RX_PSEL_RST        (BIT(28) | BIT(29))
--#define REG_TXPSEL    0x80c
- #define REG_RXCCAMSK    0x814
--#define REG_CCASEL    0x82c
--#define REG_PDMFTH    0x830
--#define REG_CCA2ND    0x838
- #define REG_L1WT    0x83c
- #define REG_L1PKWT    0x840
- #define REG_MRC        0x850
--#define REG_CLKTRK    0x860
--#define REG_ADCCLK    0x8ac
--#define REG_ADC160    0x8c4
- #define REG_ADC40    0x8c8
- #define REG_CHFIR    0x8f0
- #define REG_CDDTXP    0x93c
-@@ -234,14 +225,11 @@ extern const struct rtw_chip_info rtw882
- #define REG_ACBB0    0x948
- #define REG_ACBBRXFIR    0x94c
- #define REG_ACGG2TBL    0x958
--#define REG_FAS        0x9a4
--#define REG_RXSB    0xa00
- #define REG_ADCINI    0xa04
- #define REG_PWRTH    0xa08
- #define REG_CCA_FLTR    0xa20
- #define REG_TXSF2    0xa24
- #define REG_TXSF6    0xa28
--#define REG_FA_CCK    0xa5c
- #define REG_RXDESC    0xa2c
- #define REG_ENTXCCK    0xa80
- #define BTG_LNA        0xfc84
-@@ -252,12 +240,8 @@ extern const struct rtw_chip_info rtw882
- #define REG_PWRTH2    0xaa8
- #define REG_CSRATIO    0xaaa
- #define REG_TXFILTER    0xaac
--#define REG_CNTRST    0xb58
- #define REG_AGCTR_A    0xc08
--#define REG_TXSCALE_A    0xc1c
- #define REG_TXDFIR    0xc20
--#define REG_RXIGI_A    0xc50
--#define REG_TXAGCIDX    0xc94
- #define REG_TRSW    0xca0
- #define REG_RFESEL0    0xcb0
- #define REG_RFESEL8    0xcb4
-@@ -269,14 +253,6 @@ extern const struct rtw_chip_info rtw882
- #define B_WLA_SWITCH    BIT(23)
- #define REG_RFEINV    0xcbc
- #define REG_AGCTR_B    0xe08
--#define REG_RXIGI_B    0xe50
--#define REG_CRC_CCK    0xf04
--#define REG_CRC_OFDM    0xf14
--#define REG_CRC_HT    0xf10
--#define REG_CRC_VHT    0xf0c
--#define REG_CCA_OFDM    0xf08
--#define REG_FA_OFDM    0xf48
--#define REG_CCA_CCK    0xfcc
- #define REG_DMEM_CTRL    0x1080
- #define BIT_WL_RST    BIT(16)
- #define REG_ANTWT    0x1904
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
-@@ -151,21 +151,12 @@ _rtw_write32s_mask(struct rtw_dev *rtwde
- #define RTW8822B_EDCCA_MAX    0x7f
- #define RTW8822B_EDCCA_SRC_DEF    1
- #define REG_HTSTFWT    0x800
--#define REG_RXPSEL    0x808
--#define BIT_RX_PSEL_RST        (BIT(28) | BIT(29))
--#define REG_TXPSEL    0x80c
- #define REG_RXCCAMSK    0x814
--#define REG_CCASEL    0x82c
--#define REG_PDMFTH    0x830
--#define REG_CCA2ND    0x838
- #define REG_L1WT    0x83c
- #define REG_L1PKWT    0x840
- #define REG_MRC        0x850
--#define REG_CLKTRK    0x860
- #define REG_EDCCA_POW_MA    0x8a0
- #define BIT_MA_LEVEL    GENMASK(1, 0)
--#define REG_ADCCLK    0x8ac
--#define REG_ADC160    0x8c4
- #define REG_ADC40    0x8c8
- #define REG_EDCCA_DECISION    0x8dc
- #define BIT_EDCCA_OPTION    BIT(5)
-@@ -176,7 +167,6 @@ _rtw_write32s_mask(struct rtw_dev *rtwde
- #define REG_ACBB0    0x948
- #define REG_ACBBRXFIR    0x94c
- #define REG_ACGG2TBL    0x958
--#define REG_RXSB    0xa00
- #define REG_ADCINI    0xa04
- #define REG_TXSF2    0xa24
- #define REG_TXSF6    0xa28
-@@ -184,14 +174,12 @@ _rtw_write32s_mask(struct rtw_dev *rtwde
- #define REG_ENTXCCK    0xa80
- #define REG_AGCTR_A    0xc08
- #define REG_TXDFIR    0xc20
--#define REG_RXIGI_A    0xc50
- #define REG_TRSW    0xca0
- #define REG_RFESEL0    0xcb0
- #define REG_RFESEL8    0xcb4
- #define REG_RFECTL    0xcb8
- #define REG_RFEINV    0xcbc
- #define REG_AGCTR_B    0xe08
--#define REG_RXIGI_B    0xe50
- #define REG_ANTWT    0x1904
- #define REG_IQKFAILMSK    0x1bf0
-
diff --git 
a/package/kernel/mac80211/patches/rtl/025-v6.13-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch 
b/package/kernel/mac80211/patches/rtl/025-v6.13-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch
deleted file mode 100644
index 279e8ba761d226..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/025-v6.13-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 87341ca1eac9a3bac23bd41f6e24f3c93b77452f Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:02:05 +0300
-Subject: [PATCH] wifi: rtw88: Dump the HW features only for some chips
-
-RTL8821AU and RTL8812AU don't support this. They hit the "failed to read
-hw feature report" error.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/8becd851-8760-4480-8e8c-c4869ce72507@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.c     | 3 +++
- drivers/net/wireless/realtek/rtw88/main.h     | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
- 7 files changed, 9 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -1917,6 +1917,9 @@ static int rtw_dump_hw_feature(struct rt
-     u8 bw;
-     int i;
-
-+    if (!rtwdev->chip->hw_feature_report)
-+        return 0;
-+
-     id = rtw_read8(rtwdev, REG_C2HEVT);
-     if (id != C2H_HW_FEATURE_REPORT) {
-         rtw_err(rtwdev, "failed to read hw feature report\n");
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1200,6 +1200,7 @@ struct rtw_chip_info {
-     const struct rtw_fwcd_segs *fwcd_segs;
-
-     u8 usb_tx_agg_desc_num;
-+    bool hw_feature_report;
-
-     u8 default_1ss_tx_path;
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -1960,6 +1960,7 @@ const struct rtw_chip_info rtw8703b_hw_s
-     .max_power_index = 0x3f,
-     .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-     .usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB 
interface */
-+    .hw_feature_report = true,
-
-     .path_div_supported = false,
-     .ht_supported = true,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -2131,6 +2131,7 @@ const struct rtw_chip_info rtw8723d_hw_s
-     .page_size = TX_PAGE_SIZE,
-     .dig_min = 0x20,
-     .usb_tx_agg_desc_num = 1,
-+    .hw_feature_report = true,
-     .ht_supported = true,
-     .vht_supported = false,
-     .lps_deep_mode_supported = 0,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1968,6 +1968,7 @@ const struct rtw_chip_info rtw8821c_hw_s
-     .page_size = TX_PAGE_SIZE,
-     .dig_min = 0x1c,
-     .usb_tx_agg_desc_num = 3,
-+    .hw_feature_report = true,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -2509,6 +2509,7 @@ const struct rtw_chip_info rtw8822b_hw_s
-     .page_size = TX_PAGE_SIZE,
-     .dig_min = 0x1c,
-     .usb_tx_agg_desc_num = 3,
-+    .hw_feature_report = true,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -5329,6 +5329,7 @@ const struct rtw_chip_info rtw8822c_hw_s
-     .page_size = TX_PAGE_SIZE,
-     .dig_min = 0x20,
-     .usb_tx_agg_desc_num = 3,
-+    .hw_feature_report = true,
-     .default_1ss_tx_path = BB_PATH_A,
-     .path_div_supported = true,
-     .ht_supported = true,
diff --git 
a/package/kernel/mac80211/patches/rtl/026-v6.13-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch 
b/package/kernel/mac80211/patches/rtl/026-v6.13-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch
deleted file mode 100644
index 0e97febb727031..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/026-v6.13-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch
+++ /dev/null
@@ -1,175 +0,0 @@
-From d9018f4373517d4560ce2ebf12684f77f5fbdad6 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:06:14 +0300
-Subject: [PATCH] wifi: rtw88: Allow different C2H RA report sizes
-
-The RTL8821AU and RTL8812AU have smaller RA report size, only 4 bytes.
-Avoid the "invalid ra report c2h length" error.
-
-Also, use a struct and u8_get_bits() to access the RA report C2H.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/c3e73c3a-fb2f-4013-9f06-d5274211e282@gmail.com
----
- drivers/net/wireless/realtek/rtw88/fw.c       | 21 +++++++++++++------
- drivers/net/wireless/realtek/rtw88/fw.h       | 17 +++++++++++----
- drivers/net/wireless/realtek/rtw88/main.h     |  1 +
- drivers/net/wireless/realtek/rtw88/rtw8703b.c |  1 +
- drivers/net/wireless/realtek/rtw88/rtw8723d.c |  1 +
- drivers/net/wireless/realtek/rtw88/rtw8821c.c |  1 +
- drivers/net/wireless/realtek/rtw88/rtw8822b.c |  1 +
- drivers/net/wireless/realtek/rtw88/rtw8822c.c |  1 +
- 8 files changed, 34 insertions(+), 10 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/fw.c
-+++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -139,25 +139,30 @@ static u16 get_max_amsdu_len(u32 bit_rat
- struct rtw_fw_iter_ra_data {
-     struct rtw_dev *rtwdev;
-     u8 *payload;
-+    u8 length;
- };
-
- static void rtw_fw_ra_report_iter(void *data, struct ieee80211_sta *sta)
- {
-     struct rtw_fw_iter_ra_data *ra_data = data;
-+    struct rtw_c2h_ra_rpt *ra_rpt = (struct rtw_c2h_ra_rpt 
*)ra_data->payload;
-     struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
-     u8 mac_id, rate, sgi, bw;
-     u8 mcs, nss;
-     u32 bit_rate;
-
--    mac_id = GET_RA_REPORT_MACID(ra_data->payload);
-+    mac_id = ra_rpt->mac_id;
-     if (si->mac_id != mac_id)
-         return;
-
-     si->ra_report.txrate.flags = 0;
-
--    rate = GET_RA_REPORT_RATE(ra_data->payload);
--    sgi = GET_RA_REPORT_SGI(ra_data->payload);
--    bw = GET_RA_REPORT_BW(ra_data->payload);
-+    rate = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_RATE);
-+    sgi = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_SGI);
-+    if (ra_data->length >= offsetofend(typeof(*ra_rpt), bw))
-+        bw = ra_rpt->bw;
-+    else
-+        bw = si->bw_mode;
-
-     if (rate < DESC_RATEMCS0) {
-         si->ra_report.txrate.legacy = rtw_desc_to_bitrate(rate);
-@@ -197,14 +202,18 @@ legacy:
- static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload,
-                     u8 length)
- {
-+    struct rtw_c2h_ra_rpt *ra_rpt = (struct rtw_c2h_ra_rpt *)payload;
-     struct rtw_fw_iter_ra_data ra_data;
-
--    if (WARN(length < 7, "invalid ra report c2h length\n"))
-+    if (WARN(length < rtwdev->chip->c2h_ra_report_size,
-+         "invalid ra report c2h length %d\n", length))
-         return;
-
--    rtwdev->dm_info.tx_rate = GET_RA_REPORT_RATE(payload);
-+    rtwdev->dm_info.tx_rate = u8_get_bits(ra_rpt->rate_sgi,
-+                          RTW_C2H_RA_RPT_RATE);
-     ra_data.rtwdev = rtwdev;
-     ra_data.payload = payload;
-+    ra_data.length = length;
-     rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data);
- }
-
---- a/drivers/net/wireless/realtek/rtw88/fw.h
-+++ b/drivers/net/wireless/realtek/rtw88/fw.h
-@@ -85,6 +85,19 @@ struct rtw_c2h_adaptivity {
-     u8 option;
- } __packed;
-
-+struct rtw_c2h_ra_rpt {
-+    u8 rate_sgi;
-+    u8 mac_id;
-+    u8 byte2;
-+    u8 status;
-+    u8 byte4;
-+    u8 ra_ratio;
-+    u8 bw;
-+} __packed;
-+
-+#define RTW_C2H_RA_RPT_RATE    GENMASK(6, 0)
-+#define RTW_C2H_RA_RPT_SGI    BIT(7)
-+
- struct rtw_h2c_register {
-     u32 w0;
-     u32 w1;
-@@ -364,10 +377,6 @@ struct rtw_fw_hdr_legacy {
- #define GET_CHAN_SWITCH_CENTRAL_CH(c2h_payload) (c2h_payload[2])
- #define GET_CHAN_SWITCH_ID(c2h_payload)        (c2h_payload[3])
- #define GET_CHAN_SWITCH_STATUS(c2h_payload)    (c2h_payload[4])
--#define GET_RA_REPORT_RATE(c2h_payload)        (c2h_payload[0] & 0x7f)
--#define GET_RA_REPORT_SGI(c2h_payload)        ((c2h_payload[0] & 0x80) 
 >> 7)
--#define GET_RA_REPORT_BW(c2h_payload)        (c2h_payload[6])
--#define GET_RA_REPORT_MACID(c2h_payload)    (c2h_payload[1])
-
- #define GET_BCN_FILTER_NOTIFY_TYPE(c2h_payload) (c2h_payload[1] & 0xf)
- #define GET_BCN_FILTER_NOTIFY_EVENT(c2h_payload) (c2h_payload[1] & 0x10)
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1201,6 +1201,7 @@ struct rtw_chip_info {
-
-     u8 usb_tx_agg_desc_num;
-     bool hw_feature_report;
-+    u8 c2h_ra_report_size;
-
-     u8 default_1ss_tx_path;
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -1961,6 +1961,7 @@ const struct rtw_chip_info rtw8703b_hw_s
-     .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-     .usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB 
interface */
-     .hw_feature_report = true,
-+    .c2h_ra_report_size = 7,
-
-     .path_div_supported = false,
-     .ht_supported = true,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -2132,6 +2132,7 @@ const struct rtw_chip_info rtw8723d_hw_s
-     .dig_min = 0x20,
-     .usb_tx_agg_desc_num = 1,
-     .hw_feature_report = true,
-+    .c2h_ra_report_size = 7,
-     .ht_supported = true,
-     .vht_supported = false,
-     .lps_deep_mode_supported = 0,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1969,6 +1969,7 @@ const struct rtw_chip_info rtw8821c_hw_s
-     .dig_min = 0x1c,
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-+    .c2h_ra_report_size = 7,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -2510,6 +2510,7 @@ const struct rtw_chip_info rtw8822b_hw_s
-     .dig_min = 0x1c,
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-+    .c2h_ra_report_size = 7,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -5330,6 +5330,7 @@ const struct rtw_chip_info rtw8822c_hw_s
-     .dig_min = 0x20,
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-+    .c2h_ra_report_size = 7,
-     .default_1ss_tx_path = BB_PATH_A,
-     .path_div_supported = true,
-     .ht_supported = true,
diff --git 
a/package/kernel/mac80211/patches/rtl/027-v6.13-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch 
b/package/kernel/mac80211/patches/rtl/027-v6.13-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch
deleted file mode 100644
index aec2e6aaecf6a7..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/027-v6.13-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch
+++ /dev/null
@@ -1,165 +0,0 @@
-From 95a772e30b60e7954d03f3372268722475aa303f Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:08:24 +0300
-Subject: [PATCH] wifi: rtw88: Extend the init table parsing for RTL8812AU
-
-The chips supported so far only use the first condition, and so the
-parsing code ignores the second condition. RTL8812AU's init tables use
-the second condition also. Make the parsing code check it.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/1bee6b74-6eab-44a3-9f40-794ca006c72d@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.h | 15 ++++++
- drivers/net/wireless/realtek/rtw88/phy.c  | 62 ++++++++++++++++++++---
- 2 files changed, 69 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1835,6 +1835,20 @@ struct rtw_phy_cond {
-     #define BRANCH_ENDIF    3
- };
-
-+struct rtw_phy_cond2 {
-+#ifdef __LITTLE_ENDIAN
-+    u8 type_glna;
-+    u8 type_gpa;
-+    u8 type_alna;
-+    u8 type_apa;
-+#else
-+    u8 type_apa;
-+    u8 type_alna;
-+    u8 type_gpa;
-+    u8 type_glna;
-+#endif
-+};
-+
- struct rtw_fifo_conf {
-     /* tx fifo information */
-     u16 rsvd_boundary;
-@@ -1916,6 +1930,7 @@ struct rtw_hal {
-     u8 oem_id;
-     u8 pkg_type;
-     struct rtw_phy_cond phy_cond;
-+    struct rtw_phy_cond2 phy_cond2;
-     bool rfe_btg;
-
-     u8 ps_mode;
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -18,7 +18,10 @@ struct phy_cfg_pair {
- };
-
- union phy_table_tile {
--    struct rtw_phy_cond cond;
-+    struct {
-+        struct rtw_phy_cond cond;
-+        struct rtw_phy_cond2 cond2;
-+    } __packed;
-     struct phy_cfg_pair cfg;
- };
-
-@@ -1041,7 +1044,8 @@ void rtw_phy_setup_phy_cond(struct rtw_d
- {
-     struct rtw_hal *hal = &rtwdev->hal;
-     struct rtw_efuse *efuse = &rtwdev->efuse;
--    struct rtw_phy_cond cond = {0};
-+    struct rtw_phy_cond cond = {};
-+    struct rtw_phy_cond2 cond2 = {};
-
-     cond.cut = hal->cut_version ? hal->cut_version : 15;
-     cond.pkg = pkg ? pkg : 15;
-@@ -1061,15 +1065,34 @@ void rtw_phy_setup_phy_cond(struct rtw_d
-         break;
-     }
-
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
-+        rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
-+        cond.rfe = 0;
-+        cond.rfe |= efuse->ext_lna_2g;
-+        cond.rfe |= efuse->ext_pa_2g  << 1;
-+        cond.rfe |= efuse->ext_lna_5g << 2;
-+        cond.rfe |= efuse->ext_pa_5g  << 3;
-+        cond.rfe |= efuse->btcoex     << 4;
-+
-+        cond2.type_alna = efuse->alna_type;
-+        cond2.type_glna = efuse->glna_type;
-+        cond2.type_apa = efuse->apa_type;
-+        cond2.type_gpa = efuse->gpa_type;
-+    }
-+
-     hal->phy_cond = cond;
-+    hal->phy_cond2 = cond2;
-
--    rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x\n", *((u32 
*)&hal->phy_cond));
-+    rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x cond2=0x%08x\n",
-+        *((u32 *)&hal->phy_cond), *((u32 *)&hal->phy_cond2));
- }
-
--static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond 
cond)
-+static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond 
cond,
-+               struct rtw_phy_cond2 cond2)
- {
-     struct rtw_hal *hal = &rtwdev->hal;
-     struct rtw_phy_cond drv_cond = hal->phy_cond;
-+    struct rtw_phy_cond2 drv_cond2 = hal->phy_cond2;
-
-     if (cond.cut && cond.cut != drv_cond.cut)
-         return false;
-@@ -1080,8 +1103,29 @@ static bool check_positive(struct rtw_de
-     if (cond.intf && cond.intf != drv_cond.intf)
-         return false;
-
--    if (cond.rfe != drv_cond.rfe)
--        return false;
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
-+        rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
-+        if (!(cond.rfe & 0x0f))
-+            return true;
-+
-+        if ((cond.rfe & drv_cond.rfe) != cond.rfe)
-+            return false;
-+
-+        if ((cond.rfe & BIT(0)) && cond2.type_glna != drv_cond2.type_glna)
-+            return false;
-+
-+        if ((cond.rfe & BIT(1)) && cond2.type_gpa != drv_cond2.type_gpa)
-+            return false;
-+
-+        if ((cond.rfe & BIT(2)) && cond2.type_alna != drv_cond2.type_alna)
-+            return false;
-+
-+        if ((cond.rfe & BIT(3)) && cond2.type_apa != drv_cond2.type_apa)
-+            return false;
-+    } else {
-+        if (cond.rfe != drv_cond.rfe)
-+            return false;
-+    }
-
-     return true;
- }
-@@ -1090,7 +1134,8 @@ void rtw_parse_tbl_phy_cond(struct rtw_d
- {
-     const union phy_table_tile *p = tbl->data;
-     const union phy_table_tile *end = p + tbl->size / 2;
--    struct rtw_phy_cond pos_cond = {0};
-+    struct rtw_phy_cond pos_cond = {};
-+    struct rtw_phy_cond2 pos_cond2 = {};
-     bool is_matched = true, is_skipped = false;
-
-     BUILD_BUG_ON(sizeof(union phy_table_tile) != sizeof(struct 
phy_cfg_pair));
-@@ -1109,11 +1154,12 @@ void rtw_parse_tbl_phy_cond(struct rtw_d
-             case BRANCH_ELIF:
-             default:
-                 pos_cond = p->cond;
-+                pos_cond2 = p->cond2;
-                 break;
-             }
-         } else if (p->cond.neg) {
-             if (!is_skipped) {
--                if (check_positive(rtwdev, pos_cond)) {
-+                if (check_positive(rtwdev, pos_cond, pos_cond2)) {
-                     is_matched = true;
-                     is_skipped = true;
-                 } else {
diff --git 
a/package/kernel/mac80211/patches/rtl/028-v6.13-wifi-rtw88-Allow-rtw_chip_info.ltecoex_addr-to-be-NU.patch 
b/package/kernel/mac80211/patches/rtl/028-v6.13-wifi-rtw88-Allow-rtw_chip_info.ltecoex_addr-to-be-NU.patch
deleted file mode 100644
index 5486fb2d25e099..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/028-v6.13-wifi-rtw88-Allow-rtw_chip_info.ltecoex_addr-to-be-NU.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 7c5bbeba7c36575a3a57ef4be775b2f3fb68c3f9 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:09:04 +0300
-Subject: [PATCH] wifi: rtw88: Allow rtw_chip_info.ltecoex_addr to be NULL
-
-RTL8821A doesn't have this. Trying to use it results in error messages,
-so don't try if ltecoex_addr is NULL.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/d1004817-1760-41d1-9136-3d799757c444@gmail.com
----
- drivers/net/wireless/realtek/rtw88/coex.c | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/coex.c
-+++ b/drivers/net/wireless/realtek/rtw88/coex.c
-@@ -950,12 +950,18 @@ static void rtw_coex_coex_ctrl_owner(str
-
- static void rtw_coex_set_gnt_bt(struct rtw_dev *rtwdev, u8 state)
- {
-+    if (!rtwdev->chip->ltecoex_addr)
-+        return;
-+
-     rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0xc000, state);
-     rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0c00, state);
- }
-
- static void rtw_coex_set_gnt_wl(struct rtw_dev *rtwdev, u8 state)
- {
-+    if (!rtwdev->chip->ltecoex_addr)
-+        return;
-+
-     rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x3000, state);
-     rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0300, state);
- }
-@@ -3904,7 +3910,7 @@ void rtw_coex_display_coex_info(struct r
-     u8 sys_lte;
-     u16 score_board_WB, score_board_BW;
-     u32 wl_reg_6c0, wl_reg_6c4, wl_reg_6c8, wl_reg_778, wl_reg_6cc;
--    u32 lte_coex, bt_coex;
-+    u32 lte_coex = 0, bt_coex = 0;
-     int i;
-
-     score_board_BW = rtw_coex_read_scbd(rtwdev);
-@@ -3916,8 +3922,10 @@ void rtw_coex_display_coex_info(struct r
-     wl_reg_778 = rtw_read8(rtwdev, REG_BT_STAT_CTRL);
-
-     sys_lte = rtw_read8(rtwdev, 0x73);
--    lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
--    bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
-+    if (rtwdev->chip->ltecoex_addr) {
-+        lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
-+        bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
-+    }
-
-     if (!coex_stat->wl_under_ips &&
-         (!coex_stat->wl_under_lps || coex_stat->wl_force_lps_ctrl) &&
diff --git 
a/package/kernel/mac80211/patches/rtl/029-v6.13-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch 
b/package/kernel/mac80211/patches/rtl/029-v6.13-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch
deleted file mode 100644
index 10464b80cd0339..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/029-v6.13-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch
+++ /dev/null
@@ -1,272 +0,0 @@
-From fbb5e1b3637a720c83c91a7b1476ab0429bfc747 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:09:47 +0300
-Subject: [PATCH] wifi: rtw88: Let each driver control the power on/off 
process
-
-RTL8821AU and RTL8812AU have to do some things differently, so let
-them have full control.
-
-The other chips use the same functions as before.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/98ab839f-9100-44ae-9551-9af743a4aa3a@gmail.com
----
- drivers/net/wireless/realtek/rtw88/coex.c     |  3 +++
- drivers/net/wireless/realtek/rtw88/mac.c      | 11 +++++++----
- drivers/net/wireless/realtek/rtw88/mac.h      |  3 +++
- drivers/net/wireless/realtek/rtw88/main.c     | 13 ++++++++-----
- drivers/net/wireless/realtek/rtw88/main.h     |  5 +++++
- drivers/net/wireless/realtek/rtw88/rtw8703b.c |  2 ++
- drivers/net/wireless/realtek/rtw88/rtw8723d.c |  2 ++
- drivers/net/wireless/realtek/rtw88/rtw8821c.c |  2 ++
- drivers/net/wireless/realtek/rtw88/rtw8822b.c |  2 ++
- drivers/net/wireless/realtek/rtw88/rtw8822c.c |  2 ++
- 10 files changed, 36 insertions(+), 9 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/coex.c
-+++ b/drivers/net/wireless/realtek/rtw88/coex.c
-@@ -2753,16 +2753,19 @@ void rtw_coex_power_on_setting(struct rt
-     rtw_write8(rtwdev, 0xff1a, 0x0);
-     rtw_coex_set_gnt_debug(rtwdev);
- }
-+EXPORT_SYMBOL(rtw_coex_power_on_setting);
-
- void rtw_coex_power_off_setting(struct rtw_dev *rtwdev)
- {
-     rtw_write16(rtwdev, REG_WIFI_BT_INFO, BIT_BT_INT_EN);
- }
-+EXPORT_SYMBOL(rtw_coex_power_off_setting);
-
- void rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only)
- {
-     __rtw_coex_init_hw_config(rtwdev, wifi_only);
- }
-+EXPORT_SYMBOL(rtw_coex_init_hw_config);
-
- void rtw_coex_ips_notify(struct rtw_dev *rtwdev, u8 type)
- {
---- a/drivers/net/wireless/realtek/rtw88/mac.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac.c
-@@ -227,8 +227,8 @@ static int rtw_sub_pwr_seq_parser(struct
-     return 0;
- }
-
--static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
--                  const struct rtw_pwr_seq_cmd * const *cmd_seq)
-+int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
-+               const struct rtw_pwr_seq_cmd * const *cmd_seq)
- {
-     u8 cut_mask;
-     u8 intf_mask;
-@@ -267,6 +267,7 @@ static int rtw_pwr_seq_parser(struct rtw
-
-     return 0;
- }
-+EXPORT_SYMBOL(rtw_pwr_seq_parser);
-
- static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
- {
-@@ -994,6 +995,7 @@ int rtw_download_firmware(struct rtw_dev
-
-     return 0;
- }
-+EXPORT_SYMBOL(rtw_download_firmware);
-
- static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues)
- {
-@@ -1127,7 +1129,7 @@ static int txdma_queue_mapping(struct rt
-     return 0;
- }
-
--static int set_trx_fifo_info(struct rtw_dev *rtwdev)
-+int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
- {
-     const struct rtw_chip_info *chip = rtwdev->chip;
-     struct rtw_fifo_conf *fifo = &rtwdev->fifo;
-@@ -1179,6 +1181,7 @@ static int set_trx_fifo_info(struct rtw_
-
-     return 0;
- }
-+EXPORT_SYMBOL(rtw_set_trx_fifo_info);
-
- static int __priority_queue_cfg(struct rtw_dev *rtwdev,
-                 const struct rtw_page_table *pg_tbl,
-@@ -1256,7 +1259,7 @@ static int priority_queue_cfg(struct rtw
-     u16 pubq_num;
-     int ret;
-
--    ret = set_trx_fifo_info(rtwdev);
-+    ret = rtw_set_trx_fifo_info(rtwdev);
-     if (ret)
-         return ret;
-
---- a/drivers/net/wireless/realtek/rtw88/mac.h
-+++ b/drivers/net/wireless/realtek/rtw88/mac.h
-@@ -30,11 +30,14 @@
-
- void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
-              u8 primary_ch_idx);
-+int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
-+               const struct rtw_pwr_seq_cmd * const *cmd_seq);
- int rtw_mac_power_on(struct rtw_dev *rtwdev);
- void rtw_mac_power_off(struct rtw_dev *rtwdev);
- int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state 
*fw);
- int rtw_mac_init(struct rtw_dev *rtwdev);
- void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop);
-+int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev);
- int rtw_ddma_to_fw_fifo(struct rtw_dev *rtwdev, u32 ocp_src, u32 size);
-
- static inline void rtw_mac_flush_all_queues(struct rtw_dev *rtwdev, 
bool drop)
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -1309,7 +1309,7 @@ void rtw_update_sta_info(struct rtw_dev
-     rtw_fw_send_ra_info(rtwdev, si, reset_ra_mask);
- }
-
--static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
-+int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
- {
-     const struct rtw_chip_info *chip = rtwdev->chip;
-     struct rtw_fw_state *fw;
-@@ -1329,6 +1329,7 @@ static int rtw_wait_firmware_completion(
-
-     return ret;
- }
-+EXPORT_SYMBOL(rtw_wait_firmware_completion);
-
- static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev 
*rtwdev,
-                                struct rtw_fw_state *fw)
-@@ -1350,7 +1351,7 @@ static enum rtw_lps_deep_mode rtw_update
-     return LPS_DEEP_MODE_NONE;
- }
-
--static int rtw_power_on(struct rtw_dev *rtwdev)
-+int rtw_power_on(struct rtw_dev *rtwdev)
- {
-     const struct rtw_chip_info *chip = rtwdev->chip;
-     struct rtw_fw_state *fw = &rtwdev->fw;
-@@ -1413,6 +1414,7 @@ err_off:
- err:
-     return ret;
- }
-+EXPORT_SYMBOL(rtw_power_on);
-
- void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start)
- {
-@@ -1485,7 +1487,7 @@ int rtw_core_start(struct rtw_dev *rtwde
- {
-     int ret;
-
--    ret = rtw_power_on(rtwdev);
-+    ret = rtwdev->chip->ops->power_on(rtwdev);
-     if (ret)
-         return ret;
-
-@@ -1505,12 +1507,13 @@ int rtw_core_start(struct rtw_dev *rtwde
-     return 0;
- }
-
--static void rtw_power_off(struct rtw_dev *rtwdev)
-+void rtw_power_off(struct rtw_dev *rtwdev)
- {
-     rtw_hci_stop(rtwdev);
-     rtw_coex_power_off_setting(rtwdev);
-     rtw_mac_power_off(rtwdev);
- }
-+EXPORT_SYMBOL(rtw_power_off);
-
- void rtw_core_stop(struct rtw_dev *rtwdev)
- {
-@@ -1535,7 +1538,7 @@ void rtw_core_stop(struct rtw_dev *rtwde
-
-     mutex_lock(&rtwdev->mutex);
-
--    rtw_power_off(rtwdev);
-+    rtwdev->chip->ops->power_off(rtwdev);
- }
-
- static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -843,6 +843,8 @@ struct rtw_regd {
- };
-
- struct rtw_chip_ops {
-+    int (*power_on)(struct rtw_dev *rtwdev);
-+    void (*power_off)(struct rtw_dev *rtwdev);
-     int (*mac_init)(struct rtw_dev *rtwdev);
-     int (*dump_fw_crash)(struct rtw_dev *rtwdev);
-     void (*shutdown)(struct rtw_dev *rtwdev);
-@@ -2209,6 +2211,7 @@ void rtw_core_scan_start(struct rtw_dev
- void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct 
ieee80211_vif *vif,
-                 bool hw_scan);
- int rtw_core_start(struct rtw_dev *rtwdev);
-+void rtw_power_off(struct rtw_dev *rtwdev);
- void rtw_core_stop(struct rtw_dev *rtwdev);
- int rtw_chip_info_setup(struct rtw_dev *rtwdev);
- int rtw_core_init(struct rtw_dev *rtwdev);
-@@ -2223,6 +2226,8 @@ int rtw_sta_add(struct rtw_dev *rtwdev,
- void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
-             bool fw_exist);
- void rtw_fw_recovery(struct rtw_dev *rtwdev);
-+int rtw_wait_firmware_completion(struct rtw_dev *rtwdev);
-+int rtw_power_on(struct rtw_dev *rtwdev);
- void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
- int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
-         u32 fwcd_item);
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -1888,6 +1888,8 @@ static const struct coex_tdma_para tdma_
- };
-
- static const struct rtw_chip_ops rtw8703b_ops = {
-+    .power_on        = rtw_power_on,
-+    .power_off        = rtw_power_off,
-     .mac_init        = rtw8723x_mac_init,
-     .dump_fw_crash        = NULL,
-     .shutdown        = NULL,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -1390,6 +1390,8 @@ static void rtw8723d_pwr_track(struct rt
- }
-
- static const struct rtw_chip_ops rtw8723d_ops = {
-+    .power_on        = rtw_power_on,
-+    .power_off        = rtw_power_off,
-     .phy_set_param        = rtw8723d_phy_set_param,
-     .read_efuse        = rtw8723x_read_efuse,
-     .query_phy_status    = query_phy_status,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1643,6 +1643,8 @@ static const struct rtw_prioq_addrs prio
- };
-
- static const struct rtw_chip_ops rtw8821c_ops = {
-+    .power_on        = rtw_power_on,
-+    .power_off        = rtw_power_off,
-     .phy_set_param        = rtw8821c_phy_set_param,
-     .read_efuse        = rtw8821c_read_efuse,
-     .query_phy_status    = query_phy_status,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -2132,6 +2132,8 @@ static const struct rtw_prioq_addrs prio
- };
-
- static const struct rtw_chip_ops rtw8822b_ops = {
-+    .power_on        = rtw_power_on,
-+    .power_off        = rtw_power_off,
-     .phy_set_param        = rtw8822b_phy_set_param,
-     .read_efuse        = rtw8822b_read_efuse,
-     .query_phy_status    = query_phy_status,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -4947,6 +4947,8 @@ static const struct rtw_prioq_addrs prio
- };
-
- static const struct rtw_chip_ops rtw8822c_ops = {
-+    .power_on        = rtw_power_on,
-+    .power_off        = rtw_power_off,
-     .phy_set_param        = rtw8822c_phy_set_param,
-     .read_efuse        = rtw8822c_read_efuse,
-     .query_phy_status    = query_phy_status,
diff --git 
a/package/kernel/mac80211/patches/rtl/030-v6.13-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch 
b/package/kernel/mac80211/patches/rtl/030-v6.13-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch
deleted file mode 100644
index 944985edc97ad5..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/030-v6.13-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch
+++ /dev/null
@@ -1,194 +0,0 @@
-From c7706b1173c77185a2ef40c7d1811021566563f3 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:10:32 +0300
-Subject: [PATCH] wifi: rtw88: Enable data rate fallback for older chips
-
-RTL8811AU fails to perform the 4-way handshake when the AP is too far
-because it transmits the EAPOL frames at MCS9 and when that doesn't
-work it retries 48 times with the same rate, to no avail.
-
-Retrying 48 times with the same rate seems pointless. Set the
-appropriate field in the TX descriptor to allow it to use lower rates
-when retrying.
-
-Set it for RTL8723D and RTL8703B because they interpret this field the
-same way as RTL8811A.
-
-The newer RTL8822C, RTL8822B, RTL8821C seem to interpret this field in
-the TX descriptor differently, so leave it alone for those chips.
-
-Tested with RTL8811AU and RTL8723DU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/2b3e3e6f-541b-4a3b-8ca3-65b267e6a95a@gmail.com
----
- drivers/net/wireless/realtek/rtw88/fw.c       | 2 +-
- drivers/net/wireless/realtek/rtw88/main.h     | 1 +
- drivers/net/wireless/realtek/rtw88/pci.c      | 2 +-
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
- drivers/net/wireless/realtek/rtw88/sdio.c     | 2 +-
- drivers/net/wireless/realtek/rtw88/tx.c       | 6 +++++-
- drivers/net/wireless/realtek/rtw88/tx.h       | 4 +++-
- drivers/net/wireless/realtek/rtw88/usb.c      | 4 ++--
- 12 files changed, 19 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/fw.c
-+++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -1290,7 +1290,7 @@ static void rtw_fill_rsvd_page_desc(stru
-     rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type);
-     pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
-     memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
--    rtw_tx_fill_tx_desc(&pkt_info, skb);
-+    rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
- }
-
- static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1204,6 +1204,7 @@ struct rtw_chip_info {
-     u8 usb_tx_agg_desc_num;
-     bool hw_feature_report;
-     u8 c2h_ra_report_size;
-+    bool old_datarate_fb_limit;
-
-     u8 default_1ss_tx_path;
-
---- a/drivers/net/wireless/realtek/rtw88/pci.c
-+++ b/drivers/net/wireless/realtek/rtw88/pci.c
-@@ -824,7 +824,7 @@ static int rtw_pci_tx_write_data(struct
-     pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
-     memset(pkt_desc, 0, tx_pkt_desc_sz);
-     pkt_info->qsel = rtw_pci_get_tx_qsel(skb, queue);
--    rtw_tx_fill_tx_desc(pkt_info, skb);
-+    rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
-     dma = dma_map_single(&rtwpci->pdev->dev, skb->data, skb->len,
-                  DMA_TO_DEVICE);
-     if (dma_mapping_error(&rtwpci->pdev->dev, dma))
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -1964,6 +1964,7 @@ const struct rtw_chip_info rtw8703b_hw_s
-     .usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB 
interface */
-     .hw_feature_report = true,
-     .c2h_ra_report_size = 7,
-+    .old_datarate_fb_limit = true,
-
-     .path_div_supported = false,
-     .ht_supported = true,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -2135,6 +2135,7 @@ const struct rtw_chip_info rtw8723d_hw_s
-     .usb_tx_agg_desc_num = 1,
-     .hw_feature_report = true,
-     .c2h_ra_report_size = 7,
-+    .old_datarate_fb_limit = true,
-     .ht_supported = true,
-     .vht_supported = false,
-     .lps_deep_mode_supported = 0,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1972,6 +1972,7 @@ const struct rtw_chip_info rtw8821c_hw_s
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-     .c2h_ra_report_size = 7,
-+    .old_datarate_fb_limit = false,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -2513,6 +2513,7 @@ const struct rtw_chip_info rtw8822b_hw_s
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-     .c2h_ra_report_size = 7,
-+    .old_datarate_fb_limit = false,
-     .ht_supported = true,
-     .vht_supported = true,
-     .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -5333,6 +5333,7 @@ const struct rtw_chip_info rtw8822c_hw_s
-     .usb_tx_agg_desc_num = 3,
-     .hw_feature_report = true,
-     .c2h_ra_report_size = 7,
-+    .old_datarate_fb_limit = false,
-     .default_1ss_tx_path = BB_PATH_A,
-     .path_div_supported = true,
-     .ht_supported = true,
---- a/drivers/net/wireless/realtek/rtw88/sdio.c
-+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
-@@ -864,7 +864,7 @@ static void rtw_sdio_tx_skb_prepare(stru
-
-     pkt_info->qsel = rtw_sdio_get_tx_qsel(rtwdev, skb, queue);
-
--    rtw_tx_fill_tx_desc(pkt_info, skb);
-+    rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
-     rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, pkt_desc);
- }
-
---- a/drivers/net/wireless/realtek/rtw88/tx.c
-+++ b/drivers/net/wireless/realtek/rtw88/tx.c
-@@ -32,7 +32,8 @@ void rtw_tx_stats(struct rtw_dev *rtwdev
-     }
- }
-
--void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct 
sk_buff *skb)
-+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
-+             struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
- {
-     struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
-     bool more_data = false;
-@@ -67,6 +68,9 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_p
-
-     tx_desc->w4 = le32_encode_bits(pkt_info->rate, 
RTW_TX_DESC_W4_DATARATE);
-
-+    if (rtwdev->chip->old_datarate_fb_limit)
-+        tx_desc->w4 |= le32_encode_bits(0x1f, 
RTW_TX_DESC_W4_DATARATE_FB_LIMIT);
-+
-     tx_desc->w5 = le32_encode_bits(pkt_info->short_gi, 
RTW_TX_DESC_W5_DATA_SHORT) |
-               le32_encode_bits(pkt_info->bw, RTW_TX_DESC_W5_DATA_BW) |
-               le32_encode_bits(pkt_info->ldpc, RTW_TX_DESC_W5_DATA_LDPC) |
---- a/drivers/net/wireless/realtek/rtw88/tx.h
-+++ b/drivers/net/wireless/realtek/rtw88/tx.h
-@@ -44,6 +44,7 @@ struct rtw_tx_desc {
- #define RTW_TX_DESC_W3_NAVUSEHDR BIT(15)
- #define RTW_TX_DESC_W3_MAX_AGG_NUM GENMASK(21, 17)
- #define RTW_TX_DESC_W4_DATARATE GENMASK(6, 0)
-+#define RTW_TX_DESC_W4_DATARATE_FB_LIMIT GENMASK(12, 8)
- #define RTW_TX_DESC_W4_RTSRATE GENMASK(28, 24)
- #define RTW_TX_DESC_W5_DATA_SHORT BIT(4)
- #define RTW_TX_DESC_W5_DATA_BW GENMASK(6, 5)
-@@ -94,7 +95,8 @@ void rtw_tx_pkt_info_update(struct rtw_d
-                 struct rtw_tx_pkt_info *pkt_info,
-                 struct ieee80211_sta *sta,
-                 struct sk_buff *skb);
--void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct 
sk_buff *skb);
-+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
-+             struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb);
- void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff 
*skb, u8 sn);
- void rtw_tx_report_handle(struct rtw_dev *rtwdev, struct sk_buff *skb, 
int src);
- void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -458,7 +458,7 @@ static int rtw_usb_write_data(struct rtw
-     skb_put_data(skb, buf, size);
-     skb_push(skb, chip->tx_pkt_desc_sz);
-     memset(skb->data, 0, chip->tx_pkt_desc_sz);
--    rtw_tx_fill_tx_desc(pkt_info, skb);
-+    rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
-     rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
-
-     ret = rtw_usb_write_port(rtwdev, qsel, skb,
-@@ -525,7 +525,7 @@ static int rtw_usb_tx_write(struct rtw_d
-     pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
-     memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
-     ep = qsel_to_ep(rtwusb, pkt_info->qsel);
--    rtw_tx_fill_tx_desc(pkt_info, skb);
-+    rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
-     rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
-     tx_data = rtw_usb_get_tx_data(skb);
-     tx_data->sn = pkt_info->sn;
diff --git 
a/package/kernel/mac80211/patches/rtl/031-v6.13-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch 
b/package/kernel/mac80211/patches/rtl/031-v6.13-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch
deleted file mode 100644
index 10fc773b47fe5c..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/031-v6.13-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From abb0f19492ba6289ffba6ec1057c0426240958af Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:10:54 +0300
-Subject: [PATCH] wifi: rtw88: Make txagc_remnant_ofdm an array
-
-txagc_remnant_ofdm member of struct rtw_dm_info should be different for
-each RF path, so make it an array of size RTW_RF_PATH_MAX (4).
-
-Until now all the chips using this had only one RF path, but RTL8812AU
-has two, and RTL8814AU has four.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/68571ba9-e504-4b2d-bfa1-62f468753649@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.h     | 2 +-
- drivers/net/wireless/realtek/rtw88/phy.c      | 4 ++--
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 4 ++--
- drivers/net/wireless/realtek/rtw88/rtw8723d.c | 4 ++--
- 4 files changed, 7 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1715,7 +1715,7 @@ struct rtw_dm_info {
-     bool pwr_trk_init_trigger;
-     struct ewma_thermal avg_thermal[RTW_RF_PATH_MAX];
-     s8 txagc_remnant_cck;
--    s8 txagc_remnant_ofdm;
-+    s8 txagc_remnant_ofdm[RTW_RF_PATH_MAX];
-     u8 rx_cck_agc_report_type;
-
-     /* backup dack results for each path and I/Q */
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -2169,8 +2169,8 @@ void rtw_get_tx_power_params(struct rtw_
-
-     *limit = rtw_phy_get_tx_power_limit(rtwdev, band, bw, path,
-                         rate, ch, regd);
--    *remnant = (rate <= DESC_RATE11M ? dm_info->txagc_remnant_cck :
--            dm_info->txagc_remnant_ofdm);
-+    *remnant = rate <= DESC_RATE11M ? dm_info->txagc_remnant_cck :
-+                      dm_info->txagc_remnant_ofdm[path];
-     *sar = rtw_phy_get_tx_power_sar(rtwdev, hal->sar_band, path, rate);
- }
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -637,7 +637,7 @@ static void rtw8703b_pwrtrack_init(struc
-     dm_info->pwr_trk_init_trigger = true;
-     dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
-     dm_info->txagc_remnant_cck = 0;
--    dm_info->txagc_remnant_ofdm = 0;
-+    dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0;
- }
-
- static void rtw8703b_phy_set_param(struct rtw_dev *rtwdev)
-@@ -1589,7 +1589,7 @@ static void rtw8703b_pwrtrack_set_ofdm_p
- {
-     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-
--    dm_info->txagc_remnant_ofdm = txagc_idx;
-+    dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx;
-
-     /* Only path A is calibrated for rtl8703b */
-     rtw8703b_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -79,7 +79,7 @@ static void rtw8723d_pwrtrack_init(struc
-     dm_info->pwr_trk_init_trigger = true;
-     dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
-     dm_info->txagc_remnant_cck = 0;
--    dm_info->txagc_remnant_ofdm = 0;
-+    dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0;
- }
-
- static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
-@@ -1265,7 +1265,7 @@ static void rtw8723d_pwrtrack_set_ofdm_p
- {
-     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-
--    dm_info->txagc_remnant_ofdm = txagc_idx;
-+    dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx;
-
-     rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
-     rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
diff --git 
a/package/kernel/mac80211/patches/rtl/032-v6.13-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch 
b/package/kernel/mac80211/patches/rtl/032-v6.13-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch
deleted file mode 100644
index 7d77e0e67173e7..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/032-v6.13-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 82a617413e8545775ec03a1970809ac5f549ef32 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:12:06 +0300
-Subject: [PATCH] wifi: rtw88: Support TX page sizes bigger than 128
-
-All the chips supported so far have a TX page size of 128 bytes.
-
-Change the type of the page_size member of struct rtw_chip_info from u8
-to u16 in order to support RTL8821AU (page size of 256 bytes) and
-RTL8812AU (page size of 512 bytes). Also change the types of several
-related variables and function parameters from u8 to u16.
-
-The TX page size is used, among other things, to construct the beacon,
-null data, QOS null data, and PS poll templates which are uploaded to
-the chip's reserved page. Each template needs to be aligned on a
-multiple of the TX page size. Power saving can't work if the TX page
-size is wrong.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/acdefbb1-3daf-4349-9e03-9472754d5f1e@gmail.com
----
- drivers/net/wireless/realtek/rtw88/debug.c |  2 +-
- drivers/net/wireless/realtek/rtw88/fw.c    | 21 +++++++++++----------
- drivers/net/wireless/realtek/rtw88/mac.c   |  2 +-
- drivers/net/wireless/realtek/rtw88/main.h  |  2 +-
- 4 files changed, 14 insertions(+), 13 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/debug.c
-+++ b/drivers/net/wireless/realtek/rtw88/debug.c
-@@ -308,7 +308,7 @@ static int rtw_debugfs_get_rsvd_page(str
- {
-     struct rtw_debugfs_priv *debugfs_priv = m->private;
-     struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
--    u8 page_size = rtwdev->chip->page_size;
-+    u16 page_size = rtwdev->chip->page_size;
-     u32 buf_size = debugfs_priv->rsvd_page.page_num * page_size;
-     u32 offset = debugfs_priv->rsvd_page.page_offset * page_size;
-     u8 *buf;
---- a/drivers/net/wireless/realtek/rtw88/fw.c
-+++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -1293,13 +1293,13 @@ static void rtw_fill_rsvd_page_desc(stru
-     rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
- }
-
--static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
-+static inline u8 rtw_len_to_page(unsigned int len, u16 page_size)
- {
-     return DIV_ROUND_UP(len, page_size);
- }
-
--static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 
page_size,
--                      u8 page_margin, u32 page, u8 *buf,
-+static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u16 
page_size,
-+                      u16 page_margin, u32 page, u8 *buf,
-                       struct rtw_rsvd_page *rsvd_pkt)
- {
-     struct sk_buff *skb = rsvd_pkt->skb;
-@@ -1601,13 +1601,13 @@ static int  __rtw_build_rsvd_page_from_v
-
- static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size)
- {
--    struct ieee80211_hw *hw = rtwdev->hw;
-     const struct rtw_chip_info *chip = rtwdev->chip;
--    struct sk_buff *iter;
-+    struct ieee80211_hw *hw = rtwdev->hw;
-     struct rtw_rsvd_page *rsvd_pkt;
--    u32 page = 0;
-+    struct sk_buff *iter;
-+    u16 page_size, page_margin, tx_desc_sz;
-     u8 total_page = 0;
--    u8 page_size, page_margin, tx_desc_sz;
-+    u32 page = 0;
-     u8 *buf;
-     int ret;
-
-@@ -2013,12 +2013,13 @@ static int _rtw_hw_scan_update_probe_req
- {
-     const struct rtw_chip_info *chip = rtwdev->chip;
-     struct sk_buff *skb, *tmp;
--    u8 page_offset = 1, *buf, page_size = chip->page_size;
-     u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
--    u16 buf_offset = page_size * page_offset;
-     u8 tx_desc_sz = chip->tx_pkt_desc_sz;
--    u8 page_cnt, pages;
-+    u16 page_size = chip->page_size;
-+    u8 page_offset = 1, *buf;
-+    u16 buf_offset = page_size * page_offset;
-     unsigned int pkt_len;
-+    u8 page_cnt, pages;
-     int ret;
-
-     if (rtw_fw_feature_ext_check(&rtwdev->fw, 
FW_FEATURE_EXT_OLD_PAGE_NUM))
---- a/drivers/net/wireless/realtek/rtw88/mac.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac.c
-@@ -1138,7 +1138,7 @@ int rtw_set_trx_fifo_info(struct rtw_dev
-
-     /* config rsvd page num */
-     fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num;
--    fifo->txff_pg_num = chip->txff_size >> 7;
-+    fifo->txff_pg_num = chip->txff_size / chip->page_size;
-     if (rtw_chip_wcpu_11n(rtwdev))
-         fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num;
-     else
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1187,7 +1187,7 @@ struct rtw_chip_info {
-     u32 fw_rxff_size;
-     u16 rsvd_drv_pg_num;
-     u8 band;
--    u8 page_size;
-+    u16 page_size;
-     u8 csi_buf_pg_num;
-     u8 dig_max;
-     u8 dig_min;
diff --git 
a/package/kernel/mac80211/patches/rtl/033-v6.13-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch 
b/package/kernel/mac80211/patches/rtl/033-v6.13-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch
deleted file mode 100644
index cda3e7a56e0079..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/033-v6.13-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch
+++ /dev/null
@@ -1,297 +0,0 @@
-From 67d915604e6993ff627ac001983a2de63ff71b13 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:12:39 +0300
-Subject: [PATCH] wifi: rtw88: Move pwr_track_tbl to struct rtw_rfe_def
-
-RTL8812AU uses one set of TX power tracking tables for RFE 3, and
-another set for everything else.
-
-Move pwr_track_tbl from struct rtw_chip_info to struct rtw_rfe_def in
-order to load the right set of tables for each RFE (RF front end) type.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/904d0ab1-c046-40cd-a3a3-d4fdcf663c9d@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.h     |  8 ++++---
- drivers/net/wireless/realtek/rtw88/phy.c      |  3 ++-
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 12 +++++-----
- drivers/net/wireless/realtek/rtw88/rtw8723d.c | 12 +++++-----
- drivers/net/wireless/realtek/rtw88/rtw8723x.c |  3 ++-
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 17 +++++++-------
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 15 ++++++------
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 23 +++++++++----------
- 8 files changed, 47 insertions(+), 46 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1099,17 +1099,20 @@ enum rtw_rfe_fem {
- struct rtw_rfe_def {
-     const struct rtw_table *phy_pg_tbl;
-     const struct rtw_table *txpwr_lmt_tbl;
-+    const struct rtw_pwr_track_tbl *pwr_track_tbl;
-     const struct rtw_table *agc_btg_tbl;
- };
-
--#define RTW_DEF_RFE(chip, bb_pg, pwrlmt) {                  \
-+#define RTW_DEF_RFE(chip, bb_pg, pwrlmt, track) {                  \
-     .phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl,      \
-     .txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
-+    .pwr_track_tbl = &rtw ## chip ## _pwr_track_type ## track ## _tbl, \
-     }
-
--#define RTW_DEF_RFE_EXT(chip, bb_pg, pwrlmt, btg) { \
-+#define RTW_DEF_RFE_EXT(chip, bb_pg, pwrlmt, track, btg) {              \
-     .phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl,      \
-     .txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
-+    .pwr_track_tbl = &rtw ## chip ## _pwr_track_type ## track ## _tbl, \
-     .agc_btg_tbl = &rtw ## chip ## _agc_btg_type ## btg ## _tbl, \
-     }
-
-@@ -1243,7 +1246,6 @@ struct rtw_chip_info {
-     u16 dpd_ratemask;
-     u8 iqk_threshold;
-     u8 lck_threshold;
--    const struct rtw_pwr_track_tbl *pwr_track_tbl;
-
-     u8 bfer_su_max_num;
-     u8 bfer_mu_max_num;
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -2384,7 +2384,8 @@ void rtw_phy_init_tx_power(struct rtw_de
- void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
-                 struct rtw_swing_table *swing_table)
- {
--    const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
-+    const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
-+    const struct rtw_pwr_track_tbl *tbl = rfe_def->pwr_track_tbl;
-     u8 channel = rtwdev->hal.current_channel;
-
-     if (IS_CH_2G_BAND(channel)) {
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -493,11 +493,6 @@ static const struct rtw_pwr_seq_cmd * co
-     NULL
- };
-
--static const struct rtw_rfe_def rtw8703b_rfe_defs[] = {
--    [0] = { .phy_pg_tbl    = &rtw8703b_bb_pg_tbl,
--        .txpwr_lmt_tbl    = &rtw8703b_txpwr_lmt_tbl,},
--};
--
- static const struct rtw_page_table page_table_8703b[] = {
-     {12, 2, 2, 0, 1},
-     {12, 2, 2, 0, 1},
-@@ -1818,6 +1813,12 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_xtal_p = rtw8703b_pwrtrk_xtal_p,
- };
-
-+static const struct rtw_rfe_def rtw8703b_rfe_defs[] = {
-+    [0] = { .phy_pg_tbl    = &rtw8703b_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8703b_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8703b_rtw_pwr_track_tbl, },
-+};
-+
- /* Shared-Antenna Coex Table */
- static const struct coex_table_para table_sant_8703b[] = {
-     {0xffffffff, 0xffffffff}, /* case-0 */
-@@ -1997,7 +1998,6 @@ const struct rtw_chip_info rtw8703b_hw_s
-     .rfe_defs_size = ARRAY_SIZE(rtw8703b_rfe_defs),
-
-     .iqk_threshold = 8,
--    .pwr_track_tbl = &rtw8703b_rtw_pwr_track_tbl,
-
-     /* WOWLAN firmware exists, but not implemented yet */
-     .wow_fw_name = "rtw88/rtw8703b_wow_fw.bin",
---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
-@@ -2020,11 +2020,6 @@ static const struct rtw_intf_phy_para_ta
-     .n_gen1_para    = ARRAY_SIZE(pcie_gen1_param_8723d),
- };
-
--static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
--    [0] = { .phy_pg_tbl    = &rtw8723d_bb_pg_tbl,
--        .txpwr_lmt_tbl    = &rtw8723d_txpwr_lmt_tbl,},
--};
--
- static const u8 rtw8723d_pwrtrk_2gb_n[] = {
-     0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
-     6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
-@@ -2088,6 +2083,12 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
- };
-
-+static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
-+    [0] = { .phy_pg_tbl    = &rtw8723d_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8723d_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8723d_rtw_pwr_track_tbl, },
-+};
-+
- static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
-     {0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-     {0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
-@@ -2159,7 +2160,6 @@ const struct rtw_chip_info rtw8723d_hw_s
-     .rfe_defs = rtw8723d_rfe_defs,
-     .rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
-     .rx_ldpc = false,
--    .pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
-     .iqk_threshold = 8,
-     .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-     .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
---- a/drivers/net/wireless/realtek/rtw88/rtw8723x.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
-@@ -595,7 +595,8 @@ void __rtw8723x_pwrtrack_set_xtal(struct
-                   u8 delta)
- {
-     struct rtw_dm_info *dm_info = &rtwdev->dm_info;
--    const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
-+    const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
-+    const struct rtw_pwr_track_tbl *tbl = rfe_def->pwr_track_tbl;
-     const s8 *pwrtrk_xtal;
-     s8 xtal_cap;
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1581,13 +1581,6 @@ static const struct rtw_intf_phy_para_ta
-     .n_gen2_para    = ARRAY_SIZE(pcie_gen2_param_8821c),
- };
-
--static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
--    [0] = RTW_DEF_RFE(8821c, 0, 0),
--    [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
--    [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
--    [6] = RTW_DEF_RFE(8821c, 0, 0),
--};
--
- static const struct rtw_hw_reg rtw8821c_dig[] = {
-     [0] = { .addr = 0xc50, .mask = 0x7f },
- };
-@@ -1899,7 +1892,7 @@ static const u8 rtw8821c_pwrtrk_2g_cck_a
-     5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9
- };
-
--static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = {
-+static const struct rtw_pwr_track_tbl rtw8821c_pwr_track_type0_tbl = {
-     .pwrtrk_5gb_n[0] = rtw8821c_pwrtrk_5gb_n[0],
-     .pwrtrk_5gb_n[1] = rtw8821c_pwrtrk_5gb_n[1],
-     .pwrtrk_5gb_n[2] = rtw8821c_pwrtrk_5gb_n[2],
-@@ -1922,6 +1915,13 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_2g_ccka_p = rtw8821c_pwrtrk_2g_cck_a_p,
- };
-
-+static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
-+    [0] = RTW_DEF_RFE(8821c, 0, 0, 0),
-+    [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 0, 2),
-+    [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 0, 2),
-+    [6] = RTW_DEF_RFE(8821c, 0, 0, 0),
-+};
-+
- static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = {
-     {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-     {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-@@ -1994,7 +1994,6 @@ const struct rtw_chip_info rtw8821c_hw_s
-     .rfe_defs = rtw8821c_rfe_defs,
-     .rfe_defs_size = ARRAY_SIZE(rtw8821c_rfe_defs),
-     .rx_ldpc = false,
--    .pwr_track_tbl = &rtw8821c_rtw_pwr_track_tbl,
-     .iqk_threshold = 8,
-     .bfer_su_max_num = 2,
-     .bfer_mu_max_num = 1,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -2072,12 +2072,6 @@ static const struct rtw_intf_phy_para_ta
-     .n_gen2_para    = ARRAY_SIZE(pcie_gen2_param_8822b),
- };
-
--static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
--    [2] = RTW_DEF_RFE(8822b, 2, 2),
--    [3] = RTW_DEF_RFE(8822b, 3, 0),
--    [5] = RTW_DEF_RFE(8822b, 5, 5),
--};
--
- static const struct rtw_hw_reg rtw8822b_dig[] = {
-     [0] = { .addr = 0xc50, .mask = 0x7f },
-     [1] = { .addr = 0xe50, .mask = 0x7f },
-@@ -2432,7 +2426,7 @@ static const u8 rtw8822b_pwrtrk_2g_cck_a
-     10, 11, 11, 12, 12, 13, 13, 14, 14, 15
- };
-
--static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
-+static const struct rtw_pwr_track_tbl rtw8822b_pwr_track_type0_tbl = {
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = 
rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = 
rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = 
rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
-@@ -2455,6 +2449,12 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
- };
-
-+static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
-+    [2] = RTW_DEF_RFE(8822b, 2, 2, 0),
-+    [3] = RTW_DEF_RFE(8822b, 3, 0, 0),
-+    [5] = RTW_DEF_RFE(8822b, 5, 5, 0),
-+};
-+
- static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
-     {0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-     {0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-@@ -2535,7 +2535,6 @@ const struct rtw_chip_info rtw8822b_hw_s
-     .rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
-     .rfe_defs = rtw8822b_rfe_defs,
-     .rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
--    .pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl,
-     .iqk_threshold = 8,
-     .bfer_su_max_num = 2,
-     .bfer_mu_max_num = 1,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -4883,16 +4883,6 @@ static const struct rtw_intf_phy_para_ta
-     .n_gen2_para    = ARRAY_SIZE(pcie_gen2_param_8822c),
- };
-
--static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
--    [0] = RTW_DEF_RFE(8822c, 0, 0),
--    [1] = RTW_DEF_RFE(8822c, 0, 0),
--    [2] = RTW_DEF_RFE(8822c, 0, 0),
--    [3] = RTW_DEF_RFE(8822c, 0, 0),
--    [4] = RTW_DEF_RFE(8822c, 0, 0),
--    [5] = RTW_DEF_RFE(8822c, 0, 5),
--    [6] = RTW_DEF_RFE(8822c, 0, 0),
--};
--
- static const struct rtw_hw_reg rtw8822c_dig[] = {
-     [0] = { .addr = 0x1d70, .mask = 0x7f },
-     [1] = { .addr = 0x1d70, .mask = 0x7f00 },
-@@ -5238,7 +5228,7 @@ static const u8 rtw8822c_pwrtrk_2g_cck_a
-     18, 18, 19, 20, 21, 22, 23, 24, 24, 25
- };
-
--static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
-+static const struct rtw_pwr_track_tbl rtw8822c_pwr_track_type0_tbl = {
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = 
rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = 
rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
-     .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = 
rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
-@@ -5261,6 +5251,16 @@ static const struct rtw_pwr_track_tbl rt
-     .pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
- };
-
-+static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
-+    [0] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+    [1] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+    [2] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+    [3] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+    [4] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+    [5] = RTW_DEF_RFE(8822c, 0, 5, 0),
-+    [6] = RTW_DEF_RFE(8822c, 0, 0, 0),
-+};
-+
- static const struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
-     [EDCCA_TH_L2H_IDX] = {
-         {.addr = 0x84c, .mask = MASKBYTE2}, .offset = 0x80
-@@ -5360,7 +5360,6 @@ const struct rtw_chip_info rtw8822c_hw_s
-     .rfe_defs_size = ARRAY_SIZE(rtw8822c_rfe_defs),
-     .en_dis_dpd = true,
-     .dpd_ratemask = DIS_DPD_RATEALL,
--    .pwr_track_tbl = &rtw8822c_rtw_pwr_track_tbl,
-     .iqk_threshold = 8,
-     .lck_threshold = 8,
-     .bfer_su_max_num = 2,
diff --git 
a/package/kernel/mac80211/patches/rtl/034-v6.13-wifi-rtw88-usb-Set-pkt_info.ls-for-the-reserved-page.patch 
b/package/kernel/mac80211/patches/rtl/034-v6.13-wifi-rtw88-usb-Set-pkt_info.ls-for-the-reserved-page.patch
deleted file mode 100644
index 67d7d230f4ee7b..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/034-v6.13-wifi-rtw88-usb-Set-pkt_info.ls-for-the-reserved-page.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 85bf3041a0ea40a60b5295749268e179f056546a Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:13:10 +0300
-Subject: [PATCH] wifi: rtw88: usb: Set pkt_info.ls for the reserved page
-
-"ls" meaning "last segment". Without this RTL8812AU can't upload the
-reserved page in USB 2 mode. (Somehow it's fine in USB 3 mode.)
-
-Also tested with RTL8822CU, RTL8812BU, RTL8811CU, RTL8723DU, RTL8811AU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/e443f5d9-4b53-4f64-985c-64313ec80bef@gmail.com
----
- drivers/net/wireless/realtek/rtw88/usb.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -478,6 +478,7 @@ static int rtw_usb_write_data_rsvd_page(
-     pkt_info.tx_pkt_size = size;
-     pkt_info.qsel = TX_DESC_QSEL_BEACON;
-     pkt_info.offset = chip->tx_pkt_desc_sz;
-+    pkt_info.ls = true;
-
-     return rtw_usb_write_data(rtwdev, &pkt_info, buf);
- }
diff --git 
a/package/kernel/mac80211/patches/rtl/035-v6.13-wifi-rtw88-Detect-beacon-loss-with-chips-other-than-.patch 
b/package/kernel/mac80211/patches/rtl/035-v6.13-wifi-rtw88-Detect-beacon-loss-with-chips-other-than-.patch
deleted file mode 100644
index de64f33e43e5b4..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/035-v6.13-wifi-rtw88-Detect-beacon-loss-with-chips-other-than-.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 57289d30cd2ae315ab9b28213d63d1dbf8570cf3 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:13:45 +0300
-Subject: [PATCH] wifi: rtw88: Detect beacon loss with chips other than 
8822c
-
-The driver is supposed to avoid entering LPS (power saving) when there
-is beacon loss, but only RTL8822C detects the beacon loss (because it
-has beacon filtering in the firmware).
-
-Detect beacon loss with the other chips by checking if we received less
-than half the expected number of beacons in the last 2-second interval.
-
-This gets rid of the occasional "failed to get tx report from firmware"
-warnings with RTL8821AU. It may also avoid some disconnections.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/f52b2fcf-bf94-48bc-89bd-e55ebc3a2f2d@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.c | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -202,6 +202,21 @@ static void rtw_vif_watch_dog_iter(void
-     rtwvif->stats.rx_cnt = 0;
- }
-
-+static void rtw_sw_beacon_loss_check(struct rtw_dev *rtwdev,
-+                     struct rtw_vif *rtwvif, int received_beacons)
-+{
-+    int watchdog_delay = 2000000 / 1024; /* TU */
-+    int beacon_int, expected_beacons;
-+
-+    if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) || 
!rtwvif)
-+        return;
-+
-+    beacon_int = rtwvif_to_vif(rtwvif)->bss_conf.beacon_int;
-+    expected_beacons = DIV_ROUND_UP(watchdog_delay, beacon_int);
-+
-+    rtwdev->beacon_loss = received_beacons < expected_beacons / 2;
-+}
-+
- /* process TX/RX statistics periodically for hardware,
-  * the information helps hardware to enhance performance
-  */
-@@ -212,6 +227,7 @@ static void rtw_watch_dog_work(struct wo
-     struct rtw_traffic_stats *stats = &rtwdev->stats;
-     struct rtw_watch_dog_iter_data data = {};
-     bool busy_traffic = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
-+    int received_beacons = rtwdev->dm_info.cur_pkt_count.num_bcn_pkt;
-     u32 tx_unicast_mbps, rx_unicast_mbps;
-     bool ps_active;
-
-@@ -270,6 +286,8 @@ static void rtw_watch_dog_work(struct wo
-      */
-     rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
-
-+    rtw_sw_beacon_loss_check(rtwdev, data.rtwvif, received_beacons);
-+
-     /* fw supports only one station associated to enter lps, if there are
-      * more than two stations associated to the AP, then we can not enter
-      * lps, because fw does not handle the overlapped beacon interval
diff --git 
a/package/kernel/mac80211/patches/rtl/036-v6.13-wifi-rtw88-coex-Support-chips-without-a-scoreboard.patch 
b/package/kernel/mac80211/patches/rtl/036-v6.13-wifi-rtw88-coex-Support-chips-without-a-scoreboard.patch
deleted file mode 100644
index b2fb04fd31c325..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/036-v6.13-wifi-rtw88-coex-Support-chips-without-a-scoreboard.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From b19840afc05121293ae59f017cb9924814eb5d77 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:14:12 +0300
-Subject: [PATCH] wifi: rtw88: coex: Support chips without a scoreboard
-
-All the chips currently supported have a "scoreboard": the chip keeps
-track of certain things related to bluetooth, for example, whether
-bluetooth is active. The information can be read from register 0xaa.
-
-RTL8821AU doesn't have this. Implement bluetooth activity detection in
-rtw_coex_monitor_bt_enable() based on the bluetooth TX/RX counters.
-
-This is mostly important for RTL8811AU, the version of RTL8821AU without
-bluetooth. Without this change, the driver thinks bluetooth is active
-and the wifi speeds are low.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/5058f23d-2086-42cd-82ad-eef31a348467@gmail.com
----
- drivers/net/wireless/realtek/rtw88/coex.c | 18 ++++++++++++++++++
- drivers/net/wireless/realtek/rtw88/main.h |  1 +
- 2 files changed, 19 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/coex.c
-+++ b/drivers/net/wireless/realtek/rtw88/coex.c
-@@ -494,11 +494,29 @@ static void rtw_coex_monitor_bt_enable(s
-     struct rtw_coex_stat *coex_stat = &coex->stat;
-     struct rtw_coex_dm *coex_dm = &coex->dm;
-     bool bt_disabled = false;
-+    bool bt_active = true;
-     u16 score_board;
-
-     if (chip->scbd_support) {
-         score_board = rtw_coex_read_scbd(rtwdev);
-         bt_disabled = !(score_board & COEX_SCBD_ONOFF);
-+    } else {
-+        if (coex_stat->hi_pri_tx == 0 && coex_stat->hi_pri_rx == 0 &&
-+            coex_stat->lo_pri_tx == 0 && coex_stat->lo_pri_rx == 0)
-+            bt_active = false;
-+
-+        if (coex_stat->hi_pri_tx == 0xffff && coex_stat->hi_pri_rx == 
0xffff &&
-+            coex_stat->lo_pri_tx == 0xffff && coex_stat->lo_pri_rx == 
0xffff)
-+            bt_active = false;
-+
-+        if (bt_active) {
-+            coex_stat->bt_disable_cnt = 0;
-+            bt_disabled = false;
-+        } else {
-+            coex_stat->bt_disable_cnt++;
-+            if (coex_stat->bt_disable_cnt >= 10)
-+                bt_disabled = true;
-+        }
-     }
-
-     if (coex_stat->bt_disabled != bt_disabled) {
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -1494,6 +1494,7 @@ struct rtw_coex_stat {
-     u8 bt_hid_slot;
-     u8 bt_a2dp_bitpool;
-     u8 bt_iqk_state;
-+    u8 bt_disable_cnt;
-
-     u16 wl_beacon_interval;
-     u8 wl_noisy_level;
diff --git 
a/package/kernel/mac80211/patches/rtl/037-v6.13-wifi-rtw88-8821a-Regularly-ask-for-BT-info-updates.patch 
b/package/kernel/mac80211/patches/rtl/037-v6.13-wifi-rtw88-8821a-Regularly-ask-for-BT-info-updates.patch
deleted file mode 100644
index e0e840f0fadfeb..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/037-v6.13-wifi-rtw88-8821a-Regularly-ask-for-BT-info-updates.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From bfcee5ee924fc5f706d20f5dc31586ca47912304 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:14:45 +0300
-Subject: [PATCH] wifi: rtw88: 8821a: Regularly ask for BT info updates
-
-The RTL8821AU firmware sends C2H_BT_INFO by itself when bluetooth
-headphones are connected, but not when they are disconnected. This leads
-to the coexistence code still using the A2DP algorithm long after the
-headphones are disconnected, which means the wifi speeds are much lower
-than they should be. Work around this by asking for updates every two
-seconds if the chip is RTL8821AU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/358acdd2-6aae-46c1-9c66-fcce4e700b96@gmail.com
----
- drivers/net/wireless/realtek/rtw88/coex.c |  2 +-
- drivers/net/wireless/realtek/rtw88/coex.h | 11 +++++++++++
- drivers/net/wireless/realtek/rtw88/main.c |  1 +
- 3 files changed, 13 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireless/realtek/rtw88/coex.c
-+++ b/drivers/net/wireless/realtek/rtw88/coex.c
-@@ -446,7 +446,7 @@ static void rtw_coex_check_rfk(struct rt
-     }
- }
-
--static void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
-+void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
- {
-     struct rtw_coex *coex = &rtwdev->coex;
-     struct rtw_coex_stat *coex_stat = &coex->stat;
---- a/drivers/net/wireless/realtek/rtw88/coex.h
-+++ b/drivers/net/wireless/realtek/rtw88/coex.h
-@@ -384,6 +384,7 @@ u32 rtw_coex_read_indirect_reg(struct rt
- void rtw_coex_write_indirect_reg(struct rtw_dev *rtwdev, u16 addr,
-                  u32 mask, u32 val);
- void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set);
-+void rtw_coex_query_bt_info(struct rtw_dev *rtwdev);
-
- void rtw_coex_bt_relink_work(struct work_struct *work);
- void rtw_coex_bt_reenable_work(struct work_struct *work);
-@@ -419,4 +420,14 @@ static inline bool rtw_coex_disabled(str
-     return coex_stat->bt_disabled;
- }
-
-+static inline void rtw_coex_active_query_bt_info(struct rtw_dev *rtwdev)
-+{
-+    /* The RTL8821AU firmware doesn't send C2H_BT_INFO by itself
-+     * when bluetooth headphones are disconnected, so we have to
-+     * ask for it regularly.
-+     */
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A && rtwdev->efuse.btcoex)
-+        rtw_coex_query_bt_info(rtwdev);
-+}
-+
- #endif
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -274,6 +274,7 @@ static void rtw_watch_dog_work(struct wo
-     rtw_leave_lps(rtwdev);
-     rtw_coex_wl_status_check(rtwdev);
-     rtw_coex_query_bt_hid_list(rtwdev);
-+    rtw_coex_active_query_bt_info(rtwdev);
-
-     rtw_phy_dynamic_mechanism(rtwdev);
-
diff --git 
a/package/kernel/mac80211/patches/rtl/038-v6.13-wifi-rtw88-8812a-Mitigate-beacon-loss.patch 
b/package/kernel/mac80211/patches/rtl/038-v6.13-wifi-rtw88-8812a-Mitigate-beacon-loss.patch
deleted file mode 100644
index f862f80460df36..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/038-v6.13-wifi-rtw88-8812a-Mitigate-beacon-loss.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From f9e0189cbc2d6447dde392944c769546cdf48140 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 23 Oct 2024 17:15:13 +0300
-Subject: [PATCH] wifi: rtw88: 8812a: Mitigate beacon loss
-
-The RTL8812AU has a reception problem, maybe only in the 5 GHz band.
-Sometimes, in some positions, it stops receiving anything even though
-the distance to the AP is only ~3 meters and there are no obstacles.
-Moving it a few centimeters fixes it.
-
-Switch the initial gain to maximum coverage when there is beacon loss.
-This only helps sometimes. This is similar to what the official driver
-does.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/203f5043-4fe1-4f35-8b8f-d3b6f44e1fd9@gmail.com
----
- drivers/net/wireless/realtek/rtw88/phy.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/phy.c
-+++ b/drivers/net/wireless/realtek/rtw88/phy.c
-@@ -530,6 +530,13 @@ static void rtw_phy_dig(struct rtw_dev *
-      */
-     rtw_phy_dig_recorder(dm_info, cur_igi, fa_cnt);
-
-+    /* Mitigate beacon loss and connectivity issues, mainly (only?)
-+     * in the 5 GHz band
-+     */
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A && rtwdev->beacon_loss &&
-+        linked && dm_info->total_fa_cnt < DIG_PERF_FA_TH_EXTRA_HIGH)
-+        cur_igi = DIG_CVRG_MIN;
-+
-     if (cur_igi != pre_igi)
-         rtw_phy_dig_write(rtwdev, cur_igi);
- }
diff --git 
a/package/kernel/mac80211/patches/rtl/039-v6.13-wifi-rtw88-Add-rtw8812a_table.-c-h.patch 
b/package/kernel/mac80211/patches/rtl/039-v6.13-wifi-rtw88-Add-rtw8812a_table.-c-h.patch
deleted file mode 100644
index 59a04b4d16b579..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/039-v6.13-wifi-rtw88-Add-rtw8812a_table.-c-h.patch
+++ /dev/null
@@ -1,2862 +0,0 @@
-From 528f902ecc0eb8fb766bde519421255729623dd8 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:24:33 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw8812a_table.{c,h}
-
-These contain various arrays for initialising RTL8812AU. Also TX power
-limits.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/086f476c-e832-4867-963c-a64a63252fd6@gmail.com
----
- .../wireless/realtek/rtw88/rtw8812a_table.c   | 2812 +++++++++++++++++
- .../wireless/realtek/rtw88/rtw8812a_table.h   |   26 +
- 2 files changed, 2838 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812a_table.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812a_table.h
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a_table.c
-@@ -0,0 +1,2812 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include "main.h"
-+#include "phy.h"
-+#include "rtw8812a_table.h"
-+
-+static const u32 rtw8812a_mac[] = {
-+    0x010, 0x0000000C,
-+    0x80000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x011, 0x00000066,
-+    0xA0000000,    0x00000000,
-+    0x011, 0x0000005A,
-+    0xB0000000,    0x00000000,
-+    0x025, 0x0000000F,
-+    0x072, 0x00000000,
-+    0x420, 0x00000080,
-+    0x428, 0x0000000A,
-+    0x429, 0x00000010,
-+    0x430, 0x00000000,
-+    0x431, 0x00000000,
-+    0x432, 0x00000000,
-+    0x433, 0x00000001,
-+    0x434, 0x00000002,
-+    0x435, 0x00000003,
-+    0x436, 0x00000005,
-+    0x437, 0x00000007,
-+    0x438, 0x00000000,
-+    0x439, 0x00000000,
-+    0x43A, 0x00000000,
-+    0x43B, 0x00000001,
-+    0x43C, 0x00000002,
-+    0x43D, 0x00000003,
-+    0x43E, 0x00000005,
-+    0x43F, 0x00000007,
-+    0x440, 0x0000005D,
-+    0x441, 0x00000001,
-+    0x442, 0x00000000,
-+    0x444, 0x00000010,
-+    0x445, 0x00000000,
-+    0x446, 0x00000000,
-+    0x447, 0x00000000,
-+    0x448, 0x00000000,
-+    0x449, 0x000000F0,
-+    0x44A, 0x0000000F,
-+    0x44B, 0x0000003E,
-+    0x44C, 0x00000010,
-+    0x44D, 0x00000000,
-+    0x44E, 0x00000000,
-+    0x44F, 0x00000000,
-+    0x450, 0x00000000,
-+    0x451, 0x000000F0,
-+    0x452, 0x0000000F,
-+    0x453, 0x00000000,
-+    0x45B, 0x00000080,
-+    0x460, 0x00000066,
-+    0x461, 0x00000066,
-+    0x4C8, 0x000000FF,
-+    0x4C9, 0x00000008,
-+    0x4CC, 0x000000FF,
-+    0x4CD, 0x000000FF,
-+    0x4CE, 0x00000001,
-+    0x500, 0x00000026,
-+    0x501, 0x000000A2,
-+    0x502, 0x0000002F,
-+    0x503, 0x00000000,
-+    0x504, 0x00000028,
-+    0x505, 0x000000A3,
-+    0x506, 0x0000005E,
-+    0x507, 0x00000000,
-+    0x508, 0x0000002B,
-+    0x509, 0x000000A4,
-+    0x50A, 0x0000005E,
-+    0x50B, 0x00000000,
-+    0x50C, 0x0000004F,
-+    0x50D, 0x000000A4,
-+    0x50E, 0x00000000,
-+    0x50F, 0x00000000,
-+    0x512, 0x0000001C,
-+    0x514, 0x0000000A,
-+    0x516, 0x0000000A,
-+    0x525, 0x0000004F,
-+    0x550, 0x00000010,
-+    0x551, 0x00000010,
-+    0x559, 0x00000002,
-+    0x55C, 0x00000050,
-+    0x55D, 0x000000FF,
-+    0x604, 0x00000009,
-+    0x605, 0x00000030,
-+    0x607, 0x00000003,
-+    0x608, 0x0000000E,
-+    0x609, 0x0000002A,
-+    0x620, 0x000000FF,
-+    0x621, 0x000000FF,
-+    0x622, 0x000000FF,
-+    0x623, 0x000000FF,
-+    0x624, 0x000000FF,
-+    0x625, 0x000000FF,
-+    0x626, 0x000000FF,
-+    0x627, 0x000000FF,
-+    0x638, 0x00000050,
-+    0x63C, 0x0000000A,
-+    0x63D, 0x0000000A,
-+    0x63E, 0x0000000E,
-+    0x63F, 0x0000000E,
-+    0x640, 0x00000080,
-+    0x642, 0x00000040,
-+    0x643, 0x00000000,
-+    0x652, 0x000000C8,
-+    0x66E, 0x00000005,
-+    0x700, 0x00000021,
-+    0x701, 0x00000043,
-+    0x702, 0x00000065,
-+    0x703, 0x00000087,
-+    0x708, 0x00000021,
-+    0x709, 0x00000043,
-+    0x70A, 0x00000065,
-+    0x70B, 0x00000087,
-+    0x718, 0x00000040,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8812a_mac, rtw_phy_cfg_mac);
-+
-+static const u32 rtw8812a_agc[] = {
-+    0x80000001,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0xFC000001,
-+    0x81C, 0xFB020001,
-+    0x81C, 0xFA040001,
-+    0x81C, 0xF9060001,
-+    0x81C, 0xF8080001,
-+    0x81C, 0xF70A0001,
-+    0x81C, 0xF60C0001,
-+    0x81C, 0xF50E0001,
-+    0x81C, 0xF4100001,
-+    0x81C, 0xF3120001,
-+    0x81C, 0xF2140001,
-+    0x81C, 0xF1160001,
-+    0x81C, 0xF0180001,
-+    0x81C, 0xEF1A0001,
-+    0x81C, 0xEE1C0001,
-+    0x81C, 0xED1E0001,
-+    0x81C, 0xEC200001,
-+    0x81C, 0xEB220001,
-+    0x81C, 0xEA240001,
-+    0x81C, 0xCD260001,
-+    0x81C, 0xCC280001,
-+    0x81C, 0xCB2A0001,
-+    0x81C, 0xCA2C0001,
-+    0x81C, 0xC92E0001,
-+    0x81C, 0xC8300001,
-+    0x81C, 0xA6320001,
-+    0x81C, 0xA5340001,
-+    0x81C, 0xA4360001,
-+    0x81C, 0xA3380001,
-+    0x81C, 0xA23A0001,
-+    0x81C, 0x883C0001,
-+    0x81C, 0x873E0001,
-+    0x81C, 0x86400001,
-+    0x81C, 0x85420001,
-+    0x81C, 0x84440001,
-+    0x81C, 0x83460001,
-+    0x81C, 0x82480001,
-+    0x81C, 0x814A0001,
-+    0x81C, 0x484C0001,
-+    0x81C, 0x474E0001,
-+    0x81C, 0x46500001,
-+    0x81C, 0x45520001,
-+    0x81C, 0x44540001,
-+    0x81C, 0x43560001,
-+    0x81C, 0x42580001,
-+    0x81C, 0x415A0001,
-+    0x81C, 0x255C0001,
-+    0x81C, 0x245E0001,
-+    0x81C, 0x23600001,
-+    0x81C, 0x22620001,
-+    0x81C, 0x21640001,
-+    0x81C, 0x21660001,
-+    0x81C, 0x21680001,
-+    0x81C, 0x216A0001,
-+    0x81C, 0x216C0001,
-+    0x81C, 0x216E0001,
-+    0x81C, 0x21700001,
-+    0x81C, 0x21720001,
-+    0x81C, 0x21740001,
-+    0x81C, 0x21760001,
-+    0x81C, 0x21780001,
-+    0x81C, 0x217A0001,
-+    0x81C, 0x217C0001,
-+    0x81C, 0x217E0001,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0x81C, 0xF9000001,
-+    0x81C, 0xF8020001,
-+    0x81C, 0xF7040001,
-+    0x81C, 0xF6060001,
-+    0x81C, 0xF5080001,
-+    0x81C, 0xF40A0001,
-+    0x81C, 0xF30C0001,
-+    0x81C, 0xF20E0001,
-+    0x81C, 0xF1100001,
-+    0x81C, 0xF0120001,
-+    0x81C, 0xEF140001,
-+    0x81C, 0xEE160001,
-+    0x81C, 0xED180001,
-+    0x81C, 0xEC1A0001,
-+    0x81C, 0xEB1C0001,
-+    0x81C, 0xEA1E0001,
-+    0x81C, 0xCD200001,
-+    0x81C, 0xCC220001,
-+    0x81C, 0xCB240001,
-+    0x81C, 0xCA260001,
-+    0x81C, 0xC9280001,
-+    0x81C, 0xC82A0001,
-+    0x81C, 0xC72C0001,
-+    0x81C, 0xC62E0001,
-+    0x81C, 0xA5300001,
-+    0x81C, 0xA4320001,
-+    0x81C, 0xA3340001,
-+    0x81C, 0xA2360001,
-+    0x81C, 0x88380001,
-+    0x81C, 0x873A0001,
-+    0x81C, 0x863C0001,
-+    0x81C, 0x853E0001,
-+    0x81C, 0x84400001,
-+    0x81C, 0x83420001,
-+    0x81C, 0x82440001,
-+    0x81C, 0x81460001,
-+    0x81C, 0x48480001,
-+    0x81C, 0x474A0001,
-+    0x81C, 0x464C0001,
-+    0x81C, 0x454E0001,
-+    0x81C, 0x44500001,
-+    0x81C, 0x43520001,
-+    0x81C, 0x42540001,
-+    0x81C, 0x41560001,
-+    0x81C, 0x25580001,
-+    0x81C, 0x245A0001,
-+    0x81C, 0x235C0001,
-+    0x81C, 0x225E0001,
-+    0x81C, 0x21600001,
-+    0x81C, 0x21620001,
-+    0x81C, 0x21640001,
-+    0x81C, 0x21660001,
-+    0x81C, 0x21680001,
-+    0x81C, 0x216A0001,
-+    0x81C, 0x236C0001,
-+    0x81C, 0x226E0001,
-+    0x81C, 0x21700001,
-+    0x81C, 0x21720001,
-+    0x81C, 0x21740001,
-+    0x81C, 0x21760001,
-+    0x81C, 0x21780001,
-+    0x81C, 0x217A0001,
-+    0x81C, 0x217C0001,
-+    0x81C, 0x217E0001,
-+    0xA0000000,    0x00000000,
-+    0x81C, 0xFF000001,
-+    0x81C, 0xFF020001,
-+    0x81C, 0xFF040001,
-+    0x81C, 0xFF060001,
-+    0x81C, 0xFF080001,
-+    0x81C, 0xFE0A0001,
-+    0x81C, 0xFD0C0001,
-+    0x81C, 0xFC0E0001,
-+    0x81C, 0xFB100001,
-+    0x81C, 0xFA120001,
-+    0x81C, 0xF9140001,
-+    0x81C, 0xF8160001,
-+    0x81C, 0xF7180001,
-+    0x81C, 0xF61A0001,
-+    0x81C, 0xF51C0001,
-+    0x81C, 0xF41E0001,
-+    0x81C, 0xF3200001,
-+    0x81C, 0xF2220001,
-+    0x81C, 0xF1240001,
-+    0x81C, 0xF0260001,
-+    0x81C, 0xEF280001,
-+    0x81C, 0xEE2A0001,
-+    0x81C, 0xED2C0001,
-+    0x81C, 0xEC2E0001,
-+    0x81C, 0xEB300001,
-+    0x81C, 0xEA320001,
-+    0x81C, 0xE9340001,
-+    0x81C, 0xE8360001,
-+    0x81C, 0xE7380001,
-+    0x81C, 0xE63A0001,
-+    0x81C, 0xE53C0001,
-+    0x81C, 0xC73E0001,
-+    0x81C, 0xC6400001,
-+    0x81C, 0xC5420001,
-+    0x81C, 0xC4440001,
-+    0x81C, 0xC3460001,
-+    0x81C, 0xC2480001,
-+    0x81C, 0xC14A0001,
-+    0x81C, 0xA74C0001,
-+    0x81C, 0xA64E0001,
-+    0x81C, 0xA5500001,
-+    0x81C, 0xA4520001,
-+    0x81C, 0xA3540001,
-+    0x81C, 0xA2560001,
-+    0x81C, 0xA1580001,
-+    0x81C, 0x675A0001,
-+    0x81C, 0x665C0001,
-+    0x81C, 0x655E0001,
-+    0x81C, 0x64600001,
-+    0x81C, 0x63620001,
-+    0x81C, 0x48640001,
-+    0x81C, 0x47660001,
-+    0x81C, 0x46680001,
-+    0x81C, 0x456A0001,
-+    0x81C, 0x446C0001,
-+    0x81C, 0x436E0001,
-+    0x81C, 0x42700001,
-+    0x81C, 0x41720001,
-+    0x81C, 0x41740001,
-+    0x81C, 0x41760001,
-+    0x81C, 0x41780001,
-+    0x81C, 0x417A0001,
-+    0x81C, 0x417C0001,
-+    0x81C, 0x417E0001,
-+    0xB0000000,    0x00000000,
-+    0x80000004,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0xFC800001,
-+    0x81C, 0xFB820001,
-+    0x81C, 0xFA840001,
-+    0x81C, 0xF9860001,
-+    0x81C, 0xF8880001,
-+    0x81C, 0xF78A0001,
-+    0x81C, 0xF68C0001,
-+    0x81C, 0xF58E0001,
-+    0x81C, 0xF4900001,
-+    0x81C, 0xF3920001,
-+    0x81C, 0xF2940001,
-+    0x81C, 0xF1960001,
-+    0x81C, 0xF0980001,
-+    0x81C, 0xEF9A0001,
-+    0x81C, 0xEE9C0001,
-+    0x81C, 0xED9E0001,
-+    0x81C, 0xECA00001,
-+    0x81C, 0xEBA20001,
-+    0x81C, 0xEAA40001,
-+    0x81C, 0xE9A60001,
-+    0x81C, 0xE8A80001,
-+    0x81C, 0xE7AA0001,
-+    0x81C, 0xE6AC0001,
-+    0x81C, 0xE5AE0001,
-+    0x81C, 0xE4B00001,
-+    0x81C, 0xE3B20001,
-+    0x81C, 0xA8B40001,
-+    0x81C, 0xA7B60001,
-+    0x81C, 0xA6B80001,
-+    0x81C, 0xA5BA0001,
-+    0x81C, 0xA4BC0001,
-+    0x81C, 0xA3BE0001,
-+    0x81C, 0xA2C00001,
-+    0x81C, 0xA1C20001,
-+    0x81C, 0x68C40001,
-+    0x81C, 0x67C60001,
-+    0x81C, 0x66C80001,
-+    0x81C, 0x65CA0001,
-+    0x81C, 0x64CC0001,
-+    0x81C, 0x47CE0001,
-+    0x81C, 0x46D00001,
-+    0x81C, 0x45D20001,
-+    0x81C, 0x44D40001,
-+    0x81C, 0x43D60001,
-+    0x81C, 0x42D80001,
-+    0x81C, 0x08DA0001,
-+    0x81C, 0x07DC0001,
-+    0x81C, 0x06DE0001,
-+    0x81C, 0x05E00001,
-+    0x81C, 0x04E20001,
-+    0x81C, 0x03E40001,
-+    0x81C, 0x02E60001,
-+    0x81C, 0x01E80001,
-+    0x81C, 0x01EA0001,
-+    0x81C, 0x01EC0001,
-+    0x81C, 0x01EE0001,
-+    0x81C, 0x01F00001,
-+    0x81C, 0x01F20001,
-+    0x81C, 0x01F40001,
-+    0x81C, 0x01F60001,
-+    0x81C, 0x01F80001,
-+    0x81C, 0x01FA0001,
-+    0x81C, 0x01FC0001,
-+    0x81C, 0x01FE0001,
-+    0xA0000000,    0x00000000,
-+    0x81C, 0xFF800001,
-+    0x81C, 0xFF820001,
-+    0x81C, 0xFF840001,
-+    0x81C, 0xFE860001,
-+    0x81C, 0xFD880001,
-+    0x81C, 0xFC8A0001,
-+    0x81C, 0xFB8C0001,
-+    0x81C, 0xFA8E0001,
-+    0x81C, 0xF9900001,
-+    0x81C, 0xF8920001,
-+    0x81C, 0xF7940001,
-+    0x81C, 0xF6960001,
-+    0x81C, 0xF5980001,
-+    0x81C, 0xF49A0001,
-+    0x81C, 0xF39C0001,
-+    0x81C, 0xF29E0001,
-+    0x81C, 0xF1A00001,
-+    0x81C, 0xF0A20001,
-+    0x81C, 0xEFA40001,
-+    0x81C, 0xEEA60001,
-+    0x81C, 0xEDA80001,
-+    0x81C, 0xECAA0001,
-+    0x81C, 0xEBAC0001,
-+    0x81C, 0xEAAE0001,
-+    0x81C, 0xE9B00001,
-+    0x81C, 0xE8B20001,
-+    0x81C, 0xE7B40001,
-+    0x81C, 0xE6B60001,
-+    0x81C, 0xE5B80001,
-+    0x81C, 0xE4BA0001,
-+    0x81C, 0xE3BC0001,
-+    0x81C, 0xA8BE0001,
-+    0x81C, 0xA7C00001,
-+    0x81C, 0xA6C20001,
-+    0x81C, 0xA5C40001,
-+    0x81C, 0xA4C60001,
-+    0x81C, 0xA3C80001,
-+    0x81C, 0xA2CA0001,
-+    0x81C, 0xA1CC0001,
-+    0x81C, 0x68CE0001,
-+    0x81C, 0x67D00001,
-+    0x81C, 0x66D20001,
-+    0x81C, 0x65D40001,
-+    0x81C, 0x64D60001,
-+    0x81C, 0x47D80001,
-+    0x81C, 0x46DA0001,
-+    0x81C, 0x45DC0001,
-+    0x81C, 0x44DE0001,
-+    0x81C, 0x43E00001,
-+    0x81C, 0x42E20001,
-+    0x81C, 0x08E40001,
-+    0x81C, 0x07E60001,
-+    0x81C, 0x06E80001,
-+    0x81C, 0x05EA0001,
-+    0x81C, 0x04EC0001,
-+    0x81C, 0x03EE0001,
-+    0x81C, 0x02F00001,
-+    0x81C, 0x01F20001,
-+    0x81C, 0x01F40001,
-+    0x81C, 0x01F60001,
-+    0x81C, 0x01F80001,
-+    0x81C, 0x01FA0001,
-+    0x81C, 0x01FC0001,
-+    0x81C, 0x01FE0001,
-+    0xB0000000,    0x00000000,
-+    0xC50, 0x00000022,
-+    0xC50, 0x00000020,
-+    0xE50, 0x00000022,
-+    0xE50, 0x00000020,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8812a_agc, rtw_phy_cfg_agc);
-+
-+static const u32 rtw8812a_agc_diff_lb[] = {
-+    0x80000004,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0x47CE0001,
-+    0x81C, 0x46D00001,
-+    0x81C, 0x45D20001,
-+    0x81C, 0x44D40001,
-+    0x81C, 0x43D60001,
-+    0x81C, 0x42D80001,
-+    0x81C, 0x08DA0001,
-+    0x81C, 0x07DC0001,
-+    0x81C, 0x06DE0001,
-+    0x81C, 0x05E00001,
-+    0x81C, 0x04E20001,
-+    0x81C, 0x03E40001,
-+    0x81C, 0x02E60001,
-+    0xA0000000,    0x00000000,
-+    0x81C, 0x47D80001,
-+    0x81C, 0x46DA0001,
-+    0x81C, 0x45DC0001,
-+    0x81C, 0x44DE0001,
-+    0x81C, 0x43E00001,
-+    0x81C, 0x42E20001,
-+    0x81C, 0x08E40001,
-+    0x81C, 0x07E60001,
-+    0x81C, 0x06E80001,
-+    0x81C, 0x05EA0001,
-+    0x81C, 0x04EC0001,
-+    0x81C, 0x03EE0001,
-+    0x81C, 0x02F00001,
-+    0xB0000000,    0x00000000,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8812a_agc_diff_lb, rtw_phy_cfg_agc);
-+
-+static const u32 rtw8812a_agc_diff_hb[] = {
-+    0x80000004,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0x45CE0001,
-+    0x81C, 0x44D00001,
-+    0x81C, 0x43D20001,
-+    0x81C, 0x42D40001,
-+    0x81C, 0x08D60001,
-+    0x81C, 0x07D80001,
-+    0x81C, 0x06DA0001,
-+    0x81C, 0x05DC0001,
-+    0x81C, 0x04DE0001,
-+    0x81C, 0x03E00001,
-+    0x81C, 0x02E20001,
-+    0x81C, 0x01E40001,
-+    0x81C, 0x01E60001,
-+    0xA0000000,    0x00000000,
-+    0x81C, 0x45D80001,
-+    0x81C, 0x44DA0001,
-+    0x81C, 0x43DC0001,
-+    0x81C, 0x42DE0001,
-+    0x81C, 0x08E00001,
-+    0x81C, 0x07E20001,
-+    0x81C, 0x06E40001,
-+    0x81C, 0x05E60001,
-+    0x81C, 0x04E80001,
-+    0x81C, 0x03EA0001,
-+    0x81C, 0x02EC0001,
-+    0x81C, 0x01EE0001,
-+    0x81C, 0x01F00001,
-+    0xB0000000,    0x00000000,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8812a_agc_diff_hb, rtw_phy_cfg_agc);
-+
-+static const u32 rtw8812a_bb[] = {
-+    0x800, 0x8020D010,
-+    0x804, 0x080112E0,
-+    0x808, 0x0E028233,
-+    0x80C, 0x12131113,
-+    0x810, 0x20101263,
-+    0x814, 0x020C3D10,
-+    0x818, 0x03A00385,
-+    0x820, 0x00000000,
-+    0x824, 0x00030FE0,
-+    0x828, 0x00000000,
-+    0x82C, 0x002083DD,
-+    0x830, 0x2EAAEEB8,
-+    0x834, 0x0037A706,
-+    0x838, 0x06C89B44,
-+    0x83C, 0x0000095B,
-+    0x840, 0xC0000001,
-+    0x844, 0x40003CDE,
-+    0x848, 0x6210FF8B,
-+    0x84C, 0x6CFDFFB8,
-+    0x850, 0x28874706,
-+    0x854, 0x0001520C,
-+    0x858, 0x8060E000,
-+    0x85C, 0x74210168,
-+    0x860, 0x6929C321,
-+    0x864, 0x79727432,
-+    0x868, 0x8CA7A314,
-+    0x86C, 0x338C2878,
-+    0x870, 0x03333333,
-+    0x874, 0x31602C2E,
-+    0x878, 0x00003152,
-+    0x87C, 0x000FC000,
-+    0x8A0, 0x00000013,
-+    0x8A4, 0x7F7F7F7F,
-+    0x8A8, 0xA202033E,
-+    0x8AC, 0x0FF0FA0A,
-+    0x8B0, 0x00000600,
-+    0x8B4, 0x000FC080,
-+    0x8B8, 0x6C10D7FF,
-+    0x8BC, 0x4CA520A3,
-+    0x8C0, 0x27F00020,
-+    0x8C4, 0x00000000,
-+    0x8C8, 0x00012D69,
-+    0x8CC, 0x08248492,
-+    0x8D0, 0x0000B800,
-+    0x8DC, 0x00000000,
-+    0x8D4, 0x940008A0,
-+    0x8D8, 0x290B5612,
-+    0x8F8, 0x400002C0,
-+    0x8FC, 0x00000000,
-+    0x900, 0x00000701,
-+    0x90C, 0x00000000,
-+    0x910, 0x0000FC00,
-+    0x914, 0x00000404,
-+    0x918, 0x1C1028C0,
-+    0x91C, 0x64B11A1C,
-+    0x920, 0xE0767233,
-+    0x924, 0x055AA500,
-+    0x928, 0x00000004,
-+    0x92C, 0xFFFE0000,
-+    0x930, 0xFFFFFFFE,
-+    0x934, 0x001FFFFF,
-+    0x960, 0x00000000,
-+    0x964, 0x00000000,
-+    0x968, 0x00000000,
-+    0x96C, 0x00000000,
-+    0x970, 0x801FFFFF,
-+    0x978, 0x00000000,
-+    0x97C, 0x00000000,
-+    0x980, 0x00000000,
-+    0x984, 0x00000000,
-+    0x988, 0x00000000,
-+    0x990, 0x27100000,
-+    0x994, 0xFFFF0100,
-+    0x998, 0xFFFFFF5C,
-+    0x99C, 0xFFFFFFFF,
-+    0x9A0, 0x000000FF,
-+    0x9A4, 0x00080080,
-+    0x9A8, 0x00000000,
-+    0x9AC, 0x00000000,
-+    0x9B0, 0x81081008,
-+    0x9B4, 0x00000000,
-+    0x9B8, 0x01081008,
-+    0x9BC, 0x01081008,
-+    0x9D0, 0x00000000,
-+    0x9D4, 0x00000000,
-+    0x9D8, 0x00000000,
-+    0x9DC, 0x00000000,
-+    0x9E4, 0x00000003,
-+    0x9E8, 0x000002D5,
-+    0xA00, 0x00D047C8,
-+    0xA04, 0x01FF000C,
-+    0xA08, 0x8C838300,
-+    0xA0C, 0x2E7F000F,
-+    0xA10, 0x9500BB78,
-+    0xA14, 0x11144028,
-+    0xA18, 0x00881117,
-+    0xA1C, 0x89140F00,
-+    0xA20, 0x1A1B0000,
-+    0xA24, 0x090E1217,
-+    0xA28, 0x00000305,
-+    0xA2C, 0x00900000,
-+    0xA70, 0x101FFF00,
-+    0xA74, 0x00000008,
-+    0xA78, 0x00000900,
-+    0xA7C, 0x225B0606,
-+    0xA80, 0x218075B2,
-+    0xA84, 0x001F8C80,
-+    0xB00, 0x03100000,
-+    0xB04, 0x0000B000,
-+    0xB08, 0xAE0201EB,
-+    0xB0C, 0x01003207,
-+    0xB10, 0x00009807,
-+    0xB14, 0x01000000,
-+    0xB18, 0x00000002,
-+    0xB1C, 0x00000002,
-+    0xB20, 0x0000001F,
-+    0xB24, 0x03020100,
-+    0xB28, 0x07060504,
-+    0xB2C, 0x0B0A0908,
-+    0xB30, 0x0F0E0D0C,
-+    0xB34, 0x13121110,
-+    0xB38, 0x17161514,
-+    0xB3C, 0x0000003A,
-+    0xB40, 0x00000000,
-+    0xB44, 0x00000000,
-+    0xB48, 0x13000032,
-+    0xB4C, 0x48080000,
-+    0xB50, 0x00000000,
-+    0xB54, 0x00000000,
-+    0xB58, 0x00000000,
-+    0xB5C, 0x00000000,
-+    0xC00, 0x00000007,
-+    0xC04, 0x00042020,
-+    0xC08, 0x80410231,
-+    0xC0C, 0x00000000,
-+    0xC10, 0x00000100,
-+    0xC14, 0x01000000,
-+    0xC1C, 0x40000003,
-+    0xC20, 0x12121212,
-+    0xC24, 0x12121212,
-+    0xC28, 0x12121212,
-+    0xC2C, 0x12121212,
-+    0xC30, 0x12121212,
-+    0xC34, 0x12121212,
-+    0xC38, 0x12121212,
-+    0xC3C, 0x12121212,
-+    0xC40, 0x12121212,
-+    0xC44, 0x12121212,
-+    0xC48, 0x12121212,
-+    0xC4C, 0x12121212,
-+    0xC50, 0x00000020,
-+    0xC54, 0x0008121C,
-+    0xC58, 0x30000C1C,
-+    0xC5C, 0x00000058,
-+    0xC60, 0x34344443,
-+    0xC64, 0x07003333,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0x90000002,    0x00000000,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0x90000004,    0x00000000,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0x90000001,    0x00000000,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0xC68, 0x59791979,
-+    0xA0000000,    0x00000000,
-+    0xC68, 0x59799979,
-+    0xB0000000,    0x00000000,
-+    0xC6C, 0x59795979,
-+    0xC70, 0x19795979,
-+    0xC74, 0x19795979,
-+    0xC78, 0x19791979,
-+    0xC7C, 0x19791979,
-+    0xC80, 0x19791979,
-+    0xC84, 0x19791979,
-+    0xC94, 0x0100005C,
-+    0xC98, 0x00000000,
-+    0xC9C, 0x00000000,
-+    0xCA0, 0x00000029,
-+    0xCA4, 0x08040201,
-+    0xCA8, 0x80402010,
-+    0xCB0, 0x77547777,
-+    0xCB4, 0x00000077,
-+    0xCB8, 0x00508242,
-+    0xE00, 0x00000007,
-+    0xE04, 0x00042020,
-+    0xE08, 0x80410231,
-+    0xE0C, 0x00000000,
-+    0xE10, 0x00000100,
-+    0xE14, 0x01000000,
-+    0xE1C, 0x40000003,
-+    0xE20, 0x12121212,
-+    0xE24, 0x12121212,
-+    0xE28, 0x12121212,
-+    0xE2C, 0x12121212,
-+    0xE30, 0x12121212,
-+    0xE34, 0x12121212,
-+    0xE38, 0x12121212,
-+    0xE3C, 0x12121212,
-+    0xE40, 0x12121212,
-+    0xE44, 0x12121212,
-+    0xE48, 0x12121212,
-+    0xE4C, 0x12121212,
-+    0xE50, 0x00000020,
-+    0xE54, 0x0008121C,
-+    0xE58, 0x30000C1C,
-+    0xE5C, 0x00000058,
-+    0xE60, 0x34344443,
-+    0xE64, 0x07003333,
-+    0xE68, 0x59791979,
-+    0xE6C, 0x59795979,
-+    0xE70, 0x19795979,
-+    0xE74, 0x19795979,
-+    0xE78, 0x19791979,
-+    0xE7C, 0x19791979,
-+    0xE80, 0x19791979,
-+    0xE84, 0x19791979,
-+    0xE94, 0x0100005C,
-+    0xE98, 0x00000000,
-+    0xE9C, 0x00000000,
-+    0xEA0, 0x00000029,
-+    0xEA4, 0x08040201,
-+    0xEA8, 0x80402010,
-+    0xEB0, 0x77547777,
-+    0xEB4, 0x00000077,
-+    0xEB8, 0x00508242,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8812a_bb, rtw_phy_cfg_bb);
-+
-+static const struct rtw_phy_pg_cfg_pair rtw8812a_bb_pg[] = {
-+    { 0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840, },
-+    { 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, },
-+    { 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638, },
-+    { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, },
-+    { 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, },
-+    { 0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, },
-+    { 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, },
-+    { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, },
-+    { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, },
-+    { 0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, },
-+    { 0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, },
-+    { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
-+    { 0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840, },
-+    { 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, },
-+    { 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638, },
-+    { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, },
-+    { 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, },
-+    { 0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, },
-+    { 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, },
-+    { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, },
-+    { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, },
-+    { 0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, },
-+    { 0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, },
-+    { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
-+    { 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, },
-+    { 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640, },
-+    { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, },
-+    { 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, },
-+    { 1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, },
-+    { 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, },
-+    { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, },
-+    { 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, },
-+    { 1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, },
-+    { 1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, },
-+    { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
-+    { 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, },
-+    { 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640, },
-+    { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, },
-+    { 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, },
-+    { 1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, },
-+    { 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, },
-+    { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, },
-+    { 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, },
-+    { 1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, },
-+    { 1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, },
-+    { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
-+};
-+
-+RTW_DECL_TABLE_BB_PG(rtw8812a_bb_pg);
-+
-+static const struct rtw_phy_pg_cfg_pair rtw8812a_bb_pg_rfe3[] = {
-+    { 0, 0, 0, 0x00000c20, 0xffffffff, 0x34343434, },
-+    { 0, 0, 0, 0x00000c24, 0xffffffff, 0x32323232, },
-+    { 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303232, },
-+    { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x32323232, },
-+    { 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303232, },
-+    { 0, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
-+    { 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, },
-+    { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32323232, },
-+    { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303232, },
-+    { 0, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
-+    { 0, 0, 1, 0x00000c48, 0xffffffff, 0x32323232, },
-+    { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x24262830, },
-+    { 0, 1, 0, 0x00000e20, 0xffffffff, 0x34343434, },
-+    { 0, 1, 0, 0x00000e24, 0xffffffff, 0x32323232, },
-+    { 0, 1, 0, 0x00000e28, 0xffffffff, 0x28303232, },
-+    { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x32323232, },
-+    { 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303232, },
-+    { 0, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
-+    { 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, },
-+    { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x32323232, },
-+    { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303232, },
-+    { 0, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
-+    { 0, 1, 1, 0x00000e48, 0xffffffff, 0x32323232, },
-+    { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x24262830, },
-+    { 1, 0, 0, 0x00000c24, 0xffffffff, 0x32323232, },
-+    { 1, 0, 0, 0x00000c28, 0xffffffff, 0x28303232, },
-+    { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32323232, },
-+    { 1, 0, 0, 0x00000c30, 0xffffffff, 0x24262830, },
-+    { 1, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
-+    { 1, 0, 1, 0x00000c38, 0xffffffff, 0x24262830, },
-+    { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32323232, },
-+    { 1, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, },
-+    { 1, 0, 0, 0x00000c44, 0xffffffff, 0x32322222, },
-+    { 1, 0, 1, 0x00000c48, 0xffffffff, 0x28303232, },
-+    { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22222426, },
-+    { 1, 1, 0, 0x00000e24, 0xffffffff, 0x32323232, },
-+    { 1, 1, 0, 0x00000e28, 0xffffffff, 0x28303232, },
-+    { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x32323232, },
-+    { 1, 1, 0, 0x00000e30, 0xffffffff, 0x24262830, },
-+    { 1, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
-+    { 1, 1, 1, 0x00000e38, 0xffffffff, 0x24262830, },
-+    { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x32323232, },
-+    { 1, 1, 0, 0x00000e40, 0xffffffff, 0x24262830, },
-+    { 1, 1, 0, 0x00000e44, 0xffffffff, 0x32322222, },
-+    { 1, 1, 1, 0x00000e48, 0xffffffff, 0x28303232, },
-+    { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22222426, },
-+};
-+
-+RTW_DECL_TABLE_BB_PG(rtw8812a_bb_pg_rfe3);
-+
-+static const u32 rtw8812a_rf_a[] = {
-+    0x000, 0x00010000,
-+    0x018, 0x0001712A,
-+    0x056, 0x00051CF2,
-+    0x066, 0x00040000,
-+    0x01E, 0x00080000,
-+    0x089, 0x00000080,
-+    0x80000001,    0x00000000,    0x40000000,    0x00000000,
-+    0x086, 0x00014B3A,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0x086, 0x00014B3A,
-+    0xA0000000,    0x00000000,
-+    0x086, 0x00014B38,
-+    0xB0000000,    0x00000000,
-+    0x80000004,    0x00000000,    0x40000000,    0x00000000,
-+    0x08B, 0x00080180,
-+    0xA0000000,    0x00000000,
-+    0x08B, 0x00087180,
-+    0xB0000000,    0x00000000,
-+    0x0B1, 0x0001FC1A,
-+    0x0B3, 0x000F0810,
-+    0x0B4, 0x0001A78D,
-+    0x0BA, 0x00086180,
-+    0x018, 0x00000006,
-+    0x0EF, 0x00002000,
-+    0x80000001,    0x00000000,    0x40000000,    0x00000000,
-+    0x03B, 0x0003F218,
-+    0x03B, 0x00030A58,
-+    0x03B, 0x0002FA58,
-+    0x03B, 0x00022590,
-+    0x03B, 0x0001FA50,
-+    0x03B, 0x00010248,
-+    0x03B, 0x00008240,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0x03B, 0x0003F218,
-+    0x03B, 0x00030A58,
-+    0x03B, 0x0002FA58,
-+    0x03B, 0x00022590,
-+    0x03B, 0x0001FA50,
-+    0x03B, 0x00010248,
-+    0x03B, 0x00008240,
-+    0xA0000000,    0x00000000,
-+    0x03B, 0x00038A58,
-+    0x03B, 0x00037A58,
-+    0x03B, 0x0002A590,
-+    0x03B, 0x00027A50,
-+    0x03B, 0x00018248,
-+    0x03B, 0x00010240,
-+    0x03B, 0x00008240,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000100,
-+    0x80000002,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A4EE,
-+    0x034, 0x00009076,
-+    0x034, 0x00008073,
-+    0x034, 0x00007070,
-+    0x034, 0x0000606D,
-+    0x034, 0x0000506A,
-+    0x034, 0x00004049,
-+    0x034, 0x00003046,
-+    0x034, 0x00002028,
-+    0x034, 0x00001025,
-+    0x034, 0x00000022,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0000ADF4,
-+    0x034, 0x00009DF1,
-+    0x034, 0x00008DEE,
-+    0x034, 0x00007DEB,
-+    0x034, 0x00006DE8,
-+    0x034, 0x00005DE5,
-+    0x034, 0x00004DE2,
-+    0x034, 0x00003CE6,
-+    0x034, 0x000024E7,
-+    0x034, 0x000014E4,
-+    0x034, 0x000004E1,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x000020A2,
-+    0x0DF, 0x00000080,
-+    0x035, 0x00000192,
-+    0x035, 0x00008192,
-+    0x035, 0x00010192,
-+    0x036, 0x00000024,
-+    0x036, 0x00008024,
-+    0x036, 0x00010024,
-+    0x036, 0x00018024,
-+    0x0EF, 0x00000000,
-+    0x051, 0x00000C21,
-+    0x052, 0x000006D9,
-+    0x053, 0x000FC649,
-+    0x054, 0x0000017E,
-+    0x0EF, 0x00000002,
-+    0x008, 0x00008400,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00001000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x0003A02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x0003202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x0002B064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x00023070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0001B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00012085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0000A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00002080,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x0007A02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x0007202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x0006B064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x00063070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0005B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00052085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0004A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00042080,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x000BA02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x000B202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x000AB064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x000A3070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0009B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00092085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0008A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00082080,
-+    0x03C, 0x00010000,
-+    0x0EF, 0x00001100,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0B2,
-+    0x034, 0x000490AF,
-+    0x034, 0x00048070,
-+    0x034, 0x0004706D,
-+    0x034, 0x00046050,
-+    0x034, 0x0004504D,
-+    0x034, 0x0004404A,
-+    0x034, 0x00043047,
-+    0x034, 0x0004200A,
-+    0x034, 0x00041007,
-+    0x034, 0x00040004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0B2,
-+    0x034, 0x000490AF,
-+    0x034, 0x00048070,
-+    0x034, 0x0004706D,
-+    0x034, 0x0004604D,
-+    0x034, 0x0004504A,
-+    0x034, 0x00044047,
-+    0x034, 0x00043044,
-+    0x034, 0x00042007,
-+    0x034, 0x00041004,
-+    0x034, 0x00040001,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0004ADF5,
-+    0x034, 0x00049DF2,
-+    0x034, 0x00048DEF,
-+    0x034, 0x00047DEC,
-+    0x034, 0x00046DE9,
-+    0x034, 0x00045DE6,
-+    0x034, 0x00044DE3,
-+    0x034, 0x000438C8,
-+    0x034, 0x000428C5,
-+    0x034, 0x000418C2,
-+    0x034, 0x000408C0,
-+    0xB0000000,    0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0B2,
-+    0x034, 0x000290AF,
-+    0x034, 0x00028070,
-+    0x034, 0x0002706D,
-+    0x034, 0x00026050,
-+    0x034, 0x0002504D,
-+    0x034, 0x0002404A,
-+    0x034, 0x00023047,
-+    0x034, 0x0002200A,
-+    0x034, 0x00021007,
-+    0x034, 0x00020004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0B4,
-+    0x034, 0x000290B1,
-+    0x034, 0x00028072,
-+    0x034, 0x0002706F,
-+    0x034, 0x0002604F,
-+    0x034, 0x0002504C,
-+    0x034, 0x00024049,
-+    0x034, 0x00023046,
-+    0x034, 0x00022009,
-+    0x034, 0x00021006,
-+    0x034, 0x00020003,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0002ADF5,
-+    0x034, 0x00029DF2,
-+    0x034, 0x00028DEF,
-+    0x034, 0x00027DEC,
-+    0x034, 0x00026DE9,
-+    0x034, 0x00025DE6,
-+    0x034, 0x00024DE3,
-+    0x034, 0x000238C8,
-+    0x034, 0x000228C5,
-+    0x034, 0x000218C2,
-+    0x034, 0x000208C0,
-+    0xB0000000,    0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0B2,
-+    0x034, 0x000090AF,
-+    0x034, 0x00008070,
-+    0x034, 0x0000706D,
-+    0x034, 0x00006050,
-+    0x034, 0x0000504D,
-+    0x034, 0x0000404A,
-+    0x034, 0x00003047,
-+    0x034, 0x0000200A,
-+    0x034, 0x00001007,
-+    0x034, 0x00000004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0B2,
-+    0x034, 0x000090AF,
-+    0x034, 0x00008070,
-+    0x034, 0x0000706D,
-+    0x034, 0x0000604D,
-+    0x034, 0x0000504A,
-+    0x034, 0x00004047,
-+    0x034, 0x00003044,
-+    0x034, 0x00002007,
-+    0x034, 0x00001004,
-+    0x034, 0x00000001,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0000AFF7,
-+    0x034, 0x00009DF7,
-+    0x034, 0x00008DF4,
-+    0x034, 0x00007DF1,
-+    0x034, 0x00006DEE,
-+    0x034, 0x00005DEB,
-+    0x034, 0x00004DE8,
-+    0x034, 0x000038CC,
-+    0x034, 0x000028C9,
-+    0x034, 0x000018C6,
-+    0x034, 0x000008C3,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x000001D4,
-+    0x035, 0x000081D4,
-+    0x035, 0x000101D4,
-+    0x035, 0x000201B4,
-+    0x035, 0x000281B4,
-+    0x035, 0x000301B4,
-+    0x035, 0x000401B4,
-+    0x035, 0x000481B4,
-+    0x035, 0x000501B4,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x000001D4,
-+    0x035, 0x000081D4,
-+    0x035, 0x000101D4,
-+    0x035, 0x000201B4,
-+    0x035, 0x000281B4,
-+    0x035, 0x000301B4,
-+    0x035, 0x000401B4,
-+    0x035, 0x000481B4,
-+    0x035, 0x000501B4,
-+    0xA0000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x00000188,
-+    0x035, 0x00008147,
-+    0x035, 0x00010147,
-+    0x035, 0x000201D7,
-+    0x035, 0x000281D7,
-+    0x035, 0x000301D7,
-+    0x035, 0x000401D8,
-+    0x035, 0x000481D8,
-+    0x035, 0x000501D8,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00004BFB,
-+    0x036, 0x0000CBFB,
-+    0x036, 0x00014BFB,
-+    0x036, 0x0001CBFB,
-+    0x036, 0x00024F4B,
-+    0x036, 0x0002CF4B,
-+    0x036, 0x00034F4B,
-+    0x036, 0x0003CF4B,
-+    0x036, 0x00044F4B,
-+    0x036, 0x0004CF4B,
-+    0x036, 0x00054F4B,
-+    0x036, 0x0005CF4B,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00004BFB,
-+    0x036, 0x0000CBFB,
-+    0x036, 0x00014BFB,
-+    0x036, 0x0001CBFB,
-+    0x036, 0x00024F4B,
-+    0x036, 0x0002CF4B,
-+    0x036, 0x00034F4B,
-+    0x036, 0x0003CF4B,
-+    0x036, 0x00044F4B,
-+    0x036, 0x0004CF4B,
-+    0x036, 0x00054F4B,
-+    0x036, 0x0005CF4B,
-+    0xA0000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00084EB4,
-+    0x036, 0x0008CC35,
-+    0x036, 0x00094C35,
-+    0x036, 0x0009CC35,
-+    0x036, 0x000A4C35,
-+    0x036, 0x000ACC35,
-+    0x036, 0x000B4C35,
-+    0x036, 0x000BCC35,
-+    0x036, 0x000C4C34,
-+    0x036, 0x000CCC35,
-+    0x036, 0x000D4C35,
-+    0x036, 0x000DCC35,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x00000008,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000002CC,
-+    0x03C, 0x00000522,
-+    0x03C, 0x00000902,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000002CC,
-+    0x03C, 0x00000522,
-+    0x03C, 0x00000902,
-+    0xA0000000,    0x00000000,
-+    0x03C, 0x000002A8,
-+    0x03C, 0x000005A2,
-+    0x03C, 0x00000880,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000002,
-+    0x0DF, 0x00000080,
-+    0x01F, 0x00000064,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000FDD43,
-+    0x062, 0x00038F4B,
-+    0x063, 0x00032117,
-+    0x064, 0x000194AC,
-+    0x065, 0x000931D1,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x061, 0x000FDD43,
-+    0x062, 0x00038F4B,
-+    0x063, 0x00032117,
-+    0x064, 0x000194AC,
-+    0x065, 0x000931D2,
-+    0xA0000000,    0x00000000,
-+    0x061, 0x000E5D53,
-+    0x062, 0x00038FCD,
-+    0x063, 0x000114EB,
-+    0x064, 0x000196AC,
-+    0x065, 0x000911D7,
-+    0xB0000000,    0x00000000,
-+    0x008, 0x00008400,
-+    0x01C, 0x000739D2,
-+    0x0B4, 0x0001E78D,
-+    0x018, 0x0001F12A,
-+    0xFFE, 0x00000000,
-+    0xFFE, 0x00000000,
-+    0xFFE, 0x00000000,
-+    0xFFE, 0x00000000,
-+    0x0B4, 0x0001A78D,
-+    0x018, 0x0001712A,
-+};
-+
-+RTW_DECL_TABLE_RF_RADIO(rtw8812a_rf_a, A);
-+
-+static const u32 rtw8812a_rf_b[] = {
-+    0x056, 0x00051CF2,
-+    0x066, 0x00040000,
-+    0x089, 0x00000080,
-+    0x80000001,    0x00000000,    0x40000000,    0x00000000,
-+    0x086, 0x00014B3A,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0x086, 0x00014B3A,
-+    0xA0000000,    0x00000000,
-+    0x086, 0x00014B38,
-+    0xB0000000,    0x00000000,
-+    0x80000004,    0x00000000,    0x40000000,    0x00000000,
-+    0x08B, 0x00080180,
-+    0xA0000000,    0x00000000,
-+    0x08B, 0x00087180,
-+    0xB0000000,    0x00000000,
-+    0x018, 0x00000006,
-+    0x0EF, 0x00002000,
-+    0x80000001,    0x00000000,    0x40000000,    0x00000000,
-+    0x03B, 0x0003F218,
-+    0x03B, 0x00030A58,
-+    0x03B, 0x0002FA58,
-+    0x03B, 0x00022590,
-+    0x03B, 0x0001FA50,
-+    0x03B, 0x00010248,
-+    0x03B, 0x00008240,
-+    0x90000001,    0x00000005,    0x40000000,    0x00000000,
-+    0x03B, 0x0003F218,
-+    0x03B, 0x00030A58,
-+    0x03B, 0x0002FA58,
-+    0x03B, 0x00022590,
-+    0x03B, 0x0001FA50,
-+    0x03B, 0x00010248,
-+    0x03B, 0x00008240,
-+    0xA0000000,    0x00000000,
-+    0x03B, 0x00038A58,
-+    0x03B, 0x00037A58,
-+    0x03B, 0x0002A590,
-+    0x03B, 0x00027A50,
-+    0x03B, 0x00018248,
-+    0x03B, 0x00010240,
-+    0x03B, 0x00008240,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000100,
-+    0x80000002,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A4EE,
-+    0x034, 0x00009076,
-+    0x034, 0x00008073,
-+    0x034, 0x00007070,
-+    0x034, 0x0000606D,
-+    0x034, 0x0000506A,
-+    0x034, 0x00004049,
-+    0x034, 0x00003046,
-+    0x034, 0x00002028,
-+    0x034, 0x00001025,
-+    0x034, 0x00000022,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0000ADF4,
-+    0x034, 0x00009DF1,
-+    0x034, 0x00008DEE,
-+    0x034, 0x00007DEB,
-+    0x034, 0x00006DE8,
-+    0x034, 0x00005DE5,
-+    0x034, 0x00004DE2,
-+    0x034, 0x00003CE6,
-+    0x034, 0x000024E7,
-+    0x034, 0x000014E4,
-+    0x034, 0x000004E1,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x000020A2,
-+    0x0DF, 0x00000080,
-+    0x035, 0x00000192,
-+    0x035, 0x00008192,
-+    0x035, 0x00010192,
-+    0x036, 0x00000024,
-+    0x036, 0x00008024,
-+    0x036, 0x00010024,
-+    0x036, 0x00018024,
-+    0x0EF, 0x00000000,
-+    0x051, 0x00000C21,
-+    0x052, 0x000006D9,
-+    0x053, 0x000FC649,
-+    0x054, 0x0000017E,
-+    0x0EF, 0x00000002,
-+    0x008, 0x00008400,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00001000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x0003A02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x0003202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x0002B064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x00023070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0001B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00012085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0000A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00002080,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x0007A02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x0007202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x0006B064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x00063070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0005B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00052085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0004A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00042080,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000080,
-+    0x03B, 0x000BA02C,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000400,
-+    0x03B, 0x000B202C,
-+    0x03C, 0x00010000,
-+    0x03A, 0x000000A0,
-+    0x03B, 0x000AB064,
-+    0x03C, 0x00004000,
-+    0x03A, 0x000000D8,
-+    0x03B, 0x000A3070,
-+    0x03C, 0x00004000,
-+    0x03A, 0x00000468,
-+    0x03B, 0x0009B870,
-+    0x03C, 0x00010000,
-+    0x03A, 0x00000098,
-+    0x03B, 0x00092085,
-+    0x03C, 0x000E4000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x0008A080,
-+    0x03C, 0x000F0000,
-+    0x03A, 0x00000418,
-+    0x03B, 0x00082080,
-+    0x03C, 0x00010000,
-+    0x0EF, 0x00001100,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0B2,
-+    0x034, 0x000490AF,
-+    0x034, 0x00048070,
-+    0x034, 0x0004706D,
-+    0x034, 0x00046050,
-+    0x034, 0x0004504D,
-+    0x034, 0x0004404A,
-+    0x034, 0x00043047,
-+    0x034, 0x0004200A,
-+    0x034, 0x00041007,
-+    0x034, 0x00040004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0B1,
-+    0x034, 0x000490AE,
-+    0x034, 0x0004806F,
-+    0x034, 0x0004706C,
-+    0x034, 0x0004604C,
-+    0x034, 0x00045049,
-+    0x034, 0x00044046,
-+    0x034, 0x00043043,
-+    0x034, 0x00042006,
-+    0x034, 0x00041003,
-+    0x034, 0x00040000,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0004ADF5,
-+    0x034, 0x00049DF2,
-+    0x034, 0x00048DEF,
-+    0x034, 0x00047DEC,
-+    0x034, 0x00046DE9,
-+    0x034, 0x00045DE6,
-+    0x034, 0x00044DE3,
-+    0x034, 0x000438C8,
-+    0x034, 0x000428C5,
-+    0x034, 0x000418C2,
-+    0x034, 0x000408C0,
-+    0xB0000000,    0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0B2,
-+    0x034, 0x000290AF,
-+    0x034, 0x00028070,
-+    0x034, 0x0002706D,
-+    0x034, 0x00026050,
-+    0x034, 0x0002504D,
-+    0x034, 0x0002404A,
-+    0x034, 0x00023047,
-+    0x034, 0x0002200A,
-+    0x034, 0x00021007,
-+    0x034, 0x00020004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0B3,
-+    0x034, 0x000290B0,
-+    0x034, 0x00028071,
-+    0x034, 0x0002706E,
-+    0x034, 0x0002604E,
-+    0x034, 0x0002504B,
-+    0x034, 0x00024048,
-+    0x034, 0x00023045,
-+    0x034, 0x00022008,
-+    0x034, 0x00021005,
-+    0x034, 0x00020002,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0002ADF5,
-+    0x034, 0x00029DF2,
-+    0x034, 0x00028DEF,
-+    0x034, 0x00027DEC,
-+    0x034, 0x00026DE9,
-+    0x034, 0x00025DE6,
-+    0x034, 0x00024DE3,
-+    0x034, 0x000238C8,
-+    0x034, 0x000228C5,
-+    0x034, 0x000218C2,
-+    0x034, 0x000208C0,
-+    0xB0000000,    0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0B2,
-+    0x034, 0x000090AF,
-+    0x034, 0x00008070,
-+    0x034, 0x0000706D,
-+    0x034, 0x00006050,
-+    0x034, 0x0000504D,
-+    0x034, 0x0000404A,
-+    0x034, 0x00003047,
-+    0x034, 0x0000200A,
-+    0x034, 0x00001007,
-+    0x034, 0x00000004,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0B3,
-+    0x034, 0x000090B0,
-+    0x034, 0x00008070,
-+    0x034, 0x0000706D,
-+    0x034, 0x0000604D,
-+    0x034, 0x0000504A,
-+    0x034, 0x00004047,
-+    0x034, 0x00003044,
-+    0x034, 0x00002007,
-+    0x034, 0x00001004,
-+    0x034, 0x00000001,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0000AFF7,
-+    0x034, 0x00009DF7,
-+    0x034, 0x00008DF4,
-+    0x034, 0x00007DF1,
-+    0x034, 0x00006DEE,
-+    0x034, 0x00005DEB,
-+    0x034, 0x00004DE8,
-+    0x034, 0x000038CC,
-+    0x034, 0x000028C9,
-+    0x034, 0x000018C6,
-+    0x034, 0x000008C3,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x000001C5,
-+    0x035, 0x000081C5,
-+    0x035, 0x000101C5,
-+    0x035, 0x00020174,
-+    0x035, 0x00028174,
-+    0x035, 0x00030174,
-+    0x035, 0x00040185,
-+    0x035, 0x00048185,
-+    0x035, 0x00050185,
-+    0x0EF, 0x00000000,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x000001C5,
-+    0x035, 0x000081C5,
-+    0x035, 0x000101C5,
-+    0x035, 0x00020174,
-+    0x035, 0x00028174,
-+    0x035, 0x00030174,
-+    0x035, 0x00040185,
-+    0x035, 0x00048185,
-+    0x035, 0x00050185,
-+    0x0EF, 0x00000000,
-+    0xA0000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x035, 0x00000188,
-+    0x035, 0x00008147,
-+    0x035, 0x00010147,
-+    0x035, 0x000201D7,
-+    0x035, 0x000281D7,
-+    0x035, 0x000301D7,
-+    0x035, 0x000401D8,
-+    0x035, 0x000481D8,
-+    0x035, 0x000501D8,
-+    0x0EF, 0x00000000,
-+    0xB0000000,    0x00000000,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00005B8B,
-+    0x036, 0x0000DB8B,
-+    0x036, 0x00015B8B,
-+    0x036, 0x0001DB8B,
-+    0x036, 0x000262DB,
-+    0x036, 0x0002E2DB,
-+    0x036, 0x000362DB,
-+    0x036, 0x0003E2DB,
-+    0x036, 0x0004553B,
-+    0x036, 0x0004D53B,
-+    0x036, 0x0005553B,
-+    0x036, 0x0005D53B,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00005B8B,
-+    0x036, 0x0000DB8B,
-+    0x036, 0x00015B8B,
-+    0x036, 0x0001DB8B,
-+    0x036, 0x000262DB,
-+    0x036, 0x0002E2DB,
-+    0x036, 0x000362DB,
-+    0x036, 0x0003E2DB,
-+    0x036, 0x0004553B,
-+    0x036, 0x0004D53B,
-+    0x036, 0x0005553B,
-+    0x036, 0x0005D53B,
-+    0xA0000000,    0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x036, 0x00084EB4,
-+    0x036, 0x0008CC35,
-+    0x036, 0x00094C35,
-+    0x036, 0x0009CC35,
-+    0x036, 0x000A4C35,
-+    0x036, 0x000ACC35,
-+    0x036, 0x000B4C35,
-+    0x036, 0x000BCC35,
-+    0x036, 0x000C4C34,
-+    0x036, 0x000CCC35,
-+    0x036, 0x000D4C35,
-+    0x036, 0x000DCC35,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x00000008,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000002DC,
-+    0x03C, 0x00000524,
-+    0x03C, 0x00000902,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000002DC,
-+    0x03C, 0x00000524,
-+    0x03C, 0x00000902,
-+    0xA0000000,    0x00000000,
-+    0x03C, 0x000002A8,
-+    0x03C, 0x000005A2,
-+    0x03C, 0x00000880,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000002,
-+    0x0DF, 0x00000080,
-+    0x80000008,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EAC43,
-+    0x062, 0x00038F47,
-+    0x063, 0x00031157,
-+    0x064, 0x0001C4AC,
-+    0x065, 0x000931D1,
-+    0x90000008,    0x05000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EAC43,
-+    0x062, 0x00038F47,
-+    0x063, 0x00031157,
-+    0x064, 0x0001C4AC,
-+    0x065, 0x000931D2,
-+    0x90000002,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EAC43,
-+    0x062, 0x00038F47,
-+    0x063, 0x00031157,
-+    0x064, 0x0001C4AC,
-+    0x065, 0x000931D1,
-+    0xA0000000,    0x00000000,
-+    0x061, 0x000E5D53,
-+    0x062, 0x00038FCD,
-+    0x063, 0x000114EB,
-+    0x064, 0x000196AC,
-+    0x065, 0x000911D7,
-+    0xB0000000,    0x00000000,
-+    0x008, 0x00008400,
-+};
-+
-+RTW_DECL_TABLE_RF_RADIO(rtw8812a_rf_b, B);
-+
-+static const struct rtw_txpwr_lmt_cfg_pair rtw8812a_txpwr_lmt[] = {
-+    { 0, 0, 0, 0, 1, 36, },
-+    { 2, 0, 0, 0, 1, 32, },
-+    { 1, 0, 0, 0, 1, 32, },
-+    { 0, 0, 0, 0, 2, 36, },
-+    { 2, 0, 0, 0, 2, 32, },
-+    { 1, 0, 0, 0, 2, 32, },
-+    { 0, 0, 0, 0, 3, 36, },
-+    { 2, 0, 0, 0, 3, 32, },
-+    { 1, 0, 0, 0, 3, 32, },
-+    { 0, 0, 0, 0, 4, 36, },
-+    { 2, 0, 0, 0, 4, 32, },
-+    { 1, 0, 0, 0, 4, 32, },
-+    { 0, 0, 0, 0, 5, 36, },
-+    { 2, 0, 0, 0, 5, 32, },
-+    { 1, 0, 0, 0, 5, 32, },
-+    { 0, 0, 0, 0, 6, 36, },
-+    { 2, 0, 0, 0, 6, 32, },
-+    { 1, 0, 0, 0, 6, 32, },
-+    { 0, 0, 0, 0, 7, 36, },
-+    { 2, 0, 0, 0, 7, 32, },
-+    { 1, 0, 0, 0, 7, 32, },
-+    { 0, 0, 0, 0, 8, 36, },
-+    { 2, 0, 0, 0, 8, 32, },
-+    { 1, 0, 0, 0, 8, 32, },
-+    { 0, 0, 0, 0, 9, 36, },
-+    { 2, 0, 0, 0, 9, 32, },
-+    { 1, 0, 0, 0, 9, 32, },
-+    { 0, 0, 0, 0, 10, 36, },
-+    { 2, 0, 0, 0, 10, 32, },
-+    { 1, 0, 0, 0, 10, 32, },
-+    { 0, 0, 0, 0, 11, 36, },
-+    { 2, 0, 0, 0, 11, 32, },
-+    { 1, 0, 0, 0, 11, 32, },
-+    { 0, 0, 0, 0, 12, 63, },
-+    { 2, 0, 0, 0, 12, 32, },
-+    { 1, 0, 0, 0, 12, 32, },
-+    { 0, 0, 0, 0, 13, 63, },
-+    { 2, 0, 0, 0, 13, 32, },
-+    { 1, 0, 0, 0, 13, 32, },
-+    { 0, 0, 0, 0, 14, 63, },
-+    { 2, 0, 0, 0, 14, 63, },
-+    { 1, 0, 0, 0, 14, 32, },
-+    { 0, 0, 0, 1, 1, 34, },
-+    { 2, 0, 0, 1, 1, 32, },
-+    { 1, 0, 0, 1, 1, 32, },
-+    { 0, 0, 0, 1, 2, 36, },
-+    { 2, 0, 0, 1, 2, 32, },
-+    { 1, 0, 0, 1, 2, 32, },
-+    { 0, 0, 0, 1, 3, 36, },
-+    { 2, 0, 0, 1, 3, 32, },
-+    { 1, 0, 0, 1, 3, 32, },
-+    { 0, 0, 0, 1, 4, 36, },
-+    { 2, 0, 0, 1, 4, 32, },
-+    { 1, 0, 0, 1, 4, 32, },
-+    { 0, 0, 0, 1, 5, 36, },
-+    { 2, 0, 0, 1, 5, 32, },
-+    { 1, 0, 0, 1, 5, 32, },
-+    { 0, 0, 0, 1, 6, 36, },
-+    { 2, 0, 0, 1, 6, 32, },
-+    { 1, 0, 0, 1, 6, 32, },
-+    { 0, 0, 0, 1, 7, 36, },
-+    { 2, 0, 0, 1, 7, 32, },
-+    { 1, 0, 0, 1, 7, 32, },
-+    { 0, 0, 0, 1, 8, 36, },
-+    { 2, 0, 0, 1, 8, 32, },
-+    { 1, 0, 0, 1, 8, 32, },
-+    { 0, 0, 0, 1, 9, 36, },
-+    { 2, 0, 0, 1, 9, 32, },
-+    { 1, 0, 0, 1, 9, 32, },
-+    { 0, 0, 0, 1, 10, 36, },
-+    { 2, 0, 0, 1, 10, 32, },
-+    { 1, 0, 0, 1, 10, 32, },
-+    { 0, 0, 0, 1, 11, 32, },
-+    { 2, 0, 0, 1, 11, 32, },
-+    { 1, 0, 0, 1, 11, 32, },
-+    { 0, 0, 0, 1, 12, 63, },
-+    { 2, 0, 0, 1, 12, 32, },
-+    { 1, 0, 0, 1, 12, 32, },
-+    { 0, 0, 0, 1, 13, 63, },
-+    { 2, 0, 0, 1, 13, 32, },
-+    { 1, 0, 0, 1, 13, 32, },
-+    { 0, 0, 0, 1, 14, 63, },
-+    { 2, 0, 0, 1, 14, 63, },
-+    { 1, 0, 0, 1, 14, 63, },
-+    { 0, 0, 0, 2, 1, 34, },
-+    { 2, 0, 0, 2, 1, 32, },
-+    { 1, 0, 0, 2, 1, 32, },
-+    { 0, 0, 0, 2, 2, 36, },
-+    { 2, 0, 0, 2, 2, 32, },
-+    { 1, 0, 0, 2, 2, 32, },
-+    { 0, 0, 0, 2, 3, 36, },
-+    { 2, 0, 0, 2, 3, 32, },
-+    { 1, 0, 0, 2, 3, 32, },
-+    { 0, 0, 0, 2, 4, 36, },
-+    { 2, 0, 0, 2, 4, 32, },
-+    { 1, 0, 0, 2, 4, 32, },
-+    { 0, 0, 0, 2, 5, 36, },
-+    { 2, 0, 0, 2, 5, 32, },
-+    { 1, 0, 0, 2, 5, 32, },
-+    { 0, 0, 0, 2, 6, 36, },
-+    { 2, 0, 0, 2, 6, 32, },
-+    { 1, 0, 0, 2, 6, 32, },
-+    { 0, 0, 0, 2, 7, 36, },
-+    { 2, 0, 0, 2, 7, 32, },
-+    { 1, 0, 0, 2, 7, 32, },
-+    { 0, 0, 0, 2, 8, 36, },
-+    { 2, 0, 0, 2, 8, 32, },
-+    { 1, 0, 0, 2, 8, 32, },
-+    { 0, 0, 0, 2, 9, 36, },
-+    { 2, 0, 0, 2, 9, 32, },
-+    { 1, 0, 0, 2, 9, 32, },
-+    { 0, 0, 0, 2, 10, 36, },
-+    { 2, 0, 0, 2, 10, 32, },
-+    { 1, 0, 0, 2, 10, 32, },
-+    { 0, 0, 0, 2, 11, 32, },
-+    { 2, 0, 0, 2, 11, 32, },
-+    { 1, 0, 0, 2, 11, 32, },
-+    { 0, 0, 0, 2, 12, 63, },
-+    { 2, 0, 0, 2, 12, 32, },
-+    { 1, 0, 0, 2, 12, 32, },
-+    { 0, 0, 0, 2, 13, 63, },
-+    { 2, 0, 0, 2, 13, 32, },
-+    { 1, 0, 0, 2, 13, 32, },
-+    { 0, 0, 0, 2, 14, 63, },
-+    { 2, 0, 0, 2, 14, 63, },
-+    { 1, 0, 0, 2, 14, 63, },
-+    { 0, 0, 0, 3, 1, 32, },
-+    { 2, 0, 0, 3, 1, 32, },
-+    { 1, 0, 0, 3, 1, 32, },
-+    { 0, 0, 0, 3, 2, 34, },
-+    { 2, 0, 0, 3, 2, 32, },
-+    { 1, 0, 0, 3, 2, 32, },
-+    { 0, 0, 0, 3, 3, 34, },
-+    { 2, 0, 0, 3, 3, 32, },
-+    { 1, 0, 0, 3, 3, 32, },
-+    { 0, 0, 0, 3, 4, 34, },
-+    { 2, 0, 0, 3, 4, 32, },
-+    { 1, 0, 0, 3, 4, 32, },
-+    { 0, 0, 0, 3, 5, 34, },
-+    { 2, 0, 0, 3, 5, 32, },
-+    { 1, 0, 0, 3, 5, 32, },
-+    { 0, 0, 0, 3, 6, 34, },
-+    { 2, 0, 0, 3, 6, 32, },
-+    { 1, 0, 0, 3, 6, 32, },
-+    { 0, 0, 0, 3, 7, 34, },
-+    { 2, 0, 0, 3, 7, 32, },
-+    { 1, 0, 0, 3, 7, 32, },
-+    { 0, 0, 0, 3, 8, 34, },
-+    { 2, 0, 0, 3, 8, 32, },
-+    { 1, 0, 0, 3, 8, 32, },
-+    { 0, 0, 0, 3, 9, 34, },
-+    { 2, 0, 0, 3, 9, 32, },
-+    { 1, 0, 0, 3, 9, 32, },
-+    { 0, 0, 0, 3, 10, 34, },
-+    { 2, 0, 0, 3, 10, 32, },
-+    { 1, 0, 0, 3, 10, 32, },
-+    { 0, 0, 0, 3, 11, 30, },
-+    { 2, 0, 0, 3, 11, 32, },
-+    { 1, 0, 0, 3, 11, 32, },
-+    { 0, 0, 0, 3, 12, 63, },
-+    { 2, 0, 0, 3, 12, 32, },
-+    { 1, 0, 0, 3, 12, 32, },
-+    { 0, 0, 0, 3, 13, 63, },
-+    { 2, 0, 0, 3, 13, 32, },
-+    { 1, 0, 0, 3, 13, 32, },
-+    { 0, 0, 0, 3, 14, 63, },
-+    { 2, 0, 0, 3, 14, 63, },
-+    { 1, 0, 0, 3, 14, 63, },
-+    { 0, 0, 1, 2, 1, 63, },
-+    { 2, 0, 1, 2, 1, 63, },
-+    { 1, 0, 1, 2, 1, 63, },
-+    { 0, 0, 1, 2, 2, 63, },
-+    { 2, 0, 1, 2, 2, 63, },
-+    { 1, 0, 1, 2, 2, 63, },
-+    { 0, 0, 1, 2, 3, 32, },
-+    { 2, 0, 1, 2, 3, 32, },
-+    { 1, 0, 1, 2, 3, 32, },
-+    { 0, 0, 1, 2, 4, 36, },
-+    { 2, 0, 1, 2, 4, 32, },
-+    { 1, 0, 1, 2, 4, 32, },
-+    { 0, 0, 1, 2, 5, 36, },
-+    { 2, 0, 1, 2, 5, 32, },
-+    { 1, 0, 1, 2, 5, 32, },
-+    { 0, 0, 1, 2, 6, 36, },
-+    { 2, 0, 1, 2, 6, 32, },
-+    { 1, 0, 1, 2, 6, 32, },
-+    { 0, 0, 1, 2, 7, 36, },
-+    { 2, 0, 1, 2, 7, 32, },
-+    { 1, 0, 1, 2, 7, 32, },
-+    { 0, 0, 1, 2, 8, 36, },
-+    { 2, 0, 1, 2, 8, 32, },
-+    { 1, 0, 1, 2, 8, 32, },
-+    { 0, 0, 1, 2, 9, 36, },
-+    { 2, 0, 1, 2, 9, 32, },
-+    { 1, 0, 1, 2, 9, 32, },
-+    { 0, 0, 1, 2, 10, 36, },
-+    { 2, 0, 1, 2, 10, 32, },
-+    { 1, 0, 1, 2, 10, 32, },
-+    { 0, 0, 1, 2, 11, 32, },
-+    { 2, 0, 1, 2, 11, 32, },
-+    { 1, 0, 1, 2, 11, 32, },
-+    { 0, 0, 1, 2, 12, 63, },
-+    { 2, 0, 1, 2, 12, 32, },
-+    { 1, 0, 1, 2, 12, 32, },
-+    { 0, 0, 1, 2, 13, 63, },
-+    { 2, 0, 1, 2, 13, 32, },
-+    { 1, 0, 1, 2, 13, 32, },
-+    { 0, 0, 1, 2, 14, 63, },
-+    { 2, 0, 1, 2, 14, 63, },
-+    { 1, 0, 1, 2, 14, 63, },
-+    { 0, 0, 1, 3, 1, 63, },
-+    { 2, 0, 1, 3, 1, 63, },
-+    { 1, 0, 1, 3, 1, 63, },
-+    { 0, 0, 1, 3, 2, 63, },
-+    { 2, 0, 1, 3, 2, 63, },
-+    { 1, 0, 1, 3, 2, 63, },
-+    { 0, 0, 1, 3, 3, 30, },
-+    { 2, 0, 1, 3, 3, 30, },
-+    { 1, 0, 1, 3, 3, 30, },
-+    { 0, 0, 1, 3, 4, 34, },
-+    { 2, 0, 1, 3, 4, 30, },
-+    { 1, 0, 1, 3, 4, 30, },
-+    { 0, 0, 1, 3, 5, 34, },
-+    { 2, 0, 1, 3, 5, 30, },
-+    { 1, 0, 1, 3, 5, 30, },
-+    { 0, 0, 1, 3, 6, 34, },
-+    { 2, 0, 1, 3, 6, 30, },
-+    { 1, 0, 1, 3, 6, 30, },
-+    { 0, 0, 1, 3, 7, 34, },
-+    { 2, 0, 1, 3, 7, 30, },
-+    { 1, 0, 1, 3, 7, 30, },
-+    { 0, 0, 1, 3, 8, 34, },
-+    { 2, 0, 1, 3, 8, 30, },
-+    { 1, 0, 1, 3, 8, 30, },
-+    { 0, 0, 1, 3, 9, 34, },
-+    { 2, 0, 1, 3, 9, 30, },
-+    { 1, 0, 1, 3, 9, 30, },
-+    { 0, 0, 1, 3, 10, 34, },
-+    { 2, 0, 1, 3, 10, 30, },
-+    { 1, 0, 1, 3, 10, 30, },
-+    { 0, 0, 1, 3, 11, 30, },
-+    { 2, 0, 1, 3, 11, 30, },
-+    { 1, 0, 1, 3, 11, 30, },
-+    { 0, 0, 1, 3, 12, 63, },
-+    { 2, 0, 1, 3, 12, 32, },
-+    { 1, 0, 1, 3, 12, 32, },
-+    { 0, 0, 1, 3, 13, 63, },
-+    { 2, 0, 1, 3, 13, 32, },
-+    { 1, 0, 1, 3, 13, 32, },
-+    { 0, 0, 1, 3, 14, 63, },
-+    { 2, 0, 1, 3, 14, 63, },
-+    { 1, 0, 1, 3, 14, 63, },
-+    { 0, 1, 0, 1, 36, 30, },
-+    { 2, 1, 0, 1, 36, 32, },
-+    { 1, 1, 0, 1, 36, 32, },
-+    { 0, 1, 0, 1, 40, 30, },
-+    { 2, 1, 0, 1, 40, 32, },
-+    { 1, 1, 0, 1, 40, 32, },
-+    { 0, 1, 0, 1, 44, 30, },
-+    { 2, 1, 0, 1, 44, 32, },
-+    { 1, 1, 0, 1, 44, 32, },
-+    { 0, 1, 0, 1, 48, 30, },
-+    { 2, 1, 0, 1, 48, 32, },
-+    { 1, 1, 0, 1, 48, 32, },
-+    { 0, 1, 0, 1, 52, 36, },
-+    { 2, 1, 0, 1, 52, 32, },
-+    { 1, 1, 0, 1, 52, 32, },
-+    { 0, 1, 0, 1, 56, 34, },
-+    { 2, 1, 0, 1, 56, 32, },
-+    { 1, 1, 0, 1, 56, 32, },
-+    { 0, 1, 0, 1, 60, 32, },
-+    { 2, 1, 0, 1, 60, 32, },
-+    { 1, 1, 0, 1, 60, 32, },
-+    { 0, 1, 0, 1, 64, 28, },
-+    { 2, 1, 0, 1, 64, 32, },
-+    { 1, 1, 0, 1, 64, 32, },
-+    { 0, 1, 0, 1, 100, 30, },
-+    { 2, 1, 0, 1, 100, 32, },
-+    { 1, 1, 0, 1, 100, 32, },
-+    { 0, 1, 0, 1, 104, 30, },
-+    { 2, 1, 0, 1, 104, 32, },
-+    { 1, 1, 0, 1, 104, 32, },
-+    { 0, 1, 0, 1, 108, 32, },
-+    { 2, 1, 0, 1, 108, 32, },
-+    { 1, 1, 0, 1, 108, 32, },
-+    { 0, 1, 0, 1, 112, 34, },
-+    { 2, 1, 0, 1, 112, 32, },
-+    { 1, 1, 0, 1, 112, 32, },
-+    { 0, 1, 0, 1, 116, 34, },
-+    { 2, 1, 0, 1, 116, 32, },
-+    { 1, 1, 0, 1, 116, 32, },
-+    { 0, 1, 0, 1, 120, 36, },
-+    { 2, 1, 0, 1, 120, 32, },
-+    { 1, 1, 0, 1, 120, 32, },
-+    { 0, 1, 0, 1, 124, 34, },
-+    { 2, 1, 0, 1, 124, 32, },
-+    { 1, 1, 0, 1, 124, 32, },
-+    { 0, 1, 0, 1, 128, 32, },
-+    { 2, 1, 0, 1, 128, 32, },
-+    { 1, 1, 0, 1, 128, 32, },
-+    { 0, 1, 0, 1, 132, 30, },
-+    { 2, 1, 0, 1, 132, 32, },
-+    { 1, 1, 0, 1, 132, 32, },
-+    { 0, 1, 0, 1, 136, 30, },
-+    { 2, 1, 0, 1, 136, 32, },
-+    { 1, 1, 0, 1, 136, 32, },
-+    { 0, 1, 0, 1, 140, 28, },
-+    { 2, 1, 0, 1, 140, 32, },
-+    { 1, 1, 0, 1, 140, 32, },
-+    { 0, 1, 0, 1, 149, 36, },
-+    { 2, 1, 0, 1, 149, 32, },
-+    { 1, 1, 0, 1, 149, 63, },
-+    { 0, 1, 0, 1, 153, 36, },
-+    { 2, 1, 0, 1, 153, 32, },
-+    { 1, 1, 0, 1, 153, 63, },
-+    { 0, 1, 0, 1, 157, 36, },
-+    { 2, 1, 0, 1, 157, 32, },
-+    { 1, 1, 0, 1, 157, 63, },
-+    { 0, 1, 0, 1, 161, 36, },
-+    { 2, 1, 0, 1, 161, 32, },
-+    { 1, 1, 0, 1, 161, 63, },
-+    { 0, 1, 0, 1, 165, 36, },
-+    { 2, 1, 0, 1, 165, 32, },
-+    { 1, 1, 0, 1, 165, 63, },
-+    { 0, 1, 0, 2, 36, 30, },
-+    { 2, 1, 0, 2, 36, 32, },
-+    { 1, 1, 0, 2, 36, 32, },
-+    { 0, 1, 0, 2, 40, 30, },
-+    { 2, 1, 0, 2, 40, 32, },
-+    { 1, 1, 0, 2, 40, 32, },
-+    { 0, 1, 0, 2, 44, 30, },
-+    { 2, 1, 0, 2, 44, 32, },
-+    { 1, 1, 0, 2, 44, 32, },
-+    { 0, 1, 0, 2, 48, 30, },
-+    { 2, 1, 0, 2, 48, 32, },
-+    { 1, 1, 0, 2, 48, 32, },
-+    { 0, 1, 0, 2, 52, 36, },
-+    { 2, 1, 0, 2, 52, 32, },
-+    { 1, 1, 0, 2, 52, 32, },
-+    { 0, 1, 0, 2, 56, 34, },
-+    { 2, 1, 0, 2, 56, 32, },
-+    { 1, 1, 0, 2, 56, 32, },
-+    { 0, 1, 0, 2, 60, 32, },
-+    { 2, 1, 0, 2, 60, 32, },
-+    { 1, 1, 0, 2, 60, 32, },
-+    { 0, 1, 0, 2, 64, 28, },
-+    { 2, 1, 0, 2, 64, 32, },
-+    { 1, 1, 0, 2, 64, 32, },
-+    { 0, 1, 0, 2, 100, 30, },
-+    { 2, 1, 0, 2, 100, 32, },
-+    { 1, 1, 0, 2, 100, 32, },
-+    { 0, 1, 0, 2, 104, 30, },
-+    { 2, 1, 0, 2, 104, 32, },
-+    { 1, 1, 0, 2, 104, 32, },
-+    { 0, 1, 0, 2, 108, 32, },
-+    { 2, 1, 0, 2, 108, 32, },
-+    { 1, 1, 0, 2, 108, 32, },
-+    { 0, 1, 0, 2, 112, 34, },
-+    { 2, 1, 0, 2, 112, 32, },
-+    { 1, 1, 0, 2, 112, 32, },
-+    { 0, 1, 0, 2, 116, 34, },
-+    { 2, 1, 0, 2, 116, 32, },
-+    { 1, 1, 0, 2, 116, 32, },
-+    { 0, 1, 0, 2, 120, 36, },
-+    { 2, 1, 0, 2, 120, 32, },
-+    { 1, 1, 0, 2, 120, 32, },
-+    { 0, 1, 0, 2, 124, 34, },
-+    { 2, 1, 0, 2, 124, 32, },
-+    { 1, 1, 0, 2, 124, 32, },
-+    { 0, 1, 0, 2, 128, 32, },
-+    { 2, 1, 0, 2, 128, 32, },
-+    { 1, 1, 0, 2, 128, 32, },
-+    { 0, 1, 0, 2, 132, 30, },
-+    { 2, 1, 0, 2, 132, 32, },
-+    { 1, 1, 0, 2, 132, 32, },
-+    { 0, 1, 0, 2, 136, 30, },
-+    { 2, 1, 0, 2, 136, 32, },
-+    { 1, 1, 0, 2, 136, 32, },
-+    { 0, 1, 0, 2, 140, 28, },
-+    { 2, 1, 0, 2, 140, 32, },
-+    { 1, 1, 0, 2, 140, 32, },
-+    { 0, 1, 0, 2, 149, 36, },
-+    { 2, 1, 0, 2, 149, 32, },
-+    { 1, 1, 0, 2, 149, 63, },
-+    { 0, 1, 0, 2, 153, 36, },
-+    { 2, 1, 0, 2, 153, 32, },
-+    { 1, 1, 0, 2, 153, 63, },
-+    { 0, 1, 0, 2, 157, 36, },
-+    { 2, 1, 0, 2, 157, 32, },
-+    { 1, 1, 0, 2, 157, 63, },
-+    { 0, 1, 0, 2, 161, 36, },
-+    { 2, 1, 0, 2, 161, 32, },
-+    { 1, 1, 0, 2, 161, 63, },
-+    { 0, 1, 0, 2, 165, 36, },
-+    { 2, 1, 0, 2, 165, 32, },
-+    { 1, 1, 0, 2, 165, 63, },
-+    { 0, 1, 0, 3, 36, 28, },
-+    { 2, 1, 0, 3, 36, 30, },
-+    { 1, 1, 0, 3, 36, 30, },
-+    { 0, 1, 0, 3, 40, 28, },
-+    { 2, 1, 0, 3, 40, 30, },
-+    { 1, 1, 0, 3, 40, 30, },
-+    { 0, 1, 0, 3, 44, 28, },
-+    { 2, 1, 0, 3, 44, 30, },
-+    { 1, 1, 0, 3, 44, 30, },
-+    { 0, 1, 0, 3, 48, 28, },
-+    { 2, 1, 0, 3, 48, 30, },
-+    { 1, 1, 0, 3, 48, 30, },
-+    { 0, 1, 0, 3, 52, 34, },
-+    { 2, 1, 0, 3, 52, 30, },
-+    { 1, 1, 0, 3, 52, 30, },
-+    { 0, 1, 0, 3, 56, 32, },
-+    { 2, 1, 0, 3, 56, 30, },
-+    { 1, 1, 0, 3, 56, 30, },
-+    { 0, 1, 0, 3, 60, 30, },
-+    { 2, 1, 0, 3, 60, 30, },
-+    { 1, 1, 0, 3, 60, 30, },
-+    { 0, 1, 0, 3, 64, 26, },
-+    { 2, 1, 0, 3, 64, 30, },
-+    { 1, 1, 0, 3, 64, 30, },
-+    { 0, 1, 0, 3, 100, 28, },
-+    { 2, 1, 0, 3, 100, 30, },
-+    { 1, 1, 0, 3, 100, 30, },
-+    { 0, 1, 0, 3, 104, 28, },
-+    { 2, 1, 0, 3, 104, 30, },
-+    { 1, 1, 0, 3, 104, 30, },
-+    { 0, 1, 0, 3, 108, 30, },
-+    { 2, 1, 0, 3, 108, 30, },
-+    { 1, 1, 0, 3, 108, 30, },
-+    { 0, 1, 0, 3, 112, 32, },
-+    { 2, 1, 0, 3, 112, 30, },
-+    { 1, 1, 0, 3, 112, 30, },
-+    { 0, 1, 0, 3, 116, 32, },
-+    { 2, 1, 0, 3, 116, 30, },
-+    { 1, 1, 0, 3, 116, 30, },
-+    { 0, 1, 0, 3, 120, 34, },
-+    { 2, 1, 0, 3, 120, 30, },
-+    { 1, 1, 0, 3, 120, 30, },
-+    { 0, 1, 0, 3, 124, 32, },
-+    { 2, 1, 0, 3, 124, 30, },
-+    { 1, 1, 0, 3, 124, 30, },
-+    { 0, 1, 0, 3, 128, 30, },
-+    { 2, 1, 0, 3, 128, 30, },
-+    { 1, 1, 0, 3, 128, 30, },
-+    { 0, 1, 0, 3, 132, 28, },
-+    { 2, 1, 0, 3, 132, 30, },
-+    { 1, 1, 0, 3, 132, 30, },
-+    { 0, 1, 0, 3, 136, 28, },
-+    { 2, 1, 0, 3, 136, 30, },
-+    { 1, 1, 0, 3, 136, 30, },
-+    { 0, 1, 0, 3, 140, 26, },
-+    { 2, 1, 0, 3, 140, 30, },
-+    { 1, 1, 0, 3, 140, 30, },
-+    { 0, 1, 0, 3, 149, 34, },
-+    { 2, 1, 0, 3, 149, 30, },
-+    { 1, 1, 0, 3, 149, 63, },
-+    { 0, 1, 0, 3, 153, 34, },
-+    { 2, 1, 0, 3, 153, 30, },
-+    { 1, 1, 0, 3, 153, 63, },
-+    { 0, 1, 0, 3, 157, 34, },
-+    { 2, 1, 0, 3, 157, 30, },
-+    { 1, 1, 0, 3, 157, 63, },
-+    { 0, 1, 0, 3, 161, 34, },
-+    { 2, 1, 0, 3, 161, 30, },
-+    { 1, 1, 0, 3, 161, 63, },
-+    { 0, 1, 0, 3, 165, 34, },
-+    { 2, 1, 0, 3, 165, 30, },
-+    { 1, 1, 0, 3, 165, 63, },
-+    { 0, 1, 1, 2, 38, 30, },
-+    { 2, 1, 1, 2, 38, 32, },
-+    { 1, 1, 1, 2, 38, 32, },
-+    { 0, 1, 1, 2, 46, 30, },
-+    { 2, 1, 1, 2, 46, 32, },
-+    { 1, 1, 1, 2, 46, 32, },
-+    { 0, 1, 1, 2, 54, 32, },
-+    { 2, 1, 1, 2, 54, 32, },
-+    { 1, 1, 1, 2, 54, 32, },
-+    { 0, 1, 1, 2, 62, 32, },
-+    { 2, 1, 1, 2, 62, 32, },
-+    { 1, 1, 1, 2, 62, 32, },
-+    { 0, 1, 1, 2, 102, 28, },
-+    { 2, 1, 1, 2, 102, 32, },
-+    { 1, 1, 1, 2, 102, 32, },
-+    { 0, 1, 1, 2, 110, 32, },
-+    { 2, 1, 1, 2, 110, 32, },
-+    { 1, 1, 1, 2, 110, 32, },
-+    { 0, 1, 1, 2, 118, 36, },
-+    { 2, 1, 1, 2, 118, 32, },
-+    { 1, 1, 1, 2, 118, 32, },
-+    { 0, 1, 1, 2, 126, 34, },
-+    { 2, 1, 1, 2, 126, 32, },
-+    { 1, 1, 1, 2, 126, 32, },
-+    { 0, 1, 1, 2, 134, 32, },
-+    { 2, 1, 1, 2, 134, 32, },
-+    { 1, 1, 1, 2, 134, 32, },
-+    { 0, 1, 1, 2, 151, 36, },
-+    { 2, 1, 1, 2, 151, 32, },
-+    { 1, 1, 1, 2, 151, 63, },
-+    { 0, 1, 1, 2, 159, 36, },
-+    { 2, 1, 1, 2, 159, 32, },
-+    { 1, 1, 1, 2, 159, 63, },
-+    { 0, 1, 1, 3, 38, 28, },
-+    { 2, 1, 1, 3, 38, 30, },
-+    { 1, 1, 1, 3, 38, 30, },
-+    { 0, 1, 1, 3, 46, 28, },
-+    { 2, 1, 1, 3, 46, 30, },
-+    { 1, 1, 1, 3, 46, 30, },
-+    { 0, 1, 1, 3, 54, 30, },
-+    { 2, 1, 1, 3, 54, 30, },
-+    { 1, 1, 1, 3, 54, 30, },
-+    { 0, 1, 1, 3, 62, 30, },
-+    { 2, 1, 1, 3, 62, 30, },
-+    { 1, 1, 1, 3, 62, 30, },
-+    { 0, 1, 1, 3, 102, 26, },
-+    { 2, 1, 1, 3, 102, 30, },
-+    { 1, 1, 1, 3, 102, 30, },
-+    { 0, 1, 1, 3, 110, 30, },
-+    { 2, 1, 1, 3, 110, 30, },
-+    { 1, 1, 1, 3, 110, 30, },
-+    { 0, 1, 1, 3, 118, 34, },
-+    { 2, 1, 1, 3, 118, 30, },
-+    { 1, 1, 1, 3, 118, 30, },
-+    { 0, 1, 1, 3, 126, 32, },
-+    { 2, 1, 1, 3, 126, 30, },
-+    { 1, 1, 1, 3, 126, 30, },
-+    { 0, 1, 1, 3, 134, 30, },
-+    { 2, 1, 1, 3, 134, 30, },
-+    { 1, 1, 1, 3, 134, 30, },
-+    { 0, 1, 1, 3, 151, 34, },
-+    { 2, 1, 1, 3, 151, 30, },
-+    { 1, 1, 1, 3, 151, 63, },
-+    { 0, 1, 1, 3, 159, 34, },
-+    { 2, 1, 1, 3, 159, 30, },
-+    { 1, 1, 1, 3, 159, 63, },
-+    { 0, 1, 2, 4, 42, 30, },
-+    { 2, 1, 2, 4, 42, 32, },
-+    { 1, 1, 2, 4, 42, 32, },
-+    { 0, 1, 2, 4, 58, 28, },
-+    { 2, 1, 2, 4, 58, 32, },
-+    { 1, 1, 2, 4, 58, 32, },
-+    { 0, 1, 2, 4, 106, 30, },
-+    { 2, 1, 2, 4, 106, 32, },
-+    { 1, 1, 2, 4, 106, 32, },
-+    { 0, 1, 2, 4, 122, 34, },
-+    { 2, 1, 2, 4, 122, 32, },
-+    { 1, 1, 2, 4, 122, 32, },
-+    { 0, 1, 2, 4, 155, 36, },
-+    { 2, 1, 2, 4, 155, 32, },
-+    { 1, 1, 2, 4, 155, 63, },
-+    { 0, 1, 2, 5, 42, 28, },
-+    { 2, 1, 2, 5, 42, 30, },
-+    { 1, 1, 2, 5, 42, 30, },
-+    { 0, 1, 2, 5, 58, 26, },
-+    { 2, 1, 2, 5, 58, 30, },
-+    { 1, 1, 2, 5, 58, 30, },
-+    { 0, 1, 2, 5, 106, 28, },
-+    { 2, 1, 2, 5, 106, 30, },
-+    { 1, 1, 2, 5, 106, 30, },
-+    { 0, 1, 2, 5, 122, 32, },
-+    { 2, 1, 2, 5, 122, 30, },
-+    { 1, 1, 2, 5, 122, 30, },
-+    { 0, 1, 2, 5, 155, 34, },
-+    { 2, 1, 2, 5, 155, 30, },
-+    { 1, 1, 2, 5, 155, 63, },
-+};
-+
-+RTW_DECL_TABLE_TXPWR_LMT(rtw8812a_txpwr_lmt);
-+
-+static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8812a[] = {
-+    {0x0012,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0014,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x80, 0},
-+    {0x0015,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x01, 0},
-+    {0x0023,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x10, 0},
-+    {0x0046,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x00},
-+    {0x0043,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x00},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(2), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3), 0},
-+    {0x0003,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
-+    {0x0301,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0},
-+    {0x0024,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x0028,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8812a[] = {
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(2), 0},
-+    {0x0006,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(7), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(0), 0},
-+    {0x0024,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0028,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3), 0},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_act_to_lps_8812a[] = {
-+    {0x0301,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
-+    {0x0522,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x7F},
-+    {0x05F8,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05F9,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05FA,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05FB,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x0c00,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x04},
-+    {0x0e00,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x04},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0100,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x03},
-+    {0x0101,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0553,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8812a[] = {
-+    {0x0c00,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x04},
-+    {0x0e00,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x04},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0007,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x2A},
-+    {0x0008,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x02, 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(1), 0},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8812a[] = {
-+    {0x0003,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(2), 0},
-+    {0x0080,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x05},
-+    {0x0042,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xF0, 0xcc},
-+    {0x0042,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xF0, 0xEC},
-+    {0x0043,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x07},
-+    {0x0045,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x00},
-+    {0x0046,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0xff},
-+    {0x0047,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0},
-+    {0x0014,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x80, BIT(7)},
-+    {0x0015,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x01, BIT(0)},
-+    {0x0012,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x01, 0},
-+    {0x0023,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x10, BIT(4)},
-+    {0x0008,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0x02, 0},
-+    {0x0007,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x20},
-+    {0x001f,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0076,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+const struct rtw_pwr_seq_cmd * const card_enable_flow_8812a[] = {
-+    trans_carddis_to_cardemu_8812a,
-+    trans_cardemu_to_act_8812a,
-+    NULL
-+};
-+
-+const struct rtw_pwr_seq_cmd * const enter_lps_flow_8812a[] = {
-+    trans_act_to_lps_8812a,
-+    NULL
-+};
-+
-+const struct rtw_pwr_seq_cmd * const card_disable_flow_8812a[] = {
-+    trans_act_to_cardemu_8812a,
-+    trans_cardemu_to_carddis_8812a,
-+    NULL
-+};
-+
-+static const u8 rtw8812a_pwrtrk_5gb_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 14, 14, 14, 14, 14},
-+    {0, 1, 1, 2, 2, 3, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 14, 14, 14, 14, 14},
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13,
-+     13, 14, 14, 15, 16, 16, 16, 16, 16},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_5gb_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_5ga_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 15, 15, 15, 15, 15},
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 15, 15, 15, 15, 15},
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 15, 15, 15, 15, 15},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_5ga_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 11, 11, 12, 12, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2gb_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6,
-+    7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2gb_p[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2ga_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2ga_p[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2g_cck_b_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6,
-+    7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2g_cck_b_p[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2g_cck_a_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10
-+};
-+
-+static const u8 rtw8812a_pwrtrk_2g_cck_a_p[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
-+};
-+
-+const struct rtw_pwr_track_tbl rtw8812a_rtw_pwr_track_tbl = {
-+    .pwrtrk_5gb_n[0] = rtw8812a_pwrtrk_5gb_n[0],
-+    .pwrtrk_5gb_n[1] = rtw8812a_pwrtrk_5gb_n[1],
-+    .pwrtrk_5gb_n[2] = rtw8812a_pwrtrk_5gb_n[2],
-+    .pwrtrk_5gb_p[0] = rtw8812a_pwrtrk_5gb_p[0],
-+    .pwrtrk_5gb_p[1] = rtw8812a_pwrtrk_5gb_p[1],
-+    .pwrtrk_5gb_p[2] = rtw8812a_pwrtrk_5gb_p[2],
-+    .pwrtrk_5ga_n[0] = rtw8812a_pwrtrk_5ga_n[0],
-+    .pwrtrk_5ga_n[1] = rtw8812a_pwrtrk_5ga_n[1],
-+    .pwrtrk_5ga_n[2] = rtw8812a_pwrtrk_5ga_n[2],
-+    .pwrtrk_5ga_p[0] = rtw8812a_pwrtrk_5ga_p[0],
-+    .pwrtrk_5ga_p[1] = rtw8812a_pwrtrk_5ga_p[1],
-+    .pwrtrk_5ga_p[2] = rtw8812a_pwrtrk_5ga_p[2],
-+    .pwrtrk_2gb_n = rtw8812a_pwrtrk_2gb_n,
-+    .pwrtrk_2gb_p = rtw8812a_pwrtrk_2gb_p,
-+    .pwrtrk_2ga_n = rtw8812a_pwrtrk_2ga_n,
-+    .pwrtrk_2ga_p = rtw8812a_pwrtrk_2ga_p,
-+    .pwrtrk_2g_cckb_n = rtw8812a_pwrtrk_2g_cck_b_n,
-+    .pwrtrk_2g_cckb_p = rtw8812a_pwrtrk_2g_cck_b_p,
-+    .pwrtrk_2g_ccka_n = rtw8812a_pwrtrk_2g_cck_a_n,
-+    .pwrtrk_2g_ccka_p = rtw8812a_pwrtrk_2g_cck_a_p,
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_5gb_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13,
-+     13, 14, 15, 16, 16, 17, 17, 18, 18},
-+    {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11,
-+     12, 14, 13, 13, 14, 14, 14, 15, 15},
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 14, 15, 15, 16, 16},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_5gb_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_5ga_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12,
-+     13, 14, 15, 16, 16, 17, 17, 18, 18},
-+    {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12,
-+     12, 13, 13, 14, 15, 16, 16, 17, 17},
-+    {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13,
-+     13, 14, 14, 15, 15, 16, 17, 18, 18},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_5ga_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+    {0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 11, 11, 11, 11,
-+     11, 11, 11, 11, 11, 11, 11, 11, 11},
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2gb_n[] = {
-+    0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7,
-+    7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2gb_p[] = {
-+    0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2ga_n[] = {
-+    0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9,
-+    10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2ga_p[] = {
-+    0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2g_cck_b_n[] = {
-+    0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7,
-+    7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2g_cck_b_p[] = {
-+    0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2g_cck_a_n[] = {
-+    0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9,
-+    10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15
-+};
-+
-+static const u8 rtw8812a_pwrtrk_rfe3_2g_cck_a_p[] = {
-+    0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
-+};
-+
-+const struct rtw_pwr_track_tbl rtw8812a_rtw_pwr_track_rfe3_tbl = {
-+    .pwrtrk_5gb_n[0] = rtw8812a_pwrtrk_rfe3_5gb_n[0],
-+    .pwrtrk_5gb_n[1] = rtw8812a_pwrtrk_rfe3_5gb_n[1],
-+    .pwrtrk_5gb_n[2] = rtw8812a_pwrtrk_rfe3_5gb_n[2],
-+    .pwrtrk_5gb_p[0] = rtw8812a_pwrtrk_rfe3_5gb_p[0],
-+    .pwrtrk_5gb_p[1] = rtw8812a_pwrtrk_rfe3_5gb_p[1],
-+    .pwrtrk_5gb_p[2] = rtw8812a_pwrtrk_rfe3_5gb_p[2],
-+    .pwrtrk_5ga_n[0] = rtw8812a_pwrtrk_rfe3_5ga_n[0],
-+    .pwrtrk_5ga_n[1] = rtw8812a_pwrtrk_rfe3_5ga_n[1],
-+    .pwrtrk_5ga_n[2] = rtw8812a_pwrtrk_rfe3_5ga_n[2],
-+    .pwrtrk_5ga_p[0] = rtw8812a_pwrtrk_rfe3_5ga_p[0],
-+    .pwrtrk_5ga_p[1] = rtw8812a_pwrtrk_rfe3_5ga_p[1],
-+    .pwrtrk_5ga_p[2] = rtw8812a_pwrtrk_rfe3_5ga_p[2],
-+    .pwrtrk_2gb_n = rtw8812a_pwrtrk_rfe3_2gb_n,
-+    .pwrtrk_2gb_p = rtw8812a_pwrtrk_rfe3_2gb_p,
-+    .pwrtrk_2ga_n = rtw8812a_pwrtrk_rfe3_2ga_n,
-+    .pwrtrk_2ga_p = rtw8812a_pwrtrk_rfe3_2ga_p,
-+    .pwrtrk_2g_cckb_n = rtw8812a_pwrtrk_rfe3_2g_cck_b_n,
-+    .pwrtrk_2g_cckb_p = rtw8812a_pwrtrk_rfe3_2g_cck_b_p,
-+    .pwrtrk_2g_ccka_n = rtw8812a_pwrtrk_rfe3_2g_cck_a_n,
-+    .pwrtrk_2g_ccka_p = rtw8812a_pwrtrk_rfe3_2g_cck_a_p,
-+};
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a_table.h
-@@ -0,0 +1,26 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#ifndef __RTW8812A_TABLE_H__
-+#define __RTW8812A_TABLE_H__
-+
-+extern const struct rtw_table rtw8812a_mac_tbl;
-+extern const struct rtw_table rtw8812a_agc_tbl;
-+extern const struct rtw_table rtw8812a_agc_diff_lb_tbl;
-+extern const struct rtw_table rtw8812a_agc_diff_hb_tbl;
-+extern const struct rtw_table rtw8812a_bb_tbl;
-+extern const struct rtw_table rtw8812a_bb_pg_tbl;
-+extern const struct rtw_table rtw8812a_bb_pg_rfe3_tbl;
-+extern const struct rtw_table rtw8812a_rf_a_tbl;
-+extern const struct rtw_table rtw8812a_rf_b_tbl;
-+extern const struct rtw_table rtw8812a_txpwr_lmt_tbl;
-+
-+extern const struct rtw_pwr_seq_cmd * const card_enable_flow_8812a[];
-+extern const struct rtw_pwr_seq_cmd * const enter_lps_flow_8812a[];
-+extern const struct rtw_pwr_seq_cmd * const card_disable_flow_8812a[];
-+
-+extern const struct rtw_pwr_track_tbl rtw8812a_rtw_pwr_track_tbl;
-+extern const struct rtw_pwr_track_tbl rtw8812a_rtw_pwr_track_rfe3_tbl;
-+
-+#endif
diff --git 
a/package/kernel/mac80211/patches/rtl/040-v6.13-wifi-rtw88-Add-rtw8821a_table.-c-h.patch 
b/package/kernel/mac80211/patches/rtl/040-v6.13-wifi-rtw88-Add-rtw8821a_table.-c-h.patch
deleted file mode 100644
index e8ceaba61ea06e..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/040-v6.13-wifi-rtw88-Add-rtw8821a_table.-c-h.patch
+++ /dev/null
@@ -1,2395 +0,0 @@
-From 4b81da5cd2b4c7231272216639bacecc818d8b51 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:25:16 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw8821a_table.{c,h}
-
-These contain various arrays for initialising RTL8821AU. Also TX power
-limits.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/087c7260-fcc3-4e22-886b-ac477cad9198@gmail.com
----
- .../wireless/realtek/rtw88/rtw8821a_table.c   | 2350 +++++++++++++++++
- .../wireless/realtek/rtw88/rtw8821a_table.h   |   21 +
- 2 files changed, 2371 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821a_table.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821a_table.h
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a_table.c
-@@ -0,0 +1,2350 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include "main.h"
-+#include "phy.h"
-+#include "rtw8821a_table.h"
-+
-+static const u32 rtw8821a_mac[] = {
-+    0x421, 0x0000000F,
-+    0x428, 0x0000000A,
-+    0x429, 0x00000010,
-+    0x430, 0x00000000,
-+    0x431, 0x00000000,
-+    0x432, 0x00000000,
-+    0x433, 0x00000001,
-+    0x434, 0x00000004,
-+    0x435, 0x00000005,
-+    0x436, 0x00000007,
-+    0x437, 0x00000008,
-+    0x43C, 0x00000004,
-+    0x43D, 0x00000005,
-+    0x43E, 0x00000007,
-+    0x43F, 0x00000008,
-+    0x440, 0x0000005D,
-+    0x441, 0x00000001,
-+    0x442, 0x00000000,
-+    0x444, 0x00000010,
-+    0x445, 0x00000000,
-+    0x446, 0x00000000,
-+    0x447, 0x00000000,
-+    0x448, 0x00000000,
-+    0x449, 0x000000F0,
-+    0x44A, 0x0000000F,
-+    0x44B, 0x0000003E,
-+    0x44C, 0x00000010,
-+    0x44D, 0x00000000,
-+    0x44E, 0x00000000,
-+    0x44F, 0x00000000,
-+    0x450, 0x00000000,
-+    0x451, 0x000000F0,
-+    0x452, 0x0000000F,
-+    0x453, 0x00000000,
-+    0x456, 0x0000005E,
-+    0x460, 0x00000066,
-+    0x461, 0x00000066,
-+    0x4C8, 0x0000003F,
-+    0x4C9, 0x000000FF,
-+    0x4CC, 0x000000FF,
-+    0x4CD, 0x000000FF,
-+    0x4CE, 0x00000001,
-+    0x500, 0x00000026,
-+    0x501, 0x000000A2,
-+    0x502, 0x0000002F,
-+    0x503, 0x00000000,
-+    0x504, 0x00000028,
-+    0x505, 0x000000A3,
-+    0x506, 0x0000005E,
-+    0x507, 0x00000000,
-+    0x508, 0x0000002B,
-+    0x509, 0x000000A4,
-+    0x50A, 0x0000005E,
-+    0x50B, 0x00000000,
-+    0x50C, 0x0000004F,
-+    0x50D, 0x000000A4,
-+    0x50E, 0x00000000,
-+    0x50F, 0x00000000,
-+    0x512, 0x0000001C,
-+    0x514, 0x0000000A,
-+    0x516, 0x0000000A,
-+    0x525, 0x0000004F,
-+    0x550, 0x00000010,
-+    0x551, 0x00000010,
-+    0x559, 0x00000002,
-+    0x55C, 0x00000050,
-+    0x55D, 0x000000FF,
-+    0x605, 0x00000030,
-+    0x607, 0x00000007,
-+    0x608, 0x0000000E,
-+    0x609, 0x0000002A,
-+    0x620, 0x000000FF,
-+    0x621, 0x000000FF,
-+    0x622, 0x000000FF,
-+    0x623, 0x000000FF,
-+    0x624, 0x000000FF,
-+    0x625, 0x000000FF,
-+    0x626, 0x000000FF,
-+    0x627, 0x000000FF,
-+    0x638, 0x00000050,
-+    0x63C, 0x0000000A,
-+    0x63D, 0x0000000A,
-+    0x63E, 0x0000000E,
-+    0x63F, 0x0000000E,
-+    0x640, 0x00000040,
-+    0x642, 0x00000040,
-+    0x643, 0x00000000,
-+    0x652, 0x000000C8,
-+    0x66E, 0x00000005,
-+    0x700, 0x00000021,
-+    0x701, 0x00000043,
-+    0x702, 0x00000065,
-+    0x703, 0x00000087,
-+    0x708, 0x00000021,
-+    0x709, 0x00000043,
-+    0x70A, 0x00000065,
-+    0x70B, 0x00000087,
-+    0x718, 0x00000040,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8821a_mac, rtw_phy_cfg_mac);
-+
-+static const u32 rtw8821a_agc[] = {
-+    0x81C, 0xBF000001,
-+    0x81C, 0xBF020001,
-+    0x81C, 0xBF040001,
-+    0x81C, 0xBF060001,
-+    0x81C, 0xBE080001,
-+    0x81C, 0xBD0A0001,
-+    0x81C, 0xBC0C0001,
-+    0x81C, 0xBA0E0001,
-+    0x81C, 0xB9100001,
-+    0x81C, 0xB8120001,
-+    0x81C, 0xB7140001,
-+    0x81C, 0xB6160001,
-+    0x81C, 0xB5180001,
-+    0x81C, 0xB41A0001,
-+    0x81C, 0xB31C0001,
-+    0x81C, 0xB21E0001,
-+    0x81C, 0xB1200001,
-+    0x81C, 0xB0220001,
-+    0x81C, 0xAF240001,
-+    0x81C, 0xAE260001,
-+    0x81C, 0xAD280001,
-+    0x81C, 0xAC2A0001,
-+    0x81C, 0xAB2C0001,
-+    0x81C, 0xAA2E0001,
-+    0x81C, 0xA9300001,
-+    0x81C, 0xA8320001,
-+    0x81C, 0xA7340001,
-+    0x81C, 0xA6360001,
-+    0x81C, 0xA5380001,
-+    0x81C, 0xA43A0001,
-+    0x81C, 0x683C0001,
-+    0x81C, 0x673E0001,
-+    0x81C, 0x66400001,
-+    0x81C, 0x65420001,
-+    0x81C, 0x64440001,
-+    0x81C, 0x63460001,
-+    0x81C, 0x62480001,
-+    0x81C, 0x614A0001,
-+    0x81C, 0x474C0001,
-+    0x81C, 0x464E0001,
-+    0x81C, 0x45500001,
-+    0x81C, 0x44520001,
-+    0x81C, 0x43540001,
-+    0x81C, 0x42560001,
-+    0x81C, 0x41580001,
-+    0x81C, 0x285A0001,
-+    0x81C, 0x275C0001,
-+    0x81C, 0x265E0001,
-+    0x81C, 0x25600001,
-+    0x81C, 0x24620001,
-+    0x81C, 0x0A640001,
-+    0x81C, 0x09660001,
-+    0x81C, 0x08680001,
-+    0x81C, 0x076A0001,
-+    0x81C, 0x066C0001,
-+    0x81C, 0x056E0001,
-+    0x81C, 0x04700001,
-+    0x81C, 0x03720001,
-+    0x81C, 0x02740001,
-+    0x81C, 0x01760001,
-+    0x81C, 0x01780001,
-+    0x81C, 0x017A0001,
-+    0x81C, 0x017C0001,
-+    0x81C, 0x017E0001,
-+    0x8000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0xFB000101,
-+    0x81C, 0xFA020101,
-+    0x81C, 0xF9040101,
-+    0x81C, 0xF8060101,
-+    0x81C, 0xF7080101,
-+    0x81C, 0xF60A0101,
-+    0x81C, 0xF50C0101,
-+    0x81C, 0xF40E0101,
-+    0x81C, 0xF3100101,
-+    0x81C, 0xF2120101,
-+    0x81C, 0xF1140101,
-+    0x81C, 0xF0160101,
-+    0x81C, 0xEF180101,
-+    0x81C, 0xEE1A0101,
-+    0x81C, 0xED1C0101,
-+    0x81C, 0xEC1E0101,
-+    0x81C, 0xEB200101,
-+    0x81C, 0xEA220101,
-+    0x81C, 0xE9240101,
-+    0x81C, 0xE8260101,
-+    0x81C, 0xE7280101,
-+    0x81C, 0xE62A0101,
-+    0x81C, 0xE52C0101,
-+    0x81C, 0xE42E0101,
-+    0x81C, 0xE3300101,
-+    0x81C, 0xA5320101,
-+    0x81C, 0xA4340101,
-+    0x81C, 0xA3360101,
-+    0x81C, 0x87380101,
-+    0x81C, 0x863A0101,
-+    0x81C, 0x853C0101,
-+    0x81C, 0x843E0101,
-+    0x81C, 0x69400101,
-+    0x81C, 0x68420101,
-+    0x81C, 0x67440101,
-+    0x81C, 0x66460101,
-+    0x81C, 0x49480101,
-+    0x81C, 0x484A0101,
-+    0x81C, 0x474C0101,
-+    0x81C, 0x2A4E0101,
-+    0x81C, 0x29500101,
-+    0x81C, 0x28520101,
-+    0x81C, 0x27540101,
-+    0x81C, 0x26560101,
-+    0x81C, 0x25580101,
-+    0x81C, 0x245A0101,
-+    0x81C, 0x235C0101,
-+    0x81C, 0x055E0101,
-+    0x81C, 0x04600101,
-+    0x81C, 0x03620101,
-+    0x81C, 0x02640101,
-+    0x81C, 0x01660101,
-+    0x81C, 0x01680101,
-+    0x81C, 0x016A0101,
-+    0x81C, 0x016C0101,
-+    0x81C, 0x016E0101,
-+    0x81C, 0x01700101,
-+    0x81C, 0x01720101,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x81C, 0xFB000101,
-+    0x81C, 0xFA020101,
-+    0x81C, 0xF9040101,
-+    0x81C, 0xF8060101,
-+    0x81C, 0xF7080101,
-+    0x81C, 0xF60A0101,
-+    0x81C, 0xF50C0101,
-+    0x81C, 0xF40E0101,
-+    0x81C, 0xF3100101,
-+    0x81C, 0xF2120101,
-+    0x81C, 0xF1140101,
-+    0x81C, 0xF0160101,
-+    0x81C, 0xEF180101,
-+    0x81C, 0xEE1A0101,
-+    0x81C, 0xED1C0101,
-+    0x81C, 0xEC1E0101,
-+    0x81C, 0xEB200101,
-+    0x81C, 0xEA220101,
-+    0x81C, 0xE9240101,
-+    0x81C, 0xE8260101,
-+    0x81C, 0xE7280101,
-+    0x81C, 0xE62A0101,
-+    0x81C, 0xE52C0101,
-+    0x81C, 0xE42E0101,
-+    0x81C, 0xE3300101,
-+    0x81C, 0xA5320101,
-+    0x81C, 0xA4340101,
-+    0x81C, 0xA3360101,
-+    0x81C, 0x87380101,
-+    0x81C, 0x863A0101,
-+    0x81C, 0x853C0101,
-+    0x81C, 0x843E0101,
-+    0x81C, 0x69400101,
-+    0x81C, 0x68420101,
-+    0x81C, 0x67440101,
-+    0x81C, 0x66460101,
-+    0x81C, 0x49480101,
-+    0x81C, 0x484A0101,
-+    0x81C, 0x474C0101,
-+    0x81C, 0x2A4E0101,
-+    0x81C, 0x29500101,
-+    0x81C, 0x28520101,
-+    0x81C, 0x27540101,
-+    0x81C, 0x26560101,
-+    0x81C, 0x25580101,
-+    0x81C, 0x245A0101,
-+    0x81C, 0x235C0101,
-+    0x81C, 0x055E0101,
-+    0x81C, 0x04600101,
-+    0x81C, 0x03620101,
-+    0x81C, 0x02640101,
-+    0x81C, 0x01660101,
-+    0x81C, 0x01680101,
-+    0x81C, 0x016A0101,
-+    0x81C, 0x016C0101,
-+    0x81C, 0x016E0101,
-+    0x81C, 0x01700101,
-+    0x81C, 0x01720101,
-+    0xA0000000,    0x00000000,
-+    0x81C, 0xFF000101,
-+    0x81C, 0xFF020101,
-+    0x81C, 0xFE040101,
-+    0x81C, 0xFD060101,
-+    0x81C, 0xFC080101,
-+    0x81C, 0xFD0A0101,
-+    0x81C, 0xFC0C0101,
-+    0x81C, 0xFB0E0101,
-+    0x81C, 0xFA100101,
-+    0x81C, 0xF9120101,
-+    0x81C, 0xF8140101,
-+    0x81C, 0xF7160101,
-+    0x81C, 0xF6180101,
-+    0x81C, 0xF51A0101,
-+    0x81C, 0xF41C0101,
-+    0x81C, 0xF31E0101,
-+    0x81C, 0xF2200101,
-+    0x81C, 0xF1220101,
-+    0x81C, 0xF0240101,
-+    0x81C, 0xEF260101,
-+    0x81C, 0xEE280101,
-+    0x81C, 0xED2A0101,
-+    0x81C, 0xEC2C0101,
-+    0x81C, 0xEB2E0101,
-+    0x81C, 0xEA300101,
-+    0x81C, 0xE9320101,
-+    0x81C, 0xE8340101,
-+    0x81C, 0xE7360101,
-+    0x81C, 0xE6380101,
-+    0x81C, 0xE53A0101,
-+    0x81C, 0xE43C0101,
-+    0x81C, 0xE33E0101,
-+    0x81C, 0xA5400101,
-+    0x81C, 0xA4420101,
-+    0x81C, 0xA3440101,
-+    0x81C, 0x87460101,
-+    0x81C, 0x86480101,
-+    0x81C, 0x854A0101,
-+    0x81C, 0x844C0101,
-+    0x81C, 0x694E0101,
-+    0x81C, 0x68500101,
-+    0x81C, 0x67520101,
-+    0x81C, 0x66540101,
-+    0x81C, 0x49560101,
-+    0x81C, 0x48580101,
-+    0x81C, 0x475A0101,
-+    0x81C, 0x2A5C0101,
-+    0x81C, 0x295E0101,
-+    0x81C, 0x28600101,
-+    0x81C, 0x27620101,
-+    0x81C, 0x26640101,
-+    0x81C, 0x25660101,
-+    0x81C, 0x24680101,
-+    0x81C, 0x236A0101,
-+    0x81C, 0x056C0101,
-+    0x81C, 0x046E0101,
-+    0x81C, 0x03700101,
-+    0x81C, 0x02720101,
-+    0xB0000000,    0x00000000,
-+    0x81C, 0x01740101,
-+    0x81C, 0x01760101,
-+    0x81C, 0x01780101,
-+    0x81C, 0x017A0101,
-+    0x81C, 0x017C0101,
-+    0x81C, 0x017E0101,
-+    0xC50, 0x00000022,
-+    0xC50, 0x00000020,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8821a_agc, rtw_phy_cfg_agc);
-+
-+static const u32 rtw8821a_bb[] = {
-+    0x800, 0x0020D090,
-+    0x804, 0x080112E0,
-+    0x808, 0x0E028211,
-+    0x80C, 0x92131111,
-+    0x810, 0x20101261,
-+    0x814, 0x020C3D10,
-+    0x818, 0x03A00385,
-+    0x820, 0x00000000,
-+    0x824, 0x00030FE0,
-+    0x828, 0x00000000,
-+    0x82C, 0x002081DD,
-+    0x830, 0x2AAAEEC8,
-+    0x834, 0x0037A706,
-+    0x838, 0x06489B44,
-+    0x83C, 0x0000095B,
-+    0x840, 0xC0000001,
-+    0x844, 0x40003CDE,
-+    0x848, 0x62103F8B,
-+    0x84C, 0x6CFDFFB8,
-+    0x850, 0x28874706,
-+    0x854, 0x0001520C,
-+    0x858, 0x8060E000,
-+    0x85C, 0x74210168,
-+    0x860, 0x6929C321,
-+    0x864, 0x79727432,
-+    0x868, 0x8CA7A314,
-+    0x86C, 0x888C2878,
-+    0x870, 0x08888888,
-+    0x874, 0x31612C2E,
-+    0x878, 0x00000152,
-+    0x87C, 0x000FD000,
-+    0x8A0, 0x00000013,
-+    0x8A4, 0x7F7F7F7F,
-+    0x8A8, 0xA2000338,
-+    0x8AC, 0x0FF0FA0A,
-+    0x8B4, 0x000FC080,
-+    0x8B8, 0x6C10D7FF,
-+    0x8BC, 0x0CA52090,
-+    0x8C0, 0x1BF00020,
-+    0x8C4, 0x00000000,
-+    0x8C8, 0x00013169,
-+    0x8CC, 0x08248492,
-+    0x8D4, 0x940008A0,
-+    0x8D8, 0x290B5612,
-+    0x8F8, 0x400002C0,
-+    0x8FC, 0x00000000,
-+    0x900, 0x00000700,
-+    0x90C, 0x00000000,
-+    0x910, 0x0000FC00,
-+    0x914, 0x00000404,
-+    0x918, 0x1C1028C0,
-+    0x91C, 0x64B11A1C,
-+    0x920, 0xE0767233,
-+    0x924, 0x055AA500,
-+    0x928, 0x00000004,
-+    0x92C, 0xFFFE0000,
-+    0x930, 0xFFFFFFFE,
-+    0x934, 0x001FFFFF,
-+    0x960, 0x00000000,
-+    0x964, 0x00000000,
-+    0x968, 0x00000000,
-+    0x96C, 0x00000000,
-+    0x970, 0x801FFFFF,
-+    0x974, 0x000003FF,
-+    0x978, 0x00000000,
-+    0x97C, 0x00000000,
-+    0x980, 0x00000000,
-+    0x984, 0x00000000,
-+    0x988, 0x00000000,
-+    0x990, 0x27100000,
-+    0x994, 0xFFFF0100,
-+    0x998, 0xFFFFFF5C,
-+    0x99C, 0xFFFFFFFF,
-+    0x9A0, 0x000000FF,
-+    0x9A4, 0x00480080,
-+    0x9A8, 0x00000000,
-+    0x9AC, 0x00000000,
-+    0x9B0, 0x81081008,
-+    0x9B4, 0x01081008,
-+    0x9B8, 0x01081008,
-+    0x9BC, 0x01081008,
-+    0x9D0, 0x00000000,
-+    0x9D4, 0x00000000,
-+    0x9D8, 0x00000000,
-+    0x9DC, 0x00000000,
-+    0x9E0, 0x00005D00,
-+    0x9E4, 0x00000003,
-+    0x9E8, 0x00000001,
-+    0xA00, 0x00D047C8,
-+    0xA04, 0x01FF800C,
-+    0xA08, 0x8C8A8300,
-+    0xA0C, 0x2E68000F,
-+    0xA10, 0x9500BB78,
-+    0xA14, 0x11144028,
-+    0xA18, 0x00881117,
-+    0xA1C, 0x89140F00,
-+    0xA20, 0x1A1B0000,
-+    0xA24, 0x090E1317,
-+    0xA28, 0x00000204,
-+    0xA2C, 0x00900000,
-+    0xA70, 0x101FFF00,
-+    0xA74, 0x00000008,
-+    0xA78, 0x00000900,
-+    0xA7C, 0x225B0606,
-+    0xA80, 0x21805490,
-+    0xA84, 0x001F0000,
-+    0XB00, 0x03100040,
-+    0XB04, 0x0000B000,
-+    0XB08, 0xAE0201EB,
-+    0XB0C, 0x01003207,
-+    0XB10, 0x00009807,
-+    0XB14, 0x01000000,
-+    0XB18, 0x00000002,
-+    0XB1C, 0x00000002,
-+    0XB20, 0x0000001F,
-+    0XB24, 0x03020100,
-+    0XB28, 0x07060504,
-+    0XB2C, 0x0B0A0908,
-+    0XB30, 0x0F0E0D0C,
-+    0XB34, 0x13121110,
-+    0XB38, 0x17161514,
-+    0XB3C, 0x0000003A,
-+    0XB40, 0x00000000,
-+    0XB44, 0x00000000,
-+    0XB48, 0x13000032,
-+    0XB4C, 0x48080000,
-+    0XB50, 0x00000000,
-+    0XB54, 0x00000000,
-+    0XB58, 0x00000000,
-+    0XB5C, 0x00000000,
-+    0xC00, 0x00000007,
-+    0xC04, 0x00042020,
-+    0xC08, 0x80410231,
-+    0xC0C, 0x00000000,
-+    0xC10, 0x00000100,
-+    0xC14, 0x01000000,
-+    0xC1C, 0x40000003,
-+    0xC20, 0x2C2C2C2C,
-+    0xC24, 0x30303030,
-+    0xC28, 0x30303030,
-+    0xC2C, 0x2C2C2C2C,
-+    0xC30, 0x2C2C2C2C,
-+    0xC34, 0x2C2C2C2C,
-+    0xC38, 0x2C2C2C2C,
-+    0xC3C, 0x2A2A2A2A,
-+    0xC40, 0x2A2A2A2A,
-+    0xC44, 0x2A2A2A2A,
-+    0xC48, 0x2A2A2A2A,
-+    0xC4C, 0x2A2A2A2A,
-+    0xC50, 0x00000020,
-+    0xC54, 0x001C1208,
-+    0xC58, 0x30000C1C,
-+    0xC5C, 0x00000058,
-+    0xC60, 0x34344443,
-+    0xC64, 0x07003333,
-+    0xC68, 0x19791979,
-+    0xC6C, 0x19791979,
-+    0xC70, 0x19791979,
-+    0xC74, 0x19791979,
-+    0xC78, 0x19791979,
-+    0xC7C, 0x19791979,
-+    0xC80, 0x19791979,
-+    0xC84, 0x19791979,
-+    0xC94, 0x0100005C,
-+    0xC98, 0x00000000,
-+    0xC9C, 0x00000000,
-+    0xCA0, 0x00000029,
-+    0xCA4, 0x08040201,
-+    0xCA8, 0x80402010,
-+    0xCB0, 0x77775747,
-+    0xCB4, 0x10000077,
-+    0xCB8, 0x00508240,
-+};
-+
-+RTW_DECL_TABLE_PHY_COND(rtw8821a_bb, rtw_phy_cfg_bb);
-+
-+static const struct rtw_phy_pg_cfg_pair rtw8821a_bb_pg[] = {
-+    { 0, 0, 0, 0x00000c20, 0xffffffff, 0x32343638, },
-+    { 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363838, },
-+    { 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303234, },
-+    { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34363838, },
-+    { 0, 0, 0, 0x00000c30, 0xffffffff, 0x26283032, },
-+    { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636, },
-+    { 0, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, },
-+    { 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022, },
-+    { 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343636, },
-+    { 1, 0, 0, 0x00000c28, 0xffffffff, 0x26283032, },
-+    { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32343636, },
-+    { 1, 0, 0, 0x00000c30, 0xffffffff, 0x24262830, },
-+    { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636, },
-+    { 1, 0, 0, 0x00000c40, 0xffffffff, 0x24262830, },
-+    { 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022, },
-+};
-+
-+RTW_DECL_TABLE_BB_PG(rtw8821a_bb_pg);
-+
-+static const u32 rtw8821a_rf_a[] = {
-+    0x018, 0x0001712A,
-+    0x056, 0x00051CF2,
-+    0x066, 0x00040000,
-+    0x000, 0x00010000,
-+    0x01E, 0x00080000,
-+    0x082, 0x00000830,
-+    0x083, 0x00021800,
-+    0x084, 0x00028000,
-+    0x085, 0x00048000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x086, 0x0009483A,
-+    0xA0000000,    0x00000000,
-+    0x086, 0x00094838,
-+    0xB0000000,    0x00000000,
-+    0x087, 0x00044980,
-+    0x088, 0x00048000,
-+    0x089, 0x0000D480,
-+    0x08A, 0x00042240,
-+    0x08B, 0x000F0380,
-+    0x08C, 0x00090000,
-+    0x08D, 0x00022852,
-+    0x08E, 0x00065540,
-+    0x08F, 0x00088001,
-+    0x0EF, 0x00020000,
-+    0x03E, 0x00000380,
-+    0x03F, 0x00090018,
-+    0x03E, 0x00020380,
-+    0x03F, 0x000A0018,
-+    0x03E, 0x00040308,
-+    0x03F, 0x000A0018,
-+    0x03E, 0x00060018,
-+    0x03F, 0x000A0018,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x089, 0x00000080,
-+    0x08B, 0x00080180,
-+    0x0EF, 0x00001000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x00038027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x00030113,
-+    0x03C, 0x00082000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x00028027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x000000CC,
-+    0x03B, 0x00027027,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x0001F913,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000010C,
-+    0x03B, 0x00017F10,
-+    0x03C, 0x00012000,
-+    0x03A, 0x000000D0,
-+    0x03B, 0x00008027,
-+    0x03C, 0x000CA000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x00078027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x00070113,
-+    0x03C, 0x00082000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x00068027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x000000CC,
-+    0x03B, 0x00067027,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x0005F913,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000010C,
-+    0x03B, 0x00057F10,
-+    0x03C, 0x00012000,
-+    0x03A, 0x000000D0,
-+    0x03B, 0x00048027,
-+    0x03C, 0x000CA000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x000B8027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x00000244,
-+    0x03B, 0x000B0113,
-+    0x03C, 0x00082000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x000A8027,
-+    0x03C, 0x00082000,
-+    0x03A, 0x000000CC,
-+    0x03B, 0x000A7027,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000014C,
-+    0x03B, 0x0009F913,
-+    0x03C, 0x00042000,
-+    0x03A, 0x0000010C,
-+    0x03B, 0x00097F10,
-+    0x03C, 0x00012000,
-+    0x03A, 0x000000D0,
-+    0x03B, 0x00088027,
-+    0x03C, 0x000CA000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x00001100,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004ADF3,
-+    0x034, 0x00049DF0,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004ADF3,
-+    0x034, 0x00049DF0,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004ADF5,
-+    0x034, 0x00049DF2,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0F3,
-+    0x034, 0x000490B1,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004A0F3,
-+    0x034, 0x000490B1,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004ADF5,
-+    0x034, 0x00049DF2,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0004ADF3,
-+    0x034, 0x00049DF0,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0004ADF7,
-+    0x034, 0x00049DF3,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00048DED,
-+    0x034, 0x00047DEA,
-+    0x034, 0x00046DE7,
-+    0x034, 0x00045CE9,
-+    0x034, 0x00044CE6,
-+    0x034, 0x000438C6,
-+    0x034, 0x00042886,
-+    0x034, 0x00041486,
-+    0x034, 0x00040447,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00048DED,
-+    0x034, 0x00047DEA,
-+    0x034, 0x00046DE7,
-+    0x034, 0x00045CE9,
-+    0x034, 0x00044CE6,
-+    0x034, 0x000438C6,
-+    0x034, 0x00042886,
-+    0x034, 0x00041486,
-+    0x034, 0x00040447,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000480AE,
-+    0x034, 0x000470AB,
-+    0x034, 0x0004608B,
-+    0x034, 0x00045069,
-+    0x034, 0x00044048,
-+    0x034, 0x00043045,
-+    0x034, 0x00042026,
-+    0x034, 0x00041023,
-+    0x034, 0x00040002,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000480AE,
-+    0x034, 0x000470AB,
-+    0x034, 0x0004608B,
-+    0x034, 0x00045069,
-+    0x034, 0x00044048,
-+    0x034, 0x00043045,
-+    0x034, 0x00042026,
-+    0x034, 0x00041023,
-+    0x034, 0x00040002,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00048DED,
-+    0x034, 0x00047DEA,
-+    0x034, 0x00046DE7,
-+    0x034, 0x00045CE9,
-+    0x034, 0x00044CE6,
-+    0x034, 0x000438C6,
-+    0x034, 0x00042886,
-+    0x034, 0x00041486,
-+    0x034, 0x00040447,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x00048DEF,
-+    0x034, 0x00047DEC,
-+    0x034, 0x00046DE9,
-+    0x034, 0x00045CCB,
-+    0x034, 0x0004488D,
-+    0x034, 0x0004348D,
-+    0x034, 0x0004248A,
-+    0x034, 0x0004108D,
-+    0x034, 0x0004008A,
-+    0xB0000000,    0x00000000,
-+    0x80000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002ADF4,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0F3,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002A0F3,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0002ADF4,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0002ADF7,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00029DF4,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00029DF4,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00029DF1,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000290F0,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000290F0,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00029DF1,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00029DF4,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x00029DF2,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00028DF1,
-+    0x034, 0x00027DEE,
-+    0x034, 0x00026DEB,
-+    0x034, 0x00025CEC,
-+    0x034, 0x00024CE9,
-+    0x034, 0x000238CA,
-+    0x034, 0x00022889,
-+    0x034, 0x00021489,
-+    0x034, 0x0002044A,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00028DF1,
-+    0x034, 0x00027DEE,
-+    0x034, 0x00026DEB,
-+    0x034, 0x00025CEC,
-+    0x034, 0x00024CE9,
-+    0x034, 0x000238CA,
-+    0x034, 0x00022889,
-+    0x034, 0x00021489,
-+    0x034, 0x0002044A,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000280AF,
-+    0x034, 0x000270AC,
-+    0x034, 0x0002608B,
-+    0x034, 0x00025069,
-+    0x034, 0x00024048,
-+    0x034, 0x00023045,
-+    0x034, 0x00022026,
-+    0x034, 0x00021023,
-+    0x034, 0x00020002,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x000280AF,
-+    0x034, 0x000270AC,
-+    0x034, 0x0002608B,
-+    0x034, 0x00025069,
-+    0x034, 0x00024048,
-+    0x034, 0x00023045,
-+    0x034, 0x00022026,
-+    0x034, 0x00021023,
-+    0x034, 0x00020002,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00028DF1,
-+    0x034, 0x00027DEE,
-+    0x034, 0x00026DEB,
-+    0x034, 0x00025CEC,
-+    0x034, 0x00024CE9,
-+    0x034, 0x000238CA,
-+    0x034, 0x00022889,
-+    0x034, 0x00021489,
-+    0x034, 0x0002044A,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x00028DEE,
-+    0x034, 0x00027DEB,
-+    0x034, 0x00026CCD,
-+    0x034, 0x00025CCA,
-+    0x034, 0x0002488C,
-+    0x034, 0x0002384C,
-+    0x034, 0x00022849,
-+    0x034, 0x00021449,
-+    0x034, 0x0002004D,
-+    0xB0000000,    0x00000000,
-+    0x8000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0D7,
-+    0x034, 0x000090D3,
-+    0x034, 0x000080B1,
-+    0x034, 0x000070AE,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000A0D7,
-+    0x034, 0x000090D3,
-+    0x034, 0x000080B1,
-+    0x034, 0x000070AE,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x0000ADF7,
-+    0x034, 0x00009DF4,
-+    0x034, 0x00008DF1,
-+    0x034, 0x00007DEE,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00006DEB,
-+    0x034, 0x00005CEC,
-+    0x034, 0x00004CE9,
-+    0x034, 0x000038CA,
-+    0x034, 0x00002889,
-+    0x034, 0x00001489,
-+    0x034, 0x0000044A,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00006DEB,
-+    0x034, 0x00005CEC,
-+    0x034, 0x00004CE9,
-+    0x034, 0x000038CA,
-+    0x034, 0x00002889,
-+    0x034, 0x00001489,
-+    0x034, 0x0000044A,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000608D,
-+    0x034, 0x0000506B,
-+    0x034, 0x0000404A,
-+    0x034, 0x00003047,
-+    0x034, 0x00002044,
-+    0x034, 0x00001025,
-+    0x034, 0x00000004,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x0000608D,
-+    0x034, 0x0000506B,
-+    0x034, 0x0000404A,
-+    0x034, 0x00003047,
-+    0x034, 0x00002044,
-+    0x034, 0x00001025,
-+    0x034, 0x00000004,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x034, 0x00006DEB,
-+    0x034, 0x00005CEC,
-+    0x034, 0x00004CE9,
-+    0x034, 0x000038CA,
-+    0x034, 0x00002889,
-+    0x034, 0x00001489,
-+    0x034, 0x0000044A,
-+    0xA0000000,    0x00000000,
-+    0x034, 0x00006DCD,
-+    0x034, 0x00005CCD,
-+    0x034, 0x00004CCA,
-+    0x034, 0x0000388C,
-+    0x034, 0x00002888,
-+    0x034, 0x00001488,
-+    0x034, 0x00000486,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000040,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000187,
-+    0x035, 0x00008187,
-+    0x035, 0x00010187,
-+    0x035, 0x00020188,
-+    0x035, 0x00028188,
-+    0x035, 0x00030188,
-+    0x035, 0x00040188,
-+    0x035, 0x00048188,
-+    0x035, 0x00050188,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000187,
-+    0x035, 0x00008187,
-+    0x035, 0x00010187,
-+    0x035, 0x00020188,
-+    0x035, 0x00028188,
-+    0x035, 0x00030188,
-+    0x035, 0x00040188,
-+    0x035, 0x00048188,
-+    0x035, 0x00050188,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000128,
-+    0x035, 0x00008128,
-+    0x035, 0x00010128,
-+    0x035, 0x000201C8,
-+    0x035, 0x000281C8,
-+    0x035, 0x000301C8,
-+    0x035, 0x000401C8,
-+    0x035, 0x000481C8,
-+    0x035, 0x000501C8,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000145,
-+    0x035, 0x00008145,
-+    0x035, 0x00010145,
-+    0x035, 0x00020196,
-+    0x035, 0x00028196,
-+    0x035, 0x00030196,
-+    0x035, 0x000401C7,
-+    0x035, 0x000481C7,
-+    0x035, 0x000501C7,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000128,
-+    0x035, 0x00008128,
-+    0x035, 0x00010128,
-+    0x035, 0x000201C8,
-+    0x035, 0x000281C8,
-+    0x035, 0x000301C8,
-+    0x035, 0x000401C8,
-+    0x035, 0x000481C8,
-+    0x035, 0x000501C8,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x035, 0x00000187,
-+    0x035, 0x00008187,
-+    0x035, 0x00010187,
-+    0x035, 0x00020188,
-+    0x035, 0x00028188,
-+    0x035, 0x00030188,
-+    0x035, 0x00040188,
-+    0x035, 0x00048188,
-+    0x035, 0x00050188,
-+    0xA0000000,    0x00000000,
-+    0x035, 0x00000145,
-+    0x035, 0x00008145,
-+    0x035, 0x00010145,
-+    0x035, 0x00020196,
-+    0x035, 0x00028196,
-+    0x035, 0x00030196,
-+    0x035, 0x000401C7,
-+    0x035, 0x000481C7,
-+    0x035, 0x000501C7,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000010,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x00085733,
-+    0x036, 0x0008D733,
-+    0x036, 0x00095733,
-+    0x036, 0x0009D733,
-+    0x036, 0x000A64B4,
-+    0x036, 0x000AE4B4,
-+    0x036, 0x000B64B4,
-+    0x036, 0x000BE4B4,
-+    0x036, 0x000C64B4,
-+    0x036, 0x000CE4B4,
-+    0x036, 0x000D64B4,
-+    0x036, 0x000DE4B4,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x00085733,
-+    0x036, 0x0008D733,
-+    0x036, 0x00095733,
-+    0x036, 0x0009D733,
-+    0x036, 0x000A64B4,
-+    0x036, 0x000AE4B4,
-+    0x036, 0x000B64B4,
-+    0x036, 0x000BE4B4,
-+    0x036, 0x000C64B4,
-+    0x036, 0x000CE4B4,
-+    0x036, 0x000D64B4,
-+    0x036, 0x000DE4B4,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x000063B5,
-+    0x036, 0x0000E3B5,
-+    0x036, 0x000163B5,
-+    0x036, 0x0001E3B5,
-+    0x036, 0x000263B5,
-+    0x036, 0x0002E3B5,
-+    0x036, 0x000363B5,
-+    0x036, 0x0003E3B5,
-+    0x036, 0x000463B5,
-+    0x036, 0x0004E3B5,
-+    0x036, 0x000563B5,
-+    0x036, 0x0005E3B5,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x000056B3,
-+    0x036, 0x0000D6B3,
-+    0x036, 0x000156B3,
-+    0x036, 0x0001D6B3,
-+    0x036, 0x00026634,
-+    0x036, 0x0002E634,
-+    0x036, 0x00036634,
-+    0x036, 0x0003E634,
-+    0x036, 0x000467B4,
-+    0x036, 0x0004E7B4,
-+    0x036, 0x000567B4,
-+    0x036, 0x0005E7B4,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x000063B5,
-+    0x036, 0x0000E3B5,
-+    0x036, 0x000163B5,
-+    0x036, 0x0001E3B5,
-+    0x036, 0x000263B5,
-+    0x036, 0x0002E3B5,
-+    0x036, 0x000363B5,
-+    0x036, 0x0003E3B5,
-+    0x036, 0x000463B5,
-+    0x036, 0x0004E3B5,
-+    0x036, 0x000563B5,
-+    0x036, 0x0005E3B5,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x036, 0x00085733,
-+    0x036, 0x0008D733,
-+    0x036, 0x00095733,
-+    0x036, 0x0009D733,
-+    0x036, 0x000A64B4,
-+    0x036, 0x000AE4B4,
-+    0x036, 0x000B64B4,
-+    0x036, 0x000BE4B4,
-+    0x036, 0x000C64B4,
-+    0x036, 0x000CE4B4,
-+    0x036, 0x000D64B4,
-+    0x036, 0x000DE4B4,
-+    0xA0000000,    0x00000000,
-+    0x036, 0x000056B3,
-+    0x036, 0x0000D6B3,
-+    0x036, 0x000156B3,
-+    0x036, 0x0001D6B3,
-+    0x036, 0x00026634,
-+    0x036, 0x0002E634,
-+    0x036, 0x00036634,
-+    0x036, 0x0003E634,
-+    0x036, 0x000467B4,
-+    0x036, 0x0004E7B4,
-+    0x036, 0x000567B4,
-+    0x036, 0x0005E7B4,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x00000008,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000001C8,
-+    0x03C, 0x00000492,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000001C8,
-+    0x03C, 0x00000492,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000001B6,
-+    0x03C, 0x00000492,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x0000022A,
-+    0x03C, 0x00000594,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000001B6,
-+    0x03C, 0x00000492,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x000001C8,
-+    0x03C, 0x00000492,
-+    0xA0000000,    0x00000000,
-+    0x03C, 0x0000022A,
-+    0x03C, 0x00000594,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000800,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000800,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000800,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000820,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000820,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000800,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x03C, 0x00000800,
-+    0xA0000000,    0x00000000,
-+    0x03C, 0x00000900,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x018, 0x0001712A,
-+    0x0EF, 0x00000002,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x0004E400,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x0004E400,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x00002000,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x00002000,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x00002000,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x00002000,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x008, 0x0004E400,
-+    0xA0000000,    0x00000000,
-+    0x008, 0x00002000,
-+    0xB0000000,    0x00000000,
-+    0x0EF, 0x00000000,
-+    0x0DF, 0x000000C0,
-+    0x01F, 0x00000064,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x000A7284,
-+    0x059, 0x000600EC,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x000A7284,
-+    0x059, 0x000600EC,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x00081184,
-+    0x059, 0x0006016C,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x00081184,
-+    0x059, 0x0006016C,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x00081184,
-+    0x059, 0x0006016C,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x058, 0x000A7284,
-+    0x059, 0x000600EC,
-+    0xA0000000,    0x00000000,
-+    0x058, 0x00081184,
-+    0x059, 0x0006016C,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000E8D73,
-+    0x062, 0x00093FC5,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000E8D73,
-+    0x062, 0x00093FC5,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EFD83,
-+    0x062, 0x00093FCC,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EAD53,
-+    0x062, 0x00093BC4,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000EFD83,
-+    0x062, 0x00093FCC,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x061, 0x000E8D73,
-+    0x062, 0x00093FC5,
-+    0xA0000000,    0x00000000,
-+    0x061, 0x000EAD53,
-+    0x062, 0x00093BC4,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110E9,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110E9,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110EB,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110E9,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110E9,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110EB,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x063, 0x000110E9,
-+    0xA0000000,    0x00000000,
-+    0x063, 0x000714E9,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C27C,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C27C,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C27C,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C67C,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C27C,
-+    0x90000410,    0x00000000,    0x40000000,    0x00000000,
-+    0x064, 0x0001C27C,
-+    0xA0000000,    0x00000000,
-+    0x064, 0x0001C67C,
-+    0xB0000000,    0x00000000,
-+    0x80000111,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00091016,
-+    0x90000110,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00091016,
-+    0x90000210,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00093016,
-+    0x9000020c,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00093015,
-+    0x9000040c,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00093015,
-+    0x90000200,    0x00000000,    0x40000000,    0x00000000,
-+    0x065, 0x00093016,
-+    0xA0000000,    0x00000000,
-+    0x065, 0x00091016,
-+    0xB0000000,    0x00000000,
-+    0x018, 0x00000006,
-+    0x0EF, 0x00002000,
-+    0x03B, 0x0003824B,
-+    0x03B, 0x0003024B,
-+    0x03B, 0x0002844B,
-+    0x03B, 0x00020F4B,
-+    0x03B, 0x00018F4B,
-+    0x03B, 0x000104B2,
-+    0x03B, 0x00008049,
-+    0x03B, 0x00000148,
-+    0x03B, 0x0007824B,
-+    0x03B, 0x0007024B,
-+    0x03B, 0x0006824B,
-+    0x03B, 0x00060F4B,
-+    0x03B, 0x00058F4B,
-+    0x03B, 0x000504B2,
-+    0x03B, 0x00048049,
-+    0x03B, 0x00040148,
-+    0x0EF, 0x00000000,
-+    0x0EF, 0x00000100,
-+    0x034, 0x0000ADF3,
-+    0x034, 0x00009DF0,
-+    0x034, 0x00008D70,
-+    0x034, 0x00007D6D,
-+    0x034, 0x00006CEE,
-+    0x034, 0x00005CCC,
-+    0x034, 0x000044EC,
-+    0x034, 0x000034AC,
-+    0x034, 0x0000246D,
-+    0x034, 0x0000106F,
-+    0x034, 0x0000006C,
-+    0x0EF, 0x00000000,
-+    0x0ED, 0x00000010,
-+    0x044, 0x0000ADF2,
-+    0x044, 0x00009DEF,
-+    0x044, 0x00008DEC,
-+    0x044, 0x00007DE9,
-+    0x044, 0x00006CEC,
-+    0x044, 0x00005CE9,
-+    0x044, 0x000044EC,
-+    0x044, 0x000034E9,
-+    0x044, 0x0000246C,
-+    0x044, 0x00001469,
-+    0x044, 0x0000006C,
-+    0x0ED, 0x00000000,
-+    0x0ED, 0x00000001,
-+    0x040, 0x00038DA7,
-+    0x040, 0x000300C2,
-+    0x040, 0x000288E2,
-+    0x040, 0x000200B8,
-+    0x040, 0x000188A5,
-+    0x040, 0x00010FBC,
-+    0x040, 0x00008F71,
-+    0x040, 0x00000240,
-+    0x0ED, 0x00000000,
-+    0x0EF, 0x000020A2,
-+    0x0DF, 0x00000080,
-+    0x035, 0x00000120,
-+    0x035, 0x00008120,
-+    0x035, 0x00010120,
-+    0x036, 0x00000085,
-+    0x036, 0x00008085,
-+    0x036, 0x00010085,
-+    0x036, 0x00018085,
-+    0x0EF, 0x00000000,
-+    0x051, 0x00000C31,
-+    0x052, 0x00000622,
-+    0x053, 0x000FC70B,
-+    0x054, 0x0000017E,
-+    0x056, 0x00051DF3,
-+    0x051, 0x00000C01,
-+    0x052, 0x000006D6,
-+    0x053, 0x000FC649,
-+    0x070, 0x00049661,
-+    0x071, 0x0007843E,
-+    0x072, 0x00000382,
-+    0x074, 0x00051400,
-+    0x035, 0x00000160,
-+    0x035, 0x00008160,
-+    0x035, 0x00010160,
-+    0x036, 0x00000124,
-+    0x036, 0x00008124,
-+    0x036, 0x00010124,
-+    0x036, 0x00018124,
-+    0x0ED, 0x0000000C,
-+    0x045, 0x00000140,
-+    0x045, 0x00008140,
-+    0x045, 0x00010140,
-+    0x046, 0x00000124,
-+    0x046, 0x00008124,
-+    0x046, 0x00010124,
-+    0x046, 0x00018124,
-+    0x0DF, 0x00000088,
-+    0x0B3, 0x000F0E18,
-+    0x0B4, 0x0001214C,
-+    0x0B7, 0x0003000C,
-+    0x01C, 0x000539D2,
-+    0x0C4, 0x000AFE00,
-+    0x018, 0x0001F12A,
-+    0xFFE, 0x00000000,
-+    0xFFE, 0x00000000,
-+    0x018, 0x0001712A,
-+};
-+
-+RTW_DECL_TABLE_RF_RADIO(rtw8821a_rf_a, A);
-+
-+static const struct rtw_txpwr_lmt_cfg_pair rtw8821a_txpwr_lmt[] = {
-+    { 0, 0, 0, 0, 1, 32, },
-+    { 2, 0, 0, 0, 1, 28, },
-+    { 1, 0, 0, 0, 1, 32, },
-+    { 0, 0, 0, 0, 2, 32, },
-+    { 2, 0, 0, 0, 2, 28, },
-+    { 1, 0, 0, 0, 2, 32, },
-+    { 0, 0, 0, 0, 3, 36, },
-+    { 2, 0, 0, 0, 3, 28, },
-+    { 1, 0, 0, 0, 3, 32, },
-+    { 0, 0, 0, 0, 4, 36, },
-+    { 2, 0, 0, 0, 4, 28, },
-+    { 1, 0, 0, 0, 4, 32, },
-+    { 0, 0, 0, 0, 5, 36, },
-+    { 2, 0, 0, 0, 5, 28, },
-+    { 1, 0, 0, 0, 5, 32, },
-+    { 0, 0, 0, 0, 6, 36, },
-+    { 2, 0, 0, 0, 6, 28, },
-+    { 1, 0, 0, 0, 6, 32, },
-+    { 0, 0, 0, 0, 7, 36, },
-+    { 2, 0, 0, 0, 7, 28, },
-+    { 1, 0, 0, 0, 7, 32, },
-+    { 0, 0, 0, 0, 8, 36, },
-+    { 2, 0, 0, 0, 8, 28, },
-+    { 1, 0, 0, 0, 8, 32, },
-+    { 0, 0, 0, 0, 9, 32, },
-+    { 2, 0, 0, 0, 9, 28, },
-+    { 1, 0, 0, 0, 9, 32, },
-+    { 0, 0, 0, 0, 10, 32, },
-+    { 2, 0, 0, 0, 10, 28, },
-+    { 1, 0, 0, 0, 10, 32, },
-+    { 0, 0, 0, 0, 11, 32, },
-+    { 2, 0, 0, 0, 11, 28, },
-+    { 1, 0, 0, 0, 11, 32, },
-+    { 0, 0, 0, 0, 12, 28, },
-+    { 2, 0, 0, 0, 12, 28, },
-+    { 1, 0, 0, 0, 12, 32, },
-+    { 0, 0, 0, 0, 13, 26, },
-+    { 2, 0, 0, 0, 13, 28, },
-+    { 1, 0, 0, 0, 13, 32, },
-+    { 0, 0, 0, 0, 14, 63, },
-+    { 2, 0, 0, 0, 14, 63, },
-+    { 1, 0, 0, 0, 14, 32, },
-+    { 0, 0, 0, 1, 1, 30, },
-+    { 2, 0, 0, 1, 1, 30, },
-+    { 1, 0, 0, 1, 1, 32, },
-+    { 0, 0, 0, 1, 2, 30, },
-+    { 2, 0, 0, 1, 2, 32, },
-+    { 1, 0, 0, 1, 2, 32, },
-+    { 0, 0, 0, 1, 3, 32, },
-+    { 2, 0, 0, 1, 3, 32, },
-+    { 1, 0, 0, 1, 3, 32, },
-+    { 0, 0, 0, 1, 4, 32, },
-+    { 2, 0, 0, 1, 4, 32, },
-+    { 1, 0, 0, 1, 4, 32, },
-+    { 0, 0, 0, 1, 5, 32, },
-+    { 2, 0, 0, 1, 5, 32, },
-+    { 1, 0, 0, 1, 5, 32, },
-+    { 0, 0, 0, 1, 6, 32, },
-+    { 2, 0, 0, 1, 6, 32, },
-+    { 1, 0, 0, 1, 6, 32, },
-+    { 0, 0, 0, 1, 7, 32, },
-+    { 2, 0, 0, 1, 7, 32, },
-+    { 1, 0, 0, 1, 7, 32, },
-+    { 0, 0, 0, 1, 8, 32, },
-+    { 2, 0, 0, 1, 8, 32, },
-+    { 1, 0, 0, 1, 8, 32, },
-+    { 0, 0, 0, 1, 9, 30, },
-+    { 2, 0, 0, 1, 9, 32, },
-+    { 1, 0, 0, 1, 9, 32, },
-+    { 0, 0, 0, 1, 10, 30, },
-+    { 2, 0, 0, 1, 10, 32, },
-+    { 1, 0, 0, 1, 10, 32, },
-+    { 0, 0, 0, 1, 11, 30, },
-+    { 2, 0, 0, 1, 11, 32, },
-+    { 1, 0, 0, 1, 11, 32, },
-+    { 0, 0, 0, 1, 12, 26, },
-+    { 2, 0, 0, 1, 12, 32, },
-+    { 1, 0, 0, 1, 12, 32, },
-+    { 0, 0, 0, 1, 13, 24, },
-+    { 2, 0, 0, 1, 13, 30, },
-+    { 1, 0, 0, 1, 13, 32, },
-+    { 0, 0, 0, 1, 14, 63, },
-+    { 2, 0, 0, 1, 14, 63, },
-+    { 1, 0, 0, 1, 14, 63, },
-+    { 0, 0, 0, 2, 1, 26, },
-+    { 2, 0, 0, 2, 1, 26, },
-+    { 1, 0, 0, 2, 1, 32, },
-+    { 0, 0, 0, 2, 2, 26, },
-+    { 2, 0, 0, 2, 2, 32, },
-+    { 1, 0, 0, 2, 2, 32, },
-+    { 0, 0, 0, 2, 3, 32, },
-+    { 2, 0, 0, 2, 3, 32, },
-+    { 1, 0, 0, 2, 3, 32, },
-+    { 0, 0, 0, 2, 4, 32, },
-+    { 2, 0, 0, 2, 4, 32, },
-+    { 1, 0, 0, 2, 4, 32, },
-+    { 0, 0, 0, 2, 5, 32, },
-+    { 2, 0, 0, 2, 5, 32, },
-+    { 1, 0, 0, 2, 5, 32, },
-+    { 0, 0, 0, 2, 6, 32, },
-+    { 2, 0, 0, 2, 6, 32, },
-+    { 1, 0, 0, 2, 6, 32, },
-+    { 0, 0, 0, 2, 7, 32, },
-+    { 2, 0, 0, 2, 7, 32, },
-+    { 1, 0, 0, 2, 7, 32, },
-+    { 0, 0, 0, 2, 8, 32, },
-+    { 2, 0, 0, 2, 8, 32, },
-+    { 1, 0, 0, 2, 8, 32, },
-+    { 0, 0, 0, 2, 9, 26, },
-+    { 2, 0, 0, 2, 9, 32, },
-+    { 1, 0, 0, 2, 9, 32, },
-+    { 0, 0, 0, 2, 10, 26, },
-+    { 2, 0, 0, 2, 10, 32, },
-+    { 1, 0, 0, 2, 10, 32, },
-+    { 0, 0, 0, 2, 11, 26, },
-+    { 2, 0, 0, 2, 11, 32, },
-+    { 1, 0, 0, 2, 11, 32, },
-+    { 0, 0, 0, 2, 12, 26, },
-+    { 2, 0, 0, 2, 12, 32, },
-+    { 1, 0, 0, 2, 12, 32, },
-+    { 0, 0, 0, 2, 13, 24, },
-+    { 2, 0, 0, 2, 13, 26, },
-+    { 1, 0, 0, 2, 13, 32, },
-+    { 0, 0, 0, 2, 14, 63, },
-+    { 2, 0, 0, 2, 14, 63, },
-+    { 1, 0, 0, 2, 14, 63, },
-+    { 0, 0, 0, 3, 1, 30, },
-+    { 2, 0, 0, 3, 1, 32, },
-+    { 1, 0, 0, 3, 1, 32, },
-+    { 0, 0, 0, 3, 2, 32, },
-+    { 2, 0, 0, 3, 2, 32, },
-+    { 1, 0, 0, 3, 2, 32, },
-+    { 0, 0, 0, 3, 3, 32, },
-+    { 2, 0, 0, 3, 3, 32, },
-+    { 1, 0, 0, 3, 3, 32, },
-+    { 0, 0, 0, 3, 4, 32, },
-+    { 2, 0, 0, 3, 4, 32, },
-+    { 1, 0, 0, 3, 4, 32, },
-+    { 0, 0, 0, 3, 5, 32, },
-+    { 2, 0, 0, 3, 5, 32, },
-+    { 1, 0, 0, 3, 5, 32, },
-+    { 0, 0, 0, 3, 6, 32, },
-+    { 2, 0, 0, 3, 6, 32, },
-+    { 1, 0, 0, 3, 6, 32, },
-+    { 0, 0, 0, 3, 7, 32, },
-+    { 2, 0, 0, 3, 7, 32, },
-+    { 1, 0, 0, 3, 7, 32, },
-+    { 0, 0, 0, 3, 8, 32, },
-+    { 2, 0, 0, 3, 8, 32, },
-+    { 1, 0, 0, 3, 8, 32, },
-+    { 0, 0, 0, 3, 9, 32, },
-+    { 2, 0, 0, 3, 9, 32, },
-+    { 1, 0, 0, 3, 9, 32, },
-+    { 0, 0, 0, 3, 10, 32, },
-+    { 2, 0, 0, 3, 10, 32, },
-+    { 1, 0, 0, 3, 10, 32, },
-+    { 0, 0, 0, 3, 11, 30, },
-+    { 2, 0, 0, 3, 11, 32, },
-+    { 1, 0, 0, 3, 11, 32, },
-+    { 0, 0, 0, 3, 12, 63, },
-+    { 2, 0, 0, 3, 12, 32, },
-+    { 1, 0, 0, 3, 12, 32, },
-+    { 0, 0, 0, 3, 13, 63, },
-+    { 2, 0, 0, 3, 13, 32, },
-+    { 1, 0, 0, 3, 13, 32, },
-+    { 0, 0, 0, 3, 14, 63, },
-+    { 2, 0, 0, 3, 14, 63, },
-+    { 1, 0, 0, 3, 14, 63, },
-+    { 0, 0, 1, 2, 1, 63, },
-+    { 2, 0, 1, 2, 1, 63, },
-+    { 1, 0, 1, 2, 1, 63, },
-+    { 0, 0, 1, 2, 2, 63, },
-+    { 2, 0, 1, 2, 2, 63, },
-+    { 1, 0, 1, 2, 2, 63, },
-+    { 0, 0, 1, 2, 3, 26, },
-+    { 2, 0, 1, 2, 3, 26, },
-+    { 1, 0, 1, 2, 3, 32, },
-+    { 0, 0, 1, 2, 4, 26, },
-+    { 2, 0, 1, 2, 4, 32, },
-+    { 1, 0, 1, 2, 4, 32, },
-+    { 0, 0, 1, 2, 5, 26, },
-+    { 2, 0, 1, 2, 5, 32, },
-+    { 1, 0, 1, 2, 5, 32, },
-+    { 0, 0, 1, 2, 6, 32, },
-+    { 2, 0, 1, 2, 6, 32, },
-+    { 1, 0, 1, 2, 6, 32, },
-+    { 0, 0, 1, 2, 7, 32, },
-+    { 2, 0, 1, 2, 7, 32, },
-+    { 1, 0, 1, 2, 7, 32, },
-+    { 0, 0, 1, 2, 8, 32, },
-+    { 2, 0, 1, 2, 8, 32, },
-+    { 1, 0, 1, 2, 8, 32, },
-+    { 0, 0, 1, 2, 9, 26, },
-+    { 2, 0, 1, 2, 9, 32, },
-+    { 1, 0, 1, 2, 9, 32, },
-+    { 0, 0, 1, 2, 10, 24, },
-+    { 2, 0, 1, 2, 10, 32, },
-+    { 1, 0, 1, 2, 10, 32, },
-+    { 0, 0, 1, 2, 11, 22, },
-+    { 2, 0, 1, 2, 11, 26, },
-+    { 1, 0, 1, 2, 11, 32, },
-+    { 0, 0, 1, 2, 12, 63, },
-+    { 2, 0, 1, 2, 12, 63, },
-+    { 1, 0, 1, 2, 12, 63, },
-+    { 0, 0, 1, 2, 13, 63, },
-+    { 2, 0, 1, 2, 13, 63, },
-+    { 1, 0, 1, 2, 13, 63, },
-+    { 0, 0, 1, 2, 14, 63, },
-+    { 2, 0, 1, 2, 14, 63, },
-+    { 1, 0, 1, 2, 14, 63, },
-+    { 0, 0, 1, 3, 1, 63, },
-+    { 2, 0, 1, 3, 1, 63, },
-+    { 1, 0, 1, 3, 1, 63, },
-+    { 0, 0, 1, 3, 2, 63, },
-+    { 2, 0, 1, 3, 2, 63, },
-+    { 1, 0, 1, 3, 2, 63, },
-+    { 0, 0, 1, 3, 3, 30, },
-+    { 2, 0, 1, 3, 3, 30, },
-+    { 1, 0, 1, 3, 3, 30, },
-+    { 0, 0, 1, 3, 4, 32, },
-+    { 2, 0, 1, 3, 4, 30, },
-+    { 1, 0, 1, 3, 4, 30, },
-+    { 0, 0, 1, 3, 5, 32, },
-+    { 2, 0, 1, 3, 5, 30, },
-+    { 1, 0, 1, 3, 5, 30, },
-+    { 0, 0, 1, 3, 6, 32, },
-+    { 2, 0, 1, 3, 6, 30, },
-+    { 1, 0, 1, 3, 6, 30, },
-+    { 0, 0, 1, 3, 7, 32, },
-+    { 2, 0, 1, 3, 7, 30, },
-+    { 1, 0, 1, 3, 7, 30, },
-+    { 0, 0, 1, 3, 8, 32, },
-+    { 2, 0, 1, 3, 8, 30, },
-+    { 1, 0, 1, 3, 8, 30, },
-+    { 0, 0, 1, 3, 9, 32, },
-+    { 2, 0, 1, 3, 9, 30, },
-+    { 1, 0, 1, 3, 9, 30, },
-+    { 0, 0, 1, 3, 10, 32, },
-+    { 2, 0, 1, 3, 10, 30, },
-+    { 1, 0, 1, 3, 10, 30, },
-+    { 0, 0, 1, 3, 11, 30, },
-+    { 2, 0, 1, 3, 11, 30, },
-+    { 1, 0, 1, 3, 11, 30, },
-+    { 0, 0, 1, 3, 12, 63, },
-+    { 2, 0, 1, 3, 12, 32, },
-+    { 1, 0, 1, 3, 12, 32, },
-+    { 0, 0, 1, 3, 13, 63, },
-+    { 2, 0, 1, 3, 13, 32, },
-+    { 1, 0, 1, 3, 13, 32, },
-+    { 0, 0, 1, 3, 14, 63, },
-+    { 2, 0, 1, 3, 14, 63, },
-+    { 1, 0, 1, 3, 14, 63, },
-+    { 0, 1, 0, 1, 36, 32, },
-+    { 2, 1, 0, 1, 36, 30, },
-+    { 1, 1, 0, 1, 36, 30, },
-+    { 0, 1, 0, 1, 40, 32, },
-+    { 2, 1, 0, 1, 40, 30, },
-+    { 1, 1, 0, 1, 40, 30, },
-+    { 0, 1, 0, 1, 44, 32, },
-+    { 2, 1, 0, 1, 44, 30, },
-+    { 1, 1, 0, 1, 44, 30, },
-+    { 0, 1, 0, 1, 48, 32, },
-+    { 2, 1, 0, 1, 48, 30, },
-+    { 1, 1, 0, 1, 48, 30, },
-+    { 0, 1, 0, 1, 52, 32, },
-+    { 2, 1, 0, 1, 52, 30, },
-+    { 1, 1, 0, 1, 52, 30, },
-+    { 0, 1, 0, 1, 56, 32, },
-+    { 2, 1, 0, 1, 56, 30, },
-+    { 1, 1, 0, 1, 56, 30, },
-+    { 0, 1, 0, 1, 60, 32, },
-+    { 2, 1, 0, 1, 60, 30, },
-+    { 1, 1, 0, 1, 60, 30, },
-+    { 0, 1, 0, 1, 64, 32, },
-+    { 2, 1, 0, 1, 64, 30, },
-+    { 1, 1, 0, 1, 64, 30, },
-+    { 0, 1, 0, 1, 100, 32, },
-+    { 2, 1, 0, 1, 100, 30, },
-+    { 1, 1, 0, 1, 100, 30, },
-+    { 0, 1, 0, 1, 104, 32, },
-+    { 2, 1, 0, 1, 104, 30, },
-+    { 1, 1, 0, 1, 104, 30, },
-+    { 0, 1, 0, 1, 108, 32, },
-+    { 2, 1, 0, 1, 108, 30, },
-+    { 1, 1, 0, 1, 108, 30, },
-+    { 0, 1, 0, 1, 112, 32, },
-+    { 2, 1, 0, 1, 112, 30, },
-+    { 1, 1, 0, 1, 112, 30, },
-+    { 0, 1, 0, 1, 116, 32, },
-+    { 2, 1, 0, 1, 116, 30, },
-+    { 1, 1, 0, 1, 116, 30, },
-+    { 0, 1, 0, 1, 120, 32, },
-+    { 2, 1, 0, 1, 120, 30, },
-+    { 1, 1, 0, 1, 120, 30, },
-+    { 0, 1, 0, 1, 124, 32, },
-+    { 2, 1, 0, 1, 124, 30, },
-+    { 1, 1, 0, 1, 124, 30, },
-+    { 0, 1, 0, 1, 128, 32, },
-+    { 2, 1, 0, 1, 128, 30, },
-+    { 1, 1, 0, 1, 128, 30, },
-+    { 0, 1, 0, 1, 132, 32, },
-+    { 2, 1, 0, 1, 132, 30, },
-+    { 1, 1, 0, 1, 132, 30, },
-+    { 0, 1, 0, 1, 136, 32, },
-+    { 2, 1, 0, 1, 136, 30, },
-+    { 1, 1, 0, 1, 136, 30, },
-+    { 0, 1, 0, 1, 140, 32, },
-+    { 2, 1, 0, 1, 140, 30, },
-+    { 1, 1, 0, 1, 140, 30, },
-+    { 0, 1, 0, 1, 149, 32, },
-+    { 2, 1, 0, 1, 149, 30, },
-+    { 1, 1, 0, 1, 149, 63, },
-+    { 0, 1, 0, 1, 153, 32, },
-+    { 2, 1, 0, 1, 153, 30, },
-+    { 1, 1, 0, 1, 153, 63, },
-+    { 0, 1, 0, 1, 157, 32, },
-+    { 2, 1, 0, 1, 157, 30, },
-+    { 1, 1, 0, 1, 157, 63, },
-+    { 0, 1, 0, 1, 161, 32, },
-+    { 2, 1, 0, 1, 161, 30, },
-+    { 1, 1, 0, 1, 161, 63, },
-+    { 0, 1, 0, 1, 165, 32, },
-+    { 2, 1, 0, 1, 165, 30, },
-+    { 1, 1, 0, 1, 165, 63, },
-+    { 0, 1, 0, 2, 36, 32, },
-+    { 2, 1, 0, 2, 36, 30, },
-+    { 1, 1, 0, 2, 36, 30, },
-+    { 0, 1, 0, 2, 40, 32, },
-+    { 2, 1, 0, 2, 40, 30, },
-+    { 1, 1, 0, 2, 40, 30, },
-+    { 0, 1, 0, 2, 44, 32, },
-+    { 2, 1, 0, 2, 44, 30, },
-+    { 1, 1, 0, 2, 44, 30, },
-+    { 0, 1, 0, 2, 48, 32, },
-+    { 2, 1, 0, 2, 48, 30, },
-+    { 1, 1, 0, 2, 48, 30, },
-+    { 0, 1, 0, 2, 52, 32, },
-+    { 2, 1, 0, 2, 52, 30, },
-+    { 1, 1, 0, 2, 52, 30, },
-+    { 0, 1, 0, 2, 56, 32, },
-+    { 2, 1, 0, 2, 56, 30, },
-+    { 1, 1, 0, 2, 56, 30, },
-+    { 0, 1, 0, 2, 60, 32, },
-+    { 2, 1, 0, 2, 60, 30, },
-+    { 1, 1, 0, 2, 60, 30, },
-+    { 0, 1, 0, 2, 64, 32, },
-+    { 2, 1, 0, 2, 64, 30, },
-+    { 1, 1, 0, 2, 64, 30, },
-+    { 0, 1, 0, 2, 100, 32, },
-+    { 2, 1, 0, 2, 100, 30, },
-+    { 1, 1, 0, 2, 100, 30, },
-+    { 0, 1, 0, 2, 104, 32, },
-+    { 2, 1, 0, 2, 104, 30, },
-+    { 1, 1, 0, 2, 104, 30, },
-+    { 0, 1, 0, 2, 108, 32, },
-+    { 2, 1, 0, 2, 108, 30, },
-+    { 1, 1, 0, 2, 108, 30, },
-+    { 0, 1, 0, 2, 112, 32, },
-+    { 2, 1, 0, 2, 112, 30, },
-+    { 1, 1, 0, 2, 112, 30, },
-+    { 0, 1, 0, 2, 116, 32, },
-+    { 2, 1, 0, 2, 116, 30, },
-+    { 1, 1, 0, 2, 116, 30, },
-+    { 0, 1, 0, 2, 120, 32, },
-+    { 2, 1, 0, 2, 120, 30, },
-+    { 1, 1, 0, 2, 120, 30, },
-+    { 0, 1, 0, 2, 124, 32, },
-+    { 2, 1, 0, 2, 124, 30, },
-+    { 1, 1, 0, 2, 124, 30, },
-+    { 0, 1, 0, 2, 128, 32, },
-+    { 2, 1, 0, 2, 128, 30, },
-+    { 1, 1, 0, 2, 128, 30, },
-+    { 0, 1, 0, 2, 132, 32, },
-+    { 2, 1, 0, 2, 132, 30, },
-+    { 1, 1, 0, 2, 132, 30, },
-+    { 0, 1, 0, 2, 136, 32, },
-+    { 2, 1, 0, 2, 136, 30, },
-+    { 1, 1, 0, 2, 136, 30, },
-+    { 0, 1, 0, 2, 140, 32, },
-+    { 2, 1, 0, 2, 140, 30, },
-+    { 1, 1, 0, 2, 140, 30, },
-+    { 0, 1, 0, 2, 149, 32, },
-+    { 2, 1, 0, 2, 149, 30, },
-+    { 1, 1, 0, 2, 149, 63, },
-+    { 0, 1, 0, 2, 153, 32, },
-+    { 2, 1, 0, 2, 153, 30, },
-+    { 1, 1, 0, 2, 153, 63, },
-+    { 0, 1, 0, 2, 157, 32, },
-+    { 2, 1, 0, 2, 157, 30, },
-+    { 1, 1, 0, 2, 157, 63, },
-+    { 0, 1, 0, 2, 161, 32, },
-+    { 2, 1, 0, 2, 161, 30, },
-+    { 1, 1, 0, 2, 161, 63, },
-+    { 0, 1, 0, 2, 165, 32, },
-+    { 2, 1, 0, 2, 165, 30, },
-+    { 1, 1, 0, 2, 165, 63, },
-+    { 0, 1, 0, 3, 36, 28, },
-+    { 2, 1, 0, 3, 36, 30, },
-+    { 1, 1, 0, 3, 36, 30, },
-+    { 0, 1, 0, 3, 40, 28, },
-+    { 2, 1, 0, 3, 40, 30, },
-+    { 1, 1, 0, 3, 40, 30, },
-+    { 0, 1, 0, 3, 44, 28, },
-+    { 2, 1, 0, 3, 44, 30, },
-+    { 1, 1, 0, 3, 44, 30, },
-+    { 0, 1, 0, 3, 48, 28, },
-+    { 2, 1, 0, 3, 48, 30, },
-+    { 1, 1, 0, 3, 48, 30, },
-+    { 0, 1, 0, 3, 52, 34, },
-+    { 2, 1, 0, 3, 52, 30, },
-+    { 1, 1, 0, 3, 52, 30, },
-+    { 0, 1, 0, 3, 56, 32, },
-+    { 2, 1, 0, 3, 56, 30, },
-+    { 1, 1, 0, 3, 56, 30, },
-+    { 0, 1, 0, 3, 60, 30, },
-+    { 2, 1, 0, 3, 60, 30, },
-+    { 1, 1, 0, 3, 60, 30, },
-+    { 0, 1, 0, 3, 64, 26, },
-+    { 2, 1, 0, 3, 64, 30, },
-+    { 1, 1, 0, 3, 64, 30, },
-+    { 0, 1, 0, 3, 100, 28, },
-+    { 2, 1, 0, 3, 100, 30, },
-+    { 1, 1, 0, 3, 100, 30, },
-+    { 0, 1, 0, 3, 104, 28, },
-+    { 2, 1, 0, 3, 104, 30, },
-+    { 1, 1, 0, 3, 104, 30, },
-+    { 0, 1, 0, 3, 108, 30, },
-+    { 2, 1, 0, 3, 108, 30, },
-+    { 1, 1, 0, 3, 108, 30, },
-+    { 0, 1, 0, 3, 112, 32, },
-+    { 2, 1, 0, 3, 112, 30, },
-+    { 1, 1, 0, 3, 112, 30, },
-+    { 0, 1, 0, 3, 116, 32, },
-+    { 2, 1, 0, 3, 116, 30, },
-+    { 1, 1, 0, 3, 116, 30, },
-+    { 0, 1, 0, 3, 120, 34, },
-+    { 2, 1, 0, 3, 120, 30, },
-+    { 1, 1, 0, 3, 120, 30, },
-+    { 0, 1, 0, 3, 124, 32, },
-+    { 2, 1, 0, 3, 124, 30, },
-+    { 1, 1, 0, 3, 124, 30, },
-+    { 0, 1, 0, 3, 128, 30, },
-+    { 2, 1, 0, 3, 128, 30, },
-+    { 1, 1, 0, 3, 128, 30, },
-+    { 0, 1, 0, 3, 132, 28, },
-+    { 2, 1, 0, 3, 132, 30, },
-+    { 1, 1, 0, 3, 132, 30, },
-+    { 0, 1, 0, 3, 136, 28, },
-+    { 2, 1, 0, 3, 136, 30, },
-+    { 1, 1, 0, 3, 136, 30, },
-+    { 0, 1, 0, 3, 140, 26, },
-+    { 2, 1, 0, 3, 140, 30, },
-+    { 1, 1, 0, 3, 140, 30, },
-+    { 0, 1, 0, 3, 149, 34, },
-+    { 2, 1, 0, 3, 149, 30, },
-+    { 1, 1, 0, 3, 149, 63, },
-+    { 0, 1, 0, 3, 153, 34, },
-+    { 2, 1, 0, 3, 153, 30, },
-+    { 1, 1, 0, 3, 153, 63, },
-+    { 0, 1, 0, 3, 157, 34, },
-+    { 2, 1, 0, 3, 157, 30, },
-+    { 1, 1, 0, 3, 157, 63, },
-+    { 0, 1, 0, 3, 161, 34, },
-+    { 2, 1, 0, 3, 161, 30, },
-+    { 1, 1, 0, 3, 161, 63, },
-+    { 0, 1, 0, 3, 165, 34, },
-+    { 2, 1, 0, 3, 165, 30, },
-+    { 1, 1, 0, 3, 165, 63, },
-+    { 0, 1, 1, 2, 38, 26, },
-+    { 2, 1, 1, 2, 38, 30, },
-+    { 1, 1, 1, 2, 38, 30, },
-+    { 0, 1, 1, 2, 46, 32, },
-+    { 2, 1, 1, 2, 46, 30, },
-+    { 1, 1, 1, 2, 46, 30, },
-+    { 0, 1, 1, 2, 54, 32, },
-+    { 2, 1, 1, 2, 54, 30, },
-+    { 1, 1, 1, 2, 54, 30, },
-+    { 0, 1, 1, 2, 62, 24, },
-+    { 2, 1, 1, 2, 62, 30, },
-+    { 1, 1, 1, 2, 62, 30, },
-+    { 0, 1, 1, 2, 102, 24, },
-+    { 2, 1, 1, 2, 102, 30, },
-+    { 1, 1, 1, 2, 102, 30, },
-+    { 0, 1, 1, 2, 110, 32, },
-+    { 2, 1, 1, 2, 110, 30, },
-+    { 1, 1, 1, 2, 110, 30, },
-+    { 0, 1, 1, 2, 118, 32, },
-+    { 2, 1, 1, 2, 118, 30, },
-+    { 1, 1, 1, 2, 118, 30, },
-+    { 0, 1, 1, 2, 126, 32, },
-+    { 2, 1, 1, 2, 126, 30, },
-+    { 1, 1, 1, 2, 126, 30, },
-+    { 0, 1, 1, 2, 134, 32, },
-+    { 2, 1, 1, 2, 134, 30, },
-+    { 1, 1, 1, 2, 134, 30, },
-+    { 0, 1, 1, 2, 151, 30, },
-+    { 2, 1, 1, 2, 151, 30, },
-+    { 1, 1, 1, 2, 151, 63, },
-+    { 0, 1, 1, 2, 159, 32, },
-+    { 2, 1, 1, 2, 159, 30, },
-+    { 1, 1, 1, 2, 159, 63, },
-+    { 0, 1, 1, 3, 38, 28, },
-+    { 2, 1, 1, 3, 38, 30, },
-+    { 1, 1, 1, 3, 38, 30, },
-+    { 0, 1, 1, 3, 46, 28, },
-+    { 2, 1, 1, 3, 46, 30, },
-+    { 1, 1, 1, 3, 46, 30, },
-+    { 0, 1, 1, 3, 54, 30, },
-+    { 2, 1, 1, 3, 54, 30, },
-+    { 1, 1, 1, 3, 54, 30, },
-+    { 0, 1, 1, 3, 62, 30, },
-+    { 2, 1, 1, 3, 62, 30, },
-+    { 1, 1, 1, 3, 62, 30, },
-+    { 0, 1, 1, 3, 102, 26, },
-+    { 2, 1, 1, 3, 102, 30, },
-+    { 1, 1, 1, 3, 102, 30, },
-+    { 0, 1, 1, 3, 110, 30, },
-+    { 2, 1, 1, 3, 110, 30, },
-+    { 1, 1, 1, 3, 110, 30, },
-+    { 0, 1, 1, 3, 118, 34, },
-+    { 2, 1, 1, 3, 118, 30, },
-+    { 1, 1, 1, 3, 118, 30, },
-+    { 0, 1, 1, 3, 126, 32, },
-+    { 2, 1, 1, 3, 126, 30, },
-+    { 1, 1, 1, 3, 126, 30, },
-+    { 0, 1, 1, 3, 134, 30, },
-+    { 2, 1, 1, 3, 134, 30, },
-+    { 1, 1, 1, 3, 134, 30, },
-+    { 0, 1, 1, 3, 151, 34, },
-+    { 2, 1, 1, 3, 151, 30, },
-+    { 1, 1, 1, 3, 151, 63, },
-+    { 0, 1, 1, 3, 159, 34, },
-+    { 2, 1, 1, 3, 159, 30, },
-+    { 1, 1, 1, 3, 159, 63, },
-+    { 0, 1, 2, 4, 42, 22, },
-+    { 2, 1, 2, 4, 42, 30, },
-+    { 1, 1, 2, 4, 42, 30, },
-+    { 0, 1, 2, 4, 58, 20, },
-+    { 2, 1, 2, 4, 58, 30, },
-+    { 1, 1, 2, 4, 58, 30, },
-+    { 0, 1, 2, 4, 106, 20, },
-+    { 2, 1, 2, 4, 106, 30, },
-+    { 1, 1, 2, 4, 106, 30, },
-+    { 0, 1, 2, 4, 122, 20, },
-+    { 2, 1, 2, 4, 122, 30, },
-+    { 1, 1, 2, 4, 122, 30, },
-+    { 0, 1, 2, 4, 155, 28, },
-+    { 2, 1, 2, 4, 155, 30, },
-+    { 1, 1, 2, 4, 155, 63, },
-+    { 0, 1, 2, 5, 42, 28, },
-+    { 2, 1, 2, 5, 42, 30, },
-+    { 1, 1, 2, 5, 42, 30, },
-+    { 0, 1, 2, 5, 58, 26, },
-+    { 2, 1, 2, 5, 58, 30, },
-+    { 1, 1, 2, 5, 58, 30, },
-+    { 0, 1, 2, 5, 106, 28, },
-+    { 2, 1, 2, 5, 106, 30, },
-+    { 1, 1, 2, 5, 106, 30, },
-+    { 0, 1, 2, 5, 122, 32, },
-+    { 2, 1, 2, 5, 122, 30, },
-+    { 1, 1, 2, 5, 122, 30, },
-+    { 0, 1, 2, 5, 155, 34, },
-+    { 2, 1, 2, 5, 155, 30, },
-+    { 1, 1, 2, 5, 155, 63, },
-+};
-+
-+RTW_DECL_TABLE_TXPWR_LMT(rtw8821a_txpwr_lmt);
-+
-+static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821a[] = {
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
-+    {0x0086,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_SDIO,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0086,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_SDIO,
-+     RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
-+    {0x004A,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
-+    {0x0023,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(4), 0},
-+    {0x0301,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821a[] = {
-+    {0x0020,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0067,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(4), 0},
-+    {0x0001,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
-+    {0x0000,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(5), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(4) | BIT(3) | BIT(2), 0},
-+    {0x0075,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0006,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
-+    {0x0075,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0006,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(7), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(4) | BIT(3), 0},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(0), 0},
-+    {0x004F,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0067,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(5) | BIT(4), BIT(5) | BIT(4)},
-+    {0x0025,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(6), 0},
-+    {0x0049,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x0063,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x0062,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0058,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x005A,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x002E,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x82},
-+    {0x0010,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_act_to_lps_8821a[] = {
-+    {0x0301,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
-+    {0x0522,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
-+    {0x05F8,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05F9,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05FA,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x05FB,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, 0xFF, 0},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
-+    {0x0002,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0100,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x03},
-+    {0x0101,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0093,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x00},
-+    {0x0553,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821a[] = {
-+    {0x001F,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0},
-+    {0x004F,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0x0049,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), 0},
-+    {0x0006,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_POLLING, BIT(1), 0},
-+    {0x0000,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
-+    {0x0020,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 0},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821a[] = {
-+    {0x0007,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, 0xFF, 0x20},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
-+    {0x0005,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_PCI_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
-+    {0x004A,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_USB_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(0), 1},
-+    {0x0023,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_MAC,
-+     RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
-+    {0x0086,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_SDIO,
-+     RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
-+    {0x0086,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_SDIO_MSK,
-+     RTW_PWR_ADDR_SDIO,
-+     RTW_PWR_CMD_POLLING, BIT(1), 0},
-+    {0xFFFF,
-+     RTW_PWR_CUT_ALL_MSK,
-+     RTW_PWR_INTF_ALL_MSK,
-+     0,
-+     RTW_PWR_CMD_END, 0, 0},
-+};
-+
-+const struct rtw_pwr_seq_cmd * const card_enable_flow_8821a[] = {
-+    trans_carddis_to_cardemu_8821a,
-+    trans_cardemu_to_act_8821a,
-+    NULL
-+};
-+
-+const struct rtw_pwr_seq_cmd * const enter_lps_flow_8821a[] = {
-+    trans_act_to_lps_8821a,
-+    NULL
-+};
-+
-+const struct rtw_pwr_seq_cmd * const card_disable_flow_8821a[] = {
-+    trans_act_to_cardemu_8821a,
-+    trans_cardemu_to_carddis_8821a,
-+    NULL
-+};
-+
-+static const u8 rtw8821a_pwrtrk_5gb_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+};
-+
-+static const u8 rtw8821a_pwrtrk_5gb_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+};
-+
-+static const u8 rtw8821a_pwrtrk_5ga_n[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+};
-+
-+static const u8 rtw8821a_pwrtrk_5ga_p[][RTW_PWR_TRK_TBL_SZ] = {
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+    {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15,
-+     15, 16, 16, 16, 16, 16, 16, 16, 16},
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2gb_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2gb_p[] = {
-+    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
-+    8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2ga_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2ga_p[] = {
-+    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
-+    8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2g_cck_b_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2g_cck_b_p[] = {
-+    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
-+    8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2g_cck_a_n[] = {
-+    0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6,
-+    6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10
-+};
-+
-+static const u8 rtw8821a_pwrtrk_2g_cck_a_p[] = {
-+    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
-+    8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12
-+};
-+
-+const struct rtw_pwr_track_tbl rtw8821a_rtw_pwr_track_tbl = {
-+    .pwrtrk_5gb_n[0] = rtw8821a_pwrtrk_5gb_n[0],
-+    .pwrtrk_5gb_n[1] = rtw8821a_pwrtrk_5gb_n[1],
-+    .pwrtrk_5gb_n[2] = rtw8821a_pwrtrk_5gb_n[2],
-+    .pwrtrk_5gb_p[0] = rtw8821a_pwrtrk_5gb_p[0],
-+    .pwrtrk_5gb_p[1] = rtw8821a_pwrtrk_5gb_p[1],
-+    .pwrtrk_5gb_p[2] = rtw8821a_pwrtrk_5gb_p[2],
-+    .pwrtrk_5ga_n[0] = rtw8821a_pwrtrk_5ga_n[0],
-+    .pwrtrk_5ga_n[1] = rtw8821a_pwrtrk_5ga_n[1],
-+    .pwrtrk_5ga_n[2] = rtw8821a_pwrtrk_5ga_n[2],
-+    .pwrtrk_5ga_p[0] = rtw8821a_pwrtrk_5ga_p[0],
-+    .pwrtrk_5ga_p[1] = rtw8821a_pwrtrk_5ga_p[1],
-+    .pwrtrk_5ga_p[2] = rtw8821a_pwrtrk_5ga_p[2],
-+    .pwrtrk_2gb_n = rtw8821a_pwrtrk_2gb_n,
-+    .pwrtrk_2gb_p = rtw8821a_pwrtrk_2gb_p,
-+    .pwrtrk_2ga_n = rtw8821a_pwrtrk_2ga_n,
-+    .pwrtrk_2ga_p = rtw8821a_pwrtrk_2ga_p,
-+    .pwrtrk_2g_cckb_n = rtw8821a_pwrtrk_2g_cck_b_n,
-+    .pwrtrk_2g_cckb_p = rtw8821a_pwrtrk_2g_cck_b_p,
-+    .pwrtrk_2g_ccka_n = rtw8821a_pwrtrk_2g_cck_a_n,
-+    .pwrtrk_2g_ccka_p = rtw8821a_pwrtrk_2g_cck_a_p,
-+};
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a_table.h
-@@ -0,0 +1,21 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#ifndef __RTW8821A_TABLE_H__
-+#define __RTW8821A_TABLE_H__
-+
-+extern const struct rtw_table rtw8821a_mac_tbl;
-+extern const struct rtw_table rtw8821a_agc_tbl;
-+extern const struct rtw_table rtw8821a_bb_tbl;
-+extern const struct rtw_table rtw8821a_bb_pg_tbl;
-+extern const struct rtw_table rtw8821a_rf_a_tbl;
-+extern const struct rtw_table rtw8821a_txpwr_lmt_tbl;
-+
-+extern const struct rtw_pwr_seq_cmd * const card_enable_flow_8821a[];
-+extern const struct rtw_pwr_seq_cmd * const enter_lps_flow_8821a[];
-+extern const struct rtw_pwr_seq_cmd * const card_disable_flow_8821a[];
-+
-+extern const struct rtw_pwr_track_tbl rtw8821a_rtw_pwr_track_tbl;
-+
-+#endif
diff --git 
a/package/kernel/mac80211/patches/rtl/041-v6.13-wifi-rtw88-Add-rtw88xxa.-c-h.patch 
b/package/kernel/mac80211/patches/rtl/041-v6.13-wifi-rtw88-Add-rtw88xxa.-c-h.patch
deleted file mode 100644
index 79e1deebf795ac..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/041-v6.13-wifi-rtw88-Add-rtw88xxa.-c-h.patch
+++ /dev/null
@@ -1,2187 +0,0 @@
-From b870b9d31c9e4e6b20c410e1e017f8c87d4c2ae0 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:27:39 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw88xxa.{c,h}
-
-These contain code shared by both RTL8821AU and RTL8812AU chips.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/b8590382-a954-412d-a96b-63e360b97acc@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw88xxa.c | 1989 +++++++++++++++++
- drivers/net/wireless/realtek/rtw88/rtw88xxa.h |  175 ++
- 2 files changed, 2164 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw88xxa.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw88xxa.h
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
-@@ -0,0 +1,1989 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include <linux/usb.h>
-+#include "main.h"
-+#include "coex.h"
-+#include "phy.h"
-+#include "rtw88xxa.h"
-+#include "mac.h"
-+#include "reg.h"
-+#include "sec.h"
-+#include "debug.h"
-+#include "bf.h"
-+#include "efuse.h"
-+#include "usb.h"
-+
-+void rtw88xxa_efuse_grant(struct rtw_dev *rtwdev, bool on)
-+{
-+    if (on) {
-+        rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
-+
-+        rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
-+        rtw_write16_set(rtwdev, REG_SYS_CLKR,
-+                BIT_LOADER_CLK_EN | BIT_ANA8M);
-+    } else {
-+        rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
-+    }
-+}
-+EXPORT_SYMBOL(rtw88xxa_efuse_grant);
-+
-+static void rtw8812a_read_amplifier_type(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+
-+    efuse->ext_pa_2g = (efuse->pa_type_2g & BIT(5)) &&
-+               (efuse->pa_type_2g & BIT(4));
-+    efuse->ext_lna_2g = (efuse->lna_type_2g & BIT(7)) &&
-+                (efuse->lna_type_2g & BIT(3));
-+
-+    efuse->ext_pa_5g = (efuse->pa_type_5g & BIT(1)) &&
-+               (efuse->pa_type_5g & BIT(0));
-+    efuse->ext_lna_5g = (efuse->lna_type_5g & BIT(7)) &&
-+                (efuse->lna_type_5g & BIT(3));
-+
-+    /* For rtw_phy_cond2: */
-+    if (efuse->ext_pa_2g) {
-+        u8 ext_type_pa_2g_a = u8_get_bits(efuse->lna_type_2g, BIT(2));
-+        u8 ext_type_pa_2g_b = u8_get_bits(efuse->lna_type_2g, BIT(6));
-+
-+        efuse->gpa_type = (ext_type_pa_2g_b << 2) | ext_type_pa_2g_a;
-+    }
-+
-+    if (efuse->ext_pa_5g) {
-+        u8 ext_type_pa_5g_a = u8_get_bits(efuse->lna_type_5g, BIT(2));
-+        u8 ext_type_pa_5g_b = u8_get_bits(efuse->lna_type_5g, BIT(6));
-+
-+        efuse->apa_type = (ext_type_pa_5g_b << 2) | ext_type_pa_5g_a;
-+    }
-+
-+    if (efuse->ext_lna_2g) {
-+        u8 ext_type_lna_2g_a = u8_get_bits(efuse->lna_type_2g,
-+                           BIT(1) | BIT(0));
-+        u8 ext_type_lna_2g_b = u8_get_bits(efuse->lna_type_2g,
-+                           BIT(5) | BIT(4));
-+
-+        efuse->glna_type = (ext_type_lna_2g_b << 2) | ext_type_lna_2g_a;
-+    }
-+
-+    if (efuse->ext_lna_5g) {
-+        u8 ext_type_lna_5g_a = u8_get_bits(efuse->lna_type_5g,
-+                           BIT(1) | BIT(0));
-+        u8 ext_type_lna_5g_b = u8_get_bits(efuse->lna_type_5g,
-+                           BIT(5) | BIT(4));
-+
-+        efuse->alna_type = (ext_type_lna_5g_b << 2) | ext_type_lna_5g_a;
-+    }
-+}
-+
-+static void rtw8812a_read_rfe_type(struct rtw_dev *rtwdev,
-+                   struct rtw88xxa_efuse *map)
-+{
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+
-+    if (map->rfe_option == 0xff) {
-+        if (rtwdev->hci.type == RTW_HCI_TYPE_USB)
-+            efuse->rfe_option = 0;
-+        else if (rtwdev->hci.type == RTW_HCI_TYPE_PCIE)
-+            efuse->rfe_option = 2;
-+        else
-+            efuse->rfe_option = 4;
-+    } else if (map->rfe_option & BIT(7)) {
-+        if (efuse->ext_lna_5g) {
-+            if (efuse->ext_pa_5g) {
-+                if (efuse->ext_lna_2g && efuse->ext_pa_2g)
-+                    efuse->rfe_option = 3;
-+                else
-+                    efuse->rfe_option = 0;
-+            } else {
-+                efuse->rfe_option = 2;
-+            }
-+        } else {
-+            efuse->rfe_option = 4;
-+        }
-+    } else {
-+        efuse->rfe_option = map->rfe_option & 0x3f;
-+
-+        /* Due to other customer already use incorrect EFUSE map for
-+         * their product. We need to add workaround to prevent to
-+         * modify spec and notify all customer to revise the IC 0xca
-+         * content.
-+         */
-+        if (efuse->rfe_option == 4 &&
-+            (efuse->ext_pa_5g || efuse->ext_pa_2g ||
-+             efuse->ext_lna_5g || efuse->ext_lna_2g)) {
-+            if (rtwdev->hci.type == RTW_HCI_TYPE_USB)
-+                efuse->rfe_option = 0;
-+            else if (rtwdev->hci.type == RTW_HCI_TYPE_PCIE)
-+                efuse->rfe_option = 2;
-+        }
-+    }
-+}
-+
-+static void rtw88xxa_read_usb_type(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    u8 antenna = 0;
-+    u8 wmode = 0;
-+    u8 val8, i;
-+
-+    efuse->hw_cap.bw = BIT(RTW_CHANNEL_WIDTH_20) |
-+               BIT(RTW_CHANNEL_WIDTH_40) |
-+               BIT(RTW_CHANNEL_WIDTH_80);
-+    efuse->hw_cap.ptcl = EFUSE_HW_CAP_PTCL_VHT;
-+
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A)
-+        efuse->hw_cap.nss = 1;
-+    else
-+        efuse->hw_cap.nss = 2;
-+
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A)
-+        goto print_hw_cap;
-+
-+    for (i = 0; i < 2; i++) {
-+        rtw_read8_physical_efuse(rtwdev, 1019 - i, &val8);
-+
-+        antenna = u8_get_bits(val8, GENMASK(7, 5));
-+        if (antenna)
-+            break;
-+        antenna = u8_get_bits(val8, GENMASK(3, 1));
-+        if (antenna)
-+            break;
-+    }
-+
-+    for (i = 0; i < 2; i++) {
-+        rtw_read8_physical_efuse(rtwdev, 1021 - i, &val8);
-+
-+        wmode = u8_get_bits(val8, GENMASK(3, 2));
-+        if (wmode)
-+            break;
-+    }
-+
-+    if (antenna == 1) {
-+        rtw_info(rtwdev, "This RTL8812AU says it is 1T1R.\n");
-+
-+        efuse->hw_cap.nss = 1;
-+        hal->rf_type = RF_1T1R;
-+        hal->rf_path_num = 1;
-+        hal->rf_phy_num = 1;
-+        hal->antenna_tx = BB_PATH_A;
-+        hal->antenna_rx = BB_PATH_A;
-+    } else {
-+        /* Override rtw_chip_parameter_setup(). It detects 8812au as 
1T1R. */
-+        efuse->hw_cap.nss = 2;
-+        hal->rf_type = RF_2T2R;
-+        hal->rf_path_num = 2;
-+        hal->rf_phy_num = 2;
-+        hal->antenna_tx = BB_PATH_AB;
-+        hal->antenna_rx = BB_PATH_AB;
-+
-+        if (antenna == 2 && wmode == 2) {
-+            rtw_info(rtwdev, "This RTL8812AU says it can't do VHT.\n");
-+
-+            /* Can't be EFUSE_HW_CAP_IGNORE and can't be
-+             * EFUSE_HW_CAP_PTCL_VHT, so make it 1.
-+             */
-+            efuse->hw_cap.ptcl = 1;
-+            efuse->hw_cap.bw &= ~BIT(RTW_CHANNEL_WIDTH_80);
-+        }
-+    }
-+
-+print_hw_cap:
-+    rtw_dbg(rtwdev, RTW_DBG_EFUSE,
-+        "hw cap: hci=0x%02x, bw=0x%02x, ptcl=0x%02x, ant_num=%d, 
nss=%d\n",
-+        efuse->hw_cap.hci, efuse->hw_cap.bw, efuse->hw_cap.ptcl,
-+        efuse->hw_cap.ant_num, efuse->hw_cap.nss);
-+}
-+
-+int rtw88xxa_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    struct rtw88xxa_efuse *map;
-+    int i;
-+
-+    if (chip->id == RTW_CHIP_TYPE_8812A)
-+        rtwdev->hal.cut_version += 1;
-+
-+    if (rtw_dbg_is_enabled(rtwdev, RTW_DBG_EFUSE))
-+        print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
-+                   log_map, chip->log_efuse_size, true);
-+
-+    map = (struct rtw88xxa_efuse *)log_map;
-+
-+    efuse->rf_board_option = map->rf_board_option;
-+    efuse->crystal_cap = map->xtal_k;
-+    if (efuse->crystal_cap == 0xff)
-+        efuse->crystal_cap = 0x20;
-+    efuse->pa_type_2g = map->pa_type;
-+    efuse->pa_type_5g = map->pa_type;
-+    efuse->lna_type_2g = map->lna_type_2g;
-+    efuse->lna_type_5g = map->lna_type_5g;
-+    if (chip->id == RTW_CHIP_TYPE_8812A) {
-+        rtw8812a_read_amplifier_type(rtwdev);
-+        rtw8812a_read_rfe_type(rtwdev, map);
-+
-+        efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(1));
-+    }
-+    efuse->channel_plan = map->channel_plan;
-+    efuse->country_code[0] = map->country_code[0];
-+    efuse->country_code[1] = map->country_code[1];
-+    efuse->bt_setting = map->rf_bt_setting;
-+    efuse->regd = map->rf_board_option & 0x7;
-+    efuse->thermal_meter[0] = map->thermal_meter;
-+    efuse->thermal_meter[1] = map->thermal_meter;
-+    efuse->thermal_meter_k = map->thermal_meter;
-+    efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g;
-+    efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g;
-+
-+    rtw88xxa_read_usb_type(rtwdev);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8821A)
-+        efuse->btcoex = rtw_read32_mask(rtwdev, REG_WL_BT_PWR_CTRL,
-+                        BIT_BT_FUNC_EN);
-+    else
-+        efuse->btcoex = (map->rf_board_option & 0xe0) == 0x20;
-+    efuse->share_ant = !!(efuse->bt_setting & BIT(0));
-+
-+    /* No antenna diversity because it's disabled in the vendor driver */
-+    efuse->ant_div_cfg = 0;
-+
-+    efuse->ant_div_type = map->rf_antenna_option;
-+    if (efuse->ant_div_type == 0xff)
-+        efuse->ant_div_type = 0x3;
-+
-+    for (i = 0; i < 4; i++)
-+        efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
-+
-+    switch (rtw_hci_type(rtwdev)) {
-+    case RTW_HCI_TYPE_USB:
-+        if (chip->id == RTW_CHIP_TYPE_8821A)
-+            ether_addr_copy(efuse->addr, map->rtw8821au.mac_addr);
-+        else
-+            ether_addr_copy(efuse->addr, map->rtw8812au.mac_addr);
-+        break;
-+    case RTW_HCI_TYPE_PCIE:
-+    case RTW_HCI_TYPE_SDIO:
-+    default:
-+        /* unsupported now */
-+        return -EOPNOTSUPP;
-+    }
-+
-+    return 0;
-+}
-+EXPORT_SYMBOL(rtw88xxa_read_efuse);
-+
-+static void rtw88xxa_reset_8051(struct rtw_dev *rtwdev)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    u8 val8;
-+
-+    /* Reset MCU IO Wrapper */
-+    rtw_write8_clr(rtwdev, REG_RSV_CTRL, BIT(1));
-+    if (chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw_write8_clr(rtwdev, REG_RSV_CTRL + 1, BIT(3));
-+    else
-+        rtw_write8_clr(rtwdev, REG_RSV_CTRL + 1, BIT(0));
-+
-+    val8 = rtw_read8(rtwdev, REG_SYS_FUNC_EN + 1);
-+    rtw_write8(rtwdev, REG_SYS_FUNC_EN + 1, val8 & ~BIT(2));
-+
-+    /* Enable MCU IO Wrapper */
-+    rtw_write8_clr(rtwdev, REG_RSV_CTRL, BIT(1));
-+    if (chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw_write8_set(rtwdev, REG_RSV_CTRL + 1, BIT(3));
-+    else
-+        rtw_write8_set(rtwdev, REG_RSV_CTRL + 1, BIT(0));
-+
-+    rtw_write8(rtwdev, REG_SYS_FUNC_EN + 1, val8 | BIT(2));
-+}
-+
-+/* A lightweight deinit function */
-+static void rtw88xxau_hw_reset(struct rtw_dev *rtwdev)
-+{
-+    u8 val8;
-+
-+    if (!(rtw_read8(rtwdev, REG_MCUFW_CTRL) & BIT_RAM_DL_SEL))
-+        return;
-+
-+    rtw88xxa_reset_8051(rtwdev);
-+    rtw_write8(rtwdev, REG_MCUFW_CTRL, 0x00);
-+
-+    /* before BB reset should do clock gated */
-+    rtw_write32_set(rtwdev, REG_FPGA0_XCD_RF_PARA, BIT(6));
-+
-+    /* reset BB */
-+    rtw_write8_clr(rtwdev, REG_SYS_FUNC_EN, BIT(0) | BIT(1));
-+
-+    /* reset RF */
-+    rtw_write8(rtwdev, REG_RF_CTRL, 0);
-+
-+    /* reset TRX path */
-+    rtw_write16(rtwdev, REG_CR, 0);
-+
-+    /* reset MAC, reg0x5[1], auto FSM off */
-+    rtw_write8_set(rtwdev, REG_APS_FSMCO + 1, APS_FSMCO_MAC_OFF >> 8);
-+
-+    /* check if reg0x5[1] auto cleared */
-+    if (read_poll_timeout_atomic(rtw_read8, val8,
-+                     !(val8 & (APS_FSMCO_MAC_OFF >> 8)),
-+                     1, 5000, false,
-+                     rtwdev, REG_APS_FSMCO + 1))
-+        rtw_err(rtwdev, "%s: timed out waiting for 0x5[1]\n", __func__);
-+
-+    /* reg0x5[0], auto FSM on */
-+    val8 |= APS_FSMCO_MAC_ENABLE >> 8;
-+    rtw_write8(rtwdev, REG_APS_FSMCO + 1, val8);
-+
-+    rtw_write8_clr(rtwdev, REG_SYS_FUNC_EN + 1, BIT(4) | BIT(7));
-+    rtw_write8_set(rtwdev, REG_SYS_FUNC_EN + 1, BIT(4) | BIT(7));
-+}
-+
-+static int rtw88xxau_init_power_on(struct rtw_dev *rtwdev)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    u16 val16;
-+    int ret;
-+
-+    ret = rtw_pwr_seq_parser(rtwdev, chip->pwr_on_seq);
-+    if (ret) {
-+        rtw_err(rtwdev, "power on flow failed\n");
-+        return ret;
-+    }
-+
-+    rtw_write16(rtwdev, REG_CR, 0);
-+    val16 = BIT_HCI_TXDMA_EN | BIT_HCI_RXDMA_EN | BIT_TXDMA_EN |
-+        BIT_RXDMA_EN | BIT_PROTOCOL_EN | BIT_SCHEDULE_EN |
-+        BIT_MAC_SEC_EN | BIT_32K_CAL_TMR_EN;
-+    rtw_write16_set(rtwdev, REG_CR, val16);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8821A) {
-+        if (rtw_read8(rtwdev, REG_SYS_CFG1 + 3) & BIT(0))
-+            rtw_write8_set(rtwdev, REG_LDO_SWR_CTRL, BIT(6));
-+    }
-+
-+    return ret;
-+}
-+
-+static int rtw88xxa_llt_write(struct rtw_dev *rtwdev, u32 address, u32 
data)
-+{
-+    u32 value = BIT_LLT_WRITE_ACCESS | (address << 8) | data;
-+    int count = 0;
-+
-+    rtw_write32(rtwdev, REG_LLT_INIT, value);
-+
-+    do {
-+        if (!rtw_read32_mask(rtwdev, REG_LLT_INIT, BIT(31) | BIT(30)))
-+            break;
-+
-+        if (count > 20) {
-+            rtw_err(rtwdev, "Failed to poll write LLT done at %d!\n",
-+                address);
-+            return -EBUSY;
-+        }
-+    } while (++count);
-+
-+    return 0;
-+}
-+
-+static int rtw88xxa_llt_init(struct rtw_dev *rtwdev, u32 boundary)
-+{
-+    u32 last_entry = 255;
-+    int status = 0;
-+    u32 i;
-+
-+    for (i = 0; i < boundary - 1; i++) {
-+        status = rtw88xxa_llt_write(rtwdev, i, i + 1);
-+        if (status)
-+            return status;
-+    }
-+
-+    status = rtw88xxa_llt_write(rtwdev, boundary - 1, 0xFF);
-+    if (status)
-+        return status;
-+
-+    for (i = boundary; i < last_entry; i++) {
-+        status = rtw88xxa_llt_write(rtwdev, i, i + 1);
-+        if (status)
-+            return status;
-+    }
-+
-+    status = rtw88xxa_llt_write(rtwdev, last_entry, boundary);
-+
-+    return status;
-+}
-+
-+static void rtw88xxau_init_queue_reserved_page(struct rtw_dev *rtwdev)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    struct rtw_fifo_conf *fifo = &rtwdev->fifo;
-+    const struct rtw_page_table *pg_tbl = NULL;
-+    u16 pubq_num;
-+    u32 val32;
-+
-+    switch (rtw_hci_type(rtwdev)) {
-+    case RTW_HCI_TYPE_PCIE:
-+        pg_tbl = &chip->page_table[1];
-+        break;
-+    case RTW_HCI_TYPE_USB:
-+        if (rtwdev->hci.bulkout_num == 2)
-+            pg_tbl = &chip->page_table[2];
-+        else if (rtwdev->hci.bulkout_num == 3)
-+            pg_tbl = &chip->page_table[3];
-+        else if (rtwdev->hci.bulkout_num == 4)
-+            pg_tbl = &chip->page_table[4];
-+        break;
-+    case RTW_HCI_TYPE_SDIO:
-+        pg_tbl = &chip->page_table[0];
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    pubq_num = fifo->acq_pg_num - pg_tbl->hq_num - pg_tbl->lq_num -
-+           pg_tbl->nq_num - pg_tbl->exq_num - pg_tbl->gapq_num;
-+
-+    val32 = BIT_RQPN_NE(pg_tbl->nq_num, pg_tbl->exq_num);
-+    rtw_write32(rtwdev, REG_RQPN_NPQ, val32);
-+
-+    val32 = BIT_RQPN_HLP(pg_tbl->hq_num, pg_tbl->lq_num, pubq_num);
-+    rtw_write32(rtwdev, REG_RQPN, val32);
-+}
-+
-+static void rtw88xxau_init_tx_buffer_boundary(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_fifo_conf *fifo = &rtwdev->fifo;
-+
-+    rtw_write8(rtwdev, REG_BCNQ_BDNY, fifo->rsvd_boundary);
-+    rtw_write8(rtwdev, REG_MGQ_BDNY, fifo->rsvd_boundary);
-+    rtw_write8(rtwdev, REG_WMAC_LBK_BF_HD, fifo->rsvd_boundary);
-+    rtw_write8(rtwdev, REG_TRXFF_BNDY, fifo->rsvd_boundary);
-+    rtw_write8(rtwdev, REG_DWBCN0_CTRL + 1, fifo->rsvd_boundary);
-+}
-+
-+static int rtw88xxau_init_queue_priority(struct rtw_dev *rtwdev)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    u8 bulkout_num = rtwdev->hci.bulkout_num;
-+    const struct rtw_rqpn *rqpn = NULL;
-+    u16 txdma_pq_map;
-+
-+    switch (rtw_hci_type(rtwdev)) {
-+    case RTW_HCI_TYPE_PCIE:
-+        rqpn = &chip->rqpn_table[1];
-+        break;
-+    case RTW_HCI_TYPE_USB:
-+        if (bulkout_num == 2)
-+            rqpn = &chip->rqpn_table[2];
-+        else if (bulkout_num == 3)
-+            rqpn = &chip->rqpn_table[3];
-+        else if (bulkout_num == 4)
-+            rqpn = &chip->rqpn_table[4];
-+        else
-+            return -EINVAL;
-+        break;
-+    case RTW_HCI_TYPE_SDIO:
-+        rqpn = &chip->rqpn_table[0];
-+        break;
-+    default:
-+        return -EINVAL;
-+    }
-+
-+    rtwdev->fifo.rqpn = rqpn;
-+
-+    txdma_pq_map = rtw_read16(rtwdev, REG_TXDMA_PQ_MAP) & 0x7;
-+    txdma_pq_map |= BIT_TXDMA_HIQ_MAP(rqpn->dma_map_hi);
-+    txdma_pq_map |= BIT_TXDMA_MGQ_MAP(rqpn->dma_map_mg);
-+    txdma_pq_map |= BIT_TXDMA_BKQ_MAP(rqpn->dma_map_bk);
-+    txdma_pq_map |= BIT_TXDMA_BEQ_MAP(rqpn->dma_map_be);
-+    txdma_pq_map |= BIT_TXDMA_VIQ_MAP(rqpn->dma_map_vi);
-+    txdma_pq_map |= BIT_TXDMA_VOQ_MAP(rqpn->dma_map_vo);
-+    rtw_write16(rtwdev, REG_TXDMA_PQ_MAP, txdma_pq_map);
-+
-+    /* Packet in Hi Queue Tx immediately (No constraint for ATIM 
Period). */
-+    if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB && bulkout_num == 4)
-+        rtw_write8(rtwdev, REG_HIQ_NO_LMT_EN, 0xff);
-+
-+    return 0;
-+}
-+
-+static void rtw88xxa_init_wmac_setting(struct rtw_dev *rtwdev)
-+{
-+    rtw_write16(rtwdev, REG_RXFLTMAP0, 0xffff);
-+    rtw_write16(rtwdev, REG_RXFLTMAP1, 0x0400);
-+    rtw_write16(rtwdev, REG_RXFLTMAP2, 0xffff);
-+
-+    rtw_write32(rtwdev, REG_MAR, 0xffffffff);
-+    rtw_write32(rtwdev, REG_MAR + 4, 0xffffffff);
-+}
-+
-+static void rtw88xxa_init_adaptive_ctrl(struct rtw_dev *rtwdev)
-+{
-+    rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, 0xffff1);
-+    rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030);
-+}
-+
-+static void rtw88xxa_init_edca(struct rtw_dev *rtwdev)
-+{
-+    rtw_write16(rtwdev, REG_SPEC_SIFS, 0x100a);
-+    rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, 0x100a);
-+
-+    rtw_write16(rtwdev, REG_SIFS, 0x100a);
-+    rtw_write16(rtwdev, REG_SIFS + 2, 0x100a);
-+
-+    rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B);
-+    rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F);
-+    rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324);
-+    rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226);
-+
-+    rtw_write8(rtwdev, REG_USTIME_TSF, 0x50);
-+    rtw_write8(rtwdev, REG_USTIME_EDCA, 0x50);
-+}
-+
-+static void rtw88xxau_tx_aggregation(struct rtw_dev *rtwdev)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+
-+    rtw_write32_mask(rtwdev, REG_DWBCN0_CTRL, 0xf0,
-+             chip->usb_tx_agg_desc_num);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8821A)
-+        rtw_write8(rtwdev, REG_DWBCN1_CTRL,
-+               chip->usb_tx_agg_desc_num << 1);
-+}
-+
-+static void rtw88xxa_init_beacon_parameters(struct rtw_dev *rtwdev)
-+{
-+    u16 val16;
-+
-+    val16 = (BIT_DIS_TSF_UDT << 8) | BIT_DIS_TSF_UDT;
-+    if (rtwdev->efuse.btcoex)
-+        val16 |= BIT_EN_BCN_FUNCTION;
-+    rtw_write16(rtwdev, REG_BCN_CTRL, val16);
-+
-+    rtw_write32_mask(rtwdev, REG_TBTT_PROHIBIT, 0xfffff, WLAN_TBTT_TIME);
-+    rtw_write8(rtwdev, REG_DRVERLYINT, 0x05);
-+    rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
-+    rtw_write16(rtwdev, REG_BCNTCFG, 0x4413);
-+}
-+
-+static void rtw88xxa_phy_bb_config(struct rtw_dev *rtwdev)
-+{
-+    u8 val8, crystal_cap;
-+
-+    /* power on BB/RF domain */
-+    val8 = rtw_read8(rtwdev, REG_SYS_FUNC_EN);
-+    val8 |= BIT_FEN_USBA;
-+    rtw_write8(rtwdev, REG_SYS_FUNC_EN, val8);
-+
-+    /* toggle BB reset */
-+    val8 |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST;
-+    rtw_write8(rtwdev, REG_SYS_FUNC_EN, val8);
-+
-+    rtw_write8(rtwdev, REG_RF_CTRL,
-+           BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
-+    rtw_write8(rtwdev, REG_RF_B_CTRL,
-+           BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
-+
-+    rtw_load_table(rtwdev, rtwdev->chip->bb_tbl);
-+    rtw_load_table(rtwdev, rtwdev->chip->agc_tbl);
-+
-+    crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw_write32_mask(rtwdev, REG_AFE_CTRL3, 0x7FF80000,
-+                 crystal_cap | (crystal_cap << 6));
-+    else
-+        rtw_write32_mask(rtwdev, REG_AFE_CTRL3, 0x00FFF000,
-+                 crystal_cap | (crystal_cap << 6));
-+}
-+
-+static void rtw88xxa_phy_rf_config(struct rtw_dev *rtwdev)
-+{
-+    u8 rf_path;
-+
-+    for (rf_path = 0; rf_path < rtwdev->hal.rf_path_num; rf_path++)
-+        rtw_load_table(rtwdev, rtwdev->chip->rf_tbl[rf_path]);
-+}
-+
-+static void rtw8812a_config_1t(struct rtw_dev *rtwdev)
-+{
-+    /* BB OFDM RX Path_A */
-+    rtw_write32_mask(rtwdev, REG_RXPSEL, 0xff, 0x11);
-+
-+    /* BB OFDM TX Path_A */
-+    rtw_write32_mask(rtwdev, REG_TXPSEL, MASKLWORD, 0x1111);
-+
-+    /* BB CCK R/Rx Path_A */
-+    rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0c000000, 0x0);
-+
-+    /* MCS support */
-+    rtw_write32_mask(rtwdev, REG_RX_MCS_LIMIT, 0xc0000060, 0x4);
-+
-+    /* RF Path_B HSSI OFF */
-+    rtw_write32_mask(rtwdev, REG_3WIRE_SWB, 0xf, 0x4);
-+
-+    /* RF Path_B Power Down */
-+    rtw_write32_mask(rtwdev, REG_LSSI_WRITE_B, MASKDWORD, 0);
-+
-+    /* ADDA Path_B OFF */
-+    rtw_write32_mask(rtwdev, REG_AFE_PWR1_B, MASKDWORD, 0);
-+    rtw_write32_mask(rtwdev, REG_AFE_PWR2_B, MASKDWORD, 0);
-+}
-+
-+static const u32 rtw88xxa_txscale_tbl[] = {
-+    0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
-+    0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
-+    0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
-+    0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
-+};
-+
-+static u32 rtw88xxa_get_bb_swing(struct rtw_dev *rtwdev, u8 band, u8 path)
-+{
-+    static const u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6};
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    u8 tx_bb_swing;
-+
-+    if (band == RTW_BAND_2G)
-+        tx_bb_swing = efuse->tx_bb_swing_setting_2g;
-+    else
-+        tx_bb_swing = efuse->tx_bb_swing_setting_5g;
-+
-+    if (path == RF_PATH_B)
-+        tx_bb_swing >>= 2;
-+    tx_bb_swing &= 0x3;
-+
-+    return swing2setting[tx_bb_swing];
-+}
-+
-+static u8 rtw88xxa_get_swing_index(struct rtw_dev *rtwdev)
-+{
-+    u32 swing, table_value;
-+    u8 i;
-+
-+    swing = rtw88xxa_get_bb_swing(rtwdev, rtwdev->hal.current_band_type,
-+                      RF_PATH_A);
-+
-+    for (i = 0; i < ARRAY_SIZE(rtw88xxa_txscale_tbl); i++) {
-+        table_value = rtw88xxa_txscale_tbl[i];
-+        if (swing == table_value)
-+            return i;
-+    }
-+
-+    return 24;
-+}
-+
-+static void rtw88xxa_pwrtrack_init(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+    u8 path;
-+
-+    dm_info->default_ofdm_index = rtw88xxa_get_swing_index(rtwdev);
-+
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A)
-+        dm_info->default_cck_index = 0;
-+    else
-+        dm_info->default_cck_index = 24;
-+
-+    for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
-+        ewma_thermal_init(&dm_info->avg_thermal[path]);
-+        dm_info->delta_power_index[path] = 0;
-+        dm_info->delta_power_index_last[path] = 0;
-+    }
-+
-+    dm_info->pwr_trk_triggered = false;
-+    dm_info->pwr_trk_init_trigger = true;
-+    dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
-+}
-+
-+void rtw88xxa_power_off(struct rtw_dev *rtwdev,
-+            const struct rtw_pwr_seq_cmd *const *enter_lps_flow)
-+{
-+    struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
-+    enum usb_device_speed speed = rtwusb->udev->speed;
-+    u16 ori_fsmc0;
-+    u8 reg_cr;
-+
-+    reg_cr = rtw_read8(rtwdev, REG_CR);
-+
-+    /* Already powered off */
-+    if (reg_cr == 0 || reg_cr == 0xEA)
-+        return;
-+
-+    rtw_hci_stop(rtwdev);
-+
-+    if (!rtwdev->efuse.btcoex)
-+        rtw_write16_clr(rtwdev, REG_GPIO_MUXCFG, BIT_EN_SIC);
-+
-+    /* set Reg 0xf008[3:4] to 2'11 to enable U1/U2 Mode in USB3.0. */
-+    if (speed == USB_SPEED_SUPER)
-+        rtw_write8_set(rtwdev, REG_USB_MOD, 0x18);
-+
-+    rtw_write32(rtwdev, REG_HISR0, 0xffffffff);
-+    rtw_write32(rtwdev, REG_HISR1, 0xffffffff);
-+    rtw_write32(rtwdev, REG_HIMR0, 0);
-+    rtw_write32(rtwdev, REG_HIMR1, 0);
-+
-+    if (rtwdev->efuse.btcoex)
-+        rtw_coex_power_off_setting(rtwdev);
-+
-+    ori_fsmc0 = rtw_read16(rtwdev, REG_APS_FSMCO);
-+    rtw_write16(rtwdev, REG_APS_FSMCO, ori_fsmc0 & 
~APS_FSMCO_HW_POWERDOWN);
-+
-+    /* Stop Tx Report Timer. */
-+    rtw_write8_clr(rtwdev, REG_TX_RPT_CTRL, BIT(1));
-+
-+    /* Stop Rx */
-+    rtw_write8(rtwdev, REG_CR, 0);
-+
-+    rtw_pwr_seq_parser(rtwdev, enter_lps_flow);
-+
-+    if (rtw_read8(rtwdev, REG_MCUFW_CTRL) & BIT_RAM_DL_SEL)
-+        rtw88xxa_reset_8051(rtwdev);
-+
-+    rtw_write8_clr(rtwdev, REG_SYS_FUNC_EN + 1, BIT(2));
-+    rtw_write8(rtwdev, REG_MCUFW_CTRL, 0);
-+
-+    rtw_pwr_seq_parser(rtwdev, rtwdev->chip->pwr_off_seq);
-+
-+    if (ori_fsmc0 & APS_FSMCO_HW_POWERDOWN)
-+        rtw_write16_set(rtwdev, REG_APS_FSMCO, APS_FSMCO_HW_POWERDOWN);
-+
-+    clear_bit(RTW_FLAG_POWERON, rtwdev->flags);
-+}
-+EXPORT_SYMBOL(rtw88xxa_power_off);
-+
-+static void rtw88xxa_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 band)
-+{
-+    rtw_write32_mask(rtwdev, REG_TXSCALE_A, BB_SWING_MASK,
-+             rtw88xxa_get_bb_swing(rtwdev, band, RF_PATH_A));
-+    rtw_write32_mask(rtwdev, REG_TXSCALE_B, BB_SWING_MASK,
-+             rtw88xxa_get_bb_swing(rtwdev, band, RF_PATH_B));
-+    rtw88xxa_pwrtrack_init(rtwdev);
-+}
-+
-+static void rtw8821a_set_ext_band_switch(struct rtw_dev *rtwdev, u8 band)
-+{
-+    rtw_write32_mask(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN, 0);
-+    rtw_write32_mask(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL, 1);
-+    rtw_write32_mask(rtwdev, REG_RFE_INV_A, 0xf, 7);
-+    rtw_write32_mask(rtwdev, REG_RFE_INV_A, 0xf0, 7);
-+
-+    if (band == RTW_BAND_2G)
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(29) | BIT(28), 1);
-+    else
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(29) | BIT(28), 2);
-+}
-+
-+static void rtw8821a_phy_set_rfe_reg_24g(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+
-+    /* Turn off RF PA and LNA */
-+
-+    /* 0xCB0[15:12] = 0x7 (LNA_On)*/
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xF000, 0x7);
-+    /* 0xCB0[7:4] = 0x7 (PAPE_A)*/
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xF0, 0x7);
-+
-+    if (efuse->ext_lna_2g) {
-+        /* Turn on 2.4G External LNA */
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(20), 1);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(22), 0);
-+        rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(2, 0), 0x2);
-+        rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(10, 8), 0x2);
-+    } else {
-+        /* Bypass 2.4G External LNA */
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(20), 0);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(22), 0);
-+        rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(2, 0), 0x7);
-+        rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(10, 8), 0x7);
-+    }
-+}
-+
-+static void rtw8821a_phy_set_rfe_reg_5g(struct rtw_dev *rtwdev)
-+{
-+    /* Turn ON RF PA and LNA */
-+
-+    /* 0xCB0[15:12] = 0x7 (LNA_On)*/
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xF000, 0x5);
-+    /* 0xCB0[7:4] = 0x7 (PAPE_A)*/
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xF0, 0x4);
-+
-+    /* Bypass 2.4G External LNA */
-+    rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(20), 0);
-+    rtw_write32_mask(rtwdev, REG_RFE_INV_A, BIT(22), 0);
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(2, 0), 0x7);
-+    rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, GENMASK(10, 8), 0x7);
-+}
-+
-+static void rtw8812a_phy_set_rfe_reg_24g(struct rtw_dev *rtwdev)
-+{
-+    switch (rtwdev->efuse.rfe_option) {
-+    case 0:
-+    case 2:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x000);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        break;
-+    case 1:
-+        if (rtwdev->efuse.btcoex) {
-+            rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xffffff, 
0x777777);
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_A, 0x33f00000, 0x000);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        } else {
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x000);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        }
-+        break;
-+    case 3:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x54337770);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x54337770);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_ANTSEL_SW, 0x00000303, 0x1);
-+        break;
-+    case 4:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x001);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x001);
-+        break;
-+    case 5:
-+        rtw_write8(rtwdev, REG_RFE_PINMUX_A + 2, 0x77);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
-+        rtw_write8_clr(rtwdev, REG_RFE_INV_A + 3, BIT(0));
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        break;
-+    case 6:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x07772770);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x07772770);
-+        rtw_write32(rtwdev, REG_RFE_INV_A, 0x00000077);
-+        rtw_write32(rtwdev, REG_RFE_INV_B, 0x00000077);
-+        break;
-+    default:
-+        break;
-+    }
-+}
-+
-+static void rtw8812a_phy_set_rfe_reg_5g(struct rtw_dev *rtwdev)
-+{
-+    switch (rtwdev->efuse.rfe_option) {
-+    case 0:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77337717);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77337717);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x010);
-+        break;
-+    case 1:
-+        if (rtwdev->efuse.btcoex) {
-+            rtw_write32_mask(rtwdev, REG_RFE_PINMUX_A, 0xffffff, 
0x337717);
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77337717);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_A, 0x33f00000, 0x000);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        } else {
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77337717);
-+            rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77337717);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x000);
-+            rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x000);
-+        }
-+        break;
-+    case 2:
-+    case 4:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77337777);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77337777);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x010);
-+        break;
-+    case 3:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x54337717);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x54337717);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_A, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x010);
-+        rtw_write32_mask(rtwdev, REG_ANTSEL_SW, 0x00000303, 0x1);
-+        break;
-+    case 5:
-+        rtw_write8(rtwdev, REG_RFE_PINMUX_A + 2, 0x33);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77337777);
-+        rtw_write8_set(rtwdev, REG_RFE_INV_A + 3, BIT(0));
-+        rtw_write32_mask(rtwdev, REG_RFE_INV_B, RFE_INV_MASK, 0x010);
-+        break;
-+    case 6:
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x07737717);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x07737717);
-+        rtw_write32(rtwdev, REG_RFE_INV_A, 0x00000077);
-+        rtw_write32(rtwdev, REG_RFE_INV_B, 0x00000077);
-+        break;
-+    default:
-+        break;
-+    }
-+}
-+
-+static void rtw88xxa_switch_band(struct rtw_dev *rtwdev, u8 new_band, 
u8 bw)
-+{
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    u16 basic_rates, reg_41a;
-+
-+    /* 8811au one antenna module doesn't support antenna div, so 
driver must
-+     * control antenna band, otherwise one of the band will have issue
-+     */
-+    if (chip->id == RTW_CHIP_TYPE_8821A && !rtwdev->efuse.btcoex &&
-+        rtwdev->efuse.ant_div_cfg == 0)
-+        rtw8821a_set_ext_band_switch(rtwdev, new_band);
-+
-+    if (new_band == RTW_BAND_2G) {
-+        rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
-+
-+        if (chip->id == RTW_CHIP_TYPE_8821A) {
-+            rtw8821a_phy_set_rfe_reg_24g(rtwdev);
-+
-+            rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0);
-+        } else {
-+            rtw_write32_mask(rtwdev, REG_BWINDICATION, 0x3, 0x1);
-+            rtw_write32_mask(rtwdev, REG_PDMFTH, GENMASK(17, 13), 0x17);
-+
-+            if (bw == RTW_CHANNEL_WIDTH_20 &&
-+                rtwdev->hal.rf_type == RF_1T1R &&
-+                !rtwdev->efuse.ext_lna_2g)
-+                rtw_write32_mask(rtwdev, REG_PDMFTH, GENMASK(3, 1), 0x02);
-+            else
-+                rtw_write32_mask(rtwdev, REG_PDMFTH, GENMASK(3, 1), 0x04);
-+
-+            rtw_write32_mask(rtwdev, REG_CCASEL, 0x3, 0);
-+
-+            rtw8812a_phy_set_rfe_reg_24g(rtwdev);
-+        }
-+
-+        rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0x1);
-+        rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0x1);
-+
-+        basic_rates = BIT(DESC_RATE1M) | BIT(DESC_RATE2M) |
-+                  BIT(DESC_RATE5_5M) | BIT(DESC_RATE11M) |
-+                  BIT(DESC_RATE6M) | BIT(DESC_RATE12M) |
-+                  BIT(DESC_RATE24M);
-+        rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, basic_rates);
-+
-+        rtw_write8_clr(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
-+    } else { /* RTW_BAND_5G */
-+        if (chip->id == RTW_CHIP_TYPE_8821A)
-+            rtw8821a_phy_set_rfe_reg_5g(rtwdev);
-+
-+        rtw_write8_set(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
-+
-+        read_poll_timeout_atomic(rtw_read16, reg_41a, (reg_41a & 0x30) 
== 0x30,
-+                     50, 2500, false, rtwdev, REG_TXPKT_EMPTY);
-+
-+        rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
-+
-+        if (chip->id == RTW_CHIP_TYPE_8821A) {
-+            rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 1);
-+        } else {
-+            rtw_write32_mask(rtwdev, REG_BWINDICATION, 0x3, 0x2);
-+            rtw_write32_mask(rtwdev, REG_PDMFTH, GENMASK(17, 13), 0x15);
-+            rtw_write32_mask(rtwdev, REG_PDMFTH, GENMASK(3, 1), 0x04);
-+
-+            rtw_write32_mask(rtwdev, REG_CCASEL, 0x3, 1);
-+
-+            rtw8812a_phy_set_rfe_reg_5g(rtwdev);
-+        }
-+
-+        rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0);
-+        rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0xf);
-+
-+        basic_rates = BIT(DESC_RATE6M) | BIT(DESC_RATE12M) |
-+                  BIT(DESC_RATE24M);
-+        rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, basic_rates);
-+    }
-+
-+    rtw88xxa_set_channel_bb_swing(rtwdev, new_band);
-+}
-+
-+int rtw88xxa_power_on(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    int ret;
-+
-+    if (test_bit(RTW_FLAG_POWERON, rtwdev->flags))
-+        return 0;
-+
-+    /* Override rtw_chip_efuse_info_setup() */
-+    if (chip->id == RTW_CHIP_TYPE_8821A)
-+        efuse->btcoex = rtw_read32_mask(rtwdev, REG_WL_BT_PWR_CTRL,
-+                        BIT_BT_FUNC_EN);
-+
-+    /* Override rtw_chip_efuse_info_setup() */
-+    if (chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw8812a_read_amplifier_type(rtwdev);
-+
-+    ret = rtw_hci_setup(rtwdev);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to setup hci\n");
-+        goto err;
-+    }
-+
-+    /* Revise for U2/U3 switch we can not update RF-A/B reset.
-+     * Reset after MAC power on to prevent RF R/W error.
-+     * Is it a right method?
-+     */
-+    if (chip->id == RTW_CHIP_TYPE_8812A) {
-+        rtw_write8(rtwdev, REG_RF_CTRL, 5);
-+        rtw_write8(rtwdev, REG_RF_CTRL, 7);
-+        rtw_write8(rtwdev, REG_RF_B_CTRL, 5);
-+        rtw_write8(rtwdev, REG_RF_B_CTRL, 7);
-+    }
-+
-+    /* If HW didn't go through a complete de-initial procedure,
-+     * it probably occurs some problem for double initial
-+     * procedure.
-+     */
-+    rtw88xxau_hw_reset(rtwdev);
-+
-+    ret = rtw88xxau_init_power_on(rtwdev);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to power on\n");
-+        goto err;
-+    }
-+
-+    ret = rtw_set_trx_fifo_info(rtwdev);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to set trx fifo info\n");
-+        goto err;
-+    }
-+
-+    ret = rtw88xxa_llt_init(rtwdev, rtwdev->fifo.rsvd_boundary);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to init llt\n");
-+        goto err;
-+    }
-+
-+    rtw_write32_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
-+
-+    ret = rtw_wait_firmware_completion(rtwdev);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to wait firmware completion\n");
-+        goto err_off;
-+    }
-+
-+    ret = rtw_download_firmware(rtwdev, &rtwdev->fw);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to download firmware\n");
-+        goto err_off;
-+    }
-+
-+    rtw_write8(rtwdev, REG_HMETFR, 0xf);
-+
-+    rtw_load_table(rtwdev, chip->mac_tbl);
-+
-+    rtw88xxau_init_queue_reserved_page(rtwdev);
-+    rtw88xxau_init_tx_buffer_boundary(rtwdev);
-+    rtw88xxau_init_queue_priority(rtwdev);
-+
-+    rtw_write16(rtwdev, REG_TRXFF_BNDY + 2,
-+            chip->rxff_size - REPORT_BUF - 1);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw_write8(rtwdev, REG_PBP,
-+               u8_encode_bits(PBP_512, PBP_TX_MASK) |
-+               u8_encode_bits(PBP_64, PBP_RX_MASK));
-+
-+    rtw_write8(rtwdev, REG_RX_DRVINFO_SZ, PHY_STATUS_SIZE);
-+
-+    rtw_write32(rtwdev, REG_HIMR0, 0);
-+    rtw_write32(rtwdev, REG_HIMR1, 0);
-+
-+    rtw_write32_mask(rtwdev, REG_CR, 0x30000, 0x2);
-+
-+    rtw88xxa_init_wmac_setting(rtwdev);
-+    rtw88xxa_init_adaptive_ctrl(rtwdev);
-+    rtw88xxa_init_edca(rtwdev);
-+
-+    rtw_write8_set(rtwdev, REG_FWHW_TXQ_CTRL, BIT(7));
-+    rtw_write8(rtwdev, REG_ACKTO, 0x80);
-+
-+    rtw88xxau_tx_aggregation(rtwdev);
-+
-+    rtw88xxa_init_beacon_parameters(rtwdev);
-+    rtw_write8(rtwdev, REG_BCN_MAX_ERR, 0xff);
-+
-+    rtw_hci_interface_cfg(rtwdev);
-+
-+    /* usb3 rx interval */
-+    rtw_write8(rtwdev, REG_USB3_RXITV, 0x01);
-+
-+    /* burst length=4, set 0x3400 for burst length=2 */
-+    rtw_write16(rtwdev, REG_RXDMA_STATUS, 0x7400);
-+    rtw_write8(rtwdev, REG_RXDMA_STATUS + 1, 0xf5);
-+
-+    /* 0x456 = 0x70, sugguested by Zhilin */
-+    if (chip->id == RTW_CHIP_TYPE_8821A)
-+        rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, 0x5e);
-+    else
-+        rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, 0x70);
-+
-+    rtw_write32(rtwdev, REG_AMPDU_MAX_LENGTH, 0xffffffff);
-+    rtw_write8(rtwdev, REG_USTIME_TSF, 0x50);
-+    rtw_write8(rtwdev, REG_USTIME_EDCA, 0x50);
-+
-+    if (rtwusb->udev->speed == USB_SPEED_SUPER)
-+        /* Disable U1/U2 Mode to avoid 2.5G spur in USB3.0. */
-+        rtw_write8_clr(rtwdev, REG_USB_MOD, BIT(4) | BIT(3));
-+
-+    rtw_write8_set(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
-+
-+    /* for VHT packet length 11K */
-+    rtw_write8(rtwdev, REG_RX_PKT_LIMIT, 0x18);
-+
-+    rtw_write8(rtwdev, REG_PIFS, 0x00);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8821A) {
-+        /* 0x0a0a too small, it can't pass AC logo. change to 0x1f1f */
-+        rtw_write16(rtwdev, REG_MAX_AGGR_NUM, 0x1f1f);
-+        rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL, 0x80);
-+        rtw_write32(rtwdev, REG_FAST_EDCA_CTRL, 0x03087777);
-+    } else {
-+        rtw_write16(rtwdev, REG_MAX_AGGR_NUM, 0x1f1f);
-+        rtw_write8_clr(rtwdev, REG_FWHW_TXQ_CTRL, BIT(7));
-+    }
-+
-+     /* to prevent mac is reseted by bus. */
-+    rtw_write8_set(rtwdev, REG_RSV_CTRL, BIT(5) | BIT(6));
-+
-+    /* ARFB table 9 for 11ac 5G 2SS */
-+    rtw_write32(rtwdev, REG_ARFR0, 0x00000010);
-+    rtw_write32(rtwdev, REG_ARFRH0, 0xfffff000);
-+
-+    /* ARFB table 10 for 11ac 5G 1SS */
-+    rtw_write32(rtwdev, REG_ARFR1_V1, 0x00000010);
-+    rtw_write32(rtwdev, REG_ARFRH1_V1, 0x003ff000);
-+
-+    /* ARFB table 11 for 11ac 24G 1SS */
-+    rtw_write32(rtwdev, REG_ARFR2_V1, 0x00000015);
-+    rtw_write32(rtwdev, REG_ARFRH2_V1, 0x003ff000);
-+
-+    /* ARFB table 12 for 11ac 24G 2SS */
-+    rtw_write32(rtwdev, REG_ARFR3_V1, 0x00000015);
-+    rtw_write32(rtwdev, REG_ARFRH3_V1, 0xffcff000);
-+
-+    rtw_write8_set(rtwdev, REG_CR, BIT_MACTXEN | BIT_MACRXEN);
-+
-+    rtw88xxa_phy_bb_config(rtwdev);
-+    rtw88xxa_phy_rf_config(rtwdev);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8812A && hal->rf_path_num == 1)
-+        rtw8812a_config_1t(rtwdev);
-+
-+    rtw88xxa_switch_band(rtwdev, RTW_BAND_2G, RTW_CHANNEL_WIDTH_20);
-+
-+    rtw_write32(rtwdev, RTW_SEC_CMD_REG, BIT(31) | BIT(30));
-+
-+    rtw_write8(rtwdev, REG_HWSEQ_CTRL, 0xff);
-+    rtw_write32(rtwdev, REG_BAR_MODE_CTRL, 0x0201ffff);
-+    rtw_write8(rtwdev, REG_NAV_CTRL + 2, 0);
-+
-+    rtw_write8_clr(rtwdev, REG_GPIO_MUXCFG, BIT(5));
-+
-+    rtw_phy_init(rtwdev);
-+
-+    rtw88xxa_pwrtrack_init(rtwdev);
-+
-+    /* 0x4c6[3] 1: RTS BW = Data BW
-+     * 0: RTS BW depends on CCA / secondary CCA result.
-+     */
-+    rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT(3));
-+
-+    /* enable Tx report. */
-+    rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, 0x0f);
-+
-+    /* Pretx_en, for WEP/TKIP SEC */
-+    rtw_write8(rtwdev, REG_EARLY_MODE_CONTROL + 3, 0x01);
-+
-+    rtw_write16(rtwdev, REG_TX_RPT_TIME, 0x3df0);
-+
-+    /* Reset USB mode switch setting */
-+    rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x0);
-+    rtw_write8(rtwdev, REG_ACLK_MON, 0x0);
-+
-+    rtw_write8(rtwdev, REG_USB_HRPWM, 0);
-+
-+    /* ack for xmit mgmt frames. */
-+    rtw_write32_set(rtwdev, REG_FWHW_TXQ_CTRL, BIT(12));
-+
-+    hal->cck_high_power = rtw_read32_mask(rtwdev, REG_CCK_RPT_FORMAT,
-+                          BIT_CCK_RPT_FORMAT);
-+
-+    ret = rtw_hci_start(rtwdev);
-+    if (ret) {
-+        rtw_err(rtwdev, "failed to start hci\n");
-+        goto err_off;
-+    }
-+
-+    if (efuse->btcoex) {
-+        rtw_coex_power_on_setting(rtwdev);
-+        rtw_coex_init_hw_config(rtwdev, false);
-+    }
-+
-+    set_bit(RTW_FLAG_POWERON, rtwdev->flags);
-+
-+    return 0;
-+
-+err_off:
-+    chip->ops->power_off(rtwdev);
-+
-+err:
-+    return ret;
-+}
-+EXPORT_SYMBOL(rtw88xxa_power_on);
-+
-+u32 rtw88xxa_phy_read_rf(struct rtw_dev *rtwdev,
-+             enum rtw_rf_path rf_path, u32 addr, u32 mask)
-+{
-+    static const u32 pi_addr[2] = { REG_3WIRE_SWA, REG_3WIRE_SWB };
-+    static const u32 read_addr[2][2] = {
-+        { REG_SI_READ_A, REG_SI_READ_B },
-+        { REG_PI_READ_A, REG_PI_READ_B }
-+    };
-+    const struct rtw_chip_info *chip = rtwdev->chip;
-+    const struct rtw_hal *hal = &rtwdev->hal;
-+    bool set_cca, pi_mode;
-+    u32 val;
-+
-+    if (rf_path >= hal->rf_phy_num) {
-+        rtw_err(rtwdev, "unsupported rf path (%d)\n", rf_path);
-+        return INV_RF_DATA;
-+    }
-+
-+    /* CCA off to avoid reading the wrong value.
-+     * Toggling CCA would affect RF 0x0, skip it.
-+     */
-+    set_cca = addr != 0x0 && chip->id == RTW_CHIP_TYPE_8812A &&
-+          hal->cut_version != RTW_CHIP_VER_CUT_C;
-+
-+    if (set_cca)
-+        rtw_write32_set(rtwdev, REG_CCA2ND, BIT(3));
-+
-+    addr &= 0xff;
-+
-+    pi_mode = rtw_read32_mask(rtwdev, pi_addr[rf_path], 0x4);
-+
-+    rtw_write32_mask(rtwdev, REG_HSSI_READ, MASKBYTE0, addr);
-+
-+    if (chip->id == RTW_CHIP_TYPE_8821A ||
-+        hal->cut_version == RTW_CHIP_VER_CUT_C)
-+        udelay(20);
-+
-+    val = rtw_read32_mask(rtwdev, read_addr[pi_mode][rf_path], mask);
-+
-+    /* CCA on */
-+    if (set_cca)
-+        rtw_write32_clr(rtwdev, REG_CCA2ND, BIT(3));
-+
-+    return val;
-+}
-+EXPORT_SYMBOL(rtw88xxa_phy_read_rf);
-+
-+static void rtw8812a_phy_fix_spur(struct rtw_dev *rtwdev, u8 channel, 
u8 bw)
-+{
-+    /* C cut Item12 ADC FIFO CLOCK */
-+    if (rtwdev->hal.cut_version == RTW_CHIP_VER_CUT_C) {
-+        if (bw == RTW_CHANNEL_WIDTH_40 && channel == 11)
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0xC00, 0x3);
-+        else
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0xC00, 0x2);
-+
-+        /* A workaround to resolve 2480Mhz spur by setting ADC clock
-+         * as 160M.
-+         */
-+        if (bw == RTW_CHANNEL_WIDTH_20 && (channel == 13 || channel == 
14)) {
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0x300, 0x3);
-+            rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 1);
-+        } else if (bw == RTW_CHANNEL_WIDTH_40 && channel == 11) {
-+            rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 1);
-+        } else if (bw != RTW_CHANNEL_WIDTH_80) {
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0x300, 0x2);
-+            rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0);
-+        }
-+    } else {
-+        /* A workaround to resolve 2480Mhz spur by setting ADC clock
-+         * as 160M.
-+         */
-+        if (bw == RTW_CHANNEL_WIDTH_20 && (channel == 13 || channel == 
14))
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0x300, 0x3);
-+        else if (channel <= 14) /* 2.4G only */
-+            rtw_write32_mask(rtwdev, REG_ADCCLK, 0x300, 0x2);
-+    }
-+}
-+
-+static void rtw88xxa_switch_channel(struct rtw_dev *rtwdev, u8 
channel, u8 bw)
-+{
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    u32 fc_area, rf_mod_ag;
-+    u8 path;
-+
-+    switch (channel) {
-+    case 36 ... 48:
-+        fc_area = 0x494;
-+        break;
-+    case 50 ... 64:
-+        fc_area = 0x453;
-+        break;
-+    case 100 ... 116:
-+        fc_area = 0x452;
-+        break;
-+    default:
-+        if (channel >= 118)
-+            fc_area = 0x412;
-+        else
-+            fc_area = 0x96a;
-+        break;
-+    }
-+
-+    rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, fc_area);
-+
-+    for (path = 0; path < hal->rf_path_num; path++) {
-+        switch (channel) {
-+        case 36 ... 64:
-+            rf_mod_ag = 0x101;
-+            break;
-+        case 100 ... 140:
-+            rf_mod_ag = 0x301;
-+            break;
-+        default:
-+            if (channel > 140)
-+                rf_mod_ag = 0x501;
-+            else
-+                rf_mod_ag = 0x000;
-+            break;
-+        }
-+
-+        rtw_write_rf(rtwdev, path, RF_CFGCH,
-+                 RF18_RFSI_MASK | RF18_BAND_MASK, rf_mod_ag);
-+
-+        if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A)
-+            rtw8812a_phy_fix_spur(rtwdev, channel, bw);
-+
-+        rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_CHANNEL_MASK, channel);
-+    }
-+}
-+
-+static void rtw88xxa_set_reg_bw(struct rtw_dev *rtwdev, u8 bw)
-+{
-+    u16 val16 = rtw_read16(rtwdev, REG_WMAC_TRXPTCL_CTL);
-+
-+    val16 &= ~BIT_RFMOD;
-+    if (bw == RTW_CHANNEL_WIDTH_80)
-+        val16 |= BIT_RFMOD_80M;
-+    else if (bw == RTW_CHANNEL_WIDTH_40)
-+        val16 |= BIT_RFMOD_40M;
-+
-+    rtw_write16(rtwdev, REG_WMAC_TRXPTCL_CTL, val16);
-+}
-+
-+static void rtw88xxa_post_set_bw_mode(struct rtw_dev *rtwdev, u8 channel,
-+                      u8 bw, u8 primary_chan_idx)
-+{
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    u8 txsc40 = 0, txsc20, txsc;
-+    u8 reg_837, l1pkval;
-+
-+    rtw88xxa_set_reg_bw(rtwdev, bw);
-+
-+    txsc20 = primary_chan_idx;
-+    if (bw == RTW_CHANNEL_WIDTH_80) {
-+        if (txsc20 == RTW_SC_20_UPPER || txsc20 == RTW_SC_20_UPMOST)
-+            txsc40 = RTW_SC_40_UPPER;
-+        else
-+            txsc40 = RTW_SC_40_LOWER;
-+    }
-+
-+    txsc = BIT_TXSC_20M(txsc20) | BIT_TXSC_40M(txsc40);
-+    rtw_write8(rtwdev, REG_DATA_SC, txsc);
-+
-+    reg_837 = rtw_read8(rtwdev, REG_BWINDICATION + 3);
-+
-+    switch (bw) {
-+    default:
-+    case RTW_CHANNEL_WIDTH_20:
-+        rtw_write32_mask(rtwdev, REG_ADCCLK, 0x003003C3, 0x00300200);
-+        rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0);
-+
-+        if (hal->rf_type == RF_2T2R)
-+            rtw_write32_mask(rtwdev, REG_L1PKTH, 0x03C00000, 7);
-+        else
-+            rtw_write32_mask(rtwdev, REG_L1PKTH, 0x03C00000, 8);
-+
-+        break;
-+    case RTW_CHANNEL_WIDTH_40:
-+        rtw_write32_mask(rtwdev, REG_ADCCLK, 0x003003C3, 0x00300201);
-+        rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0);
-+        rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3C, txsc);
-+        rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0000000, txsc);
-+
-+        if (reg_837 & BIT(2)) {
-+            l1pkval = 6;
-+        } else {
-+            if (hal->rf_type == RF_2T2R)
-+                l1pkval = 7;
-+            else
-+                l1pkval = 8;
-+        }
-+
-+        rtw_write32_mask(rtwdev, REG_L1PKTH, 0x03C00000, l1pkval);
-+
-+        if (txsc == RTW_SC_20_UPPER)
-+            rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
-+        else
-+            rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
-+
-+        break;
-+    case RTW_CHANNEL_WIDTH_80:
-+        rtw_write32_mask(rtwdev, REG_ADCCLK, 0x003003C3, 0x00300202);
-+        rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 1);
-+        rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3C, txsc);
-+        rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0000000, txsc);
-+
-+        if (reg_837 & BIT(2)) {
-+            l1pkval = 5;
-+        } else {
-+            if (hal->rf_type == RF_2T2R)
-+                l1pkval = 6;
-+            else
-+                l1pkval = 7;
-+        }
-+
-+        rtw_write32_mask(rtwdev, REG_L1PKTH, 0x03C00000, l1pkval);
-+
-+        break;
-+    }
-+}
-+
-+static void rtw88xxa_set_channel_rf(struct rtw_dev *rtwdev, u8 
channel, u8 bw)
-+{
-+    u8 path;
-+
-+    for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
-+        switch (bw) {
-+        case RTW_CHANNEL_WIDTH_5:
-+        case RTW_CHANNEL_WIDTH_10:
-+        case RTW_CHANNEL_WIDTH_20:
-+        default:
-+            rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 3);
-+            break;
-+        case RTW_CHANNEL_WIDTH_40:
-+            rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 1);
-+            break;
-+        case RTW_CHANNEL_WIDTH_80:
-+            rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 0);
-+            break;
-+        }
-+    }
-+}
-+
-+void rtw88xxa_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
-+              u8 primary_chan_idx)
-+{
-+    u8 old_band, new_band;
-+
-+    if (rtw_read8(rtwdev, REG_CCK_CHECK) & BIT_CHECK_CCK_EN)
-+        old_band = RTW_BAND_5G;
-+    else
-+        old_band = RTW_BAND_2G;
-+
-+    if (channel > 14)
-+        new_band = RTW_BAND_5G;
-+    else
-+        new_band = RTW_BAND_2G;
-+
-+    if (new_band != old_band)
-+        rtw88xxa_switch_band(rtwdev, new_band, bw);
-+
-+    rtw88xxa_switch_channel(rtwdev, channel, bw);
-+
-+    rtw88xxa_post_set_bw_mode(rtwdev, channel, bw, primary_chan_idx);
-+
-+    if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A)
-+        rtw8812a_phy_fix_spur(rtwdev, channel, bw);
-+
-+    rtw88xxa_set_channel_rf(rtwdev, channel, bw);
-+}
-+EXPORT_SYMBOL(rtw88xxa_set_channel);
-+
-+void rtw88xxa_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
-+                   struct rtw_rx_pkt_stat *pkt_stat,
-+                   s8 (*cck_rx_pwr)(u8 lna_idx, u8 vga_idx))
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+    struct rtw_jaguar_phy_status_rpt *rpt;
-+    u8 gain[RTW_RF_PATH_MAX], rssi, i;
-+    s8 rx_pwr_db, power_a, power_b;
-+    const s8 min_rx_power = -120;
-+    u8 lna_idx, vga_idx;
-+
-+    rpt = (struct rtw_jaguar_phy_status_rpt *)phy_status;
-+
-+    if (pkt_stat->rate <= DESC_RATE11M) {
-+        lna_idx = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_LNA_IDX);
-+        vga_idx = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_VGA_IDX);
-+
-+        rx_pwr_db = cck_rx_pwr(lna_idx, vga_idx);
-+
-+        pkt_stat->rx_power[RF_PATH_A] = rx_pwr_db;
-+        pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
-+        dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
-+        pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
-+        pkt_stat->signal_power = rx_pwr_db;
-+    } else { /* OFDM rate */
-+        gain[RF_PATH_A] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_A);
-+        gain[RF_PATH_B] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_B);
-+
-+        for (i = RF_PATH_A; i < rtwdev->hal.rf_path_num; i++) {
-+            pkt_stat->rx_power[i] = gain[i] - 110;
-+            rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[i], 1);
-+            dm_info->rssi[i] = rssi;
-+        }
-+
-+        pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power,
-+                             rtwdev->hal.rf_path_num);
-+
-+        power_a = pkt_stat->rx_power[RF_PATH_A];
-+        power_b = pkt_stat->rx_power[RF_PATH_B];
-+        if (rtwdev->hal.rf_path_num == 1)
-+            power_b = power_a;
-+
-+        pkt_stat->signal_power = max3(power_a, power_b, min_rx_power);
-+    }
-+}
-+EXPORT_SYMBOL(rtw88xxa_query_phy_status);
-+
-+static void
-+rtw88xxa_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
-+                    u8 rs, u32 *phy_pwr_idx)
-+{
-+    static const u32 offset_txagc[2] = {
-+        REG_TX_AGC_A_CCK_11_CCK_1, REG_TX_AGC_B_CCK_11_CCK_1
-+    };
-+    u8 rate, rate_idx, pwr_index, shift;
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    bool write_1ss_mcs9;
-+    u32 mask;
-+    int j;
-+
-+    for (j = 0; j < rtw_rate_size[rs]; j++) {
-+        rate = rtw_rate_section[rs][j];
-+
-+        pwr_index = hal->tx_pwr_tbl[path][rate];
-+
-+        shift = rate & 0x3;
-+        *phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
-+
-+        write_1ss_mcs9 = rate == DESC_RATEVHT1SS_MCS9 &&
-+                 hal->rf_path_num == 1;
-+
-+        if (write_1ss_mcs9)
-+            mask = MASKLWORD;
-+        else
-+            mask = MASKDWORD;
-+
-+        if (shift == 0x3 || write_1ss_mcs9) {
-+            rate_idx = rate & 0xfc;
-+            if (rate >= DESC_RATEVHT1SS_MCS0)
-+                rate_idx -= 0x10;
-+
-+            rtw_write32_mask(rtwdev, offset_txagc[path] + rate_idx,
-+                     mask, *phy_pwr_idx);
-+
-+            *phy_pwr_idx = 0;
-+        }
-+    }
-+}
-+
-+static void rtw88xxa_tx_power_training(struct rtw_dev *rtwdev, u8 bw,
-+                       u8 channel, u8 path)
-+{
-+    static const u32 write_offset[] = {
-+        REG_TX_PWR_TRAINING_A, REG_TX_PWR_TRAINING_B,
-+    };
-+    u32 power_level, write_data;
-+    u8 i;
-+
-+    power_level = rtwdev->hal.tx_pwr_tbl[path][DESC_RATEMCS7];
-+    write_data = 0;
-+
-+    for (i = 0; i < 3; i++) {
-+        if (i == 0)
-+            power_level -= 10;
-+        else if (i == 1)
-+            power_level -= 8;
-+        else
-+            power_level -= 6;
-+
-+        write_data |= max_t(u32, power_level, 2) << (i * 8);
-+    }
-+
-+    rtw_write32_mask(rtwdev, write_offset[path], 0xffffff, write_data);
-+}
-+
-+void rtw88xxa_set_tx_power_index(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    u32 phy_pwr_idx = 0;
-+    int rs, path;
-+
-+    for (path = 0; path < hal->rf_path_num; path++) {
-+        for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
-+            if (hal->rf_path_num == 1 &&
-+                (rs == RTW_RATE_SECTION_HT_2S ||
-+                 rs == RTW_RATE_SECTION_VHT_2S))
-+                continue;
-+
-+            if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags) &&
-+                rs > RTW_RATE_SECTION_OFDM)
-+                continue;
-+
-+            if (hal->current_band_type == RTW_BAND_5G &&
-+                rs == RTW_RATE_SECTION_CCK)
-+                continue;
-+
-+            rtw88xxa_set_tx_power_index_by_rate(rtwdev, path, rs,
-+                                &phy_pwr_idx);
-+        }
-+
-+        rtw88xxa_tx_power_training(rtwdev, hal->current_band_width,
-+                       hal->current_channel, path);
-+    }
-+}
-+EXPORT_SYMBOL(rtw88xxa_set_tx_power_index);
-+
-+void rtw88xxa_false_alarm_statistics(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+    u32 cck_fa_cnt, ofdm_fa_cnt;
-+    u32 crc32_cnt, cca32_cnt;
-+    u32 cck_enable;
-+
-+    cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28);
-+    cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK);
-+    ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM);
-+
-+    dm_info->cck_fa_cnt = cck_fa_cnt;
-+    dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
-+    dm_info->total_fa_cnt = ofdm_fa_cnt;
-+    if (cck_enable)
-+        dm_info->total_fa_cnt += cck_fa_cnt;
-+
-+    crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK);
-+    dm_info->cck_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
-+    dm_info->cck_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
-+
-+    crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM);
-+    dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
-+    dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
-+
-+    crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT);
-+    dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
-+    dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
-+
-+    crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT);
-+    dm_info->vht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
-+    dm_info->vht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
-+
-+    cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM);
-+    dm_info->ofdm_cca_cnt = u32_get_bits(cca32_cnt, MASKHWORD);
-+    dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
-+    if (cck_enable) {
-+        cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK);
-+        dm_info->cck_cca_cnt = u32_get_bits(cca32_cnt, MASKLWORD);
-+        dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
-+    }
-+
-+    rtw_write32_set(rtwdev, REG_FAS, BIT(17));
-+    rtw_write32_clr(rtwdev, REG_FAS, BIT(17));
-+    rtw_write32_clr(rtwdev, REG_CCK0_FAREPORT, BIT(15));
-+    rtw_write32_set(rtwdev, REG_CCK0_FAREPORT, BIT(15));
-+    rtw_write32_set(rtwdev, REG_CNTRST, BIT(0));
-+    rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0));
-+}
-+EXPORT_SYMBOL(rtw88xxa_false_alarm_statistics);
-+
-+void rtw88xxa_iqk_backup_mac_bb(struct rtw_dev *rtwdev,
-+                u32 *macbb_backup,
-+                const u32 *backup_macbb_reg,
-+                u32 macbb_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* save MACBB default value */
-+    for (i = 0; i < macbb_num; i++)
-+        macbb_backup[i] = rtw_read32(rtwdev, backup_macbb_reg[i]);
-+}
-+EXPORT_SYMBOL(rtw88xxa_iqk_backup_mac_bb);
-+
-+void rtw88xxa_iqk_backup_afe(struct rtw_dev *rtwdev, u32 *afe_backup,
-+                 const u32 *backup_afe_reg, u32 afe_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Save AFE Parameters */
-+    for (i = 0; i < afe_num; i++)
-+        afe_backup[i] = rtw_read32(rtwdev, backup_afe_reg[i]);
-+}
-+EXPORT_SYMBOL(rtw88xxa_iqk_backup_afe);
-+
-+void rtw88xxa_iqk_restore_mac_bb(struct rtw_dev *rtwdev,
-+                 u32 *macbb_backup,
-+                 const u32 *backup_macbb_reg,
-+                 u32 macbb_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Reload MacBB Parameters */
-+    for (i = 0; i < macbb_num; i++)
-+        rtw_write32(rtwdev, backup_macbb_reg[i], macbb_backup[i]);
-+}
-+EXPORT_SYMBOL(rtw88xxa_iqk_restore_mac_bb);
-+
-+void rtw88xxa_iqk_configure_mac(struct rtw_dev *rtwdev)
-+{
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    rtw_write8(rtwdev, REG_TXPAUSE, 0x3f);
-+    rtw_write32_mask(rtwdev, REG_BCN_CTRL,
-+             (BIT_EN_BCN_FUNCTION << 8) | BIT_EN_BCN_FUNCTION, 0x0);
-+
-+    /* RX ante off */
-+    rtw_write8(rtwdev, REG_RXPSEL, 0x00);
-+
-+    /* CCA off */
-+    rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf, 0xc);
-+
-+    /* CCK RX path off */
-+    rtw_write8(rtwdev, REG_CCK_RX + 3, 0xf);
-+}
-+EXPORT_SYMBOL(rtw88xxa_iqk_configure_mac);
-+
-+bool rtw88xxa_iqk_finish(int average, int threshold,
-+             int *x_temp, int *y_temp, int *x, int *y,
-+             bool break_inner, bool break_outer)
-+{
-+    bool finish = false;
-+    int i, ii, dx, dy;
-+
-+    for (i = 0; i < average; i++) {
-+        for (ii = i + 1; ii < average; ii++) {
-+            dx = abs_diff(x_temp[i] >> 21, x_temp[ii] >> 21);
-+            dy = abs_diff(y_temp[i] >> 21, y_temp[ii] >> 21);
-+
-+            if (dx < threshold && dy < threshold) {
-+                *x = ((x_temp[i] >> 21) + (x_temp[ii] >> 21));
-+                *y = ((y_temp[i] >> 21) + (y_temp[ii] >> 21));
-+
-+                *x /= 2;
-+                *y /= 2;
-+
-+                finish = true;
-+
-+                if (break_inner)
-+                    break;
-+            }
-+        }
-+
-+        if (finish && break_outer)
-+            break;
-+    }
-+
-+    return finish;
-+}
-+EXPORT_SYMBOL(rtw88xxa_iqk_finish);
-+
-+static void rtw88xxa_pwrtrack_set(struct rtw_dev *rtwdev, u8 tx_rate, 
u8 path)
-+{
-+    static const u32 reg_txscale[2] = { REG_TXSCALE_A, REG_TXSCALE_B };
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+    u8 cck_swing_idx, ofdm_swing_idx;
-+    u8 pwr_tracking_limit;
-+
-+    switch (tx_rate) {
-+    case DESC_RATE1M ... DESC_RATE11M:
-+        pwr_tracking_limit = 32;
-+        break;
-+    case DESC_RATE6M ... DESC_RATE48M:
-+    case DESC_RATEMCS3 ... DESC_RATEMCS4:
-+    case DESC_RATEMCS11 ... DESC_RATEMCS12:
-+    case DESC_RATEVHT1SS_MCS3 ... DESC_RATEVHT1SS_MCS4:
-+    case DESC_RATEVHT2SS_MCS3 ... DESC_RATEVHT2SS_MCS4:
-+        pwr_tracking_limit = 30;
-+        break;
-+    case DESC_RATE54M:
-+    case DESC_RATEMCS5 ... DESC_RATEMCS7:
-+    case DESC_RATEMCS13 ... DESC_RATEMCS15:
-+    case DESC_RATEVHT1SS_MCS5 ... DESC_RATEVHT1SS_MCS6:
-+    case DESC_RATEVHT2SS_MCS5 ... DESC_RATEVHT2SS_MCS6:
-+        pwr_tracking_limit = 28;
-+        break;
-+    case DESC_RATEMCS0 ... DESC_RATEMCS2:
-+    case DESC_RATEMCS8 ... DESC_RATEMCS10:
-+    case DESC_RATEVHT1SS_MCS0 ... DESC_RATEVHT1SS_MCS2:
-+    case DESC_RATEVHT2SS_MCS0 ... DESC_RATEVHT2SS_MCS2:
-+        pwr_tracking_limit = 34;
-+        break;
-+    case DESC_RATEVHT1SS_MCS7:
-+    case DESC_RATEVHT2SS_MCS7:
-+        pwr_tracking_limit = 26;
-+        break;
-+    default:
-+    case DESC_RATEVHT1SS_MCS8:
-+    case DESC_RATEVHT2SS_MCS8:
-+        pwr_tracking_limit = 24;
-+        break;
-+    case DESC_RATEVHT1SS_MCS9:
-+    case DESC_RATEVHT2SS_MCS9:
-+        pwr_tracking_limit = 22;
-+        break;
-+    }
-+
-+    cck_swing_idx = dm_info->delta_power_index[path] + 
dm_info->default_cck_index;
-+    ofdm_swing_idx = dm_info->delta_power_index[path] + 
dm_info->default_ofdm_index;
-+
-+    if (ofdm_swing_idx > pwr_tracking_limit) {
-+        if (path == RF_PATH_A)
-+            dm_info->txagc_remnant_cck = cck_swing_idx - 
pwr_tracking_limit;
-+        dm_info->txagc_remnant_ofdm[path] = ofdm_swing_idx - 
pwr_tracking_limit;
-+
-+        ofdm_swing_idx = pwr_tracking_limit;
-+    } else if (ofdm_swing_idx == 0) {
-+        if (path == RF_PATH_A)
-+            dm_info->txagc_remnant_cck = cck_swing_idx;
-+        dm_info->txagc_remnant_ofdm[path] = ofdm_swing_idx;
-+    } else {
-+        if (path == RF_PATH_A)
-+            dm_info->txagc_remnant_cck = 0;
-+        dm_info->txagc_remnant_ofdm[path] = 0;
-+    }
-+
-+    rtw_write32_mask(rtwdev, reg_txscale[path], GENMASK(31, 21),
-+             rtw88xxa_txscale_tbl[ofdm_swing_idx]);
-+}
-+
-+void rtw88xxa_phy_pwrtrack(struct rtw_dev *rtwdev,
-+               void (*do_lck)(struct rtw_dev *rtwdev),
-+               void (*do_iqk)(struct rtw_dev *rtwdev))
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+    struct rtw_hal *hal = &rtwdev->hal;
-+    struct rtw_swing_table swing_table;
-+    s8 remnant_pre[RTW_RF_PATH_MAX];
-+    u8 thermal_value, delta, path;
-+    bool need_iqk;
-+
-+    rtw_phy_config_swing_table(rtwdev, &swing_table);
-+
-+    if (rtwdev->efuse.thermal_meter[0] == 0xff) {
-+        pr_err_once("efuse thermal meter is 0xff\n");
-+        return;
-+    }
-+
-+    thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
-+
-+    rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
-+
-+    need_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
-+
-+    if (need_iqk && do_lck)
-+        do_lck(rtwdev);
-+
-+    if (dm_info->pwr_trk_init_trigger)
-+        dm_info->pwr_trk_init_trigger = false;
-+    else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
-+                           RF_PATH_A))
-+        goto iqk;
-+
-+    delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
-+
-+    for (path = RF_PATH_A; path < hal->rf_path_num; path++) {
-+        remnant_pre[path] = dm_info->txagc_remnant_ofdm[path];
-+
-+        dm_info->delta_power_index[path] =
-+            rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table, path,
-+                            RF_PATH_A, delta);
-+
-+        if (dm_info->delta_power_index[path] !=
-+            dm_info->delta_power_index_last[path]) {
-+            dm_info->delta_power_index_last[path] =
-+                dm_info->delta_power_index[path];
-+
-+            rtw88xxa_pwrtrack_set(rtwdev, dm_info->tx_rate, path);
-+        }
-+    }
-+
-+    for (path = RF_PATH_A; path < hal->rf_path_num; path++) {
-+        if (remnant_pre[path] != dm_info->txagc_remnant_ofdm[path]) {
-+            rtw_phy_set_tx_power_level(rtwdev,
-+                           hal->current_channel);
-+            break;
-+        }
-+    }
-+
-+iqk:
-+    if (need_iqk)
-+        do_iqk(rtwdev);
-+}
-+EXPORT_SYMBOL(rtw88xxa_phy_pwrtrack);
-+
-+void rtw88xxa_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
-+{
-+    static const u8 pd[CCK_PD_LV_MAX] = {0x40, 0x83, 0xcd, 0xdd, 0xed};
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+
-+    /* Override rtw_phy_cck_pd_lv_link(). It implements something
-+     * like type 2/3/4. We need type 1 here.
-+     */
-+    if (rtw_is_assoc(rtwdev)) {
-+        if (dm_info->min_rssi > 60) {
-+            new_lvl = CCK_PD_LV3;
-+        } else if (dm_info->min_rssi > 35) {
-+            new_lvl = CCK_PD_LV2;
-+        } else if (dm_info->min_rssi > 20) {
-+            if (dm_info->cck_fa_avg > 500)
-+                new_lvl = CCK_PD_LV2;
-+            else if (dm_info->cck_fa_avg < 250)
-+                new_lvl = CCK_PD_LV1;
-+            else
-+                return;
-+        } else {
-+            new_lvl = CCK_PD_LV1;
-+        }
-+    }
-+
-+    rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
-+        dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
-+
-+    if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
-+        return;
-+
-+    dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
-+    dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
-+
-+    rtw_write8(rtwdev, REG_CCK_PD_TH, pd[new_lvl]);
-+}
-+EXPORT_SYMBOL(rtw88xxa_phy_cck_pd_set);
-+
-+MODULE_AUTHOR("Realtek Corporation");
-+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821a/8811a/8812a common 
code");
-+MODULE_LICENSE("Dual BSD/GPL");
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.h
-@@ -0,0 +1,175 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#ifndef __RTW88XXA_H__
-+#define __RTW88XXA_H__
-+
-+#include <asm/byteorder.h>
-+#include "reg.h"
-+
-+struct rtw8821au_efuse {
-+    u8 res4[48];            /* 0xd0 */
-+    u8 vid[2];            /* 0x100 */
-+    u8 pid[2];
-+    u8 res8[3];
-+    u8 mac_addr[ETH_ALEN];        /* 0x107 */
-+    u8 res9[243];
-+} __packed;
-+
-+struct rtw8812au_efuse {
-+    u8 vid[2];            /* 0xd0 */
-+    u8 pid[2];            /* 0xd2 */
-+    u8 res0[3];
-+    u8 mac_addr[ETH_ALEN];        /* 0xd7 */
-+    u8 res1[291];
-+} __packed;
-+
-+struct rtw88xxa_efuse {
-+    __le16 rtl_id;
-+    u8 res0[6];            /* 0x02 */
-+    u8 usb_mode;            /* 0x08 */
-+    u8 res1[7];            /* 0x09 */
-+
-+    /* power index for four RF paths */
-+    struct rtw_txpwr_idx txpwr_idx_table[4];
-+
-+    u8 channel_plan;        /* 0xb8 */
-+    u8 xtal_k;
-+    u8 thermal_meter;
-+    u8 iqk_lck;
-+    u8 pa_type;            /* 0xbc */
-+    u8 lna_type_2g;            /* 0xbd */
-+    u8 res2;
-+    u8 lna_type_5g;            /* 0xbf */
-+    u8 res3;
-+    u8 rf_board_option;        /* 0xc1 */
-+    u8 rf_feature_option;
-+    u8 rf_bt_setting;
-+    u8 eeprom_version;
-+    u8 eeprom_customer_id;        /* 0xc5 */
-+    u8 tx_bb_swing_setting_2g;
-+    u8 tx_bb_swing_setting_5g;
-+    u8 tx_pwr_calibrate_rate;
-+    u8 rf_antenna_option;        /* 0xc9 */
-+    u8 rfe_option;
-+    u8 country_code[2];
-+    u8 res4[3];
-+    union {
-+        struct rtw8821au_efuse rtw8821au;
-+        struct rtw8812au_efuse rtw8812au;
-+    };
-+} __packed;
-+
-+static_assert(sizeof(struct rtw88xxa_efuse) == 512);
-+
-+#define WLAN_BCN_DMA_TIME            0x02
-+#define WLAN_TBTT_PROHIBIT            0x04
-+#define WLAN_TBTT_HOLD_TIME            0x064
-+#define WLAN_TBTT_TIME    (WLAN_TBTT_PROHIBIT |\
-+            (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
-+
-+struct rtw_jaguar_phy_status_rpt {
-+    __le32 w0;
-+    __le32 w1;
-+    __le32 w2;
-+    __le32 w3;
-+    __le32 w4;
-+    __le32 w5;
-+    __le32 w6;
-+} __packed;
-+
-+#define RTW_JGRPHY_W0_GAIN_A        GENMASK(6, 0)
-+#define RTW_JGRPHY_W0_TRSW_A        BIT(7)
-+#define RTW_JGRPHY_W0_GAIN_B        GENMASK(14, 8)
-+#define RTW_JGRPHY_W0_TRSW_B        BIT(15)
-+#define RTW_JGRPHY_W0_CHL_NUM        GENMASK(25, 16)
-+#define RTW_JGRPHY_W0_SUB_CHNL        GENMASK(29, 26)
-+#define RTW_JGRPHY_W0_R_RFMOD        GENMASK(31, 30)
-+
-+/* CCK: */
-+#define RTW_JGRPHY_W1_SIG_QUAL        GENMASK(7, 0)
-+#define RTW_JGRPHY_W1_AGC_RPT_VGA_IDX    GENMASK(12, 8)
-+#define RTW_JGRPHY_W1_AGC_RPT_LNA_IDX    GENMASK(15, 13)
-+#define RTW_JGRPHY_W1_BB_POWER        GENMASK(23, 16)
-+/* OFDM: */
-+#define RTW_JGRPHY_W1_PWDB_ALL        GENMASK(7, 0)
-+#define RTW_JGRPHY_W1_CFO_SHORT_A    GENMASK(15, 8)    /* s8 */
-+#define RTW_JGRPHY_W1_CFO_SHORT_B    GENMASK(23, 16)    /* s8 */
-+#define RTW_JGRPHY_W1_BT_RF_CH_MSB    GENMASK(31, 30)
-+
-+#define RTW_JGRPHY_W2_ANT_DIV_SW_A    BIT(0)
-+#define RTW_JGRPHY_W2_ANT_DIV_SW_B    BIT(1)
-+#define RTW_JGRPHY_W2_BT_RF_CH_LSB    GENMASK(7, 2)
-+#define RTW_JGRPHY_W2_CFO_TAIL_A    GENMASK(15, 8)    /* s8 */
-+#define RTW_JGRPHY_W2_CFO_TAIL_B    GENMASK(23, 16)    /* s8 */
-+#define RTW_JGRPHY_W2_PCTS_MSK_RPT_0    GENMASK(31, 24)
-+
-+#define RTW_JGRPHY_W3_PCTS_MSK_RPT_1    GENMASK(7, 0)
-+/* Stream 1 and 2 RX EVM: */
-+#define RTW_JGRPHY_W3_RXEVM_1        GENMASK(15, 8)    /* s8 */
-+#define RTW_JGRPHY_W3_RXEVM_2        GENMASK(23, 16)    /* s8 */
-+#define RTW_JGRPHY_W3_RXSNR_A        GENMASK(31, 24)    /* s8 */
-+
-+#define RTW_JGRPHY_W4_RXSNR_B        GENMASK(7, 0)    /* s8 */
-+#define RTW_JGRPHY_W4_PCTS_MSK_RPT_2    GENMASK(21, 8)
-+#define RTW_JGRPHY_W4_PCTS_RPT_VALID    BIT(22)
-+#define RTW_JGRPHY_W4_RXEVM_3        GENMASK(31, 24)    /* s8 */
-+
-+#define RTW_JGRPHY_W5_RXEVM_4        GENMASK(7, 0)    /* s8 */
-+/* 8812a, stream 1 and 2 CSI: */
-+#define RTW_JGRPHY_W5_CSI_CURRENT_1    GENMASK(15, 8)
-+#define RTW_JGRPHY_W5_CSI_CURRENT_2    GENMASK(23, 16)
-+/* 8814a: */
-+#define RTW_JGRPHY_W5_RXSNR_C        GENMASK(15, 8)    /* s8 */
-+#define RTW_JGRPHY_W5_RXSNR_D        GENMASK(23, 16)    /* s8 */
-+#define RTW_JGRPHY_W5_GAIN_C        GENMASK(30, 24)
-+#define RTW_JGRPHY_W5_TRSW_C        BIT(31)
-+
-+#define RTW_JGRPHY_W6_GAIN_D        GENMASK(6, 0)
-+#define RTW_JGRPHY_W6_TRSW_D        BIT(7)
-+#define RTW_JGRPHY_W6_SIGEVM        GENMASK(15, 8)    /* s8 */
-+#define RTW_JGRPHY_W6_ANTIDX_ANTC    GENMASK(18, 16)
-+#define RTW_JGRPHY_W6_ANTIDX_ANTD    GENMASK(21, 19)
-+#define RTW_JGRPHY_W6_DPDT_CTRL_KEEP    BIT(22)
-+#define RTW_JGRPHY_W6_GNT_BT_KEEP    BIT(23)
-+#define RTW_JGRPHY_W6_ANTIDX_ANTA    GENMASK(26, 24)
-+#define RTW_JGRPHY_W6_ANTIDX_ANTB    GENMASK(29, 27)
-+#define RTW_JGRPHY_W6_HW_ANTSW_OCCUR    GENMASK(31, 30)
-+
-+#define RF18_BW_MASK        (BIT(11) | BIT(10))
-+
-+void rtw88xxa_efuse_grant(struct rtw_dev *rtwdev, bool on);
-+int rtw88xxa_read_efuse(struct rtw_dev *rtwdev, u8 *log_map);
-+void rtw88xxa_power_off(struct rtw_dev *rtwdev,
-+            const struct rtw_pwr_seq_cmd *const *enter_lps_flow);
-+int rtw88xxa_power_on(struct rtw_dev *rtwdev);
-+u32 rtw88xxa_phy_read_rf(struct rtw_dev *rtwdev,
-+             enum rtw_rf_path rf_path, u32 addr, u32 mask);
-+void rtw88xxa_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
-+              u8 primary_chan_idx);
-+void rtw88xxa_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
-+                   struct rtw_rx_pkt_stat *pkt_stat,
-+                   s8 (*cck_rx_pwr)(u8 lna_idx, u8 vga_idx));
-+void rtw88xxa_set_tx_power_index(struct rtw_dev *rtwdev);
-+void rtw88xxa_false_alarm_statistics(struct rtw_dev *rtwdev);
-+void rtw88xxa_iqk_backup_mac_bb(struct rtw_dev *rtwdev,
-+                u32 *macbb_backup,
-+                const u32 *backup_macbb_reg,
-+                u32 macbb_num);
-+void rtw88xxa_iqk_backup_afe(struct rtw_dev *rtwdev, u32 *afe_backup,
-+                 const u32 *backup_afe_reg, u32 afe_num);
-+void rtw88xxa_iqk_restore_mac_bb(struct rtw_dev *rtwdev,
-+                 u32 *macbb_backup,
-+                 const u32 *backup_macbb_reg,
-+                 u32 macbb_num);
-+void rtw88xxa_iqk_configure_mac(struct rtw_dev *rtwdev);
-+bool rtw88xxa_iqk_finish(int average, int threshold,
-+             int *x_temp, int *y_temp, int *x, int *y,
-+             bool break_inner, bool break_outer);
-+void rtw88xxa_phy_pwrtrack(struct rtw_dev *rtwdev,
-+               void (*do_lck)(struct rtw_dev *rtwdev),
-+               void (*do_iqk)(struct rtw_dev *rtwdev));
-+void rtw88xxa_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl);
-+
-+#endif
diff --git 
a/package/kernel/mac80211/patches/rtl/042-v6.13-wifi-rtw88-Add-rtw8821a.-c-h.patch 
b/package/kernel/mac80211/patches/rtl/042-v6.13-wifi-rtw88-Add-rtw8821a.-c-h.patch
deleted file mode 100644
index dca3f7b275aab6..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/042-v6.13-wifi-rtw88-Add-rtw8821a.-c-h.patch
+++ /dev/null
@@ -1,1230 +0,0 @@
-From 32e284a238806d1984ea68cda25f6b09a4053b94 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:28:15 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw8821a.{c,h}
-
-These contain code specific to RTL8821AU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/37218648-ada7-4fad-b7bd-d2aee28cefb9@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8821a.c | 1197 +++++++++++++++++
- drivers/net/wireless/realtek/rtw88/rtw8821a.h |   10 +
- 2 files changed, 1207 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821a.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821a.h
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
-@@ -0,0 +1,1197 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include "main.h"
-+#include "coex.h"
-+#include "phy.h"
-+#include "reg.h"
-+#include "rtw88xxa.h"
-+#include "rtw8821a.h"
-+#include "rtw8821a_table.h"
-+#include "tx.h"
-+
-+static void rtw8821a_power_off(struct rtw_dev *rtwdev)
-+{
-+    rtw88xxa_power_off(rtwdev, enter_lps_flow_8821a);
-+}
-+
-+static s8 rtw8821a_cck_rx_pwr(u8 lna_idx, u8 vga_idx)
-+{
-+    static const s8 lna_gain_table[] = {15, -1, -17, 0, -30, -38};
-+    s8 rx_pwr_all = 0;
-+    s8 lna_gain;
-+
-+    switch (lna_idx) {
-+    case 5:
-+    case 4:
-+    case 2:
-+    case 1:
-+    case 0:
-+        lna_gain = lna_gain_table[lna_idx];
-+        rx_pwr_all = lna_gain - 2 * vga_idx;
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    return rx_pwr_all;
-+}
-+
-+static void rtw8821a_query_phy_status(struct rtw_dev *rtwdev, u8 
*phy_status,
-+                      struct rtw_rx_pkt_stat *pkt_stat)
-+{
-+    rtw88xxa_query_phy_status(rtwdev, phy_status, pkt_stat,
-+                  rtw8821a_cck_rx_pwr);
-+}
-+
-+static void rtw8821a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
-+{
-+}
-+
-+#define CAL_NUM_8821A 3
-+#define MACBB_REG_NUM_8821A 8
-+#define AFE_REG_NUM_8821A 4
-+#define RF_REG_NUM_8821A 3
-+
-+static void rtw8821a_iqk_backup_rf(struct rtw_dev *rtwdev, u32 
*rfa_backup,
-+                   const u32 *backup_rf_reg, u32 rf_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Save RF Parameters */
-+    for (i = 0; i < rf_num; i++)
-+        rfa_backup[i] = rtw_read_rf(rtwdev, RF_PATH_A,
-+                        backup_rf_reg[i], MASKDWORD);
-+}
-+
-+static void rtw8821a_iqk_restore_rf(struct rtw_dev *rtwdev,
-+                    const u32 *backup_rf_reg,
-+                    u32 *RF_backup, u32 rf_reg_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    for (i = 0; i < rf_reg_num; i++)
-+        rtw_write_rf(rtwdev, RF_PATH_A, backup_rf_reg[i],
-+                 RFREG_MASK, RF_backup[i]);
-+}
-+
-+static void rtw8821a_iqk_restore_afe(struct rtw_dev *rtwdev, u32 
*afe_backup,
-+                     const u32 *backup_afe_reg, u32 afe_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Reload AFE Parameters */
-+    for (i = 0; i < afe_num; i++)
-+        rtw_write32(rtwdev, backup_afe_reg[i], afe_backup[i]);
-+
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x0);
-+    rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x0);
-+    rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x0);
-+    rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x3c000000);
-+    rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080);
-+    rtw_write32(rtwdev, REG_TXAGCIDX, 0x00000000);
-+    rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000);
-+    rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000);
-+    rtw_write32(rtwdev, REG_RFECTL_A, 0x0);
-+}
-+
-+static void rtw8821a_iqk_rx_fill(struct rtw_dev *rtwdev,
-+                 unsigned int rx_x, unsigned int rx_y)
-+{
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+             0x000003ff, rx_x >> 1);
-+    rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+             0x03ff0000, (rx_y >> 1) & 0x3ff);
-+}
-+
-+static void rtw8821a_iqk_tx_fill(struct rtw_dev *rtwdev,
-+                 unsigned int tx_x, unsigned int tx_y)
-+{
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080);
-+    rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000);
-+    rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000);
-+    rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, tx_y);
-+    rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, tx_x);
-+}
-+
-+static void rtw8821a_iqk_tx_vdf_true(struct rtw_dev *rtwdev, u32 cal,
-+                     bool *tx0iqkok,
-+                     int tx_x0[CAL_NUM_8821A],
-+                     int tx_y0[CAL_NUM_8821A])
-+{
-+    u32 cal_retry, delay_count, iqk_ready, tx_fail;
-+    int tx_dt[3], vdf_y[3], vdf_x[3];
-+    int k;
-+
-+    for (k = 0; k < 3; k++) {
-+        switch (k) {
-+        case 0:
-+            /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+            rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
-+                    0x18008c38);
-+            /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+            rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c38);
-+            rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0);
-+            break;
-+        case 1:
-+            rtw_write32_mask(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
-+                     BIT(28), 0x0);
-+            rtw_write32_mask(rtwdev, REG_OFDM0_A_TX_AFE,
-+                     BIT(28), 0x0);
-+            rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0);
-+            break;
-+        case 2:
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "vdf_y[1] = %x vdf_y[0] = %x\n",
-+                vdf_y[1] >> 21 & 0x00007ff,
-+                vdf_y[0] >> 21 & 0x00007ff);
-+
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "vdf_x[1] = %x vdf_x[0] = %x\n",
-+                vdf_x[1] >> 21 & 0x00007ff,
-+                vdf_x[0] >> 21 & 0x00007ff);
-+
-+            tx_dt[cal] = (vdf_y[1] >> 20) - (vdf_y[0] >> 20);
-+            tx_dt[cal] = (16 * tx_dt[cal]) * 10000 / 15708;
-+            tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0));
-+
-+            /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+            rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
-+                    0x18008c20);
-+            /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+            rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c20);
-+            rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x1);
-+            rtw_write32_mask(rtwdev, REG_INTPO_SETA, 0x3fff0000,
-+                     tx_dt[cal] & 0x00003fff);
-+            break;
-+        }
-+
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+
-+        for (cal_retry = 0; cal_retry < 10; cal_retry++) {
-+            /* one shot */
-+            rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
-+            rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
-+
-+            mdelay(10);
-+
-+            rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+
-+            for (delay_count = 0; delay_count < 20; delay_count++) {
-+                iqk_ready = rtw_read32_mask(rtwdev,
-+                                REG_IQKA_END,
-+                                BIT(10));
-+
-+                /* Originally: if (~iqk_ready || delay_count > 20)
-+                 * that looks like a typo so make it more explicit
-+                 */
-+                iqk_ready = true;
-+
-+                if (iqk_ready)
-+                    break;
-+
-+                mdelay(1);
-+            }
-+
-+            if (delay_count < 20) {
-+                /* ============TXIQK Check============== */
-+                tx_fail = rtw_read32_mask(rtwdev,
-+                              REG_IQKA_END,
-+                              BIT(12));
-+
-+                /* Originally: if (~tx_fail) {
-+                 * It looks like a typo, so make it more explicit.
-+                 */
-+                tx_fail = false;
-+
-+                if (!tx_fail) {
-+                    rtw_write32(rtwdev, REG_RFECTL_A,
-+                            0x02000000);
-+                    vdf_x[k] = rtw_read32_mask(rtwdev,
-+                                   REG_IQKA_END,
-+                                   0x07ff0000);
-+                    vdf_x[k] <<= 21;
-+
-+                    rtw_write32(rtwdev, REG_RFECTL_A,
-+                            0x04000000);
-+                    vdf_y[k] = rtw_read32_mask(rtwdev,
-+                                   REG_IQKA_END,
-+                                   0x07ff0000);
-+                    vdf_y[k] <<= 21;
-+
-+                    *tx0iqkok = true;
-+                    break;
-+                }
-+
-+                rtw_write32_mask(rtwdev, REG_IQC_Y,
-+                         0x000007ff, 0x0);
-+                rtw_write32_mask(rtwdev, REG_IQC_X,
-+                         0x000007ff, 0x200);
-+            }
-+
-+            *tx0iqkok = false;
-+        }
-+    }
-+
-+    if (k == 3) {
-+        tx_x0[cal] = vdf_x[k - 1];
-+        tx_y0[cal] = vdf_y[k - 1];
-+    }
-+}
-+
-+static void rtw8821a_iqk_tx_vdf_false(struct rtw_dev *rtwdev, u32 cal,
-+                      bool *tx0iqkok,
-+                      int tx_x0[CAL_NUM_8821A],
-+                      int tx_y0[CAL_NUM_8821A])
-+{
-+    u32 cal_retry, delay_count, iqk_ready, tx_fail;
-+
-+    /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+    rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10);
-+    /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+    rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10);
-+    rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+
-+    for (cal_retry = 0; cal_retry < 10; cal_retry++) {
-+        /* one shot */
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
-+
-+        mdelay(10);
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+
-+        for (delay_count = 0; delay_count < 20; delay_count++) {
-+            iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10));
-+
-+            /* Originally: if (~iqk_ready || delay_count > 20)
-+             * that looks like a typo so make it more explicit
-+             */
-+            iqk_ready = true;
-+
-+            if (iqk_ready)
-+                break;
-+
-+            mdelay(1);
-+        }
-+
-+        if (delay_count < 20) {
-+            /* ============TXIQK Check============== */
-+            tx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(12));
-+
-+            /* Originally: if (~tx_fail) {
-+             * It looks like a typo, so make it more explicit.
-+             */
-+            tx_fail = false;
-+
-+            if (!tx_fail) {
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x02000000);
-+                tx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
-+                                 0x07ff0000);
-+                tx_x0[cal] <<= 21;
-+
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x04000000);
-+                tx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
-+                                 0x07ff0000);
-+                tx_y0[cal] <<= 21;
-+
-+                *tx0iqkok = true;
-+                break;
-+            }
-+
-+            rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, 0x0);
-+            rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, 0x200);
-+        }
-+
-+        *tx0iqkok = false;
-+    }
-+}
-+
-+static void rtw8821a_iqk_rx(struct rtw_dev *rtwdev, u32 cal, bool 
*rx0iqkok,
-+                int rx_x0[CAL_NUM_8821A],
-+                int rx_y0[CAL_NUM_8821A])
-+{
-+    u32 cal_retry, delay_count, iqk_ready, rx_fail;
-+
-+    rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+
-+    for (cal_retry = 0; cal_retry < 10; cal_retry++) {
-+        /* one shot */
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
-+
-+        mdelay(10);
-+
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+
-+        for (delay_count = 0; delay_count < 20; delay_count++) {
-+            iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10));
-+
-+            /* Originally: if (~iqk_ready || delay_count > 20)
-+             * that looks like a typo so make it more explicit
-+             */
-+            iqk_ready = true;
-+
-+            if (iqk_ready)
-+                break;
-+
-+            mdelay(1);
-+        }
-+
-+        if (delay_count < 20) {
-+            /* ============RXIQK Check============== */
-+            rx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(11));
-+            if (!rx_fail) {
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x06000000);
-+                rx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
-+                                 0x07ff0000);
-+                rx_x0[cal] <<= 21;
-+
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x08000000);
-+                rx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
-+                                 0x07ff0000);
-+                rx_y0[cal] <<= 21;
-+
-+                *rx0iqkok = true;
-+                break;
-+            }
-+
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x000003ff, 0x200 >> 1);
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x03ff0000, 0x0 >> 1);
-+        }
-+
-+        *rx0iqkok = false;
-+    }
-+}
-+
-+static void rtw8821a_iqk(struct rtw_dev *rtwdev)
-+{
-+    int tx_average = 0, rx_average = 0, rx_iqk_loop = 0;
-+    const struct rtw_efuse *efuse = &rtwdev->efuse;
-+    int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0;
-+    const struct rtw_hal *hal = &rtwdev->hal;
-+    bool tx0iqkok = false, rx0iqkok = false;
-+    int rx_x_temp = 0, rx_y_temp = 0;
-+    int rx_x0[2][CAL_NUM_8821A];
-+    int rx_y0[2][CAL_NUM_8821A];
-+    int tx_x0[CAL_NUM_8821A];
-+    int tx_y0[CAL_NUM_8821A];
-+    bool rx_finish1 = false;
-+    bool rx_finish2 = false;
-+    bool vdf_enable;
-+    u32 cal;
-+    int i;
-+
-+    rtw_dbg(rtwdev, RTW_DBG_RFK,
-+        "band_width = %d, ext_pa = %d, ext_pa_5g = %d\n",
-+        hal->current_band_width, efuse->ext_pa_2g, efuse->ext_pa_5g);
-+
-+    vdf_enable = hal->current_band_width == RTW_CHANNEL_WIDTH_80;
-+
-+    for (cal = 0; cal < CAL_NUM_8821A; cal++) {
-+        /* path-A LOK */
-+
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+        /* ========path-A AFE all on======== */
-+        /* Port 0 DAC/ADC on */
-+        rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x77777777);
-+        rtw_write32(rtwdev, REG_AFE_PWR2_A, 0x77777777);
-+
-+        rtw_write32(rtwdev, REG_RX_WAIT_CCA_TX_CCK_RFON_A, 0x19791979);
-+
-+        /* hardware 3-wire off */
-+        rtw_write32_mask(rtwdev, REG_3WIRE_SWA, 0xf, 0x4);
-+
-+        /* LOK setting */
-+
-+        /* 1. DAC/ADC sampling rate (160 MHz) */
-+        rtw_write32_mask(rtwdev, REG_CK_MONHA, GENMASK(26, 24), 0x7);
-+
-+        /* 2. LoK RF setting (at BW = 20M) */
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80002);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 0x00c00, 0x3);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
-+                 0x20000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
-+                 0x0003f);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
-+                 0xf3fc3);
-+
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK,
-+                 0x931d5);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001);
-+        rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
-+        rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1);
-+        /* TX (X,Y) */
-+        rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000);
-+        /* RX (X,Y) */
-+        rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000);
-+        /* [0]:AGC_en, [15]:idac_K_Mask */
-+        rtw_write32(rtwdev, REG_IQK_COM96, 0x00462910);
-+
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+        if (efuse->ext_pa_5g)
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                    0x821403f7);
-+        else
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                    0x821403f4);
-+
-+        if (hal->current_band_type == RTW_BAND_5G)
-+            rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x68163e96);
-+        else
-+            rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28163e96);
-+
-+        /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+        rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10);
-+        /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+        rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10);
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
-+
-+        mdelay(10);
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, 0x7fe00,
-+                 rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, 0xffc00));
-+
-+        if (hal->current_band_width == RTW_CHANNEL_WIDTH_40)
-+            rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH,
-+                     RF18_BW_MASK, 0x1);
-+        else if (hal->current_band_width == RTW_CHANNEL_WIDTH_80)
-+            rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH,
-+                     RF18_BW_MASK, 0x0);
-+
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+        /* 3. TX RF setting */
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
-+                 0x20000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
-+                 0x0003f);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
-+                 0xf3fc3);
-+
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 
0x931d5);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
-+        rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
-+        rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1);
-+        /* TX (X,Y) */
-+        rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000);
-+        /* RX (X,Y) */
-+        rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000);
-+        /* [0]:AGC_en, [15]:idac_K_Mask */
-+        rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a910);
-+
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+        if (efuse->ext_pa_5g)
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                    0x821403f7);
-+        else
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                    0x821403e3);
-+
-+        if (hal->current_band_type == RTW_BAND_5G)
-+            rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x40163e96);
-+        else
-+            rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x00163e96);
-+
-+        if (vdf_enable)
-+            rtw8821a_iqk_tx_vdf_true(rtwdev, cal, &tx0iqkok,
-+                         tx_x0, tx_y0);
-+        else
-+            rtw8821a_iqk_tx_vdf_false(rtwdev, cal, &tx0iqkok,
-+                          tx_x0, tx_y0);
-+
-+        if (!tx0iqkok)
-+            break; /* TXK fail, Don't do RXK */
-+
-+        /* ====== RX IQK ====== */
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+        /* 1. RX RF setting */
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
-+                 0x30000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
-+                 0x0002f);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
-+                 0xfffbb);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 
0x931d8);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
-+
-+        rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x03FF8000,
-+                 (tx_x0[cal] >> 21) & 0x000007ff);
-+        rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x000007FF,
-+                 (tx_y0[cal] >> 21) & 0x000007ff);
-+        rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x1);
-+        rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x0);
-+        rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
-+        rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a911);
-+
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+        /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+        rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x38008c10);
-+        /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+        rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x18008c10);
-+        rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x02140119);
-+
-+        if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
-+            rx_iqk_loop = 2; /* for 2% fail; */
-+        else
-+            rx_iqk_loop = 1;
-+
-+        for (i = 0; i < rx_iqk_loop; i++) {
-+            if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && i == 0)
-+                rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28161100); /* 
Good */
-+            else
-+                rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28160d00);
-+
-+            rtw8821a_iqk_rx(rtwdev, cal, &rx0iqkok,
-+                    rx_x0[i], rx_y0[i]);
-+        }
-+
-+        if (tx0iqkok)
-+            tx_average++;
-+        if (rx0iqkok)
-+            rx_average++;
-+    }
-+
-+    /* FillIQK Result */
-+
-+    if (tx_average == 0)
-+        return;
-+
-+    for (i = 0; i < tx_average; i++)
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "tx_x0[%d] = %x ;; tx_y0[%d] = %x\n",
-+            i, (tx_x0[i] >> 21) & 0x000007ff,
-+            i, (tx_y0[i] >> 21) & 0x000007ff);
-+
-+    if (rtw88xxa_iqk_finish(tx_average, 3, tx_x0, tx_y0,
-+                &tx_x, &tx_y, true, true))
-+        rtw8821a_iqk_tx_fill(rtwdev, tx_x, tx_y);
-+    else
-+        rtw8821a_iqk_tx_fill(rtwdev, 0x200, 0x0);
-+
-+    if (rx_average == 0)
-+        return;
-+
-+    for (i = 0; i < rx_average; i++) {
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "rx_x0[0][%d] = %x ;; rx_y0[0][%d] = %x\n",
-+            i, (rx_x0[0][i] >> 21) & 0x000007ff,
-+            i, (rx_y0[0][i] >> 21) & 0x000007ff);
-+
-+        if (rx_iqk_loop == 2)
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "rx_x0[1][%d] = %x ;; rx_y0[1][%d] = %x\n",
-+                i, (rx_x0[1][i] >> 21) & 0x000007ff,
-+                i, (rx_y0[1][i] >> 21) & 0x000007ff);
-+    }
-+
-+    rx_finish1 = rtw88xxa_iqk_finish(rx_average, 4, rx_x0[0], rx_y0[0],
-+                     &rx_x_temp, &rx_y_temp, true, true);
-+
-+    if (rx_finish1) {
-+        rx_x = rx_x_temp;
-+        rx_y = rx_y_temp;
-+    }
-+
-+    if (rx_iqk_loop == 2) {
-+        rx_finish2 = rtw88xxa_iqk_finish(rx_average, 4,
-+                         rx_x0[1], rx_y0[1],
-+                         &rx_x, &rx_y, true, true);
-+
-+        if (rx_finish1 && rx_finish2) {
-+            rx_x = (rx_x + rx_x_temp) / 2;
-+            rx_y = (rx_y + rx_y_temp) / 2;
-+        }
-+    }
-+
-+    if (rx_finish1 || rx_finish2)
-+        rtw8821a_iqk_rx_fill(rtwdev, rx_x, rx_y);
-+    else
-+        rtw8821a_iqk_rx_fill(rtwdev, 0x200, 0x0);
-+}
-+
-+static void rtw8821a_do_iqk(struct rtw_dev *rtwdev)
-+{
-+    static const u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {
-+        0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c
-+    };
-+    static const u32 backup_afe_reg[AFE_REG_NUM_8821A] = {
-+        0xc5c, 0xc60, 0xc64, 0xc68
-+    };
-+    static const u32 backup_rf_reg[RF_REG_NUM_8821A] = {
-+        0x65, 0x8f, 0x0
-+    };
-+    u32 macbb_backup[MACBB_REG_NUM_8821A];
-+    u32 afe_backup[AFE_REG_NUM_8821A];
-+    u32 rfa_backup[RF_REG_NUM_8821A];
-+
-+    rtw88xxa_iqk_backup_mac_bb(rtwdev, macbb_backup,
-+                   backup_macbb_reg, MACBB_REG_NUM_8821A);
-+    rtw88xxa_iqk_backup_afe(rtwdev, afe_backup,
-+                backup_afe_reg, AFE_REG_NUM_8821A);
-+    rtw8821a_iqk_backup_rf(rtwdev, rfa_backup,
-+                   backup_rf_reg, RF_REG_NUM_8821A);
-+
-+    rtw88xxa_iqk_configure_mac(rtwdev);
-+
-+    rtw8821a_iqk(rtwdev);
-+
-+    rtw8821a_iqk_restore_rf(rtwdev, backup_rf_reg,
-+                rfa_backup, RF_REG_NUM_8821A);
-+    rtw8821a_iqk_restore_afe(rtwdev, afe_backup,
-+                 backup_afe_reg, AFE_REG_NUM_8821A);
-+    rtw88xxa_iqk_restore_mac_bb(rtwdev, macbb_backup,
-+                    backup_macbb_reg, MACBB_REG_NUM_8821A);
-+}
-+
-+static void rtw8821a_phy_calibration(struct rtw_dev *rtwdev)
-+{
-+    rtw8821a_do_iqk(rtwdev);
-+}
-+
-+static void rtw8821a_pwr_track(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+
-+    if (!dm_info->pwr_trk_triggered) {
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
-+                 GENMASK(17, 16), 0x03);
-+        dm_info->pwr_trk_triggered = true;
-+        return;
-+    }
-+
-+    rtw88xxa_phy_pwrtrack(rtwdev, NULL, rtw8821a_do_iqk);
-+    dm_info->pwr_trk_triggered = false;
-+}
-+
-+static void rtw8821a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-+                      struct rtw_tx_pkt_info *pkt_info,
-+                      u8 *txdesc)
-+{
-+    fill_txdesc_checksum_common(txdesc, 16);
-+}
-+
-+static void rtw8821a_coex_cfg_init(struct rtw_dev *rtwdev)
-+{
-+    u8 val8;
-+
-+    /* BT report packet sample rate */
-+    rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
-+
-+    val8 = BIT_STATIS_BT_EN;
-+    if (rtwdev->efuse.share_ant)
-+        val8 |= BIT_R_GRANTALL_WLMASK;
-+    rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL, val8);
-+
-+    /* enable BT counter statistics */
-+    rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x3);
-+
-+    /* enable PTA */
-+    rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
-+}
-+
-+static void rtw8821a_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 
ctrl_type,
-+                     u8 pos_type)
-+{
-+    bool share_ant = rtwdev->efuse.share_ant;
-+    struct rtw_coex *coex = &rtwdev->coex;
-+    struct rtw_coex_dm *coex_dm = &coex->dm;
-+    u32 phase = coex_dm->cur_ant_pos_type;
-+
-+    if (!rtwdev->efuse.btcoex)
-+        return;
-+
-+    switch (phase) {
-+    case COEX_SET_ANT_POWERON:
-+    case COEX_SET_ANT_INIT:
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
-+        rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
-+        rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
-+
-+        rtw_write8(rtwdev, REG_RFE_CTRL8,
-+               share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN);
-+        rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
-+        break;
-+    case COEX_SET_ANT_WONLY:
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
-+        rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
-+        rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
-+
-+        rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
-+        rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
-+        break;
-+    case COEX_SET_ANT_2G:
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
-+        rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
-+        rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
-+
-+        rtw_write8(rtwdev, REG_RFE_CTRL8,
-+               share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN);
-+        rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
-+        break;
-+    case COEX_SET_ANT_5G:
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
-+        rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
-+        rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
-+
-+        rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
-+        rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000,
-+                 share_ant ? 0x2 : 0x1);
-+        break;
-+    case COEX_SET_ANT_WOFF:
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
-+        rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
-+        rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
-+
-+        rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
-+        rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000,
-+                 share_ant ? 0x2 : 0x1);
-+        break;
-+    default:
-+        rtw_warn(rtwdev, "%s: not handling phase %d\n",
-+             __func__, phase);
-+        break;
-+    }
-+}
-+
-+static void rtw8821a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static void rtw8821a_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static void rtw8821a_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_coex *coex = &rtwdev->coex;
-+    struct rtw_coex_rfe *coex_rfe = &coex->rfe;
-+
-+    coex_rfe->ant_switch_exist = true;
-+}
-+
-+static void rtw8821a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 
wl_pwr)
-+{
-+    struct rtw_coex *coex = &rtwdev->coex;
-+    struct rtw_coex_dm *coex_dm = &coex->dm;
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    bool share_ant = efuse->share_ant;
-+
-+    if (share_ant)
-+        return;
-+
-+    if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
-+        return;
-+
-+    coex_dm->cur_wl_pwr_lvl = wl_pwr;
-+}
-+
-+static void rtw8821a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool 
low_gain)
-+{
-+}
-+
-+static const struct rtw_chip_ops rtw8821a_ops = {
-+    .power_on        = rtw88xxa_power_on,
-+    .power_off        = rtw8821a_power_off,
-+    .phy_set_param        = NULL,
-+    .read_efuse        = rtw88xxa_read_efuse,
-+    .query_phy_status    = rtw8821a_query_phy_status,
-+    .set_channel        = rtw88xxa_set_channel,
-+    .mac_init        = NULL,
-+    .read_rf        = rtw88xxa_phy_read_rf,
-+    .write_rf        = rtw_phy_write_rf_reg_sipi,
-+    .set_antenna        = NULL,
-+    .set_tx_power_index    = rtw88xxa_set_tx_power_index,
-+    .cfg_ldo25        = rtw8821a_cfg_ldo25,
-+    .efuse_grant        = rtw88xxa_efuse_grant,
-+    .false_alarm_statistics    = rtw88xxa_false_alarm_statistics,
-+    .phy_calibration    = rtw8821a_phy_calibration,
-+    .cck_pd_set        = rtw88xxa_phy_cck_pd_set,
-+    .pwr_track        = rtw8821a_pwr_track,
-+    .config_bfee        = NULL,
-+    .set_gid_table        = NULL,
-+    .cfg_csi_rate        = NULL,
-+    .fill_txdesc_checksum    = rtw8821a_fill_txdesc_checksum,
-+    .coex_set_init        = rtw8821a_coex_cfg_init,
-+    .coex_set_ant_switch    = rtw8821a_coex_cfg_ant_switch,
-+    .coex_set_gnt_fix    = rtw8821a_coex_cfg_gnt_fix,
-+    .coex_set_gnt_debug    = rtw8821a_coex_cfg_gnt_debug,
-+    .coex_set_rfe_type    = rtw8821a_coex_cfg_rfe_type,
-+    .coex_set_wl_tx_power    = rtw8821a_coex_cfg_wl_tx_power,
-+    .coex_set_wl_rx_gain    = rtw8821a_coex_cfg_wl_rx_gain,
-+};
-+
-+static const struct rtw_page_table page_table_8821a[] = {
-+    /* hq_num, nq_num, lq_num, exq_num, gapq_num */
-+    {0, 0, 0, 0, 0},    /* SDIO */
-+    {0, 0, 0, 0, 0},    /* PCI */
-+    {8, 0, 0, 0, 1},    /* 2 bulk out endpoints */
-+    {8, 0, 8, 0, 1},    /* 3 bulk out endpoints */
-+    {8, 0, 8, 4, 1},    /* 4 bulk out endpoints */
-+};
-+
-+static const struct rtw_rqpn rqpn_table_8821a[] = {
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH,
-+     RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+};
-+
-+static const struct rtw_prioq_addrs prioq_addrs_8821a = {
-+    .prio[RTW_DMA_MAPPING_EXTRA] = {
-+        .rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
-+    },
-+    .prio[RTW_DMA_MAPPING_LOW] = {
-+        .rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
-+    },
-+    .prio[RTW_DMA_MAPPING_NORMAL] = {
-+        .rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
-+    },
-+    .prio[RTW_DMA_MAPPING_HIGH] = {
-+        .rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
-+    },
-+    .wsize = false,
-+};
-+
-+static const struct rtw_hw_reg rtw8821a_dig[] = {
-+    [0] = { .addr = REG_RXIGI_A, .mask = 0x7f },
-+};
-+
-+static const struct rtw_rfe_def rtw8821a_rfe_defs[] = {
-+    [0] = { .phy_pg_tbl    = &rtw8821a_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8821a_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8821a_rtw_pwr_track_tbl, },
-+};
-+
-+/* TODO */
-+/* rssi in percentage % (dbm = % - 100) */
-+static const u8 wl_rssi_step_8821a[] = {101, 45, 101, 40};
-+static const u8 bt_rssi_step_8821a[] = {101, 101, 101, 101};
-+
-+/* table_sant_8821a, table_nsant_8821a, tdma_sant_8821a, and 
tdma_nsant_8821a
-+ * are copied from rtw8821c.c because the 8821au driver's tables are not
-+ * compatible with the coex code in rtw88.
-+ *
-+ * tdma case 112 (A2DP) byte 0 had to be modified from 0x61 to 0x51,
-+ * otherwise the firmware gets confused after pausing the music:
-+ * rtw_8821au 1-2:1.2: [BTCoex], Bt_info[1], len=7, data=[81 00 0a 01 
00 00]
-+ * - 81 means PAN (personal area network) when it should be 4x (A2DP)
-+ * The music is not smooth with the PAN algorithm.
-+ */
-+
-+/* Shared-Antenna Coex Table */
-+static const struct coex_table_para table_sant_8821a[] = {
-+    {0x55555555, 0x55555555}, /* case-0 */
-+    {0x55555555, 0x55555555},
-+    {0x66555555, 0x66555555},
-+    {0xaaaaaaaa, 0xaaaaaaaa},
-+    {0x5a5a5a5a, 0x5a5a5a5a},
-+    {0xfafafafa, 0xfafafafa}, /* case-5 */
-+    {0x6a5a5555, 0xaaaaaaaa},
-+    {0x6a5a56aa, 0x6a5a56aa},
-+    {0x6a5a5a5a, 0x6a5a5a5a},
-+    {0x66555555, 0x5a5a5a5a},
-+    {0x66555555, 0x6a5a5a5a}, /* case-10 */
-+    {0x66555555, 0xaaaaaaaa},
-+    {0x66555555, 0x6a5a5aaa},
-+    {0x66555555, 0x6aaa6aaa},
-+    {0x66555555, 0x6a5a5aaa},
-+    {0x66555555, 0xaaaaaaaa}, /* case-15 */
-+    {0xffff55ff, 0xfafafafa},
-+    {0xffff55ff, 0x6afa5afa},
-+    {0xaaffffaa, 0xfafafafa},
-+    {0xaa5555aa, 0x5a5a5a5a},
-+    {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
-+    {0xaa5555aa, 0xaaaaaaaa},
-+    {0xffffffff, 0x55555555},
-+    {0xffffffff, 0x5a5a5a5a},
-+    {0xffffffff, 0x5a5a5a5a},
-+    {0xffffffff, 0x5a5a5aaa}, /* case-25 */
-+    {0x55555555, 0x5a5a5a5a},
-+    {0x55555555, 0xaaaaaaaa},
-+    {0x66555555, 0x6a5a6a5a},
-+    {0x66556655, 0x66556655},
-+    {0x66556aaa, 0x6a5a6aaa}, /* case-30 */
-+    {0xffffffff, 0x5aaa5aaa},
-+    {0x56555555, 0x5a5a5aaa}
-+};
-+
-+/* Non-Shared-Antenna Coex Table */
-+static const struct coex_table_para table_nsant_8821a[] = {
-+    {0xffffffff, 0xffffffff}, /* case-100 */
-+    {0xffff55ff, 0xfafafafa},
-+    {0x66555555, 0x66555555},
-+    {0xaaaaaaaa, 0xaaaaaaaa},
-+    {0x5a5a5a5a, 0x5a5a5a5a},
-+    {0xffffffff, 0xffffffff}, /* case-105 */
-+    {0x5afa5afa, 0x5afa5afa},
-+    {0x55555555, 0xfafafafa},
-+    {0x66555555, 0xfafafafa},
-+    {0x66555555, 0x5a5a5a5a},
-+    {0x66555555, 0x6a5a5a5a}, /* case-110 */
-+    {0x66555555, 0xaaaaaaaa},
-+    {0xffff55ff, 0xfafafafa},
-+    {0xffff55ff, 0x5afa5afa},
-+    {0xffff55ff, 0xaaaaaaaa},
-+    {0xffff55ff, 0xffff55ff}, /* case-115 */
-+    {0xaaffffaa, 0x5afa5afa},
-+    {0xaaffffaa, 0xaaaaaaaa},
-+    {0xffffffff, 0xfafafafa},
-+    {0xffff55ff, 0xfafafafa},
-+    {0xffffffff, 0xaaaaaaaa}, /* case-120 */
-+    {0xffff55ff, 0x5afa5afa},
-+    {0xffff55ff, 0x5afa5afa},
-+    {0x55ff55ff, 0x55ff55ff}
-+};
-+
-+/* Shared-Antenna TDMA */
-+static const struct coex_tdma_para tdma_sant_8821a[] = {
-+    { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
-+    { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
-+    { {0x61, 0x3a, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x35, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x20, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x3a, 0x03, 0x11, 0x11} }, /* case-5 */
-+    { {0x61, 0x45, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x35, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x30, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x20, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
-+    { {0x61, 0x08, 0x03, 0x11, 0x15} },
-+    { {0x61, 0x08, 0x03, 0x10, 0x14} },
-+    { {0x51, 0x08, 0x03, 0x10, 0x54} },
-+    { {0x51, 0x08, 0x03, 0x10, 0x55} },
-+    { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
-+    { {0x51, 0x45, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x3a, 0x03, 0x11, 0x50} },
-+    { {0x51, 0x30, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x21, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
-+    { {0x51, 0x4a, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x08, 0x03, 0x30, 0x54} },
-+    { {0x55, 0x08, 0x03, 0x10, 0x54} },
-+    { {0x65, 0x10, 0x03, 0x11, 0x10} },
-+    { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
-+    { {0x51, 0x21, 0x03, 0x10, 0x50} },
-+    { {0x61, 0x08, 0x03, 0x11, 0x11} }
-+};
-+
-+/* Non-Shared-Antenna TDMA */
-+static const struct coex_tdma_para tdma_nsant_8821a[] = {
-+    { {0x00, 0x00, 0x00, 0x40, 0x00} }, /* case-100 */
-+    { {0x61, 0x45, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x25, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x35, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x20, 0x03, 0x11, 0x11} },
-+    { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
-+    { {0x61, 0x45, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x30, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x30, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x20, 0x03, 0x11, 0x10} },
-+    { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
-+    { {0x61, 0x10, 0x03, 0x11, 0x11} },
-+    { {0x51, 0x08, 0x03, 0x10, 0x14} }, /* a2dp high rssi */
-+    { {0x51, 0x08, 0x03, 0x10, 0x54} }, /* a2dp not high rssi */
-+    { {0x51, 0x08, 0x03, 0x10, 0x55} },
-+    { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
-+    { {0x51, 0x45, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x3a, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x30, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x21, 0x03, 0x10, 0x50} },
-+    { {0x51, 0x21, 0x03, 0x10, 0x50} }, /* case-120 */
-+    { {0x51, 0x10, 0x03, 0x10, 0x50} }
-+};
-+
-+/* TODO */
-+static const struct coex_rf_para rf_para_tx_8821a[] = {
-+    {0, 0, false, 7},  /* for normal */
-+    {0, 20, false, 7}, /* for WL-CPT */
-+    {8, 17, true, 4},
-+    {7, 18, true, 4},
-+    {6, 19, true, 4},
-+    {5, 20, true, 4}
-+};
-+
-+static const struct coex_rf_para rf_para_rx_8821a[] = {
-+    {0, 0, false, 7},  /* for normal */
-+    {0, 20, false, 7}, /* for WL-CPT */
-+    {3, 24, true, 5},
-+    {2, 26, true, 5},
-+    {1, 27, true, 5},
-+    {0, 28, true, 5}
-+};
-+
-+static_assert(ARRAY_SIZE(rf_para_tx_8821a) == 
ARRAY_SIZE(rf_para_rx_8821a));
-+
-+static const struct coex_5g_afh_map afh_5g_8821a[] = { {0, 0, 0} };
-+
-+static const struct rtw_reg_domain coex_info_hw_regs_8821a[] = {
-+    {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-+    {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-+    {0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
-+    {0, 0, RTW_REG_DOMAIN_NL},
-+    {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-+    {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-+    {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
-+    {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
-+    {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
-+    {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
-+    {0, 0, RTW_REG_DOMAIN_NL},
-+    {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
-+    {0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
-+    {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
-+    {0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
-+    {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A},
-+    {0, 0, RTW_REG_DOMAIN_NL},
-+    {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
-+    {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
-+    {0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
-+    {0xc50,  MASKBYTE0, RTW_REG_DOMAIN_MAC8},
-+    {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
-+};
-+
-+const struct rtw_chip_info rtw8821a_hw_spec = {
-+    .ops = &rtw8821a_ops,
-+    .id = RTW_CHIP_TYPE_8821A,
-+    .fw_name = "rtw88/rtw8821a_fw.bin",
-+    .wlan_cpu = RTW_WCPU_11N,
-+    .tx_pkt_desc_sz = 40,
-+    .tx_buf_desc_sz = 16,
-+    .rx_pkt_desc_sz = 24,
-+    .rx_buf_desc_sz = 8,
-+    .phy_efuse_size = 512,
-+    .log_efuse_size = 512,
-+    .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
-+    .txff_size = 65536,
-+    .rxff_size = 16128,
-+    .rsvd_drv_pg_num = 8,
-+    .txgi_factor = 1,
-+    .is_pwr_by_rate_dec = true,
-+    .max_power_index = 0x3f,
-+    .csi_buf_pg_num = 0,
-+    .band = RTW_BAND_2G | RTW_BAND_5G,
-+    .page_size = 256,
-+    .dig_min = 0x20,
-+    .ht_supported = true,
-+    .vht_supported = true,
-+    .lps_deep_mode_supported = 0,
-+    .sys_func_en = 0xFD,
-+    .pwr_on_seq = card_enable_flow_8821a,
-+    .pwr_off_seq = card_disable_flow_8821a,
-+    .page_table = page_table_8821a,
-+    .rqpn_table = rqpn_table_8821a,
-+    .prioq_addrs = &prioq_addrs_8821a,
-+    .intf_table = NULL,
-+    .dig = rtw8821a_dig,
-+    .rf_sipi_addr = {REG_LSSI_WRITE_A, REG_LSSI_WRITE_B},
-+    .ltecoex_addr = NULL,
-+    .mac_tbl = &rtw8821a_mac_tbl,
-+    .agc_tbl = &rtw8821a_agc_tbl,
-+    .bb_tbl = &rtw8821a_bb_tbl,
-+    .rf_tbl = {&rtw8821a_rf_a_tbl},
-+    .rfe_defs = rtw8821a_rfe_defs,
-+    .rfe_defs_size = ARRAY_SIZE(rtw8821a_rfe_defs),
-+    .rx_ldpc = false,
-+    .hw_feature_report = false,
-+    .c2h_ra_report_size = 4,
-+    .old_datarate_fb_limit = true,
-+    .usb_tx_agg_desc_num = 6,
-+    .iqk_threshold = 8,
-+    .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-+    .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
-+
-+    .coex_para_ver = 20190509, /* glcoex_ver_date_8821a_1ant */
-+    .bt_desired_ver = 0x62, /* But for 2 ant it's 0x5c */
-+    .scbd_support = false,
-+    .new_scbd10_def = false,
-+    .ble_hid_profile_support = false,
-+    .wl_mimo_ps_support = false,
-+    .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
-+    .bt_rssi_type = COEX_BTRSSI_RATIO,
-+    .ant_isolation = 10,
-+    .rssi_tolerance = 2,
-+    .wl_rssi_step = wl_rssi_step_8821a,
-+    .bt_rssi_step = bt_rssi_step_8821a,
-+    .table_sant_num = ARRAY_SIZE(table_sant_8821a),
-+    .table_sant = table_sant_8821a,
-+    .table_nsant_num = ARRAY_SIZE(table_nsant_8821a),
-+    .table_nsant = table_nsant_8821a,
-+    .tdma_sant_num = ARRAY_SIZE(tdma_sant_8821a),
-+    .tdma_sant = tdma_sant_8821a,
-+    .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821a),
-+    .tdma_nsant = tdma_nsant_8821a,
-+    .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821a),
-+    .wl_rf_para_tx = rf_para_tx_8821a,
-+    .wl_rf_para_rx = rf_para_rx_8821a,
-+    .bt_afh_span_bw20 = 0x20,
-+    .bt_afh_span_bw40 = 0x30,
-+    .afh_5g_num = ARRAY_SIZE(afh_5g_8821a),
-+    .afh_5g = afh_5g_8821a,
-+
-+    .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821a),
-+    .coex_info_hw_regs = coex_info_hw_regs_8821a,
-+};
-+EXPORT_SYMBOL(rtw8821a_hw_spec);
-+
-+MODULE_FIRMWARE("rtw88/rtw8821a_fw.bin");
-+
-+MODULE_AUTHOR("Realtek Corporation");
-+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821a/8811a driver");
-+MODULE_LICENSE("Dual BSD/GPL");
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.h
-@@ -0,0 +1,10 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#ifndef __RTW8821A_H__
-+#define __RTW8821A_H__
-+
-+extern const struct rtw_chip_info rtw8821a_hw_spec;
-+
-+#endif
diff --git 
a/package/kernel/mac80211/patches/rtl/043-v6.13-wifi-rtw88-Add-rtw8812a.-c-h.patch 
b/package/kernel/mac80211/patches/rtl/043-v6.13-wifi-rtw88-Add-rtw8812a.-c-h.patch
deleted file mode 100644
index 610dca037a2367..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/043-v6.13-wifi-rtw88-Add-rtw8812a.-c-h.patch
+++ /dev/null
@@ -1,1135 +0,0 @@
-From 4f8ec8927bc292b2a71cd5a253c96ce3c6b2927f Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:28:49 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw8812a.{c,h}
-
-These contain code specific to RTL8812AU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/a0057683-79eb-4ab2-8f74-11a3bc58adfb@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8812a.c | 1102 +++++++++++++++++
- drivers/net/wireless/realtek/rtw88/rtw8812a.h |   10 +
- 2 files changed, 1112 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812a.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812a.h
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-@@ -0,0 +1,1102 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include "main.h"
-+#include "coex.h"
-+#include "phy.h"
-+#include "reg.h"
-+#include "rtw88xxa.h"
-+#include "rtw8812a.h"
-+#include "rtw8812a_table.h"
-+#include "tx.h"
-+
-+static void rtw8812a_power_off(struct rtw_dev *rtwdev)
-+{
-+    rtw88xxa_power_off(rtwdev, enter_lps_flow_8812a);
-+}
-+
-+static s8 rtw8812a_cck_rx_pwr(u8 lna_idx, u8 vga_idx)
-+{
-+    s8 rx_pwr_all = 0;
-+
-+    switch (lna_idx) {
-+    case 7:
-+        if (vga_idx <= 27)
-+            rx_pwr_all = -94 + 2 * (27 - vga_idx);
-+        else
-+            rx_pwr_all = -94;
-+        break;
-+    case 6:
-+        rx_pwr_all = -42 + 2 * (2 - vga_idx);
-+        break;
-+    case 5:
-+        rx_pwr_all = -36 + 2 * (7 - vga_idx);
-+        break;
-+    case 4:
-+        rx_pwr_all = -30 + 2 * (7 - vga_idx);
-+        break;
-+    case 3:
-+        rx_pwr_all = -18 + 2 * (7 - vga_idx);
-+        break;
-+    case 2:
-+        rx_pwr_all = 2 * (5 - vga_idx);
-+        break;
-+    case 1:
-+        rx_pwr_all = 14 - 2 * vga_idx;
-+        break;
-+    case 0:
-+        rx_pwr_all = 20 - 2 * vga_idx;
-+        break;
-+    default:
-+        break;
-+    }
-+
-+    return rx_pwr_all;
-+}
-+
-+static void rtw8812a_query_phy_status(struct rtw_dev *rtwdev, u8 
*phy_status,
-+                      struct rtw_rx_pkt_stat *pkt_stat)
-+{
-+    rtw88xxa_query_phy_status(rtwdev, phy_status, pkt_stat,
-+                  rtw8812a_cck_rx_pwr);
-+
-+    if (pkt_stat->rate >= DESC_RATE6M)
-+        return;
-+
-+    if (rtwdev->hal.cck_high_power)
-+        return;
-+
-+    if (pkt_stat->rssi >= 80)
-+        pkt_stat->rssi = ((pkt_stat->rssi - 80) << 1) +
-+                 ((pkt_stat->rssi - 80) >> 1) + 80;
-+    else if (pkt_stat->rssi <= 78 && pkt_stat->rssi >= 20)
-+        pkt_stat->rssi += 3;
-+}
-+
-+static void rtw8812a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
-+{
-+}
-+
-+static void rtw8812a_do_lck(struct rtw_dev *rtwdev)
-+{
-+    u32 cont_tx, lc_cal, i;
-+
-+    cont_tx = rtw_read32_mask(rtwdev, REG_SINGLE_TONE_CONT_TX, 0x70000);
-+
-+    lc_cal = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
-+
-+    if (!cont_tx)
-+        rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
-+
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_LCK, BIT(14), 1);
-+
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 0x08000, 1);
-+
-+    mdelay(150);
-+
-+    for (i = 0; i < 5; i++) {
-+        if (rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, 0x08000) != 1)
-+            break;
-+
-+        mdelay(10);
-+    }
-+
-+    if (i == 5)
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "LCK timed out\n");
-+
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
-+
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_LCK, BIT(14), 0);
-+
-+    if (!cont_tx)
-+        rtw_write8(rtwdev, REG_TXPAUSE, 0);
-+
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
-+}
-+
-+static void rtw8812a_iqk_backup_rf(struct rtw_dev *rtwdev, u32 
*rfa_backup,
-+                   u32 *rfb_backup, const u32 *backup_rf_reg,
-+                   u32 rf_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Save RF Parameters */
-+    for (i = 0; i < rf_num; i++) {
-+        rfa_backup[i] = rtw_read_rf(rtwdev, RF_PATH_A,
-+                        backup_rf_reg[i], MASKDWORD);
-+        rfb_backup[i] = rtw_read_rf(rtwdev, RF_PATH_B,
-+                        backup_rf_reg[i], MASKDWORD);
-+    }
-+}
-+
-+static void rtw8812a_iqk_restore_rf(struct rtw_dev *rtwdev,
-+                    enum rtw_rf_path path,
-+                    const u32 *backup_rf_reg,
-+                    u32 *RF_backup, u32 rf_reg_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    for (i = 0; i < rf_reg_num; i++)
-+        rtw_write_rf(rtwdev, path, backup_rf_reg[i],
-+                 RFREG_MASK, RF_backup[i]);
-+
-+    rtw_write_rf(rtwdev, path, RF_LUTWE, RFREG_MASK, 0);
-+}
-+
-+static void rtw8812a_iqk_restore_afe(struct rtw_dev *rtwdev, u32 
*afe_backup,
-+                     const u32 *backup_afe_reg, u32 afe_num)
-+{
-+    u32 i;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* Reload AFE Parameters */
-+    for (i = 0; i < afe_num; i++)
-+        rtw_write32(rtwdev, backup_afe_reg[i], afe_backup[i]);
-+
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x0);
-+    rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x0);
-+    rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x0);
-+    rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x3c000000);
-+    rtw_write32_mask(rtwdev, REG_LSSI_WRITE_A, BIT(7), 1);
-+    rtw_write32_mask(rtwdev, REG_IQK_DPD_CFG, BIT(18), 1);
-+    rtw_write32_mask(rtwdev, REG_IQK_DPD_CFG, BIT(29), 1);
-+    rtw_write32_mask(rtwdev, REG_CFG_PMPD, BIT(29), 1);
-+
-+    rtw_write32(rtwdev, REG_TXTONEB, 0x0);
-+    rtw_write32(rtwdev, REG_RXTONEB, 0x0);
-+    rtw_write32(rtwdev, REG_TXPITMB, 0x0);
-+    rtw_write32(rtwdev, REG_RXPITMB, 0x3c000000);
-+    rtw_write32_mask(rtwdev, REG_LSSI_WRITE_B, BIT(7), 1);
-+    rtw_write32_mask(rtwdev, REG_BPBDB, BIT(18), 1);
-+    rtw_write32_mask(rtwdev, REG_BPBDB, BIT(29), 1);
-+    rtw_write32_mask(rtwdev, REG_PHYTXONB, BIT(29), 1);
-+}
-+
-+static void rtw8812a_iqk_rx_fill(struct rtw_dev *rtwdev, enum 
rtw_rf_path path,
-+                 unsigned int rx_x, unsigned int rx_y)
-+{
-+    switch (path) {
-+    case RF_PATH_A:
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+        if (rx_x >> 1 >= 0x112 ||
-+            (rx_y >> 1 >= 0x12 && rx_y >> 1 <= 0x3ee)) {
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x000003ff, 0x100);
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x03ff0000, 0);
-+        } else {
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x000003ff, rx_x >> 1);
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
-+                     0x03ff0000, rx_y >> 1);
-+        }
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "rx_x = %x;;rx_y = %x ====>fill to IQC\n",
-+            rx_x >> 1 & 0x000003ff, rx_y >> 1 & 0x000003ff);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "0xc10 = %x ====>fill to IQC\n",
-+            rtw_read32(rtwdev, REG_RX_IQC_AB_A));
-+        break;
-+    case RF_PATH_B:
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+        if (rx_x >> 1 >= 0x112 ||
-+            (rx_y >> 1 >= 0x12 && rx_y >> 1 <= 0x3ee)) {
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_B,
-+                     0x000003ff, 0x100);
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_B,
-+                     0x03ff0000, 0);
-+        } else {
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_B,
-+                     0x000003ff, rx_x >> 1);
-+            rtw_write32_mask(rtwdev, REG_RX_IQC_AB_B,
-+                     0x03ff0000, rx_y >> 1);
-+        }
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "rx_x = %x;;rx_y = %x ====>fill to IQC\n",
-+            rx_x >> 1 & 0x000003ff, rx_y >> 1 & 0x000003ff);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "0xe10 = %x====>fill to IQC\n",
-+            rtw_read32(rtwdev, REG_RX_IQC_AB_B));
-+        break;
-+    default:
-+        break;
-+    }
-+}
-+
-+static void rtw8812a_iqk_tx_fill(struct rtw_dev *rtwdev, enum 
rtw_rf_path path,
-+                 unsigned int tx_x, unsigned int tx_y)
-+{
-+    switch (path) {
-+    case RF_PATH_A:
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+        rtw_write32_mask(rtwdev, REG_PREDISTA, BIT(7), 0x1);
-+        rtw_write32_mask(rtwdev, REG_IQK_DPD_CFG, BIT(18), 0x1);
-+        rtw_write32_mask(rtwdev, REG_IQK_DPD_CFG, BIT(29), 0x1);
-+        rtw_write32_mask(rtwdev, REG_CFG_PMPD, BIT(29), 0x1);
-+        rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, tx_y);
-+        rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, tx_x);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "tx_x = %x;;tx_y = %x =====> fill to IQC\n",
-+            tx_x & 0x000007ff, tx_y & 0x000007ff);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
-+            rtw_read32_mask(rtwdev, REG_IQC_X, 0x000007ff),
-+            rtw_read32_mask(rtwdev, REG_IQC_Y, 0x000007ff));
-+        break;
-+    case RF_PATH_B:
-+        /* [31] = 1 --> Page C1 */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+        rtw_write32_mask(rtwdev, REG_PREDISTB, BIT(7), 0x1);
-+        rtw_write32_mask(rtwdev, REG_BPBDB, BIT(18), 0x1);
-+        rtw_write32_mask(rtwdev, REG_BPBDB, BIT(29), 0x1);
-+        rtw_write32_mask(rtwdev, REG_PHYTXONB, BIT(29), 0x1);
-+        rtw_write32_mask(rtwdev, REG_IQKYB, 0x000007ff, tx_y);
-+        rtw_write32_mask(rtwdev, REG_IQKXB, 0x000007ff, tx_x);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "tx_x = %x;;tx_y = %x =====> fill to IQC\n",
-+            tx_x & 0x000007ff, tx_y & 0x000007ff);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "0xed4 = %x;;0xecc = %x ====>fill to IQC\n",
-+            rtw_read32_mask(rtwdev, REG_IQKXB, 0x000007ff),
-+            rtw_read32_mask(rtwdev, REG_IQKYB, 0x000007ff));
-+        break;
-+    default:
-+        break;
-+    }
-+}
-+
-+static void rtw8812a_iqk(struct rtw_dev *rtwdev)
-+{
-+    int tx_x0_temp[10], tx_y0_temp[10], tx_x1_temp[10], tx_y1_temp[10];
-+    int rx_x0_temp[10], rx_y0_temp[10], rx_x1_temp[10], rx_y1_temp[10];
-+    bool iqk0_ready = false, tx0_finish = false, rx0_finish = false;
-+    bool iqk1_ready = false, tx1_finish = false, rx1_finish = false;
-+    u8 tx0_avg = 0, tx1_avg = 0, rx0_avg = 0, rx1_avg = 0;
-+    int tx_x0 = 0, tx_y0 = 0, tx_x1 = 0, tx_y1 = 0;
-+    int rx_x0 = 0, rx_y0 = 0, rx_x1 = 0, rx_y1 = 0;
-+    struct rtw_efuse *efuse = &rtwdev->efuse;
-+    bool tx0_fail = true, rx0_fail = true;
-+    bool tx1_fail = true, rx1_fail = true;
-+    u8 cal0_retry, cal1_retry;
-+    u8 delay_count;
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+    /* ========path-A AFE all on======== */
-+    /* Port 0 DAC/ADC on */
-+    rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x77777777);
-+    rtw_write32(rtwdev, REG_AFE_PWR2_A, 0x77777777);
-+
-+    /* Port 1 DAC/ADC on */
-+    rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x77777777);
-+    rtw_write32(rtwdev, REG_AFE_PWR2_B, 0x77777777);
-+
-+    rtw_write32(rtwdev, REG_RX_WAIT_CCA_TX_CCK_RFON_A, 0x19791979);
-+    rtw_write32(rtwdev, REG_RX_WAIT_CCA_TX_CCK_RFON_B, 0x19791979);
-+
-+    /* hardware 3-wire off */
-+    rtw_write32_mask(rtwdev, REG_3WIRE_SWA, 0xf, 0x4);
-+    rtw_write32_mask(rtwdev, REG_3WIRE_SWB, 0xf, 0x4);
-+
-+    /* DAC/ADC sampling rate (160 MHz) */
-+    rtw_write32_mask(rtwdev, REG_CK_MONHA, GENMASK(26, 24), 0x7);
-+    rtw_write32_mask(rtwdev, REG_CK_MONHB, GENMASK(26, 24), 0x7);
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+    /* ====== path A TX IQK RF setting ====== */
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80002);
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK, 
0x20000);
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK, 
0x3fffd);
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK, 
0xfe83f);
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 0x931d5);
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001);
-+
-+    /* ====== path B TX IQK RF setting ====== */
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE, RFREG_MASK, 0x80002);
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_ADDR, RFREG_MASK, 
0x20000);
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_DATA0, RFREG_MASK, 
0x3fffd);
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_DATA1, RFREG_MASK, 
0xfe83f);
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_TXA_PREPAD, RFREG_MASK, 0x931d5);
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_RXBB2, RFREG_MASK, 0x8a001);
-+
-+    rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
-+    rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1);
-+    rtw_write32_mask(rtwdev, REG_INIDLYB, BIT(0), 0x1);
-+    rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000); /* TX (X,Y) */
-+    rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000); /* RX (X,Y) */
-+    rtw_write32(rtwdev, REG_IQK_COM96, 0x00462910); /* [0]:AGC_en, 
[15]:idac_K_Mask */
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    if (efuse->ext_pa_5g) {
-+        if (efuse->rfe_option == 1) {
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x821403e3);
-+            rtw_write32(rtwdev, REG_TXPITMB, 0x821403e3);
-+        } else {
-+            rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x821403f7);
-+            rtw_write32(rtwdev, REG_TXPITMB, 0x821403f7);
-+        }
-+    } else {
-+        rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x821403f1);
-+        rtw_write32(rtwdev, REG_TXPITMB, 0x821403f1);
-+    }
-+
-+    if (rtwdev->hal.current_band_type == RTW_BAND_5G) {
-+        rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x68163e96);
-+        rtw_write32(rtwdev, REG_RXPITMB, 0x68163e96);
-+    } else {
-+        rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28163e96);
-+        rtw_write32(rtwdev, REG_RXPITMB, 0x28163e96);
-+
-+        if (efuse->rfe_option == 3) {
-+            if (efuse->ext_pa_2g)
-+                rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                        0x821403e3);
-+            else
-+                rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
-+                        0x821403f7);
-+        }
-+    }
-+
-+    /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+    rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10);
-+    /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+    rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10);
-+    rtw_write32(rtwdev, REG_INTPO_SETA, 0x00000000);
-+    /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+    rtw_write32(rtwdev, REG_TXTONEB, 0x18008c10);
-+    /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+    rtw_write32(rtwdev, REG_RXTONEB, 0x38008c10);
-+    rtw_write32(rtwdev, REG_INTPO_SETB, 0x00000000);
-+
-+    cal0_retry = 0;
-+    cal1_retry = 0;
-+    while (1) {
-+        /* one shot */
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+        rtw_write32(rtwdev, REG_RFECTL_B, 0x00100000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
-+        rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
-+
-+        mdelay(10);
-+
-+        rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+        rtw_write32(rtwdev, REG_RFECTL_B, 0x00000000);
-+
-+        for (delay_count = 0; delay_count < 20; delay_count++) {
-+            if (!tx0_finish)
-+                iqk0_ready = rtw_read32_mask(rtwdev,
-+                                 REG_IQKA_END,
-+                                 BIT(10));
-+            if (!tx1_finish)
-+                iqk1_ready = rtw_read32_mask(rtwdev,
-+                                 REG_IQKB_END,
-+                                 BIT(10));
-+            if (iqk0_ready && iqk1_ready)
-+                break;
-+
-+            mdelay(1);
-+        }
-+
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "TX delay_count = %d\n",
-+            delay_count);
-+
-+        if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
-+            /* ============TXIQK Check============== */
-+            tx0_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(12));
-+            tx1_fail = rtw_read32_mask(rtwdev, REG_IQKB_END, BIT(12));
-+
-+            if (!(tx0_fail || tx0_finish)) {
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x02000000);
-+                tx_x0_temp[tx0_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKA_END,
-+                                      0x07ff0000);
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x04000000);
-+                tx_y0_temp[tx0_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKA_END,
-+                                      0x07ff0000);
-+
-+                rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                    "tx_x0[%d] = %x ;; tx_y0[%d] = %x\n",
-+                    tx0_avg, tx_x0_temp[tx0_avg],
-+                    tx0_avg, tx_y0_temp[tx0_avg]);
-+
-+                tx_x0_temp[tx0_avg] <<= 21;
-+                tx_y0_temp[tx0_avg] <<= 21;
-+
-+                tx0_avg++;
-+            } else {
-+                cal0_retry++;
-+                if (cal0_retry == 10)
-+                    break;
-+            }
-+
-+            if (!(tx1_fail || tx1_finish)) {
-+                rtw_write32(rtwdev, REG_RFECTL_B, 0x02000000);
-+                tx_x1_temp[tx1_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKB_END,
-+                                      0x07ff0000);
-+                rtw_write32(rtwdev, REG_RFECTL_B, 0x04000000);
-+                tx_y1_temp[tx1_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKB_END,
-+                                      0x07ff0000);
-+
-+                rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                    "tx_x1[%d] = %x ;; tx_y1[%d] = %x\n",
-+                    tx1_avg, tx_x1_temp[tx1_avg],
-+                    tx1_avg, tx_y1_temp[tx1_avg]);
-+
-+                tx_x1_temp[tx1_avg] <<= 21;
-+                tx_y1_temp[tx1_avg] <<= 21;
-+
-+                tx1_avg++;
-+            } else {
-+                cal1_retry++;
-+                if (cal1_retry == 10)
-+                    break;
-+            }
-+        } else {
-+            cal0_retry++;
-+            cal1_retry++;
-+
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "delay 20ms TX IQK Not Ready!!!!!\n");
-+
-+            if (cal0_retry == 10)
-+                break;
-+        }
-+
-+        if (tx0_avg >= 2)
-+            tx0_finish = rtw88xxa_iqk_finish(tx0_avg, 4,
-+                             tx_x0_temp, tx_y0_temp, &tx_x0, &tx_y0,
-+                             false, false);
-+
-+        if (tx1_avg >= 2)
-+            tx1_finish = rtw88xxa_iqk_finish(tx1_avg, 4,
-+                             tx_x1_temp, tx_y1_temp, &tx_x1, &tx_y1,
-+                             false, false);
-+
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "tx0_average = %d, tx1_average = %d\n",
-+            tx0_avg, tx1_avg);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "tx0_finish = %d, tx1_finish = %d\n",
-+            tx0_finish, tx1_finish);
-+
-+        if (tx0_finish && tx1_finish)
-+            break;
-+
-+        if ((cal0_retry + tx0_avg) >= 10 ||
-+            (cal1_retry + tx1_avg) >= 10)
-+            break;
-+    }
-+
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "TXA_cal_retry = %d\n", cal0_retry);
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "TXB_cal_retry = %d\n", cal1_retry);
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+    /* Load LOK */
-+    rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, 0x7fe00,
-+             rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, 0xffc00));
-+    rtw_write_rf(rtwdev, RF_PATH_B, RF_TXMOD, 0x7fe00,
-+             rtw_read_rf(rtwdev, RF_PATH_B, RF_DTXLOK, 0xffc00));
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    /* [31] = 0 --> Page C */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+    if (tx0_finish) {
-+        /* ====== path A RX IQK RF setting====== */
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
-+                 0x30000);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
-+                 0x3f7ff);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
-+                 0xfe7bf);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 
0x931d1);
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
-+    }
-+    if (tx1_finish) {
-+        /* ====== path B RX IQK RF setting====== */
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE, RFREG_MASK, 0x80000);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_ADDR, RFREG_MASK,
-+                 0x30000);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_DATA0, RFREG_MASK,
-+                 0x3f7ff);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_MODE_TABLE_DATA1, RFREG_MASK,
-+                 0xfe7bf);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_RXBB2, RFREG_MASK, 0x88001);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_TXA_PREPAD, RFREG_MASK, 
0x931d1);
-+        rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE, RFREG_MASK, 0x00000);
-+    }
-+
-+    rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x1);
-+    rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x0);
-+    rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
-+
-+    if (rtwdev->hci.type == RTW_HCI_TYPE_PCIE)
-+        rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a911);
-+    else
-+        rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a890);
-+
-+    if (efuse->rfe_option == 1) {
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777717);
-+        rtw_write32(rtwdev, REG_RFE_INV_A, 0x00000077);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777717);
-+        rtw_write32(rtwdev, REG_RFE_INV_B, 0x00000077);
-+    } else {
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777717);
-+        rtw_write32(rtwdev, REG_RFE_INV_A, 0x02000077);
-+        rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777717);
-+        rtw_write32(rtwdev, REG_RFE_INV_B, 0x02000077);
-+    }
-+
-+    /* [31] = 1 --> Page C1 */
-+    rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+
-+    if (tx0_finish) {
-+        /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+        rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x38008c10);
-+        /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+        rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x18008c10);
-+        rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x82140119);
-+    }
-+    if (tx1_finish) {
-+        /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
-+        rtw_write32(rtwdev, REG_TXTONEB, 0x38008c10);
-+        /* RX_Tone_idx[9:0], RxK_Mask[29] */
-+        rtw_write32(rtwdev, REG_RXTONEB, 0x18008c10);
-+        rtw_write32(rtwdev, REG_TXPITMB, 0x82140119);
-+    }
-+
-+    cal0_retry = 0;
-+    cal1_retry = 0;
-+    while (1) {
-+        /* one shot */
-+        /* [31] = 0 --> Page C */
-+        rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+
-+        if (tx0_finish) {
-+            rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x03FF8000,
-+                     tx_x0 & 0x000007ff);
-+            rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x000007FF,
-+                     tx_y0 & 0x000007ff);
-+            /* [31] = 1 --> Page C1 */
-+            rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+            if (efuse->rfe_option == 1)
-+                rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28161500);
-+            else
-+                rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28160cc0);
-+            rtw_write32(rtwdev, REG_RFECTL_A, 0x00300000);
-+            rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
-+            mdelay(5);
-+            rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x3c000000);
-+            rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
-+        }
-+
-+        if (tx1_finish) {
-+            /* [31] = 0 --> Page C */
-+            rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
-+            rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x03FF8000,
-+                     tx_x1 & 0x000007ff);
-+            rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x000007FF,
-+                     tx_y1 & 0x000007ff);
-+            /* [31] = 1 --> Page C1 */
-+            rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
-+            if (efuse->rfe_option == 1)
-+                rtw_write32(rtwdev, REG_RXPITMB, 0x28161500);
-+            else
-+                rtw_write32(rtwdev, REG_RXPITMB, 0x28160ca0);
-+            rtw_write32(rtwdev, REG_RFECTL_B, 0x00300000);
-+            rtw_write32(rtwdev, REG_RFECTL_B, 0x00100000);
-+            mdelay(5);
-+            rtw_write32(rtwdev, REG_RXPITMB, 0x3c000000);
-+            rtw_write32(rtwdev, REG_RFECTL_B, 0x00000000);
-+        }
-+
-+        for (delay_count = 0; delay_count < 20; delay_count++) {
-+            if (!rx0_finish && tx0_finish)
-+                iqk0_ready = rtw_read32_mask(rtwdev,
-+                                 REG_IQKA_END,
-+                                 BIT(10));
-+            if (!rx1_finish && tx1_finish)
-+                iqk1_ready = rtw_read32_mask(rtwdev,
-+                                 REG_IQKB_END,
-+                                 BIT(10));
-+            if (iqk0_ready && iqk1_ready)
-+                break;
-+
-+            mdelay(1);
-+        }
-+
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "RX delay_count = %d\n",
-+            delay_count);
-+
-+        if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
-+            /* ============RXIQK Check============== */
-+            rx0_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(11));
-+            rx1_fail = rtw_read32_mask(rtwdev, REG_IQKB_END, BIT(11));
-+
-+            if (!(rx0_fail || rx0_finish) && tx0_finish) {
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x06000000);
-+                rx_x0_temp[rx0_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKA_END,
-+                                      0x07ff0000);
-+                rtw_write32(rtwdev, REG_RFECTL_A, 0x08000000);
-+                rx_y0_temp[rx0_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKA_END,
-+                                      0x07ff0000);
-+
-+                rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                    "rx_x0[%d] = %x ;; rx_y0[%d] = %x\n",
-+                    rx0_avg, rx_x0_temp[rx0_avg],
-+                    rx0_avg, rx_y0_temp[rx0_avg]);
-+
-+                rx_x0_temp[rx0_avg] <<= 21;
-+                rx_y0_temp[rx0_avg] <<= 21;
-+
-+                rx0_avg++;
-+            } else {
-+                rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                    "1. RXA_cal_retry = %d\n", cal0_retry);
-+
-+                cal0_retry++;
-+                if (cal0_retry == 10)
-+                    break;
-+            }
-+
-+            if (!(rx1_fail || rx1_finish) && tx1_finish) {
-+                rtw_write32(rtwdev, REG_RFECTL_B, 0x06000000);
-+                rx_x1_temp[rx1_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKB_END,
-+                                      0x07ff0000);
-+                rtw_write32(rtwdev, REG_RFECTL_B, 0x08000000);
-+                rx_y1_temp[rx1_avg] = rtw_read32_mask(rtwdev,
-+                                      REG_IQKB_END,
-+                                      0x07ff0000);
-+
-+                rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                    "rx_x1[%d] = %x ;; rx_y1[%d] = %x\n",
-+                    rx1_avg, rx_x1_temp[rx1_avg],
-+                    rx1_avg, rx_y1_temp[rx1_avg]);
-+
-+                rx_x1_temp[rx1_avg] <<= 21;
-+                rx_y1_temp[rx1_avg] <<= 21;
-+
-+                rx1_avg++;
-+            } else {
-+                cal1_retry++;
-+                if (cal1_retry == 10)
-+                    break;
-+            }
-+        } else {
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "2. RXA_cal_retry = %d\n", cal0_retry);
-+
-+            cal0_retry++;
-+            cal1_retry++;
-+
-+            rtw_dbg(rtwdev, RTW_DBG_RFK,
-+                "delay 20ms RX IQK Not Ready!!!!!\n");
-+
-+            if (cal0_retry == 10)
-+                break;
-+        }
-+
-+        rtw_dbg(rtwdev, RTW_DBG_RFK, "3. RXA_cal_retry = %d\n",
-+            cal0_retry);
-+
-+        if (rx0_avg >= 2)
-+            rx0_finish = rtw88xxa_iqk_finish(rx0_avg, 4,
-+                             rx_x0_temp, rx_y0_temp,
-+                             &rx_x0, &rx_y0,
-+                             true, false);
-+
-+        if (rx1_avg >= 2)
-+            rx1_finish = rtw88xxa_iqk_finish(rx1_avg, 4,
-+                             rx_x1_temp, rx_y1_temp,
-+                             &rx_x1, &rx_y1,
-+                             true, false);
-+
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "rx0_average = %d, rx1_average = %d\n",
-+            rx0_avg, rx1_avg);
-+        rtw_dbg(rtwdev, RTW_DBG_RFK,
-+            "rx0_finish = %d, rx1_finish = %d\n",
-+            rx0_finish, rx1_finish);
-+
-+        if ((rx0_finish || !tx0_finish) && (rx1_finish || !tx1_finish))
-+            break;
-+
-+        if ((cal0_retry + rx0_avg) >= 10 ||
-+            (cal1_retry + rx1_avg) >= 10 ||
-+            rx0_avg == 3 || rx1_avg == 3)
-+            break;
-+    }
-+
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "RXA_cal_retry = %d\n", cal0_retry);
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "RXB_cal_retry = %d\n", cal1_retry);
-+
-+    /* FillIQK Result */
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "========Path_A =======\n");
-+
-+    if (tx0_finish)
-+        rtw8812a_iqk_tx_fill(rtwdev, RF_PATH_A, tx_x0, tx_y0);
-+    else
-+        rtw8812a_iqk_tx_fill(rtwdev, RF_PATH_A, 0x200, 0x0);
-+
-+    if (rx0_finish)
-+        rtw8812a_iqk_rx_fill(rtwdev, RF_PATH_A, rx_x0, rx_y0);
-+    else
-+        rtw8812a_iqk_rx_fill(rtwdev, RF_PATH_A, 0x200, 0x0);
-+
-+    rtw_dbg(rtwdev, RTW_DBG_RFK, "========Path_B =======\n");
-+
-+    if (tx1_finish)
-+        rtw8812a_iqk_tx_fill(rtwdev, RF_PATH_B, tx_x1, tx_y1);
-+    else
-+        rtw8812a_iqk_tx_fill(rtwdev, RF_PATH_B, 0x200, 0x0);
-+
-+    if (rx1_finish)
-+        rtw8812a_iqk_rx_fill(rtwdev, RF_PATH_B, rx_x1, rx_y1);
-+    else
-+        rtw8812a_iqk_rx_fill(rtwdev, RF_PATH_B, 0x200, 0x0);
-+}
-+
-+#define MACBB_REG_NUM_8812A 9
-+#define AFE_REG_NUM_8812A 12
-+#define RF_REG_NUM_8812A 3
-+
-+static void rtw8812a_do_iqk(struct rtw_dev *rtwdev)
-+{
-+    static const u32 backup_macbb_reg[MACBB_REG_NUM_8812A] = {
-+        0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0xe00, 0x838, 0x82c
-+    };
-+    static const u32 backup_afe_reg[AFE_REG_NUM_8812A] = {
-+        0xc5c, 0xc60, 0xc64, 0xc68, 0xcb0, 0xcb4,
-+        0xe5c, 0xe60, 0xe64, 0xe68, 0xeb0, 0xeb4
-+    };
-+    static const u32 backup_rf_reg[RF_REG_NUM_8812A] = {
-+        0x65, 0x8f, 0x0
-+    };
-+    u32 macbb_backup[MACBB_REG_NUM_8812A] = {};
-+    u32 afe_backup[AFE_REG_NUM_8812A] = {};
-+    u32 rfa_backup[RF_REG_NUM_8812A] = {};
-+    u32 rfb_backup[RF_REG_NUM_8812A] = {};
-+    u32 reg_cb8, reg_eb8;
-+
-+    rtw88xxa_iqk_backup_mac_bb(rtwdev, macbb_backup,
-+                   backup_macbb_reg, MACBB_REG_NUM_8812A);
-+
-+    rtw_write32_set(rtwdev, REG_CCASEL, BIT(31));
-+    reg_cb8 = rtw_read32(rtwdev, REG_RFECTL_A);
-+    reg_eb8 = rtw_read32(rtwdev, REG_RFECTL_B);
-+    rtw_write32_clr(rtwdev, REG_CCASEL, BIT(31));
-+
-+    rtw88xxa_iqk_backup_afe(rtwdev, afe_backup,
-+                backup_afe_reg, AFE_REG_NUM_8812A);
-+    rtw8812a_iqk_backup_rf(rtwdev, rfa_backup, rfb_backup,
-+                   backup_rf_reg, RF_REG_NUM_8812A);
-+
-+    rtw88xxa_iqk_configure_mac(rtwdev);
-+
-+    rtw8812a_iqk(rtwdev);
-+
-+    rtw8812a_iqk_restore_rf(rtwdev, RF_PATH_A, backup_rf_reg,
-+                rfa_backup, RF_REG_NUM_8812A);
-+    rtw8812a_iqk_restore_rf(rtwdev, RF_PATH_B, backup_rf_reg,
-+                rfb_backup, RF_REG_NUM_8812A);
-+
-+    rtw8812a_iqk_restore_afe(rtwdev, afe_backup,
-+                 backup_afe_reg, AFE_REG_NUM_8812A);
-+
-+    rtw_write32_set(rtwdev, REG_CCASEL, BIT(31));
-+    rtw_write32(rtwdev, REG_RFECTL_A, reg_cb8);
-+    rtw_write32(rtwdev, REG_RFECTL_B, reg_eb8);
-+    rtw_write32_clr(rtwdev, REG_CCASEL, BIT(31));
-+
-+    rtw88xxa_iqk_restore_mac_bb(rtwdev, macbb_backup,
-+                    backup_macbb_reg, MACBB_REG_NUM_8812A);
-+}
-+
-+static void rtw8812a_phy_calibration(struct rtw_dev *rtwdev)
-+{
-+    u8 channel = rtwdev->hal.current_channel;
-+
-+    rtw8812a_do_iqk(rtwdev);
-+
-+    /* The official driver wants to do this after connecting
-+     * but before first writing a new igi (phydm_get_new_igi).
-+     * Here seems close enough.
-+     */
-+    if (channel >= 36 && channel <= 64)
-+        rtw_load_table(rtwdev, &rtw8812a_agc_diff_lb_tbl);
-+    else if (channel >= 100)
-+        rtw_load_table(rtwdev, &rtw8812a_agc_diff_hb_tbl);
-+}
-+
-+static void rtw8812a_pwr_track(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_dm_info *dm_info = &rtwdev->dm_info;
-+
-+    if (!dm_info->pwr_trk_triggered) {
-+        rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
-+                 GENMASK(17, 16), 0x03);
-+        dm_info->pwr_trk_triggered = true;
-+        return;
-+    }
-+
-+    rtw88xxa_phy_pwrtrack(rtwdev, rtw8812a_do_lck, rtw8812a_do_iqk);
-+    dm_info->pwr_trk_triggered = false;
-+}
-+
-+static void rtw8812a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-+                      struct rtw_tx_pkt_info *pkt_info,
-+                      u8 *txdesc)
-+{
-+    fill_txdesc_checksum_common(txdesc, 16);
-+}
-+
-+static void rtw8812a_coex_cfg_init(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static void rtw8812a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static void rtw8821a_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static void rtw8821a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 
wl_pwr)
-+{
-+}
-+
-+static void rtw8821a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool 
low_gain)
-+{
-+}
-+
-+static const struct rtw_chip_ops rtw8812a_ops = {
-+    .power_on        = rtw88xxa_power_on,
-+    .power_off        = rtw8812a_power_off,
-+    .phy_set_param        = NULL,
-+    .read_efuse        = rtw88xxa_read_efuse,
-+    .query_phy_status    = rtw8812a_query_phy_status,
-+    .set_channel        = rtw88xxa_set_channel,
-+    .mac_init        = NULL,
-+    .read_rf        = rtw88xxa_phy_read_rf,
-+    .write_rf        = rtw_phy_write_rf_reg_sipi,
-+    .set_antenna        = NULL,
-+    .set_tx_power_index    = rtw88xxa_set_tx_power_index,
-+    .cfg_ldo25        = rtw8812a_cfg_ldo25,
-+    .efuse_grant        = rtw88xxa_efuse_grant,
-+    .false_alarm_statistics    = rtw88xxa_false_alarm_statistics,
-+    .phy_calibration    = rtw8812a_phy_calibration,
-+    .cck_pd_set        = rtw88xxa_phy_cck_pd_set,
-+    .pwr_track        = rtw8812a_pwr_track,
-+    .config_bfee        = NULL,
-+    .set_gid_table        = NULL,
-+    .cfg_csi_rate        = NULL,
-+    .fill_txdesc_checksum    = rtw8812a_fill_txdesc_checksum,
-+    .coex_set_init        = rtw8812a_coex_cfg_init,
-+    .coex_set_ant_switch    = NULL,
-+    .coex_set_gnt_fix    = rtw8812a_coex_cfg_gnt_fix,
-+    .coex_set_gnt_debug    = NULL,
-+    .coex_set_rfe_type    = rtw8821a_coex_cfg_rfe_type,
-+    .coex_set_wl_tx_power    = rtw8821a_coex_cfg_wl_tx_power,
-+    .coex_set_wl_rx_gain    = rtw8821a_coex_cfg_wl_rx_gain,
-+};
-+
-+static const struct rtw_page_table page_table_8812a[] = {
-+    /* hq_num, nq_num, lq_num, exq_num, gapq_num */
-+    {0, 0, 0, 0, 0},    /* SDIO */
-+    {0, 0, 0, 0, 0},    /* PCI */
-+    {16, 0, 0, 0, 1},    /* 2 bulk out endpoints */
-+    {16, 0, 16, 0, 1},    /* 3 bulk out endpoints */
-+    {16, 0, 16, 0, 1},    /* 4 bulk out endpoints */
-+};
-+
-+static const struct rtw_rqpn rqpn_table_8812a[] = {
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH,
-+     RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
-+
-+    {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
-+     RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
-+     RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
-+};
-+
-+static const struct rtw_prioq_addrs prioq_addrs_8812a = {
-+    .prio[RTW_DMA_MAPPING_EXTRA] = {
-+        .rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
-+    },
-+    .prio[RTW_DMA_MAPPING_LOW] = {
-+        .rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
-+    },
-+    .prio[RTW_DMA_MAPPING_NORMAL] = {
-+        .rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
-+    },
-+    .prio[RTW_DMA_MAPPING_HIGH] = {
-+        .rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
-+    },
-+    .wsize = false,
-+};
-+
-+static const struct rtw_hw_reg rtw8812a_dig[] = {
-+    [0] = { .addr = REG_RXIGI_A, .mask = 0x7f },
-+    [1] = { .addr = REG_RXIGI_B, .mask = 0x7f },
-+};
-+
-+static const struct rtw_rfe_def rtw8812a_rfe_defs[] = {
-+    [0] = { .phy_pg_tbl    = &rtw8812a_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_tbl, },
-+    [1] = { .phy_pg_tbl    = &rtw8812a_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_tbl, },
-+    [3] = { .phy_pg_tbl    = &rtw8812a_bb_pg_rfe3_tbl,
-+        .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_rfe3_tbl, },
-+};
-+
-+static const u8 wl_rssi_step_8812a[] = {101, 45, 101, 40};
-+static const u8 bt_rssi_step_8812a[] = {101, 101, 101, 101};
-+
-+static const struct coex_rf_para rf_para_tx_8812a[] = {
-+    {0, 0, false, 7},  /* for normal */
-+    {0, 20, false, 7}, /* for WL-CPT */
-+    {8, 17, true, 4},
-+    {7, 18, true, 4},
-+    {6, 19, true, 4},
-+    {5, 20, true, 4}
-+};
-+
-+static const struct coex_rf_para rf_para_rx_8812a[] = {
-+    {0, 0, false, 7},  /* for normal */
-+    {0, 20, false, 7}, /* for WL-CPT */
-+    {3, 24, true, 5},
-+    {2, 26, true, 5},
-+    {1, 27, true, 5},
-+    {0, 28, true, 5}
-+};
-+
-+static_assert(ARRAY_SIZE(rf_para_tx_8812a) == 
ARRAY_SIZE(rf_para_rx_8812a));
-+
-+const struct rtw_chip_info rtw8812a_hw_spec = {
-+    .ops = &rtw8812a_ops,
-+    .id = RTW_CHIP_TYPE_8812A,
-+    .fw_name = "rtw88/rtw8812a_fw.bin",
-+    .wlan_cpu = RTW_WCPU_11N,
-+    .tx_pkt_desc_sz = 40,
-+    .tx_buf_desc_sz = 16,
-+    .rx_pkt_desc_sz = 24,
-+    .rx_buf_desc_sz = 8,
-+    .phy_efuse_size = 512,
-+    .log_efuse_size = 512,
-+    .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
-+    .txff_size = 131072,
-+    .rxff_size = 16128,
-+    .rsvd_drv_pg_num = 9,
-+    .txgi_factor = 1,
-+    .is_pwr_by_rate_dec = true,
-+    .max_power_index = 0x3f,
-+    .csi_buf_pg_num = 0,
-+    .band = RTW_BAND_2G | RTW_BAND_5G,
-+    .page_size = 512,
-+    .dig_min = 0x20,
-+    .ht_supported = true,
-+    .vht_supported = true,
-+    .lps_deep_mode_supported = 0,
-+    .sys_func_en = 0xFD,
-+    .pwr_on_seq = card_enable_flow_8812a,
-+    .pwr_off_seq = card_disable_flow_8812a,
-+    .page_table = page_table_8812a,
-+    .rqpn_table = rqpn_table_8812a,
-+    .prioq_addrs = &prioq_addrs_8812a,
-+    .intf_table = NULL,
-+    .dig = rtw8812a_dig,
-+    .rf_sipi_addr = {REG_LSSI_WRITE_A, REG_LSSI_WRITE_B},
-+    .ltecoex_addr = NULL,
-+    .mac_tbl = &rtw8812a_mac_tbl,
-+    .agc_tbl = &rtw8812a_agc_tbl,
-+    .bb_tbl = &rtw8812a_bb_tbl,
-+    .rf_tbl = {&rtw8812a_rf_a_tbl, &rtw8812a_rf_b_tbl},
-+    .rfe_defs = rtw8812a_rfe_defs,
-+    .rfe_defs_size = ARRAY_SIZE(rtw8812a_rfe_defs),
-+    .rx_ldpc = false,
-+    .hw_feature_report = false,
-+    .c2h_ra_report_size = 4,
-+    .old_datarate_fb_limit = true,
-+    .usb_tx_agg_desc_num = 1,
-+    .iqk_threshold = 8,
-+    .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
-+    .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
-+
-+    .coex_para_ver = 0, /* no coex code in 8812au driver */
-+    .bt_desired_ver = 0,
-+    .scbd_support = false,
-+    .new_scbd10_def = false,
-+    .ble_hid_profile_support = false,
-+    .wl_mimo_ps_support = false,
-+    .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
-+    .bt_rssi_type = COEX_BTRSSI_RATIO,
-+    .ant_isolation = 15,
-+    .rssi_tolerance = 2,
-+    .wl_rssi_step = wl_rssi_step_8812a,
-+    .bt_rssi_step = bt_rssi_step_8812a,
-+    .table_sant_num = 0,
-+    .table_sant = NULL,
-+    .table_nsant_num = 0,
-+    .table_nsant = NULL,
-+    .tdma_sant_num = 0,
-+    .tdma_sant = NULL,
-+    .tdma_nsant_num = 0,
-+    .tdma_nsant = NULL,
-+    .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8812a),
-+    .wl_rf_para_tx = rf_para_tx_8812a,
-+    .wl_rf_para_rx = rf_para_rx_8812a,
-+    .bt_afh_span_bw20 = 0x20,
-+    .bt_afh_span_bw40 = 0x30,
-+    .afh_5g_num = 0,
-+    .afh_5g = NULL,
-+    .coex_info_hw_regs_num = 0,
-+    .coex_info_hw_regs = NULL,
-+};
-+EXPORT_SYMBOL(rtw8812a_hw_spec);
-+
-+MODULE_FIRMWARE("rtw88/rtw8812a_fw.bin");
-+
-+MODULE_AUTHOR("Realtek Corporation");
-+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8812a driver");
-+MODULE_LICENSE("Dual BSD/GPL");
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.h
-@@ -0,0 +1,10 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#ifndef __RTW8812A_H__
-+#define __RTW8812A_H__
-+
-+extern const struct rtw_chip_info rtw8812a_hw_spec;
-+
-+#endif
diff --git 
a/package/kernel/mac80211/patches/rtl/044-v6.13-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch 
b/package/kernel/mac80211/patches/rtl/044-v6.13-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch
deleted file mode 100644
index a37f131bab8ffe..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/044-v6.13-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 8f82bb2cfaf7b8992e0e8493cb765138254f87c9 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:29:28 +0200
-Subject: [PATCH] wifi: rtw88: Add rtw8821au.c and rtw8812au.c
-
-These are the entry points for the new modules rtw88_8821au
-(RTL8821AU/RTL8811AU) and rtw88_8812au (RTL8812AU).
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/91c495f8-a607-429b-8bc0-5a45d3c1393e@gmail.com
----
- .../net/wireless/realtek/rtw88/rtw8812au.c    | 28 +++++++++++++++++++
- .../net/wireless/realtek/rtw88/rtw8821au.c    | 28 +++++++++++++++++++
- 2 files changed, 56 insertions(+)
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812au.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821au.c
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
-@@ -0,0 +1,28 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/usb.h>
-+#include "main.h"
-+#include "rtw8812a.h"
-+#include "usb.h"
-+
-+static const struct usb_device_id rtw_8812au_id_table[] = {
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
-+    {},
-+};
-+MODULE_DEVICE_TABLE(usb, rtw_8812au_id_table);
-+
-+static struct usb_driver rtw_8812au_driver = {
-+    .name = "rtw_8812au",
-+    .id_table = rtw_8812au_id_table,
-+    .probe = rtw_usb_probe,
-+    .disconnect = rtw_usb_disconnect,
-+};
-+module_usb_driver(rtw_8812au_driver);
-+
-+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2 at gmail.com>");
-+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8812au driver");
-+MODULE_LICENSE("Dual BSD/GPL");
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
-@@ -0,0 +1,28 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2024  Realtek Corporation
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/usb.h>
-+#include "main.h"
-+#include "rtw8821a.h"
-+#include "usb.h"
-+
-+static const struct usb_device_id rtw_8821au_id_table[] = {
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    {},
-+};
-+MODULE_DEVICE_TABLE(usb, rtw_8821au_id_table);
-+
-+static struct usb_driver rtw_8821au_driver = {
-+    .name = "rtw_8821au",
-+    .id_table = rtw_8821au_id_table,
-+    .probe = rtw_usb_probe,
-+    .disconnect = rtw_usb_disconnect,
-+};
-+module_usb_driver(rtw_8821au_driver);
-+
-+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2 at gmail.com>");
-+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821au/8811au driver");
-+MODULE_LICENSE("Dual BSD/GPL");
diff --git 
a/package/kernel/mac80211/patches/rtl/045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch 
b/package/kernel/mac80211/patches/rtl/045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch
deleted file mode 100644
index 6a4a2aff6980d7..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From 0e3e8284f8e1bf2fc0f7bf247194efe5cfc568c1 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 30 Oct 2024 20:31:28 +0200
-Subject: [PATCH] wifi: rtw88: Enable the new RTL8821AU/RTL8812AU drivers
-
-These are older Wifi 5 chips. RTL8821AU is 1x1, with or without
-Bluetooth. RTL8812AU is 2x2, without Bluetooth.
-
-Beamforming is not implemented. It looks like these chips need a
-different implementation than what is in bf.c.
-
-Speed tests with RTL8821AU: 137 Mbps download, 144 Mbps upload.
-Speed tests with RTL8812AU: 344 Mbps download, 387 Mbps upload.
-
-Station mode and AP mode were tested.
-
-Bluetooth coexistence works. I used my Bluetooth headphones for
-several days, listening to music and watching videos. There is only
-a problem with the wifi speeds with one router:
-
-With ISP's HG6544C router:
-Official driver: 3/5 Mbps.
-rtw88: a bit more, but not steady at all. Not enough to watch a 1080p
-Youtube video.
-
-With my D-Link Eagle R32 router running Openwrt, on the same channel:
-Official driver: 6/10 Mbps.
-rtw88: download starts around 30, climbs to 50 / upload is 10 Mbps.
-I can watch a 1080p Youtube video.
-
-The music doesn't cut out during any speed tests.
-
-I also tested transferring files to and from my phone. I don't have
-other types of Bluetooth devices to test.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/0b8e8093-8103-4999-86bf-0055ec52ea64@gmail.com
----
-Kconfig.local                               | 15 ++++++++
- drivers/net/wireless/realtek/rtw88/Kconfig  | 40 ++++++++++++++++++++-
- drivers/net/wireless/realtek/rtw88/Makefile | 15 ++++++++
- 3 files changed, 69 insertions(+), 1 deletion(-)
-
---- a/Kconfig.local
-+++ b/Kconfig.local
-@@ -1144,6 +1144,15 @@ config BACKPORTED_RTW88_8723D
- config BACKPORTED_RTW88_8821C
-     tristate
-     default RTW88_8821C
-+config BACKPORTED_RTW88_88XXA
-+    tristate
-+    default RTW88_88XXA
-+config BACKPORTED_RTW88_8821A
-+    tristate
-+    default RTW88_8821A
-+config BACKPORTED_RTW88_8812A
-+    tristate
-+    default RTW88_8812A
- config BACKPORTED_RTW88_8822BE
-     tristate
-     default RTW88_8822BE
-@@ -1183,6 +1192,12 @@ config BACKPORTED_RTW88_8821CS
- config BACKPORTED_RTW88_8821CU
-     tristate
-     default RTW88_8821CU
-+config BACKPORTED_RTW88_8821AU
-+    tristate
-+    default RTW88_8821AU
-+config BACKPORTED_RTW88_8812AU
-+    tristate
-+    default RTW88_8812AU
- config BACKPORTED_RTW88_DEBUG
-     tristate
-     default RTW88_DEBUG
---- a/drivers/net/wireless/realtek/rtw88/Kconfig
-+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
-@@ -54,6 +54,20 @@ config RTW88_8821C
-     tristate
-     depends on m
-
-+config RTW88_88XXA
-+    tristate
-+    depends on m
-+
-+config RTW88_8821A
-+    tristate
-+    depends on m
-+    select RTW88_88XXA
-+
-+config RTW88_8812A
-+    tristate
-+    depends on m
-+    select RTW88_88XXA
-+
- config RTW88_8822BE
-     tristate "Realtek 8822BE PCI wireless network adapter"
-     depends on m
-@@ -213,6 +227,30 @@ config RTW88_8821CU
-
-       802.11ac USB wireless network adapter
-
-+config RTW88_8821AU
-+    tristate "Realtek 8821AU/8811AU USB wireless network adapter"
-+    depends on m
-+    depends on USB
-+    select RTW88_CORE
-+    select RTW88_USB
-+    select RTW88_8821A
-+    help
-+      Select this option will enable support for 8821AU and 8811AU chipset
-+
-+      802.11ac USB wireless network adapter
-+
-+config RTW88_8812AU
-+    tristate "Realtek 8812AU USB wireless network adapter"
-+    depends on m
-+    depends on USB
-+    select RTW88_CORE
-+    select RTW88_USB
-+    select RTW88_8812A
-+    help
-+      Select this option will enable support for 8812AU chipset
-+
-+      802.11ac USB wireless network adapter
-+
- config RTW88_DEBUG
-     bool "Realtek rtw88 debug support"
-     depends on RTW88_CORE
---- a/drivers/net/wireless/realtek/rtw88/Makefile
-+++ b/drivers/net/wireless/realtek/rtw88/Makefile
-@@ -77,6 +77,21 @@ rtw88_8821cs-objs        := rtw8821cs.o
- obj-$(CPTCFG_RTW88_8821CU)    += rtw88_8821cu.o
- rtw88_8821cu-objs        := rtw8821cu.o
-
-+obj-$(CPTCFG_RTW88_88XXA)    += rtw88_88xxa.o
-+rtw88_88xxa-objs        := rtw88xxa.o
-+
-+obj-$(CPTCFG_RTW88_8821A)    += rtw88_8821a.o
-+rtw88_8821a-objs        := rtw8821a.o rtw8821a_table.o
-+
-+obj-$(CPTCFG_RTW88_8812A)    += rtw88_8812a.o
-+rtw88_8812a-objs        := rtw8812a.o rtw8812a_table.o
-+
-+obj-$(CPTCFG_RTW88_8821AU)    += rtw88_8821au.o
-+rtw88_8821au-objs        := rtw8821au.o
-+
-+obj-$(CPTCFG_RTW88_8812AU)    += rtw88_8812au.o
-+rtw88_8812au-objs        := rtw8812au.o
-+
- obj-$(CPTCFG_RTW88_PCI)        += rtw88_pci.o
- rtw88_pci-objs            := pci.o
-
diff --git 
a/package/kernel/mac80211/patches/rtl/046-v6.14-wifi-rtw88-8821au-Add-additional-devices-to-the-USB_.patch 
b/package/kernel/mac80211/patches/rtl/046-v6.14-wifi-rtw88-8821au-Add-additional-devices-to-the-USB_.patch
deleted file mode 100644
index d1e268c79b92c3..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/046-v6.14-wifi-rtw88-8821au-Add-additional-devices-to-the-USB_.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From 7b5ce65d90187f0944e70dc5741aa0edfac926f4 Mon Sep 17 00:00:00 2001
-From: Larry Finger <Larry.Finger at lwfinger.net>
-Date: Wed, 6 Nov 2024 15:55:31 +0200
-Subject: [PATCH] wifi: rtw88: 8821au: Add additional devices to the 
USB_DEVICE
- list
-
-These are the entries that Nick Morrow provided. From
-https://github.com/morrownr/8821au-20210708
-
-Signed-off-by: Larry Finger <Larry.Finger at lwfinger.net>
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/da05b866-a9ff-428c-a008-35e8cf200a98@gmail.com
----
- .../net/wireless/realtek/rtw88/rtw8821au.c    | 52 ++++++++++++++++++-
- 1 file changed, 51 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8821au.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
-@@ -9,8 +9,58 @@
- #include "usb.h"
-
- static const struct usb_device_id rtw_8821au_id_table[] = {
--    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0811, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0820, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0821, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8822, 
0xff, 0xff, 0xff),
-       .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0823, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xa811, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x0242, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Buffalo */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x029b, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Buffalo */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0953, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* I-O DATA */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4007, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400f, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9052, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Netgear */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0023, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* HAWKING */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3314, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3318, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab32, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Planex */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x804b, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TRENDnet */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011f, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0120, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x3823, 0x6249, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Obihai */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa811, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa812, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa813, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb611, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
-     {},
- };
- MODULE_DEVICE_TABLE(usb, rtw_8821au_id_table);
diff --git 
a/package/kernel/mac80211/patches/rtl/047-v6.14-wifi-rtw88-8812au-Add-more-device-IDs.patch 
b/package/kernel/mac80211/patches/rtl/047-v6.14-wifi-rtw88-8812au-Add-more-device-IDs.patch
deleted file mode 100644
index e03f246164605b..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/047-v6.14-wifi-rtw88-8812au-Add-more-device-IDs.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 1ee6ff9ae3c1a9eda9081f9db04f85d3a7352d38 Mon Sep 17 00:00:00 2001
-From: Nick Morrow <usbwifi2024 at gmail.com>
-Date: Wed, 6 Nov 2024 15:57:10 +0200
-Subject: [PATCH] wifi: rtw88: 8812au: Add more device IDs
-
-From https://github.com/morrownr/8812au-20210820.
-
-Signed-off-by: Nick Morrow <usbwifi2024 at gmail.com>
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/31b7ee6b-f96d-43e0-a32f-a9eb1174a0c1@gmail.com
----
- .../net/wireless/realtek/rtw88/rtw8812au.c    | 68 ++++++++++++++++++-
- 1 file changed, 67 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8812au.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
-@@ -9,8 +9,74 @@
- #include "usb.h"
-
- static const struct usb_device_id rtw_8812au_id_table[] = {
--    { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8812, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881a, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881b, 
0xff, 0xff, 0xff),
-       .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881c, 
0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0409, 0x0408, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* NEC */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x025d, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Buffalo */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0952, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* I-O DATA */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1106, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Belkin */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1109, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Belkin */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0586, 0x3426, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* ZyXEL */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0789, 0x016e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Logitec */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8812, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Abocom */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9051, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Netgear */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x17d2, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* ASUS */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0074, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Sitecom */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0022, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Hawking */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x1058, 0x0632, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* WD */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x003f, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Linksys */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x148f, 0x9097, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Amped 
Wireless */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x1740, 0x0100, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* EnGenius */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3313, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3315, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3316, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab30, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Planex */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x805b, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TRENDnet */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0101, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0103, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010d, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010e, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010f, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0122, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Tenda */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa822, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Edimax */
-     {},
- };
- MODULE_DEVICE_TABLE(usb, rtw_8812au_id_table);
diff --git 
a/package/kernel/mac80211/patches/rtl/048-v6.14-wifi-rtw88-Add-additional-USB-IDs-for-RTL8812BU.patch 
b/package/kernel/mac80211/patches/rtl/048-v6.14-wifi-rtw88-Add-additional-USB-IDs-for-RTL8812BU.patch
deleted file mode 100644
index bf0bcbf1890032..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/048-v6.14-wifi-rtw88-Add-additional-USB-IDs-for-RTL8812BU.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From d4c4903508f9e1b2bfec88f777718484e27343fb Mon Sep 17 00:00:00 2001
-From: Nick Morrow <usbwifi2024 at gmail.com>
-Date: Thu, 7 Nov 2024 08:28:46 +0800
-Subject: [PATCH] wifi: rtw88: Add additional USB IDs for RTL8812BU
-
-Add three additional USB IDs found in
-https://github.com/morrownr/88x2bu-20210702
-to support more RTL8812BU devices.
-
-Signed-off-by: Nick Morrow <usbwifi2024 at gmail.com>
-Signed-off-by: Zenm Chen <zenmchen at gmail.com>
-Reviewed-by: Mikhail Novosyolov <m.novosyolov at rosalinux.ru>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20241107002846.13748-1-zenmchen@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8822bu.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
-@@ -67,6 +67,12 @@ static const struct usb_device_id rtw_88
-       .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* LiteOn */
-     { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x808a, 0xff, 0xff, 0xff),
-       .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* 
TRENDnet TEW-808UBM */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x805a, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* 
TRENDnet TEW-805UBH */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4011, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ELECOM 
WDB-867DU3S */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0107, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* 
Mercusys MA30H */
-     {},
- };
- MODULE_DEVICE_TABLE(usb, rtw_8822bu_id_table);
diff --git 
a/package/kernel/mac80211/patches/rtl/049-v6.14-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch 
b/package/kernel/mac80211/patches/rtl/049-v6.14-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch
deleted file mode 100644
index 694c32f79dc4d1..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/049-v6.14-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From 82a35723a67c29f685d7b518962154a73b7163a2 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Thu, 14 Nov 2024 17:46:08 +0200
-Subject: [PATCH] wifi: rtw88: usb: Support USB 3 with RTL8812AU
-
-Add the function to automatically switch the RTL8812AU into USB 3 mode.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/19cda72b-f1f1-4b69-8369-0e4376b646bf@gmail.com
----
- drivers/net/wireless/realtek/rtw88/usb.c | 44 ++++++++++++++++++++++--
- 1 file changed, 42 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -930,6 +930,32 @@ static void rtw_usb_intf_deinit(struct r
-     usb_set_intfdata(intf, NULL);
- }
-
-+static int rtw_usb_switch_mode_old(struct rtw_dev *rtwdev)
-+{
-+    struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
-+    enum usb_device_speed cur_speed = rtwusb->udev->speed;
-+    u8 hci_opt;
-+
-+    if (cur_speed == USB_SPEED_HIGH) {
-+        hci_opt = rtw_read8(rtwdev, REG_HCI_OPT_CTRL);
-+
-+        if ((hci_opt & (BIT(2) | BIT(3))) != BIT(3)) {
-+            rtw_write8(rtwdev, REG_HCI_OPT_CTRL, 0x8);
-+            rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x2);
-+            rtw_write8(rtwdev, REG_ACLK_MON, 0x1);
-+            rtw_write8(rtwdev, 0x3d, 0x3);
-+            /* usb disconnect */
-+            rtw_write8(rtwdev, REG_SYS_PW_CTRL + 1, 0x80);
-+            return 1;
-+        }
-+    } else if (cur_speed == USB_SPEED_SUPER) {
-+        rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT(1));
-+        rtw_write8_clr(rtwdev, REG_ACLK_MON, BIT(0));
-+    }
-+
-+    return 0;
-+}
-+
- static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
- {
-     enum usb_device_speed cur_speed;
-@@ -979,11 +1005,22 @@ static int rtw_usb_switch_mode_new(struc
-     return 1;
- }
-
-+static bool rtw_usb3_chip_old(u8 chip_id)
-+{
-+    return chip_id == RTW_CHIP_TYPE_8812A;
-+}
-+
-+static bool rtw_usb3_chip_new(u8 chip_id)
-+{
-+    return chip_id == RTW_CHIP_TYPE_8822C ||
-+           chip_id == RTW_CHIP_TYPE_8822B;
-+}
-+
- static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
- {
-     u8 id = rtwdev->chip->id;
-
--    if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B)
-+    if (!rtw_usb3_chip_new(id) && !rtw_usb3_chip_old(id))
-         return 0;
-
-     if (!rtwdev->efuse.usb_mode_switch) {
-@@ -998,7 +1035,10 @@ static int rtw_usb_switch_mode(struct rt
-         return 0;
-     }
-
--    return rtw_usb_switch_mode_new(rtwdev);
-+    if (rtw_usb3_chip_old(id))
-+        return rtw_usb_switch_mode_old(rtwdev);
-+    else
-+        return rtw_usb_switch_mode_new(rtwdev);
- }
-
- int rtw_usb_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
diff --git 
a/package/kernel/mac80211/patches/rtl/050-v6.14-wifi-rtlwifi-rtl8821ae-phy-restore-removed-code-to-f.patch 
b/package/kernel/mac80211/patches/rtl/050-v6.14-wifi-rtlwifi-rtl8821ae-phy-restore-removed-code-to-f.patch
deleted file mode 100644
index 3e66f5b2493e6a..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/050-v6.14-wifi-rtlwifi-rtl8821ae-phy-restore-removed-code-to-f.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 5e5903a442bb889a62a0f5d89ac33e53ab08592c Mon Sep 17 00:00:00 2001
-From: Colin Ian King <colin.i.king at gmail.com>
-Date: Wed, 6 Nov 2024 15:46:42 +0000
-Subject: [PATCH] wifi: rtlwifi: rtl8821ae: phy: restore removed code to fix
- infinite loop
-
-A previous clean-up fix removed the assignment of v2 inside a while loop
-that turned it into an infinite loop. Fix this by restoring the assignment
-of v2 from array[] so that v2 is updated inside the loop.
-
-Fixes: cda37445718d ("wifi: rtlwifi: rtl8821ae: phy: remove some 
useless code")
-Signed-off-by: Colin Ian King <colin.i.king at gmail.com>
-Tested-by: Ping-Ke Shih <pkshih at realtek.com>
-Reviewed-by: Su Hui <suhui at nfschina.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/20241106154642.1627886-1-colin.i.king@gmail.com
----
- drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
-+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
-@@ -2033,8 +2033,10 @@ static bool _rtl8821ae_phy_config_bb_wit
-             if (!_rtl8821ae_check_condition(hw, v1)) {
-                 i += 2; /* skip the pair of expression*/
-                 v2 = array[i+1];
--                while (v2 != 0xDEAD)
-+                while (v2 != 0xDEAD) {
-                     i += 3;
-+                    v2 = array[i + 1];
-+                }
-             }
-         }
-     }
diff --git 
a/package/kernel/mac80211/patches/rtl/051-v6.14-wifi-rtw88-usb-Enable-RX-aggregation-for-8821au-8812.patch 
b/package/kernel/mac80211/patches/rtl/051-v6.14-wifi-rtw88-usb-Enable-RX-aggregation-for-8821au-8812.patch
deleted file mode 100644
index 1debe2dc73d070..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/051-v6.14-wifi-rtw88-usb-Enable-RX-aggregation-for-8821au-8812.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From ce5dea83ee8f945203144fb891fdcb978216e45a Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Thu, 14 Nov 2024 17:48:09 +0200
-Subject: [PATCH] wifi: rtw88: usb: Enable RX aggregation for 8821au/8812au
-
-USB RX aggregation improves the RX speed on certain ARM systems, like
-the NanoPi NEO Core2. With RTL8811AU, before: 30 Mbps, after: 224 Mbps.
-
-The out-of-tree driver uses aggregation size of 7 in USB 3 mode, but
-that doesn't work here. rtw88 advertises support for receiving AMSDU
-in AMPDU, so the AP sends larger frames, up to ~5100 bytes. With a size
-of 7 RTL8812AU frequently tries to aggregate more frames than will fit
-in 32768 bytes. Use a size of 6 instead.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/63012163-a425-4b15-b830-43f279c06b73@gmail.com
----
- drivers/net/wireless/realtek/rtw88/usb.c | 28 ++++++++++++++++++++++++
- 1 file changed, 28 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -789,6 +789,30 @@ static void rtw_usb_dynamic_rx_agg_v1(st
-     rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
- }
-
-+static void rtw_usb_dynamic_rx_agg_v2(struct rtw_dev *rtwdev, bool enable)
-+{
-+    struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
-+    u8 size, timeout;
-+    u16 val16;
-+
-+    if (!enable) {
-+        size = 0x0;
-+        timeout = 0x1;
-+    } else if (rtwusb->udev->speed == USB_SPEED_SUPER) {
-+        size = 0x6;
-+        timeout = 0x1a;
-+    } else {
-+        size = 0x5;
-+        timeout = 0x20;
-+    }
-+
-+    val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
-+        u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
-+
-+    rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
-+    rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
-+}
-+
- static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
- {
-     switch (rtwdev->chip->id) {
-@@ -797,6 +821,10 @@ static void rtw_usb_dynamic_rx_agg(struc
-     case RTW_CHIP_TYPE_8821C:
-         rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
-         break;
-+    case RTW_CHIP_TYPE_8821A:
-+    case RTW_CHIP_TYPE_8812A:
-+        rtw_usb_dynamic_rx_agg_v2(rtwdev, enable);
-+        break;
-     case RTW_CHIP_TYPE_8723D:
-         /* Doesn't like aggregation. */
-         break;
diff --git 
a/package/kernel/mac80211/patches/rtl/052-v6.14-wifi-rtw88-add-__packed-attribute-to-efuse-layout-st.patch 
b/package/kernel/mac80211/patches/rtl/052-v6.14-wifi-rtw88-add-__packed-attribute-to-efuse-layout-st.patch
deleted file mode 100644
index 6132bb7d4187ac..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/052-v6.14-wifi-rtw88-add-__packed-attribute-to-efuse-layout-st.patch
+++ /dev/null
@@ -1,195 +0,0 @@
-From 0daa521a1c8c29ffbefe6530f0d276e74e2749d0 Mon Sep 17 00:00:00 2001
-From: Ping-Ke Shih <pkshih at realtek.com>
-Date: Thu, 12 Dec 2024 13:42:03 +0800
-Subject: [PATCH] wifi: rtw88: add __packed attribute to efuse layout struct
-
-The layout struct of efuse should not do address alignment by compiler.
-Otherwise it leads unexpected layout and size for certain arch suc as arm.
-In x86-64, the results are identical before and after this patch.
-
-Also adjust bit-field to prevent over adjacent byte to avoid warning:
-  rtw88/rtw8822b.h:66:1: note: offset of packed bit-field `res2` has 
changed in GCC 4.4
-   66 | } __packed;
-      | ^
-
-Reported-by: kernel test robot <lkp at intel.com>
-Closes: 
https://lore.kernel.org/oe-kbuild-all/202412120131.qk0x6OhE-lkp@intel.com/
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20241212054203.135046-1-pkshih@realtek.com
----
- drivers/net/wireless/realtek/rtw88/main.h     | 4 ++--
- drivers/net/wireless/realtek/rtw88/rtw8723x.h | 8 ++++----
- drivers/net/wireless/realtek/rtw88/rtw8821c.h | 9 +++++----
- drivers/net/wireless/realtek/rtw88/rtw8822b.h | 9 +++++----
- drivers/net/wireless/realtek/rtw88/rtw8822c.h | 9 +++++----
- 5 files changed, 21 insertions(+), 18 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -510,12 +510,12 @@ struct rtw_5g_txpwr_idx {
-     struct rtw_5g_vht_ns_pwr_idx_diff vht_2s_diff;
-     struct rtw_5g_vht_ns_pwr_idx_diff vht_3s_diff;
-     struct rtw_5g_vht_ns_pwr_idx_diff vht_4s_diff;
--};
-+} __packed;
-
- struct rtw_txpwr_idx {
-     struct rtw_2g_txpwr_idx pwr_idx_2g;
-     struct rtw_5g_txpwr_idx pwr_idx_5g;
--};
-+} __packed;
-
- struct rtw_channel_params {
-     u8 center_chan;
---- a/drivers/net/wireless/realtek/rtw88/rtw8723x.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.h
-@@ -47,7 +47,7 @@ struct rtw8723xe_efuse {
-     u8 device_id[2];
-     u8 sub_vendor_id[2];
-     u8 sub_device_id[2];
--};
-+} __packed;
-
- struct rtw8723xu_efuse {
-     u8 res4[48];                    /* 0xd0 */
-@@ -56,12 +56,12 @@ struct rtw8723xu_efuse {
-     u8 usb_option;                  /* 0x104 */
-     u8 res5[2];            /* 0x105 */
-     u8 mac_addr[ETH_ALEN];          /* 0x107 */
--};
-+} __packed;
-
- struct rtw8723xs_efuse {
-     u8 res4[0x4a];            /* 0xd0 */
-     u8 mac_addr[ETH_ALEN];        /* 0x11a */
--};
-+} __packed;
-
- struct rtw8723x_efuse {
-     __le16 rtl_id;
-@@ -96,7 +96,7 @@ struct rtw8723x_efuse {
-         struct rtw8723xu_efuse u;
-         struct rtw8723xs_efuse s;
-     };
--};
-+} __packed;
-
- #define RTW8723X_IQK_ADDA_REG_NUM    16
- #define RTW8723X_IQK_MAC8_REG_NUM    3
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
-@@ -27,7 +27,7 @@ struct rtw8821cu_efuse {
-     u8 res11[0xcf];
-     u8 package_type;        /* 0x1fb */
-     u8 res12[0x4];
--};
-+} __packed;
-
- struct rtw8821ce_efuse {
-     u8 mac_addr[ETH_ALEN];        /* 0xd0 */
-@@ -47,7 +47,8 @@ struct rtw8821ce_efuse {
-     u8 ltr_en:1;
-     u8 res1:2;
-     u8 obff:2;
--    u8 res2:3;
-+    u8 res2_1:1;
-+    u8 res2_2:2;
-     u8 obff_cap:2;
-     u8 res3:4;
-     u8 res4[3];
-@@ -63,7 +64,7 @@ struct rtw8821ce_efuse {
-     u8 res6:1;
-     u8 port_t_power_on_value:5;
-     u8 res7;
--};
-+} __packed;
-
- struct rtw8821cs_efuse {
-     u8 res4[0x4a];            /* 0xd0 */
-@@ -101,7 +102,7 @@ struct rtw8821c_efuse {
-         struct rtw8821cu_efuse u;
-         struct rtw8821cs_efuse s;
-     };
--};
-+} __packed;
-
- static inline void
- _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
-@@ -27,7 +27,7 @@ struct rtw8822bu_efuse {
-     u8 res11[0xcf];
-     u8 package_type;        /* 0x1fb */
-     u8 res12[0x4];
--};
-+} __packed;
-
- struct rtw8822be_efuse {
-     u8 mac_addr[ETH_ALEN];        /* 0xd0 */
-@@ -47,7 +47,8 @@ struct rtw8822be_efuse {
-     u8 ltr_en:1;
-     u8 res1:2;
-     u8 obff:2;
--    u8 res2:3;
-+    u8 res2_1:1;
-+    u8 res2_2:2;
-     u8 obff_cap:2;
-     u8 res3:4;
-     u8 res4[3];
-@@ -63,7 +64,7 @@ struct rtw8822be_efuse {
-     u8 res6:1;
-     u8 port_t_power_on_value:5;
-     u8 res7;
--};
-+} __packed;
-
- struct rtw8822bs_efuse {
-     u8 res4[0x4a];            /* 0xd0 */
-@@ -103,7 +104,7 @@ struct rtw8822b_efuse {
-         struct rtw8822bu_efuse u;
-         struct rtw8822bs_efuse s;
-     };
--};
-+} __packed;
-
- static inline void
- _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
-@@ -14,7 +14,7 @@ struct rtw8822cu_efuse {
-     u8 res1[3];
-     u8 mac_addr[ETH_ALEN];        /* 0x157 */
-     u8 res2[0x3d];
--};
-+} __packed;
-
- struct rtw8822cs_efuse {
-     u8 res0[0x4a];            /* 0x120 */
-@@ -39,7 +39,8 @@ struct rtw8822ce_efuse {
-     u8 ltr_en:1;
-     u8 res1:2;
-     u8 obff:2;
--    u8 res2:3;
-+    u8 res2_1:1;
-+    u8 res2_2:2;
-     u8 obff_cap:2;
-     u8 res3:4;
-     u8 class_code[3];
-@@ -55,7 +56,7 @@ struct rtw8822ce_efuse {
-     u8 res6:1;
-     u8 port_t_power_on_value:5;
-     u8 res7;
--};
-+} __packed;
-
- struct rtw8822c_efuse {
-     __le16 rtl_id;
-@@ -102,7 +103,7 @@ struct rtw8822c_efuse {
-         struct rtw8822cu_efuse u;
-         struct rtw8822cs_efuse s;
-     };
--};
-+} __packed;
-
- enum rtw8822c_dpk_agc_phase {
-     RTW_DPK_GAIN_CHECK,
diff --git 
a/package/kernel/mac80211/patches/rtl/053-v6.14-wifi-rtw88-8812a-Support-RFE-type-2.patch 
b/package/kernel/mac80211/patches/rtl/053-v6.14-wifi-rtw88-8812a-Support-RFE-type-2.patch
deleted file mode 100644
index d59facb3f9d610..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/053-v6.14-wifi-rtw88-8812a-Support-RFE-type-2.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 59ab27a9f20f8de6f7989e8a8c3d97c04ed8199c Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 18 Dec 2024 02:13:22 +0200
-Subject: [PATCH] wifi: rtw88: 8812a: Support RFE type 2
-
-RF front end type 2 exists in the wild and can be treated like types
-0 and 1.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/2917c7fc-6d88-4007-b6a6-9130bd1991e5@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8812a.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-@@ -985,6 +985,9 @@ static const struct rtw_rfe_def rtw8812a
-     [1] = { .phy_pg_tbl    = &rtw8812a_bb_pg_tbl,
-         .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-         .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_tbl, },
-+    [2] = { .phy_pg_tbl    = &rtw8812a_bb_pg_tbl,
-+        .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-+        .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_tbl, },
-     [3] = { .phy_pg_tbl    = &rtw8812a_bb_pg_rfe3_tbl,
-         .txpwr_lmt_tbl    = &rtw8812a_txpwr_lmt_tbl,
-         .pwr_track_tbl    = &rtw8812a_rtw_pwr_track_rfe3_tbl, },
diff --git 
a/package/kernel/mac80211/patches/rtl/054-v6.14-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch 
b/package/kernel/mac80211/patches/rtl/054-v6.14-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch
deleted file mode 100644
index 3b5dea793a790d..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/054-v6.14-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 74a72c367573ad521becf6cc4d649e14387b3c64 Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 18 Dec 2024 02:16:11 +0200
-Subject: [PATCH] wifi: rtw88: 8821a/8812a: Set ptct_efuse_size to 0
-
-Some RTL8812AU devices fail to probe:
-
-[   12.478774] rtw_8812au 1-1.3:1.0: failed to dump efuse logical map
-[   12.487712] rtw_8812au 1-1.3:1.0: failed to setup chip efuse info
-[   12.487742] rtw_8812au 1-1.3:1.0: failed to setup chip information
-[   12.491077] rtw_8812au: probe of 1-1.3:1.0 failed with error -22
-
-It turns out these chips don't need to "protect" any bytes at the end of
-the efuse.
-
-The original value of 96 was copied from rtw8821c.c.
-
-No one reported any failures with RTL8821AU yet, but the vendor driver
-uses the same efuse reading code for both chips.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/1a477adb-60c3-463c-b158-3f86c94cb821@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8812a.c | 2 +-
- drivers/net/wireless/realtek/rtw88/rtw8821a.c | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-@@ -1027,7 +1027,7 @@ const struct rtw_chip_info rtw8812a_hw_s
-     .rx_buf_desc_sz = 8,
-     .phy_efuse_size = 512,
-     .log_efuse_size = 512,
--    .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
-+    .ptct_efuse_size = 0,
-     .txff_size = 131072,
-     .rxff_size = 16128,
-     .rsvd_drv_pg_num = 9,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
-@@ -1118,7 +1118,7 @@ const struct rtw_chip_info rtw8821a_hw_s
-     .rx_buf_desc_sz = 8,
-     .phy_efuse_size = 512,
-     .log_efuse_size = 512,
--    .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
-+    .ptct_efuse_size = 0,
-     .txff_size = 65536,
-     .rxff_size = 16128,
-     .rsvd_drv_pg_num = 8,
diff --git 
a/package/kernel/mac80211/patches/rtl/055-v6.14-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch 
b/package/kernel/mac80211/patches/rtl/055-v6.14-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch
deleted file mode 100644
index 30f13f9d385c3f..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/055-v6.14-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From e9048e2935f7d797c2ba047c15b705b57c2fa99a Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Thu, 19 Dec 2024 00:33:20 +0200
-Subject: [PATCH] wifi: rtw88: usb: Copy instead of cloning the RX skb
-
-"iperf3 -c 192.168.0.1 -R --udp -b 0" shows about 40% of datagrams
-are lost. Many torrents don't download faster than 3 MiB/s, probably
-because the Bittorrent protocol uses UDP. This is somehow related to
-the use of skb_clone() in the RX path.
-
-Don't use skb_clone(). Instead allocate a new skb for each 802.11 frame
-received and copy the data from the big (32768 byte) skb.
-
-With this patch, "iperf3 -c 192.168.0.1 -R --udp -b 0" shows only 1-2%
-of datagrams are lost, and torrents can reach download speeds of 36
-MiB/s.
-
-Tested with RTL8812AU and RTL8822CU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/8c9d4f9d-ebd8-4dc0-a0c4-9ebe430521dd@gmail.com
----
- drivers/net/wireless/realtek/rtw88/usb.c | 52 ++++++++++++++----------
- 1 file changed, 31 insertions(+), 21 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -7,6 +7,7 @@
- #include <linux/mutex.h>
- #include "main.h"
- #include "debug.h"
-+#include "mac.h"
- #include "reg.h"
- #include "tx.h"
- #include "rx.h"
-@@ -547,49 +548,58 @@ static void rtw_usb_rx_handler(struct wo
- {
-     struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work);
-     struct rtw_dev *rtwdev = rtwusb->rtwdev;
--    const struct rtw_chip_info *chip = rtwdev->chip;
--    u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
-     struct ieee80211_rx_status rx_status;
--    u32 pkt_offset, next_pkt, urb_len;
-     struct rtw_rx_pkt_stat pkt_stat;
--    struct sk_buff *next_skb;
-+    struct sk_buff *rx_skb;
-     struct sk_buff *skb;
-+    u32 pkt_desc_sz = rtwdev->chip->rx_pkt_desc_sz;
-+    u32 max_skb_len = pkt_desc_sz + PHY_STATUS_SIZE * 8 +
-+              IEEE80211_MAX_MPDU_LEN_VHT_11454;
-+    u32 pkt_offset, next_pkt, skb_len;
-     u8 *rx_desc;
-     int limit;
-
-     for (limit = 0; limit < 200; limit++) {
--        skb = skb_dequeue(&rtwusb->rx_queue);
--        if (!skb)
-+        rx_skb = skb_dequeue(&rtwusb->rx_queue);
-+        if (!rx_skb)
-             break;
-
-         if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) {
-             dev_dbg_ratelimited(rtwdev->dev, "failed to get rx_queue, 
overflow\n");
--            dev_kfree_skb_any(skb);
-+            dev_kfree_skb_any(rx_skb);
-             continue;
-         }
-
--        urb_len = skb->len;
-+        rx_desc = rx_skb->data;
-
-         do {
--            rx_desc = skb->data;
-             rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat,
-                          &rx_status);
-             pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
-                      pkt_stat.shift;
-
--            next_pkt = round_up(pkt_stat.pkt_len + pkt_offset, 8);
-+            skb_len = pkt_stat.pkt_len + pkt_offset;
-+            if (skb_len > max_skb_len) {
-+                rtw_dbg(rtwdev, RTW_DBG_USB,
-+                    "skipping too big packet: %u\n",
-+                    skb_len);
-+                goto skip_packet;
-+            }
-+
-+            skb = alloc_skb(skb_len, GFP_KERNEL);
-+            if (!skb) {
-+                rtw_dbg(rtwdev, RTW_DBG_USB,
-+                    "failed to allocate RX skb of size %u\n",
-+                    skb_len);
-+                goto skip_packet;
-+            }
-
--            if (urb_len >= next_pkt + pkt_desc_sz)
--                next_skb = skb_clone(skb, GFP_KERNEL);
--            else
--                next_skb = NULL;
-+            skb_put_data(skb, rx_desc, skb_len);
-
-             if (pkt_stat.is_c2h) {
--                skb_trim(skb, pkt_stat.pkt_len + pkt_offset);
-                 rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
-             } else {
-                 skb_pull(skb, pkt_offset);
--                skb_trim(skb, pkt_stat.pkt_len);
-                 rtw_update_rx_freq_for_invalid(rtwdev, skb,
-                                    &rx_status,
-                                    &pkt_stat);
-@@ -598,12 +608,12 @@ static void rtw_usb_rx_handler(struct wo
-                 ieee80211_rx_irqsafe(rtwdev->hw, skb);
-             }
-
--            skb = next_skb;
--            if (skb)
--                skb_pull(skb, next_pkt);
-+skip_packet:
-+            next_pkt = round_up(skb_len, 8);
-+            rx_desc += next_pkt;
-+        } while (rx_desc + pkt_desc_sz < rx_skb->data + rx_skb->len);
-
--            urb_len -= next_pkt;
--        } while (skb);
-+        dev_kfree_skb_any(rx_skb);
-     }
- }
-
diff --git 
a/package/kernel/mac80211/patches/rtl/058-v6.14-wifi-rtw88-Add-USB-PHY-configuration.patch 
b/package/kernel/mac80211/patches/rtl/058-v6.14-wifi-rtw88-Add-USB-PHY-configuration.patch
deleted file mode 100644
index 606c0fd6fcaed7..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/058-v6.14-wifi-rtw88-Add-USB-PHY-configuration.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From 5b1b9545262b5126a3c2776e7e64ff29765cbe6e Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 1 Jan 2025 18:16:32 +0200
-Subject: [PATCH] wifi: rtw88: Add USB PHY configuration
-
-Add some extra configuration for USB devices. Currently only RTL8822BU
-version (cut) D needs this. The new code makes use of the existing
-usb3_param_8822b array from rtw8822b.c.
-
-A user reported that TP-Link Archer T3U in USB 3 mode was randomly
-disconnecting from USB:
-
-[ 26.036502] usb 2-2: new SuperSpeed USB device number 3 using xhci_hcd
-...
-[ 27.576491] usb 2-2: USB disconnect, device number 3
-[ 28.621528] usb 2-2: new SuperSpeed USB device number 4 using xhci_hcd
-...
-[ 45.984521] usb 2-2: USB disconnect, device number 4
-...
-[ 46.845585] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
-...
-[ 94.400380] usb 2-2: USB disconnect, device number 5
-...
-[ 95.590421] usb 2-2: new SuperSpeed USB device number 6 using xhci_hcd
-
-This patch fixes that.
-
-Link: https://github.com/lwfinger/rtw88/issues/262
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/9d312b14-0146-4be8-9c50-ef432234db50@gmail.com
----
- drivers/net/wireless/realtek/rtw88/reg.h | 10 ++++
- drivers/net/wireless/realtek/rtw88/usb.c | 68 ++++++++++++++++++++++++
- 2 files changed, 78 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/reg.h
-+++ b/drivers/net/wireless/realtek/rtw88/reg.h
-@@ -871,7 +871,17 @@
-
- #define REG_USB_MOD    0xf008
- #define REG_USB3_RXITV    0xf050
-+#define REG_USB2_PHY_ADR    0xfe40
-+#define REG_USB2_PHY_DAT    0xfe41
-+#define REG_USB2_PHY_CMD    0xfe42
-+#define BIT_USB2_PHY_CMD_TRG    0x81
- #define REG_USB_HRPWM    0xfe58
-+#define REG_USB3_PHY_ADR    0xff0c
-+#define REG_USB3_PHY_DAT_L    0xff0d
-+#define REG_USB3_PHY_DAT_H    0xff0e
-+#define BIT_USB3_PHY_ADR_WR    BIT(7)
-+#define BIT_USB3_PHY_ADR_RD    BIT(6)
-+#define BIT_USB3_PHY_ADR_MASK    GENMASK(5, 0)
-
- #define RF_MODE        0x00
- #define RF_MODOPT    0x01
---- a/drivers/net/wireless/realtek/rtw88/usb.c
-+++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -1079,6 +1079,71 @@ static int rtw_usb_switch_mode(struct rt
-         return rtw_usb_switch_mode_new(rtwdev);
- }
-
-+#define USB_REG_PAGE    0xf4
-+#define USB_PHY_PAGE0    0x9b
-+#define USB_PHY_PAGE1    0xbb
-+
-+static void rtw_usb_phy_write(struct rtw_dev *rtwdev, u8 addr, u16 data,
-+                  enum usb_device_speed speed)
-+{
-+    if (speed == USB_SPEED_SUPER) {
-+        rtw_write8(rtwdev, REG_USB3_PHY_DAT_L, data & 0xff);
-+        rtw_write8(rtwdev, REG_USB3_PHY_DAT_H, data >> 8);
-+        rtw_write8(rtwdev, REG_USB3_PHY_ADR, addr | BIT_USB3_PHY_ADR_WR);
-+    } else if (speed == USB_SPEED_HIGH) {
-+        rtw_write8(rtwdev, REG_USB2_PHY_DAT, data);
-+        rtw_write8(rtwdev, REG_USB2_PHY_ADR, addr);
-+        rtw_write8(rtwdev, REG_USB2_PHY_CMD, BIT_USB2_PHY_CMD_TRG);
-+    }
-+}
-+
-+static void rtw_usb_page_switch(struct rtw_dev *rtwdev,
-+                enum usb_device_speed speed, u8 page)
-+{
-+    if (speed == USB_SPEED_SUPER)
-+        return;
-+
-+    rtw_usb_phy_write(rtwdev, USB_REG_PAGE, page, speed);
-+}
-+
-+static void rtw_usb_phy_cfg(struct rtw_dev *rtwdev,
-+                enum usb_device_speed speed)
-+{
-+    const struct rtw_intf_phy_para *para = NULL;
-+    u16 offset;
-+
-+    if (!rtwdev->chip->intf_table)
-+        return;
-+
-+    if (speed == USB_SPEED_SUPER)
-+        para = rtwdev->chip->intf_table->usb3_para;
-+    else if (speed == USB_SPEED_HIGH)
-+        para = rtwdev->chip->intf_table->usb2_para;
-+
-+    if (!para)
-+        return;
-+
-+    for ( ; para->offset != 0xffff; para++) {
-+        if (!(para->cut_mask & BIT(rtwdev->hal.cut_version)))
-+            continue;
-+
-+        offset = para->offset;
-+
-+        if (para->ip_sel == RTW_IP_SEL_MAC) {
-+            rtw_write8(rtwdev, offset, para->value);
-+        } else {
-+            if (offset > 0x100)
-+                rtw_usb_page_switch(rtwdev, speed, USB_PHY_PAGE1);
-+            else
-+                rtw_usb_page_switch(rtwdev, speed, USB_PHY_PAGE0);
-+
-+            offset &= 0xff;
-+
-+            rtw_usb_phy_write(rtwdev, offset, para->value, speed);
-+        }
-+    }
-+}
-+
- int rtw_usb_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
- {
-     struct rtw_dev *rtwdev;
-@@ -1134,6 +1199,9 @@ int rtw_usb_probe(struct usb_interface *
-         goto err_destroy_rxwq;
-     }
-
-+    rtw_usb_phy_cfg(rtwdev, USB_SPEED_HIGH);
-+    rtw_usb_phy_cfg(rtwdev, USB_SPEED_SUPER);
-+
-     ret = rtw_usb_switch_mode(rtwdev);
-     if (ret) {
-         /* Not a fail, but we do need to skip rtw_register_hw. */
diff --git 
a/package/kernel/mac80211/patches/rtl/059-v6.14-wifi-rtw88-Delete-rf_type-member-of-struct-rtw_sta_i.patch 
b/package/kernel/mac80211/patches/rtl/059-v6.14-wifi-rtw88-Delete-rf_type-member-of-struct-rtw_sta_i.patch
deleted file mode 100644
index 6a4998e783fc83..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/059-v6.14-wifi-rtw88-Delete-rf_type-member-of-struct-rtw_sta_i.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 5ad483955acc85dc91b88c7b76dc1429e8ba33bc Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 1 Jan 2025 18:27:35 +0200
-Subject: [PATCH] wifi: rtw88: Delete rf_type member of struct rtw_sta_info
-
-It's not used for anything.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/b80f7904-c6b4-4d12-a5f9-69ab9b965732@gmail.com
----
- drivers/net/wireless/realtek/rtw88/main.c | 9 ++-------
- drivers/net/wireless/realtek/rtw88/main.h | 1 -
- 2 files changed, 2 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -1217,7 +1217,6 @@ void rtw_update_sta_info(struct rtw_dev
-     u8 wireless_set;
-     u8 bw_mode;
-     u8 rate_id;
--    u8 rf_type = RF_1T1R;
-     u8 stbc_en = 0;
-     u8 ldpc_en = 0;
-     u8 tx_num = 1;
-@@ -1302,13 +1301,10 @@ void rtw_update_sta_info(struct rtw_dev
-         break;
-     }
-
--    if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000) {
-+    if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000)
-         tx_num = 2;
--        rf_type = RF_2T2R;
--    } else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000) {
-+    else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000)
-         tx_num = 2;
--        rf_type = RF_2T2R;
--    }
-
-     rate_id = get_rate_id(wireless_set, bw_mode, tx_num);
-
-@@ -1319,7 +1315,6 @@ void rtw_update_sta_info(struct rtw_dev
-     si->bw_mode = bw_mode;
-     si->stbc_en = stbc_en;
-     si->ldpc_en = ldpc_en;
--    si->rf_type = rf_type;
-     si->sgi_enable = is_support_sgi;
-     si->vht_enable = is_vht_enable;
-     si->ra_mask = ra_mask;
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -757,7 +757,6 @@ struct rtw_sta_info {
-     u8 mac_id;
-     u8 rate_id;
-     enum rtw_bandwidth bw_mode;
--    enum rtw_rf_type rf_type;
-     u8 stbc_en:2;
-     u8 ldpc_en:2;
-     bool sgi_enable;
diff --git 
a/package/kernel/mac80211/patches/rtl/060-v6.14-wifi-rtw88-8703b-Fix-RX-TX-issues.patch 
b/package/kernel/mac80211/patches/rtl/060-v6.14-wifi-rtw88-8703b-Fix-RX-TX-issues.patch
deleted file mode 100644
index 0a512a38592087..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/060-v6.14-wifi-rtw88-8703b-Fix-RX-TX-issues.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From a806a8160a0fcaff368bb510c8a52eff37faf727 Mon Sep 17 00:00:00 2001
-From: Vasily Khoruzhick <anarsoul at gmail.com>
-Date: Thu, 2 Jan 2025 23:50:53 -0800
-Subject: [PATCH] wifi: rtw88: 8703b: Fix RX/TX issues
-
-Fix 3 typos in 8703b driver. 2 typos in calibration routines are not
-fatal and do not seem to have any impact, just fix them to match vendor
-driver.
-
-However the last one in rtw8703b_set_channel_bb() clears too many bits
-in REG_OFDM0_TX_PSD_NOISE, causing TX and RX issues (neither rate goes
-above MCS0-MCS1). Vendor driver clears only 2 most significant bits.
-
-With the last typo fixed, the driver is able to reach MCS7 on Pinebook
-
-Cc: stable at vger.kernel.org
-Fixes: 9bb762b3a957 ("wifi: rtw88: Add definitions for 8703b chip")
-Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Tested-by: Fiona Klute <fiona.klute at gmx.de>
-Tested-by: Andrey Skvortsov <andrej.skvortzov at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20250103075107.1337533-1-anarsoul@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8703b.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
-@@ -903,7 +903,7 @@ static void rtw8703b_set_channel_bb(stru
-         rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
-         rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
-         rtw_write32_mask(rtwdev, REG_OFDM0_TX_PSD_NOISE,
--                 GENMASK(31, 20), 0x0);
-+                 GENMASK(31, 30), 0x0);
-         rtw_write32(rtwdev, REG_BBRX_DFIR, 0x4A880000);
-         rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x19F60000);
-         break;
-@@ -1198,9 +1198,9 @@ static u8 rtw8703b_iqk_rx_path(struct rt
-     rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
-     rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
-     rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
--    rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8216000f);
-+    rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8214030f);
-     rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28110000);
--    rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x28110000);
-+    rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000);
-     rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000);
-
-     /* LOK setting */
-@@ -1372,7 +1372,7 @@ void rtw8703b_iqk_fill_a_matrix(struct r
-         return;
-
-     tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_X, result[IQK_S1_RX_X]);
--    tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_Y1, result[IQK_S1_RX_X]);
-+    tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_Y1, result[IQK_S1_RX_Y]);
-     rtw_write32(rtwdev, REG_A_RXIQI, tmp_rx_iqi);
-     rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, 
BIT_MASK_RXIQ_S1_Y2,
-              BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
diff --git 
a/package/kernel/mac80211/patches/rtl/061-v6.14-wifi-rtw88-sdio-Fix-disconnection-after-beacon-loss.patch 
b/package/kernel/mac80211/patches/rtl/061-v6.14-wifi-rtw88-sdio-Fix-disconnection-after-beacon-loss.patch
deleted file mode 100644
index 790dfe04203433..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/061-v6.14-wifi-rtw88-sdio-Fix-disconnection-after-beacon-loss.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From fb2fcfbe5eef9ae26b0425978435ae1308951e51 Mon Sep 17 00:00:00 2001
-From: Fiona Klute <fiona.klute at gmx.de>
-Date: Mon, 6 Jan 2025 15:54:34 +0200
-Subject: [PATCH] wifi: rtw88: sdio: Fix disconnection after beacon loss
-
-This is the equivalent of commit 28818b4d871b ("wifi: rtw88: usb: Fix
-disconnection after beacon loss") for SDIO chips.
-Tested on Pinephone (RTL8723CS), random disconnections became rare,
-instead of a frequent nuisance.
-
-Cc: stable at vger.kernel.org
-Signed-off-by: Fiona Klute <fiona.klute at gmx.de>
-Tested-by: Vasily Khoruzhick <anarsoul at gmail.com> # Tested on Pinebook
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20250106135434.35936-1-fiona.klute@gmx.de
----
- drivers/net/wireless/realtek/rtw88/sdio.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/sdio.c
-+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
-@@ -1192,6 +1192,8 @@ static void rtw_sdio_indicate_tx_status(
-     struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-     struct ieee80211_hw *hw = rtwdev->hw;
-
-+    skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
-+
-     /* enqueue to wait for tx report */
-     if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
-         rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
diff --git 
a/package/kernel/mac80211/patches/rtl/062-v6.14-wifi-rtw88-Add-support-for-LED-blinking.patch 
b/package/kernel/mac80211/patches/rtl/062-v6.14-wifi-rtw88-Add-support-for-LED-blinking.patch
deleted file mode 100644
index b261d02e3f6e3c..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/062-v6.14-wifi-rtw88-Add-support-for-LED-blinking.patch
+++ /dev/null
@@ -1,424 +0,0 @@
-From 4b6652bc6d8d5fb0648b3a7a16ef8af4e0345bcd Mon Sep 17 00:00:00 2001
-From: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Date: Wed, 8 Jan 2025 13:41:23 +0200
-Subject: [PATCH] wifi: rtw88: Add support for LED blinking
-
-Register a struct led_classdev with the kernel's LED subsystem and
-create a throughput-based trigger for it. Then mac80211 makes the LED
-blink.
-
-Tested with Tenda U12 (RTL8812AU), Tenda U9 (RTL8811CU), TP-Link Archer
-T2U Nano (RTL8811AU), TP-Link Archer T3U Plus (RTL8812BU), Edimax
-EW-7611UCB (RTL8821AU), LM842 (RTL8822CU).
-
-Also tested with devices which don't have LEDs: the laptop's internal
-RTL8822CE and a no-name RTL8723DU.
-
-Signed-off-by: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: 
https://patch.msgid.link/6c43451f-ab2f-4e76-ac6e-ff5a18dd981d@gmail.com
----
- drivers/net/wireless/realtek/rtw88/Makefile   |  2 +
- drivers/net/wireless/realtek/rtw88/led.c      | 73 +++++++++++++++++++
- drivers/net/wireless/realtek/rtw88/led.h      | 25 +++++++
- drivers/net/wireless/realtek/rtw88/main.c     | 12 ++-
- drivers/net/wireless/realtek/rtw88/main.h     |  5 ++
- drivers/net/wireless/realtek/rtw88/reg.h      | 12 +++
- drivers/net/wireless/realtek/rtw88/rtw8812a.c | 17 +++++
- drivers/net/wireless/realtek/rtw88/rtw8821a.c | 26 +++++++
- drivers/net/wireless/realtek/rtw88/rtw8821c.c | 19 +++++
- drivers/net/wireless/realtek/rtw88/rtw8822b.c | 19 +++++
- drivers/net/wireless/realtek/rtw88/rtw8822c.c | 19 +++++
- 11 files changed, 227 insertions(+), 2 deletions(-)
- create mode 100644 drivers/net/wireless/realtek/rtw88/led.c
- create mode 100644 drivers/net/wireless/realtek/rtw88/led.h
-
---- a/drivers/net/wireless/realtek/rtw88/Makefile
-+++ b/drivers/net/wireless/realtek/rtw88/Makefile
-@@ -20,6 +20,8 @@ rtw88_core-y += main.o \
-
- rtw88_core-$(CONFIG_PM) += wow.o
-
-+rtw88_core-$(CONFIG_LEDS_CLASS) += led.o
-+
- obj-$(CPTCFG_RTW88_8822B)    += rtw88_8822b.o
- rtw88_8822b-objs        := rtw8822b.o rtw8822b_table.o
-
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/led.c
-@@ -0,0 +1,73 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/* Copyright(c) 2025  Realtek Corporation
-+ */
-+
-+#include "main.h"
-+#include "debug.h"
-+#include "led.h"
-+
-+static int rtw_led_set_blocking(struct led_classdev *led,
-+                enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+
-+    rtwdev->chip->ops->led_set(led, brightness);
-+
-+    return 0;
-+}
-+
-+void rtw_led_init(struct rtw_dev *rtwdev)
-+{
-+    static const struct ieee80211_tpt_blink rtw_tpt_blink[] = {
-+        { .throughput = 0 * 1024, .blink_time = 334 },
-+        { .throughput = 1 * 1024, .blink_time = 260 },
-+        { .throughput = 5 * 1024, .blink_time = 220 },
-+        { .throughput = 10 * 1024, .blink_time = 190 },
-+        { .throughput = 20 * 1024, .blink_time = 170 },
-+        { .throughput = 50 * 1024, .blink_time = 150 },
-+        { .throughput = 70 * 1024, .blink_time = 130 },
-+        { .throughput = 100 * 1024, .blink_time = 110 },
-+        { .throughput = 200 * 1024, .blink_time = 80 },
-+        { .throughput = 300 * 1024, .blink_time = 50 },
-+    };
-+    struct led_classdev *led = &rtwdev->led_cdev;
-+    int err;
-+
-+    if (!rtwdev->chip->ops->led_set)
-+        return;
-+
-+    if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
-+        led->brightness_set = rtwdev->chip->ops->led_set;
-+    else
-+        led->brightness_set_blocking = rtw_led_set_blocking;
-+
-+    snprintf(rtwdev->led_name, sizeof(rtwdev->led_name),
-+         "rtw88-%s", dev_name(rtwdev->dev));
-+
-+    led->name = rtwdev->led_name;
-+    led->max_brightness = LED_ON;
-+    led->default_trigger =
-+        ieee80211_create_tpt_led_trigger(rtwdev->hw,
-+                         IEEE80211_TPT_LEDTRIG_FL_RADIO,
-+                         rtw_tpt_blink,
-+                         ARRAY_SIZE(rtw_tpt_blink));
-+
-+    err = led_classdev_register(rtwdev->dev, led);
-+    if (err) {
-+        rtw_warn(rtwdev, "Failed to register the LED, error %d\n", err);
-+        return;
-+    }
-+
-+    rtwdev->led_registered = true;
-+}
-+
-+void rtw_led_deinit(struct rtw_dev *rtwdev)
-+{
-+    struct led_classdev *led = &rtwdev->led_cdev;
-+
-+    if (!rtwdev->led_registered)
-+        return;
-+
-+    rtwdev->chip->ops->led_set(led, LED_OFF);
-+    led_classdev_unregister(led);
-+}
---- /dev/null
-+++ b/drivers/net/wireless/realtek/rtw88/led.h
-@@ -0,0 +1,25 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
-+/* Copyright(c) 2025  Realtek Corporation
-+ */
-+
-+#ifndef __RTW_LED_H
-+#define __RTW_LED_H
-+
-+#ifdef CONFIG_LEDS_CLASS
-+
-+void rtw_led_init(struct rtw_dev *rtwdev);
-+void rtw_led_deinit(struct rtw_dev *rtwdev);
-+
-+#else
-+
-+static inline void rtw_led_init(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+static inline void rtw_led_deinit(struct rtw_dev *rtwdev)
-+{
-+}
-+
-+#endif
-+
-+#endif
---- a/drivers/net/wireless/realtek/rtw88/main.c
-+++ b/drivers/net/wireless/realtek/rtw88/main.c
-@@ -19,6 +19,7 @@
- #include "bf.h"
- #include "sar.h"
- #include "sdio.h"
-+#include "led.h"
-
- bool rtw_disable_lps_deep_mode;
- EXPORT_SYMBOL(rtw_disable_lps_deep_mode);
-@@ -2292,16 +2293,18 @@ int rtw_register_hw(struct rtw_dev *rtwd
-         return ret;
-     }
-
-+    rtw_led_init(rtwdev);
-+
-     ret = ieee80211_register_hw(hw);
-     if (ret) {
-         rtw_err(rtwdev, "failed to register hw\n");
--        return ret;
-+        goto led_deinit;
-     }
-
-     ret = rtw_regd_hint(rtwdev);
-     if (ret) {
-         rtw_err(rtwdev, "failed to hint regd\n");
--        return ret;
-+        goto led_deinit;
-     }
-
-     rtw_debugfs_init(rtwdev);
-@@ -2310,6 +2313,10 @@ int rtw_register_hw(struct rtw_dev *rtwd
-     rtwdev->bf_info.bfer_su_cnt = 0;
-
-     return 0;
-+
-+led_deinit:
-+    rtw_led_deinit(rtwdev);
-+    return ret;
- }
- EXPORT_SYMBOL(rtw_register_hw);
-
-@@ -2320,6 +2327,7 @@ void rtw_unregister_hw(struct rtw_dev *r
-     ieee80211_unregister_hw(hw);
-     rtw_unset_supported_band(hw, chip);
-     rtw_debugfs_deinit(rtwdev);
-+    rtw_led_deinit(rtwdev);
- }
- EXPORT_SYMBOL(rtw_unregister_hw);
-
---- a/drivers/net/wireless/realtek/rtw88/main.h
-+++ b/drivers/net/wireless/realtek/rtw88/main.h
-@@ -887,6 +887,7 @@ struct rtw_chip_ops {
-                    bool is_tx2_path);
-     void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path,
-                  u8 rx_path, bool is_tx2_path);
-+    void (*led_set)(struct led_classdev *led, enum led_brightness 
brightness);
-     /* for USB/SDIO only */
-     void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev,
-                      struct rtw_tx_pkt_info *pkt_info,
-@@ -2097,6 +2098,10 @@ struct rtw_dev {
-     struct completion fw_scan_density;
-     bool ap_active;
-
-+    bool led_registered;
-+    char led_name[32];
-+    struct led_classdev led_cdev;
-+
-     /* hci related data, must be last */
-     u8 priv[] __aligned(sizeof(void *));
- };
---- a/drivers/net/wireless/realtek/rtw88/reg.h
-+++ b/drivers/net/wireless/realtek/rtw88/reg.h
-@@ -78,7 +78,19 @@
- #define BIT_PAPE_SEL_EN        BIT(25)
- #define BIT_DPDT_WL_SEL        BIT(24)
- #define BIT_DPDT_SEL_EN        BIT(23)
-+#define BIT_GPIO13_14_WL_CTRL_EN    BIT(22)
-+#define BIT_LED2_SV        BIT(19)
-+#define BIT_LED2_CM        GENMASK(18, 16)
-+#define BIT_LED1_SV        BIT(11)
-+#define BIT_LED1_CM        GENMASK(10, 8)
-+#define BIT_LED0_SV        BIT(3)
-+#define BIT_LED0_CM        GENMASK(2, 0)
-+#define BIT_LED_MODE_SW_CTRL    0
-+#define BIT_LED_MODE_RX        6
-+#define BIT_LED_MODE_TX        4
-+#define BIT_LED_MODE_TRX    2
- #define REG_LEDCFG2        0x004E
-+#define REG_GPIO_PIN_CTRL_2    0x0060
- #define REG_PAD_CTRL1        0x0064
- #define BIT_BT_BTG_SEL        BIT(31)
- #define BIT_PAPE_WLBT_SEL    BIT(29)
---- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
-@@ -868,6 +868,22 @@ static void rtw8812a_pwr_track(struct rt
-     dm_info->pwr_trk_triggered = false;
- }
-
-+static void rtw8812a_led_set(struct led_classdev *led,
-+                 enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+    u8 ledcfg;
-+
-+    ledcfg = rtw_read8(rtwdev, REG_LED_CFG);
-+    ledcfg &= BIT(6) | BIT(4);
-+    ledcfg |= BIT(5);
-+
-+    if (brightness == LED_OFF)
-+        ledcfg |= BIT(3);
-+
-+    rtw_write8(rtwdev, REG_LED_CFG, ledcfg);
-+}
-+
- static void rtw8812a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-                       struct rtw_tx_pkt_info *pkt_info,
-                       u8 *txdesc)
-@@ -916,6 +932,7 @@ static const struct rtw_chip_ops rtw8812
-     .config_bfee        = NULL,
-     .set_gid_table        = NULL,
-     .cfg_csi_rate        = NULL,
-+    .led_set        = rtw8812a_led_set,
-     .fill_txdesc_checksum    = rtw8812a_fill_txdesc_checksum,
-     .coex_set_init        = rtw8812a_coex_cfg_init,
-     .coex_set_ant_switch    = NULL,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
-@@ -706,6 +706,31 @@ static void rtw8821a_pwr_track(struct rt
-     dm_info->pwr_trk_triggered = false;
- }
-
-+static void rtw8821a_led_set(struct led_classdev *led,
-+                 enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+    u32 gpio8_cfg;
-+    u8 ledcfg;
-+
-+    if (brightness == LED_OFF) {
-+        gpio8_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2);
-+        gpio8_cfg &= ~BIT(24);
-+        gpio8_cfg |= BIT(16) | BIT(8);
-+        rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, gpio8_cfg);
-+    } else {
-+        ledcfg = rtw_read8(rtwdev, REG_LED_CFG + 2);
-+        gpio8_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2);
-+
-+        ledcfg &= BIT(7) | BIT(6);
-+        rtw_write8(rtwdev, REG_LED_CFG + 2, ledcfg);
-+
-+        gpio8_cfg &= ~(BIT(24) | BIT(8));
-+        gpio8_cfg |= BIT(16);
-+        rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, gpio8_cfg);
-+    }
-+}
-+
- static void rtw8821a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-                       struct rtw_tx_pkt_info *pkt_info,
-                       u8 *txdesc)
-@@ -853,6 +878,7 @@ static const struct rtw_chip_ops rtw8821
-     .config_bfee        = NULL,
-     .set_gid_table        = NULL,
-     .cfg_csi_rate        = NULL,
-+    .led_set        = rtw8821a_led_set,
-     .fill_txdesc_checksum    = rtw8821a_fill_txdesc_checksum,
-     .coex_set_init        = rtw8821a_coex_cfg_init,
-     .coex_set_ant_switch    = rtw8821a_coex_cfg_ant_switch,
---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
-@@ -1206,6 +1206,24 @@ static void rtw8821c_phy_cck_pd_set(stru
-              dm_info->cck_pd_default + new_lvl * 2);
- }
-
-+static void rtw8821c_led_set(struct led_classdev *led,
-+                 enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+    u32 ledcfg;
-+
-+    ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
-+    u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
-+    ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
-+
-+    if (brightness == LED_OFF)
-+        ledcfg |= BIT_LED2_SV;
-+    else
-+        ledcfg &= ~BIT_LED2_SV;
-+
-+    rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
-+}
-+
- static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-                       struct rtw_tx_pkt_info *pkt_info,
-                       u8 *txdesc)
-@@ -1655,6 +1673,7 @@ static const struct rtw_chip_ops rtw8821
-     .config_bfee        = rtw8821c_bf_config_bfee,
-     .set_gid_table        = rtw_bf_set_gid_table,
-     .cfg_csi_rate        = rtw_bf_cfg_csi_rate,
-+    .led_set        = rtw8821c_led_set,
-     .fill_txdesc_checksum    = rtw8821c_fill_txdesc_checksum,
-
-     .coex_set_init        = rtw8821c_coex_cfg_init,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
-@@ -1566,6 +1566,24 @@ static void rtw8822b_adaptivity(struct r
-     rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
- }
-
-+static void rtw8822b_led_set(struct led_classdev *led,
-+                 enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+    u32 ledcfg;
-+
-+    ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
-+    u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
-+    ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
-+
-+    if (brightness == LED_OFF)
-+        ledcfg |= BIT_LED2_SV;
-+    else
-+        ledcfg &= ~BIT_LED2_SV;
-+
-+    rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
-+}
-+
- static void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-                       struct rtw_tx_pkt_info *pkt_info,
-                       u8 *txdesc)
-@@ -2146,6 +2164,7 @@ static const struct rtw_chip_ops rtw8822
-     .cfg_csi_rate        = rtw_bf_cfg_csi_rate,
-     .adaptivity_init    = rtw8822b_adaptivity_init,
-     .adaptivity        = rtw8822b_adaptivity,
-+    .led_set        = rtw8822b_led_set,
-     .fill_txdesc_checksum    = rtw8822b_fill_txdesc_checksum,
-
-     .coex_set_init        = rtw8822b_coex_cfg_init,
---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
-@@ -4537,6 +4537,24 @@ static void rtw8822c_adaptivity(struct r
-     rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
- }
-
-+static void rtw8822c_led_set(struct led_classdev *led,
-+                 enum led_brightness brightness)
-+{
-+    struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
-+    u32 ledcfg;
-+
-+    ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
-+    u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
-+    ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
-+
-+    if (brightness == LED_OFF)
-+        ledcfg |= BIT_LED2_SV;
-+    else
-+        ledcfg &= ~BIT_LED2_SV;
-+
-+    rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
-+}
-+
- static void rtw8822c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
-                       struct rtw_tx_pkt_info *pkt_info,
-                       u8 *txdesc)
-@@ -4964,6 +4982,7 @@ static const struct rtw_chip_ops rtw8822
-     .cfo_track        = rtw8822c_cfo_track,
-     .config_tx_path        = rtw8822c_config_tx_path,
-     .config_txrx_mode    = rtw8822c_config_trx_mode,
-+    .led_set        = rtw8822c_led_set,
-     .fill_txdesc_checksum    = rtw8822c_fill_txdesc_checksum,
-
-     .coex_set_init        = rtw8822c_coex_cfg_init,
diff --git 
a/package/kernel/mac80211/patches/rtl/063-v6.14-wifi-rtw88-add-RTW88_LEDS-depends-on-LEDS_CLASS-to-K.patch 
b/package/kernel/mac80211/patches/rtl/063-v6.14-wifi-rtw88-add-RTW88_LEDS-depends-on-LEDS_CLASS-to-K.patch
deleted file mode 100644
index f1f09fde1a0cde..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/063-v6.14-wifi-rtw88-add-RTW88_LEDS-depends-on-LEDS_CLASS-to-K.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From b4bfbc50b1b92a0815800eb1231f73bfc917af03 Mon Sep 17 00:00:00 2001
-From: Ping-Ke Shih <pkshih at realtek.com>
-Date: Thu, 16 Jan 2025 20:04:24 +0800
-Subject: [PATCH] wifi: rtw88: add RTW88_LEDS depends on LEDS_CLASS to 
Kconfig
-
-When using allmodconfig, .config has CONFIG_LEDS_CLASS=m but
-autoconf.h has CONFIG_LEDS_CLASS_MODULE (additional suffix _MODULE)
-instead of CONFIG_LEDS_CLASS, which condition CONFIG_LEDS_CLASS in
-rtw88/led.h can't work properly.
-
-Add RTW88_LEDS to Kconfig, and use it as condition to fix this problem.
-
-drivers/net/wireless/realtek/rtw88/led.c:19:6: error: redefinition of 
'rtw_led_init'
-   19 | void rtw_led_init(struct rtw_dev *rtwdev)
-      |      ^~~~~~~~~~~~
-In file included from drivers/net/wireless/realtek/rtw88/led.c:7:
-drivers/net/wireless/realtek/rtw88/led.h:15:20: note: previous 
definition of 'rtw_led_init' with type 'void(struct rtw_dev *)'
-   15 | static inline void rtw_led_init(struct rtw_dev *rtwdev)
-      |                    ^~~~~~~~~~~~
-drivers/net/wireless/realtek/rtw88/led.c:64:6: error: redefinition of 
'rtw_led_deinit'
-   64 | void rtw_led_deinit(struct rtw_dev *rtwdev)
-      |      ^~~~~~~~~~~~~~
-drivers/net/wireless/realtek/rtw88/led.h:19:20: note: previous 
definition of 'rtw_led_deinit' with type 'void(struct rtw_dev *)'
-   19 | static inline void rtw_led_deinit(struct rtw_dev *rtwdev)
-      |                    ^~~~~~~~~~~~~~
-
-Reported-by: Stephen Rothwell <sfr at canb.auug.org.au>
-Closes: 
https://lore.kernel.org/linux-wireless/e19a87ad9cd54bfa9907f3a043b25d30@realtek.com/T/#me407832de1040ce22e53517bcb18e322ad0e2260
-Fixes: 4b6652bc6d8d ("wifi: rtw88: Add support for LED blinking")
-Cc: Bitterblue Smith <rtl8821cerfe2 at gmail.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Kalle Valo <kvalo at kernel.org>
-Link: https://patch.msgid.link/20250116120424.13174-1-pkshih@realtek.com
----
- drivers/net/wireless/realtek/rtw88/Kconfig  | 5 +++++
- drivers/net/wireless/realtek/rtw88/Makefile | 2 +-
- drivers/net/wireless/realtek/rtw88/led.h    | 2 +-
- 3 files changed, 7 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireless/realtek/rtw88/Kconfig
-+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
-@@ -267,4 +267,9 @@ config RTW88_DEBUGFS
-
-       If unsure, say Y to simplify debug problems
-
-+config RTW88_LEDS
-+    bool
-+    depends on LEDS_CLASS=y || LEDS_CLASS=MAC80211
-+    default y
-+
- endif
---- a/drivers/net/wireless/realtek/rtw88/Makefile
-+++ b/drivers/net/wireless/realtek/rtw88/Makefile
-@@ -20,7 +20,7 @@ rtw88_core-y += main.o \
-
- rtw88_core-$(CONFIG_PM) += wow.o
-
--rtw88_core-$(CONFIG_LEDS_CLASS) += led.o
-+rtw88_core-$(CPTCFG_RTW88_LEDS) += led.o
-
- obj-$(CPTCFG_RTW88_8822B)    += rtw88_8822b.o
- rtw88_8822b-objs        := rtw8822b.o rtw8822b_table.o
---- a/drivers/net/wireless/realtek/rtw88/led.h
-+++ b/drivers/net/wireless/realtek/rtw88/led.h
-@@ -5,7 +5,7 @@
- #ifndef __RTW_LED_H
- #define __RTW_LED_H
-
--#ifdef CONFIG_LEDS_CLASS
-+#ifdef CPTCFG_RTW88_LEDS
-
- void rtw_led_init(struct rtw_dev *rtwdev);
- void rtw_led_deinit(struct rtw_dev *rtwdev);
diff --git 
a/package/kernel/mac80211/patches/rtl/076-v6.14-wifi-rtw88-Add-support-for-Mercusys-MA30N-and-D-Link.patch 
b/package/kernel/mac80211/patches/rtl/076-v6.14-wifi-rtw88-Add-support-for-Mercusys-MA30N-and-D-Link.patch
deleted file mode 100644
index e281cf6ecec7e8..00000000000000
--- 
a/package/kernel/mac80211/patches/rtl/076-v6.14-wifi-rtw88-Add-support-for-Mercusys-MA30N-and-D-Link.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 80c4668d024ff7b5427d90b5fad655ce9461c7b1 Mon Sep 17 00:00:00 2001
-From: Zenm Chen <zenmchen at gmail.com>
-Date: Mon, 10 Feb 2025 15:36:10 +0800
-Subject: [PATCH] wifi: rtw88: Add support for Mercusys MA30N and D-Link
- DWA-T185 rev. A1
-
-Add two more USB IDs found in
-https://github.com/RinCat/RTL88x2BU-Linux-Driver
-to support Mercusys MA30N and D-Link DWA-T185 rev. A1.
-
-Signed-off-by: Zenm Chen <zenmchen at gmail.com>
-Acked-by: Ping-Ke Shih <pkshih at realtek.com>
-Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
-Link: https://patch.msgid.link/20250210073610.4174-1-zenmchen@gmail.com
----
- drivers/net/wireless/realtek/rtw88/rtw8822bu.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
-+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
-@@ -73,6 +73,10 @@ static const struct usb_device_id rtw_88
-       .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ELECOM 
WDB-867DU3S */
-     { USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0107, 0xff, 0xff, 0xff),
-       .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* 
Mercusys MA30H */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x010a, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* 
Mercusys MA30N */
-+    { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3322, 0xff, 0xff, 0xff),
-+      .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* D-Link 
DWA-T185 rev. A1 */
-     {},
- };
- MODULE_DEVICE_TABLE(usb, rtw_8822bu_id_table);
diff --git 
a/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-call-rate_control_rate_update-for-link.patch 
b/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-call-rate_control_rate_update-for-link.patch
deleted file mode 100644
index 0ccdfb9fb548b3..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/306-wifi-mac80211-call-rate_control_rate_update-for-link.patch
+++ /dev/null
@@ -1,548 +0,0 @@
-From: Johannes Berg <johannes.berg at intel.com>
-Date: Mon, 7 Oct 2024 15:00:54 +0300
-Subject: [PATCH] wifi: mac80211: call rate_control_rate_update() for 
link STA
-
-In order to update the right link information, call the update
-rate_control_rate_update() with the right link_sta, and then
-pass that through to the driver's sta_rc_update() method. The
-software rate control still doesn't support it, but that'll be
-skipped by not having a rate control ref.
-
-Since it now operates on a link sta, rename the driver method.
-
-Signed-off-by: Johannes Berg <johannes.berg at intel.com>
-Signed-off-by: Miri Korenblit <miriam.rachel.korenblit at intel.com>
-Link: 
https://patch.msgid.link/20241007144851.5851b6b5fd41.Ibdf50d96afa4b761dd9b9dfd54a1147e77a75329@changeid
-Signed-off-by: Johannes Berg <johannes.berg at intel.com>
----
-
---- a/drivers/net/wireless/ath/ath10k/mac.c
-+++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -8507,9 +8507,10 @@ exit:
-
- static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif,
--                 struct ieee80211_sta *sta,
-+                 struct ieee80211_link_sta *link_sta,
-                  u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct ath10k *ar = hw->priv;
-     struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
-     struct ath10k_vif *arvif = (void *)vif->drv_priv;
-@@ -9450,7 +9451,7 @@ static const struct ieee80211_ops ath10k
-     .reconfig_complete        = ath10k_reconfig_complete,
-     .get_survey            = ath10k_get_survey,
-     .set_bitrate_mask        = ath10k_mac_op_set_bitrate_mask,
--    .sta_rc_update            = ath10k_sta_rc_update,
-+    .link_sta_rc_update        = ath10k_sta_rc_update,
-     .offset_tsf            = ath10k_offset_tsf,
-     .ampdu_action            = ath10k_ampdu_action,
-     .get_et_sset_count        = ath10k_debug_get_et_sset_count,
---- a/drivers/net/wireless/ath/ath11k/mac.c
-+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -5079,9 +5079,10 @@ static void ath11k_mac_op_sta_set_4addr(
-
- static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
--                    struct ieee80211_sta *sta,
-+                    struct ieee80211_link_sta *link_sta,
-                     u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct ath11k *ar = hw->priv;
-     struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
-     struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
-@@ -9708,7 +9709,7 @@ static const struct ieee80211_ops ath11k
-     .sta_state                      = ath11k_mac_op_sta_state,
-     .sta_set_4addr                  = ath11k_mac_op_sta_set_4addr,
-     .sta_set_txpwr            = ath11k_mac_op_sta_set_txpwr,
--    .sta_rc_update            = ath11k_mac_op_sta_rc_update,
-+    .link_sta_rc_update        = ath11k_mac_op_sta_rc_update,
-     .conf_tx                        = ath11k_mac_op_conf_tx,
-     .set_antenna            = ath11k_mac_op_set_antenna,
-     .get_antenna            = ath11k_mac_op_get_antenna,
---- a/drivers/net/wireless/ath/ath12k/mac.c
-+++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -4740,9 +4740,10 @@ out:
-
- static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
--                    struct ieee80211_sta *sta,
-+                    struct ieee80211_link_sta *link_sta,
-                     u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct ath12k *ar;
-     struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
-     struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
-@@ -8684,7 +8685,7 @@ static const struct ieee80211_ops ath12k
-     .set_rekey_data                    = ath12k_mac_op_set_rekey_data,
-     .sta_state                      = ath12k_mac_op_sta_state,
-     .sta_set_txpwr            = ath12k_mac_op_sta_set_txpwr,
--    .sta_rc_update            = ath12k_mac_op_sta_rc_update,
-+    .link_sta_rc_update        = ath12k_mac_op_sta_rc_update,
-     .conf_tx                        = ath12k_mac_op_conf_tx,
-     .set_antenna            = ath12k_mac_op_set_antenna,
-     .get_antenna            = ath12k_mac_op_get_antenna,
---- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
-+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
-@@ -1357,8 +1357,10 @@ static int ath9k_htc_sta_remove(struct i
-
- static void ath9k_htc_sta_rc_update(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
--                    struct ieee80211_sta *sta, u32 changed)
-+                    struct ieee80211_link_sta *link_sta,
-+                    u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct ath9k_htc_sta *ista = (struct ath9k_htc_sta *) sta->drv_priv;
-
-     if (!(changed & IEEE80211_RC_SUPP_RATES_CHANGED))
-@@ -1883,7 +1885,7 @@ struct ieee80211_ops ath9k_htc_ops = {
-     .sta_add            = ath9k_htc_sta_add,
-     .sta_remove         = ath9k_htc_sta_remove,
-     .conf_tx            = ath9k_htc_conf_tx,
--    .sta_rc_update      = ath9k_htc_sta_rc_update,
-+    .link_sta_rc_update = ath9k_htc_sta_rc_update,
-     .bss_info_changed   = ath9k_htc_bss_info_changed,
-     .set_key            = ath9k_htc_set_key,
-     .get_tsf            = ath9k_htc_get_tsf,
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-@@ -4248,8 +4248,9 @@ int iwl_mvm_mac_set_rts_threshold(struct
- }
-
- void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw, struct 
ieee80211_vif *vif,
--               struct ieee80211_sta *sta, u32 changed)
-+               struct ieee80211_link_sta *link_sta, u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
-
-     if (changed & (IEEE80211_RC_BW_CHANGED |
-@@ -6574,7 +6575,7 @@ const struct ieee80211_ops iwl_mvm_hw_op
-     .allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames,
-     .release_buffered_frames = iwl_mvm_mac_release_buffered_frames,
-     .set_rts_threshold = iwl_mvm_mac_set_rts_threshold,
--    .sta_rc_update = iwl_mvm_sta_rc_update,
-+    .link_sta_rc_update = iwl_mvm_sta_rc_update,
-     .conf_tx = iwl_mvm_mac_conf_tx,
-     .mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx,
-     .mgd_complete_tx = iwl_mvm_mac_mgd_complete_tx,
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
-@@ -1413,7 +1413,7 @@ const struct ieee80211_ops iwl_mvm_mld_h
-     .allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames,
-     .release_buffered_frames = iwl_mvm_mac_release_buffered_frames,
-     .set_rts_threshold = iwl_mvm_mac_set_rts_threshold,
--    .sta_rc_update = iwl_mvm_sta_rc_update,
-+    .link_sta_rc_update = iwl_mvm_sta_rc_update,
-     .conf_tx = iwl_mvm_mld_mac_conf_tx,
-     .mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx,
-     .mgd_complete_tx = iwl_mvm_mac_mgd_complete_tx,
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
-@@ -2914,7 +2914,7 @@ iwl_mvm_mac_release_buffered_frames(stru
-                     bool more_data);
- int iwl_mvm_mac_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
- void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw, struct 
ieee80211_vif *vif,
--               struct ieee80211_sta *sta, u32 changed);
-+               struct ieee80211_link_sta *link_sta, u32 changed);
- void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
-                 struct ieee80211_vif *vif,
-                 struct ieee80211_prep_tx_info *info);
---- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
-@@ -1163,9 +1163,10 @@ static void mt7915_sta_rc_work(void *dat
-
- static void mt7915_sta_rc_update(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif,
--                 struct ieee80211_sta *sta,
-+                 struct ieee80211_link_sta *link_sta,
-                  u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct mt7915_phy *phy = mt7915_hw_phy(hw);
-     struct mt7915_dev *dev = phy->dev;
-     struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
-@@ -1709,7 +1710,7 @@ const struct ieee80211_ops mt7915_ops =
-     .stop_ap = mt7915_stop_ap,
-     .sta_state = mt76_sta_state,
-     .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
--    .sta_rc_update = mt7915_sta_rc_update,
-+    .link_sta_rc_update = mt7915_sta_rc_update,
-     .set_key = mt7915_set_key,
-     .ampdu_action = mt7915_ampdu_action,
-     .set_rts_threshold = mt7915_set_rts_threshold,
---- a/drivers/net/wireless/mediatek/mt76/mt7996/main.c
-+++ b/drivers/net/wireless/mediatek/mt76/mt7996/main.c
-@@ -1060,9 +1060,10 @@ static void mt7996_sta_rc_work(void *dat
-
- static void mt7996_sta_rc_update(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif,
--                 struct ieee80211_sta *sta,
-+                 struct ieee80211_link_sta *link_sta,
-                  u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct mt7996_phy *phy = mt7996_hw_phy(hw);
-     struct mt7996_dev *dev = phy->dev;
-
-@@ -1472,7 +1473,7 @@ const struct ieee80211_ops mt7996_ops =
-     .sta_add = mt7996_sta_add,
-     .sta_remove = mt7996_sta_remove,
-     .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
--    .sta_rc_update = mt7996_sta_rc_update,
-+    .link_sta_rc_update = mt7996_sta_rc_update,
-     .set_key = mt7996_set_key,
-     .ampdu_action = mt7996_ampdu_action,
-     .set_rts_threshold = mt7996_set_rts_threshold,
---- a/drivers/net/wireless/realtek/rtw88/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
-@@ -928,8 +928,10 @@ static int rtw_ops_set_sar_specs(struct
-
- static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw,
-                   struct ieee80211_vif *vif,
--                  struct ieee80211_sta *sta, u32 changed)
-+                  struct ieee80211_link_sta *link_sta,
-+                  u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct rtw_dev *rtwdev = hw->priv;
-     struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
-
-@@ -973,7 +975,7 @@ const struct ieee80211_ops rtw_ops = {
-     .reconfig_complete    = rtw_reconfig_complete,
-     .hw_scan        = rtw_ops_hw_scan,
-     .cancel_hw_scan        = rtw_ops_cancel_hw_scan,
--    .sta_rc_update        = rtw_ops_sta_rc_update,
-+    .link_sta_rc_update    = rtw_ops_sta_rc_update,
-     .set_sar_specs          = rtw_ops_set_sar_specs,
- #ifdef CONFIG_PM
-     .suspend        = rtw_ops_suspend,
---- a/drivers/net/wireless/realtek/rtw89/mac80211.c
-+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
-@@ -1290,8 +1290,10 @@ out:
-
- static void rtw89_ops_sta_rc_update(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
--                    struct ieee80211_sta *sta, u32 changed)
-+                    struct ieee80211_link_sta *link_sta,
-+                    u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct rtw89_dev *rtwdev = hw->priv;
-
-     rtw89_phy_ra_update_sta(rtwdev, sta, changed);
-@@ -1594,7 +1596,7 @@ const struct ieee80211_ops rtw89_ops = {
-     .remain_on_channel        = rtw89_ops_remain_on_channel,
-     .cancel_remain_on_channel    = rtw89_ops_cancel_remain_on_channel,
-     .set_sar_specs        = rtw89_ops_set_sar_specs,
--    .sta_rc_update        = rtw89_ops_sta_rc_update,
-+    .link_sta_rc_update    = rtw89_ops_sta_rc_update,
-     .set_tid_config        = rtw89_ops_set_tid_config,
- #ifdef CONFIG_PM
-     .suspend        = rtw89_ops_suspend,
---- a/drivers/net/wireless/ti/wlcore/main.c
-+++ b/drivers/net/wireless/ti/wlcore/main.c
-@@ -5789,9 +5789,10 @@ static int wlcore_op_cancel_remain_on_ch
-
- static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
--                    struct ieee80211_sta *sta,
-+                    struct ieee80211_link_sta *link_sta,
-                     u32 changed)
- {
-+    struct ieee80211_sta *sta = link_sta->sta;
-     struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
-
-     wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
-@@ -6052,7 +6053,7 @@ static const struct ieee80211_ops wl1271
-     .assign_vif_chanctx = wlcore_op_assign_vif_chanctx,
-     .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx,
-     .switch_vif_chanctx = wlcore_op_switch_vif_chanctx,
--    .sta_rc_update = wlcore_op_sta_rc_update,
-+    .link_sta_rc_update = wlcore_op_sta_rc_update,
-     .sta_statistics = wlcore_op_sta_statistics,
-     .get_expected_throughput = wlcore_op_get_expected_throughput,
-     CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
---- a/drivers/net/wireless/virtual/mac80211_hwsim.c
-+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
-@@ -2594,10 +2594,11 @@ static void mac80211_hwsim_link_info_cha
- static void
- mac80211_hwsim_sta_rc_update(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif,
--                 struct ieee80211_sta *sta,
-+                 struct ieee80211_link_sta *link_sta,
-                  u32 changed)
- {
-     struct mac80211_hwsim_data *data = hw->priv;
-+    struct ieee80211_sta *sta = link_sta->sta;
-     u32 bw = U32_MAX;
-     int link_id;
-
-@@ -2607,7 +2608,6 @@ mac80211_hwsim_sta_rc_update(struct ieee
-          link_id++) {
-         enum nl80211_chan_width confbw = NL80211_CHAN_WIDTH_20_NOHT;
-         struct ieee80211_bss_conf *vif_conf;
--        struct ieee80211_link_sta *link_sta;
-
-         link_sta = rcu_dereference(sta->link[link_id]);
-
-@@ -2659,7 +2659,7 @@ static int mac80211_hwsim_sta_add(struct
-
-     hwsim_check_magic(vif);
-     hwsim_set_sta_magic(sta);
--    mac80211_hwsim_sta_rc_update(hw, vif, sta, 0);
-+    mac80211_hwsim_sta_rc_update(hw, vif, &sta->deflink, 0);
-
-     if (sta->valid_links) {
-         WARN(hweight16(sta->valid_links) > 1,
-@@ -3961,7 +3961,7 @@ out:
-     .link_info_changed = mac80211_hwsim_link_info_changed,  \
-     .tx_last_beacon = mac80211_hwsim_tx_last_beacon,    \
-     .sta_notify = mac80211_hwsim_sta_notify,        \
--    .sta_rc_update = mac80211_hwsim_sta_rc_update,        \
-+    .link_sta_rc_update = mac80211_hwsim_sta_rc_update,    \
-     .conf_tx = mac80211_hwsim_conf_tx,            \
-     .get_survey = mac80211_hwsim_get_survey,        \
-     CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd)    \
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -4075,8 +4075,8 @@ struct ieee80211_prep_tx_info {
-  *    in @sta_state.
-  *    The callback can sleep.
-  *
-- * @sta_rc_update: Notifies the driver of changes to the bitrates that 
can be
-- *    used to transmit to the station. The changes are advertised with 
bits
-+ * @link_sta_rc_update: Notifies the driver of changes to the bitrates 
that can
-+ *    be used to transmit to the station. The changes are advertised 
with bits
-  *    from &enum ieee80211_rate_control_changed and the values are 
reflected
-  *    in the station data. This callback should only be used when the 
driver
-  *    uses hardware rate control (%IEEE80211_HW_HAS_RATE_CONTROL) since
-@@ -4560,10 +4560,10 @@ struct ieee80211_ops {
-     void (*sta_pre_rcu_remove)(struct ieee80211_hw *hw,
-                    struct ieee80211_vif *vif,
-                    struct ieee80211_sta *sta);
--    void (*sta_rc_update)(struct ieee80211_hw *hw,
--                  struct ieee80211_vif *vif,
--                  struct ieee80211_sta *sta,
--                  u32 changed);
-+    void (*link_sta_rc_update)(struct ieee80211_hw *hw,
-+                   struct ieee80211_vif *vif,
-+                   struct ieee80211_link_sta *link_sta,
-+                   u32 changed);
-     void (*sta_rate_tbl_update)(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif,
-                     struct ieee80211_sta *sta);
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -467,7 +467,7 @@ static void ieee80211_chan_bw_change(str
-                 continue;
-
-             link_sta->pub->bandwidth = new_sta_bw;
--            rate_control_rate_update(local, sband, sta, link_id,
-+            rate_control_rate_update(local, sband, link_sta,
-                          IEEE80211_RC_BW_CHANGED);
-         }
-     }
---- a/net/mac80211/driver-ops.c
-+++ b/net/mac80211/driver-ops.c
-@@ -181,9 +181,10 @@ int drv_sta_set_txpwr(struct ieee80211_l
-     return ret;
- }
-
--void drv_sta_rc_update(struct ieee80211_local *local,
--               struct ieee80211_sub_if_data *sdata,
--               struct ieee80211_sta *sta, u32 changed)
-+void drv_link_sta_rc_update(struct ieee80211_local *local,
-+                struct ieee80211_sub_if_data *sdata,
-+                struct ieee80211_link_sta *link_sta,
-+                u32 changed)
- {
-     sdata = get_bss_sdata(sdata);
-     if (!check_sdata_in_driver(sdata))
-@@ -193,10 +194,10 @@ void drv_sta_rc_update(struct ieee80211_
-         (sdata->vif.type != NL80211_IFTYPE_ADHOC &&
-          sdata->vif.type != NL80211_IFTYPE_MESH_POINT));
-
--    trace_drv_sta_rc_update(local, sdata, sta, changed);
--    if (local->ops->sta_rc_update)
--        local->ops->sta_rc_update(&local->hw, &sdata->vif,
--                      sta, changed);
-+    trace_drv_link_sta_rc_update(local, sdata, link_sta, changed);
-+    if (local->ops->link_sta_rc_update)
-+        local->ops->link_sta_rc_update(&local->hw, &sdata->vif,
-+                           link_sta, changed);
-
-     trace_drv_return_void(local);
- }
---- a/net/mac80211/driver-ops.h
-+++ b/net/mac80211/driver-ops.h
-@@ -594,9 +594,9 @@ int drv_sta_set_txpwr(struct ieee80211_l
-               struct ieee80211_sub_if_data *sdata,
-               struct sta_info *sta);
-
--void drv_sta_rc_update(struct ieee80211_local *local,
--               struct ieee80211_sub_if_data *sdata,
--               struct ieee80211_sta *sta, u32 changed);
-+void drv_link_sta_rc_update(struct ieee80211_local *local,
-+                struct ieee80211_sub_if_data *sdata,
-+                struct ieee80211_link_sta *link_sta, u32 changed);
-
- static inline void drv_sta_rate_tbl_update(struct ieee80211_local *local,
-                        struct ieee80211_sub_if_data *sdata,
---- a/net/mac80211/ibss.c
-+++ b/net/mac80211/ibss.c
-@@ -1072,7 +1072,8 @@ static void ieee80211_update_sta_info(st
-         if (sta->sta.deflink.rx_nss != rx_nss)
-             changed |= IEEE80211_RC_NSS_CHANGED;
-
--        drv_sta_rc_update(local, sdata, &sta->sta, changed);
-+        drv_link_sta_rc_update(local, sdata, &sta->sta.deflink,
-+                       changed);
-     }
-
-     rcu_read_unlock();
---- a/net/mac80211/mesh_plink.c
-+++ b/net/mac80211/mesh_plink.c
-@@ -489,7 +489,7 @@ static void mesh_sta_info_init(struct ie
-     if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
-         rate_control_rate_init(sta);
-     else
--        rate_control_rate_update(local, sband, sta, 0, changed);
-+        rate_control_rate_update(local, sband, &sta->deflink, changed);
- out:
-     spin_unlock_bh(&sta->mesh->plink_lock);
- }
---- a/net/mac80211/rate.c
-+++ b/net/mac80211/rate.c
-@@ -93,16 +93,15 @@ void rate_control_tx_status(struct ieee8
-
- void rate_control_rate_update(struct ieee80211_local *local,
-                   struct ieee80211_supported_band *sband,
--                  struct sta_info *sta, unsigned int link_id,
-+                  struct link_sta_info *link_sta,
-                   u32 changed)
- {
-     struct rate_control_ref *ref = local->rate_ctrl;
-+    struct sta_info *sta = link_sta->sta;
-     struct ieee80211_sta *ista = &sta->sta;
-     void *priv_sta = sta->rate_ctrl_priv;
-     struct ieee80211_chanctx_conf *chanctx_conf;
-
--    WARN_ON(link_id != 0);
--
-     if (ref && ref->ops->rate_update) {
-         rcu_read_lock();
-
-@@ -120,7 +119,8 @@ void rate_control_rate_update(struct iee
-     }
-
-     if (sta->uploaded)
--        drv_sta_rc_update(local, sta->sdata, &sta->sta, changed);
-+        drv_link_sta_rc_update(local, sta->sdata, link_sta->pub,
-+                       changed);
- }
-
- int ieee80211_rate_control_register(const struct rate_control_ops *ops)
---- a/net/mac80211/rate.h
-+++ b/net/mac80211/rate.h
-@@ -32,8 +32,7 @@ void rate_control_tx_status(struct ieee8
- void rate_control_rate_init(struct sta_info *sta);
- void rate_control_rate_update(struct ieee80211_local *local,
-                   struct ieee80211_supported_band *sband,
--                  struct sta_info *sta,
--                  unsigned int link_id,
-+                  struct link_sta_info *link_sta,
-                   u32 changed);
-
- static inline void *rate_control_alloc_sta(struct rate_control_ref *ref,
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -3568,7 +3568,7 @@ ieee80211_rx_h_action(struct ieee80211_r
-
-             sband = rx->local->hw.wiphy->bands[status->band];
-
--            rate_control_rate_update(local, sband, rx->sta, 0,
-+            rate_control_rate_update(local, sband, rx->link_sta,
-                          IEEE80211_RC_SMPS_CHANGED);
-             cfg80211_sta_opmode_change_notify(sdata->dev,
-                               rx->sta->addr,
-@@ -3605,7 +3605,7 @@ ieee80211_rx_h_action(struct ieee80211_r
- ieee80211_sta_rx_bw_to_chan_width(rx->link_sta);
-             sta_opmode.changed = STA_OPMODE_MAX_BW_CHANGED;
-
--            rate_control_rate_update(local, sband, rx->sta, 0,
-+            rate_control_rate_update(local, sband, rx->link_sta,
-                          IEEE80211_RC_BW_CHANGED);
-             cfg80211_sta_opmode_change_notify(sdata->dev,
-                               rx->sta->addr,
---- a/net/mac80211/tdls.c
-+++ b/net/mac80211/tdls.c
-@@ -1342,7 +1342,8 @@ static void iee80211_tdls_recalc_chanctx
-             bw = min(bw, ieee80211_sta_cap_rx_bw(&sta->deflink));
-             if (bw != sta->sta.deflink.bandwidth) {
-                 sta->sta.deflink.bandwidth = bw;
--                rate_control_rate_update(local, sband, sta, 0,
-+                rate_control_rate_update(local, sband,
-+                             &sta->deflink,
-                              IEEE80211_RC_BW_CHANGED);
-                 /*
-                  * if a TDLS peer BW was updated, we need to
---- a/net/mac80211/trace.h
-+++ b/net/mac80211/trace.h
-@@ -945,31 +945,34 @@ TRACE_EVENT(drv_sta_set_txpwr,
-     )
- );
-
--TRACE_EVENT(drv_sta_rc_update,
-+TRACE_EVENT(drv_link_sta_rc_update,
-     TP_PROTO(struct ieee80211_local *local,
-          struct ieee80211_sub_if_data *sdata,
--         struct ieee80211_sta *sta,
-+         struct ieee80211_link_sta *link_sta,
-          u32 changed),
-
--    TP_ARGS(local, sdata, sta, changed),
-+    TP_ARGS(local, sdata, link_sta, changed),
-
-     TP_STRUCT__entry(
-         LOCAL_ENTRY
-         VIF_ENTRY
-         STA_ENTRY
-         __field(u32, changed)
-+        __field(u32, link_id)
-     ),
-
-     TP_fast_assign(
-         LOCAL_ASSIGN;
-         VIF_ASSIGN;
--        STA_ASSIGN;
-+        STA_NAMED_ASSIGN(link_sta->sta);
-         __entry->changed = changed;
-+        __entry->link_id = link_sta->link_id;
-     ),
-
-     TP_printk(
--        LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " changed: 0x%x",
--        LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->changed
-+        LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " (link %d) changed: 0x%x",
-+        LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->link_id,
-+        __entry->changed
-     )
- );
-
---- a/net/mac80211/vht.c
-+++ b/net/mac80211/vht.c
-@@ -766,8 +766,7 @@ void ieee80211_vht_handle_opmode(struct
-
-     if (changed > 0) {
-         ieee80211_recalc_min_chandef(sdata, link_sta->link_id);
--        rate_control_rate_update(local, sband, link_sta->sta,
--                     link_sta->link_id, changed);
-+        rate_control_rate_update(local, sband, link_sta, changed);
-     }
- }
-
diff --git 
a/package/kernel/mac80211/patches/subsys/330-wifi-cfg80211-add-option-for-vif-allowed-radios.patch 
b/package/kernel/mac80211/patches/subsys/330-wifi-cfg80211-add-option-for-vif-allowed-radios.patch
deleted file mode 100644
index 3b09c46f28a554..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/330-wifi-cfg80211-add-option-for-vif-allowed-radios.patch
+++ /dev/null
@@ -1,309 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 17 Jul 2024 15:43:52 +0200
-Subject: [PATCH] wifi: cfg80211: add option for vif allowed radios
-
-This allows users to prevent a vif from affecting radios other than the
-configured ones. This can be useful in cases where e.g. an AP is running
-on one radio, and triggering a scan on another radio should not disturb it.
-
-Changing the allowed radios list for a vif is supported, but only while
-it is down.
-
-While it is possible to achieve the same by always explicitly specifying
-a frequency list for scan requests and ensuring that the wrong channel/band
-is never accidentally set on an unrelated interface, this change makes
-multi-radio wiphy setups a lot easier to deal with for CLI users.
-
-By itself, this patch only enforces the radio mask for scanning requests
-and remain-on-channel. Follow-up changes build on this to limit configured
-frequencies.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -6271,6 +6271,7 @@ enum ieee80211_ap_reg_power {
-  *    entered.
-  * @links.cac_time_ms: CAC time in ms
-  * @valid_links: bitmap describing what elements of @links are valid
-+ * @radio_mask: Bitmask of radios that this interface is allowed to 
operate on.
-  */
- struct wireless_dev {
-     struct wiphy *wiphy;
-@@ -6383,6 +6384,8 @@ struct wireless_dev {
-         unsigned int cac_time_ms;
-     } links[IEEE80211_MLD_MAX_NUM_LINKS];
-     u16 valid_links;
-+
-+    u32 radio_mask;
- };
-
- static inline const u8 *wdev_address(struct wireless_dev *wdev)
-@@ -6569,6 +6572,17 @@ bool cfg80211_radio_chandef_valid(const
-                   const struct cfg80211_chan_def *chandef);
-
- /**
-+ * cfg80211_wdev_channel_allowed - Check if the wdev may use the channel
-+ *
-+ * @wdev: the wireless device
-+ * @chan: channel to check
-+ *
-+ * Return: whether or not the wdev may use the channel
-+ */
-+bool cfg80211_wdev_channel_allowed(struct wireless_dev *wdev,
-+                   struct ieee80211_channel *chan);
-+
-+/**
-  * ieee80211_get_response_rate - get basic rate for a given rate
-  *
-  * @sband: the band to look for rates in
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -2868,6 +2868,9 @@ enum nl80211_commands {
-  *    nested item, it contains attributes defined in
-  *    &enum nl80211_if_combination_attrs.
-  *
-+ * @NL80211_ATTR_VIF_RADIO_MASK: Bitmask of allowed radios (u32).
-+ *    A value of 0 means all radios.
-+ *
-  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
-  * @NL80211_ATTR_MAX: highest attribute number currently defined
-  * @__NL80211_ATTR_AFTER_LAST: internal use
-@@ -3416,6 +3419,8 @@ enum nl80211_attrs {
-     NL80211_ATTR_WIPHY_RADIOS,
-     NL80211_ATTR_WIPHY_INTERFACE_COMBINATIONS,
-
-+    NL80211_ATTR_VIF_RADIO_MASK,
-+
-     /* add attributes here, update the policy in nl80211.c */
-
-     __NL80211_ATTR_AFTER_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -829,6 +829,7 @@ static const struct nla_policy nl80211_p
-     [NL80211_ATTR_MLO_TTLM_DLINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8),
-     [NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8),
-     [NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG },
-+    [NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 },
- };
-
- /* policy for the key attributes */
-@@ -3996,7 +3997,8 @@ static int nl80211_send_iface(struct sk_
-         nla_put_u32(msg, NL80211_ATTR_GENERATION,
-             rdev->devlist_generation ^
-             (cfg80211_rdev_list_generation << 2)) ||
--        nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr))
-+        nla_put_u8(msg, NL80211_ATTR_4ADDR, wdev->use_4addr) ||
-+        nla_put_u32(msg, NL80211_ATTR_VIF_RADIO_MASK, wdev->radio_mask))
-         goto nla_put_failure;
-
-     if (rdev->ops->get_channel && !wdev->valid_links) {
-@@ -4312,6 +4314,29 @@ static int nl80211_valid_4addr(struct cf
-     return -EOPNOTSUPP;
- }
-
-+static int nl80211_parse_vif_radio_mask(struct genl_info *info,
-+                    u32 *radio_mask)
-+{
-+    struct cfg80211_registered_device *rdev = info->user_ptr[0];
-+    struct nlattr *attr = info->attrs[NL80211_ATTR_VIF_RADIO_MASK];
-+    u32 mask, allowed;
-+
-+    if (!attr) {
-+        *radio_mask = 0;
-+        return 0;
-+    }
-+
-+    allowed = BIT(rdev->wiphy.n_radio) - 1;
-+    mask = nla_get_u32(attr);
-+    if (mask & ~allowed)
-+        return -EINVAL;
-+    if (!mask)
-+        mask = allowed;
-+    *radio_mask = mask;
-+
-+    return 1;
-+}
-+
- static int nl80211_set_interface(struct sk_buff *skb, struct genl_info 
*info)
- {
-     struct cfg80211_registered_device *rdev = info->user_ptr[0];
-@@ -4319,6 +4344,8 @@ static int nl80211_set_interface(struct
-     int err;
-     enum nl80211_iftype otype, ntype;
-     struct net_device *dev = info->user_ptr[1];
-+    struct wireless_dev *wdev = dev->ieee80211_ptr;
-+    u32 radio_mask = 0;
-     bool change = false;
-
-     memset(&params, 0, sizeof(params));
-@@ -4332,8 +4359,6 @@ static int nl80211_set_interface(struct
-     }
-
-     if (info->attrs[NL80211_ATTR_MESH_ID]) {
--        struct wireless_dev *wdev = dev->ieee80211_ptr;
--
-         if (ntype != NL80211_IFTYPE_MESH_POINT)
-             return -EINVAL;
-         if (otype != NL80211_IFTYPE_MESH_POINT)
-@@ -4364,6 +4389,12 @@ static int nl80211_set_interface(struct
-     if (err > 0)
-         change = true;
-
-+    err = nl80211_parse_vif_radio_mask(info, &radio_mask);
-+    if (err < 0)
-+        return err;
-+    if (err && netif_running(dev))
-+        return -EBUSY;
-+
-     if (change)
-         err = cfg80211_change_iface(rdev, dev, ntype, &params);
-     else
-@@ -4372,11 +4403,11 @@ static int nl80211_set_interface(struct
-     if (!err && params.use_4addr != -1)
-         dev->ieee80211_ptr->use_4addr = params.use_4addr;
-
--    if (change && !err) {
--        struct wireless_dev *wdev = dev->ieee80211_ptr;
-+    if (radio_mask)
-+        wdev->radio_mask = radio_mask;
-
-+    if (change && !err)
-         nl80211_notify_iface(rdev, wdev, NL80211_CMD_SET_INTERFACE);
--    }
-
-     return err;
- }
-@@ -4387,6 +4418,7 @@ static int _nl80211_new_interface(struct
-     struct vif_params params;
-     struct wireless_dev *wdev;
-     struct sk_buff *msg;
-+    u32 radio_mask;
-     int err;
-     enum nl80211_iftype type = NL80211_IFTYPE_UNSPECIFIED;
-
-@@ -4424,6 +4456,10 @@ static int _nl80211_new_interface(struct
-     if (err < 0)
-         return err;
-
-+    err = nl80211_parse_vif_radio_mask(info, &radio_mask);
-+    if (err < 0)
-+        return err;
-+
-     msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
-     if (!msg)
-         return -ENOMEM;
-@@ -4465,6 +4501,9 @@ static int _nl80211_new_interface(struct
-         break;
-     }
-
-+    if (radio_mask)
-+        wdev->radio_mask = radio_mask;
-+
-     if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
-                    rdev, wdev, NL80211_CMD_NEW_INTERFACE) < 0) {
-         nlmsg_free(msg);
-@@ -9180,6 +9219,9 @@ static bool cfg80211_off_channel_oper_al
-
-     lockdep_assert_wiphy(wdev->wiphy);
-
-+    if (!cfg80211_wdev_channel_allowed(wdev, chan))
-+        return false;
-+
-     if (!cfg80211_beaconing_iface_active(wdev))
-         return true;
-
-@@ -9392,7 +9434,8 @@ static int nl80211_trigger_scan(struct s
-             }
-
-             /* ignore disabled channels */
--            if (chan->flags & IEEE80211_CHAN_DISABLED)
-+            if (chan->flags & IEEE80211_CHAN_DISABLED ||
-+                !cfg80211_wdev_channel_allowed(wdev, chan))
-                 continue;
-
-             request->channels[i] = chan;
-@@ -9412,7 +9455,8 @@ static int nl80211_trigger_scan(struct s
-
-                 chan = &wiphy->bands[band]->channels[j];
-
--                if (chan->flags & IEEE80211_CHAN_DISABLED)
-+                if (chan->flags & IEEE80211_CHAN_DISABLED ||
-+                    !cfg80211_wdev_channel_allowed(wdev, chan))
-                     continue;
-
-                 request->channels[i] = chan;
---- a/net/wireless/scan.c
-+++ b/net/wireless/scan.c
-@@ -956,7 +956,8 @@ static int cfg80211_scan_6ghz(struct cfg
-         struct ieee80211_channel *chan =
-             ieee80211_get_channel(&rdev->wiphy, ap->center_freq);
-
--        if (!chan || chan->flags & IEEE80211_CHAN_DISABLED)
-+        if (!chan || chan->flags & IEEE80211_CHAN_DISABLED ||
-+            !cfg80211_wdev_channel_allowed(rdev_req->wdev, chan))
-             continue;
-
-         for (i = 0; i < rdev_req->n_channels; i++) {
-@@ -3519,9 +3520,12 @@ int cfg80211_wext_siwscan(struct net_dev
-             continue;
-
-         for (j = 0; j < wiphy->bands[band]->n_channels; j++) {
-+            struct ieee80211_channel *chan;
-+
-             /* ignore disabled channels */
--            if (wiphy->bands[band]->channels[j].flags &
--                        IEEE80211_CHAN_DISABLED)
-+            chan = &wiphy->bands[band]->channels[j];
-+            if (chan->flags & IEEE80211_CHAN_DISABLED ||
-+                !cfg80211_wdev_channel_allowed(creq->wdev, chan))
-                 continue;
-
-             /* If we have a wireless request structure and the
---- a/net/wireless/util.c
-+++ b/net/wireless/util.c
-@@ -2923,3 +2923,32 @@ bool cfg80211_radio_chandef_valid(const
-     return true;
- }
- EXPORT_SYMBOL(cfg80211_radio_chandef_valid);
-+
-+bool cfg80211_wdev_channel_allowed(struct wireless_dev *wdev,
-+                   struct ieee80211_channel *chan)
-+{
-+    struct wiphy *wiphy = wdev->wiphy;
-+    const struct wiphy_radio *radio;
-+    struct cfg80211_chan_def chandef;
-+    u32 radio_mask;
-+    int i;
-+
-+    radio_mask = wdev->radio_mask;
-+    if (!wiphy->n_radio || radio_mask == BIT(wiphy->n_radio) - 1)
-+        return true;
-+
-+    cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20);
-+    for (i = 0; i < wiphy->n_radio; i++) {
-+        if (!(radio_mask & BIT(i)))
-+            continue;
-+
-+        radio = &wiphy->radio[i];
-+        if (!cfg80211_radio_chandef_valid(radio, &chandef))
-+            continue;
-+
-+        return true;
-+    }
-+
-+    return false;
-+}
-+EXPORT_SYMBOL(cfg80211_wdev_channel_allowed);
---- a/net/wireless/core.c
-+++ b/net/wireless/core.c
-@@ -1424,6 +1424,8 @@ void cfg80211_init_wdev(struct wireless_
-     /* allow mac80211 to determine the timeout */
-     wdev->ps_timeout = -1;
-
-+    wdev->radio_mask = BIT(wdev->wiphy->n_radio) - 1;
-+
-     if ((wdev->iftype == NL80211_IFTYPE_STATION ||
-          wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
-          wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
diff --git 
a/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-use-vif-radio-mask-to-limit-ibss-scan-.patch 
b/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-use-vif-radio-mask-to-limit-ibss-scan-.patch
deleted file mode 100644
index 779857fe88ac1d..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/331-wifi-mac80211-use-vif-radio-mask-to-limit-ibss-scan-.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Thu, 26 Sep 2024 14:06:11 +0200
-Subject: [PATCH] wifi: mac80211: use vif radio mask to limit ibss scan
- frequencies
-
-Reject frequencies not supported by any radio that the vif is allowed 
to use.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/scan.c
-+++ b/net/mac80211/scan.c
-@@ -1176,14 +1176,14 @@ int ieee80211_request_ibss_scan(struct i
-                 unsigned int n_channels)
- {
-     struct ieee80211_local *local = sdata->local;
--    int ret = -EBUSY, i, n_ch = 0;
-+    int i, n_ch = 0;
-     enum nl80211_band band;
-
-     lockdep_assert_wiphy(local->hw.wiphy);
-
-     /* busy scanning */
-     if (local->scan_req)
--        goto unlock;
-+        return -EBUSY;
-
-     /* fill internal scan request */
-     if (!channels) {
-@@ -1200,7 +1200,9 @@ int ieee80211_request_ibss_scan(struct i
- &local->hw.wiphy->bands[band]->channels[i];
-
-                 if (tmp_ch->flags & (IEEE80211_CHAN_NO_IR |
--                             IEEE80211_CHAN_DISABLED))
-+                             IEEE80211_CHAN_DISABLED) ||
-+ !cfg80211_wdev_channel_allowed(&sdata->wdev,
-+                                   tmp_ch))
-                     continue;
-
-                 local->int_scan_req->channels[n_ch] = tmp_ch;
-@@ -1209,21 +1211,23 @@ int ieee80211_request_ibss_scan(struct i
-         }
-
-         if (WARN_ON_ONCE(n_ch == 0))
--            goto unlock;
-+            return -EINVAL;
-
-         local->int_scan_req->n_channels = n_ch;
-     } else {
-         for (i = 0; i < n_channels; i++) {
-             if (channels[i]->flags & (IEEE80211_CHAN_NO_IR |
--                          IEEE80211_CHAN_DISABLED))
-+                          IEEE80211_CHAN_DISABLED) ||
-+ !cfg80211_wdev_channel_allowed(&sdata->wdev,
-+                               channels[i]))
-                 continue;
-
-             local->int_scan_req->channels[n_ch] = channels[i];
-             n_ch++;
-         }
-
--        if (WARN_ON_ONCE(n_ch == 0))
--            goto unlock;
-+        if (n_ch == 0)
-+            return -EINVAL;
-
-         local->int_scan_req->n_channels = n_ch;
-     }
-@@ -1233,9 +1237,7 @@ int ieee80211_request_ibss_scan(struct i
-     memcpy(local->int_scan_req->ssids[0].ssid, ssid, 
IEEE80211_MAX_SSID_LEN);
-     local->int_scan_req->ssids[0].ssid_len = ssid_len;
-
--    ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
-- unlock:
--    return ret;
-+    return __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
- }
-
- void ieee80211_scan_cancel(struct ieee80211_local *local)
diff --git 
a/package/kernel/mac80211/patches/subsys/332-wifi-mac80211-use-vif-radio-mask-to-limit-chanctx-an.patch 
b/package/kernel/mac80211/patches/subsys/332-wifi-mac80211-use-vif-radio-mask-to-limit-chanctx-an.patch
deleted file mode 100644
index 0c8c894eaaaf8d..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/332-wifi-mac80211-use-vif-radio-mask-to-limit-chanctx-an.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Thu, 26 Sep 2024 14:07:50 +0200
-Subject: [PATCH] wifi: mac80211: use vif radio mask to limit creating 
chanctx
-
-Reject frequencies not supported by any radio that the vif is allowed 
to use.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -1169,7 +1169,7 @@ ieee80211_replace_chanctx(struct ieee802
- static bool
- ieee80211_find_available_radio(struct ieee80211_local *local,
-                    const struct ieee80211_chan_req *chanreq,
--                   int *radio_idx)
-+                   u32 radio_mask, int *radio_idx)
- {
-     struct wiphy *wiphy = local->hw.wiphy;
-     const struct wiphy_radio *radio;
-@@ -1180,6 +1180,9 @@ ieee80211_find_available_radio(struct ie
-         return true;
-
-     for (i = 0; i < wiphy->n_radio; i++) {
-+        if (!(radio_mask & BIT(i)))
-+            continue;
-+
-         radio = &wiphy->radio[i];
-         if (!cfg80211_radio_chandef_valid(radio, &chanreq->oper))
-             continue;
-@@ -1213,7 +1216,9 @@ int ieee80211_link_reserve_chanctx(struc
-     new_ctx = ieee80211_find_reservation_chanctx(local, chanreq, mode);
-     if (!new_ctx) {
-         if (ieee80211_can_create_new_chanctx(local, -1) &&
--            ieee80211_find_available_radio(local, chanreq, &radio_idx))
-+            ieee80211_find_available_radio(local, chanreq,
-+                           sdata->wdev.radio_mask,
-+                           &radio_idx))
-             new_ctx = ieee80211_new_chanctx(local, chanreq, mode,
-                             false, radio_idx);
-         else
-@@ -1883,7 +1888,9 @@ int _ieee80211_link_use_channel(struct i
-     /* Note: context is now reserved */
-     if (ctx)
-         reserved = true;
--    else if (!ieee80211_find_available_radio(local, chanreq, &radio_idx))
-+    else if (!ieee80211_find_available_radio(local, chanreq,
-+                         sdata->wdev.radio_mask,
-+                         &radio_idx))
-         ctx = ERR_PTR(-EBUSY);
-     else
-         ctx = ieee80211_new_chanctx(local, chanreq, mode,
diff --git 
a/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-remove-status-ampdu_delimiter_crc.patch 
b/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-remove-status-ampdu_delimiter_crc.patch
deleted file mode 100644
index c0cdcdd6bc195a..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/333-wifi-mac80211-remove-status-ampdu_delimiter_crc.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 17 Jul 2024 22:49:16 +0200
-Subject: [PATCH] wifi: mac80211: remove status->ampdu_delimiter_crc
-
-This was never used by any driver, so remove it to free up some space.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1448,8 +1448,6 @@ ieee80211_tx_info_clear_status(struct ie
-  * @RX_FLAG_AMPDU_IS_LAST: this subframe is the last subframe of the 
A-MPDU
-  * @RX_FLAG_AMPDU_DELIM_CRC_ERROR: A delimiter CRC error has been detected
-  *    on this subframe
-- * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known 
(the CRC
-- *    is stored in the @ampdu_delimiter_crc field)
-  * @RX_FLAG_MIC_STRIPPED: The mic was stripped of this packet. 
Decryption was
-  *    done by the hardware
-  * @RX_FLAG_ONLY_MONITOR: Report frame only to monitor interfaces without
-@@ -1521,7 +1519,7 @@ enum mac80211_rx_flags {
-     RX_FLAG_AMPDU_LAST_KNOWN    = BIT(12),
-     RX_FLAG_AMPDU_IS_LAST        = BIT(13),
-     RX_FLAG_AMPDU_DELIM_CRC_ERROR    = BIT(14),
--    RX_FLAG_AMPDU_DELIM_CRC_KNOWN    = BIT(15),
-+    /* one free bit at 15 */
-     RX_FLAG_MACTIME            = BIT(16) | BIT(17),
-     RX_FLAG_MACTIME_PLCP_START    = 1 << 16,
-     RX_FLAG_MACTIME_START        = 2 << 16,
-@@ -1618,7 +1616,6 @@ enum mac80211_rx_encoding {
-  * @rx_flags: internal RX flags for mac80211
-  * @ampdu_reference: A-MPDU reference number, must be a different 
value for
-  *    each A-MPDU but the same for each subframe within one A-MPDU
-- * @ampdu_delimiter_crc: A-MPDU delimiter CRC
-  * @zero_length_psdu_type: radiotap type of the 0-length PSDU
-  * @link_valid: if the link which is identified by @link_id is valid. 
This flag
-  *    is set only when connection is MLO.
-@@ -1656,7 +1653,6 @@ struct ieee80211_rx_status {
-     s8 signal;
-     u8 chains;
-     s8 chain_signal[IEEE80211_MAX_CHAINS];
--    u8 ampdu_delimiter_crc;
-     u8 zero_length_psdu_type;
-     u8 link_valid:1, link_id:4;
- };
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -508,18 +508,13 @@ ieee80211_add_rx_radiotap_header(struct
-             flags |= IEEE80211_RADIOTAP_AMPDU_IS_LAST;
-         if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_ERROR)
-             flags |= IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR;
--        if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN)
--            flags |= IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN;
-         if (status->flag & RX_FLAG_AMPDU_EOF_BIT_KNOWN)
-             flags |= IEEE80211_RADIOTAP_AMPDU_EOF_KNOWN;
-         if (status->flag & RX_FLAG_AMPDU_EOF_BIT)
-             flags |= IEEE80211_RADIOTAP_AMPDU_EOF;
-         put_unaligned_le16(flags, pos);
-         pos += 2;
--        if (status->flag & RX_FLAG_AMPDU_DELIM_CRC_KNOWN)
--            *pos++ = status->ampdu_delimiter_crc;
--        else
--            *pos++ = 0;
-+        *pos++ = 0;
-         *pos++ = 0;
-     }
-
diff --git 
a/package/kernel/mac80211/patches/subsys/334-wifi-cfg80211-pass-net_device-to-.set_monitor_channel.patch 
b/package/kernel/mac80211/patches/subsys/334-wifi-cfg80211-pass-net_device-to-.set_monitor_channel.patch
deleted file mode 100644
index 626f2facaf5d51..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/334-wifi-cfg80211-pass-net_device-to-.set_monitor_channel.patch
+++ /dev/null
@@ -1,165 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Thu, 26 Sep 2024 19:52:30 +0200
-Subject: [PATCH] wifi: cfg80211: pass net_device to .set_monitor_channel
-
-Preparation for allowing multiple monitor interfaces with different 
channels
-on a multi-radio wiphy.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/drivers/net/wireless/ath/wil6210/cfg80211.c
-+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
-@@ -1493,6 +1493,7 @@ out:
- }
-
- static int wil_cfg80211_set_channel(struct wiphy *wiphy,
-+                    struct net_device *dev,
-                     struct cfg80211_chan_def *chandef)
- {
-     struct wil6210_priv *wil = wiphy_to_wil(wiphy);
---- a/drivers/net/wireless/marvell/libertas/cfg.c
-+++ b/drivers/net/wireless/marvell/libertas/cfg.c
-@@ -486,6 +486,7 @@ static int lbs_add_wps_enrollee_tlv(u8 *
-  */
-
- static int lbs_cfg_set_monitor_channel(struct wiphy *wiphy,
-+                       struct net_device *dev,
-                        struct cfg80211_chan_def *chandef)
- {
-     struct lbs_private *priv = wiphy_priv(wiphy);
---- a/drivers/net/wireless/microchip/wilc1000/cfg80211.c
-+++ b/drivers/net/wireless/microchip/wilc1000/cfg80211.c
-@@ -231,6 +231,7 @@ struct wilc_vif *wilc_get_wl_to_vif(stru
- }
-
- static int set_channel(struct wiphy *wiphy,
-+               struct net_device *dev,
-                struct cfg80211_chan_def *chandef)
- {
-     struct wilc *wl = wiphy_priv(wiphy);
-@@ -1424,7 +1425,7 @@ static int start_ap(struct wiphy *wiphy,
-     struct wilc_vif *vif = netdev_priv(dev);
-     int ret;
-
--    ret = set_channel(wiphy, &settings->chandef);
-+    ret = set_channel(wiphy, dev, &settings->chandef);
-     if (ret != 0)
-         netdev_err(dev, "Error in setting channel\n");
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -4700,6 +4700,7 @@ struct cfg80211_ops {
-                          struct ieee80211_channel *chan);
-
-     int    (*set_monitor_channel)(struct wiphy *wiphy,
-+                       struct net_device *dev,
-                        struct cfg80211_chan_def *chandef);
-
-     int    (*scan)(struct wiphy *wiphy,
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -879,6 +879,7 @@ static int ieee80211_get_station(struct
- }
-
- static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
-+                     struct net_device *dev,
-                      struct cfg80211_chan_def *chandef)
- {
-     struct ieee80211_local *local = wiphy_priv(wiphy);
---- a/net/wireless/chan.c
-+++ b/net/wireless/chan.c
-@@ -1673,6 +1673,7 @@ bool cfg80211_reg_check_beaconing(struct
- EXPORT_SYMBOL(cfg80211_reg_check_beaconing);
-
- int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
-+                 struct net_device *dev,
-                  struct cfg80211_chan_def *chandef)
- {
-     if (!rdev->ops->set_monitor_channel)
-@@ -1680,7 +1681,7 @@ int cfg80211_set_monitor_channel(struct
-     if (!cfg80211_has_monitors_only(rdev))
-         return -EBUSY;
-
--    return rdev_set_monitor_channel(rdev, chandef);
-+    return rdev_set_monitor_channel(rdev, dev, chandef);
- }
-
- bool cfg80211_any_usable_channels(struct wiphy *wiphy,
---- a/net/wireless/core.h
-+++ b/net/wireless/core.h
-@@ -518,6 +518,7 @@ static inline unsigned int elapsed_jiffi
- }
-
- int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
-+                 struct net_device *dev,
-                  struct cfg80211_chan_def *chandef);
-
- int ieee80211_get_ratemask(struct ieee80211_supported_band *sband,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -3562,7 +3562,7 @@ static int __nl80211_set_channel(struct
-     case NL80211_IFTYPE_MESH_POINT:
-         return cfg80211_set_mesh_channel(rdev, wdev, &chandef);
-     case NL80211_IFTYPE_MONITOR:
--        return cfg80211_set_monitor_channel(rdev, &chandef);
-+        return cfg80211_set_monitor_channel(rdev, dev, &chandef);
-     default:
-         break;
-     }
---- a/net/wireless/rdev-ops.h
-+++ b/net/wireless/rdev-ops.h
-@@ -445,11 +445,12 @@ rdev_libertas_set_mesh_channel(struct cf
-
- static inline int
- rdev_set_monitor_channel(struct cfg80211_registered_device *rdev,
-+             struct net_device *dev,
-              struct cfg80211_chan_def *chandef)
- {
-     int ret;
--    trace_rdev_set_monitor_channel(&rdev->wiphy, chandef);
--    ret = rdev->ops->set_monitor_channel(&rdev->wiphy, chandef);
-+    trace_rdev_set_monitor_channel(&rdev->wiphy, dev, chandef);
-+    ret = rdev->ops->set_monitor_channel(&rdev->wiphy, dev, chandef);
-     trace_rdev_return_int(&rdev->wiphy, ret);
-     return ret;
- }
---- a/net/wireless/trace.h
-+++ b/net/wireless/trace.h
-@@ -1322,19 +1322,21 @@ TRACE_EVENT(rdev_libertas_set_mesh_chann
- );
-
- TRACE_EVENT(rdev_set_monitor_channel,
--    TP_PROTO(struct wiphy *wiphy,
-+    TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
-          struct cfg80211_chan_def *chandef),
--    TP_ARGS(wiphy, chandef),
-+    TP_ARGS(wiphy, netdev, chandef),
-     TP_STRUCT__entry(
-         WIPHY_ENTRY
-+        NETDEV_ENTRY
-         CHAN_DEF_ENTRY
-     ),
-     TP_fast_assign(
-         WIPHY_ASSIGN;
-+        NETDEV_ASSIGN;
-         CHAN_DEF_ASSIGN(chandef);
-     ),
--    TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT,
--          WIPHY_PR_ARG, CHAN_DEF_PR_ARG)
-+    TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT,
-+          WIPHY_PR_ARG, NETDEV_PR_ARG, CHAN_DEF_PR_ARG)
- );
-
- TRACE_EVENT(rdev_auth,
---- a/net/wireless/wext-compat.c
-+++ b/net/wireless/wext-compat.c
-@@ -830,7 +830,7 @@ static int cfg80211_wext_siwfreq(struct
-             ret = -EINVAL;
-             break;
-         }
--        ret = cfg80211_set_monitor_channel(rdev, &chandef);
-+        ret = cfg80211_set_monitor_channel(rdev, dev, &chandef);
-         break;
-     case NL80211_IFTYPE_MESH_POINT:
-         freq = cfg80211_wext_freq(wextfreq);
diff --git 
a/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-flag-to-opt-out-of-virtual-monitor.patch 
b/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-flag-to-opt-out-of-virtual-monitor.patch
deleted file mode 100644
index 604abfd43fc74d..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/335-wifi-mac80211-add-flag-to-opt-out-of-virtual-monitor.patch
+++ /dev/null
@@ -1,337 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Mon, 30 Sep 2024 15:09:45 +0200
-Subject: [PATCH] wifi: mac80211: add flag to opt out of virtual monitor
- support
-
-This is useful for multi-radio devices that are capable of monitoring on
-multiple channels simultanenously. When this flag is set, each monitor
-interface is passed to the driver individually and can have a configured
-channel.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -2679,6 +2679,11 @@ struct ieee80211_txq {
-  *    a virtual monitor interface when monitor interfaces are the only
-  *    active interfaces.
-  *
-+ * @IEEE80211_HW_NO_VIRTUAL_MONITOR: The driver would like to be informed
-+ *    of any monitor interface, as well as their configured channel.
-+ *    This is useful for supporting multiple monitor interfaces on 
different
-+ *    channels.
-+ *
-  * @IEEE80211_HW_NO_AUTO_VIF: The driver would like for no wlanX to
-  *    be created.  It is expected user-space will create vifs as
-  *    desired (and thus have them named as desired).
-@@ -2838,6 +2843,7 @@ enum ieee80211_hw_flags {
-     IEEE80211_HW_SUPPORTS_DYNAMIC_PS,
-     IEEE80211_HW_MFP_CAPABLE,
-     IEEE80211_HW_WANT_MONITOR_VIF,
-+    IEEE80211_HW_NO_VIRTUAL_MONITOR,
-     IEEE80211_HW_NO_AUTO_VIF,
-     IEEE80211_HW_SW_CRYPTO_CONTROL,
-     IEEE80211_HW_SUPPORT_FAST_XMIT,
---- a/net/mac80211/cfg.c
-+++ b/net/mac80211/cfg.c
-@@ -105,8 +105,11 @@ static int ieee80211_set_mon_options(str
-     }
-
-     /* also validate MU-MIMO change */
--    monitor_sdata = wiphy_dereference(local->hw.wiphy,
--                      local->monitor_sdata);
-+    if (ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+        monitor_sdata = sdata;
-+    else
-+        monitor_sdata = wiphy_dereference(local->hw.wiphy,
-+                          local->monitor_sdata);
-
-     if (!monitor_sdata &&
-         (params->vht_mumimo_groups || params->vht_mumimo_follow_addr))
-@@ -114,7 +117,9 @@ static int ieee80211_set_mon_options(str
-
-     /* apply all changes now - no failures allowed */
-
--    if (monitor_sdata && ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
-+    if (monitor_sdata &&
-+        (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) ||
-+         ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)))
-         ieee80211_set_mu_mimo_follow(monitor_sdata, params);
-
-     if (params->flags) {
-@@ -889,22 +894,25 @@ static int ieee80211_set_monitor_channel
-
-     lockdep_assert_wiphy(local->hw.wiphy);
-
--    if (cfg80211_chandef_identical(&local->monitor_chanreq.oper,
--                       &chanreq.oper))
--        return 0;
-+    sdata = IEEE80211_DEV_TO_SUB_IF(dev);
-+    if (!ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-+        if (cfg80211_chandef_identical(&local->monitor_chanreq.oper,
-+                           &chanreq.oper))
-+            return 0;
-
--    sdata = wiphy_dereference(local->hw.wiphy,
--                  local->monitor_sdata);
--    if (!sdata)
--        goto done;
-+        sdata = wiphy_dereference(wiphy, local->monitor_sdata);
-+        if (!sdata)
-+            goto done;
-+    }
-
--    if (cfg80211_chandef_identical(&sdata->vif.bss_conf.chanreq.oper,
-+    if (rcu_access_pointer(sdata->deflink.conf->chanctx_conf) &&
-+ cfg80211_chandef_identical(&sdata->vif.bss_conf.chanreq.oper,
-                        &chanreq.oper))
-         return 0;
-
-     ieee80211_link_release_channel(&sdata->deflink);
-     ret = ieee80211_link_use_channel(&sdata->deflink, &chanreq,
--                     IEEE80211_CHANCTX_EXCLUSIVE);
-+                     IEEE80211_CHANCTX_SHARED);
-     if (ret)
-         return ret;
- done:
-@@ -3050,7 +3058,8 @@ static int ieee80211_set_tx_power(struct
-     if (wdev) {
-         sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
-
--        if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
-+        if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-+            !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-             if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF))
-                 return -EOPNOTSUPP;
-
-@@ -3098,7 +3107,8 @@ static int ieee80211_set_tx_power(struct
-     }
-
-     list_for_each_entry(sdata, &local->interfaces, list) {
--        if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
-+        if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-+            !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-             has_monitor = true;
-             continue;
-         }
-@@ -3108,7 +3118,8 @@ static int ieee80211_set_tx_power(struct
-         sdata->vif.bss_conf.txpower_type = txp_type;
-     }
-     list_for_each_entry(sdata, &local->interfaces, list) {
--        if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
-+        if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-+            !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-             continue;
-         ieee80211_recalc_txpower(sdata, update_txp_type);
-     }
-@@ -4303,7 +4314,8 @@ static int ieee80211_cfg_get_channel(str
-     if (chanctx_conf) {
-         *chandef = link->conf->chanreq.oper;
-         ret = 0;
--    } else if (local->open_count > 0 &&
-+    } else if (!ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR) &&
-+           local->open_count > 0 &&
-            local->open_count == local->monitors &&
-            sdata->vif.type == NL80211_IFTYPE_MONITOR) {
-         *chandef = local->monitor_chanreq.oper;
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -339,6 +339,10 @@ ieee80211_get_chanctx_max_required_bw(st
-         case NL80211_IFTYPE_P2P_DEVICE:
-         case NL80211_IFTYPE_NAN:
-             continue;
-+        case NL80211_IFTYPE_MONITOR:
-+            WARN_ON_ONCE(!ieee80211_hw_check(&local->hw,
-+                             NO_VIRTUAL_MONITOR));
-+            fallthrough;
-         case NL80211_IFTYPE_ADHOC:
-         case NL80211_IFTYPE_MESH_POINT:
-         case NL80211_IFTYPE_OCB:
-@@ -347,7 +351,6 @@ ieee80211_get_chanctx_max_required_bw(st
-         case NL80211_IFTYPE_WDS:
-         case NL80211_IFTYPE_UNSPECIFIED:
-         case NUM_NL80211_IFTYPES:
--        case NL80211_IFTYPE_MONITOR:
-         case NL80211_IFTYPE_P2P_CLIENT:
-         case NL80211_IFTYPE_P2P_GO:
-             WARN_ON_ONCE(1);
-@@ -956,6 +959,10 @@ void ieee80211_recalc_smps_chanctx(struc
-             if (!link->sdata->u.mgd.associated)
-                 continue;
-             break;
-+        case NL80211_IFTYPE_MONITOR:
-+            if (!ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+                continue;
-+            break;
-         case NL80211_IFTYPE_AP:
-         case NL80211_IFTYPE_ADHOC:
-         case NL80211_IFTYPE_MESH_POINT:
-@@ -968,6 +975,11 @@ void ieee80211_recalc_smps_chanctx(struc
-         if (rcu_access_pointer(link->conf->chanctx_conf) != 
&chanctx->conf)
-             continue;
-
-+        if (link->sdata->vif.type == NL80211_IFTYPE_MONITOR) {
-+            rx_chains_dynamic = rx_chains_static = local->rx_chains;
-+            break;
-+        }
-+
-         switch (link->smps_mode) {
-         default:
-             WARN_ONCE(1, "Invalid SMPS mode %d\n",
---- a/net/mac80211/debugfs.c
-+++ b/net/mac80211/debugfs.c
-@@ -465,6 +465,7 @@ static const char *hw_flag_names[] = {
-     FLAG(SUPPORTS_DYNAMIC_PS),
-     FLAG(MFP_CAPABLE),
-     FLAG(WANT_MONITOR_VIF),
-+    FLAG(NO_VIRTUAL_MONITOR),
-     FLAG(NO_AUTO_VIF),
-     FLAG(SW_CRYPTO_CONTROL),
-     FLAG(SUPPORT_FAST_XMIT),
---- a/net/mac80211/driver-ops.c
-+++ b/net/mac80211/driver-ops.c
-@@ -65,6 +65,7 @@ int drv_add_interface(struct ieee80211_l
-     if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
-             (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-              !ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) &&
-+             !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR) &&
-              !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))))
-         return -EINVAL;
-
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -279,8 +279,13 @@ static int _ieee80211_change_mac(struct
-     ret = eth_mac_addr(sdata->dev, sa);
-
-     if (ret == 0) {
--        memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN);
--        ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr);
-+        if (check_dup) {
-+            memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN);
-+            ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr);
-+        } else {
-+            memset(sdata->vif.addr, 0, ETH_ALEN);
-+            memset(sdata->vif.bss_conf.addr, 0, ETH_ALEN);
-+        }
-     }
-
-     /* Regardless of eth_mac_addr() return we still want to add the
-@@ -699,9 +704,11 @@ static void ieee80211_do_stop(struct iee
-         ieee80211_recalc_idle(local);
-         ieee80211_recalc_offload(local);
-
--        if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
-+        if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) &&
-+            !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-             break;
-
-+        ieee80211_link_release_channel(&sdata->deflink);
-         fallthrough;
-     default:
-         if (!going_down)
-@@ -1131,7 +1138,8 @@ int ieee80211_add_virtual_monitor(struct
-     ASSERT_RTNL();
-     lockdep_assert_wiphy(local->hw.wiphy);
-
--    if (local->monitor_sdata)
-+    if (local->monitor_sdata ||
-+        ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-         return 0;
-
-     sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL);
-@@ -1193,6 +1201,9 @@ void ieee80211_del_virtual_monitor(struc
- {
-     struct ieee80211_sub_if_data *sdata;
-
-+    if (ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+        return;
-+
-     ASSERT_RTNL();
-     lockdep_assert_wiphy(local->hw.wiphy);
-
-@@ -1328,7 +1339,8 @@ int ieee80211_do_open(struct wireless_de
-             break;
-         }
-
--        if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
-+        if ((sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) ||
-+            ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-             res = drv_add_interface(local, sdata);
-             if (res)
-                 goto err_stop;
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -840,6 +840,9 @@ ieee80211_rx_monitor(struct ieee80211_lo
-         bool last_monitor = list_is_last(&sdata->u.mntr.list,
-                          &local->mon_list);
-
-+        if (ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+            ieee80211_handle_mu_mimo_mon(sdata, origskb, rtap_space);
-+
-         if (!monskb)
-             monskb = ieee80211_make_monitor_skb(local, &origskb,
-                                 rate, rtap_space,
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1763,7 +1763,8 @@ static bool __ieee80211_tx(struct ieee80
-
-     switch (sdata->vif.type) {
-     case NL80211_IFTYPE_MONITOR:
--        if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
-+        if ((sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) ||
-+            ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-             vif = &sdata->vif;
-             break;
-         }
-@@ -3952,7 +3953,8 @@ begin:
-
-     switch (tx.sdata->vif.type) {
-     case NL80211_IFTYPE_MONITOR:
--        if (tx.sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
-+        if ((tx.sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) ||
-+            ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
-             vif = &tx.sdata->vif;
-             break;
-         }
---- a/net/mac80211/util.c
-+++ b/net/mac80211/util.c
-@@ -739,7 +739,8 @@ static void __iterate_interfaces(struct
- lockdep_is_held(&local->hw.wiphy->mtx)) {
-         switch (sdata->vif.type) {
-         case NL80211_IFTYPE_MONITOR:
--            if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
-+            if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) &&
-+                !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-                 continue;
-             break;
-         case NL80211_IFTYPE_AP_VLAN:
-@@ -1856,8 +1857,10 @@ int ieee80211_reconfig(struct ieee80211_
-     }
-
-     list_for_each_entry(sdata, &local->interfaces, list) {
-+        if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-+            !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+            continue;
-         if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
--            sdata->vif.type != NL80211_IFTYPE_MONITOR &&
-             ieee80211_sdata_running(sdata)) {
-             res = drv_add_interface(local, sdata);
-             if (WARN_ON(res))
-@@ -1870,11 +1873,14 @@ int ieee80211_reconfig(struct ieee80211_
-      */
-     if (res) {
-         list_for_each_entry_continue_reverse(sdata, &local->interfaces,
--                             list)
-+                             list) {
-+            if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
-+                !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-+                continue;
-             if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
--                sdata->vif.type != NL80211_IFTYPE_MONITOR &&
-                 ieee80211_sdata_running(sdata))
-                 drv_remove_interface(local, sdata);
-+        }
-         ieee80211_handle_reconfig_failure(local);
-         return res;
-     }
diff --git 
a/package/kernel/mac80211/patches/subsys/336-wifi-cfg80211-add-monitor-SKIP_TX-flag.patch 
b/package/kernel/mac80211/patches/subsys/336-wifi-cfg80211-add-monitor-SKIP_TX-flag.patch
deleted file mode 100644
index dfc01c6c9bc546..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/336-wifi-cfg80211-add-monitor-SKIP_TX-flag.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Mon, 30 Sep 2024 17:04:09 +0200
-Subject: [PATCH] wifi: cfg80211: add monitor SKIP_TX flag
-
-This can be used to indicate that the user is not interested in receiving
-locally sent packets on the monitor interface.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -2272,6 +2272,7 @@ static inline int cfg80211_get_station(s
-  * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
-  * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
-  * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address
-+ * @MONITOR_FLAG_SKIP_TX: do not pass locally transmitted frames
-  */
- enum monitor_flags {
-     MONITOR_FLAG_CHANGED        = BIT(__NL80211_MNTR_FLAG_INVALID),
-@@ -2281,6 +2282,7 @@ enum monitor_flags {
-     MONITOR_FLAG_OTHER_BSS        = BIT(NL80211_MNTR_FLAG_OTHER_BSS),
-     MONITOR_FLAG_COOK_FRAMES    = BIT(NL80211_MNTR_FLAG_COOK_FRAMES),
-     MONITOR_FLAG_ACTIVE        = BIT(NL80211_MNTR_FLAG_ACTIVE),
-+    MONITOR_FLAG_SKIP_TX        = BIT(NL80211_MNTR_FLAG_SKIP_TX),
- };
-
- /**
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -4703,6 +4703,7 @@ enum nl80211_survey_info {
-  *    overrides all other flags.
-  * @NL80211_MNTR_FLAG_ACTIVE: use the configured MAC address
-  *    and ACK incoming unicast packets.
-+ * @NL80211_MNTR_FLAG_SKIP_TX: do not pass local tx packets
-  *
-  * @__NL80211_MNTR_FLAG_AFTER_LAST: internal use
-  * @NL80211_MNTR_FLAG_MAX: highest possible monitor flag
-@@ -4715,6 +4716,7 @@ enum nl80211_mntr_flags {
-     NL80211_MNTR_FLAG_OTHER_BSS,
-     NL80211_MNTR_FLAG_COOK_FRAMES,
-     NL80211_MNTR_FLAG_ACTIVE,
-+    NL80211_MNTR_FLAG_SKIP_TX,
-
-     /* keep last */
-     __NL80211_MNTR_FLAG_AFTER_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -4201,6 +4201,7 @@ static const struct nla_policy mntr_flag
-     [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG },
-     [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG },
-     [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG },
-+    [NL80211_MNTR_FLAG_SKIP_TX] = { .type = NLA_FLAG },
- };
-
- static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags)
diff --git 
a/package/kernel/mac80211/patches/subsys/337-wifi-mac80211-add-support-for-the-monitor-SKIP_TX-fl.patch 
b/package/kernel/mac80211/patches/subsys/337-wifi-mac80211-add-support-for-the-monitor-SKIP_TX-fl.patch
deleted file mode 100644
index d9e484eebaaf83..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/337-wifi-mac80211-add-support-for-the-monitor-SKIP_TX-fl.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Mon, 30 Sep 2024 17:05:18 +0200
-Subject: [PATCH] wifi: mac80211: add support for the monitor SKIP_TX flag
-
-Do not pass locally sent packets to monitor interfaces with this flag set.
-Skip processing tx packets on the status call entirely if no monitor
-interfaces without this flag are present.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -1373,7 +1373,7 @@ struct ieee80211_local {
-     spinlock_t queue_stop_reason_lock;
-
-     int open_count;
--    int monitors, cooked_mntrs;
-+    int monitors, cooked_mntrs, tx_mntrs;
-     /* number of interfaces with corresponding FIF_ flags */
-     int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll,
-         fif_probe_req;
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -1094,6 +1094,8 @@ void ieee80211_adjust_monitor_flags(stru
-     ADJUST(CONTROL, control);
-     ADJUST(CONTROL, pspoll);
-     ADJUST(OTHER_BSS, other_bss);
-+    if (!(flags & MONITOR_FLAG_SKIP_TX))
-+        local->tx_mntrs += offset;
-
- #undef ADJUST
- }
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -927,6 +927,9 @@ void ieee80211_tx_monitor(struct ieee802
-             if (!ieee80211_sdata_running(sdata))
-                 continue;
-
-+            if (sdata->u.mntr.flags & MONITOR_FLAG_SKIP_TX)
-+                continue;
-+
-             if ((sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) &&
-                 !send_to_cooked)
-                 continue;
-@@ -1099,7 +1102,7 @@ static void __ieee80211_tx_status(struct
-      * This is a bit racy but we can avoid a lot of work
-      * with this test...
-      */
--    if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
-+    if (!local->tx_mntrs && (!send_to_cooked || !local->cooked_mntrs)) {
-         if (status->free_list)
-             list_add_tail(&skb->list, status->free_list);
-         else
diff --git 
a/package/kernel/mac80211/patches/subsys/338-wifi-mac80211-refactor-ieee80211_rx_monitor.patch 
b/package/kernel/mac80211/patches/subsys/338-wifi-mac80211-refactor-ieee80211_rx_monitor.patch
deleted file mode 100644
index cc976060d4c459..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/338-wifi-mac80211-refactor-ieee80211_rx_monitor.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 2 Oct 2024 12:31:22 +0200
-Subject: [PATCH] wifi: mac80211: refactor ieee80211_rx_monitor
-
-Rework the monitor mode interface iteration to get rid of the last_monitor
-condition. Preparation for further filtering received monitor packets.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -762,8 +762,8 @@ ieee80211_rx_monitor(struct ieee80211_lo
-              struct ieee80211_rate *rate)
- {
-     struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(origskb);
--    struct ieee80211_sub_if_data *sdata;
--    struct sk_buff *monskb = NULL;
-+    struct ieee80211_sub_if_data *sdata, *prev_sdata = NULL;
-+    struct sk_buff *skb, *monskb = NULL;
-     int present_fcs_len = 0;
-     unsigned int rtap_space = 0;
-     struct ieee80211_sub_if_data *monitor_sdata =
-@@ -837,8 +837,10 @@ ieee80211_rx_monitor(struct ieee80211_lo
-     ieee80211_handle_mu_mimo_mon(monitor_sdata, origskb, rtap_space);
-
-     list_for_each_entry_rcu(sdata, &local->mon_list, u.mntr.list) {
--        bool last_monitor = list_is_last(&sdata->u.mntr.list,
--                         &local->mon_list);
-+        if (!prev_sdata) {
-+            prev_sdata = sdata;
-+            continue;
-+        }
-
-         if (ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR))
-             ieee80211_handle_mu_mimo_mon(sdata, origskb, rtap_space);
-@@ -846,34 +848,34 @@ ieee80211_rx_monitor(struct ieee80211_lo
-         if (!monskb)
-             monskb = ieee80211_make_monitor_skb(local, &origskb,
-                                 rate, rtap_space,
--                                only_monitor &&
--                                last_monitor);
--
--        if (monskb) {
--            struct sk_buff *skb;
-+                                false);
-+        if (!monskb)
-+            continue;
-
--            if (last_monitor) {
--                skb = monskb;
--                monskb = NULL;
--            } else {
--                skb = skb_clone(monskb, GFP_ATOMIC);
--            }
-+        skb = skb_clone(monskb, GFP_ATOMIC);
-+        if (!skb)
-+            continue;
-+
-+        skb->dev = prev_sdata->dev;
-+        dev_sw_netstats_rx_add(skb->dev, skb->len);
-+        netif_receive_skb(skb);
-+        prev_sdata = sdata;
-+    }
-
--            if (skb) {
--                skb->dev = sdata->dev;
--                dev_sw_netstats_rx_add(skb->dev, skb->len);
--                netif_receive_skb(skb);
--            }
-+    if (prev_sdata) {
-+        if (monskb)
-+            skb = monskb;
-+        else
-+            skb = ieee80211_make_monitor_skb(local, &origskb,
-+                             rate, rtap_space,
-+                             only_monitor);
-+        if (skb) {
-+            skb->dev = prev_sdata->dev;
-+            dev_sw_netstats_rx_add(skb->dev, skb->len);
-+            netif_receive_skb(skb);
-         }
--
--        if (last_monitor)
--            break;
-     }
-
--    /* this happens if last_monitor was erroneously false */
--    dev_kfree_skb(monskb);
--
--    /* ditto */
-     if (!origskb)
-         return NULL;
-
diff --git 
a/package/kernel/mac80211/patches/subsys/339-wifi-mac80211-filter-on-monitor-interfaces-based-on-.patch 
b/package/kernel/mac80211/patches/subsys/339-wifi-mac80211-filter-on-monitor-interfaces-based-on-.patch
deleted file mode 100644
index 4b2c67aeba5a87..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/339-wifi-mac80211-filter-on-monitor-interfaces-based-on-.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 2 Oct 2024 12:35:13 +0200
-Subject: [PATCH] wifi: mac80211: filter on monitor interfaces based on
- configured channel
-
-When a monitor interface has an assigned channel (only happens with the
-NO_VIRTUAL_MONITOR feature), only pass packets received on that channel.
-This is useful for monitoring on multiple channels at the same time using
-multiple monitor interfaces.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -837,6 +837,13 @@ ieee80211_rx_monitor(struct ieee80211_lo
-     ieee80211_handle_mu_mimo_mon(monitor_sdata, origskb, rtap_space);
-
-     list_for_each_entry_rcu(sdata, &local->mon_list, u.mntr.list) {
-+        struct cfg80211_chan_def *chandef;
-+
-+        chandef = &sdata->vif.bss_conf.chanreq.oper;
-+        if (chandef->chan &&
-+            chandef->chan->center_freq != status->freq)
-+            continue;
-+
-         if (!prev_sdata) {
-             prev_sdata = sdata;
-             continue;
diff --git 
a/package/kernel/mac80211/patches/subsys/340-wifi-cfg80211-report-per-wiphy-radio-antenna-mask.patch 
b/package/kernel/mac80211/patches/subsys/340-wifi-cfg80211-report-per-wiphy-radio-antenna-mask.patch
deleted file mode 100644
index 178e01dc163ca8..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/340-wifi-cfg80211-report-per-wiphy-radio-antenna-mask.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Wed, 7 Aug 2024 13:31:07 +0200
-Subject: [PATCH] wifi: cfg80211: report per wiphy radio antenna mask
-
-With multi-radio devices, each radio typically gets a fixed set of 
antennas.
-In order to be able to disable specific antennas for some radios, user 
space
-needs to know which antenna mask bits are assigned to which radio.
-
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -5443,6 +5443,8 @@ struct wiphy_radio_freq_range {
-  * @iface_combinations: Valid interface combinations array, should not
-  *    list single interface types.
-  * @n_iface_combinations: number of entries in @iface_combinations array.
-+ *
-+ * @antenna_mask: bitmask of antennas connected to this radio.
-  */
- struct wiphy_radio {
-     const struct wiphy_radio_freq_range *freq_range;
-@@ -5450,6 +5452,8 @@ struct wiphy_radio {
-
-     const struct ieee80211_iface_combination *iface_combinations;
-     int n_iface_combinations;
-+
-+    u32 antenna_mask;
- };
-
- #define CFG80211_HW_TIMESTAMP_ALL_PEERS    0xffff
---- a/include/uapi/linux/nl80211.h
-+++ b/include/uapi/linux/nl80211.h
-@@ -8038,6 +8038,8 @@ enum nl80211_ap_settings_flags {
-  * @NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION: Supported interface
-  *    combination for this radio. Attribute may be present multiple times
-  *    and contains attributes defined in &enum 
nl80211_if_combination_attrs.
-+ * @NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK: bitmask (u32) of antennas
-+ *    connected to this radio.
-  *
-  * @__NL80211_WIPHY_RADIO_ATTR_LAST: Internal
-  * @NL80211_WIPHY_RADIO_ATTR_MAX: Highest attribute
-@@ -8048,6 +8050,7 @@ enum nl80211_wiphy_radio_attrs {
-     NL80211_WIPHY_RADIO_ATTR_INDEX,
-     NL80211_WIPHY_RADIO_ATTR_FREQ_RANGE,
-     NL80211_WIPHY_RADIO_ATTR_INTERFACE_COMBINATION,
-+    NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK,
-
-     /* keep last */
-     __NL80211_WIPHY_RADIO_ATTR_LAST,
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -2431,6 +2431,11 @@ static int nl80211_put_radio(struct wiph
-     if (nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_INDEX, idx))
-         goto nla_put_failure;
-
-+    if (r->antenna_mask &&
-+        nla_put_u32(msg, NL80211_WIPHY_RADIO_ATTR_ANTENNA_MASK,
-+            r->antenna_mask))
-+        goto nla_put_failure;
-+
-     for (i = 0; i < r->n_freq_range; i++) {
-         const struct wiphy_radio_freq_range *range = &r->freq_range[i];
-
diff --git 
a/package/kernel/mac80211/patches/subsys/341-wifi-mac80211-fix-vif-addr-when-switching-from-monit.patch 
b/package/kernel/mac80211/patches/subsys/341-wifi-mac80211-fix-vif-addr-when-switching-from-monit.patch
deleted file mode 100644
index f4cfc95aa3b7a1..00000000000000
--- 
a/package/kernel/mac80211/patches/subsys/341-wifi-mac80211-fix-vif-addr-when-switching-from-monit.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Felix Fietkau <nbd at nbd.name>
-Date: Fri, 15 Nov 2024 12:28:43 +0100
-Subject: [PATCH] wifi: mac80211: fix vif addr when switching from monitor
- to station
-
-Since adding support for opting out of virtual monitor support, a zero vif
-addr was used to indicate passive vs active monitor to the driver.
-This would break the vif->addr when changing the netdev mac address before
-switching the interface from monitor to sta mode.
-Fix the regression by adding a separate flag to indicate whether vif->addr
-is valid.
-
-Reported-by: syzbot+9ea265d998de25ac6a46 at syzkaller.appspotmail.com
-Fixes: 9d40f7e32774 ("wifi: mac80211: add flag to opt out of virtual 
monitor support")
-Signed-off-by: Felix Fietkau <nbd at nbd.name>
----
-
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1972,6 +1972,8 @@ enum ieee80211_neg_ttlm_res {
-  * @neg_ttlm: negotiated TID to link mapping info.
-  *    see &struct ieee80211_neg_ttlm.
-  * @addr: address of this interface
-+ * @addr_valid: indicates if the address is actively used. Set to 
false for
-+ *    passive monitor interfaces, true in all other cases.
-  * @p2p: indicates whether this AP or STA interface is a p2p
-  *    interface, i.e. a GO or p2p-sta respectively
-  * @netdev_features: tx netdev features supported by the hardware for this
-@@ -2011,6 +2013,7 @@ struct ieee80211_vif {
-     u16 valid_links, active_links, dormant_links, suspended_links;
-     struct ieee80211_neg_ttlm neg_ttlm;
-     u8 addr[ETH_ALEN] __aligned(2);
-+    bool addr_valid;
-     bool p2p;
-
-     u8 cab_queue;
---- a/net/mac80211/iface.c
-+++ b/net/mac80211/iface.c
-@@ -279,13 +279,8 @@ static int _ieee80211_change_mac(struct
-     ret = eth_mac_addr(sdata->dev, sa);
-
-     if (ret == 0) {
--        if (check_dup) {
--            memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN);
--            ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr);
--        } else {
--            memset(sdata->vif.addr, 0, ETH_ALEN);
--            memset(sdata->vif.bss_conf.addr, 0, ETH_ALEN);
--        }
-+        memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN);
-+        ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr);
-     }
-
-     /* Regardless of eth_mac_addr() return we still want to add the
-@@ -1324,6 +1319,8 @@ int ieee80211_do_open(struct wireless_de
-         }
-     }
-
-+    sdata->vif.addr_valid = sdata->vif.type != NL80211_IFTYPE_MONITOR ||
-+                (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE);
-     switch (sdata->vif.type) {
-     case NL80211_IFTYPE_AP_VLAN:
-         /* no need to tell driver, but set carrier and chanctx */

 From f37a2a34c0fa74a9fcc64e38ec2be36512da0e86 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Mon, 26 May 2025 23:35:18 +0200
Subject: [PATCH 03/14] mac80211: use remove_new

Easy compability fix for kernel 6.6, 6.12 and above.
Patches merged into one file for all devices.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  .../350-change-remove-to-remove_new.patch     | 324 ++++++++++++++++++
  ...7-rt2x00-change-remove-to-remove_new.patch |  42 ---
  2 files changed, 324 insertions(+), 42 deletions(-)
  create mode 100644 
package/kernel/mac80211/patches/build/350-change-remove-to-remove_new.patch
  delete mode 100644 
package/kernel/mac80211/patches/rt2x00/997-rt2x00-change-remove-to-remove_new.patch

diff --git 
a/package/kernel/mac80211/patches/build/350-change-remove-to-remove_new.patch 
b/package/kernel/mac80211/patches/build/350-change-remove-to-remove_new.patch
new file mode 100644
index 00000000000000..07fbb8f407ef67
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/build/350-change-remove-to-remove_new.patch
@@ -0,0 +1,324 @@
+--- a/drivers/net/wireless/ath/ath10k/ahb.c
++++ b/drivers/net/wireless/ath/ath10k/ahb.c
+@@ -835,13 +835,6 @@ static void ath10k_ahb_remove(struct pla
+     ath10k_ahb_resource_deinit(ar);
+     ath10k_core_destroy(ar);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_ath10k_ahb_remove(struct platform_device *pdev) {
+-    ath10k_ahb_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static struct platform_driver ath10k_ahb_driver = {
+     .driver = {
+@@ -852,7 +845,7 @@ static struct platform_driver ath10k_ahb
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = ath10k_ahb_remove,
+ #else
+-    .remove = bp_ath10k_ahb_remove,
++    .remove_new = ath10k_ahb_remove,
+ #endif
+
+ };
+--- a/drivers/net/wireless/ath/ath10k/snoc.c
++++ b/drivers/net/wireless/ath/ath10k/snoc.c
+@@ -1875,13 +1875,6 @@ static void ath10k_snoc_remove(struct pl
+
+     ath10k_snoc_free_resources(ar);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_ath10k_snoc_remove(struct platform_device *pdev) {
+-    ath10k_snoc_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static void ath10k_snoc_shutdown(struct platform_device *pdev)
+ {
+@@ -1896,7 +1889,7 @@ static struct platform_driver ath10k_sno
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = ath10k_snoc_remove,
+ #else
+-    .remove = bp_ath10k_snoc_remove,
++    .remove_new = ath10k_snoc_remove,
+ #endif
+
+     .shutdown = ath10k_snoc_shutdown,
+--- a/drivers/net/wireless/ath/ath11k/ahb.c
++++ b/drivers/net/wireless/ath/ath11k/ahb.c
+@@ -1293,13 +1293,6 @@ qmi_fail:
+     ath11k_fw_destroy(ab);
+     ath11k_ahb_free_resources(ab);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_ath11k_ahb_remove(struct platform_device *pdev) {
+-    ath11k_ahb_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static void ath11k_ahb_shutdown(struct platform_device *pdev)
+ {
+@@ -1330,7 +1323,7 @@ static struct platform_driver ath11k_ahb
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = ath11k_ahb_remove,
+ #else
+-    .remove = bp_ath11k_ahb_remove,
++    .remove_new = ath11k_ahb_remove,
+ #endif
+
+     .shutdown = ath11k_ahb_shutdown,
+--- a/drivers/net/wireless/ath/ath5k/ahb.c
++++ b/drivers/net/wireless/ath/ath5k/ahb.c
+@@ -216,20 +216,13 @@ static void ath_ahb_remove(struct platfo
+     iounmap(ah->iobase);
+     ieee80211_free_hw(hw);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_ath_ahb_remove(struct platform_device *pdev) {
+-    ath_ahb_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static struct platform_driver ath_ahb_driver = {
+     .probe = ath_ahb_probe,
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = ath_ahb_remove,
+ #else
+-    .remove = bp_ath_ahb_remove,
++    .remove_new = ath_ahb_remove,
+ #endif
+
+     .driver = {
+--- a/drivers/net/wireless/ath/ath9k/ahb.c
++++ b/drivers/net/wireless/ath/ath9k/ahb.c
+@@ -156,20 +156,13 @@ static void ath_ahb_remove(struct platfo
+         ieee80211_free_hw(sc->hw);
+     }
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_ath_ahb_remove(struct platform_device *pdev) {
+-    ath_ahb_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static struct platform_driver ath_ahb_driver = {
+     .probe = ath_ahb_probe,
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = ath_ahb_remove,
+ #else
+-    .remove = bp_ath_ahb_remove,
++    .remove_new = ath_ahb_remove,
+ #endif
+
+     .driver = {
+--- a/drivers/net/wireless/ath/wcn36xx/main.c
++++ b/drivers/net/wireless/ath/wcn36xx/main.c
+@@ -1674,13 +1674,6 @@ static void wcn36xx_remove(struct platfo
+     mutex_destroy(&wcn->hal_mutex);
+     ieee80211_free_hw(hw);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_wcn36xx_remove(struct platform_device *pdev) {
+-    wcn36xx_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static const struct of_device_id wcn36xx_of_match[] = {
+     { .compatible = "qcom,wcnss-wlan" },
+@@ -1693,7 +1686,7 @@ static struct platform_driver wcn36xx_dr
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = wcn36xx_remove,
+ #else
+-    .remove = bp_wcn36xx_remove,
++    .remove_new = wcn36xx_remove,
+ #endif
+
+     .driver = {
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+@@ -594,19 +594,12 @@ static void brcmf_common_pd_remove(struc
+     if (brcmfmac_pdata->power_off)
+         brcmfmac_pdata->power_off();
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_brcmf_common_pd_remove(struct platform_device *pdev) {
+-    brcmf_common_pd_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static struct platform_driver brcmf_pd = {
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove        = brcmf_common_pd_remove,
+ #else
+-    .remove = bp_brcmf_common_pd_remove,
++    .remove_new = brcmf_common_pd_remove,
+ #endif
+
+     .driver        = {
+--- a/drivers/net/wireless/mediatek/mt76/mt7603/soc.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7603/soc.c
+@@ -59,13 +59,6 @@ static void mt76_wmac_remove(struct plat
+
+     mt7603_unregister_device(dev);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_mt76_wmac_remove(struct platform_device *pdev) {
+-    mt76_wmac_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static const struct of_device_id of_wmac_match[] = {
+     { .compatible = "mediatek,mt7628-wmac" },
+@@ -81,7 +74,7 @@ struct platform_driver mt76_wmac_driver
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove        = mt76_wmac_remove,
+ #else
+-    .remove = bp_mt76_wmac_remove,
++    .remove_new = mt76_wmac_remove,
+ #endif
+
+     .driver = {
+--- a/drivers/net/wireless/mediatek/mt76/mt7615/soc.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7615/soc.c
+@@ -51,13 +51,6 @@ static void mt7622_wmac_remove(struct pl
+
+     mt7615_unregister_device(dev);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_mt7622_wmac_remove(struct platform_device *pdev) {
+-    mt7622_wmac_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static const struct of_device_id mt7622_wmac_of_match[] = {
+     { .compatible = "mediatek,mt7622-wmac" },
+@@ -73,7 +66,7 @@ struct platform_driver mt7622_wmac_drive
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = mt7622_wmac_remove,
+ #else
+-    .remove = bp_mt7622_wmac_remove,
++    .remove_new = mt7622_wmac_remove,
+ #endif
+
+ };
+--- a/drivers/net/wireless/mediatek/mt76/mt7915/soc.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7915/soc.c
+@@ -1288,13 +1288,6 @@ static void mt798x_wmac_remove(struct pl
+
+     mt7915_unregister_device(dev);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_mt798x_wmac_remove(struct platform_device *pdev) {
+-    mt798x_wmac_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static const struct of_device_id mt798x_wmac_of_match[] = {
+     { .compatible = "mediatek,mt7981-wmac", .data = (u32 *)0x7981 },
+@@ -1313,7 +1306,7 @@ struct platform_driver mt798x_wmac_drive
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove = mt798x_wmac_remove,
+ #else
+-    .remove = bp_mt798x_wmac_remove,
++    .remove_new = mt798x_wmac_remove,
+ #endif
+
+ };
+--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
+@@ -252,7 +252,7 @@ static struct platform_driver rt2800soc_
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove        = rt2x00soc_remove,
+ #else
+-    .remove = bp_rt2x00soc_remove,
++    .remove_new = rt2x00soc_remove,
+ #endif
+
+     .suspend    = rt2x00soc_suspend,
+--- a/drivers/net/wireless/ti/wl12xx/main.c
++++ b/drivers/net/wireless/ti/wl12xx/main.c
+@@ -1930,13 +1930,6 @@ static void wl12xx_remove(struct platfor
+
+     wlcore_remove(pdev);
+ }
+-#if LINUX_VERSION_IS_LESS(6,13,0)
+-static int bp_wl12xx_remove(struct platform_device *pdev) {
+-    wl12xx_remove(pdev);
+-
+-    return 0;
+-}
+-#endif
+
+ static const struct platform_device_id wl12xx_id_table[] = {
+     { "wl12xx", 0 },
+@@ -1949,7 +1942,7 @@ static struct platform_driver wl12xx_dri
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove        = wl12xx_remove,
+ #else
+-    .remove = bp_wl12xx_remove,
++    .remove_new = wl12xx_remove,
+ #endif
+
+     .id_table    = wl12xx_id_table,
+--- a/drivers/net/wireless/ti/wl18xx/main.c
++++ b/drivers/net/wireless/ti/wl18xx/main.c
+@@ -2100,7 +2100,7 @@ static struct platform_driver wl18xx_dri
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
+     .remove        = wlcore_remove,
+ #else
+-    .remove = bp_wlcore_remove,
++    .remove_new = wlcore_remove,
+ #endif
+
+     .id_table    = wl18xx_id_table,
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
+@@ -108,7 +108,7 @@ exit_free_device:
+ }
+ EXPORT_SYMBOL_GPL(rt2x00soc_probe);
+
+-int rt2x00soc_remove(struct platform_device *pdev)
++void rt2x00soc_remove(struct platform_device *pdev)
+ {
+     struct ieee80211_hw *hw = platform_get_drvdata(pdev);
+     struct rt2x00_dev *rt2x00dev = hw->priv;
+@@ -119,8 +119,6 @@ int rt2x00soc_remove(struct platform_dev
+     rt2x00lib_remove_dev(rt2x00dev);
+     rt2x00soc_free_reg(rt2x00dev);
+     ieee80211_free_hw(hw);
+-
+-    return 0;
+ }
+ EXPORT_SYMBOL_GPL(rt2x00soc_remove);
+
+--- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
+@@ -17,7 +17,7 @@
+  * SoC driver handlers.
+  */
+ int rt2x00soc_probe(struct platform_device *pdev, const struct 
rt2x00_ops *ops);
+-int rt2x00soc_remove(struct platform_device *pdev);
++void rt2x00soc_remove(struct platform_device *pdev);
+ #ifdef CONFIG_PM
+ int rt2x00soc_suspend(struct platform_device *pdev, pm_message_t state);
+ int rt2x00soc_resume(struct platform_device *pdev);
diff --git 
a/package/kernel/mac80211/patches/rt2x00/997-rt2x00-change-remove-to-remove_new.patch 
b/package/kernel/mac80211/patches/rt2x00/997-rt2x00-change-remove-to-remove_new.patch
deleted file mode 100644
index f1a7267b1a798a..00000000000000
--- 
a/package/kernel/mac80211/patches/rt2x00/997-rt2x00-change-remove-to-remove_new.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
-@@ -273,7 +273,7 @@ static struct platform_driver rt2800soc_
-         .of_match_table    = rt2880_wmac_match,
-     },
-     .probe        = rt2800soc_probe,
--    .remove        = rt2x00soc_remove,
-+    .remove_new    = rt2x00soc_remove,
-     .suspend    = rt2x00soc_suspend,
-     .resume        = rt2x00soc_resume,
- };
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c
-@@ -124,7 +124,7 @@ exit_free_device:
- }
- EXPORT_SYMBOL_GPL(rt2x00soc_probe);
-
--int rt2x00soc_remove(struct platform_device *pdev)
-+void rt2x00soc_remove(struct platform_device *pdev)
- {
-     struct ieee80211_hw *hw = platform_get_drvdata(pdev);
-     struct rt2x00_dev *rt2x00dev = hw->priv;
-@@ -135,8 +135,6 @@ int rt2x00soc_remove(struct platform_dev
-     rt2x00lib_remove_dev(rt2x00dev);
-     rt2x00soc_free_reg(rt2x00dev);
-     ieee80211_free_hw(hw);
--
--    return 0;
- }
- EXPORT_SYMBOL_GPL(rt2x00soc_remove);
-
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.h
-@@ -17,7 +17,7 @@
-  * SoC driver handlers.
-  */
- int rt2x00soc_probe(struct platform_device *pdev, const struct 
rt2x00_ops *ops);
--int rt2x00soc_remove(struct platform_device *pdev);
-+void rt2x00soc_remove(struct platform_device *pdev);
- #ifdef CONFIG_PM
- int rt2x00soc_suspend(struct platform_device *pdev, pm_message_t state);
- int rt2x00soc_resume(struct platform_device *pdev);

 From 6204062600718e719db53c9d397877942afafab7 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Sun, 25 May 2025 22:12:00 +0200
Subject: [PATCH 04/14] mac80211: restore old debugfs_fops

Restore old debugfs_fops for compatibility with kernel 6.6 and 6.12.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  .../build/400-restore-old-debugfs_fops.patch  | 252 ++++++++++++++++++
  1 file changed, 252 insertions(+)
  create mode 100644 
package/kernel/mac80211/patches/build/400-restore-old-debugfs_fops.patch

diff --git 
a/package/kernel/mac80211/patches/build/400-restore-old-debugfs_fops.patch 
b/package/kernel/mac80211/patches/build/400-restore-old-debugfs_fops.patch
new file mode 100644
index 00000000000000..14a707b7ef5ea7
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/build/400-restore-old-debugfs_fops.patch
@@ -0,0 +1,252 @@
+--- a/drivers/net/wireless/ath/carl9170/debug.c
++++ b/drivers/net/wireless/ath/carl9170/debug.c
+@@ -54,6 +54,7 @@ struct carl9170_debugfs_fops {
+     char *(*read)(struct ar9170 *ar, char *buf, size_t bufsize,
+               ssize_t *len);
+     ssize_t (*write)(struct ar9170 *aru, const char *buf, size_t size);
++    const struct file_operations fops;
+
+     enum carl9170_device_state req_dev_state;
+ };
+@@ -61,7 +62,7 @@ struct carl9170_debugfs_fops {
+ static ssize_t carl9170_debugfs_read(struct file *file, char __user 
*userbuf,
+                      size_t count, loff_t *ppos)
+ {
+-    const struct carl9170_debugfs_fops *dfops;
++    struct carl9170_debugfs_fops *dfops;
+     struct ar9170 *ar;
+     char *buf = NULL, *res_buf = NULL;
+     ssize_t ret = 0;
+@@ -74,7 +75,8 @@ static ssize_t carl9170_debugfs_read(str
+
+     if (!ar)
+         return -ENODEV;
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct carl9170_debugfs_fops, fops);
+
+     if (!dfops->read)
+         return -ENOSYS;
+@@ -111,7 +113,7 @@ out_free:
+ static ssize_t carl9170_debugfs_write(struct file *file,
+     const char __user *userbuf, size_t count, loff_t *ppos)
+ {
+-    const struct carl9170_debugfs_fops *dfops;
++    struct carl9170_debugfs_fops *dfops;
+     struct ar9170 *ar;
+     char *buf = NULL;
+     int err = 0;
+@@ -126,7 +128,8 @@ static ssize_t carl9170_debugfs_write(st
+
+     if (!ar)
+         return -ENODEV;
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct carl9170_debugfs_fops, fops);
+
+     if (!dfops->write)
+         return -ENOSYS;
+@@ -162,11 +165,6 @@ out_free:
+     return err;
+ }
+
+-static struct debugfs_short_fops debugfs_fops = {
+-    .read    = carl9170_debugfs_read,
+-    .write    = carl9170_debugfs_write,
+-};
+-
+ #define __DEBUGFS_DECLARE_FILE(name, _read, _write, _read_bufsize,    \
+                    _attr, _dstate)                \
+ static const struct carl9170_debugfs_fops carl_debugfs_##name ##_ops = {\
+@@ -175,6 +173,12 @@ static const struct carl9170_debugfs_fop
+     .write = _write,                        \
+     .attr = _attr,                            \
+     .req_dev_state = _dstate,                    \
++    .fops = {                            \
++        .open    = simple_open,                    \
++        .read    = carl9170_debugfs_read,            \
++        .write    = carl9170_debugfs_write,            \
++        .owner    = THIS_MODULE                    \
++    },                                \
+ }
+
+ #define DEBUGFS_DECLARE_FILE(name, _read, _write, _read_bufsize, 
_attr)    \
+@@ -812,9 +816,9 @@ void carl9170_debugfs_register(struct ar
+         ar->hw->wiphy->debugfsdir);
+
+ #define DEBUGFS_ADD(name)                        \
+-    debugfs_create_file_aux(#name, carl_debugfs_##name ##_ops.attr,    \
+-                ar->debug_dir, ar, &carl_debugfs_##name ## _ops, \
+-                &debugfs_fops)
++    debugfs_create_file(#name, carl_debugfs_##name ##_ops.attr,    \
++                ar->debug_dir, ar,                \
++                &carl_debugfs_##name ## _ops.fops)
+
+     DEBUGFS_ADD(usb_tx_anch_urbs);
+     DEBUGFS_ADD(usb_rx_pool_urbs);
+--- a/drivers/net/wireless/broadcom/b43/debugfs.c
++++ b/drivers/net/wireless/broadcom/b43/debugfs.c
+@@ -30,6 +30,7 @@ static struct dentry *rootdir;
+ struct b43_debugfs_fops {
+     ssize_t (*read)(struct b43_wldev *dev, char *buf, size_t bufsize);
+     int (*write)(struct b43_wldev *dev, const char *buf, size_t count);
++    struct file_operations fops;
+     /* Offset of struct b43_dfs_file in struct b43_dfsentry */
+     size_t file_struct_offset;
+ };
+@@ -490,7 +491,7 @@ static ssize_t b43_debugfs_read(struct f
+                 size_t count, loff_t *ppos)
+ {
+     struct b43_wldev *dev;
+-    const struct b43_debugfs_fops *dfops;
++    struct b43_debugfs_fops *dfops;
+     struct b43_dfs_file *dfile;
+     ssize_t ret;
+     char *buf;
+@@ -510,7 +511,8 @@ static ssize_t b43_debugfs_read(struct f
+         goto out_unlock;
+     }
+
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct b43_debugfs_fops, fops);
+     if (!dfops->read) {
+         err = -ENOSYS;
+         goto out_unlock;
+@@ -553,7 +555,7 @@ static ssize_t b43_debugfs_write(struct
+                  size_t count, loff_t *ppos)
+ {
+     struct b43_wldev *dev;
+-    const struct b43_debugfs_fops *dfops;
++    struct b43_debugfs_fops *dfops;
+     char *buf;
+     int err = 0;
+
+@@ -571,7 +573,8 @@ static ssize_t b43_debugfs_write(struct
+         goto out_unlock;
+     }
+
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct b43_debugfs_fops, fops);
+     if (!dfops->write) {
+         err = -ENOSYS;
+         goto out_unlock;
+@@ -599,16 +602,16 @@ out_unlock:
+ }
+
+
+-static struct debugfs_short_fops debugfs_ops = {
+-    .read    = b43_debugfs_read,
+-    .write    = b43_debugfs_write,
+-    .llseek = generic_file_llseek,
+-};
+-
+ #define B43_DEBUGFS_FOPS(name, _read, _write)            \
+     static struct b43_debugfs_fops fops_##name = {        \
+         .read    = _read,                \
+         .write    = _write,                \
++        .fops    = {                    \
++            .open    = simple_open,            \
++            .read    = b43_debugfs_read,        \
++            .write    = b43_debugfs_write,        \
++            .llseek = generic_file_llseek,        \
++        },                        \
+         .file_struct_offset = offsetof(struct b43_dfsentry, \
+                            file_##name),    \
+     }
+@@ -700,9 +703,9 @@ void b43_debugfs_add_device(struct b43_w
+
+ #define ADD_FILE(name, mode)    \
+     do {                            \
+-        debugfs_create_file_aux(__stringify(name),    \
++        debugfs_create_file(__stringify(name),        \
+                 mode, e->subdir, dev,        \
+-                &fops_##name, &debugfs_ops);    \
++                &fops_##name.fops);        \
+     } while (0)
+
+
+--- a/drivers/net/wireless/broadcom/b43legacy/debugfs.c
++++ b/drivers/net/wireless/broadcom/b43legacy/debugfs.c
+@@ -31,6 +31,7 @@ static struct dentry *rootdir;
+ struct b43legacy_debugfs_fops {
+     ssize_t (*read)(struct b43legacy_wldev *dev, char *buf, size_t 
bufsize);
+     int (*write)(struct b43legacy_wldev *dev, const char *buf, size_t 
count);
++    struct file_operations fops;
+     /* Offset of struct b43legacy_dfs_file in struct b43legacy_dfsentry */
+     size_t file_struct_offset;
+     /* Take wl->irq_lock before calling read/write? */
+@@ -187,7 +188,7 @@ static ssize_t b43legacy_debugfs_read(st
+                 size_t count, loff_t *ppos)
+ {
+     struct b43legacy_wldev *dev;
+-    const struct b43legacy_debugfs_fops *dfops;
++    struct b43legacy_debugfs_fops *dfops;
+     struct b43legacy_dfs_file *dfile;
+     ssize_t ret;
+     char *buf;
+@@ -207,7 +208,8 @@ static ssize_t b43legacy_debugfs_read(st
+         goto out_unlock;
+     }
+
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct b43legacy_debugfs_fops, fops);
+     if (!dfops->read) {
+         err = -ENOSYS;
+         goto out_unlock;
+@@ -255,7 +257,7 @@ static ssize_t b43legacy_debugfs_write(s
+                  size_t count, loff_t *ppos)
+ {
+     struct b43legacy_wldev *dev;
+-    const struct b43legacy_debugfs_fops *dfops;
++    struct b43legacy_debugfs_fops *dfops;
+     char *buf;
+     int err = 0;
+
+@@ -273,7 +275,8 @@ static ssize_t b43legacy_debugfs_write(s
+         goto out_unlock;
+     }
+
+-    dfops = debugfs_get_aux(file);
++    dfops = container_of(debugfs_real_fops(file),
++                 struct b43legacy_debugfs_fops, fops);
+     if (!dfops->write) {
+         err = -ENOSYS;
+         goto out_unlock;
+@@ -305,16 +308,17 @@ out_unlock:
+     return err ? err : count;
+ }
+
+-static struct debugfs_short_fops debugfs_ops = {
+-    .read    = b43legacy_debugfs_read,
+-    .write    = b43legacy_debugfs_write,
+-    .llseek = generic_file_llseek
+-};
+
+ #define B43legacy_DEBUGFS_FOPS(name, _read, _write, _take_irqlock)    \
+     static struct b43legacy_debugfs_fops fops_##name = { \
+         .read    = _read,                \
+         .write    = _write,                \
++        .fops    = {                    \
++            .open    = simple_open,                \
++            .read    = b43legacy_debugfs_read,        \
++            .write    = b43legacy_debugfs_write,        \
++            .llseek = generic_file_llseek,            \
++        },                        \
+         .file_struct_offset = offsetof(struct b43legacy_dfsentry, \
+                            file_##name),    \
+         .take_irqlock    = _take_irqlock,        \
+@@ -382,9 +386,9 @@ void b43legacy_debugfs_add_device(struct
+
+ #define ADD_FILE(name, mode)    \
+     do {                            \
+-        debugfs_create_file_aux(__stringify(name), mode,    \
++        debugfs_create_file(__stringify(name), mode,    \
+                     e->subdir, dev,        \
+-                    &fops_##name, &debugfs_ops);    \
++                    &fops_##name.fops);        \
+     } while (0)
+
+

 From 60381dafefbea3cff28a1998a46bd51eddb4b7b5 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Tue, 27 May 2025 07:14:42 +0200
Subject: [PATCH 05/14] mac80211: ti: change read_new to read

Change function read_new to read for compatibility
with kernel 6.6 and 6.12.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  .../build/360-change-read_new-to-read.patch   | 20 +++++++++++++++++++
  1 file changed, 20 insertions(+)
  create mode 100644 
package/kernel/mac80211/patches/build/360-change-read_new-to-read.patch

diff --git 
a/package/kernel/mac80211/patches/build/360-change-read_new-to-read.patch 
b/package/kernel/mac80211/patches/build/360-change-read_new-to-read.patch
new file mode 100644
index 00000000000000..6387a8990f5189
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/build/360-change-read_new-to-read.patch
@@ -0,0 +1,20 @@
+--- a/drivers/net/wireless/ti/wlcore/sysfs.c
++++ b/drivers/net/wireless/ti/wlcore/sysfs.c
+@@ -88,7 +88,7 @@ static ssize_t hw_pg_ver_show(struct dev
+ static DEVICE_ATTR_RO(hw_pg_ver);
+
+ static ssize_t wl1271_sysfs_read_fwlog(struct file *filp, struct 
kobject *kobj,
+-                       const struct bin_attribute *bin_attr,
++                       struct bin_attribute *bin_attr,
+                        char *buffer, loff_t pos, size_t count)
+ {
+     struct device *dev = kobj_to_dev(kobj);
+@@ -121,7 +121,7 @@ static ssize_t wl1271_sysfs_read_fwlog(s
+
+ static const struct bin_attribute fwlog_attr = {
+     .attr = { .name = "fwlog", .mode = 0400 },
+-    .read_new = wl1271_sysfs_read_fwlog,
++    .read = wl1271_sysfs_read_fwlog,
+ };
+
+ int wlcore_sysfs_init(struct wl1271 *wl)

 From 745d79c2a70f596a56d876a1eb4d31187a58cb94 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Mon, 26 May 2025 16:35:07 +0200
Subject: [PATCH 06/14] mt76: update for compatibility with backports 6.14.5

Update for compatibility with backports 6.14.5.
Adding link_id to get_txpower functions parameters
via 003-wifi-mt76-link_id.patch.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  .../mt76/patches/003-wifi-mt76-link_id.patch  | 34 +++++++++++++++++++
  1 file changed, 34 insertions(+)
  create mode 100644 package/kernel/mt76/patches/003-wifi-mt76-link_id.patch

diff --git a/package/kernel/mt76/patches/003-wifi-mt76-link_id.patch 
b/package/kernel/mt76/patches/003-wifi-mt76-link_id.patch
new file mode 100644
index 00000000000000..494796f9793b31
--- /dev/null
+++ b/package/kernel/mt76/patches/003-wifi-mt76-link_id.patch
@@ -0,0 +1,34 @@
+--- a/mac80211.c
++++ b/mac80211.c
+@@ -1702,7 +1702,7 @@ s8 mt76_get_power_bound(struct mt76_phy
+ EXPORT_SYMBOL_GPL(mt76_get_power_bound);
+
+ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+-             int *dbm)
++             unsigned int link_id, int *dbm)
+ {
+     struct mt76_phy *phy = mt76_vif_phy(hw, vif);
+     int n_chains, delta;
+--- a/mt76.h
++++ b/mt76.h
+@@ -1496,7 +1496,7 @@ int mt76_get_min_avg_rssi(struct mt76_de
+ s8 mt76_get_power_bound(struct mt76_phy *phy, s8 txpower);
+
+ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+-             int *dbm);
++             unsigned int link_id, int *dbm);
+ int mt76_init_sar_power(struct ieee80211_hw *hw,
+             const struct cfg80211_sar_specs *sar);
+ int mt76_get_sar_power(struct mt76_phy *phy,
+--- a/mt7996/main.c
++++ b/mt7996/main.c
+@@ -664,7 +664,8 @@ static void mt7996_configure_filter(stru
+ }
+
+ static int
+-mt7996_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 
int *dbm)
++mt7996_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
++               unsigned int link_id, int *dbm)
+ {
+     struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
+     struct mt7996_phy *phy = mt7996_vif_link_phy(&mvif->deflink);

 From d9c1dde095716f7e19b926843a0d7a4514a418ee Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Tue, 27 May 2025 20:12:38 +0200
Subject: [PATCH 07/14] rtl8812au-ct: update for compatibility with backports
  6.14.5

Update for compatibility with backports 6.14.5.
Adding link_id to get_txpower functions parameters
via 110-link_id.patch.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  package/kernel/rtl8812au-ct/patches/110-link_id.patch | 11 +++++++++++
  1 file changed, 11 insertions(+)
  create mode 100644 package/kernel/rtl8812au-ct/patches/110-link_id.patch

diff --git a/package/kernel/rtl8812au-ct/patches/110-link_id.patch 
b/package/kernel/rtl8812au-ct/patches/110-link_id.patch
new file mode 100644
index 00000000000000..70121c27be4d8a
--- /dev/null
+++ b/package/kernel/rtl8812au-ct/patches/110-link_id.patch
@@ -0,0 +1,11 @@
+--- a/os_dep/linux/ioctl_cfg80211.c
++++ b/os_dep/linux/ioctl_cfg80211.c
+@@ -3183,7 +3183,7 @@ static int cfg80211_rtw_set_txpower(stru
+
+ static int cfg80211_rtw_get_txpower(struct wiphy *wiphy,
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))
+-                                    struct wireless_dev *wdev,
++                                    struct wireless_dev *wdev, 
unsigned int link_id,
+ #endif
+                                     int *dbm)
+ {

 From e20b10bd557e9d88464f47dce1ca7b8e8ead5921 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari at gmail.com>
Date: Wed, 28 May 2025 16:59:11 +0200
Subject: [PATCH 08/14] mac80211: realtek: rtw88: patch for kernels lower 
than
  6.9
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Added patch 240-realtek-rtw88-BH-workqueue.patch fixing rtw88
compatibility with kernels lower than 6.9, including 6.6.
These kernels do not support BH workqueues, hence switched
to singlethread workqueue.

Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
---
  .../build/240-realtek-rtw88-BH-workqueue.patch     | 14 ++++++++++++++
  1 file changed, 14 insertions(+)
  create mode 100644 
package/kernel/mac80211/patches/build/240-realtek-rtw88-BH-workqueue.patch

diff --git 
a/package/kernel/mac80211/patches/build/240-realtek-rtw88-BH-workqueue.patch 
b/package/kernel/mac80211/patches/build/240-realtek-rtw88-BH-workqueue.patch
new file mode 100644
index 00000000000000..0fb34e83cba2ee
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/build/240-realtek-rtw88-BH-workqueue.patch
@@ -0,0 +1,14 @@
+--- a/drivers/net/wireless/realtek/rtw88/usb.c
++++ b/drivers/net/wireless/realtek/rtw88/usb.c
+@@ -909,7 +909,11 @@ static int rtw_usb_init_rx(struct rtw_de
+     struct sk_buff *rx_skb;
+     int i;
+
++#if LINUX_VERSION_IS_GEQ(6,9,0)
+     rtwusb->rxwq = alloc_workqueue("rtw88_usb: rx wq", WQ_BH, 0);
++#else
++    rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
++#endif
+     if (!rtwusb->rxwq) {
+         rtw_err(rtwdev, "failed to create RX work queue\n");
+         return -ENOMEM;

 From dc9007c720033f3d910e07569cbcf05dee3be209 Mon Sep 17 00:00:00 2001
From: Mantas Pucka <mantas at 8devices.com>
Date: Tue, 27 May 2025 16:33:17 +0300
Subject: [PATCH 09/14] mac80211: add for 6.6 compatibility

Add 200-Revert-wifi-ath12k-convert-tasklet-to-BH-workqueue-f.patch
for 6.6 compatibility

Signed-off-by: Mantas Pucka <mantas at 8devices.com>
---
  ...2k-convert-tasklet-to-BH-workqueue-f.patch | 82 +++++++++++++++++++
  1 file changed, 82 insertions(+)
  create mode 100644 
package/kernel/mac80211/patches/ath12k/200-Revert-wifi-ath12k-convert-tasklet-to-BH-workqueue-f.patch

diff --git 
a/package/kernel/mac80211/patches/ath12k/200-Revert-wifi-ath12k-convert-tasklet-to-BH-workqueue-f.patch 
b/package/kernel/mac80211/patches/ath12k/200-Revert-wifi-ath12k-convert-tasklet-to-BH-workqueue-f.patch
new file mode 100644
index 00000000000000..d2ba69ca342b22
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/ath12k/200-Revert-wifi-ath12k-convert-tasklet-to-BH-workqueue-f.patch
@@ -0,0 +1,82 @@
+From cd911185014f773f0e227cabfb760b30968c3bca Mon Sep 17 00:00:00 2001
+From: Mantas Pucka <mantas at 8devices.com>
+Date: Tue, 27 May 2025 14:13:27 +0300
+Subject: [PATCH] Revert "wifi: ath12k: convert tasklet to BH workqueue 
for CE
+ interrupts"
+
+This reverts commit cdad737160571a98cc4933a62c9f2728e965ab27.
+---
+ drivers/net/wireless/ath/ath12k/ce.h  |  2 +-
+ drivers/net/wireless/ath/ath12k/pci.c | 14 +++++++-------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath12k/ce.h
++++ b/drivers/net/wireless/ath/ath12k/ce.h
+@@ -148,7 +148,7 @@ struct ath12k_ce_pipe {
+     void (*send_cb)(struct ath12k_ce_pipe *pipe);
+     void (*recv_cb)(struct ath12k_base *ab, struct sk_buff *skb);
+
+-    struct work_struct intr_wq;
++    struct tasklet_struct intr_tq;
+     struct ath12k_ce_ring *src_ring;
+     struct ath12k_ce_ring *dest_ring;
+     struct ath12k_ce_ring *status_ring;
+--- a/drivers/net/wireless/ath/ath12k/pci.c
++++ b/drivers/net/wireless/ath/ath12k/pci.c
+@@ -430,9 +430,9 @@ static void ath12k_pci_sync_ce_irqs(stru
+     }
+ }
+
+-static void ath12k_pci_ce_workqueue(struct work_struct *work)
++static void ath12k_pci_ce_tasklet(struct tasklet_struct *t)
+ {
+-    struct ath12k_ce_pipe *ce_pipe = from_work(ce_pipe, work, intr_wq);
++    struct ath12k_ce_pipe *ce_pipe = from_tasklet(ce_pipe, t, intr_tq);
+     int irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe->pipe_num;
+
+     ath12k_ce_per_engine_service(ce_pipe->ab, ce_pipe->pipe_num);
+@@ -454,7 +454,7 @@ static irqreturn_t ath12k_pci_ce_interru
+
+     disable_irq_nosync(ab->irq_num[irq_idx]);
+
+-    queue_work(system_bh_wq, &ce_pipe->intr_wq);
++    tasklet_schedule(&ce_pipe->intr_tq);
+
+     return IRQ_HANDLED;
+ }
+@@ -680,7 +680,7 @@ static int ath12k_pci_config_irq(struct
+
+         irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + i;
+
+-        INIT_WORK(&ce_pipe->intr_wq, ath12k_pci_ce_workqueue);
++        tasklet_setup(&ce_pipe->intr_tq, ath12k_pci_ce_tasklet);
+
+         ret = request_irq(irq, ath12k_pci_ce_interrupt_handler,
+                   ab_pci->irq_flags, irq_name[irq_idx],
+@@ -967,7 +967,7 @@ static void ath12k_pci_aspm_restore(stru
+                            PCI_EXP_LNKCTL_ASPMC);
+ }
+
+-static void ath12k_pci_cancel_workqueue(struct ath12k_base *ab)
++static void ath12k_pci_kill_tasklets(struct ath12k_base *ab)
+ {
+     int i;
+
+@@ -977,7 +977,7 @@ static void ath12k_pci_cancel_workqueue(
+         if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
+             continue;
+
+-        cancel_work_sync(&ce_pipe->intr_wq);
++        tasklet_kill(&ce_pipe->intr_tq);
+     }
+ }
+
+@@ -985,7 +985,7 @@ static void ath12k_pci_ce_irq_disable_sy
+ {
+     ath12k_pci_ce_irqs_disable(ab);
+     ath12k_pci_sync_ce_irqs(ab);
+-    ath12k_pci_cancel_workqueue(ab);
++    ath12k_pci_kill_tasklets(ab);
+ }
+
+ int ath12k_pci_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,

 From 6301d4d7f11c4db5575b7bbb417e5e12ee546dca Mon Sep 17 00:00:00 2001
From: Mantas Pucka <mantas at 8devices.com>
Date: Mon, 2 Jun 2025 10:27:15 +0300
Subject: [PATCH 10/14] mac80211: ath12k: update MU-MIMO and 160MHz support
  patches

Updated to v14 version from [1], add 003-* series from upstream

[1] 
https://patchwork.kernel.org/project/linux-wireless/cover/20250521224539.355985-1-quic_pradeepc@quicinc.com/

Signed-off-by: Mantas Pucka <mantas at 8devices.com>
---
  ...-correct-values-of-center-freq1-and-.patch |  53 ++
  ...-correct-values-of-center-freq1-and-.patch |  43 ++
  ...k-push-HE-MU-MIMO-params-to-hardware.patch | 215 ++++---
  ...-push-EHT-MU-MIMO-params-to-hardware.patch | 144 +++--
  ...HE-MCS-mapper-to-a-separate-function.patch | 107 ++--
  ...and-tx-mcs-maps-for-supported-HE-mcs.patch | 101 +--
  ...X-MCS-rate-configurations-in-HE-mode.patch | 103 +--
  ...ort-for-setting-fixed-HE-rate-GI-LTF.patch | 589 ++++++++++--------
  ...7-wifi-ath12k-clean-up-80P80-support.patch | 180 +++---
  ...2k-add-support-for-160-MHz-bandwidth.patch | 248 ++++----
  ...ed-NSS-bandwidth-support-for-160-MHz.patch | 119 ++--
  11 files changed, 1084 insertions(+), 818 deletions(-)
  create mode 100644 
package/kernel/mac80211/patches/ath12k/003-1-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch
  create mode 100644 
package/kernel/mac80211/patches/ath12k/003-2-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch

diff --git 
a/package/kernel/mac80211/patches/ath12k/003-1-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch 
b/package/kernel/mac80211/patches/ath12k/003-1-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch
new file mode 100644
index 00000000000000..78dea13a49071f
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/ath12k/003-1-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch
@@ -0,0 +1,53 @@
+From b1b01e46a3db5ad44d1e4691ba37c1e0832cd5cf Mon Sep 17 00:00:00 2001
+From: Suraj P Kizhakkethil <quic_surapk at quicinc.com>
+Date: Tue, 4 Mar 2025 15:23:14 +0530
+Subject: [PATCH 1/2] wifi: ath12k: Pass correct values of center freq1 and
+ center freq2 for 160 MHz
+
+Currently, for 160 MHz bandwidth, center frequency1 and
+center frequency2 are not passed correctly to the firmware.
+Set center frequency1 as the center frequency
+of the primary 80 MHz channel segment and center frequency2 as
+the center frequency of the 160 MHz channel and pass the values
+to the firmware.
+
+Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Suraj P Kizhakkethil <quic_surapk at quicinc.com>
+Reviewed-by: Aditya Kumar Singh <aditya.kumar.singh at oss.qualcomm.com>
+Link: 
https://patch.msgid.link/20250304095315.3050325-2-quic_surapk@quicinc.com
+Signed-off-by: Jeff Johnson <jeff.johnson at oss.qualcomm.com>
+---
+ drivers/net/wireless/ath/ath12k/wmi.c | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath12k/wmi.c
++++ b/drivers/net/wireless/ath/ath12k/wmi.c
+@@ -1000,14 +1000,24 @@ int ath12k_wmi_vdev_down(struct ath12k *
+ static void ath12k_wmi_put_wmi_channel(struct 
ath12k_wmi_channel_params *chan,
+                        struct wmi_vdev_start_req_arg *arg)
+ {
++    u32 center_freq1 = arg->band_center_freq1;
++
+     memset(chan, 0, sizeof(*chan));
+
+     chan->mhz = cpu_to_le32(arg->freq);
+-    chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1);
+-    if (arg->mode == MODE_11AC_VHT80_80)
++    chan->band_center_freq1 = cpu_to_le32(center_freq1);
++    if (arg->mode == MODE_11BE_EHT160) {
++        if (arg->freq > center_freq1)
++            chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40);
++        else
++            chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40);
++
++        chan->band_center_freq2 = cpu_to_le32(center_freq1);
++    } else if (arg->mode == MODE_11BE_EHT80_80) {
+         chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2);
+-    else
++    } else {
+         chan->band_center_freq2 = 0;
++    }
+
+     chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE);
+     if (arg->passive)
diff --git 
a/package/kernel/mac80211/patches/ath12k/003-2-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch 
b/package/kernel/mac80211/patches/ath12k/003-2-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch
new file mode 100644
index 00000000000000..3f7f05e9acc3b0
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/ath12k/003-2-v6.16-wifi-ath12k-Pass-correct-values-of-center-freq1-and-.patch
@@ -0,0 +1,43 @@
+From 5e44b181bec8e2fe3826033360fc1a42bb432191 Mon Sep 17 00:00:00 2001
+From: Sriram R <quic_srirrama at quicinc.com>
+Date: Tue, 4 Mar 2025 15:23:15 +0530
+Subject: [PATCH 2/2] wifi: ath12k: Pass correct values of center freq1 and
+ center freq2 for 320 MHz
+
+Currently, for 320 MHz bandwidth, center frequency1 and
+center frequency2 are not passed correctly to the firmware.
+Set center frequency1 as the center frequency of the
+primary 160 MHz channel segment and center frequency2 as the center
+frequency of the 320 MHz channel and pass the values
+to the firmware.
+
+Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Sriram R <quic_srirrama at quicinc.com>
+Signed-off-by: Suraj P Kizhakkethil <quic_surapk at quicinc.com>
+Reviewed-by: Aditya Kumar Singh <aditya.kumar.singh at oss.qualcomm.com>
+Link: 
https://patch.msgid.link/20250304095315.3050325-3-quic_surapk@quicinc.com
+Signed-off-by: Jeff Johnson <jeff.johnson at oss.qualcomm.com>
+---
+ drivers/net/wireless/ath/ath12k/wmi.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/ath/ath12k/wmi.c
++++ b/drivers/net/wireless/ath/ath12k/wmi.c
+@@ -1006,7 +1006,15 @@ static void ath12k_wmi_put_wmi_channel(s
+
+     chan->mhz = cpu_to_le32(arg->freq);
+     chan->band_center_freq1 = cpu_to_le32(center_freq1);
+-    if (arg->mode == MODE_11BE_EHT160) {
++    if (arg->mode == MODE_11BE_EHT320) {
++        if (arg->freq > center_freq1)
++            chan->band_center_freq1 = cpu_to_le32(center_freq1 + 80);
++        else
++            chan->band_center_freq1 = cpu_to_le32(center_freq1 - 80);
++
++        chan->band_center_freq2 = cpu_to_le32(center_freq1);
++
++    } else if (arg->mode == MODE_11BE_EHT160) {
+         if (arg->freq > center_freq1)
+             chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40);
+         else
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-1-wifi-ath12k-push-HE-MU-MIMO-params-to-hardware.patch 
b/package/kernel/mac80211/patches/ath12k/104-1-wifi-ath12k-push-HE-MU-MIMO-params-to-hardware.patch
index dcf633e1017d8f..1dac2fbf929448 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-1-wifi-ath12k-push-HE-MU-MIMO-params-to-hardware.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-1-wifi-ath12k-push-HE-MU-MIMO-params-to-hardware.patch
@@ -1,68 +1,68 @@
-From patchwork Wed Sep 18 21:20:48 2024
+From patchwork Wed May 21 22:45:31 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807212
+X-Patchwork-Id: 14096118
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A06681CA6B9
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:13 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D9B523506D
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:57 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694475; cv=none;
- 
b=HjUnHV2ZbMRZne/OD71kC1p0zBs+1+LVanM+3YbUfCnjvvtSry2r0Dj0HBjHnId1ltZw0ebTJaEZDcXBybkc2yiiGRlcH5s4feXisp9WApElGptz2Qn1SEtO3VDLKyE5m56eJftK/dpin6HPZGOk3hMBHkxoo966Jp4vlC9e2rY=
+    t=1747867559; cv=none;
+ 
b=QXLrpE5trQYq3qZVPuAYdZ8IfmZi7XatjLyxn+9IZXmAWvPsCpT2EOrmLKoTKXH1gxwInwHzxiiwzDveDdYBFh2FGnxhAgdJlTBf1yChfW7+YndhKTtca3rP8z+Zt8QK48/n7gpmFEWkKGmxkG1DKIkCHgAZjD///ttubaAe2gc=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694475; c=relaxed/simple;
-    bh=lJX5iM2Ahf/ROaeR2Kk4suhcbwA47aOSPqyQsesg4A0=;
+    s=arc-20240116; t=1747867559; c=relaxed/simple;
+    bh=wlnSlGktw4cBYqpNPJwSPfG4fkld5ABcJ0NmmjY/jLg=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=RYEWdi9+UZKYtzHKfAF5xdIOkpdgQjBK8hE1SX/f0rJDxozjZe1jDY28C+kzN4uhSwcBSwr7pZjMLL8LELNITE6fIk/zDY5UAO/jdeUPBnTrmrckzZOwaCFIQ1nt6ssDZDfpJADBjCIuMXB7HNChH3qSMlmYTV9QTDxpBK0fQxM=
+ 
b=A4dIxT87Fh9Y97+jvDIVTPlA5cnixK5ZcCAl5lklS0dCWBpo0QkFFiYyRUSKso7kYaT6KFazofkMt8A2z/fDgN8gVZgqEkaXDFSRjqNWCtoplSK7qYryl88snzbQvzD52CbWKkX8yu2Qmd98HFrl2kg69o1e4wzXVcNc+fehea8=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=EtpV59A6; arc=none smtp.client-ip=205.220.168.131
+ header.b=gwsO0461; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="EtpV59A6"
-Received: from pps.filterd (m0279862.ppops.net [127.0.0.1])
+ header.b="gwsO0461"
+Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48IL3WbX003099;
-    Wed, 18 Sep 2024 21:21:07 GMT
+ 54LIZCMW000836;
+    Wed, 21 May 2025 22:45:53 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    3ukRiLVgAcc9GoJxAaFrgsHYImZ/9ZPgSlMf75Ew/1Y=; b=EtpV59A6K8yD5o5B
- 8JSYPL7TI2tnIQciUmyLNJig3DWGn3AZbFqPjgTYUgoQLHjsNWd+WRAKx13tQhSW
- peq0OW9986uI1TFVpaw0pwVXoBiStEI5MH/7ThiA5nIAI4hYBI6+iiwL7qWpboSL
- UrG9sWI35wsgcjedTtrzR2QfpeTAvlnReoac/49o5GAysu1oGDN79VAAP7tDZbO2
- trx/XdQmW/8iqtRR3Idhjcod6B6ovXKkmAZUHzhp4zRupTUsKOU84X3aTYZQLN/B
- 46HuFZSlOJEB/63Co7I2K8YfQT3FikP2mkrIsDwH78Y2OekhXJWFe7dU4SsX6nh6
-    sIXVxA==
-Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
+    jJ/9931jjDg+8neUbH09oigyzQwINmgJKgsYw6rWwPU=; b=gwsO0461NDm4hzMy
+ /aP5LNjbfqB08SmlMEzcZ/MRNS7Ffjdvz9gsUyJR4DOilx71C5MvB0ZBvxEJF6pg
+ qcU4QPZtOzyixWx+3vL6eh4Sdt/RN5AD/6U6TJEZCPwdJNLMD5uB2OQjP87NG9Wj
+ 2aEs+kb//lRXz6Gy5d7CCDW3+1KSDzgIg/cYJecPjWsMKbyCxTeFTIkkdonetQyz
+ PSzkIDi3IBnca94koYTQyFTVvpUVHpC3QAq+jM9+xQJOItRbDHZjdPjLG6q1ML4W
+ zYHODhd8LupxL323rnWJQxtYu5Ver7g2LgPW3npNz/JEdF2Hq9b8G0w5U8qVJVHr
+    2nNuUA==
+Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4gd387e-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsd-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:07 +0000 (GMT)
+    Wed, 21 May 2025 22:45:53 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL6rr020545
+    by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjqLl023280
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:06 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:52 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:06 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:51 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
@@ -71,12 +71,13 @@ CC: <linux-wireless at vger.kernel.org>,
          Muna Sinada <quic_msinada at quicinc.com>,
          "Jeff
   Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 1/9] wifi: ath12k: push HE MU-MIMO params to hardware
-Date: Wed, 18 Sep 2024 14:20:48 -0700
-Message-ID: <20240918212056.4137076-2-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 1/9] wifi: ath12k: push HE MU-MIMO params to
+ hardware
+Date: Wed, 21 May 2025 15:45:31 -0700
+Message-ID: <20250521224539.355985-2-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -88,17 +89,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-ORIG-GUID: QTgqLsl2p5OGLwWEQsGrsmA8q68U11H8
-X-Proofpoint-GUID: QTgqLsl2p5OGLwWEQsGrsmA8q68U11H8
+X-Proofpoint-GUID: Zzf2Q5y4JzSN5f1E_vlCnvLRODG4zasa
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfXyLZVeJQcQf0U
+ 
B/O6/0+L+1nXg6SAFSC1bdc8B/eF8RxRnvbbX+YkF3RG14/UHGCF654g8ZXTq8oTCDzm3x5wmAk
+ 
i8wAlv0otog8iYaicRd5q/x9Vynwlo0e67/iHhH1K0rxsp5yagZ6L3XLS82iLDPuXzHP7ylgo+I
+ 
D0c1CMcLo4bGNe421uQk2jqRij3j1iAoI0gGSwcQqHRucJQSYetF+SSp/oDox9Dn2TqOagngt4V
+ 
UxzAxO13SoH2X7RyWe5NxhfbEjOUmHjfodyJhBfIYh4s5SCx8IDUn6jSorAnl5mh1ZmAfISyZCC
+ 
UqoQ2LDdmGl1HT3d4xvb7/ah09ru4wukKEcvP+HDrow6Xn/WsfgmRy6xdRv5vdNODiEv64XOGHa
+ TxrJA2l36xRwX82xvkyUzyQ1sIeXwbvD0Wn//AQSmFVE0uMJHnCwRE1OYRGf9Dd2p/mfZfFh
+X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=-_O-Wy8N5QNPZvNXkjkA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-ORIG-GUID: Zzf2Q5y4JzSN5f1E_vlCnvLRODG4zasa
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- malwarescore=0 suspectscore=0
- bulkscore=0 clxscore=1015 spamscore=0 adultscore=0 lowpriorityscore=0
- mlxlogscore=999 impostorscore=0 mlxscore=0 priorityscore=1501 phishscore=0
- classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2408220000
- definitions=main-2409180140
+ clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 
suspectscore=0
+ malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
+ lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
+ authcc= route=outbound adjust=0 reason=mlx scancount=1
+ engine=8.19.0-2505160000 definitions=main-2505210226

  Currently, only the HE IE in management frames is updated with
  respect to MU-MIMO configurations, but this change is not
@@ -112,42 +124,50 @@ Signed-off-by: Muna Sinada <quic_msinada at quicinc.com>
  Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  ---
- drivers/net/wireless/ath/ath12k/mac.c | 215 +++++++++++++++++---------
+ drivers/net/wireless/ath/ath12k/mac.c | 228 +++++++++++++++++---------
   drivers/net/wireless/ath/ath12k/mac.h |  15 ++
   drivers/net/wireless/ath/ath12k/wmi.h |  28 +---
- 3 files changed, 156 insertions(+), 102 deletions(-)
+ 3 files changed, 169 insertions(+), 102 deletions(-)

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -2851,6 +2851,108 @@ static int ath12k_setup_peer_smps(struct
+@@ -3138,6 +3138,125 @@ static int ath12k_setup_peer_smps(struct
                        ath12k_smps_map[smps]);
   }

-+static int ath12k_mac_set_he_txbf_conf(struct ath12k_vif *arvif)
++static int ath12k_mac_set_he_txbf_conf(struct ath12k_link_vif *arvif)
  +{
++    struct ath12k_vif *ahvif = arvif->ahvif;
  +    struct ath12k *ar = arvif->ar;
  +    u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE;
  +    u32 value = 0;
  +    int ret;
++    struct ieee80211_bss_conf *link_conf;
  +
-+    if (!arvif->vif->bss_conf.he_support)
++    link_conf = ath12k_mac_get_link_bss_conf(arvif);
++    if (!link_conf) {
++        ath12k_warn(ar->ab, "unable to access bss link conf in txbf 
conf\n");
++        return -EINVAL;
++    }
++
++    if (!link_conf->he_support)
  +        return 0;
  +
-+    if (arvif->vif->bss_conf.he_su_beamformer) {
++    if (link_conf->he_su_beamformer) {
  +        value |= u32_encode_bits(HE_SU_BFER_ENABLE, HE_MODE_SU_TX_BFER);
-+        if (arvif->vif->bss_conf.he_mu_beamformer &&
-+            arvif->vdev_type == WMI_VDEV_TYPE_AP)
++        if (link_conf->he_mu_beamformer &&
++            ahvif->vdev_type == WMI_VDEV_TYPE_AP)
  +            value |= u32_encode_bits(HE_MU_BFER_ENABLE, 
HE_MODE_MU_TX_BFER);
  +    }
  +
-+    if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
++    if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
  +        value |= u32_encode_bits(HE_DL_MUOFDMA_ENABLE, 
HE_MODE_DL_OFDMA) |
  +             u32_encode_bits(HE_UL_MUOFDMA_ENABLE, HE_MODE_UL_OFDMA);
  +
-+        if (arvif->vif->bss_conf.he_full_ul_mumimo)
++        if (link_conf->he_full_ul_mumimo)
  +            value |= u32_encode_bits(HE_UL_MUMIMO_ENABLE, 
HE_MODE_UL_MUMIMO);
  +
-+        if (arvif->vif->bss_conf.he_su_beamformee)
++        if (link_conf->he_su_beamformee)
  +            value |= u32_encode_bits(HE_SU_BFEE_ENABLE, 
HE_MODE_SU_TX_BFEE);
  +    }
  +
@@ -174,21 +194,30 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
  +static int ath12k_mac_vif_recalc_sta_he_txbf(struct ath12k *ar,
-+                         struct ieee80211_vif *vif,
++                         struct ath12k_link_vif *arvif,
  +                         struct ieee80211_sta_he_cap *he_cap,
  +                         int *hemode)
  +{
++    struct ieee80211_vif *vif = arvif->ahvif->vif;
  +    struct ieee80211_he_cap_elem he_cap_elem = {};
  +    struct ieee80211_sta_he_cap *cap_band;
  +    struct cfg80211_chan_def def;
++    u8 link_id = arvif->link_id;
++    struct ieee80211_bss_conf *link_conf;
  +
-+    if (!vif->bss_conf.he_support)
++    link_conf = ath12k_mac_get_link_bss_conf(arvif);
++    if (!link_conf) {
++        ath12k_warn(ar->ab, "unable to access bss link conf in recalc 
txbf conf\n");
++        return -EINVAL;
++    }
++
++    if (!link_conf->he_support)
  +        return 0;
  +
  +    if (vif->type != NL80211_IFTYPE_STATION)
  +        return -EINVAL;
  +
-+    if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
++    if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
  +        return -EINVAL;
  +
  +    if (def.chan->band == NL80211_BAND_2GHZ)
@@ -226,29 +255,22 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
   static void ath12k_bss_assoc(struct ath12k *ar,
-                  struct ath12k_vif *arvif,
+                  struct ath12k_link_vif *arvif,
                    struct ieee80211_bss_conf *bss_conf)
-@@ -2858,9 +2960,11 @@ static void ath12k_bss_assoc(struct ath1
-     struct ieee80211_vif *vif = arvif->vif;
-     struct ath12k_wmi_vdev_up_params params = {};
-     struct ath12k_wmi_peer_assoc_arg peer_arg;
-+    struct ieee80211_sta_he_cap he_cap;
-     struct ieee80211_sta *ap_sta;
+@@ -3152,6 +3271,7 @@ static void ath12k_bss_assoc(struct ath1
+     struct ath12k_sta *ahsta;
       struct ath12k_peer *peer;
       bool is_auth = false;
  +    u32 hemode = 0;
       int ret;

-     lockdep_assert_held(&ar->conf_mutex);
-@@ -2880,8 +2984,29 @@ static void ath12k_bss_assoc(struct ath1
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+@@ -3195,8 +3315,26 @@ static void ath12k_bss_assoc(struct ath1

-     ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
+     ath12k_peer_assoc_prepare(ar, arvif, arsta, peer_arg, false);

-+    /* he_cap here is updated at assoc success for sta mode only */
-+    he_cap = ap_sta->deflink.he_cap;
-+
-+    /* ap_sta->deflink.he_cap must be protected by rcu_read_lock */
-+    ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap, &hemode);
++    /* link_sta->he_cap must be protected by rcu_read_lock */
++    ret = ath12k_mac_vif_recalc_sta_he_txbf(ar, arvif, 
&link_sta->he_cap, &hemode);
  +    if (ret) {
  +        ath12k_warn(ar->ab, "failed to recalc he txbf for vdev %i on 
bss %pM: %d\n",
  +                arvif->vdev_id, bss_conf->bssid, ret);
@@ -267,10 +289,10 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        return;
  +    }
  +
-     ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
+     ret = ath12k_wmi_send_peer_assoc_cmd(ar, peer_arg);
       if (ret) {
           ath12k_warn(ar->ab, "failed to run peer assoc for %pM vdev 
%i: %d\n",
-@@ -3220,6 +3345,13 @@ static void ath12k_mac_bss_info_changed(
+@@ -3600,6 +3738,13 @@ static void ath12k_mac_bss_info_changed(
           ether_addr_copy(arvif->bssid, info->bssid);

       if (changed & BSS_CHANGED_BEACON_ENABLED) {
@@ -283,8 +305,8 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        }
           ath12k_control_beaconing(arvif, info);

-         if (arvif->is_up && vif->bss_conf.he_support &&
-@@ -5352,11 +5484,14 @@ static void ath12k_mac_copy_he_cap(struc
+         if (arvif->is_up && info->he_support &&
+@@ -6533,11 +6678,14 @@ static void ath12k_mac_copy_he_cap(struc

       he_cap_elem->mac_cap_info[1] &=
           IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK;
@@ -302,7 +324,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       he_cap_elem->phy_cap_info[5] |= num_tx_chains - 1;

       switch (iftype) {
-@@ -6318,71 +6453,6 @@ static int ath12k_mac_setup_vdev_create_
+@@ -7669,72 +7817,6 @@ static int ath12k_mac_setup_vdev_create_
       return 0;
   }

@@ -341,14 +363,15 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  -}
  -
  -static int ath12k_set_he_mu_sounding_mode(struct ath12k *ar,
--                      struct ath12k_vif *arvif)
+-                      struct ath12k_link_vif *arvif)
  -{
  -    u32 param_id, param_value;
  -    struct ath12k_base *ab = ar->ab;
+-    struct ath12k_vif *ahvif = arvif->ahvif;
  -    int ret;
  -
  -    param_id = WMI_VDEV_PARAM_SET_HEMU_MODE;
--    param_value = ath12k_mac_prepare_he_mode(ar->pdev, arvif->vif->type);
+-    param_value = ath12k_mac_prepare_he_mode(ar->pdev, ahvif->vif->type);
  -    ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
  -                        param_id, param_value);
  -    if (ret) {
@@ -371,22 +394,14 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  -    return ret;
  -}
  -
- static void ath12k_mac_update_vif_offload(struct ath12k_vif *arvif)
+ static void ath12k_mac_update_vif_offload(struct ath12k_link_vif *arvif)
   {
-     struct ieee80211_vif *vif = arvif->vif;
-@@ -7340,7 +7410,6 @@ ath12k_mac_vdev_start_restart(struct ath
-     struct ath12k_base *ab = ar->ab;
-     struct wmi_vdev_start_req_arg arg = {};
-     const struct cfg80211_chan_def *chandef = &ctx->def;
--    int he_support = arvif->vif->bss_conf.he_support;
-     int ret;
-
-     lockdep_assert_held(&ar->conf_mutex);
-@@ -7396,14 +7465,6 @@ ath12k_mac_vdev_start_restart(struct ath
+     struct ath12k_vif *ahvif = arvif->ahvif;
+@@ -8913,14 +8995,6 @@ ath12k_mac_vdev_start_restart(struct ath
           spin_unlock_bh(&ab->base_lock);

           /* TODO: Notify if secondary 80Mhz also needs radar detection */
--        if (he_support) {
+-        if (link_conf->he_support) {
  -            ret = ath12k_set_he_mu_sounding_mode(ar, arvif);
  -            if (ret) {
  -                ath12k_warn(ar->ab, "failed to set he mode vdev %i\n",
@@ -399,9 +414,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       arg.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR);
  --- a/drivers/net/wireless/ath/ath12k/mac.h
  +++ b/drivers/net/wireless/ath/ath12k/mac.h
-@@ -41,6 +41,21 @@ struct ath12k_generic_iter {
- #define ATH12K_TX_POWER_MAX_VAL    70
- #define ATH12K_TX_POWER_MIN_VAL    0
+@@ -51,6 +51,21 @@ struct ath12k_generic_iter {
+ #define ATH12K_DEFAULT_SCAN_LINK    IEEE80211_MLD_MAX_NUM_LINKS
+ #define ATH12K_NUM_MAX_LINKS        (IEEE80211_MLD_MAX_NUM_LINKS + 1)

  +#define HECAP_PHY_SUBFMR_GET(hecap_phy) \
  +    u8_get_bits(hecap_phy[3], IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER)
@@ -423,7 +438,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       ATH12K_BW_40    = 1,
  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -2995,31 +2995,6 @@ struct ath12k_wmi_rx_reorder_queue_remov
+@@ -3079,31 +3079,6 @@ struct ath12k_wmi_rx_reorder_queue_remov
   #define WMI_VDEV_PARAM_TXBF_SU_TX_BFER BIT(2)
   #define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3)

@@ -455,7 +470,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   #define HE_MODE_SU_TX_BFEE    BIT(0)
   #define HE_MODE_SU_TX_BFER    BIT(1)
   #define HE_MODE_MU_TX_BFEE    BIT(2)
-@@ -3031,8 +3006,11 @@ struct ath12k_wmi_rx_reorder_queue_remov
+@@ -3115,8 +3090,11 @@ struct ath12k_wmi_rx_reorder_queue_remov
   #define HE_DL_MUOFDMA_ENABLE    1
   #define HE_UL_MUOFDMA_ENABLE    1
   #define HE_DL_MUMIMO_ENABLE    1
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-2-wifi-ath12k-push-EHT-MU-MIMO-params-to-hardware.patch 
b/package/kernel/mac80211/patches/ath12k/104-2-wifi-ath12k-push-EHT-MU-MIMO-params-to-hardware.patch
index 65ef65fa7fb720..7cc5113b0b392b 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-2-wifi-ath12k-push-EHT-MU-MIMO-params-to-hardware.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-2-wifi-ath12k-push-EHT-MU-MIMO-params-to-hardware.patch
@@ -1,68 +1,68 @@
-From patchwork Wed Sep 18 21:20:49 2024
+From patchwork Wed May 21 22:45:32 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807210
+X-Patchwork-Id: 14096119
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id B81C317967F
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:12 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 697B71A23AA
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:58 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694474; cv=none;
- 
b=SYN3tI9xaTiXuxK7CUAD6gXBOqoyS1qZxAGNOXDt4yS1Q6oU0YiwQonIkVrnux7/DC3bCm2JScN5vIxVzkGOkFztaIHlZMM/TRsp6GzSIbZdasVpxySumoe965kRna+5fYAmf4i3wJupfj9p6509u7j6kXzz1ZxlSStR4wLObcE=
+    t=1747867560; cv=none;
+ 
b=XceXZ7CY2+FEzM9RuC10/cGW+vmyB2cX8QWJ3ckav7jiY5NYBQe1XW2asWcHaAEmOwdUh2iRT6imeiQLYue78g4UAcBErvihTGqlYL0m+10CQMNHmQZurUQkLPeFS0WAwlA+HBgcdp+Z71PhXs/ttQD6dF/8mlPaeGqxlTUoEcM=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694474; c=relaxed/simple;
-    bh=yQPaApb7knqLxhkxSrizMfAanw18TDUbxBPbfnhzlV0=;
+    s=arc-20240116; t=1747867560; c=relaxed/simple;
+    bh=mXjCwVOeMuqCjiNDATjkwHPrwNjm6Uv3d5yO5+bqbfk=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=W+Rk8/tiKUvP6A8WYQFxi97//4Yj4m/rYPXAg0YP+6K+GXDcFK2VD+yEzmymA/fsenli+7ZEJ1zH6XgzLe4+1QFctCYGnq1LPoD01a4AIF8VqJGVdgs6e1ZwCKv8AOLkZUb09QkmM8Ur4R1xFhc4oVqhlvm3NMc24NERWmxzGjI=
+ 
b=SeDDAI+0lqXCMqhleIhxgpdPq9QuWaPI9jj0JOqYiwOIVtAsNqQv7KQ+AMvXDQTsIe0LfA2l23stlXB7sLNpKHTM9JhPsLkafU7mvBaiwTxaJR5tEi4zGQZhsrKSn/awYszamnM81hQS3r9bBgS4oe8AeFV2/lDXYPXNHCGv0+w=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=XJxqlj7h; arc=none smtp.client-ip=205.220.168.131
+ header.b=DwzHO5rL; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="XJxqlj7h"
-Received: from pps.filterd (m0279867.ppops.net [127.0.0.1])
+ header.b="DwzHO5rL"
+Received: from pps.filterd (m0279869.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48IHKWuA006417;
-    Wed, 18 Sep 2024 21:21:08 GMT
+ 54LJflLg012749;
+    Wed, 21 May 2025 22:45:53 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    hcoreX5pgczyblwh1gpL6Ax4OV0yrVpAaKX7psGXczI=; b=XJxqlj7hhoW4GYMB
- +B9r7ajbqV+ZxP+/1uDt5veOBY8aQgsorBoEbZFKm+ccV0u5SQJ/fFSomLg8QYpE
- iojXUyYsGJMsXSPW+OdC0DQ2JrhDEHWFQa/6c3C0sdBE5IGgTa8YiAmYAx/A1ti1
- ruMNSyT8H/xEKkR953axz1DOGJZfp9dCtOM5Xw6nrqpeUEYBShgvQ+1LLXqrH8U4
- qUlYW2vKFKJgZUe97nwRrwOiunhTD4M2ARe6xHqZ7bL+2bW27sRTSI69vGrcEdKM
- Ied7A8KmlUAN5BBsOj5MeKAaoy0+h4iY/9W3JgDfOu+LwjuAaKzgPNrttmPehdhJ
-    Q8q0JQ==
+    tiHJ0bp145D1K0TKBussv+a5p9S+5sP37NuNrmk03fg=; b=DwzHO5rLl1Vp87qm
+ lpxifM2nR9pLT0mgMqz/HRb/yTHCnS9oGDXzc24mnve2I/O9X/YT8q8qN+wjBlLB
+ 4W7snIItVpffzrSmAJupTNtzj8qbmIYeti1zUlDdVoesUaICbdiDvSeCWPUtfeaz
+ tNKDOmBUTvCb+1qxxciQZhuRobmmkuRgcg8VkgCFP+OyG5o1OrUESYu3QeZ62Hle
+ ODt78jw+qe8cE9e2TxGEZhy++loik0tbF8D9P3cX5L+CdB+i4TyWnFxwvNgJciIx
+ RptE1lyB75UdrnAqETq0km4svwyidUuum/x0hqd6TvlDod3b7FD4tjbE7EP5iQ5V
+    Dw2tXA==
  Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4kjk65k-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf9carr-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:07 +0000 (GMT)
+    Wed, 21 May 2025 22:45:53 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
      by NALASPPMTA01.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL7IZ032342
+ 54LMjqtS008810
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:07 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:52 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:06 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
@@ -71,12 +71,13 @@ CC: <linux-wireless at vger.kernel.org>,
          Muna Sinada <quic_msinada at quicinc.com>,
          "Jeff
   Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 2/9] wifi: ath12k: push EHT MU-MIMO params to hardware
-Date: Wed, 18 Sep 2024 14:20:49 -0700
-Message-ID: <20240918212056.4137076-3-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 2/9] wifi: ath12k: push EHT MU-MIMO params to
+ hardware
+Date: Wed, 21 May 2025 15:45:32 -0700
+Message-ID: <20250521224539.355985-3-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -88,17 +89,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-GUID: DiIEaDHD4453WG2b31qitb3_i0JkAM4u
-X-Proofpoint-ORIG-GUID: DiIEaDHD4453WG2b31qitb3_i0JkAM4u
+X-Proofpoint-ORIG-GUID: _eaDrXLa14UhDtRJT-hk8Y6z1fwFI6QB
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNSBTYWx0ZWRfX7QgTyyXEHZM8
+ 
OnUvphQD/4J77Z8iHm4hJQIe6duMI5HbpiWELH5aRxqU7pFuvCjmltcmWPjwls9DzTkJnDGHMjo
+ 
FuBarQpMaZO8eQsx97aM8WpE0dpJHROE1ZRZ3SV8VEoTHHG712fvPw+oUWaZo6WccaEbxH9x9+W
+ 
n76tkFOOopbjRgOBmCokHCrfZmCMKcT4FLUFoiIDn0Fv8b/WKaut3Z+1hrEwcOuXCJv4X1QIOcx
+ 
6NCnxNr8y1O1cwqXg3pBhHB+BpcLiEat6TlD9bH/5oUZHFce4W1jkZYs2J5VJnzLDeQxq8xBhP0
+ 
Qal3bpuUPyWAMKZKH/uAEXwEZ5ZMghUioGuc78EBMJhSXa2VsT3lhmJtc/CaHDqNKFrp01I/KAh
+ 7UcIN/PKb8qOKrHE8/8cpuHgoBgB24X84Qo5rORKfnW4s7FbS0xkcs2ZV2TI0AIGz4eEZAOY
+X-Authority-Analysis: v=2.4 cv=GawXnRXL c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=uoU_VXRAPQDrZd00miQA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-GUID: _eaDrXLa14UhDtRJT-hk8Y6z1fwFI6QB
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- bulkscore=0 adultscore=0
- suspectscore=0 mlxscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0
- phishscore=0 impostorscore=0 mlxlogscore=999 priorityscore=1501
- spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1
- engine=8.19.0-2408220000 definitions=main-2409180140
+ mlxscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0
+ priorityscore=1501 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0
+ spamscore=0 suspectscore=0 adultscore=0 classifier=spam authscore=0
+ authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1
+ engine=8.19.0-2505160000 definitions=main-2505210225

  Currently, only the EHT IE in management frames is updated with
  respect to MU-MIMO configurations, but this change is not
@@ -113,30 +125,38 @@ Signed-off-by: Muna Sinada <quic_msinada at quicinc.com>
  Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  ---
- drivers/net/wireless/ath/ath12k/mac.c | 50 +++++++++++++++++++++++++++
- drivers/net/wireless/ath/ath12k/wmi.h | 21 +++++++++++
- 2 files changed, 71 insertions(+)
+ drivers/net/wireless/ath/ath12k/mac.c | 58 +++++++++++++++++++++++++++
+ drivers/net/wireless/ath/ath12k/wmi.h | 21 ++++++++++
+ 2 files changed, 79 insertions(+)

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -2953,6 +2953,50 @@ static int ath12k_mac_vif_recalc_sta_he_
+@@ -3257,6 +3257,58 @@ static int ath12k_mac_vif_recalc_sta_he_
       return 0;
   }

-+static int ath12k_mac_set_eht_txbf_conf(struct ath12k_vif *arvif)
++static int ath12k_mac_set_eht_txbf_conf(struct ath12k_link_vif *arvif)
  +{
-+    u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
++    struct ath12k_vif *ahvif = arvif->ahvif;
  +    struct ath12k *ar = arvif->ar;
++    u32 param = WMI_VDEV_PARAM_SET_EHT_MU_MODE;
  +    u32 value = 0;
  +    int ret;
++    struct ieee80211_bss_conf *link_conf;
++
++    link_conf = ath12k_mac_get_link_bss_conf(arvif);
++    if (!link_conf) {
++        ath12k_warn(ar->ab, "unable to access bss link conf in eht 
txbf conf\n");
++        return -ENOENT;
++    }
  +
-+    if (!arvif->vif->bss_conf.eht_support)
++    if (!link_conf->eht_support)
  +        return 0;
  +
-+    if (arvif->vif->bss_conf.eht_su_beamformer) {
++    if (link_conf->eht_su_beamformer) {
  +        value |= u32_encode_bits(EHT_SU_BFER_ENABLE, 
EHT_MODE_SU_TX_BFER);
-+        if (arvif->vif->bss_conf.eht_mu_beamformer &&
-+            arvif->vdev_type == WMI_VDEV_TYPE_AP)
++        if (link_conf->eht_mu_beamformer &&
++            ahvif->vdev_type == WMI_VDEV_TYPE_AP)
  +            value |= u32_encode_bits(EHT_MU_BFER_ENABLE,
  +                         EHT_MODE_MU_TX_BFER) |
  +                 u32_encode_bits(EHT_DL_MUOFDMA_ENABLE,
@@ -145,14 +165,14 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +                         EHT_MODE_UL_OFDMA_MUMIMO);
  +    }
  +
-+    if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
++    if (ahvif->vif->type != NL80211_IFTYPE_MESH_POINT) {
  +        value |= u32_encode_bits(EHT_DL_MUOFDMA_ENABLE, 
EHT_MODE_DL_OFDMA) |
  +             u32_encode_bits(EHT_UL_MUOFDMA_ENABLE, EHT_MODE_UL_OFDMA);
  +
-+        if (arvif->vif->bss_conf.eht_80mhz_full_bw_ul_mumimo)
++        if (link_conf->eht_80mhz_full_bw_ul_mumimo)
  +            value |= u32_encode_bits(EHT_UL_MUMIMO_ENABLE, 
EHT_MODE_MUMIMO);
  +
-+        if (arvif->vif->bss_conf.eht_su_beamformee)
++        if (link_conf->eht_su_beamformee)
  +            value |= u32_encode_bits(EHT_SU_BFEE_ENABLE,
  +                         EHT_MODE_SU_TX_BFEE);
  +    }
@@ -168,9 +188,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
   static void ath12k_bss_assoc(struct ath12k *ar,
-                  struct ath12k_vif *arvif,
+                  struct ath12k_link_vif *arvif,
                    struct ieee80211_bss_conf *bss_conf)
-@@ -3351,6 +3395,12 @@ static void ath12k_mac_bss_info_changed(
+@@ -3744,6 +3796,12 @@ static void ath12k_mac_bss_info_changed(
                   ath12k_warn(ar->ab,
                           "failed to set HE TXBF config for vdev: %d\n",
                           arvif->vdev_id);
@@ -185,7 +205,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -1139,6 +1139,7 @@ enum wmi_tlv_vdev_param {
+@@ -1152,6 +1152,7 @@ enum wmi_tlv_vdev_param {
       WMI_VDEV_PARAM_BSS_COLOR,
       WMI_VDEV_PARAM_SET_HEMU_MODE,
       WMI_VDEV_PARAM_HEOPS_0_31 = 0x8003,
@@ -193,7 +213,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   };

   enum wmi_tlv_peer_flags {
-@@ -3012,6 +3013,26 @@ struct ath12k_wmi_rx_reorder_queue_remov
+@@ -3096,6 +3097,26 @@ struct ath12k_wmi_rx_reorder_queue_remov
   #define HE_MU_BFER_ENABLE    1
   #define HE_SU_BFER_ENABLE    1

diff --git 
a/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch 
b/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
index 1d6c9cc7dbd94f..f1eb22afe0bae5 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
@@ -1,68 +1,68 @@
-From patchwork Wed Sep 18 21:20:50 2024
+From patchwork Wed May 21 22:45:33 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807213
+X-Patchwork-Id: 14096126
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
- [205.220.180.131])
+Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
+ [205.220.168.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B2B11CB312
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:14 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4E00239570
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:46:01 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.180.131
+ arc=none smtp.client-ip=205.220.168.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694475; cv=none;
- 
b=uo8JC/iAnxSCZyXzNFarViwWJNwY+JldG9aDgn6LOK7yCxMusODCN3rw4mSCs0sLxHrfxFouDKWpiKeM7hGb/fzQzU2eh6bHNvzhjOqaTjAsJo7sVGj4L2QK1UPb2ZxMke35L51ztNTVhAc7IS17sn6blDZnU+1+RGRKXskHc78=
+    t=1747867563; cv=none;
+ 
b=m0NU8tyG2d1pHiYNjTYhCTeGXC0pFtHNZTKxb+dc5AEzzUCa75lxPxtYFZApv1QHaLqo3lGkZ+ADhqhj/V82GA+bUeetm3hSsnyGgjbayU3IzqeO09+VPkt9sx9hdrTMlVGEI4c5881Zho41rlVW65O/SlmqRi4J/ajQzA4tiGQ=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694475; c=relaxed/simple;
-    bh=nhEu2OadboIpWVwShgMmYabjiVuEo2mUKJhJlcUzvgI=;
+    s=arc-20240116; t=1747867563; c=relaxed/simple;
+    bh=0bTV82dMwisd7nmbtolnSKswG/aTjqN0YxpAx66Oqv8=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=iPc43CIgA4O9RfgxO3cfBBvDShW3nh4Q/MVoL1JTtx8u/9t1CeFY7KstjtKiPdJ6vxx0yhZwXcwCRFfbZdfRduyybDRKPmgqN/VogzkwizBSFWBL41H02pCvee2mV3poTyZz9CnCJ5L7An5k7ARI3Eo6EwsgaAYIncO/tU2Jsao=
+ 
b=jOkezej/N9fmvOtPNCGPpnPNtoQ+pAG4k1zAiw3xnL1iikk7VcJlbXDCrGUithxMZE2513zz/fsfDjXx0AMi4YT1ISljvGCw9B0dGQ5ECiFfoGLc+12nnsvqjiXI5zla6C1iX7bgtJjv/OYWzoY0TR5jI28CZWC/Pa9fT/X0duw=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=iXyzdRBT; arc=none smtp.client-ip=205.220.180.131
+ header.b=UqUMYAcW; arc=none smtp.client-ip=205.220.168.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="iXyzdRBT"
-Received: from pps.filterd (m0279869.ppops.net [127.0.0.1])
+ header.b="UqUMYAcW"
+Received: from pps.filterd (m0279866.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48I90GrT001584;
-    Wed, 18 Sep 2024 21:21:09 GMT
+ 54LIDlKw013406;
+    Wed, 21 May 2025 22:45:53 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    aj0umwCwR0cGrc/Vc7qz7QRYcnU4amMo6KwLL9RZRaA=; b=iXyzdRBTMie5qv2n
- KocnG3cRtZjxDUMbNTj+in3o4zrIU5RFumLb3ZmgpbCZD9jcmxkc9fcTdtwxUz8e
- LTodO1mKSkqtOufy45keXIYYJN3lxfFsZtA5bcmG+QCJZJmPaTpMaf9L9Us9e+JZ
- Ngjh4JNR3UIXn5+UvNGrRNEWeAlCrwf9Z5bWl1mQmwmkVVuH3nMu1IyPidF3tzRk
- AdQTPkPtpnoGlYwEWL/noPAYTf4OuZrqPCAj31iBfZvq2RjAdWtPx/ayYEQsNKCu
- xoBLKjb8hppxfGqn06TpV73nTxvhEDwnwBTwfgrr+xVeKvwz6Mrh8aoYBdUeFUAh
-    OiuxDA==
-Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com
+    tYXOeicncMlFjsw5kmnB5kxC/Nrj/HibF1jgO4m8lhM=; b=UqUMYAcWWQ07Z79h
+ GESSroshxr6zIUBw3jr/ESGDCO554RYWZZh9PXJxjTRM3ceCrNHNpCAT+mqXXiWy
+ eb+l7G0W+s1l/MStBq7B43CSdKxljZtlkC/JsHk6DQjBacQzVB8qAiq3ShbR/vn7
+ ud3kzjHtYsfLvIpi+8wLTkE1in8E/CUFZ4bea866xldnrcOVEa7EuxKwKXj3sLhE
+ 8n3IsPUIYGLKnEFkmWFZTXTqlEOV9lVYdTxeDAUBxII8PQIKu+dlB/UWffTFTSOd
+ aQDPK5N6y8x29E2fugyy2XBSEFskz50Jb60+kJhHFGTgl5cQw+NfymuC9SQJBWaE
+    HFZu+w==
+Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4hf38cn-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwh5cfg1-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:08 +0000 (GMT)
+    Wed, 21 May 2025 22:45:53 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA03.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL7e8005093
+    by NALASPPMTA02.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjqn9020293
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:07 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:52 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:07 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
@@ -71,13 +71,13 @@ CC: <linux-wireless at vger.kernel.org>,
          Muna Sinada <quic_msinada at quicinc.com>,
          "Jeff
   Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 3/9] wifi: ath12k: move HE MCS mapper to a separate
- function
-Date: Wed, 18 Sep 2024 14:20:50 -0700
-Message-ID: <20240918212056.4137076-4-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 3/9] wifi: ath12k: move HE MCS mapper to a
+ separate function
+Date: Wed, 21 May 2025 15:45:33 -0700
+Message-ID: <20250521224539.355985-4-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -89,17 +89,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-ORIG-GUID: zHmCiFNBcWNOH7v_I9cuj0l6gmfKvBVa
-X-Proofpoint-GUID: zHmCiFNBcWNOH7v_I9cuj0l6gmfKvBVa
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX0c42ymLt+PTP
+ 
1OuRw1LMafhFmBy7Y+zhs50WttVxoryUfqamicOcfcFB1N0ReYFgzeQ7geC/w54E8E6mzQDYeie
+ 
WWkPGvuIyvtCjzhBcBwz1A7W/LdsI7Od6+VlXyCuAp4pbCASB7kqVnI7Neak6mvdIQIW5khVLX7
+ 
r/364Kop8/BPQzOVUZf5snfx4TBCgWauiHZQBTJupIn1Tf8+NctUXB8H3QNfu8zJTLVrBA3rtt1
+ 
+yjeNOHom4U/t0u5Vzxu+8XctXsWHoYytfluXbsRo7WNut0MwPSY8GCm7RQ2wDQp0CzdactGb6t
+ 
KCMvNcpkDRjEtOdkNtf2BeVHF1yJKxuibe6qssobLjTadJRkC33xnz5E+hzF6sEZlg7JWok01h4
+ OxWFUldQYnF/eQjZYTQcgLyH91h9gWkvz0YJWKGCrg0PlxqeIFS/SQvVNs7qMnsX0qrXb7NV
+X-Authority-Analysis: v=2.4 cv=XeWJzJ55 c=1 sm=1 tr=0 ts=682e57a1 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=4Pgy4kl5F6fn7-PMLAkA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-GUID: CVZHk1FyIP3eCYHbVaXVp1fjSAGIjnVJ
+X-Proofpoint-ORIG-GUID: CVZHk1FyIP3eCYHbVaXVp1fjSAGIjnVJ
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- priorityscore=1501 mlxscore=0
- suspectscore=0 bulkscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015
- mlxlogscore=999 adultscore=0 malwarescore=0 phishscore=0 impostorscore=0
- classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2408220000
- definitions=main-2409180140
+ phishscore=0 clxscore=1015 mlxlogscore=999 mlxscore=0 bulkscore=0 
spamscore=0
+ suspectscore=0 impostorscore=0 adultscore=0 malwarescore=0 
lowpriorityscore=0
+ priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc=
+ route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
+ definitions=main-2505210226

  Refactor the HE MCS mapper functionality in
  ath12k_mac_copy_he_cap() into a new function.
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch 
b/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
index fe33f85a1968d1..32bed9f8505cd3 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
@@ -1,68 +1,68 @@
-From patchwork Wed Sep 18 21:20:51 2024
+From patchwork Wed May 21 22:45:34 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807215
+X-Patchwork-Id: 14096123
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
  Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
   [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A88651CB32C
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:14 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3C04239581
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:57 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
   arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694476; cv=none;
- 
b=Lkqx2oSLyeGRxKcm+N4Vmg+KOuwHpt6xhgWj9SpyWNXxxWkVExVyHvPrWaP/u4OXd0YjYBJC3Dg0NJYY9WJyL0A3RP8GK++s9CiRloNaEmEjI71S/f3+0HVXu5bCmi8cyiIMFzCpAcNuZ67J7r/WxvNRbeox3iZHmXK1WFUb4Hs=
+    t=1747867561; cv=none;
+ 
b=JUfYB6YNOea3E6luldlHf63eW7OUVXEtawJXGCeH7nt9iIJpG0ODfz3v+Zl+gtQtUZ1ELh/UAhCubbThHH30w661eEN5+cQarbiqdd1cN5dnkAsmZUNSD6l//QpurFV6Wsvv4Nr2fYgyuAVHf9JDoITZKNEbIki68J7WTV+fieU=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694476; c=relaxed/simple;
-    bh=nv4kc89H7eGC0FLgCwC70zFDhNkClMNiRf5HjDZHHuQ=;
+    s=arc-20240116; t=1747867561; c=relaxed/simple;
+    bh=e6/wBkUC5dKwNLeEqNLmC/3pJt4EcGfxZRx+zntD5Ek=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=B1oJWv7vHZKRChjamOFJnRzQVtL7qBs7/Ho9GojLQtHyCKtrCEOJt/lWvhkqISf48/5MaQOCdkHhCrQT/eHP9hZ1wnCdeOKXh6Wmk/QYt9yEcc0X6HT5wUxgpaA3PooH/cMlJCX0c8hyhT7XBm6vWnPwQjt/FnLTubA3uj+X8oE=
+ 
b=bg3Y4gdyPqhSKZtqqeN+SjMvTgg+BVUsyqAvkS3YPjV+C7dPwxcByNFjDRsuBqwHuSvgolo2ISExqyfJkgT6Flp4H+hriFJHcMdI0WmDf9NrBPI+E07JvNLDvP5X59C6pSrqpjXYngUV6AvPCJL7ynVBFF80h0neCm0IRu8Ur8w=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=WweZPnje; arc=none smtp.client-ip=205.220.180.131
+ header.b=LbIprPEi; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="WweZPnje"
-Received: from pps.filterd (m0279872.ppops.net [127.0.0.1])
+ header.b="LbIprPEi"
+Received: from pps.filterd (m0279873.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48IACJst031540;
-    Wed, 18 Sep 2024 21:21:09 GMT
+ 54LIdAVE024983;
+    Wed, 21 May 2025 22:45:54 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    ARu9Fu0s66NeuLm2pdCBchANS+rlgd275Q/E4KE2T1o=; b=WweZPnjehL/ZQW57
- 4JHJDsl8A5hyljMaJrVPdmZwNktTurJPMpD5z0akqx2dq3bfjzx2rx5NAtMb831x
- ieysvT1ApK5V32fmb9xzG7FMIU3DH4eqr/9ApZbHFVPTglHrVoVzHJLps3I+Ts5P
- gi1dsIAdwTai7hW1FchcW/pZ2kJMq6zN7oljoFs7pc1CvzHfIJowQM8gFfslkqlL
- lvm9A9knvnUlkrEvzgpoZfZxm/91t9bQzkQDTX91wRc0oGR/9liT+z4Sdum2rLwb
- fri8rhQIw8w1ExGM1nzChPaajmDIsE86ODjDL2xBbd/DcdsVvOYl8ewJ8AX45qNs
-    +LpHtg==
-Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com
+    oR9JZ4DE7PwiZ/DcP72BpK9yTZspsBeRbWSrP3w24nY=; b=LbIprPEif55TZs6Z
+ ZsvTaIhFDxESbkxn/avX548dzh51JY3wFWHowpcPEnJJdIE1oNPWkxrPo0hHkyUb
+ UICPtIHoZHdMwN/uHPyglzBnBLNP82LGLHZI5eHx6jVz4INyCFm1Gmof8YNLLIo/
+ pTKj4Qx3OO0jH6zSnAoKIIg39v5TWetjVZbL2qbNR+GImD0RtoefBQxRgyJWn11r
+ O3ycFAW9xlW8wYJql07vue+hM3MWNtk5EPqF70c7JrrmMAYvTyOFuP0Kaf11szIB
+ mF4bMyb+bb1/QA6moW7LDIoDBWEjCLINcTdGUPTnwnfBWlxZJhZoMqzU9ZuZgvsR
+    1UjthA==
+Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4j6uagq-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf4vc5x-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:09 +0000 (GMT)
+    Wed, 21 May 2025 22:45:54 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA03.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL8gM005103
+    by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjrWL023291
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:08 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:53 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:07 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:52 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
@@ -71,13 +71,13 @@ CC: <linux-wireless at vger.kernel.org>,
          Muna Sinada <quic_msinada at quicinc.com>,
          "Jeff
   Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 4/9] wifi: ath12k: generate rx and tx mcs maps for
- supported HE mcs
-Date: Wed, 18 Sep 2024 14:20:51 -0700
-Message-ID: <20240918212056.4137076-5-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 4/9] wifi: ath12k: generate rx and tx mcs maps
+ for supported HE mcs
+Date: Wed, 21 May 2025 15:45:34 -0700
+Message-ID: <20250521224539.355985-5-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -89,17 +89,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-ORIG-GUID: wHJ63GZpWGKZ4XSyQZiVlsARNAgr5CQM
-X-Proofpoint-GUID: wHJ63GZpWGKZ4XSyQZiVlsARNAgr5CQM
+X-Proofpoint-GUID: mYgnUwiU6CWGXCKmK4mo491eQG1yf62Y
+X-Proofpoint-ORIG-GUID: mYgnUwiU6CWGXCKmK4mo491eQG1yf62Y
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX1nkoUF8smaXX
+ 
IWIOVUfe7hMPdAVBJy7J1imFvumQnVaEdoZ98Hgv5FTjeK2Ebgl2R2fohvg1z4LsyCLnU8qfg96
+ 
1OdC0+PM8u7DhRIEnk7H2EZt0UJoJRxlc7daiIvimTjbBLu53yfgzses5Gth0zLCzoih5ffW/H5
+ 
1h2tf1ZE4W6AmHjQJc+WE0P3RhBMdl286VT/kc0ko03He0+5/QdxsynqL2e4svB4f3035pzXOEK
+ 
dUS4nBFSZJXuBkq0d//SizRJgH9egq51A/OVPm8om04qEcOK3x9OmrrborAen5I0iuLaqAMMBXa
+ 
nlUKQ4fpPRovjAByevo6BIIwB698Nmo72bZcFiWOocONR92lAssB6pFXJnuwOC6VQ7MJE7DKc0x
+ 5UnlyGSMzMAM7cQXuGFk1AK16e6Tu/rC5YA6A4ogDKajrcBGepxGFKcZ+xK4+BwuwgI4Qysv
+X-Authority-Analysis: v=2.4 cv=R7UDGcRX c=1 sm=1 tr=0 ts=682e57a2 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=WmtfbAKxhnfIJFSrnnQA:9
+ a=TjNXssC_j7lpFel5tvFf:22
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- phishscore=0 mlxlogscore=999
- mlxscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 clxscore=1015
- adultscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 impostorscore=0
- classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2408220000
- definitions=main-2409180140
+ phishscore=0 clxscore=1015 mlxlogscore=999 priorityscore=1501 spamscore=0
+ bulkscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 mlxscore=0
+ impostorscore=0 adultscore=0 classifier=spam authscore=0 authtc=n/a 
authcc=
+ route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
+ definitions=main-2505210226

  Generate rx and tx mcs maps in ath12k_mac_set_hemcsmap() based
  on number of supported tx/rx chains and set them in supported
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch 
b/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
index e1d109cd569ab8..50225e7bd41479 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
@@ -1,81 +1,81 @@
-From patchwork Wed Sep 18 21:20:52 2024
+From patchwork Wed May 21 22:45:35 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807211
+X-Patchwork-Id: 14096120
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77FB41CA6AC
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:13 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3B9F239570
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:57 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694475; cv=none;
- 
b=RN/ddoo5Vh8RVGeYZ8k8lXTOb7bzs7wSIAQGFjyvpfc9NICOpTDXpM3ai/D/fFtXLR8mFmYa4uIMFdrWML1x/UjZtd+jJnNyL/jo4/t5+ONN0nU4brd/dW7fv/biqLA6CkFbjnw01XnInXLzGT8IIm4NvxBkMy/RVj0tC33y7os=
+    t=1747867560; cv=none;
+ 
b=GmlOnDZdpnT/77kfeg7qPbZIn+pp+Rv41/WYnHylPZroDHwpWp5rzjObHMVoVIVB8f5dpHJSWNb5ucf0EdCqAqynnnDnAHne0d3j8kMBBH6ZVQr4AnIsYhkIrbmy6o7JffEBF094XVxGwQTjyWSEPi6VY94Md6L1NnuF0J5lJXw=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694475; c=relaxed/simple;
-    bh=bsvgv033jSAPUVmS0VlMcScTn/1aM6tw3aACOOiqxvA=;
+    s=arc-20240116; t=1747867560; c=relaxed/simple;
+    bh=Xdsuttpv57eTzMnRm7g3A0+frkCx/SnGj1xOjVOXHng=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=rDT2TKhzEg9vR1RSVstUP/e9Z+sWhPbag7vxjm3nmkSJBFS5bR72jSO3YnpEGSQLOgd0c+ou8ce0GQOHHZBEpr8VlMP4o6SK8T3BVg4yPiHhqLzwadektVXzAofZ0K+caSvYUjsPvDd2wH1xDyUPHgvr/DjsPh8bhO1MP80pTYk=
+ 
b=DCZ4pyonUsAaIuBQUBu/1NYBINM2V/yqfV+6ngHC6I8x7PP5e0WLPB1zEyJgRG752GtXxlhP3WdI6a+eW/8O0I64lNeSLtCeGZQ2ljn0mAfcuMtjB3rZq3UejFTR8v3I78Chfhv8/eSjfW7gSO+sswpSCXiFykPgseD3Hhz6W/4=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=DbZeRJ9u; arc=none smtp.client-ip=205.220.168.131
+ header.b=n5c8p9dB; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="DbZeRJ9u"
-Received: from pps.filterd (m0279867.ppops.net [127.0.0.1])
+ header.b="n5c8p9dB"
+Received: from pps.filterd (m0279869.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48I9TNqc020283;
-    Wed, 18 Sep 2024 21:21:09 GMT
+ 54LIhKMc027654;
+    Wed, 21 May 2025 22:45:54 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    azR+5F3oXqRD0oIXJq+q0F3HbuiVUYwPuvX5vVskhnw=; b=DbZeRJ9uo40mL5rR
- p0cASEsdLU8yr/aYeIXTSWCHBf5P73m5S26EYVv6MqTdcnmRT7flYyQWzotNV+gg
- oHJpR7L5sN+omhK+7gDPRcm5j29/U9+7rMG7I0JwrfR6KbUUNJkrg+omW45ZdRPS
- /92XJynSBDgzEGETs0AjLe+PLPW4Ucnncc+YscEVm/dtR4f5vQBYwGdCwv4IuczO
- FJrEmDh3mj7m6JtNVV+A3LT5qS7PCAbiS7qhTAkDfhH9gDZJuUTO2b6ByyO4UkWp
- afB41wIc4KUDYsTHkThkApxxp0vHfJJLGCweUi+YKYaqvQETgLhHx/UkSRdoRBII
-    N708pg==
+    igBIHxXxEIGErFGPWQKC8rBeF0DUPvb+tsDy6dmbEUQ=; b=n5c8p9dBo/+917ae
+ iUuuRoUPhgwmxRjEorR4N5thttRSLen0XwHulOSFzfVHZvX/ZX7Xb8qa67RpJUAw
+ jx3TGu38TFybZ9zCbXxa3PoR7FqIyl7TyaU+RpGmjLnDTRjq5ODiDDkcGM8aLJ6C
+ pgH1JDyjAtZODpP3W+kKpoMlU/N8QCB8wVOob4E3+nH0XDeYWh0cSY4dAnFcFYsC
+ dgkUoVt65T3wJptGX80bBT1muPG/3O+IiWrYoP6NVayscmgOnCqKVpuSjYrEn/02
+ HlxMp7yg/I4LhlQquL2SfmAXdKThQLrOF/XiFsCW2VZETvSbXsLI0NXYRbRFUxC4
+    e9SLmw==
  Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4kjk65m-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf9cars-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:09 +0000 (GMT)
+    Wed, 21 May 2025 22:45:54 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
      by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL8Gi009579
+ 54LMjrc1023294
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:08 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:53 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:08 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:53 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
          Pradeep Kumar Chitrapu
      <quic_pradeepc at quicinc.com>,
          Jeff Johnson <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 5/9] wifi: ath12k: fix TX and RX MCS rate 
configurations in
- HE mode
-Date: Wed, 18 Sep 2024 14:20:52 -0700
-Message-ID: <20240918212056.4137076-6-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 5/9] wifi: ath12k: fix TX and RX MCS rate
+ configurations in HE mode
+Date: Wed, 21 May 2025 15:45:35 -0700
+Message-ID: <20250521224539.355985-6-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -87,17 +87,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-GUID: JNJY4yItbZ8HP8WQjm82lNqNLkxUdf1v
-X-Proofpoint-ORIG-GUID: JNJY4yItbZ8HP8WQjm82lNqNLkxUdf1v
+X-Proofpoint-ORIG-GUID: lrtwH7rWiPRFD03fbbD0IavLBLpNgTW-
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNSBTYWx0ZWRfX0HS2wunF/V5Q
+ 
jQqxwakF2Imrc/4a4WgPSFOFxUyO27D7Yw6gnIBRodgtwOFgflHDfeJMrELW79jrSDvXvRC0nnc
+ 
lTonRisd7/CZWExy3sM2diYhHrZ5YT1dPhFtq33ItpY8BaOhwiLxc3wn0tlWRX8B/cd+xyEHTZY
+ 
A4nCDSw77SEdaZfmqAB81LMzQWIuTucnxkms4pM1CIIYZrgAPcBk4XN8tWVQ6JQKCpMpelTF6Hj
+ 
/XLCY2ByRqjtwd/zSjtcCfLOyKdT+uQtAJU1XZvedwqQW5MFk2GeD7O72PfhAP1V0YcbHdiTxde
+ 
roRpAlQg48k0Ug5EMIUPb9TYEP15vwtPDTw03C3u7eOhs6znDqvMYNAtXwbxfGeHRwjsbMgpWLG
+ +weN3zziLWlwb66N0xo5nfdJRHrOVDNcSx8/Z/xvCmHBTuVr44Q7It0iW+CGbHNqXrg4h4CH
+X-Authority-Analysis: v=2.4 cv=GawXnRXL c=1 sm=1 tr=0 ts=682e57a2 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=mu3tZSmwaZwQUXtd2tAA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-GUID: lrtwH7rWiPRFD03fbbD0IavLBLpNgTW-
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- bulkscore=0 adultscore=0
- suspectscore=0 mlxscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0
- phishscore=0 impostorscore=0 mlxlogscore=999 priorityscore=1501
- spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1
- engine=8.19.0-2408220000 definitions=main-2409180140
+ mlxscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0
+ priorityscore=1501 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0
+ spamscore=0 suspectscore=0 adultscore=0 classifier=spam authscore=0
+ authtc=n/a authcc= route=outbound adjust=0 reason=mlx scancount=1
+ engine=8.19.0-2505160000 definitions=main-2505210225

  Currently, the TX and RX MCS rate configurations per peer are
  reversed when sent to the firmware. As a result, RX MCS rates
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-6-wifi-ath12k-add-support-for-setting-fixed-HE-rate-GI-LTF.patch 
b/package/kernel/mac80211/patches/ath12k/104-6-wifi-ath12k-add-support-for-setting-fixed-HE-rate-GI-LTF.patch
index 72f3e9a56752e3..8730a20588a8f3 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-6-wifi-ath12k-add-support-for-setting-fixed-HE-rate-GI-LTF.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-6-wifi-ath12k-add-support-for-setting-fixed-HE-rate-GI-LTF.patch
@@ -1,83 +1,81 @@
-From patchwork Wed Sep 18 21:20:53 2024
+From patchwork Wed May 21 22:45:36 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807217
+X-Patchwork-Id: 14096125
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01CB41CB521
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:15 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A17F1B0F20
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:59 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694478; cv=none;
- 
b=CCnmzPX7wAnXz6jkBGnfJkO3OTVTa1pEVXaY+i3jcRKLwLmYLBkbQB7d5qZASnEWRw4vJRXQbpKaSNlechv1fw+VqQci5hz7GrwDmSDWwFwNKynwUkaS+V6CUoPkxGmvijlkSH5/Sp7n4JBdH9MZdY9ACaPCGZlgpTeAiRpgqyQ=
+    t=1747867562; cv=none;
+ 
b=bEGfSmKJAIERqJyK0yJndcYM+a7cpfrIkMLoGUTFvAkrcwqnlh3F9AqLbcb8fKznhfaQKFVRUdpVGSjFaplFVSp20RuXvPC2NLb0eKZrz5qS/4geTMxY/BeWuVN+i3ouoQzfYz8Vq6sTqLE5d6b650cCVf8hpY+VZ3ZTNWxVvdA=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694478; c=relaxed/simple;
-    bh=mOCMplbDFdsxafoM0lh9GOTg8poXfVWSA2JaaPzd5gg=;
+    s=arc-20240116; t=1747867562; c=relaxed/simple;
+    bh=hBxlXRYYCPbv8+evEatym1UfdpOfENFUVDWgibN+XTg=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=m9Y3ZEQjhVcT6ObjX34KItzxLUdCbzQDCo4za4qtMsxHQCEQSny2a/lTtWTbAB42n+JZkBRjC1xrrdmRnXSxy58EZpvKNutjY0YonbJ/hMfa97U5qRTD/50prvNqxkFINPijMCNMgKsnCBz6tfcB78j3qnEvZjNP4eV4rbTicUg=
+ 
b=U32JKi6TAoRF/9e1cv0vPGUM6BaRhoFXM0b36j5PBpvKQmRXKDF/UNScd5EJnrFOPlgjPD7GOc+TdHqsFGk/7pNucA1++GU00SZ0q/223zg5dCsYLmfLrRu3G22WZS2hWuNKuUPFJEFFLEJ8UQWKtFB0oWsQcx+Oj1mWPbBrDU8=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=lKsSrYSp; arc=none smtp.client-ip=205.220.168.131
+ header.b=bzVTzUcl; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="lKsSrYSp"
-Received: from pps.filterd (m0279864.ppops.net [127.0.0.1])
+ header.b="bzVTzUcl"
+Received: from pps.filterd (m0279868.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48IINFa1032091;
-    Wed, 18 Sep 2024 21:21:09 GMT
+ 54LJiK6V032422;
+    Wed, 21 May 2025 22:45:55 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    97aZlelAxnf1oZWK/vk3qg6OISdr4sArbqi18OQE/2Y=; b=lKsSrYSpewbykrq1
- 6WJRbLR0y481zo+GgIgfHUNcpF2NhItbbS8mgWYFPaMaoohciRsbAYdFFZrc9BG3
- 9IyAzZvpFzBox/oaJjDm/zLc2GVYMSGtwO3W0mMk2uVXU7ZB8dBDNimtsLmXTa1t
- jyV6n0wj3jlGU1kDYu6zPgrcxWF1NnScnosftToVpHqM7TLfDaj8EJWuzsJnau2A
- CUOS2o9wPZPAScyeL91kJOHtJddltuJrvLFxbi4gGZW7dWUus99UjFzGTAan/JVK
- yb5Xr8iEzP2141KqZ9FMQqwqYOGc10t+yYXPMep/fo1mfziiB5kQ0tRtaWQ01Auw
-    uPa6OQ==
-Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
+    cpcIGD4iPSOaZzDkHZpoGs5Kor0sF3EnocHYcBOazgM=; b=bzVTzUclt3RkLn9A
+ YI8+MC64RjF5llUqmQ0G53D8sAQZ+95fc92X/ZrZvnyr7X0FBI+gU05yKzNuv4M5
+ XcIWK7Y8gjr55i9w18cWHGW2Q/JGC8pJlx0A/SEAMIMXeeEmgJqdKowT2wMjzIIH
+ wb7JmE9d6z6ZKcgQYx9KICXaaEFQ9uxyRyjlJMMEJ3zb7MjxZPCCGtCI31Aqczpk
+ B3X+1UgRT+OJzV6vIF0kdn/sjU69iZNHoPAUDYqInWCs2lPLMUO5mckhOG3fH8s6
+ jmhgpwlpUYx18jawRUpklvujXfFiDV4daXLeUKzL5b08f5OcSRvd7+iOytudYgr0
+    U9VYkw==
+Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4geb5e1-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwfb4b3w-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:09 +0000 (GMT)
+    Wed, 21 May 2025 22:45:55 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL8jN020567
+    by NALASPPMTA03.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjsC2027097
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:08 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:54 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:08 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:53 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
          Pradeep Kumar Chitrapu
      <quic_pradeepc at quicinc.com>,
-        Muna Sinada <quic_msinada at quicinc.com>,
-        "Jeff
- Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 6/9] wifi: ath12k: add support for setting fixed HE
- rate/GI/LTF
-Date: Wed, 18 Sep 2024 14:20:53 -0700
-Message-ID: <20240918212056.4137076-7-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+        Muna Sinada <quic_msinada at quicinc.com>
+Subject: [PATCH ath-next V14 6/9] wifi: ath12k: add support for setting 
fixed
+ HE rate/GI/LTF
+Date: Wed, 21 May 2025 15:45:36 -0700
+Message-ID: <20250521224539.355985-7-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -89,18 +87,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-GUID: GGIeqOgMFye5oFp39WDjK5DZ7YoCK3Ap
-X-Proofpoint-ORIG-GUID: GGIeqOgMFye5oFp39WDjK5DZ7YoCK3Ap
+X-Proofpoint-ORIG-GUID: 7uuxK_kl_b0JzKZoWIyq_ZYKeKL3it15
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX7sjoM15po0tB
+ 
FcR1nwzr8TocaDYnIXgl13rA+kjwsizlMt/N5cu8dCWo9YQKqFNy42Z2VEYmoDRw7dBnYnsMIL/
+ 
wwv4hQYQslnxilRJaX/MVQ50/xxhSry8NrKA2QXvIg3btmiW4gQfrn3+k1Rm3o/gAGv2Yz4R8lw
+ 
YBPHVdQkgGJXYgsiB/b+copbnU621GYiYrCW6yUQHHIiwzjMljzzsk+9Koc6yeVByyPj86P80y7
+ 
2C8L1vuRAy8gCMSScMB9CyQ6+tLCKa1W2bhA0Oxz/+RGEXbujS4NDXCWz+EqIaYS5HXuD32pODy
+ 
O2wMURrbgE5PJIjjvpAdtqZL65QVaoVK1LWU6Co0NtHytEjuaZmr1hbb4hVDAtQio2Bw/K8yCM+
+ ikcJ1sGkE78mu/U7gQjG6g0Z71Q/w13jBOz+RIocPFi2FyEjy5KDFmUBzY+jDCIRLi06R8sP
+X-Proofpoint-GUID: 7uuxK_kl_b0JzKZoWIyq_ZYKeKL3it15
+X-Authority-Analysis: v=2.4 cv=dLCmmPZb c=1 sm=1 tr=0 ts=682e57a3 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=KygRlO7-s-l5tpycOzUA:9
+ a=TjNXssC_j7lpFel5tvFf:22
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- malwarescore=0
- mlxlogscore=999 impostorscore=0 bulkscore=0 clxscore=1015
- lowpriorityscore=0 adultscore=0 phishscore=0 suspectscore=0
- priorityscore=1501 mlxscore=0 spamscore=0 classifier=spam adjust=0
- reason=mlx scancount=1 engine=8.19.0-2408220000
- definitions=main-2409180140
+ mlxscore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 
suspectscore=0
+ impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 
spamscore=0
+ priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc=
+ route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
+ definitions=main-2505210226

  Add support to set fixed HE rate/GI/LTF values using nl80211.
  Reuse parts of the existing code path already used for HT/VHT
@@ -112,15 +120,14 @@ Tested-on: QCN9274 hw2.0 PCI 
WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
  Co-developed-by: Muna Sinada <quic_msinada at quicinc.com>
  Signed-off-by: Muna Sinada <quic_msinada at quicinc.com>
  Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  ---
- drivers/net/wireless/ath/ath12k/mac.c | 604 ++++++++++++++++++++++++--
- drivers/net/wireless/ath/ath12k/wmi.h |  18 +
- 2 files changed, 574 insertions(+), 48 deletions(-)
+ drivers/net/wireless/ath/ath12k/mac.c | 650 +++++++++++++++++++++++---
+ drivers/net/wireless/ath/ath12k/wmi.h |  27 ++
+ 2 files changed, 625 insertions(+), 52 deletions(-)

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -441,6 +441,18 @@ ath12k_mac_max_vht_nss(const u16 *vht_mc
+@@ -442,6 +442,18 @@ ath12k_mac_max_vht_nss(const u16 *vht_mc
       return 1;
   }

@@ -139,23 +146,27 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   static u8 ath12k_parse_mpdudensity(u8 mpdudensity)
   {
   /*  From IEEE Std 802.11-2020 defined values for "Minimum MPDU Start 
Spacing":
-@@ -1916,6 +1928,14 @@ static void ath12k_peer_assoc_h_ht(struc
+@@ -2059,9 +2071,15 @@ static void ath12k_peer_assoc_h_ht(struc
           arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
       }

+-    if (arvif->bitrate_mask.control[band].gi != 
NL80211_TXRATE_FORCE_LGI) {
+-        if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
+-            IEEE80211_HT_CAP_SGI_40))
  +    /* As firmware handles these two flags (IEEE80211_HT_CAP_SGI_20
  +     * and IEEE80211_HT_CAP_SGI_40) for enabling SGI, reset both
-+     * flags if guard interval is Default GI
++     * flags if guard interval is to force Long GI
  +     */
-+    if (arvif->bitrate_mask.control[band].gi == NL80211_TXRATE_DEFAULT_GI)
-+        arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 |
-+                IEEE80211_HT_CAP_SGI_40);
-+
-     if (arvif->bitrate_mask.control[band].gi != 
NL80211_TXRATE_FORCE_LGI) {
-         if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 |
-             IEEE80211_HT_CAP_SGI_40))
-@@ -2039,11 +2059,12 @@ static void ath12k_peer_assoc_h_vht(stru
-     struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
++    if (arvif->bitrate_mask.control[band].gi == 
NL80211_TXRATE_FORCE_LGI) {
++        arg->peer_ht_caps &= ~(IEEE80211_HT_CAP_SGI_20 | 
IEEE80211_HT_CAP_SGI_40);
++    } else {
++        /* Enable SGI flag if either SGI_20 or SGI_40 is supported */
++        if (ht_cap->cap & (IEEE80211_HT_CAP_SGI_20 | 
IEEE80211_HT_CAP_SGI_40))
+             arg->peer_rate_caps |= WMI_HOST_RC_SGI_FLAG;
+     }
+
+@@ -2184,11 +2202,12 @@ static void ath12k_peer_assoc_h_vht(stru
+     struct ieee80211_link_sta *link_sta;
       struct cfg80211_chan_def def;
       enum nl80211_band band;
  -    const u16 *vht_mcs_mask;
@@ -167,17 +178,17 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    int i, vht_nss, nss_idx;
  +    bool user_rate_valid = true;

-     if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
-         return;
-@@ -2086,6 +2107,25 @@ static void ath12k_peer_assoc_h_vht(stru
-     if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
+@@ -2241,6 +2260,25 @@ static void ath12k_peer_assoc_h_vht(stru
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160)
           arg->bw_160 = true;

  +    vht_nss =  ath12k_mac_max_vht_nss(vht_mcs_mask);
  +
-+    if (vht_nss > sta->deflink.rx_nss) {
++    if (vht_nss > link_sta->rx_nss) {
  +        user_rate_valid = false;
-+        for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
++        for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
  +            if (vht_mcs_mask[nss_idx]) {
  +                user_rate_valid = true;
  +                break;
@@ -188,14 +199,14 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    if (!user_rate_valid) {
  +        ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +               "Setting vht range MCS value to peer supported nss:%d 
for peer %pM\n",
-+               sta->deflink.rx_nss, sta->deflink.addr);
-+        vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
++               link_sta->rx_nss, arsta->addr);
++        vht_mcs_mask[link_sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
  +    }
  +
       /* Calculate peer NSS capability from VHT capabilities if STA
        * supports VHT.
        */
-@@ -2125,23 +2165,105 @@ static void ath12k_peer_assoc_h_vht(stru
+@@ -2280,6 +2318,72 @@ static void ath12k_peer_assoc_h_vht(stru
       /* TODO: rxnss_override */
   }

@@ -266,18 +277,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
   static void ath12k_peer_assoc_h_he(struct ath12k *ar,
-                    struct ieee80211_vif *vif,
-                    struct ieee80211_sta *sta,
-                    struct ath12k_wmi_peer_assoc_arg *arg)
- {
-     const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
-+    struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
+                    struct ath12k_link_vif *arvif,
+                    struct ath12k_link_sta *arsta,
+@@ -2290,18 +2394,28 @@ static void ath12k_peer_assoc_h_he(struc
+     const struct ieee80211_sta_he_cap *he_cap;
+     struct ieee80211_bss_conf *link_conf;
+     struct ieee80211_link_sta *link_sta;
  +    struct cfg80211_chan_def def;
       int i;
       u8 ampdu_factor, max_nss;
       u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
       u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
       u16 mcs_160_map, mcs_80_map;
++    u8 link_id = arvif->link_id;
       bool support_160;
  -    u16 v;
  +    enum nl80211_band band;
@@ -287,9 +299,18 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    int he_nss, nss_idx;
  +    bool user_rate_valid = true;
  +
-+    if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
++    if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
  +        return;

+     link_conf = ath12k_mac_get_link_bss_conf(arvif);
+     if (!link_conf) {
+         ath12k_warn(ar->ab, "unable to access bss link conf in peer 
assoc he for vif %pM link %u",
+-                vif->addr, arvif->link_id);
++                vif->addr, link_id);
+         return;
+     }
+
+@@ -2316,6 +2430,12 @@ static void ath12k_peer_assoc_h_he(struc
       if (!he_cap->has_he)
           return;

@@ -302,15 +323,15 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       arg->he_flag = true;

       support_160 = !!(he_cap->he_cap_elem.phy_cap_info[0] &
-@@ -2247,25 +2369,47 @@ static void ath12k_peer_assoc_h_he(struc
+@@ -2421,25 +2541,47 @@ static void ath12k_peer_assoc_h_he(struc
       if (he_cap->he_cap_elem.mac_cap_info[0] & 
IEEE80211_HE_MAC_CAP0_TWT_REQ)
           arg->twt_requester = true;

  +    he_nss = ath12k_mac_max_he_nss(he_mcs_mask);
  +
-+    if (he_nss > sta->deflink.rx_nss) {
++    if (he_nss > link_sta->rx_nss) {
  +        user_rate_valid = false;
-+        for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
++        for (nss_idx = link_sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
  +            if (he_mcs_mask[nss_idx]) {
  +                user_rate_valid = true;
  +                break;
@@ -321,11 +342,11 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    if (!user_rate_valid) {
  +        ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +               "Setting he range MCS value to peer supported nss:%d 
for peer %pM\n",
-+               sta->deflink.rx_nss, sta->deflink.addr);
-+        he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
++               link_sta->rx_nss, arsta->addr);
++        he_mcs_mask[link_sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
  +    }
  +
-     switch (sta->deflink.bandwidth) {
+     switch (link_sta->bandwidth) {
       case IEEE80211_STA_RX_BW_160:
           if (he_cap->he_cap_elem.phy_cap_info[0] &
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
@@ -352,7 +373,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           fallthrough;

       default:
-@@ -2273,11 +2417,34 @@ static void ath12k_peer_assoc_h_he(struc
+@@ -2447,11 +2589,36 @@ static void ath12k_peer_assoc_h_he(struc
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v;

           v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80);
@@ -379,51 +400,67 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +            he_mcs_mask[i])
  +            max_nss = i + 1;
  +    }
-+    arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
++
++    max_nss = min(max_nss, ar->num_tx_chains);
++    arg->peer_nss = min(link_sta->rx_nss, max_nss);
  +
  +    ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +           "mac he peer %pM nss %d mcs cnt %d\n",
-+           sta->deflink.addr, arg->peer_nss, arg->peer_he_mcs_count);
++           arsta->addr, arg->peer_nss, arg->peer_he_mcs_count);
   }

   static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
-@@ -2586,6 +2753,7 @@ static void ath12k_peer_assoc_h_phymode(
+@@ -2787,6 +2954,7 @@ static void ath12k_peer_assoc_h_phymode(
       enum nl80211_band band;
       const u8 *ht_mcs_mask;
       const u16 *vht_mcs_mask;
  +    const u16 *he_mcs_mask;
       enum wmi_phy_mode phymode = MODE_UNKNOWN;

-     if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
-@@ -2594,6 +2762,7 @@ static void ath12k_peer_assoc_h_phymode(
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+@@ -2800,6 +2968,7 @@ static void ath12k_peer_assoc_h_phymode(
       band = def.chan->band;
       ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
       vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
  +    he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs;

-     switch (band) {
-     case NL80211_BAND_2GHZ:
-@@ -2602,7 +2771,8 @@ static void ath12k_peer_assoc_h_phymode(
+     link_sta = ath12k_mac_get_link_sta(arsta);
+     if (!link_sta) {
+@@ -2815,7 +2984,8 @@ static void ath12k_peer_assoc_h_phymode(
                   phymode = MODE_11BE_EHT40_2G;
               else
                   phymode = MODE_11BE_EHT20_2G;
--        } else if (sta->deflink.he_cap.has_he) {
-+        } else if (sta->deflink.he_cap.has_he &&
+-        } else if (link_sta->he_cap.has_he) {
++        } else if (link_sta->he_cap.has_he &&
  +               !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
-             if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
+             if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
                   phymode = MODE_11AX_HE80_2G;
-             else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
-@@ -2632,7 +2802,8 @@ static void ath12k_peer_assoc_h_phymode(
+             else if (link_sta->bandwidth == IEEE80211_STA_RX_BW_40)
+@@ -2845,7 +3015,8 @@ static void ath12k_peer_assoc_h_phymode(
           /* Check EHT first */
-         if (sta->deflink.eht_cap.has_eht) {
-             phymode = ath12k_mac_get_phymode_eht(ar, sta);
--        } else if (sta->deflink.he_cap.has_he) {
-+        } else if (sta->deflink.he_cap.has_he &&
+         if (link_sta->eht_cap.has_eht) {
+             phymode = ath12k_mac_get_phymode_eht(ar, link_sta);
+-        } else if (link_sta->he_cap.has_he) {
++        } else if (link_sta->he_cap.has_he &&
  +               !ath12k_peer_assoc_h_he_masked(he_mcs_mask)) {
-             phymode = ath12k_mac_get_phymode_he(ar, sta);
-         } else if (sta->deflink.vht_cap.vht_supported &&
+             phymode = ath12k_mac_get_phymode_he(ar, link_sta);
+         } else if (link_sta->vht_cap.vht_supported &&
               !ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
-@@ -4311,6 +4482,20 @@ ath12k_mac_bitrate_mask_num_vht_rates(st
+@@ -4113,10 +4284,13 @@ static struct ath12k_link_vif *ath12k_ma
+
+     for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
+         arvif->bitrate_mask.control[i].legacy = 0xffffffff;
++        arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;
+         memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
+ sizeof(arvif->bitrate_mask.control[i].ht_mcs));
+         memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
+ sizeof(arvif->bitrate_mask.control[i].vht_mcs));
++        memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
++ sizeof(arvif->bitrate_mask.control[i].he_mcs));
+     }
+
+     /* Allocate Default Queue now and reassign during actual vdev 
create */
+@@ -5018,6 +5192,20 @@ ath12k_mac_bitrate_mask_num_vht_rates(st
   }

   static int
@@ -441,16 +478,16 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
  +static int
- ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_vif *arvif,
-                    struct ieee80211_sta *sta,
+ ath12k_mac_set_peer_vht_fixed_rate(struct ath12k_link_vif *arvif,
+                    struct ath12k_link_sta *arsta,
                      const struct cfg80211_bitrate_mask *mask,
-@@ -4356,6 +4541,57 @@ ath12k_mac_set_peer_vht_fixed_rate(struc
+@@ -5063,6 +5251,60 @@ ath12k_mac_set_peer_vht_fixed_rate(struc
       return ret;
   }

  +static int
-+ath12k_mac_set_peer_he_fixed_rate(struct ath12k_vif *arvif,
-+                  struct ieee80211_sta *sta,
++ath12k_mac_set_peer_he_fixed_rate(struct ath12k_link_vif *arvif,
++                  struct ath12k_link_sta *arsta,
  +                  const struct cfg80211_bitrate_mask *mask,
  +                  enum nl80211_band band)
  +{
@@ -458,9 +495,12 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    u8 he_rate, nss;
  +    u32 rate_code;
  +    int ret, i;
++    struct ath12k_sta *ahsta = arsta->ahsta;
++    struct ieee80211_sta *sta;
  +
-+    lockdep_assert_held(&ar->conf_mutex);
++    lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
  +
++    sta = ath12k_ahsta_to_sta(ahsta);
  +    nss = 0;
  +
  +    for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
@@ -472,7 +512,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +
  +    if (!nss) {
  +        ath12k_warn(ar->ab, "No single HE Fixed rate found to set for 
%pM",
-+                sta->deflink.addr);
++                arsta->addr);
  +        return -EINVAL;
  +    }
  +
@@ -482,36 +522,36 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +
  +    ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +           "Setting Fixed HE Rate for peer %pM. Device will not 
switch to any other selected rates",
-+           sta->deflink.addr);
++           arsta->addr);
  +
  +    rate_code = ATH12K_HW_RATE_CODE(he_rate, nss - 1,
  +                    WMI_RATE_PREAMBLE_HE);
  +
-+    ret = ath12k_wmi_set_peer_param(ar, sta->deflink.addr,
++    ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
  +                    arvif->vdev_id,
  +                    WMI_PEER_PARAM_FIXED_RATE,
  +                    rate_code);
  +    if (ret)
  +        ath12k_warn(ar->ab,
  +                "failed to update STA %pM Fixed Rate %d: %d\n",
-+                sta->deflink.addr, rate_code, ret);
++                arsta->addr, rate_code, ret);
  +
  +    return ret;
  +}
  +
- static int ath12k_station_assoc(struct ath12k *ar,
-                 struct ieee80211_vif *vif,
-                 struct ieee80211_sta *sta,
-@@ -4367,7 +4603,7 @@ static int ath12k_station_assoc(struct a
+ static int ath12k_mac_station_assoc(struct ath12k *ar,
+                     struct ath12k_link_vif *arvif,
+                     struct ath12k_link_sta *arsta,
+@@ -5075,7 +5317,7 @@ static int ath12k_mac_station_assoc(stru
       struct cfg80211_chan_def def;
       enum nl80211_band band;
       struct cfg80211_bitrate_mask *mask;
  -    u8 num_vht_rates;
  +    u8 num_vht_rates, num_he_rates;
+     u8 link_id = arvif->link_id;

-     lockdep_assert_held(&ar->conf_mutex);
-
-@@ -4398,15 +4634,19 @@ static int ath12k_station_assoc(struct a
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+@@ -5115,9 +5357,10 @@ static int ath12k_mac_station_assoc(stru
       }

       num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band, 
mask);
@@ -524,18 +564,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
        * fixed param.
        * Note that all other rates and NSS will be disabled for this peer.
        */
-     if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
--        ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
+@@ -5128,8 +5371,9 @@ static int ath12k_mac_station_assoc(stru
+     }
+
+     if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
+-        ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
  -                             band);
-+        ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask, band);
-+        if (ret)
-+            return ret;
-+    } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
-+        ret = ath12k_mac_set_peer_he_fixed_rate(arvif, sta, mask, band);
++        ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask, 
band);
++    } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
++        ret = ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
           if (ret)
               return ret;
       }
-@@ -4480,8 +4720,9 @@ static void ath12k_sta_rc_update_wk(stru
+@@ -5193,8 +5437,9 @@ static void ath12k_sta_rc_update_wk(stru
       enum nl80211_band band;
       const u8 *ht_mcs_mask;
       const u16 *vht_mcs_mask;
@@ -545,9 +586,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    u32 changed, bw, nss, mac_nss, smps, bw_prev;
  +    int err, num_vht_rates, num_he_rates;
       const struct cfg80211_bitrate_mask *mask;
-     struct ath12k_wmi_peer_assoc_arg peer_arg;
       enum wmi_phy_mode peer_phymode;
-@@ -4497,6 +4738,7 @@ static void ath12k_sta_rc_update_wk(stru
+     struct ath12k_link_sta *arsta;
+@@ -5214,6 +5459,7 @@ static void ath12k_sta_rc_update_wk(stru
       band = def.chan->band;
       ht_mcs_mask = arvif->bitrate_mask.control[band].ht_mcs;
       vht_mcs_mask = arvif->bitrate_mask.control[band].vht_mcs;
@@ -555,8 +596,8 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       spin_lock_bh(&ar->data_lock);

-@@ -4513,8 +4755,10 @@ static void ath12k_sta_rc_update_wk(stru
-     mutex_lock(&ar->conf_mutex);
+@@ -5228,8 +5474,10 @@ static void ath12k_sta_rc_update_wk(stru
+     spin_unlock_bh(&ar->data_lock);

       nss = max_t(u32, 1, nss);
  -    nss = min(nss, max(ath12k_mac_max_ht_nss(ht_mcs_mask),
@@ -566,9 +607,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +               ath12k_mac_max_he_nss(he_mcs_mask));
  +    nss = min(nss, mac_nss);

-     if (changed & IEEE80211_RC_BW_CHANGED) {
-         ath12k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);
-@@ -4592,6 +4836,8 @@ static void ath12k_sta_rc_update_wk(stru
+     struct ath12k_wmi_peer_assoc_arg *peer_arg __free(kfree) =
+                     kzalloc(sizeof(*peer_arg), GFP_KERNEL);
+@@ -5312,6 +5560,8 @@ static void ath12k_sta_rc_update_wk(stru
           mask = &arvif->bitrate_mask;
           num_vht_rates = ath12k_mac_bitrate_mask_num_vht_rates(ar, band,
                                         mask);
@@ -577,12 +618,12 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

           /* Peer_assoc_prepare will reject vht rates in
            * bitrate_mask if its not available in range format and
-@@ -4607,11 +4853,24 @@ static void ath12k_sta_rc_update_wk(stru
-         if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
-             ath12k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
+@@ -5334,11 +5584,24 @@ static void ath12k_sta_rc_update_wk(stru
+         if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
+             ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
                                  band);
-+        } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
-+            ath12k_mac_set_peer_he_fixed_rate(arvif, sta, mask, band);
++        } else if (link_sta->he_cap.has_he && num_he_rates == 1) {
++            ath12k_mac_set_peer_he_fixed_rate(arvif, arsta, mask, band);
           } else {
  -            /* If the peer is non-VHT or no fixed VHT rate
  +            /* If the peer is non-VHT/HE or no fixed VHT/HE rate
@@ -592,33 +633,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +             * the peer fixed rate settings as it has higher proprity
  +             * than peer assoc
                */
-+
-+            err = ath12k_wmi_set_peer_param(ar, sta->deflink.addr,
++            err = ath12k_wmi_set_peer_param(ar, arsta->addr,
  +                            arvif->vdev_id,
  +                            WMI_PEER_PARAM_FIXED_RATE,
  +                            WMI_FIXED_RATE_NONE);
  +            if (err)
  +                ath12k_warn(ar->ab,
  +                        "failed to disable peer fixed rate for STA 
%pM ret %d\n",
-+                        sta->deflink.addr, err);
-             ath12k_peer_assoc_prepare(ar, arvif->vif, sta,
-                           &peer_arg, true);
-
-@@ -7059,10 +7318,13 @@ static int ath12k_mac_op_add_interface(s
-
-     for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
-         arvif->bitrate_mask.control[i].legacy = 0xffffffff;
-+        arvif->bitrate_mask.control[i].gi = NL80211_TXRATE_FORCE_SGI;
-         memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
- sizeof(arvif->bitrate_mask.control[i].ht_mcs));
-         memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
- sizeof(arvif->bitrate_mask.control[i].vht_mcs));
-+        memset(arvif->bitrate_mask.control[i].he_mcs, 0xff,
-+ sizeof(arvif->bitrate_mask.control[i].he_mcs));
-     }
++                        arsta->addr, err);
++
+             ath12k_peer_assoc_prepare(ar, arvif, arsta,
+                           peer_arg, true);

-     /* Allocate Default Queue now and reassign during actual vdev 
create */
-@@ -8223,19 +8485,40 @@ ath12k_mac_has_single_legacy_rate(struct
+@@ -9838,19 +10101,40 @@ ath12k_mac_has_single_legacy_rate(struct
       if (ath12k_mac_bitrate_mask_num_vht_rates(ar, band, mask))
           return false;

@@ -659,7 +686,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       int i;

       /* No need to consider legacy here. Basic rates are always present
-@@ -8262,7 +8545,24 @@ ath12k_mac_bitrate_mask_get_single_nss(s
+@@ -9877,7 +10161,24 @@ ath12k_mac_bitrate_mask_get_single_nss(s
               return false;
       }

@@ -685,44 +712,49 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           return false;

       if (ht_nss_mask == 0)
-@@ -8309,54 +8609,158 @@ ath12k_mac_get_single_legacy_rate(struct
+@@ -9924,54 +10225,182 @@ ath12k_mac_get_single_legacy_rate(struct
       return 0;
   }

--static int ath12k_mac_set_fixed_rate_params(struct ath12k_vif *arvif,
+-static int ath12k_mac_set_fixed_rate_params(struct ath12k_link_vif *arvif,
  -                        u32 rate, u8 nss, u8 sgi, u8 ldpc)
  +static int
-+ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_vif *arvif, u8 he_gi, 
u8 he_ltf)
++ath12k_mac_set_fixed_rate_gi_ltf(struct ath12k_link_vif *arvif, u8 
he_gi, u8 he_ltf)
   {
       struct ath12k *ar = arvif->ar;
  -    u32 vdev_param;
       int ret;

--    lockdep_assert_held(&ar->conf_mutex);
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
+-    ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev 
%i rate 0x%02x nss %u sgi %u\n",
+-           arvif->vdev_id, rate, nss, sgi);
  +    /* 0.8 = 0, 1.6 = 2 and 3.2 = 3. */
  +    if (he_gi && he_gi != 0xFF)
  +        he_gi += 1;

--    ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac set fixed rate params vdev 
%i rate 0x%02x nss %u sgi %u\n",
--           arvif->vdev_id, rate, nss, sgi);
-+    ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
+-    vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
+     ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
+-                        vdev_param, rate);
  +                        WMI_VDEV_PARAM_SGI, he_gi);
-+    if (ret) {
+     if (ret) {
+-        ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
+-                rate, ret);
  +        ath12k_warn(ar->ab, "failed to set HE GI:%d, error:%d\n",
  +                he_gi, ret);
-+        return ret;
-+    }
+         return ret;
+     }
  +    /* start from 1 */
  +    if (he_ltf != 0xFF)
  +        he_ltf += 1;

--    vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
+-    vdev_param = WMI_VDEV_PARAM_NSS;
       ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
--                        vdev_param, rate);
+-                        vdev_param, nss);
  +                        WMI_VDEV_PARAM_HE_LTF, he_ltf);
       if (ret) {
--        ath12k_warn(ar->ab, "failed to set fixed rate param 0x%02x: %d\n",
--                rate, ret);
+-        ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
+-                nss, ret);
  +        ath12k_warn(ar->ab, "failed to set HE LTF:%d, error:%d\n",
  +                he_ltf, ret);
           return ret;
@@ -731,7 +763,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
  +static int
-+ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_vif *arvif, u16 he_gi, 
u8 he_ltf)
++ath12k_mac_set_auto_rate_gi_ltf(struct ath12k_link_vif *arvif, u16 
he_gi, u8 he_ltf)
  +{
  +    struct ath12k *ar = arvif->ar;
  +    int ret;
@@ -773,33 +805,54 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +
  +    he_ar_gi_ltf = he_gi | he_ltf;

--    vdev_param = WMI_VDEV_PARAM_NSS;
+-    vdev_param = WMI_VDEV_PARAM_SGI;
       ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
--                        vdev_param, nss);
+-                        vdev_param, sgi);
  +                        WMI_VDEV_PARAM_AUTORATE_MISC_CFG,
  +                        he_ar_gi_ltf);
       if (ret) {
--        ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
--                nss, ret);
+-        ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
+-                sgi, ret);
  +        ath12k_warn(ar->ab,
  +                "failed to set HE autorate GI:%u, LTF:%u params, 
error:%d\n",
  +                he_gi, he_ltf, ret);
           return ret;
       }

--    vdev_param = WMI_VDEV_PARAM_SGI;
+-    vdev_param = WMI_VDEV_PARAM_LDPC;
  +    return 0;
  +}
  +
-+static int ath12k_mac_set_rate_params(struct ath12k_vif *arvif,
++static u32 ath12k_mac_nlgi_to_wmigi(enum nl80211_txrate_gi gi)
++{
++    switch (gi) {
++    case NL80211_TXRATE_DEFAULT_GI:
++        return WMI_GI_400_NS;
++    case NL80211_TXRATE_FORCE_LGI:
++        return WMI_GI_800_NS;
++    default:
++        return WMI_GI_400_NS;
++    }
++}
++
++static int ath12k_mac_set_rate_params(struct ath12k_link_vif *arvif,
  +                      u32 rate, u8 nss, u8 sgi, u8 ldpc,
  +                      u8 he_gi, u8 he_ltf, bool he_fixed_rate)
  +{
++    struct ieee80211_bss_conf *link_conf;
  +    struct ath12k *ar = arvif->ar;
  +    u32 vdev_param;
++    u32 param_value;
  +    int ret;
++    bool he_support;
  +
-+    lockdep_assert_held(&ar->conf_mutex);
++    lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
++
++    link_conf = ath12k_mac_get_link_bss_conf(arvif);
++    if (!link_conf)
++        return -EINVAL;
++
++    he_support = link_conf->he_support;
  +
  +    ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +           "mac set rate params vdev %i rate 0x%02x nss 0x%02x sgi 
0x%02x ldpc 0x%02x\n",
@@ -809,7 +862,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +           "he_gi 0x%02x he_ltf 0x%02x he_fixed_rate %d\n", he_gi,
  +           he_ltf, he_fixed_rate);
  +
-+    if (!arvif->vif->bss_conf.he_support) {
++    if (!he_support) {
  +        vdev_param = WMI_VDEV_PARAM_FIXED_RATE;
  +        ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
  +                            vdev_param, rate);
@@ -823,19 +876,15 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    vdev_param = WMI_VDEV_PARAM_NSS;
  +
       ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
--                        vdev_param, sgi);
+-                        vdev_param, ldpc);
  +                        vdev_param, nss);
-     if (ret) {
--        ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
--                sgi, ret);
++    if (ret) {
  +        ath12k_warn(ar->ab, "failed to set nss param %d: %d\n",
  +                nss, ret);
-         return ret;
-     }
-
--    vdev_param = WMI_VDEV_PARAM_LDPC;
-     ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
--                        vdev_param, ldpc);
++        return ret;
++    }
++
++    ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
  +                        WMI_VDEV_PARAM_LDPC, ldpc);
       if (ret) {
           ath12k_warn(ar->ab, "failed to set ldpc param %d: %d\n",
@@ -843,7 +892,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           return ret;
       }

-+    if (arvif->vif->bss_conf.he_support) {
++    if (he_support) {
  +        if (he_fixed_rate)
  +            ret = ath12k_mac_set_fixed_rate_gi_ltf(arvif, he_gi, he_ltf);
  +        else
@@ -852,8 +901,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +            return ret;
  +    } else {
  +        vdev_param = WMI_VDEV_PARAM_SGI;
++        param_value = ath12k_mac_nlgi_to_wmigi(sgi);
  +        ret = ath12k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id,
-+                            vdev_param, sgi);
++                            vdev_param, param_value);
  +        if (ret) {
  +            ath12k_warn(ar->ab, "failed to set sgi param %d: %d\n",
  +                    sgi, ret);
@@ -864,7 +914,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       return 0;
   }

-@@ -8385,6 +8789,31 @@ ath12k_mac_vht_mcs_range_present(struct
+@@ -10000,6 +10429,31 @@ ath12k_mac_vht_mcs_range_present(struct
       return true;
   }

@@ -896,18 +946,33 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   static void ath12k_mac_set_bitrate_mask_iter(void *data,
                            struct ieee80211_sta *sta)
   {
-@@ -8424,6 +8853,54 @@ static void ath12k_mac_disable_peer_fixe
+@@ -10008,7 +10462,10 @@ static void ath12k_mac_set_bitrate_mask_
+     struct ath12k_link_sta *arsta;
+     struct ath12k *ar = arvif->ar;
+
+-    arsta = rcu_dereference(ahsta->link[arvif->link_id]);
++    lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
++
++    arsta = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
++                  ahsta->link[arvif->link_id]);
+     if (!arsta || arsta->arvif != arvif)
+         return;
+
+@@ -10046,6 +10503,61 @@ static void ath12k_mac_disable_peer_fixe
+                 arsta->addr, ret);
   }

- static int
-+ath12k_mac_validate_vht_he_fixed_rate_settings(struct ath12k *ar, enum 
nl80211_band band,
-+                           const struct cfg80211_bitrate_mask *mask)
++static bool
++ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum 
nl80211_band band,
++                    const struct cfg80211_bitrate_mask *mask,
++                    unsigned int link_id)
  +{
  +    bool he_fixed_rate = false, vht_fixed_rate = false;
-+    struct ath12k_peer *peer;
  +    const u16 *vht_mcs_mask, *he_mcs_mask;
++    struct ieee80211_link_sta *link_sta;
++    struct ath12k_peer *peer, *tmp;
  +    u8 vht_nss, he_nss;
-+    int ret = 0;
++    int ret = true;
  +
  +    vht_mcs_mask = mask->control[band].vht_mcs;
  +    he_mcs_mask = mask->control[band].he_mcs;
@@ -919,24 +984,29 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        he_fixed_rate = true;
  +
  +    if (!vht_fixed_rate && !he_fixed_rate)
-+        return 0;
++        return true;
  +
  +    vht_nss = ath12k_mac_max_vht_nss(vht_mcs_mask);
  +    he_nss =  ath12k_mac_max_he_nss(he_mcs_mask);
  +
  +    rcu_read_lock();
  +    spin_lock_bh(&ar->ab->base_lock);
-+    list_for_each_entry(peer, &ar->ab->peers, list) {
++    list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
  +        if (peer->sta) {
-+            if (vht_fixed_rate &&
-+                (!peer->sta->deflink.vht_cap.vht_supported ||
-+                peer->sta->deflink.rx_nss < vht_nss)) {
-+                ret = -EINVAL;
++            link_sta = rcu_dereference(peer->sta->link[link_id]);
++            if (!link_sta) {
++                ret = false;
++                goto exit;
++            }
++
++            if (vht_fixed_rate && (!link_sta->vht_cap.vht_supported ||
++                           link_sta->rx_nss < vht_nss)) {
++                ret = false;
  +                goto exit;
  +            }
-+            if (he_fixed_rate && (!peer->sta->deflink.he_cap.has_he ||
-+                          peer->sta->deflink.rx_nss < he_nss)) {
-+                ret = -EINVAL;
++            if (he_fixed_rate && (!link_sta->he_cap.has_he ||
++                          link_sta->rx_nss < he_nss)) {
++                ret = false;
  +                goto exit;
  +            }
  +        }
@@ -947,11 +1017,10 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    return ret;
  +}
  +
-+static int
+ static int
   ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
                      struct ieee80211_vif *vif,
-                    const struct cfg80211_bitrate_mask *mask)
-@@ -8434,13 +8911,17 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+@@ -10058,13 +10570,17 @@ ath12k_mac_op_set_bitrate_mask(struct ie
       enum nl80211_band band;
       const u8 *ht_mcs_mask;
       const u16 *vht_mcs_mask;
@@ -968,9 +1037,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       int num_rates;
  +    bool he_fixed_rate = false;

-     if (ath12k_mac_vif_chan(vif, &def))
-         return -EPERM;
-@@ -8448,6 +8929,7 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+     lockdep_assert_wiphy(hw->wiphy);
+
+@@ -10079,14 +10595,18 @@ ath12k_mac_op_set_bitrate_mask(struct ie
       band = def.chan->band;
       ht_mcs_mask = mask->control[band].ht_mcs;
       vht_mcs_mask = mask->control[band].vht_mcs;
@@ -978,7 +1047,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       ldpc = !!(ar->ht_cap_info & WMI_HT_CAP_LDPC);

       sgi = mask->control[band].gi;
-@@ -8456,6 +8938,9 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+-    if (sgi == NL80211_TXRATE_FORCE_LGI) {
++    if (sgi == NL80211_TXRATE_FORCE_SGI) {
+         ret = -EINVAL;
           goto out;
       }

@@ -988,7 +1059,11 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       /* mac80211 doesn't support sending a fixed HT/VHT MCS alone, 
rather it
        * requires passing at least one of used basic rates along with them.
        * Fixed rate setting across different preambles(legacy, HT, VHT) is
-@@ -8475,15 +8960,27 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+@@ -10103,18 +10623,31 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+                     arvif->vdev_id, ret);
+             goto out;
+         }
++
           ieee80211_iterate_stations_mtx(hw,
                              ath12k_mac_disable_peer_fixed_rate,
                              arvif);
@@ -997,21 +1072,21 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
                                 &single_nss)) {
           rate = WMI_FIXED_RATE_NONE;
           nss = single_nss;
-+        mutex_lock(&ar->conf_mutex);
  +        arvif->bitrate_mask = *mask;
-+        ieee80211_iterate_stations_mtx(hw,
-+                           ath12k_mac_set_bitrate_mask_iter,
-+                           arvif);
-+        mutex_unlock(&ar->conf_mutex);
++
++        ieee80211_iterate_stations_atomic(hw,
++                          ath12k_mac_set_bitrate_mask_iter,
++                          arvif);
       } else {
           rate = WMI_FIXED_RATE_NONE;
  -        nss = min_t(u32, ar->num_tx_chains,
  -                max(ath12k_mac_max_ht_nss(ht_mcs_mask),
  -                ath12k_mac_max_vht_nss(vht_mcs_mask)));
  +
-+        if (!ath12k_mac_validate_vht_he_fixed_rate_settings(ar, band, 
mask))
++        if (!ath12k_mac_validate_fixed_rate_settings(ar, band,
++                                 mask, arvif->link_id))
  +            ath12k_warn(ar->ab,
-+                    "could not update fixed rate settings to all peers 
due to mcs/nss incompatiblity\n");
++                    "failed to update fixed rate settings due to 
mcs/nss incompatibility\n");
  +
  +        mac_nss = max3(ath12k_mac_max_ht_nss(ht_mcs_mask),
  +                   ath12k_mac_max_vht_nss(vht_mcs_mask),
@@ -1020,8 +1095,13 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

           /* If multiple rates across different preambles are given
            * we can reconfigure this info with all peers using PEER_ASSOC
-@@ -8519,12 +9016,22 @@ ath12k_mac_op_set_bitrate_mask(struct ie
-             goto out;
+@@ -10146,9 +10679,21 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+              */
+             ath12k_warn(ar->ab,
+                     "Setting more than one MCS Value in bitrate mask 
not supported\n");
+-            return -EINVAL;
++            ret = -EINVAL;
++            goto out;
           }

  +        num_rates = ath12k_mac_bitrate_mask_num_he_rates(ar, band, mask);
@@ -1032,22 +1112,15 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +            num_rates > 1) {
  +            ath12k_warn(ar->ab,
  +                    "Setting more than one HE MCS Value in bitrate 
mask not supported\n");
-+            return -EINVAL;
++            ret = -EINVAL;
++            goto out;
  +        }
-+
-+        mutex_lock(&ar->conf_mutex);
           ieee80211_iterate_stations_mtx(hw,
                              ath12k_mac_disable_peer_fixed_rate,
                              arvif);
-
--        mutex_lock(&ar->conf_mutex);
--
-         arvif->bitrate_mask = *mask;
-         ieee80211_iterate_stations_mtx(hw,
-                            ath12k_mac_set_bitrate_mask_iter,
-@@ -8535,9 +9042,10 @@ ath12k_mac_op_set_bitrate_mask(struct ie
-
-     mutex_lock(&ar->conf_mutex);
+@@ -10159,9 +10704,10 @@ ath12k_mac_op_set_bitrate_mask(struct ie
+                            arvif);
+     }

  -    ret = ath12k_mac_set_fixed_rate_params(arvif, rate, nss, sgi, ldpc);
  +    ret = ath12k_mac_set_rate_params(arvif, rate, nss, sgi, ldpc, he_gi,
@@ -1083,7 +1156,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   enum wmi_cmd_group {
       /* 0 to 2 are reserved */
       WMI_GRP_START = 0x3,
-@@ -1132,7 +1148,9 @@ enum wmi_tlv_vdev_param {
+@@ -1145,7 +1161,9 @@ enum wmi_tlv_vdev_param {
       WMI_VDEV_PARAM_HE_RANGE_EXT,
       WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
       WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
@@ -1093,3 +1166,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE = 0x87,
       WMI_VDEV_PARAM_6GHZ_PARAMS = 0x99,
       WMI_VDEV_PARAM_PROTOTYPE = 0x8000,
+@@ -3579,6 +3597,15 @@ struct wmi_force_fw_hang_cmd {
+     __le32 delay_time_ms;
+ } __packed;
+
++/* Param values to be sent for WMI_VDEV_PARAM_SGI param_id
++ * which are used in 11n, 11ac systems
++ * @WMI_GI_800_NS - Always uses 0.8us (Long GI)
++ * @WMI_GI_400_NS - Firmware switches between 0.4us (Short GI)
++ *            and 0.8us (Long GI) based on packet error rate.
++ */
++#define WMI_GI_800_NS 0
++#define WMI_GI_400_NS 1
++
+ struct wmi_vdev_set_param_cmd {
+     __le32 tlv_header;
+     __le32 vdev_id;
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch 
b/package/kernel/mac80211/patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch
index 93cbd3b80273fb..0fc6cfb6c96cfb 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-7-wifi-ath12k-clean-up-80P80-support.patch
@@ -1,80 +1,80 @@
-From patchwork Wed Sep 18 21:20:54 2024
+From patchwork Wed May 21 22:45:37 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807218
+X-Patchwork-Id: 14096121
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7A2C15853D
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:29 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED55023958A
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:58 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694491; cv=none;
- 
b=IDDUnQF/Tnpw/FvWitX7ofLgG/RwY2FyN79K1j9v3STIk2mbRSVtS7kUmHv83gWDgLeingrnJyz3kE7pWhAK5Zt+U/d3HoSbyXlaWdr1m98ZLPJnOIO51q8LBaUW4uPaZbMJiRGvTbhFw+0k6FNjQse034o2zQ5vHk1qETT9XsU=
+    t=1747867560; cv=none;
+ 
b=R6R1l/0hUMYWkLzVM4w8Z2s3aU01ujlrdBV4IEYLrqQ3CzuP8xd2fnZMcdbVAFvXd/hepJKOZrFod6RG43u2TuGCQ5wM3SKIqyk0c/MlskZk+jnUnvm9WtrezJS82phw1G2mJ8NiYsKzmcJGMQtaYfl3jWA4o+BGMGyOg0Keb/M=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694491; c=relaxed/simple;
-    bh=4Sbgjg6TXf4A547Y46Qiyw4U55YEFrIGdUXLZjEx5C0=;
+    s=arc-20240116; t=1747867560; c=relaxed/simple;
+    bh=HUqzq2V1sSbcLZxqxveNb5xXvMg5sfyIhSzn4mKsdms=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=Y+NDqrjfpb1iFWpY9XYrVbCXhYRTFGsK7MN6jcsgZur7Ro+ZQsyZfhkFA+t+Bb52hk2p2N7v1TAdqLDK2CiFXaWPy/JfESHATwktCnNG+8/UL3n0VIjl+qxGTWt3pS/aWzI6yQjM2FB6tKc4kMnGX//RrgXhEIrh1M4ROs3IpJ0=
+ 
b=G9poRT2jwhhAC0htiaG4SIE8b1DuTf63uDCDCGj5WoQ4B/v/NWtaqtzBWJF4c7UuQBso4JO4X9auJyfxJ4SxUBrULdlJq7mvAs7nxFOPEBDBltLKWCZznLwuuuo690MjvUQ5mfKt/Oy+uREyur4vXsQtfSBZc0DSZUlC5R+Z2Mc=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=Kt1nBSex; arc=none smtp.client-ip=205.220.168.131
+ header.b=cu63IdMd; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="Kt1nBSex"
-Received: from pps.filterd (m0279866.ppops.net [127.0.0.1])
+ header.b="cu63IdMd"
+Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48IJrYUI005813;
-    Wed, 18 Sep 2024 21:21:27 GMT
+ 54LJgw7Z025025;
+    Wed, 21 May 2025 22:45:56 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    7iZtYFy4NRmF2YHXqLd4zDMUbigsFxIkBQ6OeDD3zOs=; b=Kt1nBSex9R0mUQFv
- fimFwEUDD2mzhj9KyoJnJsvbpzJOV9sBCCp3nPyxHNB66qzQUi/U904HE+wQ26S+
- Dmo2aGOzcx4GHLU8agTSdb51h1ylcD1ulUXKpEqDIEkWv7leWNteXYTqoj2aUvXQ
- MH261Yr4HRs5iWT53+FXUrPvY1eipkyG20XH2RcNT7XMMIT29hm5DRVTwU0kzAVU
- /0hrrSBcgbTJP0KA5zSfO+bFE7fyWSxrjOzt7ugW9KdHlAj5iNAeePRUUlvqSGe7
- 07QprF1ixgWWpsIbUnZdd9UZLPKot8h5Vous/24QLAznqmj/FgipHLT6+Dy61eVq
-    L/T40w==
+    90lF32RvbNU2yyxl2mGBEewKfDvRJ7MRRLe6DgCwXFs=; b=cu63IdMdS+nJIsqy
+ ktY/ZQ/qTTWf2MpubSMC9UftiwnI9Xj6K8LFE0q+NvCN2EgZKzf+OzyW9wbbRepN
+ Q3ZYBAR3lFyw40J6AZgpAuPiq7Y+eqt7l8jc+/2bb2+imOzvWHwFkXSvc8nijnHX
+ ZLEU29M0xloyHeJ7xLbumzRdfcCJ6357/HKp9U3mLvEfpLY97t5/H3yEJWHQmnvE
+ aHkFaLM6Ru2R2+nzPDylKcY+TZsqv306oEqydWI33ANyvfDkWJqbQjtQ+geTkJxC
+ syi9ZifD5zPdOjb9YWNn0V8mWUBRx6hW8ZKU/L3gWGXjkvyRHneZ4AOz83Tp9Ym4
+    L34jSQ==
  Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4jdu9q1-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsf-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:27 +0000 (GMT)
+    Wed, 21 May 2025 22:45:55 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
      by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL9Ux020570
+ 54LMjsWN022226
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:09 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:54 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:08 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
          Pradeep Kumar Chitrapu
      <quic_pradeepc at quicinc.com>,
          Jeff Johnson <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 7/9] wifi: ath12k: clean up 80P80 support
-Date: Wed, 18 Sep 2024 14:20:54 -0700
-Message-ID: <20240918212056.4137076-8-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 7/9] wifi: ath12k: clean up 80P80 support
+Date: Wed, 21 May 2025 15:45:37 -0700
+Message-ID: <20250521224539.355985-8-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -86,17 +86,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-ORIG-GUID: zOl2cVhwvoAFaH70WioUIdrk_oIr5c-T
-X-Proofpoint-GUID: zOl2cVhwvoAFaH70WioUIdrk_oIr5c-T
+X-Proofpoint-GUID: xDBdjIlSrmWJZkBfMwcImhxnyTIR4551
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX75XKL//oF16a
+ 
YMA/60ZSduIYMzTQ+PpEhRfS8BSEJ3JAYNLLDjp3b1hmrHJmdqMnxgbya6RQ+qeAISgkr8ZWIMx
+ 
fGx/btrlFP2SbXd0JWwSMOApD3LJewBu/ZeBWBDEWbbO00LOGnR0aFqmCeym6YSeYyakVcNd8nQ
+ 
0JnPxxBLeXeYPpIZTFMD6TpVFyfvtCG9jpMOI27FLBdHLednVW2yrOx5b62xwy181re5iN4XOki
+ 
1M/HJRMACpfQJImHpO9X3rRh2j79oKIKVwa3UjV8A7vD3noV/pV0SOTZP0awMYQH/Pn91nji685
+ 
auXzHG2pai3Byw89+jYZIG2xfiqBcBwIEARvw52XSv3glk0tSvLDxNo8nyFNPsZ63g70USl1IlC
+ AKhW+QOw9/zkn3oCB+3fZZ/y+F4vlu4OzN4gETU+6p3798YiFGWMvocQnI/Ig7Unex9rmOP5
+X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a3 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=QHHbJxpVzSBZVvfXPLwA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-ORIG-GUID: xDBdjIlSrmWJZkBfMwcImhxnyTIR4551
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- phishscore=0 impostorscore=0
- clxscore=1015 adultscore=0 mlxscore=0 suspectscore=0 malwarescore=0
- priorityscore=1501 spamscore=0 bulkscore=0 lowpriorityscore=0
- mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1
- engine=8.19.0-2408220000 definitions=main-2409180141
+ clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 
suspectscore=0
+ malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
+ lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
+ authcc= route=outbound adjust=0 reason=mlx scancount=1
+ engine=8.19.0-2505160000 definitions=main-2505210226

  Clean up unused 80P80 references as hardware does not support
  it. This is applicable to both QCN9274 and WCN7850.
@@ -106,14 +117,14 @@ Tested-on: QCN9274 hw2.0 PCI 
WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
  Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  ---
- drivers/net/wireless/ath/ath12k/mac.c | 51 ++++++---------------------
- drivers/net/wireless/ath/ath12k/wmi.c |  5 +--
+ drivers/net/wireless/ath/ath12k/mac.c | 48 ++++++---------------------
+ drivers/net/wireless/ath/ath12k/wmi.c |  2 --
   drivers/net/wireless/ath/ath12k/wmi.h |  1 -
- 3 files changed, 11 insertions(+), 46 deletions(-)
+ 3 files changed, 10 insertions(+), 41 deletions(-)

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -206,7 +206,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
+@@ -207,7 +207,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
               [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
               [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
               [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
@@ -122,7 +133,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
               [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
       },
       [NL80211_BAND_6GHZ] = {
-@@ -217,7 +217,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
+@@ -218,7 +218,7 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12
               [NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
               [NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
               [NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
@@ -131,9 +142,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
               [NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
       },

-@@ -2390,17 +2390,6 @@ static void ath12k_peer_assoc_h_he(struc
+@@ -2562,17 +2562,6 @@ static void ath12k_peer_assoc_h_he(struc

-     switch (sta->deflink.bandwidth) {
+     switch (link_sta->bandwidth) {
       case IEEE80211_STA_RX_BW_160:
  -        if (he_cap->he_cap_elem.phy_cap_info[0] &
  - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
@@ -149,15 +160,14 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v;

-@@ -2658,16 +2647,11 @@ static enum wmi_phy_mode ath12k_mac_get_
-                             struct ieee80211_sta *sta)
+@@ -2859,16 +2848,11 @@ static enum wmi_phy_mode ath12k_mac_get_
+                             struct ieee80211_link_sta *link_sta)
   {
-     if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
--        switch (sta->deflink.vht_cap.cap &
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
+-        switch (link_sta->vht_cap.cap &
  -            IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
  -        case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
-+        if (sta->deflink.vht_cap.cap &
-+            IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
++        if (link_sta->vht_cap.cap & 
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
               return MODE_11AC_VHT160;
  -        case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
  -            return MODE_11AC_VHT80_80;
@@ -166,15 +176,16 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  -            return MODE_11AC_VHT160;
  -        }
  +
-+        return MODE_UNKNOWN;
++        /* not sure if this is a valid case? */
++        return MODE_11AC_VHT160;
       }

-     if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
-@@ -2689,11 +2673,8 @@ static enum wmi_phy_mode ath12k_mac_get_
-         if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
+@@ -2890,11 +2874,8 @@ static enum wmi_phy_mode ath12k_mac_get_
+         if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
               return MODE_11AX_HE160;
--        else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
+-        else if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
  - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
  -            return MODE_11AX_HE80_80;
  -        /* not sure if this is a valid case? */
@@ -183,24 +194,24 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        return MODE_UNKNOWN;
       }

-     if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
-@@ -2721,14 +2702,7 @@ static enum wmi_phy_mode ath12k_mac_get_
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
+@@ -2922,14 +2903,10 @@ static enum wmi_phy_mode ath12k_mac_get_
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
               return MODE_11BE_EHT160;

--        if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
+-        if (link_sta->he_cap.he_cap_elem.phy_cap_info[0] &
  - IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
  -            return MODE_11BE_EHT80_80;
  -
--        ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 
Mhz: %d\n",
-- sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
--
+         ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 
Mhz: %d\n",
+ link_sta->he_cap.he_cap_elem.phy_cap_info[0]);
+
  -        return MODE_11BE_EHT160;
  +        return MODE_UNKNOWN;
       }

-     if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
-@@ -5806,8 +5780,6 @@ static void ath12k_mac_set_hemcsmap(stru
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_80)
+@@ -7012,8 +6989,6 @@ static void ath12k_mac_set_hemcsmap(stru
       mcs_nss->tx_mcs_80 = cpu_to_le16(txmcs_map & 0xffff);
       mcs_nss->rx_mcs_160 = cpu_to_le16(rxmcs_map & 0xffff);
       mcs_nss->tx_mcs_160 = cpu_to_le16(txmcs_map & 0xffff);
@@ -209,7 +220,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   }

   static void ath12k_mac_copy_he_cap(struct ath12k *ar,
-@@ -5829,6 +5801,7 @@ static void ath12k_mac_copy_he_cap(struc
+@@ -7035,6 +7010,7 @@ static void ath12k_mac_copy_he_cap(struc
           IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G |
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
           IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
@@ -217,7 +228,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       he_cap_elem->phy_cap_info[0] &=
~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
       he_cap_elem->phy_cap_info[5] &=
-@@ -8495,10 +8468,6 @@ static __le16
+@@ -10111,10 +10087,6 @@ static __le16
   ath12k_mac_get_tx_mcs_map(const struct ieee80211_sta_he_cap *he_cap)
   {
       if (he_cap->he_cap_elem.phy_cap_info[0] &
@@ -230,25 +241,22 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/wmi.c
  +++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -986,10 +986,7 @@ static void ath12k_wmi_put_wmi_channel(s
+@@ -1021,8 +1021,6 @@ static void ath12k_wmi_put_wmi_channel(s
+             chan->band_center_freq1 = cpu_to_le32(center_freq1 - 40);

-     chan->mhz = cpu_to_le32(arg->freq);
-     chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1);
--    if (arg->mode == MODE_11AC_VHT80_80)
+         chan->band_center_freq2 = cpu_to_le32(center_freq1);
+-    } else if (arg->mode == MODE_11BE_EHT80_80) {
  -        chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq2);
--    else
--        chan->band_center_freq2 = 0;
-+    chan->band_center_freq2 = 0;
-
-     chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE);
-     if (arg->passive)
+     } else {
+         chan->band_center_freq2 = 0;
+     }
  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -3633,7 +3633,6 @@ struct wmi_vdev_install_key_arg {
+@@ -3726,7 +3726,6 @@ struct wmi_vdev_install_key_arg {
   #define WMI_HOST_MAX_HE_RATE_SET        3
   #define WMI_HECAP_TXRX_MCS_NSS_IDX_80        0
   #define WMI_HECAP_TXRX_MCS_NSS_IDX_160        1
  -#define WMI_HECAP_TXRX_MCS_NSS_IDX_80_80    2

- struct wmi_rate_set_arg {
-     u32 num_rates;
+ #define ATH12K_WMI_MLO_MAX_PARTNER_LINKS \
+     (ATH12K_WMI_MLO_MAX_LINKS + ATH12K_MAX_NUM_BRIDGE_LINKS - 1)
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-8-wifi-ath12k-add-support-for-160-MHz-bandwidth.patch 
b/package/kernel/mac80211/patches/ath12k/104-8-wifi-ath12k-add-support-for-160-MHz-bandwidth.patch
index e3956385bdcbcc..e64373d8ccd58f 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-8-wifi-ath12k-add-support-for-160-MHz-bandwidth.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-8-wifi-ath12k-add-support-for-160-MHz-bandwidth.patch
@@ -1,68 +1,68 @@
-From patchwork Wed Sep 18 21:20:55 2024
+From patchwork Wed May 21 22:45:38 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807216
+X-Patchwork-Id: 14096124
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
  Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
   [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id C64DB1CB518
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:15 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id DEE9223A9AA
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:59 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
   arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694477; cv=none;
- 
b=aWI5JISgL9c0iB/8EAXYKF/Lb2sJoeG+v5+Va4eb/voqwiSQ4FtwPkCC00b9attXvu4dD9wEHGKPW8Uh2kb1tSTl0uNHxijRmLYK2VUWkLHsZ3Pd6VvGoTpbtmOTgsGklZHZiFd+jyWgGkHB4ZBkHSkG9JH6VR44MSIgNj8g14A=
+    t=1747867561; cv=none;
+ 
b=qWgm5H8L0Zhrc5crkCw7SBoGEQ8yf+aC0TSWOzfiTwcAddeStpjorEa3XaBl0GOhHPRaECOhMSNqu88tQ5CzCGmumBQ3QLC6mod6Tb0Y0PdeUJm3YoGKcI+F0oE3g5kCHaU9LRKKnmMZQS72kE7dO+lEBfwMIuCX/VwV066B1p8=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694477; c=relaxed/simple;
-    bh=AYJpDHbXZ0n0NNHQi7/aGcqo7YfyoYhv+FrXZ143wMA=;
+    s=arc-20240116; t=1747867561; c=relaxed/simple;
+    bh=61S52HJJJauXcXkg3NpFqkwtGSPNO+bmTpNYu1v9AKM=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=jD1C2mzFvENculg9HS0v02iWUDzrWXiuU5GXTyC/0BKAJirnQkOUdVm7u0AEPiMxfkktLT3QCJLuvnKu3ZqSXWNbc2zOdUHTyW12fKdDNHib1WYYySBnfqu4EmiJKGcTE57VFlVdbklngOCDTCqHvVgP7YitGg2fWLPqBP/4yhM=
+ 
b=gi5WIxM8SYlljyfdAVTdIK6JQ5jJHPGGfdxPkwbtEaPElRA55vurxkaaJ0RktTtDYYJEn7KLZFieBHAv5/nEcrDjL4NGvgT3wiAoGcbsd+TIF6w5J2RSmAwhAP008N5swveLHDzJ0M9TrtQj2HHndc8JPD4oGWbcEqKQqHSq8ck=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=OMqc+btb; arc=none smtp.client-ip=205.220.180.131
+ header.b=lMYw009C; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="OMqc+btb"
-Received: from pps.filterd (m0279872.ppops.net [127.0.0.1])
+ header.b="lMYw009C"
+Received: from pps.filterd (m0279868.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48I8sxTR020476;
-    Wed, 18 Sep 2024 21:21:11 GMT
+ 54LJgEPE029249;
+    Wed, 21 May 2025 22:45:56 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    dFohRj9vqwjJTRRYk31/1oJCFqLLKUuQ/verxCo/cGo=; b=OMqc+btbHl9cHSxO
- NauW5WX4C34QsGL/4d03QTtCDlctfB5PRmINiP2/jGcVZk3NZWS3d2f5zjPY7+hd
- uaUDslDMQwvAj1Jay/we1qNaFIPuzj4c9BbHqvvXa0WiCgQWpBC2h2jcFLXbeVHE
- 5bqH+plXU5cz1d2YbsRpCXsdUWL/+S3u6A6/qxj6UraJ1s/rkE4ndQe/AQuf96Ja
- ylYiZPdtJJXzB6rPDN1bQsSET/PNXzIkrYTaDLF9A6688WU9izJdAjRcsu8oB8o1
- U+yftDfoegI7+ZyTZ4JUnQs7zJp171L/qsF0U9RONZCIbSLN9pkTo6xp6CrHGeLQ
-    0tCmwQ==
-Received: from nalasppmta05.qualcomm.com (Global_NAT1.qualcomm.com
+    ph+yJaIkwYsZzzEsymzTjupgmHjdwFMJhbEzuPrYvfY=; b=lMYw009CSvZqDxkz
+ +HCEzcZhy6QO8G2ut93TJxHdCbVLlRaMNReXGlGqx2KRNracyLRkAQsC16i+QcpJ
+ aHBvIE2c0/TEtBiyv3HzBf3/89R0POT080sz81P6go3m8w9bcIE+Q2DqjdhVNqu3
+ AlV8qb6pj/QUVvDbJQxO1M9eCXSO6g2BBDjgRCktOu+x2TlxhdBZ/tJP+h0AUk+j
+ YsH1LhcLOZYCFTJyB6IFmHWvtGk5Ef6i6D/tXyCL7nQiDP/R1v2PcdlLlI5e5/PO
+ FhKB2+RCmSyJUtyaAHHi/mVen5yqFX2K3/vL3BtprRAJINhFxQrLs6xLIQabELzj
+    KCstuQ==
+Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4j6uagr-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwfb4b3x-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:10 +0000 (GMT)
+    Wed, 21 May 2025 22:45:55 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILL9IB009589
+    by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjtX2022238
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:09 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:55 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:09 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
@@ -71,12 +71,13 @@ CC: <linux-wireless at vger.kernel.org>,
          P Praneesh <quic_ppranees at quicinc.com>,
          "Jeff
   Johnson" <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 8/9] wifi: ath12k: add support for 160 MHz bandwidth
-Date: Wed, 18 Sep 2024 14:20:55 -0700
-Message-ID: <20240918212056.4137076-9-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 8/9] wifi: ath12k: add support for 160 MHz
+ bandwidth
+Date: Wed, 21 May 2025 15:45:38 -0700
+Message-ID: <20250521224539.355985-9-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -88,17 +89,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-ORIG-GUID: wO0mnzqAAbcWYLNaoEhU3YfsdCyDJ2hk
-X-Proofpoint-GUID: wO0mnzqAAbcWYLNaoEhU3YfsdCyDJ2hk
+X-Proofpoint-ORIG-GUID: T9MbsOp4F8M93FD6ZEyfm1BTh5tEiCIl
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX0EeEFBAyVxZV
+ 
WX6jh2dkCn4P+eViI8Gvz/6S+yZ+Avx9/8To2mbulh5j1kDm92bEDu7iQtI17ILPnOgbUXWAjjt
+ 
Z2LvemtbMzJe0lY0EjJNWWunihdlsXPAdOnZFjV0rOtakq8Xx4y8K45/1cGY9dQOApxDFC9HiLZ
+ 
+FK9apopZ2DyP6haLf5HQI+6DC3wwgbEQlE+89g69hXEM8UePlFlsf0fpfIVgiWG73gfzHkrRPM
+ 
8ByVGmKpFSXIBmvY+EZZOPuPsQHt/91pIisXw5Joxdbl6Qf2anjuC0X4LPrTgTxgXWhljS4JdXo
+ 
djhNt09IBnNuagxN9aMx/frUhqQPNL54kp/cXbpgcLQX0XQg8SOvwyxJs+CALQUyymluDLHyH9w
+ UQUznCXFrps86AX/Fpnhrl9hqR5NO0/6oR340zsS7mvryRucOqzT7vc3WPMJEhW68VMCAl5Z
+X-Proofpoint-GUID: T9MbsOp4F8M93FD6ZEyfm1BTh5tEiCIl
+X-Authority-Analysis: v=2.4 cv=dLCmmPZb c=1 sm=1 tr=0 ts=682e57a4 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=dOJm2eNAaUnF9U8lSB4A:9
+ a=TjNXssC_j7lpFel5tvFf:22
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- phishscore=0 mlxlogscore=999
- mlxscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 clxscore=1015
- adultscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 impostorscore=0
- classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2408220000
- definitions=main-2409180140
+ mlxscore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 
suspectscore=0
+ impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 
spamscore=0
+ priorityscore=1501 classifier=spam authscore=0 authtc=n/a authcc=
+ route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2505160000
+ definitions=main-2505210226

  Add support to configure maximum NSS in 160 MHz bandwidth.
  Firmware advertises support for handling NSS ratio information
@@ -119,18 +131,18 @@ Signed-off-by: Pradeep Kumar Chitrapu 
<quic_pradeepc at quicinc.com>
  Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  ---
   drivers/net/wireless/ath/ath12k/core.h |  2 +
- drivers/net/wireless/ath/ath12k/mac.c  | 85 ++++++++++++++++++++++----
+ drivers/net/wireless/ath/ath12k/mac.c  | 89 ++++++++++++++++++++++----
   drivers/net/wireless/ath/ath12k/mac.h  |  2 +
- drivers/net/wireless/ath/ath12k/wmi.c  | 19 +++++-
- drivers/net/wireless/ath/ath12k/wmi.h  | 28 +++++++++
- 5 files changed, 124 insertions(+), 12 deletions(-)
+ drivers/net/wireless/ath/ath12k/wmi.c  |  7 +-
+ drivers/net/wireless/ath/ath12k/wmi.h  | 28 ++++++++
+ 5 files changed, 115 insertions(+), 13 deletions(-)

  --- a/drivers/net/wireless/ath/ath12k/core.h
  +++ b/drivers/net/wireless/ath/ath12k/core.h
-@@ -717,6 +717,8 @@ struct ath12k_pdev_cap {
-     u32 tx_chain_mask_shift;
-     u32 rx_chain_mask_shift;
+@@ -786,6 +786,8 @@ struct ath12k_pdev_cap {
       struct ath12k_band_cap band[NUM_NL80211_BANDS];
+     u32 eml_cap;
+     u32 mld_cap;
  +    bool nss_ratio_enabled;
  +    u8 nss_ratio_info;
   };
@@ -138,7 +150,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   struct mlo_timestamp {
  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -2050,6 +2050,34 @@ ath12k_peer_assoc_h_vht_limit(u16 tx_mcs
+@@ -2191,6 +2191,34 @@ ath12k_peer_assoc_h_vht_limit(u16 tx_mcs
       return tx_mcs_set;
   }

@@ -171,28 +183,27 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +}
  +
   static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
-                     struct ieee80211_vif *vif,
-                     struct ieee80211_sta *sta,
-@@ -2065,6 +2093,7 @@ static void ath12k_peer_assoc_h_vht(stru
+                     struct ath12k_link_vif *arvif,
+                     struct ath12k_link_sta *arsta,
+@@ -2208,6 +2236,7 @@ static void ath12k_peer_assoc_h_vht(stru
       u8 max_nss, vht_mcs;
       int i, vht_nss, nss_idx;
       bool user_rate_valid = true;
  +    u32 rx_nss, tx_nss, nss_160;

-     if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
-         return;
-@@ -2159,10 +2188,24 @@ static void ath12k_peer_assoc_h_vht(stru
+     lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
+@@ -2312,10 +2341,24 @@ static void ath12k_peer_assoc_h_vht(stru
       /* TODO:  Check */
       arg->tx_max_mcs_nss = 0xFF;

  -    ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac vht peer %pM max_mpdu %d 
flags 0x%x\n",
--           sta->addr, arg->peer_max_mpdu, arg->peer_flags);
+-           arsta->addr, arg->peer_max_mpdu, arg->peer_flags);
  +    if (arg->peer_phymode == MODE_11AC_VHT160) {
  +        tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
  +        rx_nss = min(arg->peer_nss, tx_nss);
  +        arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;
-
--    /* TODO: rxnss_override */
++
  +        if (!rx_nss) {
  +            ath12k_warn(ar->ab, "invalid max_nss\n");
  +            return;
@@ -201,28 +212,26 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        nss_160 = u32_encode_bits(rx_nss - 1, ATH12K_PEER_RX_NSS_160MHZ);
  +        arg->peer_bw_rxnss_override |= nss_160;
  +    }
-+
+
+-    /* TODO: rxnss_override */
  +    ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  +           "mac vht peer %pM max_mpdu %d flags 0x%x nss_override 0x%x\n",
-+           sta->addr, arg->peer_max_mpdu, arg->peer_flags,
++           arsta->addr, arg->peer_max_mpdu, arg->peer_flags,
  +           arg->peer_bw_rxnss_override);
   }

   static int ath12k_mac_get_max_he_mcs_map(u16 mcs_map, int nss)
-@@ -2251,6 +2294,7 @@ static void ath12k_peer_assoc_h_he(struc
+@@ -2408,6 +2451,7 @@ static void ath12k_peer_assoc_h_he(struc
       u16 he_tx_mcs = 0, v = 0;
       int he_nss, nss_idx;
       bool user_rate_valid = true;
  +    u32 rx_nss, tx_nss, nss_160;

-     if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
+     if (WARN_ON(ath12k_mac_vif_link_chan(vif, link_id, &def)))
           return;
-@@ -2429,11 +2473,28 @@ static void ath12k_peer_assoc_h_he(struc
-             he_mcs_mask[i])
-             max_nss = i + 1;
-     }
-+    max_nss = min(max_nss, ar->num_tx_chains);
-     arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
+@@ -2605,9 +2649,25 @@ static void ath12k_peer_assoc_h_he(struc
+     max_nss = min(max_nss, ar->num_tx_chains);
+     arg->peer_nss = min(link_sta->rx_nss, max_nss);

  +    if (arg->peer_phymode == MODE_11AX_HE160) {
  +        tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
@@ -240,30 +249,31 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +
       ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
  -           "mac he peer %pM nss %d mcs cnt %d\n",
--           sta->deflink.addr, arg->peer_nss, arg->peer_he_mcs_count);
+-           arsta->addr, arg->peer_nss, arg->peer_he_mcs_count);
  +           "mac he peer %pM nss %d mcs cnt %d nss_override 0x%x\n",
-+           sta->deflink.addr, arg->peer_nss,
++           arsta->addr, arg->peer_nss,
  +           arg->peer_he_mcs_count,
  +           arg->peer_bw_rxnss_override);
   }

   static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
-@@ -2965,13 +3026,13 @@ static void ath12k_peer_assoc_prepare(st
-     ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
-+    ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_he(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_eht(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
--    ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
-     ath12k_peer_assoc_h_smps(sta, arg);
+@@ -2848,10 +2908,13 @@ static enum wmi_phy_mode ath12k_mac_get_
+                             struct ieee80211_link_sta *link_sta)
+ {
+     if (link_sta->bandwidth == IEEE80211_STA_RX_BW_160) {
+-        if (link_sta->vht_cap.cap & 
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)
++        if (link_sta->vht_cap.cap & 
(IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
++            IEEE80211_VHT_CAP_EXT_NSS_BW_MASK))
+             return MODE_11AC_VHT160;
+
+-        /* not sure if this is a valid case? */
++        /* Allow STA to connect even if it does not explicitly 
advertise 160 MHz
++         * support
++         */
+         return MODE_11AC_VHT160;
+     }

-     /* TODO: amsdu_disable req? */
-@@ -5552,10 +5613,8 @@ ath12k_create_vht_cap(struct ath12k *ar,
+@@ -6761,10 +6824,8 @@ ath12k_create_vht_cap(struct ath12k *ar,

       ath12k_set_vht_txbf_cap(ar, &vht_cap.cap);

@@ -276,29 +286,29 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       rxmcs_map = 0;
       txmcs_map = 0;
-@@ -9711,7 +9770,8 @@ static int ath12k_mac_setup_iface_combin
-     combinations[0].radar_detect_widths = 
BIT(NL80211_CHAN_WIDTH_20_NOHT) |
-                         BIT(NL80211_CHAN_WIDTH_20) |
-                         BIT(NL80211_CHAN_WIDTH_40) |
--                        BIT(NL80211_CHAN_WIDTH_80);
-+                        BIT(NL80211_CHAN_WIDTH_80) |
-+                        BIT(NL80211_CHAN_WIDTH_160);
+@@ -11370,7 +11431,8 @@ ath12k_mac_setup_radio_iface_comb(struct
+     comb[0].radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
+                     BIT(NL80211_CHAN_WIDTH_20) |
+                     BIT(NL80211_CHAN_WIDTH_40) |
+-                    BIT(NL80211_CHAN_WIDTH_80);
++                    BIT(NL80211_CHAN_WIDTH_80) |
++                    BIT(NL80211_CHAN_WIDTH_160);

-     wiphy->iface_combinations = combinations;
-     wiphy->n_iface_combinations = 1;
-@@ -9927,6 +9987,9 @@ static int ath12k_mac_hw_register(struct
+     return 0;
+ }
+@@ -11744,6 +11806,9 @@ static int ath12k_mac_hw_register(struct
       ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
       ieee80211_hw_set(hw, REPORTS_LOW_ACK);

  +    if (cap->nss_ratio_enabled)
  +        ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
  +
-     if ((ht_cap & WMI_HT_CAP_ENABLED) || ar->supports_6ghz) {
+     if ((ht_cap & WMI_HT_CAP_ENABLED) || is_6ghz) {
           ieee80211_hw_set(hw, AMPDU_AGGREGATION);
           ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
  --- a/drivers/net/wireless/ath/ath12k/mac.h
  +++ b/drivers/net/wireless/ath/ath12k/mac.h
-@@ -37,6 +37,8 @@ struct ath12k_generic_iter {
+@@ -38,6 +38,8 @@ struct ath12k_generic_iter {
   #define IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11    BIT(24)

   #define ATH12K_CHAN_WIDTH_NUM            14
@@ -320,35 +330,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       } else {
           return -EINVAL;
       }
-@@ -982,11 +986,24 @@ int ath12k_wmi_vdev_down(struct ath12k *
- static void ath12k_wmi_put_wmi_channel(struct 
ath12k_wmi_channel_params *chan,
-                        struct wmi_vdev_start_req_arg *arg)
- {
-+    u32 center_freq1 = arg->band_center_freq1;
-+
-     memset(chan, 0, sizeof(*chan));
+@@ -1014,7 +1018,8 @@ static void ath12k_wmi_put_wmi_channel(s

-     chan->mhz = cpu_to_le32(arg->freq);
-     chan->band_center_freq1 = cpu_to_le32(arg->band_center_freq1);
--    chan->band_center_freq2 = 0;
-+    if (arg->mode == MODE_11AX_HE160) {
-+        if (arg->freq > center_freq1)
-+            chan->band_center_freq1 =
-+                    cpu_to_le32(center_freq1 + 40);
-+        else
-+            chan->band_center_freq1 =
-+                    cpu_to_le32(center_freq1 - 40);
-+
-+        chan->band_center_freq2 = cpu_to_le32(arg->band_center_freq1);
-+    } else {
-+        chan->band_center_freq2 = 0;
-+    }
+         chan->band_center_freq2 = cpu_to_le32(center_freq1);

-     chan->info |= le32_encode_bits(arg->mode, WMI_CHAN_INFO_MODE);
-     if (arg->passive)
+-    } else if (arg->mode == MODE_11BE_EHT160) {
++    } else if (arg->mode == MODE_11BE_EHT160 ||
++           arg->mode == MODE_11AX_HE160) {
+         if (arg->freq > center_freq1)
+             chan->band_center_freq1 = cpu_to_le32(center_freq1 + 40);
+         else
  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -2264,6 +2264,21 @@ enum wmi_direct_buffer_module {
+@@ -2290,6 +2290,21 @@ enum wmi_direct_buffer_module {
       WMI_DIRECT_BUF_MAX
   };

@@ -370,7 +364,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   struct ath12k_wmi_pdev_band_arg {
       u32 pdev_id;
       u32 start_freq;
-@@ -2580,6 +2595,12 @@ struct ath12k_wmi_hw_mode_cap_params {
+@@ -2606,6 +2621,12 @@ struct ath12k_wmi_hw_mode_cap_params {
   } __packed;

   #define WMI_MAX_HECAP_PHY_SIZE                 (3)
@@ -383,7 +377,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

   /* pdev_id is present in lower 16 bits of pdev_and_hw_link_ids in
    * ath12k_wmi_mac_phy_caps_params & ath12k_wmi_caps_ext_params.
-@@ -2621,6 +2642,13 @@ struct ath12k_wmi_mac_phy_caps_params {
+@@ -2647,6 +2668,13 @@ struct ath12k_wmi_mac_phy_caps_params {
       __le32 he_cap_info_2g_ext;
       __le32 he_cap_info_5g_ext;
       __le32 he_cap_info_internal;
diff --git 
a/package/kernel/mac80211/patches/ath12k/104-9-wifi-ath12k-add-extended-NSS-bandwidth-support-for-160-MHz.patch 
b/package/kernel/mac80211/patches/ath12k/104-9-wifi-ath12k-add-extended-NSS-bandwidth-support-for-160-MHz.patch
index 709ef8ecc46064..149c3f50a10665 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-9-wifi-ath12k-add-extended-NSS-bandwidth-support-for-160-MHz.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-9-wifi-ath12k-add-extended-NSS-bandwidth-support-for-160-MHz.patch
@@ -1,81 +1,81 @@
-From patchwork Wed Sep 18 21:20:56 2024
+From patchwork Wed May 21 22:45:39 2025
  Content-Type: text/plain; charset="utf-8"
  MIME-Version: 1.0
  Content-Transfer-Encoding: 7bit
  X-Patchwork-Submitter: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
-X-Patchwork-Id: 13807214
+X-Patchwork-Id: 14096122
  X-Patchwork-Delegate: quic_jjohnson at quicinc.com
-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com
- [205.220.168.131])
+Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com
+ [205.220.180.131])
      (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
      (No client certificate requested)
-    by smtp.subspace.kernel.org (Postfix) with ESMTPS id A44471CB32B
-    for <linux-wireless at vger.kernel.org>; Wed, 18 Sep 2024 21:21:14 
+0000 (UTC)
+    by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A1E9239E85
+    for <linux-wireless at vger.kernel.org>; Wed, 21 May 2025 22:45:59 
+0000 (UTC)
  Authentication-Results: smtp.subspace.kernel.org;
- arc=none smtp.client-ip=205.220.168.131
+ arc=none smtp.client-ip=205.220.180.131
  ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
-    t=1726694476; cv=none;
- 
b=YnQUUZ4IfmLtgtYCtYRGhH8uRGd6VL74IRylGv6Ihb2PMO/n5UdfZlDk/m9w0OH4/sSsqULSz2lupiSTwXCPxc+73uK+OUjIEmCfPlNdrtzK2naXyiXAASPqonpnRBnyoIFwaE8zj8AHUqk5TAajedqpK9EnOaboX2XGYVbe0yI=
+    t=1747867561; cv=none;
+ 
b=YNQGoLeTsEUX0an1dYT8uFrTBxczoxLPoB0nXP+MEP3YMcemaxVf4zoi5GMSuKPLe4yeLz/R7AB090SrXrBTbY6MmwXLrUJGFBQUGwr05KQ5BnedSLyVE+PtNo01ZVjrjprsc5LC4z0vYHmQdBsqIfqP+bb+ATVkdkkKWV4Kg3A=
  ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
-    s=arc-20240116; t=1726694476; c=relaxed/simple;
-    bh=TAPBD6g5pYNuC8Odk6t6JkL8GvKdG9H30IPHTEgA7C0=;
+    s=arc-20240116; t=1747867561; c=relaxed/simple;
+    bh=WkoD1wqfpiPds2ZNAwn7TY38LnC6cJOAuobqk3tWbSk=;
      h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References:
       MIME-Version:Content-Type;
- 
b=djAINL+wQRgQaGOI4fotrExnm1Yz5quwEW2I7s85hWLI3gB+HsjwPKWJypllDKm8W0FDcrsoZWFmOrfx0wJ5LIe+OtXJ4ijSG7xcJeGtgDXZ3hAA5ZBk/B+CD+g+NZ3c0mwkSKpUm5dUBPKi1+kJsPuVEwKeCmdMVj8QHSYMXPw=
+ 
b=aAO1mDb/PrwqKRHoeS0PAxgJAvDLPWPPBkzRX0hwJbFzcXtKdtWHDE83rjGbjR1bnM7lhkAU4SwoT87sOuciveNqdywUe6+9XTB2oWM/j0Tza/ZRKKRZFeByh7ib8Aibzc4y0ACg7Oaz/QhmWmPObPjc4oKuVzaH/P8Tub0rBcI=
  ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com;
   spf=pass smtp.mailfrom=quicinc.com;
   dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b=i4iTJD+Z; arc=none smtp.client-ip=205.220.168.131
+ header.b=o3M+Sjyr; arc=none smtp.client-ip=205.220.180.131
  Authentication-Results: smtp.subspace.kernel.org;
   dmarc=pass (p=none dis=none) header.from=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
   spf=pass smtp.mailfrom=quicinc.com
  Authentication-Results: smtp.subspace.kernel.org;
      dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com
- header.b="i4iTJD+Z"
-Received: from pps.filterd (m0279863.ppops.net [127.0.0.1])
+ header.b="o3M+Sjyr"
+Received: from pps.filterd (m0279871.ppops.net [127.0.0.1])
      by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id
- 48I9VJ15022098;
-    Wed, 18 Sep 2024 21:21:11 GMT
+ 54LJHZNq001758;
+    Wed, 21 May 2025 22:45:56 GMT
  DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=
cc:content-transfer-encoding:content-type:date:from:in-reply-to
      :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=
-    2gwv4CbPGErAHv9NWtZrCSVk7NoZpHzKz9tuTs+8dV4=; b=i4iTJD+ZMXDp8Ul8
- HTo5IL/NLwS3mnlutEaaL+juUKm+wsFdl/BeMp9CC4H/sapolIhM4Zje9t3H9K0R
- +z1OxQDEekvWrrfUlikEaUHjOEwQ4YKSPJ+1uAIrbbA3REWeW5z39IITJ3dGU05N
- hnfPQEiFcPgDbFQv0Iaf434znv8rbOow6dc+M1E6EjpGd92Mq80BpsJqP8Ee0RUr
- WO3rsws1kXzFs6ELsg/FmC3l6eG9A4z9SUxcZ7QqTaz8aPOAZS/lclN0cOJT7VgK
- 7UNPGoDoJhTmHEX17W/rQR8RiV8c0hMciOuB1sfI7H/1uGkEPMjmfIsEdBjQ/9oa
-    DDiHrg==
-Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com
+    wh8AVrVaz3Wne8xUCnRodQGPYbrNE8Rm9/NepU3KoQA=; b=o3M+SjyriKBrU+dH
+ +Uwb/f5RzskxDlOAgOvwNH7O5p766ueJYE/nAazyAuVI1fbDT1gkgvOM4VOLQAPP
+ zg9tDUD5Mz80GzBzSnheYbeedz7RgpaN14Qr6Gz/+1yrP4wWTh2quGduIAXBFDZR
+ QpWsQh2DxVOvXqoLRm64iurJNhvpq+YIAwpAxEA9Fp46SrXsFefc82nza6qgdk5P
+ pUjalFWnwLLxaSHJj2EoJhFDAf99q9N5KNKW/UCNY8A2CwQXqL9KmggTLRK1OC+S
+ ueHigeV9ydoGGD1W6zmEdydGv5JSaQRhjAxtJokUtrlUwn8mbpJyokm+Ie4GZV5v
+    tie1qQ==
+Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com
   [129.46.96.20])
-    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 41n4hfk92c-1
+    by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 46rwf6vbsg-1
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:11 +0000 (GMT)
+    Wed, 21 May 2025 22:45:56 +0000 (GMT)
  Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com
   [10.47.209.196])
-    by NALASPPMTA02.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
- 48ILLA0u011397
+    by NALASPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id
+ 54LMjtcB022245
      (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 
verify=NOT);
-    Wed, 18 Sep 2024 21:21:10 GMT
-Received: from ath12k-linux1.qualcomm.com (10.80.80.8) by
+    Wed, 21 May 2025 22:45:55 GMT
+Received: from ath12k-linux2.qualcomm.com (10.80.80.8) by
   nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server
   (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
- 15.2.1544.9; Wed, 18 Sep 2024 14:21:09 -0700
+ 15.2.1544.9; Wed, 21 May 2025 15:45:54 -0700
  From: Pradeep Kumar Chitrapu <quic_pradeepc at quicinc.com>
  To: <ath12k at lists.infradead.org>
  CC: <linux-wireless at vger.kernel.org>,
          Pradeep Kumar Chitrapu
      <quic_pradeepc at quicinc.com>,
          Jeff Johnson <quic_jjohnson at quicinc.com>
-Subject: [PATCH V8 9/9] wifi: ath12k: add extended NSS bandwidth 
support for
- 160 MHz
-Date: Wed, 18 Sep 2024 14:20:56 -0700
-Message-ID: <20240918212056.4137076-10-quic_pradeepc at quicinc.com>
-X-Mailer: git-send-email 2.34.1
-In-Reply-To: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
-References: <20240918212056.4137076-1-quic_pradeepc at quicinc.com>
+Subject: [PATCH ath-next V14 9/9] wifi: ath12k: add extended NSS bandwidth
+ support for 160 MHz
+Date: Wed, 21 May 2025 15:45:39 -0700
+Message-ID: <20250521224539.355985-10-quic_pradeepc at quicinc.com>
+X-Mailer: git-send-email 2.43.0
+In-Reply-To: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
+References: <20250521224539.355985-1-quic_pradeepc at quicinc.com>
  Precedence: bulk
  X-Mailing-List: linux-wireless at vger.kernel.org
  List-Id: <linux-wireless.vger.kernel.org>
@@ -87,17 +87,28 @@ X-ClientProxiedBy: nasanex01a.na.qualcomm.com 
(10.52.223.231) To
  X-QCInternal: smtphost
  X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800
   signatures=585085
-X-Proofpoint-GUID: Mta6b5FqdCLrvsiUf1WwMHFr8SiJUh5L
-X-Proofpoint-ORIG-GUID: Mta6b5FqdCLrvsiUf1WwMHFr8SiJUh5L
+X-Proofpoint-GUID: 3XlPaBNySyE2wx5TC6p1DVWVXzadsV9U
+X-Proofpoint-Spam-Details-Enc: 
AW1haW4tMjUwNTIxMDIyNiBTYWx0ZWRfX4g8vKznbpwuH
+ 
ZKoHe/eZESaXJ/nU0MF27s2mZH9kbhxkG1nYDBAxgIAR6HSB4Ir8V8BP9wvETNPaaV4xpgjbT6m
+ 
sDGIplm3HpwbpmQYiBtQIsOrs/s1B2t7uVdhqW02FHlFu/UIBLwZc7J8sLJcsYdxHYcx7MQ3nEe
+ 
tDoPrPTEwHw7n1CnzcfVsEUAuxuJ5iFaxBATgZF+LuAhijNvhyaoEWRUO2KUcBJaFHq/QbCYfpY
+ 
JBXWUNl+mlZxfQe4pogCpRmvEOONRvpKgZLFdEAxf2Fx0Z7OhaIV84gi99TYTjfe1aihjorJ/cp
+ 
cv78Jzcd3Pe3GwTFD0ZOqI30oSiaUyJS3E9XIjfDGLAVMK6FeM+KOYgnqo95ImgBH8HRshrA4LJ
+ qTKv2kKP1y4zPtpf7lmI2mcl7emiLGQx+t0d7Z8upCbYseoNAGHUkFJ45HF940Za9ZkEYTRq
+X-Authority-Analysis: v=2.4 cv=fZOty1QF c=1 sm=1 tr=0 ts=682e57a4 cx=c_pps
+ a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17
+ a=GEpy-HfZoHoA:10 a=dt9VzEwgFbYA:10 a=COk6AnOGAAAA:8 
a=Opr4SxZhII4Vei-TI5AA:9
+ a=TjNXssC_j7lpFel5tvFf:22
+X-Proofpoint-ORIG-GUID: 3XlPaBNySyE2wx5TC6p1DVWVXzadsV9U
  X-Proofpoint-Virus-Version: vendor=baseguard
- engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29
- definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01
+ engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40
+ definitions=2025-05-21_07,2025-05-20_03,2025-03-28_01
  X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0
- priorityscore=1501
- clxscore=1015 phishscore=0 malwarescore=0 mlxlogscore=999 mlxscore=0
- impostorscore=0 adultscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0
- bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1
- engine=8.19.0-2408220000 definitions=main-2409180140
+ clxscore=1015 mlxscore=0 adultscore=0 spamscore=0 bulkscore=0 
suspectscore=0
+ malwarescore=0 priorityscore=1501 impostorscore=0 mlxlogscore=999
+ lowpriorityscore=0 phishscore=0 classifier=spam authscore=0 authtc=n/a
+ authcc= route=outbound adjust=0 reason=mlx scancount=1
+ engine=8.19.0-2505160000 definitions=main-2505210226

  Currently rx and tx MCS map for 160 MHz under HE capabilities
  are not updating properly, when 160 MHz is configured with NSS
@@ -121,19 +132,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -2477,8 +2477,10 @@ static void ath12k_peer_assoc_h_he(struc
-     arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
+@@ -2650,8 +2650,10 @@ static void ath12k_peer_assoc_h_he(struc
+     arg->peer_nss = min(link_sta->rx_nss, max_nss);

       if (arg->peer_phymode == MODE_11AX_HE160) {
  -        tx_nss = ath12k_get_nss_160mhz(ar, max_nss);
  +        tx_nss = ath12k_get_nss_160mhz(ar, ar->num_tx_chains);
           rx_nss = min(arg->peer_nss, tx_nss);
  +
-+        arg->peer_nss = min(sta->deflink.rx_nss, ar->num_rx_chains);
++        arg->peer_nss = min(link_sta->rx_nss, ar->num_rx_chains);
           arg->peer_bw_rxnss_override = ATH12K_BW_NSS_MAP_ENABLE;

           if (!rx_nss) {
-@@ -5636,6 +5638,12 @@ ath12k_create_vht_cap(struct ath12k *ar,
+@@ -6847,6 +6849,12 @@ ath12k_create_vht_cap(struct ath12k *ar,
       vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
       vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);

@@ -146,7 +157,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       return vht_cap;
   }

-@@ -5816,11 +5824,12 @@ static void ath12k_mac_set_hemcsmap(stru
+@@ -7027,11 +7035,12 @@ static void ath12k_mac_set_hemcsmap(stru
                       struct ieee80211_sta_he_cap *he_cap)
   {
       struct ieee80211_he_mcs_nss_supp *mcs_nss = &he_cap->he_mcs_nss_supp;
@@ -162,7 +173,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       for (i = 0; i < 8; i++) {
           if (i < ar->num_tx_chains &&
               (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
-@@ -5833,12 +5842,24 @@ static void ath12k_mac_set_hemcsmap(stru
+@@ -7044,12 +7053,24 @@ static void ath12k_mac_set_hemcsmap(stru
               rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
           else
               rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);

 From 0aeec79fdecc89f341ec2a0135a7636059750bf8 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Fri, 13 Jun 2025 13:26:00 +0200
Subject: [PATCH 11/14] mac80211: convert short fops to debugfs files

Reverse 
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=31cb94f71c1ba126b9c684c5882cbf5032d0d1bc
for compatibility with kernel 6.6 and 6.12.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  ...-convert-short-fops-to-debugfs-files.patch | 210 ++++++++++++++++++
  1 file changed, 210 insertions(+)
  create mode 100644 
package/kernel/mac80211/patches/build/410-mac80211-convert-short-fops-to-debugfs-files.patch

diff --git 
a/package/kernel/mac80211/patches/build/410-mac80211-convert-short-fops-to-debugfs-files.patch 
b/package/kernel/mac80211/patches/build/410-mac80211-convert-short-fops-to-debugfs-files.patch
new file mode 100644
index 00000000000000..dcaa086cf51f4e
--- /dev/null
+++ 
b/package/kernel/mac80211/patches/build/410-mac80211-convert-short-fops-to-debugfs-files.patch
@@ -0,0 +1,210 @@
+--- a/net/mac80211/debugfs.c
++++ b/net/mac80211/debugfs.c
+@@ -42,8 +42,9 @@ static ssize_t name## _read(struct file
+ }
+
+ #define DEBUGFS_READONLY_FILE_OPS(name)            \
+-static const struct debugfs_short_fops name## _ops = {                \
++static const struct file_operations name## _ops = {            \
+     .read = name## _read,                        \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ };
+
+@@ -141,9 +142,10 @@ static ssize_t aqm_write(struct file *fi
+     return -EINVAL;
+ }
+
+-static const struct debugfs_short_fops aqm_ops = {
++static const struct file_operations aqm_ops = {
+     .write = aqm_write,
+     .read = aqm_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -192,9 +194,10 @@ static ssize_t airtime_flags_write(struc
+     return count;
+ }
+
+-static const struct debugfs_short_fops airtime_flags_ops = {
++static const struct file_operations airtime_flags_ops = {
+     .write = airtime_flags_write,
+     .read = airtime_flags_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -222,8 +225,9 @@ static ssize_t aql_pending_read(struct f
+                        buf, len);
+ }
+
+-static const struct debugfs_short_fops aql_pending_ops = {
++static const struct file_operations aql_pending_ops = {
+     .read = aql_pending_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -301,9 +305,10 @@ static ssize_t aql_txq_limit_write(struc
+     return count;
+ }
+
+-static const struct debugfs_short_fops aql_txq_limit_ops = {
++static const struct file_operations aql_txq_limit_ops = {
+     .write = aql_txq_limit_write,
+     .read = aql_txq_limit_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -350,9 +355,10 @@ static ssize_t aql_enable_write(struct f
+     return count;
+ }
+
+-static const struct debugfs_short_fops aql_enable_ops = {
++static const struct file_operations aql_enable_ops = {
+     .write = aql_enable_write,
+     .read = aql_enable_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -400,9 +406,10 @@ static ssize_t force_tx_status_write(str
+     return count;
+ }
+
+-static const struct debugfs_short_fops force_tx_status_ops = {
++static const struct file_operations force_tx_status_ops = {
+     .write = force_tx_status_write,
+     .read = force_tx_status_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+
+@@ -427,8 +434,9 @@ static ssize_t reset_write(struct file *
+     return count;
+ }
+
+-static const struct debugfs_short_fops reset_ops = {
++static const struct file_operations reset_ops = {
+     .write = reset_write,
++    .open = simple_open,
+     .llseek = noop_llseek,
+ };
+ #endif
+@@ -656,8 +664,9 @@ static ssize_t stats_ ##name## _read(str
+                       print_devstats_##name);        \
+ }                                    \
+                                     \
+-static const struct debugfs_short_fops stats_ ##name## _ops = 
{            \
++static const struct file_operations stats_ ##name## _ops = {        \
+     .read = stats_ ##name## _read,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ };
+
+--- a/net/mac80211/debugfs_key.c
++++ b/net/mac80211/debugfs_key.c
+@@ -26,15 +26,17 @@ static ssize_t key_##name##_read(struct
+ #define KEY_READ_X(name) KEY_READ(name, name, "0x%x\n")
+
+ #define KEY_OPS(name)                            \
+-static const struct debugfs_short_fops key_ ##name## _ops = {        \
++static const struct file_operations key_ ##name## _ops = {        \
+     .read = key_##name##_read,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+ #define KEY_OPS_W(name)                            \
+-static const struct debugfs_short_fops key_ ##name## _ops = {        \
++static const struct file_operations key_ ##name## _ops = {        \
+     .read = key_##name##_read,                    \
+     .write = key_##name##_write,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+@@ -47,8 +49,9 @@ static const struct debugfs_short_fops k
+ #define KEY_CONF_READ_D(name) KEY_CONF_READ(name, "%d\n")
+
+ #define KEY_CONF_OPS(name)                        \
+-static const struct debugfs_short_fops key_ ##name## _ops = {        \
++static const struct file_operations key_ ##name## _ops = {        \
+     .read = key_conf_##name##_read,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+--- a/net/mac80211/debugfs_netdev.c
++++ b/net/mac80211/debugfs_netdev.c
+@@ -221,9 +221,10 @@ static ssize_t ieee80211_if_fmt_##name(
+ }
+
+ #define _IEEE80211_IF_FILE_OPS(name, _read, _write)            \
+-static const struct debugfs_short_fops name##_ops = {                \
++static const struct file_operations name##_ops = {            \
+     .read = (_read),                        \
+     .write = (_write),                        \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+--- a/net/mac80211/debugfs_sta.c
++++ b/net/mac80211/debugfs_sta.c
+@@ -30,15 +30,17 @@ static ssize_t sta_ ##name## _read(struc
+ #define STA_READ_D(name, field) STA_READ(name, field, "%d\n")
+
+ #define STA_OPS(name)                            \
+-static const struct debugfs_short_fops sta_ ##name## _ops = {        \
++static const struct file_operations sta_ ##name## _ops = {        \
+     .read = sta_##name##_read,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+ #define STA_OPS_RW(name)                        \
+-static const struct debugfs_short_fops sta_ ##name## _ops = {        \
++static const struct file_operations sta_ ##name## _ops = {        \
+     .read = sta_##name##_read,                    \
+     .write = sta_##name##_write,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+@@ -448,8 +450,9 @@ STA_OPS_RW(agg_status);
+
+ /* link sta attributes */
+ #define LINK_STA_OPS(name)                        \
+-static const struct debugfs_short_fops link_sta_ ##name## _ops = 
{        \
++static const struct file_operations link_sta_ ##name## _ops = {        \
+     .read = link_sta_##name##_read,                    \
++    .open = simple_open,                        \
+     .llseek = generic_file_llseek,                    \
+ }
+
+--- a/net/mac80211/rate.c
++++ b/net/mac80211/rate.c
+@@ -249,8 +249,9 @@ static ssize_t rcname_read(struct file *
+                        ref->ops->name, len);
+ }
+
+-const struct debugfs_short_fops rcname_ops = {
++const struct file_operations rcname_ops = {
+     .read = rcname_read,
++    .open = simple_open,
+     .llseek = default_llseek,
+ };
+ #endif
+--- a/net/mac80211/rate.h
++++ b/net/mac80211/rate.h
+@@ -62,7 +62,7 @@ static inline void rate_control_add_sta_
+ #endif
+ }
+
+-extern const struct debugfs_short_fops rcname_ops;
++extern const struct file_operations rcname_ops;
+
+ static inline void rate_control_add_debugfs(struct ieee80211_local *local)
+ {

 From c760d3d20e5225ba2a542ff97a103dd42ab60637 Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Sun, 8 Jun 2025 18:45:27 +0200
Subject: [PATCH 12/14] mac80211: manually refresh patches

Manually refresh patches

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  ...tersection-support-for-regulatory-ru.patch | 24 +++---
  ...ifi-ath11k-add-hw-params-for-QCN6122.patch |  8 +-
  ...-wifi-ath11k-poll-reo-status-ipq5018.patch | 12 +--
  ...-and-handle-country-code-for-WCN7850.patch | 80 +++++++++----------
  .../patches/ath9k/552-ath9k-ahb_of.patch      | 10 +--
  ...-in-driver-tables-with-country-codes.patch | 14 ++--
  ...gister-operation-on-RXIQ-calibration.patch | 34 --------
  ...FCSR-register-init-values-for-RT5592.patch |  2 +-
  ...e-the-new-RTL8814AE-RTL8814AU-driver.patch | 37 +++------
  ...race-period-for-DFS-available-after-.patch | 18 +++--
  10 files changed, 98 insertions(+), 141 deletions(-)

diff --git 
a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch 
b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
index f30e03475f51c4..59a2165c0cdb45 100644
--- 
a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
@@ -23,7 +23,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>

  --- a/drivers/net/wireless/ath/ath11k/reg.c
  +++ b/drivers/net/wireless/ath/ath11k/reg.c
-@@ -361,134 +361,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
+@@ -353,134 +353,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
       return flags;
   }

@@ -158,7 +158,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
   static const char *
   ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region)
   {
-@@ -639,11 +511,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211
+@@ -631,11 +503,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211

   struct ieee80211_regdomain *
   ath11k_reg_build_regd(struct ath11k_base *ab,
@@ -172,7 +172,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
       struct cur_reg_rule *reg_rule, *reg_rule_6ghz;
       u8 i = 0, j = 0, k = 0;
       u8 num_rules;
-@@ -686,26 +558,26 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -678,26 +550,26 @@ ath11k_reg_build_regd(struct ath11k_base
       }

       if (!num_rules)
@@ -206,7 +206,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
              reg_info->dfs_region, num_rules);
       /* Update reg_rules[] below. Firmware is expected to
        * send these rules in order(2 GHz rules first and then 5 GHz)
-@@ -744,7 +616,7 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -736,7 +608,7 @@ ath11k_reg_build_regd(struct ath11k_base
           flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
           flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);

@@ -215,7 +215,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
                          reg_rule->start_freq,
                          reg_rule->end_freq, max_bw,
                          reg_rule->ant_gain, reg_rule->reg_power,
-@@ -759,7 +631,7 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -751,7 +623,7 @@ ath11k_reg_build_regd(struct ath11k_base
               reg_info->dfs_region == ATH11K_DFS_REG_ETSI &&
               (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW &&
               reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){
@@ -224,7 +224,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
                                    reg_rule, &i,
                                    flags, max_bw);
               continue;
-@@ -770,51 +642,23 @@ ath11k_reg_build_regd(struct ath11k_base
+@@ -762,37 +634,20 @@ ath11k_reg_build_regd(struct ath11k_base
                      "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) 
(%d, %d)\n",
                      i + 1, reg_rule->start_freq, reg_rule->end_freq,
                      max_bw, reg_rule->ant_gain, reg_rule->reg_power,
@@ -265,6 +265,10 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
       return new_regd;
   }

+@@ -844,17 +699,6 @@ void ath11k_regd_update_chan_list_work(s
+     }
+ }
+
  -static bool ath11k_reg_is_world_alpha(char *alpha)
  -{
  -    if (alpha[0] == '0' && alpha[1] == '0')
@@ -279,7 +283,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
   static enum wmi_vdev_type ath11k_reg_get_ar_vdev_type(struct ath11k *ar)
   {
       struct ath11k_vif *arvif;
-@@ -837,7 +681,6 @@ int ath11k_reg_handle_chan_list(struct a
+@@ -877,7 +721,6 @@ int ath11k_reg_handle_chan_list(struct a
                   enum ieee80211_ap_reg_power power_type)
   {
       struct ieee80211_regdomain *regd;
@@ -287,7 +291,7 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
       int pdev_idx;
       struct ath11k *ar;
       enum wmi_vdev_type vdev_type;
-@@ -889,24 +732,14 @@ int ath11k_reg_handle_chan_list(struct a
+@@ -929,24 +772,14 @@ int ath11k_reg_handle_chan_list(struct a
               (char *)reg_info->alpha2, 2))
           goto retfail;

@@ -317,8 +321,8 @@ Signed-off-by: Aditya Kumar Singh 
<quic_adisi at quicinc.com>
           goto fallback;
  --- a/drivers/net/wireless/ath/ath11k/reg.h
  +++ b/drivers/net/wireless/ath/ath11k/reg.h
-@@ -35,7 +35,7 @@ void ath11k_reg_free(struct ath11k_base
- void ath11k_regd_update_work(struct work_struct *work);
+@@ -36,7 +36,7 @@ void ath11k_regd_update_work(struct work
+ void ath11k_regd_update_chan_list_work(struct work_struct *work);
   struct ieee80211_regdomain *
   ath11k_reg_build_regd(struct ath11k_base *ab,
  -              struct cur_regulatory_info *reg_info, bool intersect,
diff --git 
a/package/kernel/mac80211/patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch 
b/package/kernel/mac80211/patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch
index e1f725d6b943dc..a428684cba6f34 100644
--- 
a/package/kernel/mac80211/patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/920-wifi-ath11k-add-hw-params-for-QCN6122.patch
@@ -25,9 +25,9 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>

  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -809,6 +809,67 @@ static struct ath11k_hw_params ath11k_hw
-         .support_fw_mac_sequence = true,
+@@ -905,6 +905,67 @@ static struct ath11k_hw_params ath11k_hw
           .support_dual_stations = true,
+         .pdev_suspend = false,
       },
  +    {
  +        .hw_rev = ATH11K_HW_QCN6122_HW10,
@@ -95,10 +95,10 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
   static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct 
ath11k_base *ab)
  --- a/drivers/net/wireless/ath/ath11k/core.h
  +++ b/drivers/net/wireless/ath/ath11k/core.h
-@@ -148,6 +148,7 @@ enum ath11k_hw_rev {
-     ATH11K_HW_WCN6750_HW10,
+@@ -149,6 +149,7 @@ enum ath11k_hw_rev {
       ATH11K_HW_IPQ5018_HW10,
       ATH11K_HW_QCA2066_HW21,
+     ATH11K_HW_QCA6698AQ_HW21,
  +    ATH11K_HW_QCN6122_HW10,
   };

diff --git 
a/package/kernel/mac80211/patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch 
b/package/kernel/mac80211/patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch
index 693cb0e0d484b6..894346652fd48e 100644
--- 
a/package/kernel/mac80211/patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/932-wifi-ath11k-poll-reo-status-ipq5018.patch
@@ -24,10 +24,10 @@ Signed-off-by: Sriram R <srirrama at codeaurora.org>
  ---
  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -719,6 +719,7 @@ static struct ath11k_hw_params ath11k_hw
-         .smp2p_wow_exit = false,
+@@ -727,6 +727,7 @@ static struct ath11k_hw_params ath11k_hw
           .support_fw_mac_sequence = false,
           .support_dual_stations = false,
+         .pdev_suspend = false,
  +        .reo_status_poll = true,
       },
       {
@@ -121,7 +121,7 @@ Signed-off-by: Sriram R <srirrama at codeaurora.org>
   struct dp_reo_cache_flush_elem {
       struct list_head list;
       struct dp_rx_tid data;
-@@ -288,6 +290,10 @@ struct ath11k_dp {
+@@ -287,6 +289,10 @@ struct ath11k_dp {
       spinlock_t reo_cmd_lock;
       struct ath11k_hp_update_timer reo_cmd_timer;
       struct ath11k_hp_update_timer tx_ring_timer[DP_TCL_NUM_RING_MAX];
@@ -132,7 +132,7 @@ Signed-off-by: Sriram R <srirrama at codeaurora.org>
   };

   /* HTT definitions */
-@@ -1691,5 +1697,6 @@ void ath11k_dp_shadow_init_timer(struct
+@@ -1690,5 +1696,6 @@ void ath11k_dp_shadow_init_timer(struct
                    struct ath11k_hp_update_timer *update_timer,
                    u32 interval, u32 ring_id);
   void ath11k_dp_stop_shadow_timers(struct ath11k_base *ab);
@@ -154,10 +154,10 @@ Signed-off-by: Sriram R <srirrama at codeaurora.org>

  --- a/drivers/net/wireless/ath/ath11k/hw.h
  +++ b/drivers/net/wireless/ath/ath11k/hw.h
-@@ -232,6 +232,7 @@ struct ath11k_hw_params {
-     bool smp2p_wow_exit;
+@@ -233,6 +233,7 @@ struct ath11k_hw_params {
       bool support_fw_mac_sequence;
       bool support_dual_stations;
+     bool pdev_suspend;
  +    bool reo_status_poll;
   };

diff --git 
a/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch 
b/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
index 2afd7f8b0e5280..bb3f643e332519 100644
--- 
a/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
@@ -429,9 +429,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
               complete(&ar->peer_assoc_done);
               complete(&ar->peer_delete_done);
  @@ -1312,6 +1343,7 @@ struct ath12k_base *ath12k_core_alloc(st
-     INIT_WORK(&ab->restart_work, ath12k_core_restart);
       INIT_WORK(&ab->reset_work, ath12k_core_reset);
       INIT_WORK(&ab->rfkill_work, ath12k_rfkill_work);
+     INIT_WORK(&ab->dump_work, ath12k_coredump_upload);
  +    INIT_WORK(&ab->update_11d_work, ath12k_update_11d);

       timer_setup(&ab->rx_replenish_retry, 
ath12k_ce_rx_replenish_retry, 0);
@@ -485,28 +485,28 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           u32 fw_crash_counter;
  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -2949,6 +2949,11 @@ static void ath12k_bss_assoc(struct ath1
+@@ -3249,6 +3249,11 @@ static void ath12k_bss_assoc(struct ath1
       if (ret)
           ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD 
parameters: %d\n",
                   arvif->vdev_id, ret);
  +
  +    if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ar->ab->wmi_ab.svc_map) &&
-+        arvif->vdev_type == WMI_VDEV_TYPE_STA &&
-+        arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
++        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
++        ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
  +        ath12k_mac_11d_scan_stop_all(ar->ab);
   }

   static void ath12k_bss_disassoc(struct ath12k *ar,
-@@ -3524,7 +3529,7 @@ void __ath12k_mac_scan_finish(struct ath
-         ar->scan_channel = NULL;
-         ar->scan.roc_freq = 0;
+@@ -4017,7 +4022,7 @@
+         fallthrough;
+     case ATH12K_SCAN_STARTING:
           cancel_delayed_work(&ar->scan.timeout);
  -        complete(&ar->scan.completed);
  +        complete_all(&ar->scan.completed);
+         wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
           break;
       }
- }
-@@ -3790,7 +3795,12 @@ scan:
+@@ -4360,7 +4365,12 @@ scan:

       ret = ath12k_start_scan(ar, arg);
       if (ret) {
@@ -520,19 +520,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           spin_lock_bh(&ar->data_lock);
           ar->scan.state = ATH12K_SCAN_IDLE;
           spin_unlock_bh(&ar->data_lock);
-@@ -3810,6 +3820,11 @@ exit:
+@@ -4390,6 +4390,11 @@ exit:

       mutex_unlock(&ar->conf_mutex);

  +    if (ar->state_11d == ATH12K_11D_PREPARING &&
-+        arvif->vdev_type == WMI_VDEV_TYPE_STA &&
-+        arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
++        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
++        ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
  +        ath12k_mac_11d_scan_start(ar, arvif->vdev_id);
  +
       return ret;
   }

-@@ -5995,7 +6010,7 @@ static int ath12k_mac_start(struct ath12
+@@ -7195,7 +7210,7 @@ static int ath12k_mac_start(struct ath12

       /* TODO: Do we need to enable ANI? */

@@ -541,7 +541,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       ar->num_started_vdevs = 0;
       ar->num_created_vdevs = 0;
-@@ -6175,6 +6190,9 @@ static void ath12k_mac_stop(struct ath12
+@@ -7375,6 +7390,9 @@ static void ath12k_mac_stop(struct ath12
       cancel_delayed_work_sync(&ar->scan.timeout);
       cancel_work_sync(&ar->regd_update_work);
       cancel_work_sync(&ar->ab->rfkill_work);
@@ -551,22 +551,22 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       spin_lock_bh(&ar->data_lock);
       list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, 
list) {
-@@ -6421,6 +6439,117 @@ static void ath12k_mac_op_update_vif_off
-     ath12k_mac_update_vif_offload(arvif);
+@@ -7792,6 +7797,117 @@
+     ath12k_mac_update_vif_offload(&ahvif->deflink);
   }

  +static bool ath12k_mac_vif_ap_active_any(struct ath12k_base *ab)
  +{
  +    struct ath12k *ar;
  +    struct ath12k_pdev *pdev;
-+    struct ath12k_vif *arvif;
++    struct ath12k_link_vif *arvif;
  +    int i;
  +
  +    for (i = 0; i < ab->num_radios; i++) {
  +        pdev = &ab->pdevs[i];
  +        ar = pdev->ar;
  +        list_for_each_entry(arvif, &ar->arvifs, list) {
-+            if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_AP)
++            if (arvif->is_up && arvif->ahvif->vdev_type == 
WMI_VDEV_TYPE_AP)
  +                return true;
  +        }
  +    }
@@ -666,10 +666,10 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    }
  +}
  +
- static int ath12k_mac_vdev_create(struct ath12k *ar, struct 
ieee80211_vif *vif)
+ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif 
*arvif)
   {
       struct ath12k_hw *ah = ar->ah;
-@@ -6535,6 +6664,7 @@ static int ath12k_mac_vdev_create(struct
+@@ -7935,6 +8064,7 @@ static int ath12k_mac_vdev_create(struct
                       arvif->vdev_id, ret);
               goto err_peer_del;
           }
@@ -677,48 +677,48 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           break;
       case WMI_VDEV_TYPE_STA:
           param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
-@@ -6573,6 +6703,13 @@ static int ath12k_mac_vdev_create(struct
+@@ -7973,6 +8103,13 @@ static int ath12k_mac_vdev_create(struct
                       arvif->vdev_id, ret);
               goto err_peer_del;
           }
  +
  +        if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
-+            arvif->vdev_type == WMI_VDEV_TYPE_STA &&
-+            arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
++            ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
++            ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE) {
  +            reinit_completion(&ar->completed_11d_scan);
  +            ar->state_11d = ATH12K_11D_PREPARING;
  +        }
           break;
       default:
           break;
-@@ -6913,6 +7050,11 @@ static void ath12k_mac_op_remove_interfa
-     ath12k_dbg(ab, ATH12K_DBG_MAC, "mac remove interface (vdev %d)\n",
-            arvif->vdev_id);
+@@ -8756,6 +8756,11 @@
+     ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface 
(vdev %d link id %d)",
+            arvif->vdev_id, arvif->link_id);

  +    if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
-+        arvif->vdev_type == WMI_VDEV_TYPE_STA &&
-+        arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
++        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
++        ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE)
  +        ath12k_mac_11d_scan_stop(ar);
  +
-     if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
-         ret = ath12k_peer_delete(ar, arvif->vdev_id, vif->addr);
+     if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
+         ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
           if (ret)
-@@ -7753,6 +7895,14 @@ ath12k_mac_op_unassign_vif_chanctx(struc
+@@ -9330,6 +9446,14 @@
           ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
           ath12k_mac_monitor_stop(ar);

  +    if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
-+        arvif->vdev_type == WMI_VDEV_TYPE_STA &&
-+        arvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
++        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
++        ahvif->vdev_subtype == WMI_VDEV_SUBTYPE_NONE &&
  +        ar->state_11d != ATH12K_11D_PREPARING) {
  +        reinit_completion(&ar->completed_11d_scan);
  +        ar->state_11d = ATH12K_11D_PREPARING;
  +    }
  +
-     mutex_unlock(&ar->conf_mutex);
+     ath12k_mac_remove_link_interface(hw, arvif);
+     ath12k_mac_unassign_link_vif(arvif);
   }
-
-@@ -8291,6 +8441,14 @@ ath12k_mac_op_reconfig_complete(struct i
+@@ -9891,6 +9941,14 @@ ath12k_mac_op_reconfig_complete(struct i
           ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
                   ar->pdev->pdev_id);

@@ -733,7 +733,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           if (ab->is_reset) {
               recovery_count = atomic_inc_return(&ab->recovery_count);

-@@ -9340,6 +9498,9 @@ static void ath12k_mac_setup(struct ath1
+@@ -10040,6 +10198,9 @@ static void ath12k_mac_setup(struct ath1

       INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
       skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
@@ -756,9 +756,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +void ath12k_mac_11d_scan_stop(struct ath12k *ar);
  +void ath12k_mac_11d_scan_stop_all(struct ath12k_base *ab);
  +
- void ath12k_mac_destroy(struct ath12k_base *ab);
- void ath12k_mac_unregister(struct ath12k_base *ab);
- int ath12k_mac_register(struct ath12k_base *ab);
+ void ath12k_mac_destroy(struct ath12k_hw_group *ag);
+ void ath12k_mac_unregister(struct ath12k_hw_group *ag);
+ int ath12k_mac_register(struct ath12k_hw_group *ag);
  --- a/drivers/net/wireless/ath/ath12k/reg.c
  +++ b/drivers/net/wireless/ath/ath12k/reg.c
  @@ -48,6 +48,7 @@ ath12k_reg_notifier(struct wiphy *wiphy,
diff --git 
a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch 
b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
index cb92f30aae727e..a7f133d4c5e3ee 100644
--- a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
+++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
@@ -58,11 +58,11 @@
       if (ret) {
           dev_err(&pdev->dev, "failed to initialize device\n");
           goto err_irq;
-@@ -155,6 +165,7 @@ static struct platform_driver ath_ahb_dr
-     .remove_new = ath_ahb_remove,
-     .driver        = {
-         .name    = "ath9k",
+@@ -167,6 +177,7 @@ static struct platform_driver ath_ahb_dr
+
+     .driver = {
+         .name = "ath9k",
  +        .of_match_table = of_ath_ahb_match,
       },
-     .id_table    = ath9k_platform_id_table,
+     .id_table = ath9k_platform_id_table,
   };
diff --git 
a/package/kernel/mac80211/patches/brcm/861-brcmfmac-add-in-driver-tables-with-country-codes.patch 
b/package/kernel/mac80211/patches/brcm/861-brcmfmac-add-in-driver-tables-with-country-codes.patch
index 1f0609e3488887..2f07212c56b045 100644
--- 
a/package/kernel/mac80211/patches/brcm/861-brcmfmac-add-in-driver-tables-with-country-codes.patch
+++ 
b/package/kernel/mac80211/patches/brcm/861-brcmfmac-add-in-driver-tables-with-country-codes.patch
@@ -12,7 +12,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>

  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
-@@ -65,6 +65,36 @@ static int brcmf_of_get_country_codes(st
+@@ -66,6 +66,36 @@ static int brcmf_of_get_country_codes(st
       return 0;
   }

@@ -46,15 +46,15 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
  +    }
  +}
  +
- void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
-             struct brcmf_mp_device *settings)
+ int brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
+            struct brcmf_mp_device *settings)
   {
-@@ -113,6 +143,8 @@ void brcmf_of_probe(struct device *dev,
-     }
-     of_node_put(root);
+@@ -121,6 +151,8 @@ int brcmf_of_probe(struct device *dev, e
+
+     brcmf_dbg(INFO, "%s LPO clock\n", clk ? "enable" : "no");

  +    brcmf_of_probe_cc(dev, settings);
  +
       if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
-         return;
+         return 0;

diff --git 
a/package/kernel/mac80211/patches/rt2x00/621-04-rt2x00-fix-register-operation-on-RXIQ-calibration.patch 
b/package/kernel/mac80211/patches/rt2x00/621-04-rt2x00-fix-register-operation-on-RXIQ-calibration.patch
index aa6f9c437c6447..0e0245e4920b60 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/621-04-rt2x00-fix-register-operation-on-RXIQ-calibration.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/621-04-rt2x00-fix-register-operation-on-RXIQ-calibration.patch
@@ -24,37 +24,3 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
       rt2800_bbp_write(rt2x00dev, 4, bbpval);

       bbpval = rt2800_bbp_read(rt2x00dev, 21);
-@@ -8928,13 +8928,13 @@ static void rt2800_rxiq_calibration(stru
-     for (ch_idx = 0; ch_idx < 2; ch_idx = ch_idx + 1) {
-         if (ch_idx == 0) {
-             rfval = rfb0r1 & (~0x3);
--            rfval = rfb0r1 | 0x1;
-+            rfval = rfval | 0x1;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval);
-             rfval = rfb0r2 & (~0x33);
--            rfval = rfb0r2 | 0x11;
-+            rfval = rfval | 0x11;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval);
-             rfval = rfb0r42 & (~0x50);
--            rfval = rfb0r42 | 0x10;
-+            rfval = rfval | 0x10;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval);
-
-             rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00001006);
-@@ -8947,13 +8947,13 @@ static void rt2800_rxiq_calibration(stru
-             rt2800_bbp_dcoc_write(rt2x00dev, 1, 0x00);
-         } else {
-             rfval = rfb0r1 & (~0x3);
--            rfval = rfb0r1 | 0x2;
-+            rfval = rfval | 0x2;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 1, rfval);
-             rfval = rfb0r2 & (~0x33);
--            rfval = rfb0r2 | 0x22;
-+            rfval = rfval | 0x22;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfval);
-             rfval = rfb0r42 & (~0x50);
--            rfval = rfb0r42 | 0x40;
-+            rfval = rfval | 0x40;
-             rt2800_rfcsr_write_bank(rt2x00dev, 0, 42, rfval);
-
-             rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x00002006);
diff --git 
a/package/kernel/mac80211/patches/rt2x00/622-01-rt2x00-fix-RFCSR-register-init-values-for-RT5592.patch 
b/package/kernel/mac80211/patches/rt2x00/622-01-rt2x00-fix-RFCSR-register-init-values-for-RT5592.patch
index 15d1601eef1f8d..72a8f0073d2ce1 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/622-01-rt2x00-fix-RFCSR-register-init-values-for-RT5592.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/622-01-rt2x00-fix-RFCSR-register-init-values-for-RT5592.patch
@@ -77,7 +77,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
  +            rt2800_rfcsr_write(rt2x00dev, 59, 0x7C);
  +
               if (rf->channel <= 50) {
--                rt2800_rfcsr_write(rt2x00dev, 55, 0x06),
+-                rt2800_rfcsr_write(rt2x00dev, 55, 0x06);
  -                rt2800_rfcsr_write(rt2x00dev, 56, 0xD3);
  +                rt2800_rfcsr_write(rt2x00dev, 44, 0X32);
  +                rt2800_rfcsr_write(rt2x00dev, 54, 0xF9);
diff --git 
a/package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch 
b/package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
index 8446ad3a9688a5..0b7d5d72040877 100644
--- 
a/package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
+++ 
b/package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
@@ -24,7 +24,7 @@ Link: 
https://patch.msgid.link/5795b0a7-511e-40b5-ac36-476b63f174c7@gmail.com

  --- a/Kconfig.local
  +++ b/Kconfig.local
-@@ -1153,6 +1153,9 @@ config BACKPORTED_RTW88_8821A
+@@ -1138,6 +1138,9 @@ config BACKPORTED_RTW88_8821A
   config BACKPORTED_RTW88_8812A
       tristate
       default RTW88_8812A
@@ -34,7 +34,7 @@ Link: 
https://patch.msgid.link/5795b0a7-511e-40b5-ac36-476b63f174c7@gmail.com
   config BACKPORTED_RTW88_8822BE
       tristate
       default RTW88_8822BE
-@@ -1198,12 +1201,21 @@ config BACKPORTED_RTW88_8821AU
+@@ -1183,6 +1186,12 @@ config BACKPORTED_RTW88_8821AU
   config BACKPORTED_RTW88_8812AU
       tristate
       default RTW88_8812AU
@@ -47,15 +47,6 @@ Link: 
https://patch.msgid.link/5795b0a7-511e-40b5-ac36-476b63f174c7@gmail.com
   config BACKPORTED_RTW88_DEBUG
       tristate
       default RTW88_DEBUG
- config BACKPORTED_RTW88_DEBUGFS
-     tristate
-     default RTW88_DEBUGFS
-+config BACKPORTED_RTW88_LEDS
-+    tristate
-+    default RTW88_LEDS
- config BACKPORTED_RTW89
-     tristate
-     default RTW89
  --- a/drivers/net/wireless/realtek/rtw88/Kconfig
  +++ b/drivers/net/wireless/realtek/rtw88/Kconfig
  @@ -68,6 +68,10 @@ config RTW88_8812A
@@ -120,28 +111,20 @@ Link: 
https://patch.msgid.link/5795b0a7-511e-40b5-ac36-476b63f174c7@gmail.com

  --- a/local-symbols
  +++ b/local-symbols
-@@ -377,6 +377,10 @@ RTW88_8723X=
- RTW88_8703B=
- RTW88_8723D=
- RTW88_8821C=
-+RTW88_88XXA=
-+RTW88_8821A=
-+RTW88_8812A=
+@@ -375,6 +375,7 @@ RTW88_8821C=
+ RTW88_88XXA=
+ RTW88_8821A=
+ RTW88_8812A=
  +RTW88_8814A=
   RTW88_8822BE=
   RTW88_8822BS=
   RTW88_8822BU=
-@@ -390,8 +394,13 @@ RTW88_8723DU=
- RTW88_8821CE=
- RTW88_8821CS=
+@@ -390,6 +391,8 @@ RTW88_8821CS=
   RTW88_8821CU=
-+RTW88_8821AU=
-+RTW88_8812AU=
+ RTW88_8821AU=
+ RTW88_8812AU=
  +RTW88_8814AE=
  +RTW88_8814AU=
   RTW88_DEBUG=
   RTW88_DEBUGFS=
-+RTW88_LEDS=
- RTW89=
- RTW89_CORE=
- RTW89_PCI=
+ RTW88_LEDS=
diff --git 
a/package/kernel/mac80211/patches/subsys/310-cfg80211-allow-grace-period-for-DFS-available-after-.patch 
b/package/kernel/mac80211/patches/subsys/310-cfg80211-allow-grace-period-for-DFS-available-after-.patch
index c86b836f2f5616..437f6b22a360cf 100644
--- 
a/package/kernel/mac80211/patches/subsys/310-cfg80211-allow-grace-period-for-DFS-available-after-.patch
+++ 
b/package/kernel/mac80211/patches/subsys/310-cfg80211-allow-grace-period-for-DFS-available-after-.patch
@@ -52,7 +52,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/net/wireless/chan.c
  +++ b/net/wireless/chan.c
-@@ -598,6 +598,8 @@ static void cfg80211_set_chans_dfs_state
+@@ -648,6 +648,8 @@ void cfg80211_set_dfs_state(struct wiphy

           c->dfs_state = dfs_state;
           c->dfs_state_entered = jiffies;
@@ -61,8 +61,8 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
       }
   }

-@@ -1087,6 +1089,49 @@ static bool cfg80211_get_chans_dfs_avail
-     return true;
+@@ -995,6 +997,53 @@ bool cfg80211_any_wiphy_oper_chan(struct
+     return false;
   }

  +static void
@@ -73,8 +73,12 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
  +    struct ieee80211_channel *c;
  +    u32 freq, start_freq, end_freq;
  +
-+    start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
-+    end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
++    if (bandwidth <= MHZ_TO_KHZ(20))
++        start_freq = end_freq = center_freq;
++    else {
++        start_freq = center_freq - bandwidth / 2 + MHZ_TO_KHZ(10);
++        end_freq = center_freq + bandwidth / 2 - MHZ_TO_KHZ(10);
++    }
  +
  +    /*
  +     * Check entire range of channels for the bandwidth.
@@ -124,7 +128,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/net/wireless/mlme.c
  +++ b/net/wireless/mlme.c
-@@ -1031,6 +1031,8 @@ void cfg80211_dfs_channels_update_work(s
+@@ -1038,6 +1038,8 @@ void cfg80211_dfs_channels_update_work(s
               if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
                   time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
                   radar_event = NL80211_RADAR_NOP_FINISHED;
@@ -133,7 +137,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
               } else {
                   if (regulatory_pre_cac_allowed(wiphy) ||
                       cfg80211_any_wiphy_oper_chan(wiphy, c))
-@@ -1038,11 +1040,10 @@ void cfg80211_dfs_channels_update_work(s
+@@ -1045,11 +1047,10 @@ void cfg80211_dfs_channels_update_work(s

                   time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
                   radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;

 From 0dea26653c813899c6bed6cdc936024f70fe6c6f Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Fri, 13 Jun 2025 13:28:50 +0200
Subject: [PATCH 13/14] mac80211: automatically refresh patches

Automatically refresh patches

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  .../patches/ath/402-ath_regd_optional.patch   |  2 +-
  .../patches/ath/404-regd_no_assoc_hints.patch |  4 +-
  .../ath10k/080-ath10k_thermal_config.patch    |  2 +-
  .../930-ath10k_add_tpt_led_trigger.patch      |  4 +-
  ...75-ath10k-use-tpt-trigger-by-default.patch |  2 +-
  ...k-always-use-mac80211-loss-detection.patch |  2 +-
  ...-ath11k-disable-coldboot-for-ipq6018.patch |  2 +-
  ...ble-coldboot-calibration-for-ipq5018.patch |  2 +-
  ...ort-setting-bdf-addr-and-caldb-addr-.patch | 10 +-
  ...k-control-thermal-support-via-symbol.patch |  2 +-
  ...upport-setting-FW-memory-mode-via-DT.patch |  4 +-
  ...wifi-ath11k-add-hal-regs-for-QCN6122.patch |  4 +-
  ...-ath11k-add-hw-ring-mask-for-QCN6122.patch |  4 +-
  ...k-update-hif_and-pci_ops-for-QCN6122.patch |  2 +-
  ...h11k-add-multipd-support-for-QCN6122.patch |  2 +-
  ...fi-ath11k-add-QCN6122-device-support.patch |  4 +-
  ...11k-Support-to-assign-m3-dump-memory.patch |  2 +-
  ...ear-the-keys-properly-when-DISABLE_K.patch |  2 +-
  ...-and-handle-country-code-for-WCN7850.patch | 94 +++++++++----------
  ...etch-regdb.bin-file-from-board-2.bin.patch |  6 +-
  ...0-ath12k-prevent-ltssm-startup-crash.patch |  2 +-
  ...k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch |  4 +-
  ...k-fix-5GHz-operation-on-wideband-QCN.patch |  2 +-
  ...HE-MCS-mapper-to-a-separate-function.patch |  4 +-
  ...and-tx-mcs-maps-for-supported-HE-mcs.patch |  6 +-
  ...X-MCS-rate-configurations-in-HE-mode.patch |  4 +-
  .../341-wifi-ath9k-obtain-system-gpios.patch  |  8 +-
  ...erpret-requested-txpower-in-EIRP-dom.patch |  4 +-
  ...power-reduction-for-US-regulatory-do.patch |  2 +-
  .../ath9k/401-ath9k_blink_default.patch       |  2 +-
  .../ath9k/410-ath9k_allow_adhoc_and_ap.patch  |  2 +-
  ...abled-MFP-capability-unconditionally.patch |  4 +-
  .../ath9k/500-ath9k_eeprom_debugfs.patch      |  2 +-
  .../patches/ath9k/501-ath9k_ahb_init.patch    |  2 +-
  .../ath9k/512-ath9k_channelbw_debugfs.patch   |  4 +-
  .../patches/ath9k/530-ath9k_extra_leds.patch  |  6 +-
  .../ath9k/542-ath9k_debugfs_diag.patch        |  8 +-
  .../ath9k/543-ath9k_entropy_from_adc.patch    |  6 +-
  ...544-ath9k-ar933x-usb-hang-workaround.patch |  2 +-
  .../ath9k/548-ath9k_enable_gpio_chip.patch    |  2 +-
  .../mac80211/patches/ath9k/550-ath9k-of.patch | 10 +-
  .../ath9k/551-ath9k_ubnt_uap_plus_hsr.patch   |  4 +-
  .../patches/ath9k/552-ath9k-ahb_of.patch      |  2 +-
  ...und-bug-with-some-inconsistent-BSSes.patch |  2 +-
  ...fer-a-ccode-from-OTP-over-nvram-file.patch |  2 +-
  ...ac-Increase-power-saving-delay-to-2s.patch |  2 +-
  ...upport-DS1-exit-firmware-re-download.patch | 14 +--
  ...eroperating-DPP-and-other-encryption.patch |  2 +-
  ...mfmac-disable-dump_survey-on-bcm2835.patch |  6 +-
  .../100-backports-drop-QRTR-and-MHI.patch     |  2 +-
  .../210-wireless_netns_local_backport.patch   |  6 +-
  .../220-brcmfmac_usb_driver_backport.patch    |  2 +-
  ...x-init_vqs-build-error-on-kernel-6.6.patch |  4 +-
  ...ringified-name-of-command-in-error-l.patch |  2 +-
  ...support-for-loading-EEPROM-from-user.patch |  2 +-
  ...c-loadable-via-OF-on-rt288x-305x-SoC.patch |  2 +-
  ...0-rt2x00-change-led-polarity-from-OF.patch |  2 +-
  ...spect-rt2800-hardware-TX-queue-index.patch |  6 +-
  ...librate-MT7620-when-switching-channe.patch |  4 +-
  ...t-support-for-external-LNA-on-MT7620.patch |  4 +-
  ...-differentiate-based-on-SoC-CHIP_VER.patch | 10 +-
  ...nd-rtw_fw_send_ra_info-for-RTL8814AU.patch |  4 +-
  ...onstify-some-more-structs-and-arrays.patch |  2 +-
  ...emove-redundant-flush_workqueue-call.patch |  6 +-
  ...nable-switching-the-RTL8814AU-to-USB.patch |  2 +-
  ...-Enable-RX-aggregation-for-RTL8814AU.patch |  2 +-
  ...Upload-the-firmware-in-bigger-chunks.patch |  2 +-
  ...he-random-error-beacon-valid-message.patch |  8 +-
  .../110-mac80211_keep_keys_on_stop_ap.patch   |  4 +-
  .../patches/subsys/130-disable_auto_vif.patch |  2 +-
  .../mac80211/patches/subsys/210-ap_scan.patch |  2 +-
  .../patches/subsys/220-allow-ibss-mixed.patch |  2 +-
  .../230-avoid-crashing-missing-band.patch     |  2 +-
  ...domize-BA-session-dialog-token-alloc.patch |  2 +-
  ...crease-quantum-for-airtime-scheduler.patch |  6 +-
  ...dd-AQL-support-for-broadcast-packets.patch | 24 ++---
  ...llow-scanning-while-on-radar-channel.patch | 26 ++---
  ...-not-offer-a-mesh-path-if-forwarding.patch |  6 +-
  78 files changed, 212 insertions(+), 212 deletions(-)

diff --git 
a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch 
b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
index 5f5ac20ddbae8e..6b1bbefd24bf7c 100644
--- a/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
+++ b/package/kernel/mac80211/patches/ath/402-ath_regd_optional.patch
@@ -82,7 +82,7 @@
       help
  --- a/local-symbols
  +++ b/local-symbols
-@@ -96,6 +96,7 @@ ADM8211=
+@@ -90,6 +90,7 @@ ADM8211=
   ATH_COMMON=
   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 895e2ff8d8de6a..325d354c273e32 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
-@@ -3364,6 +3364,8 @@ void regulatory_hint_country_ie(struct w
+@@ -3363,6 +3363,8 @@ void regulatory_hint_country_ie(struct w
       enum environment_cap env = ENVIRON_ANY;
       struct regulatory_request *request = NULL, *lr;

@@ -9,7 +9,7 @@
       /* IE len must be evenly divisible by 2 */
       if (country_ie_len & 0x01)
           return;
-@@ -3615,6 +3617,7 @@ static bool is_wiphy_all_set_reg_flag(en
+@@ -3612,6 +3614,7 @@ static bool is_wiphy_all_set_reg_flag(en

   void regulatory_hint_disconnect(void)
   {
diff --git 
a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch 
b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
index 10d95d36bf8ae3..0c631f6bb26b40 100644
--- a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
+++ b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch
@@ -37,7 +37,7 @@
   void ath10k_thermal_event_temperature(struct ath10k *ar, int 
temperature);
  --- a/local-symbols
  +++ b/local-symbols
-@@ -156,6 +156,7 @@ ATH10K_DEBUG=
+@@ -150,6 +150,7 @@ ATH10K_DEBUG=
   ATH10K_DEBUGFS=
   ATH10K_LEDS=
   ATH10K_SPECTRAL=
diff --git 
a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch 
b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch
index aa953c00fb216e..ec055b20bfb7e6 100644
--- 
a/package/kernel/mac80211/patches/ath10k/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
-@@ -9920,6 +9920,21 @@ static int ath10k_mac_init_rd(struct ath
+@@ -9934,6 +9934,21 @@ static int ath10k_mac_init_rd(struct ath
       return 0;
   }

@@ -22,7 +22,7 @@
   int ath10k_mac_register(struct ath10k *ar)
   {
       static const u32 cipher_suites[] = {
-@@ -10282,6 +10297,12 @@ int ath10k_mac_register(struct ath10k *a
+@@ -10296,6 +10311,12 @@ int ath10k_mac_register(struct ath10k *a

       ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;

diff --git 
a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch 
b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
index 4f555d704e0b96..f6247f092c7132 100644
--- 
a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
+++ 
b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch
@@ -40,7 +40,7 @@ Signed-off-by: Mathias Kresin <dev at kresin.me>
       if (ret)
  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -10298,7 +10298,7 @@ int ath10k_mac_register(struct ath10k *a
+@@ -10312,7 +10312,7 @@ int ath10k_mac_register(struct ath10k *a
       ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;

   #ifdef CPTCFG_MAC80211_LEDS
diff --git 
a/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch 
b/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch
index d14f25104ebe07..cfcf5a091af065 100644
--- 
a/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch
+++ 
b/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch
@@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail at david-bauer.net>

  --- a/drivers/net/wireless/ath/ath10k/mac.c
  +++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -10090,7 +10090,6 @@ int ath10k_mac_register(struct ath10k *a
+@@ -10104,7 +10104,6 @@ int ath10k_mac_register(struct ath10k *a
       ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA);
       ieee80211_hw_set(ar->hw, QUEUE_CONTROL);
       ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG);
diff --git 
a/package/kernel/mac80211/patches/ath11k/0906-wifi-ath11k-disable-coldboot-for-ipq6018.patch 
b/package/kernel/mac80211/patches/ath11k/0906-wifi-ath11k-disable-coldboot-for-ipq6018.patch
index 325724e68d9804..132f5359b092ef 100644
--- 
a/package/kernel/mac80211/patches/ath11k/0906-wifi-ath11k-disable-coldboot-for-ipq6018.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/0906-wifi-ath11k-disable-coldboot-for-ipq6018.patch
@@ -13,7 +13,7 @@ Signed-off-by: Mantas Pucka <mantas at 8devices.com>

  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -170,8 +170,8 @@ static const struct ath11k_hw_params ath
+@@ -171,8 +171,8 @@ static const struct ath11k_hw_params ath
           .supports_shadow_regs = false,
           .idle_ps = false,
           .supports_sta_ps = false,
diff --git 
a/package/kernel/mac80211/patches/ath11k/0907-wifi-ath11k-disable-coldboot-calibration-for-ipq5018.patch 
b/package/kernel/mac80211/patches/ath11k/0907-wifi-ath11k-disable-coldboot-calibration-for-ipq5018.patch
index 2c4762e27574f4..597d6aa445614f 100644
--- 
a/package/kernel/mac80211/patches/ath11k/0907-wifi-ath11k-disable-coldboot-calibration-for-ipq5018.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/0907-wifi-ath11k-disable-coldboot-calibration-for-ipq5018.patch
@@ -14,7 +14,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>

  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -691,8 +691,8 @@ static const struct ath11k_hw_params ath
+@@ -698,8 +698,8 @@ static const struct ath11k_hw_params ath
           .supports_suspend = false,
           .hal_params = &ath11k_hw_hal_params_ipq8074,
           .single_pdev_only = false,
diff --git 
a/package/kernel/mac80211/patches/ath11k/201-wifi-ath11k-Support-setting-bdf-addr-and-caldb-addr-.patch 
b/package/kernel/mac80211/patches/ath11k/201-wifi-ath11k-Support-setting-bdf-addr-and-caldb-addr-.patch
index 81aee57546ee44..40d3b8065c6d27 100644
--- 
a/package/kernel/mac80211/patches/ath11k/201-wifi-ath11k-Support-setting-bdf-addr-and-caldb-addr-.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/201-wifi-ath11k-Support-setting-bdf-addr-and-caldb-addr-.patch
@@ -10,7 +10,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>

  --- a/drivers/net/wireless/ath/ath11k/qmi.c
  +++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -2028,6 +2028,7 @@ static int ath11k_qmi_assign_target_mem_
+@@ -2030,6 +2030,7 @@ static int ath11k_qmi_assign_target_mem_
       struct device_node *hremote_node = NULL;
       struct resource res;
       u32 host_ddr_sz;
@@ -18,7 +18,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>
       int i, idx, ret;

       for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
-@@ -2067,7 +2068,9 @@ static int ath11k_qmi_assign_target_mem_
+@@ -2069,7 +2070,9 @@ static int ath11k_qmi_assign_target_mem_
               idx++;
               break;
           case BDF_MEM_REGION_TYPE:
@@ -29,7 +29,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>
               ab->qmi.target_mem[idx].vaddr = NULL;
               ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
               ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
-@@ -2089,8 +2092,9 @@ static int ath11k_qmi_assign_target_mem_
+@@ -2091,8 +2094,9 @@ static int ath11k_qmi_assign_target_mem_
                       if (!ab->qmi.target_mem[idx].iaddr)
                           return -EIO;
                   } else {
@@ -41,7 +41,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>
                   }
               } else {
                   ab->qmi.target_mem[idx].paddr = 0;
-@@ -2295,6 +2299,7 @@ static int ath11k_qmi_load_file_target_m
+@@ -2297,6 +2301,7 @@ static int ath11k_qmi_load_file_target_m
       struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
       struct qmi_txn txn;
       const u8 *temp = data;
@@ -49,7 +49,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>
       void __iomem *bdf_addr = NULL;
       int ret = 0;
       u32 remaining = len;
-@@ -2306,7 +2311,9 @@ static int ath11k_qmi_load_file_target_m
+@@ -2308,7 +2313,9 @@ static int ath11k_qmi_load_file_target_m
       memset(&resp, 0, sizeof(resp));

       if (ab->hw_params.fixed_bdf_addr) {
diff --git 
a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch 
b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
index 6a0e4ff77ea8e7..fbc26cd96b3e05 100644
--- 
a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch
@@ -56,7 +56,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
   int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state);
  --- a/local-symbols
  +++ b/local-symbols
-@@ -168,6 +168,7 @@ ATH11K_DEBUG=
+@@ -162,6 +162,7 @@ ATH11K_DEBUG=
   ATH11K_DEBUGFS=
   ATH11K_TRACING=
   ATH11K_SPECTRAL=
diff --git 
a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch 
b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
index 1250147e2bda61..4b1bd698630e86 100644
--- 
a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
@@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
       {
           .hw_rev = ATH11K_HW_IPQ8074,
           .name = "ipq8074 hw2.0",
-@@ -2147,7 +2147,8 @@ static void ath11k_core_reset(struct wor
+@@ -2280,7 +2280,8 @@ static void ath11k_core_reset(struct wor
   static int ath11k_init_hw_params(struct ath11k_base *ab)
   {
       const struct ath11k_hw_params *hw_params = NULL;
@@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>

       for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
           hw_params = &ath11k_hw_params[i];
-@@ -2163,7 +2164,31 @@ static int ath11k_init_hw_params(struct
+@@ -2296,7 +2297,31 @@ static int ath11k_init_hw_params(struct

       ab->hw_params = *hw_params;

diff --git 
a/package/kernel/mac80211/patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch 
b/package/kernel/mac80211/patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch
index eae73170b3f03b..4ecf1d347143e8 100644
--- 
a/package/kernel/mac80211/patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/921-wifi-ath11k-add-hal-regs-for-QCN6122.patch
@@ -10,7 +10,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
  ---
  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -822,6 +822,7 @@ static struct ath11k_hw_params ath11k_hw
+@@ -918,6 +918,7 @@ static struct ath11k_hw_params ath11k_hw
           .bdf_addr = 0x4D200000,
           .hw_ops = &ipq5018_ops,
           .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
@@ -104,7 +104,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
       .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074,
  --- a/drivers/net/wireless/ath/ath11k/hw.h
  +++ b/drivers/net/wireless/ath/ath11k/hw.h
-@@ -425,6 +425,7 @@ extern const struct ath11k_hw_regs qcn90
+@@ -426,6 +426,7 @@ extern const struct ath11k_hw_regs qcn90
   extern const struct ath11k_hw_regs wcn6855_regs;
   extern const struct ath11k_hw_regs wcn6750_regs;
   extern const struct ath11k_hw_regs ipq5018_regs;
diff --git 
a/package/kernel/mac80211/patches/ath11k/922-wifi-ath11k-add-hw-ring-mask-for-QCN6122.patch 
b/package/kernel/mac80211/patches/ath11k/922-wifi-ath11k-add-hw-ring-mask-for-QCN6122.patch
index f93a3bc60ae938..b54461f74f2a8c 100644
--- 
a/package/kernel/mac80211/patches/ath11k/922-wifi-ath11k-add-hw-ring-mask-for-QCN6122.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/922-wifi-ath11k-add-hw-ring-mask-for-QCN6122.patch
@@ -8,7 +8,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
  ---
  --- a/drivers/net/wireless/ath/ath11k/core.c
  +++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -821,6 +821,7 @@ static struct ath11k_hw_params ath11k_hw
+@@ -917,6 +917,7 @@ static struct ath11k_hw_params ath11k_hw
           .max_radios = MAX_RADIOS_5018,
           .bdf_addr = 0x4D200000,
           .hw_ops = &ipq5018_ops,
@@ -64,7 +64,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
       /* CE0: host->target HTC control and raw streams */
  --- a/drivers/net/wireless/ath/ath11k/hw.h
  +++ b/drivers/net/wireless/ath/ath11k/hw.h
-@@ -289,6 +289,7 @@ extern const struct ath11k_hw_ring_mask
+@@ -290,6 +290,7 @@ extern const struct ath11k_hw_ring_mask
   extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390;
   extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074;
   extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750;
diff --git 
a/package/kernel/mac80211/patches/ath11k/923-wifi-ath11k-update-hif_and-pci_ops-for-QCN6122.patch 
b/package/kernel/mac80211/patches/ath11k/923-wifi-ath11k-update-hif_and-pci_ops-for-QCN6122.patch
index 8497c3a8c99c9e..07eaf872798d50 100644
--- 
a/package/kernel/mac80211/patches/ath11k/923-wifi-ath11k-update-hif_and-pci_ops-for-QCN6122.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/923-wifi-ath11k-update-hif_and-pci_ops-for-QCN6122.patch
@@ -91,7 +91,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
   #endif /* _HIF_H_ */
  --- a/drivers/net/wireless/ath/ath11k/qmi.c
  +++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -2187,6 +2187,8 @@ static int ath11k_qmi_request_device_inf
+@@ -2189,6 +2189,8 @@ static int ath11k_qmi_request_device_inf
       if (!ab->hw_params.ce_remap)
           ab->mem_ce = ab->mem;

diff --git 
a/package/kernel/mac80211/patches/ath11k/924-wifi-ath11k-add-multipd-support-for-QCN6122.patch 
b/package/kernel/mac80211/patches/ath11k/924-wifi-ath11k-add-multipd-support-for-QCN6122.patch
index 5b0c58dd947717..e73b8da3795b43 100644
--- 
a/package/kernel/mac80211/patches/ath11k/924-wifi-ath11k-add-multipd-support-for-QCN6122.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/924-wifi-ath11k-add-multipd-support-for-QCN6122.patch
@@ -89,7 +89,7 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>
   /* SMBIOS type containing Board Data File Name Extension */
   #define ATH11K_SMBIOS_BDF_EXT_TYPE 0xF8

-@@ -951,6 +954,7 @@ struct ath11k_base {
+@@ -952,6 +955,7 @@ struct ath11k_base {
       struct list_head peers;
       wait_queue_head_t peer_mapping_wq;
       u8 mac_addr[ETH_ALEN];
diff --git 
a/package/kernel/mac80211/patches/ath11k/925-wifi-ath11k-add-QCN6122-device-support.patch 
b/package/kernel/mac80211/patches/ath11k/925-wifi-ath11k-add-QCN6122-device-support.patch
index 58627ce07e02bd..b8b12ddf235248 100644
--- 
a/package/kernel/mac80211/patches/ath11k/925-wifi-ath11k-add-QCN6122-device-support.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/925-wifi-ath11k-add-QCN6122-device-support.patch
@@ -37,9 +37,9 @@ Signed-off-by: George Moussalem 
<george.moussalem at outlook.com>

  --- a/drivers/net/wireless/ath/ath11k/pcic.c
  +++ b/drivers/net/wireless/ath/ath11k/pcic.c
-@@ -126,6 +126,15 @@ static const struct ath11k_msi_config at
+@@ -137,6 +137,15 @@ static const struct ath11k_msi_config at
           },
-         .hw_rev = ATH11K_HW_QCA2066_HW21,
+         .hw_rev = ATH11K_HW_QCA6698AQ_HW21,
       },
  +    {
  +        .total_vectors = 13,
diff --git 
a/package/kernel/mac80211/patches/ath11k/931-wifi-ath11k-Support-to-assign-m3-dump-memory.patch 
b/package/kernel/mac80211/patches/ath11k/931-wifi-ath11k-Support-to-assign-m3-dump-memory.patch
index 834a4b579735e1..3339cfc43c7b70 100644
--- 
a/package/kernel/mac80211/patches/ath11k/931-wifi-ath11k-Support-to-assign-m3-dump-memory.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/931-wifi-ath11k-Support-to-assign-m3-dump-memory.patch
@@ -10,7 +10,7 @@ Signed-off-by: Ziyang Huang <hzyitc at outlook.com>

  --- a/drivers/net/wireless/ath/ath11k/qmi.c
  +++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -2104,6 +2104,18 @@ static int ath11k_qmi_assign_target_mem_
+@@ -2106,6 +2106,18 @@ static int ath11k_qmi_assign_target_mem_
               ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
               idx++;
               break;
diff --git 
a/package/kernel/mac80211/patches/ath11k/940-ath11k-Revert-clear-the-keys-properly-when-DISABLE_K.patch 
b/package/kernel/mac80211/patches/ath11k/940-ath11k-Revert-clear-the-keys-properly-when-DISABLE_K.patch
index ec2dc222b66053..352e68fcecabbd 100644
--- 
a/package/kernel/mac80211/patches/ath11k/940-ath11k-Revert-clear-the-keys-properly-when-DISABLE_K.patch
+++ 
b/package/kernel/mac80211/patches/ath11k/940-ath11k-Revert-clear-the-keys-properly-when-DISABLE_K.patch
@@ -23,7 +23,7 @@ Signed-off-by: Rameshkumar Sundaram 
<quic_ramess at quicinc.com>

  --- a/drivers/net/wireless/ath/ath11k/mac.c
  +++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -4222,7 +4222,9 @@ static int ath11k_install_key(struct ath
+@@ -4220,7 +4220,9 @@ static int ath11k_install_key(struct ath
           return 0;

       if (cmd == DISABLE_KEY) {
diff --git 
a/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch 
b/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
index bb3f643e332519..7cac4fdc110e26 100644
--- 
a/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/001-wifi-ath12k-add-11d-scan-offload-support-and-handle-country-code-for-WCN7850.patch
@@ -121,7 +121,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   };

   static __le32 ath12k_wmi_tlv_hdr(u32 cmd, u32 len)
-@@ -2364,7 +2366,10 @@ int ath12k_wmi_send_scan_start_cmd(struc
+@@ -2531,7 +2533,10 @@ int ath12k_wmi_send_scan_start_cmd(struc
       cmd->scan_id = cpu_to_le32(arg->scan_id);
       cmd->scan_req_id = cpu_to_le32(arg->scan_req_id);
       cmd->vdev_id = cpu_to_le32(arg->vdev_id);
@@ -133,7 +133,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       cmd->notify_scan_events = cpu_to_le32(arg->notify_scan_events);

       ath12k_wmi_copy_scan_event_cntrl_flags(cmd, arg);
-@@ -3084,6 +3089,110 @@ out:
+@@ -3253,6 +3258,110 @@ out:
       return ret;
   }

@@ -244,7 +244,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   int
   ath12k_wmi_send_twt_enable_cmd(struct ath12k *ar, u32 pdev_id)
   {
-@@ -5669,6 +5778,50 @@ static void ath12k_wmi_op_ep_tx_credits(
+@@ -5873,6 +5982,50 @@ static void ath12k_wmi_op_ep_tx_credits(
       wake_up(&ab->wmi_ab.tx_credits_wq);
   }

@@ -295,9 +295,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   static void ath12k_wmi_htc_tx_complete(struct ath12k_base *ab,
                          struct sk_buff *skb)
   {
-@@ -7270,6 +7423,9 @@ static void ath12k_wmi_op_rx(struct ath1
-     case WMI_GTK_OFFLOAD_STATUS_EVENTID:
-         ath12k_wmi_gtk_offload_status_event(ab, skb);
+@@ -7586,6 +7739,9 @@ static void ath12k_wmi_op_rx(struct ath1
+     case WMI_OBSS_COLOR_COLLISION_DETECTION_EVENTID:
+         /* debug might flood hence silently ignore (no-op) */
           break;
  +    case WMI_11D_NEW_COUNTRY_EVENTID:
  +        ath12k_reg_11d_new_cc_event(ab, skb);
@@ -307,7 +307,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           ath12k_dbg(ab, ATH12K_DBG_WMI, "Unknown eventid: 0x%x\n", id);
  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -3860,6 +3860,28 @@ struct wmi_init_country_cmd {
+@@ -3990,6 +3990,28 @@ struct wmi_init_country_cmd {
       } cc_info;
   } __packed;

@@ -336,9 +336,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   struct wmi_delba_send_cmd {
       __le32 tlv_header;
       __le32 vdev_id;
-@@ -3945,6 +3967,16 @@ struct ath12k_wmi_eht_rate_set_params {
+@@ -4074,6 +4096,16 @@ struct ath12k_wmi_eht_rate_set_params {
+ #define REG_ALPHA2_LEN 2
   #define MAX_6G_REG_RULES 5
- #define REG_US_5G_NUM_REG_RULES 4

  +struct wmi_set_current_country_arg {
  +    u8 alpha2[REG_ALPHA2_LEN];
@@ -353,7 +353,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   enum wmi_start_event_param {
       WMI_VDEV_START_RESP_EVENT = 0,
       WMI_VDEV_RESTART_RESP_EVENT,
-@@ -5547,11 +5579,17 @@ int ath12k_wmi_send_bcn_offload_control_
+@@ -5714,11 +5746,17 @@ int ath12k_wmi_send_bcn_offload_control_
                           u32 vdev_id, u32 bcn_ctrl_op);
   int ath12k_wmi_send_init_country_cmd(struct ath12k *ar,
                        struct ath12k_wmi_init_country_arg *arg);
@@ -373,7 +373,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
                    struct ath12k_wmi_rx_reorder_queue_remove_arg *arg);
  --- a/drivers/net/wireless/ath/ath12k/core.c
  +++ b/drivers/net/wireless/ath/ath12k/core.c
-@@ -1014,6 +1014,7 @@ void ath12k_core_halt(struct ath12k *ar)
+@@ -1218,6 +1218,7 @@ void ath12k_core_halt(struct ath12k *ar)
       cancel_delayed_work_sync(&ar->scan.timeout);
       cancel_work_sync(&ar->regd_update_work);
       cancel_work_sync(&ab->rfkill_work);
@@ -381,7 +381,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL);
       synchronize_rcu();
-@@ -1021,6 +1022,34 @@ void ath12k_core_halt(struct ath12k *ar)
+@@ -1225,6 +1226,34 @@ void ath12k_core_halt(struct ath12k *ar)
       idr_init(&ar->txmgmt_idr);
   }

@@ -415,8 +415,8 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +
   static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
   {
-     struct ath12k *ar;
-@@ -1045,8 +1074,10 @@ static void ath12k_core_pre_reconfigure_
+     struct ath12k_hw_group *ag = ab->ag;
+@@ -1250,8 +1279,10 @@ static void ath12k_core_pre_reconfigure_
               ar = &ah->radio[j];

               ath12k_mac_drain_tx(ar);
@@ -428,7 +428,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
               complete(&ar->scan.on_channel);
               complete(&ar->peer_assoc_done);
               complete(&ar->peer_delete_done);
-@@ -1312,6 +1343,7 @@ struct ath12k_base *ath12k_core_alloc(st
+@@ -1920,6 +1951,7 @@ struct ath12k_base *ath12k_core_alloc(st
       INIT_WORK(&ab->reset_work, ath12k_core_reset);
       INIT_WORK(&ab->rfkill_work, ath12k_rfkill_work);
       INIT_WORK(&ab->dump_work, ath12k_coredump_upload);
@@ -438,8 +438,8 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       init_completion(&ab->htc_suspend);
  --- a/drivers/net/wireless/ath/ath12k/core.h
  +++ b/drivers/net/wireless/ath/ath12k/core.h
-@@ -199,6 +199,12 @@ enum ath12k_scan_state {
-     ATH12K_SCAN_ABORTING,
+@@ -222,6 +222,12 @@ enum ath12k_hw_group_flags {
+     ATH12K_GROUP_FLAG_UNREGISTER,
   };

  +enum ath12k_11d_state {
@@ -449,9 +449,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +};
  +
   enum ath12k_dev_flags {
-     ATH12K_CAC_RUNNING,
+     ATH12K_FLAG_CAC_RUNNING,
       ATH12K_FLAG_CRASH_FLUSH,
-@@ -319,6 +325,8 @@ struct ath12k_vif_iter {
+@@ -359,6 +365,8 @@ struct ath12k_vif_iter {
   #define ATH12K_RX_RATE_TABLE_11AX_NUM    576
   #define ATH12K_RX_RATE_TABLE_NUM 320

@@ -460,9 +460,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   struct ath12k_rx_peer_rate_stats {
       u64 ht_mcs_count[HAL_RX_MAX_MCS_HT + 1];
       u64 vht_mcs_count[HAL_RX_MAX_MCS_VHT + 1];
-@@ -654,6 +662,13 @@ struct ath12k {
-     u32 freq_low;
-     u32 freq_high;
+@@ -710,6 +718,13 @@ struct ath12k {
+
+     struct wiphy_radio_freq_range freq_range;

  +    /* Protected by wiphy::mtx lock. */
  +    u32 vdev_id_11d_scan;
@@ -472,9 +472,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +    bool regdom_set_by_user;
  +
       bool nlo_enabled;
- };

-@@ -886,6 +901,8 @@ struct ath12k_base {
+     struct completion mlo_setup_done;
+@@ -982,6 +997,8 @@ struct ath12k_base {
       /* continuous recovery fail count */
       atomic_t fail_cont_count;
       unsigned long reset_fail_timeout;
@@ -485,7 +485,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           u32 fw_crash_counter;
  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -3249,6 +3249,11 @@ static void ath12k_bss_assoc(struct ath1
+@@ -3263,6 +3263,11 @@ static void ath12k_bss_assoc(struct ath1
       if (ret)
           ath12k_warn(ar->ab, "failed to set vdev %i OBSS PD 
parameters: %d\n",
                   arvif->vdev_id, ret);
@@ -497,7 +497,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   }

   static void ath12k_bss_disassoc(struct ath12k *ar,
-@@ -4017,7 +4022,7 @@
+@@ -4017,7 +4022,7 @@ void __ath12k_mac_scan_finish(struct ath
           fallthrough;
       case ATH12K_SCAN_STARTING:
           cancel_delayed_work(&ar->scan.timeout);
@@ -506,7 +506,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           wiphy_work_queue(ar->ah->hw->wiphy, &ar->scan.vdev_clean_wk);
           break;
       }
-@@ -4360,7 +4365,12 @@ scan:
+@@ -4361,7 +4366,12 @@ static int ath12k_mac_op_hw_scan(struct

       ret = ath12k_start_scan(ar, arg);
       if (ret) {
@@ -520,9 +520,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           spin_lock_bh(&ar->data_lock);
           ar->scan.state = ATH12K_SCAN_IDLE;
           spin_unlock_bh(&ar->data_lock);
-@@ -4390,6 +4390,11 @@ exit:
-
-     mutex_unlock(&ar->conf_mutex);
+@@ -4388,6 +4398,11 @@ exit:
+         kfree(arg);
+     }

  +    if (ar->state_11d == ATH12K_11D_PREPARING &&
  +        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
@@ -532,7 +532,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       return ret;
   }

-@@ -7195,7 +7210,7 @@ static int ath12k_mac_start(struct ath12
+@@ -7318,7 +7333,7 @@ static int ath12k_mac_start(struct ath12

       /* TODO: Do we need to enable ANI? */

@@ -541,8 +541,8 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       ar->num_started_vdevs = 0;
       ar->num_created_vdevs = 0;
-@@ -7375,6 +7390,9 @@ static void ath12k_mac_stop(struct ath12
-     cancel_delayed_work_sync(&ar->scan.timeout);
+@@ -7499,6 +7514,9 @@ static void ath12k_mac_stop(struct ath12
+     wiphy_work_cancel(ath12k_ar_to_hw(ar)->wiphy, 
&ar->scan.vdev_clean_wk);
       cancel_work_sync(&ar->regd_update_work);
       cancel_work_sync(&ar->ab->rfkill_work);
  +    cancel_work_sync(&ar->ab->update_11d_work);
@@ -551,7 +551,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       spin_lock_bh(&ar->data_lock);
       list_for_each_entry_safe(ppdu_stats, tmp, &ar->ppdu_stats_info, 
list) {
-@@ -7792,6 +7797,117 @@
+@@ -7792,6 +7810,117 @@ static void ath12k_mac_op_update_vif_off
       ath12k_mac_update_vif_offload(&ahvif->deflink);
   }

@@ -669,7 +669,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
   int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif 
*arvif)
   {
       struct ath12k_hw *ah = ar->ah;
-@@ -7935,6 +8064,7 @@ static int ath12k_mac_vdev_create(struct
+@@ -7926,6 +8055,7 @@ int ath12k_mac_vdev_create(struct ath12k
                       arvif->vdev_id, ret);
               goto err_peer_del;
           }
@@ -677,7 +677,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           break;
       case WMI_VDEV_TYPE_STA:
           param_id = WMI_STA_PS_PARAM_RX_WAKE_POLICY;
-@@ -7973,6 +8103,13 @@ static int ath12k_mac_vdev_create(struct
+@@ -7964,6 +8094,13 @@ int ath12k_mac_vdev_create(struct ath12k
                       arvif->vdev_id, ret);
               goto err_peer_del;
           }
@@ -691,9 +691,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           break;
       default:
           break;
-@@ -8756,6 +8756,11 @@
-     ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface 
(vdev %d link id %d)",
-            arvif->vdev_id, arvif->link_id);
+@@ -8756,6 +8893,11 @@ ath12k_mac_vdev_start_restart(struct ath
+             return ret;
+     }

  +    if (test_bit(WMI_TLV_SERVICE_11D_OFFLOAD, ab->wmi_ab.svc_map) &&
  +        ahvif->vdev_type == WMI_VDEV_TYPE_STA &&
@@ -701,9 +701,9 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
  +        ath12k_mac_11d_scan_stop(ar);
  +
       if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
-         ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
-         if (ret)
-@@ -9330,6 +9446,14 @@
+         arg.ssid = ahvif->u.ap.ssid;
+         arg.ssid_len = ahvif->u.ap.ssid_len;
+@@ -9330,6 +9472,14 @@ ath12k_mac_op_unassign_vif_chanctx(struc
           ar->num_started_vdevs == 1 && ar->monitor_vdev_created)
           ath12k_mac_monitor_stop(ar);

@@ -718,7 +718,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       ath12k_mac_remove_link_interface(hw, arvif);
       ath12k_mac_unassign_link_vif(arvif);
   }
-@@ -9891,6 +9941,14 @@ ath12k_mac_op_reconfig_complete(struct i
+@@ -9893,6 +10043,14 @@ ath12k_mac_op_reconfig_complete(struct i
           ath12k_warn(ar->ab, "pdev %d successfully recovered\n",
                   ar->pdev->pdev_id);

@@ -733,19 +733,19 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
           if (ab->is_reset) {
               recovery_count = atomic_inc_return(&ab->recovery_count);

-@@ -10040,6 +10198,9 @@ static void ath12k_mac_setup(struct ath1
+@@ -11106,6 +11264,9 @@ static void ath12k_mac_setup(struct ath1

-     INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
+     wiphy_work_init(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
       skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
  +
  +    ar->vdev_id_11d_scan = ATH12K_11D_INVALID_VDEV_ID;
  +    init_completion(&ar->completed_11d_scan);
   }

- int ath12k_mac_register(struct ath12k_base *ab)
+ static int __ath12k_mac_mlo_setup(struct ath12k *ar)
  --- a/drivers/net/wireless/ath/ath12k/mac.h
  +++ b/drivers/net/wireless/ath/ath12k/mac.h
-@@ -51,6 +51,13 @@ enum ath12k_supported_bw {
+@@ -66,6 +66,13 @@ struct ath12k_mac_get_any_chanctx_conf_a

   extern const struct htt_rx_ring_tlv_filter 
ath12k_mac_mon_status_filter_default;

diff --git 
a/package/kernel/mac80211/patches/ath12k/002-wifi-ath12k-Fetch-regdb.bin-file-from-board-2.bin.patch 
b/package/kernel/mac80211/patches/ath12k/002-wifi-ath12k-Fetch-regdb.bin-file-from-board-2.bin.patch
index 67d62f925758bd..ee9b1845bb2552 100644
--- 
a/package/kernel/mac80211/patches/ath12k/002-wifi-ath12k-Fetch-regdb.bin-file-from-board-2.bin.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/002-wifi-ath12k-Fetch-regdb.bin-file-from-board-2.bin.patch
@@ -22,7 +22,7 @@ Signed-off-by: Jeff Johnson 
<jeff.johnson at oss.qualcomm.com>

  --- a/drivers/net/wireless/ath/ath12k/core.c
  +++ b/drivers/net/wireless/ath/ath12k/core.c
-@@ -161,7 +161,7 @@ EXPORT_SYMBOL(ath12k_core_resume);
+@@ -173,7 +173,7 @@ EXPORT_SYMBOL(ath12k_core_resume);

   static int __ath12k_core_create_board_name(struct ath12k_base *ab, 
char *name,
                          size_t name_len, bool with_variant,
@@ -31,7 +31,7 @@ Signed-off-by: Jeff Johnson 
<jeff.johnson at oss.qualcomm.com>
   {
       /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
       char variant[9 + ATH12K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
-@@ -192,7 +192,9 @@ static int __ath12k_core_create_board_na
+@@ -204,7 +204,9 @@ static int __ath12k_core_create_board_na
                 "bus=%s,qmi-chip-id=%d,qmi-board-id=%d%s",
                 ath12k_bus_str(ab->hif.bus),
                 ab->qmi.target.chip_id,
@@ -42,7 +42,7 @@ Signed-off-by: Jeff Johnson 
<jeff.johnson at oss.qualcomm.com>
           break;
       }

-@@ -204,19 +206,19 @@ static int __ath12k_core_create_board_na
+@@ -216,19 +218,19 @@ static int __ath12k_core_create_board_na
   static int ath12k_core_create_board_name(struct ath12k_base *ab, char 
*name,
                        size_t name_len)
   {
diff --git 
a/package/kernel/mac80211/patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch 
b/package/kernel/mac80211/patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch
index cd85a0f6aa2652..2209878b3c1ffe 100644
--- 
a/package/kernel/mac80211/patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/100-ath12k-prevent-ltssm-startup-crash.patch
@@ -5,7 +5,7 @@ But have issues on BPI-Rx boards.

  --- a/drivers/net/wireless/ath/ath12k/pci.c
  +++ b/drivers/net/wireless/ath/ath12k/pci.c
-@@ -277,6 +277,9 @@ static void ath12k_pci_enable_ltssm(stru
+@@ -279,6 +279,9 @@ static void ath12k_pci_enable_ltssm(stru
       u32 val;
       int i;

diff --git 
a/package/kernel/mac80211/patches/ath12k/102-wifi-ath12k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch 
b/package/kernel/mac80211/patches/ath12k/102-wifi-ath12k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch
index 5b1628023fc73a..398f4d44512b23 100644
--- 
a/package/kernel/mac80211/patches/ath12k/102-wifi-ath12k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/102-wifi-ath12k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch
@@ -130,7 +130,7 @@ Best regards,

  --- a/drivers/net/wireless/ath/ath12k/wmi.c
  +++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -2558,6 +2558,9 @@ int ath12k_wmi_send_scan_chan_list_cmd(s
+@@ -2743,6 +2743,9 @@ int ath12k_wmi_send_scan_chan_list_cmd(s
           max_chan_limit = (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len) /
               sizeof(*chan_info);

@@ -142,7 +142,7 @@ Best regards,
           arg->nallchans -= num_send_chans;
  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -3743,6 +3743,8 @@ struct wmi_stop_scan_cmd {
+@@ -3873,6 +3873,8 @@ struct wmi_stop_scan_cmd {
       __le32 pdev_id;
   } __packed;

diff --git 
a/package/kernel/mac80211/patches/ath12k/103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch 
b/package/kernel/mac80211/patches/ath12k/103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch
index 3b8b6226d1b7c6..7dcbecb71be403 100644
--- 
a/package/kernel/mac80211/patches/ath12k/103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch
@@ -124,7 +124,7 @@ Best regards,

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -5186,9 +5186,7 @@ static void ath12k_mac_setup_ht_vht_cap(
+@@ -6367,9 +6367,7 @@ static void ath12k_mac_setup_ht_vht_cap(
                               rate_cap_rx_chainmask);
       }

diff --git 
a/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch 
b/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
index f1eb22afe0bae5..a632441755b2c8 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-3-wifi-ath12k-move-HE-MCS-mapper-to-a-separate-function.patch
@@ -130,7 +130,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -5519,12 +5519,24 @@ static __le16 ath12k_mac_setup_he_6ghz_c
+@@ -6721,12 +6721,24 @@ static __le16 ath12k_mac_setup_he_6ghz_c
       return cpu_to_le16(bcap->he_6ghz_capa);
   }

@@ -156,7 +156,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

       he_cap->has_he = true;
       memcpy(he_cap_elem->mac_cap_info, band_cap->he_cap_info,
-@@ -5562,13 +5574,7 @@ static void ath12k_mac_copy_he_cap(struc
+@@ -6764,13 +6776,7 @@ static void ath12k_mac_copy_he_cap(struc
           break;
       }

diff --git 
a/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch 
b/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
index 32bed9f8505cd3..40be5e8cc60ec4 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-4-wifi-ath12k-generate-rx-and-tx-mcs-maps-for-supported-HE-mcs.patch
@@ -128,7 +128,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/mac.c
  +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -5519,20 +5519,40 @@ static __le16 ath12k_mac_setup_he_6ghz_c
+@@ -6721,20 +6721,40 @@ static __le16 ath12k_mac_setup_he_6ghz_c
       return cpu_to_le16(bcap->he_6ghz_capa);
   }

@@ -177,7 +177,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
                      int iftype, u8 num_tx_chains,
                      struct ieee80211_sta_he_cap *he_cap)
   {
-@@ -5574,7 +5594,7 @@ static void ath12k_mac_copy_he_cap(struc
+@@ -6776,7 +6796,7 @@ static void ath12k_mac_copy_he_cap(struc
           break;
       }

@@ -186,7 +186,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
       memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
       if (he_cap_elem->phy_cap_info[6] &
           IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT)
-@@ -5763,7 +5783,7 @@ static int ath12k_mac_copy_sband_iftype_
+@@ -6965,7 +6985,7 @@ static int ath12k_mac_copy_sband_iftype_

           data[idx].types_mask = BIT(i);

diff --git 
a/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch 
b/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
index 50225e7bd41479..dae1682ead01a9 100644
--- 
a/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
+++ 
b/package/kernel/mac80211/patches/ath12k/104-5-wifi-ath12k-fix-TX-and-RX-MCS-rate-configurations-in-HE-mode.patch
@@ -127,7 +127,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/wmi.c
  +++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -2140,8 +2140,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struc
+@@ -2266,8 +2266,8 @@ int ath12k_wmi_send_peer_assoc_cmd(struc
           he_mcs->tlv_header = ath12k_wmi_tlv_cmd_hdr(WMI_TAG_HE_RATE_SET,
                                   sizeof(*he_mcs));

@@ -140,7 +140,7 @@ Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

  --- a/drivers/net/wireless/ath/ath12k/wmi.h
  +++ b/drivers/net/wireless/ath/ath12k/wmi.h
-@@ -3953,7 +3953,9 @@ struct ath12k_wmi_vht_rate_set_params {
+@@ -4083,7 +4083,9 @@ struct ath12k_wmi_vht_rate_set_params {

   struct ath12k_wmi_he_rate_set_params {
       __le32 tlv_header;
diff --git 
a/package/kernel/mac80211/patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch 
b/package/kernel/mac80211/patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch
index 4feb748229a5b7..a14ed55ee9eafe 100644
--- 
a/package/kernel/mac80211/patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/341-wifi-ath9k-obtain-system-gpios.patch
@@ -180,7 +180,7 @@ Best regards,
   #include <linux/unaligned.h>

   #include "hw.h"
-@@ -2727,19 +2727,25 @@ static void ath9k_hw_gpio_cfg_output_mux
+@@ -2718,19 +2718,25 @@ static void ath9k_hw_gpio_cfg_output_mux
   static void ath9k_hw_gpio_cfg_soc(struct ath_hw *ah, u32 gpio, bool out,
                     const char *label)
   {
@@ -210,7 +210,7 @@ Best regards,
   }

   static void ath9k_hw_gpio_cfg_wmac(struct ath_hw *ah, u32 gpio, bool out,
-@@ -2801,8 +2807,10 @@ void ath9k_hw_gpio_free(struct ath_hw *a
+@@ -2792,8 +2798,10 @@ void ath9k_hw_gpio_free(struct ath_hw *a

       WARN_ON(gpio >= ah->caps.num_gpio_pins);

@@ -223,7 +223,7 @@ Best regards,
   }
   EXPORT_SYMBOL(ath9k_hw_gpio_free);

-@@ -2830,8 +2838,8 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah,
+@@ -2821,8 +2829,8 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah,
               val = REG_READ(ah, AR_GPIO_IN(ah)) & BIT(gpio);
           else
               val = MS_REG_READ(AR, gpio);
@@ -234,7 +234,7 @@ Best regards,
       } else {
           WARN_ON(1);
       }
-@@ -2854,8 +2862,8 @@ void ath9k_hw_set_gpio(struct ath_hw *ah
+@@ -2845,8 +2853,8 @@ void ath9k_hw_set_gpio(struct ath_hw *ah
               AR7010_GPIO_OUT : AR_GPIO_IN_OUT(ah);

           REG_RMW(ah, out_addr, val << gpio, BIT(gpio));
diff --git 
a/package/kernel/mac80211/patches/ath9k/356-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch 
b/package/kernel/mac80211/patches/ath9k/356-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch
index 78ad7623b27769..5cb891ed351717 100644
--- 
a/package/kernel/mac80211/patches/ath9k/356-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/356-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch
@@ -8,7 +8,7 @@ This reverts commit 
71f5137bf010c6faffab50c0ec15374c59c4a411.

  --- a/drivers/net/wireless/ath/ath9k/hw.c
  +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2983,7 +2983,8 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2974,7 +2974,8 @@ void ath9k_hw_apply_txpower(struct ath_h
   {
       struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
       struct ieee80211_channel *channel;
@@ -18,7 +18,7 @@ This reverts commit 
71f5137bf010c6faffab50c0ec15374c59c4a411.
       u16 ctl = NO_CTL;

       if (!chan)
-@@ -2995,9 +2996,14 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2986,9 +2987,14 @@ void ath9k_hw_apply_txpower(struct ath_h
       channel = chan->chan;
       chan_pwr = min_t(int, channel->max_power * 2, MAX_COMBINED_POWER);
       new_pwr = min_t(int, chan_pwr, reg->power_limit);
diff --git 
a/package/kernel/mac80211/patches/ath9k/365-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch 
b/package/kernel/mac80211/patches/ath9k/365-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch
index 21563bdaf581f6..14abb4035ab6d2 100644
--- 
a/package/kernel/mac80211/patches/ath9k/365-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/365-ath9k-adjust-tx-power-reduction-for-US-regulatory-do.patch
@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/drivers/net/wireless/ath/ath9k/hw.c
  +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -3002,6 +3002,10 @@ void ath9k_hw_apply_txpower(struct ath_h
+@@ -2993,6 +2993,10 @@ void ath9k_hw_apply_txpower(struct ath_h
       if (ant_gain > max_gain)
           ant_reduction = ant_gain - max_gain;

diff --git 
a/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch 
b/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch
index 3eb57bb1cf5caf..7405e594fe64ce 100644
--- a/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch
+++ b/package/kernel/mac80211/patches/ath9k/401-ath9k_blink_default.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -48,7 +48,7 @@ int ath9k_modparam_nohwcrypt;
+@@ -47,7 +47,7 @@ int ath9k_modparam_nohwcrypt;
   module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
   MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");

diff --git 
a/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch 
b/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch
index b2f2763e8e16d9..5ef29e3f92723f 100644
--- 
a/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/410-ath9k_allow_adhoc_and_ap.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -882,6 +882,7 @@ static const struct ieee80211_iface_limi
+@@ -834,6 +834,7 @@ static const struct ieee80211_iface_limi
                    BIT(NL80211_IFTYPE_AP) },
       { .max = 1,    .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
                    BIT(NL80211_IFTYPE_P2P_GO) },
diff --git 
a/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch 
b/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch
index f424ca530be860..aca05fcffd272b 100644
--- 
a/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/450-ath9k-enabled-MFP-capability-unconditionally.patch
@@ -14,7 +14,7 @@ Signed-off-by: David Bauer <mail at david-bauer.net>

  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -963,6 +963,7 @@ static void ath9k_set_hw_capab(struct at
+@@ -915,6 +915,7 @@ static void ath9k_set_hw_capab(struct at
       ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
       ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
       ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
@@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail at david-bauer.net>

       if (ath9k_ps_enable)
           ieee80211_hw_set(hw, SUPPORTS_PS);
-@@ -975,9 +976,6 @@ static void ath9k_set_hw_capab(struct at
+@@ -927,9 +928,6 @@ static void ath9k_set_hw_capab(struct at
                   IEEE80211_RADIOTAP_MCS_HAVE_STBC;
       }

diff --git 
a/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch 
b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch
index f1431526bcd17e..8c139ac55318bc 100644
--- a/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch
+++ b/package/kernel/mac80211/patches/ath9k/500-ath9k_eeprom_debugfs.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/debug.c
  +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1429,6 +1429,7 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1430,6 +1430,7 @@ int ath9k_init_debug(struct ath_hw *ah)

       ath9k_cmn_debug_base_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
       ath9k_cmn_debug_modal_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
diff --git 
a/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch 
b/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch
index 740ddc39dc3d03..997e9faa7071f9 100644
--- a/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch
+++ b/package/kernel/mac80211/patches/ath9k/501-ath9k_ahb_init.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -1178,25 +1178,25 @@ static int __init ath9k_init(void)
+@@ -1130,25 +1130,25 @@ static int __init ath9k_init(void)
   {
       int error;

diff --git 
a/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch 
b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch
index 87d18626da3779..bd67efdd28009a 100644
--- 
a/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/512-ath9k_channelbw_debugfs.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/debug.c
  +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1430,6 +1430,7 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1431,6 +1431,7 @@ int ath9k_init_debug(struct ath_hw *ah)
       ath9k_cmn_debug_base_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
       ath9k_cmn_debug_modal_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
       ath9k_cmn_debug_eeprom(sc->debug.debugfs_phy, sc->sc_ah);
@@ -181,7 +181,7 @@
       hw->max_listen_interval = 1;
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -733,6 +733,7 @@ static int ath9k_init_softc(u16 devid, s
+@@ -689,6 +689,7 @@ static int ath9k_init_softc(u16 devid, s
       if (!ath9k_is_chanctx_enabled())
           sc->cur_chan->hw_queue_base = 0;

diff --git 
a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch 
b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
index 4bb27d558cc43c..edef8dd1bc389c 100644
--- a/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
+++ b/package/kernel/mac80211/patches/ath9k/530-ath9k_extra_leds.patch
@@ -24,7 +24,7 @@
   struct ath_softc {
       struct ieee80211_hw *hw;
       struct device *dev;
-@@ -1034,9 +1044,8 @@ struct ath_softc {
+@@ -1036,9 +1046,8 @@ struct ath_softc {
       spinlock_t chan_lock;

   #ifdef CPTCFG_MAC80211_LEDS
@@ -181,7 +181,7 @@

  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -1089,7 +1089,7 @@ int ath9k_init_device(u16 devid, struct
+@@ -1041,7 +1041,7 @@ int ath9k_init_device(u16 devid, struct

   #ifdef CPTCFG_MAC80211_LEDS
       /* must be initialized before ieee80211_register_hw */
@@ -254,7 +254,7 @@

   static ssize_t read_file_ani(struct file *file, char __user *user_buf,
                    size_t count, loff_t *ppos)
-@@ -1390,6 +1445,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1391,6 +1446,10 @@ int ath9k_init_debug(struct ath_hw *ah)
       ath9k_tx99_init_debug(sc);
       ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy);

diff --git 
a/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch 
b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch
index 35d39a05c734fb..4b8834ad28db84 100644
--- a/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch
+++ b/package/kernel/mac80211/patches/ath9k/542-ath9k_debugfs_diag.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/debug.c
  +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1428,6 +1428,50 @@ void ath9k_deinit_debug(struct ath_softc
+@@ -1429,6 +1429,50 @@ void ath9k_deinit_debug(struct ath_softc
       ath9k_cmn_spectral_deinit_debug(&sc->spec_priv);
   }

@@ -51,7 +51,7 @@
   int ath9k_init_debug(struct ath_hw *ah)
   {
       struct ath_common *common = ath9k_hw_common(ah);
-@@ -1449,6 +1493,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1450,6 +1494,8 @@ int ath9k_init_debug(struct ath_hw *ah)
       debugfs_create_file("gpio_led", S_IWUSR,
                  sc->debug.debugfs_phy, sc, &fops_gpio_led);
   #endif
@@ -94,7 +94,7 @@
   struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
  --- a/drivers/net/wireless/ath/ath9k/hw.c
  +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -1881,6 +1881,20 @@ u32 ath9k_hw_get_tsf_offset(struct times
+@@ -1872,6 +1872,20 @@ u32 ath9k_hw_get_tsf_offset(ktime_t last
   }
   EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);

@@ -115,7 +115,7 @@
   int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
              struct ath9k_hw_cal_data *caldata, bool fastcc)
   {
-@@ -2089,6 +2103,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2080,6 +2094,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
           ar9003_hw_disable_phy_restart(ah);

       ath9k_hw_apply_gpio_override(ah);
diff --git 
a/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch 
b/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch
index 0fedc712701afe..7f4874990cba9e 100644
--- a/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch
+++ b/package/kernel/mac80211/patches/ath9k/543-ath9k_entropy_from_adc.patch
@@ -55,7 +55,7 @@
       ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -871,7 +871,8 @@ static void ath9k_init_txpower_limits(st
+@@ -823,7 +823,8 @@ static void ath9k_init_txpower_limits(st
       if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
           ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);

@@ -65,7 +65,7 @@
   }

   static const struct ieee80211_iface_limit if_limits[] = {
-@@ -1049,6 +1050,18 @@ static void ath9k_set_hw_capab(struct at
+@@ -1001,6 +1002,18 @@ static void ath9k_set_hw_capab(struct at
       wiphy_ext_feature_set(hw->wiphy, 
NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
   }

@@ -84,7 +84,7 @@
   int ath9k_init_device(u16 devid, struct ath_softc *sc,
               const struct ath_bus_ops *bus_ops)
   {
-@@ -1096,6 +1109,8 @@ int ath9k_init_device(u16 devid, struct
+@@ -1048,6 +1061,8 @@ int ath9k_init_device(u16 devid, struct

       wiphy_read_of_freq_limits(hw->wiphy);

diff --git 
a/package/kernel/mac80211/patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch 
b/package/kernel/mac80211/patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch
index 23a81864faa11d..926fbac9883c95 100644
--- 
a/package/kernel/mac80211/patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/544-ath9k-ar933x-usb-hang-workaround.patch
@@ -55,7 +55,7 @@
       return -EINVAL;
   }

-@@ -2114,6 +2139,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+@@ -2105,6 +2130,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
           ath9k_hw_set_radar_params(ah);
       }

diff --git 
a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch 
b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
index 288948c8386c89..d7fe5b79f0a98d 100644
--- a/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
+++ b/package/kernel/mac80211/patches/ath9k/548-ath9k_enable_gpio_chip.patch
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

   #include "common.h"
   #include "debug.h"
-@@ -1046,6 +1048,10 @@ struct ath_softc {
+@@ -1048,6 +1050,10 @@ struct ath_softc {
   #ifdef CPTCFG_MAC80211_LEDS
       const char *led_default_trigger;
       struct list_head leds;
diff --git a/package/kernel/mac80211/patches/ath9k/550-ath9k-of.patch 
b/package/kernel/mac80211/patches/ath9k/550-ath9k-of.patch
index 604239188de313..2b44836ba16dca 100644
--- a/package/kernel/mac80211/patches/ath9k/550-ath9k-of.patch
+++ b/package/kernel/mac80211/patches/ath9k/550-ath9k-of.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/ath/ath9k/init.c
  +++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -29,6 +29,11 @@
+@@ -28,6 +28,11 @@

   #include "ath9k.h"

@@ -12,7 +12,7 @@
   struct ath9k_eeprom_ctx {
       struct completion complete;
       struct ath_hw *ah;
-@@ -243,6 +248,81 @@ static unsigned int ath9k_reg_rmw(void *
+@@ -242,6 +247,81 @@ static unsigned int ath9k_reg_rmw(void *
       return val;
   }

@@ -94,7 +94,7 @@
   /**************************/
   /*     Initialization     */
   /**************************/
-@@ -670,6 +750,7 @@ static int ath9k_of_init(struct ath_soft
+@@ -626,6 +706,7 @@ static int ath9k_of_init(struct ath_soft
       struct ath_common *common = ath9k_hw_common(ah);
       enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
       char eeprom_name[100];
@@ -102,7 +102,7 @@
       int ret;

       if (!of_device_is_available(np))
-@@ -677,6 +758,43 @@ static int ath9k_of_init(struct ath_soft
+@@ -633,6 +714,43 @@ static int ath9k_of_init(struct ath_soft

       ath_dbg(common, CONFIG, "parsing configuration from OF node\n");

@@ -146,7 +146,7 @@
       if (of_property_read_bool(np, "qca,no-eeprom")) {
           /* ath9k-eeprom-<bus>-<id>.bin */
           scnprintf(eeprom_name, sizeof(eeprom_name),
-@@ -693,6 +811,17 @@ static int ath9k_of_init(struct ath_soft
+@@ -649,6 +767,17 @@ static int ath9k_of_init(struct ath_soft

       of_get_mac_address(np, common->macaddr);

diff --git 
a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch 
b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
index 5f32810fe9df3d..7f826b8a53f48e 100644
--- 
a/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
+++ 
b/package/kernel/mac80211/patches/ath9k/551-ath9k_ubnt_uap_plus_hsr.patch
@@ -7,7 +7,7 @@
  +#include "hsr.h"

   /* Set/change channels.  If the channel is really being changed, it's 
done
-  * by reseting the chip.  To accomplish this we must first cleanup any 
pending
+  * by resetting the chip.  To accomplish this we must first cleanup 
any pending
  @@ -22,6 +23,7 @@
    */
   static int ath_set_channel(struct ath_softc *sc)
@@ -374,7 +374,7 @@

  --- a/local-symbols
  +++ b/local-symbols
-@@ -123,6 +123,7 @@ ATH9K_WOW=
+@@ -117,6 +117,7 @@ ATH9K_WOW=
   ATH9K_RFKILL=
   ATH9K_CHANNEL_CONTEXT=
   ATH9K_PCOEM=
diff --git 
a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch 
b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
index a7f133d4c5e3ee..b02128ce5318e7 100644
--- a/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
+++ b/package/kernel/mac80211/patches/ath9k/552-ath9k-ahb_of.patch
@@ -58,7 +58,7 @@
       if (ret) {
           dev_err(&pdev->dev, "failed to initialize device\n");
           goto err_irq;
-@@ -167,6 +177,7 @@ static struct platform_driver ath_ahb_dr
+@@ -160,6 +170,7 @@ static struct platform_driver ath_ahb_dr

       .driver = {
           .name = "ath9k",
diff --git 
a/package/kernel/mac80211/patches/brcm/860-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch 
b/package/kernel/mac80211/patches/brcm/860-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
index 84b989d8589c20..fe471923d215cf 100644
--- 
a/package/kernel/mac80211/patches/brcm/860-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
+++ 
b/package/kernel/mac80211/patches/brcm/860-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch
@@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>

  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -980,8 +980,36 @@ static struct wireless_dev *brcmf_cfg802
+@@ -984,8 +984,36 @@ static struct wireless_dev *brcmf_cfg802
       struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
       struct brcmf_pub *drvr = cfg->pub;
       struct wireless_dev *wdev;
diff --git 
a/package/kernel/mac80211/patches/brcm/870-02-rpi-6.12-brcmfmac-Prefer-a-ccode-from-OTP-over-nvram-file.patch 
b/package/kernel/mac80211/patches/brcm/870-02-rpi-6.12-brcmfmac-Prefer-a-ccode-from-OTP-over-nvram-file.patch
index 9a7f9eb266409d..b9907f61296654 100644
--- 
a/package/kernel/mac80211/patches/brcm/870-02-rpi-6.12-brcmfmac-Prefer-a-ccode-from-OTP-over-nvram-file.patch
+++ 
b/package/kernel/mac80211/patches/brcm/870-02-rpi-6.12-brcmfmac-Prefer-a-ccode-from-OTP-over-nvram-file.patch
@@ -22,7 +22,7 @@ Signed-off-by: Phil Elwell <phil at raspberrypi.com>
   #include <net/cfg80211.h>
   #include <net/netlink.h>
   #include <uapi/linux/if_arp.h>
-@@ -8212,31 +8213,45 @@ static void brcmf_cfg80211_reg_notifier(
+@@ -8215,31 +8216,45 @@ static void brcmf_cfg80211_reg_notifier(
       struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
       struct brcmf_pub *drvr = cfg->pub;
       struct brcmf_fil_country_le ccreq;
diff --git 
a/package/kernel/mac80211/patches/brcm/870-03-rpi-6.12-brcmfmac-Increase-power-saving-delay-to-2s.patch 
b/package/kernel/mac80211/patches/brcm/870-03-rpi-6.12-brcmfmac-Increase-power-saving-delay-to-2s.patch
index f197e890265998..a05171be48dfd5 100644
--- 
a/package/kernel/mac80211/patches/brcm/870-03-rpi-6.12-brcmfmac-Increase-power-saving-delay-to-2s.patch
+++ 
b/package/kernel/mac80211/patches/brcm/870-03-rpi-6.12-brcmfmac-Increase-power-saving-delay-to-2s.patch
@@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil at raspberrypi.com>

  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -3338,6 +3338,7 @@ brcmf_cfg80211_set_power_mgmt(struct wip
+@@ -3342,6 +3342,7 @@ brcmf_cfg80211_set_power_mgmt(struct wip
               bphy_err(drvr, "error (%d)\n", err);
       }

diff --git 
a/package/kernel/mac80211/patches/brcm/870-04-rpi-6.12-brcmfmac-non-upstream-support-DS1-exit-firmware-re-download.patch 
b/package/kernel/mac80211/patches/brcm/870-04-rpi-6.12-brcmfmac-non-upstream-support-DS1-exit-firmware-re-download.patch
index 1e2016bcadec7b..1cdc9fdc01c0b9 100644
--- 
a/package/kernel/mac80211/patches/brcm/870-04-rpi-6.12-brcmfmac-non-upstream-support-DS1-exit-firmware-re-download.patch
+++ 
b/package/kernel/mac80211/patches/brcm/870-04-rpi-6.12-brcmfmac-non-upstream-support-DS1-exit-firmware-re-download.patch
@@ -112,7 +112,7 @@ JIRA: SWWLAN-136577
                       BRCMF_DEFAULT_SCAN_CHANNEL_TIME);
  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1317,7 +1317,7 @@ int brcmf_alloc(struct device *dev, stru
+@@ -1322,7 +1322,7 @@ int brcmf_alloc(struct device *dev, stru
       return 0;
   }

@@ -121,7 +121,7 @@ JIRA: SWWLAN-136577
   {
       struct brcmf_bus *bus_if = dev_get_drvdata(dev);
       struct brcmf_pub *drvr = bus_if->drvr;
-@@ -1358,10 +1358,13 @@ int brcmf_attach(struct device *dev)
+@@ -1363,10 +1363,13 @@ int brcmf_attach(struct device *dev)
       brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
                   brcmf_psm_watchdog_notify);

@@ -205,7 +205,7 @@ JIRA: SWWLAN-136577
                       void *data);
  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -2207,7 +2207,7 @@ static void brcmf_pcie_setup(struct devi
+@@ -2210,7 +2210,7 @@ static void brcmf_pcie_setup(struct devi

       init_waitqueue_head(&devinfo->mbdata_resp_wait);

@@ -482,7 +482,7 @@ JIRA: SWWLAN-136577
       bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
       if (sdiodev->sg_support) {
           bus->txglom = false;
-@@ -4215,7 +4413,7 @@ static void brcmf_sdio_firmware_callback
+@@ -4217,7 +4415,7 @@ static void brcmf_sdio_firmware_callback
       u8 saveclk, bpreq;
       u8 devctl;

@@ -491,7 +491,7 @@ JIRA: SWWLAN-136577

       if (err)
           goto fail;
-@@ -4392,12 +4590,25 @@ static void brcmf_sdio_firmware_callback
+@@ -4394,12 +4592,25 @@ static void brcmf_sdio_firmware_callback
       }

       /* Attach to the common layer, reserve hdr space */
@@ -518,7 +518,7 @@ JIRA: SWWLAN-136577
       /* ready */
       return;

-@@ -4640,3 +4851,40 @@ int brcmf_sdio_sleep(struct brcmf_sdio *
+@@ -4646,3 +4857,40 @@ int brcmf_sdio_sleep(struct brcmf_sdio *

       return ret;
   }
@@ -701,7 +701,7 @@ JIRA: SWWLAN-136577
       if (ret)
           goto error;

-@@ -1277,7 +1277,7 @@ static int brcmf_usb_probe_cb(struct brc
+@@ -1280,7 +1280,7 @@ static int brcmf_usb_probe_cb(struct brc
           ret = brcmf_alloc(devinfo->dev, devinfo->settings);
           if (ret)
               goto fail;
diff --git 
a/package/kernel/mac80211/patches/brcm/870-05-rpi-6.12-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch 
b/package/kernel/mac80211/patches/brcm/870-05-rpi-6.12-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch
index 080ce2bb865709..285eb99fac1eee 100644
--- 
a/package/kernel/mac80211/patches/brcm/870-05-rpi-6.12-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch
+++ 
b/package/kernel/mac80211/patches/brcm/870-05-rpi-6.12-brcmfmac-Fix-interoperating-DPP-and-other-encryption.patch
@@ -25,7 +25,7 @@ Signed-off-by: Chi-hsien Lin <chi-hsien.lin at cypress.com>

  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -2491,43 +2491,50 @@ brcmf_cfg80211_connect(struct wiphy *wip
+@@ -2495,43 +2495,50 @@ brcmf_cfg80211_connect(struct wiphy *wip
           goto done;
       }

diff --git 
a/package/kernel/mac80211/patches/brcm/871-brcmfmac-disable-dump_survey-on-bcm2835.patch 
b/package/kernel/mac80211/patches/brcm/871-brcmfmac-disable-dump_survey-on-bcm2835.patch
index 0dd0d11c18a96a..be9e39e71af161 100644
--- 
a/package/kernel/mac80211/patches/brcm/871-brcmfmac-disable-dump_survey-on-bcm2835.patch
+++ 
b/package/kernel/mac80211/patches/brcm/871-brcmfmac-disable-dump_survey-on-bcm2835.patch
@@ -9,7 +9,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>

  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
-@@ -7991,6 +7991,7 @@ static s32 brcmf_translate_country_code(
+@@ -7994,6 +7994,7 @@ static s32 brcmf_translate_country_code(
       return 0;
   }

@@ -17,7 +17,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
   static int
   brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
   {
-@@ -8213,6 +8214,7 @@ exit:
+@@ -8216,6 +8217,7 @@ exit:
           brcmf_set_mpc(ifp, 1);
       return err;
   }
@@ -25,7 +25,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>

   static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
                       struct regulatory_request *req)
-@@ -8379,8 +8381,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
+@@ -8382,8 +8384,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
       if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
           ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
   #endif
diff --git 
a/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch 
b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
index f4dc5508b11527..52060f434b6a1f 100644
--- 
a/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
+++ 
b/package/kernel/mac80211/patches/build/100-backports-drop-QRTR-and-MHI.patch
@@ -59,7 +59,7 @@ Signed-off-by: Robert Marko <robimarko at gmail.com>
         This module adds support for PCIE bus
  --- a/local-symbols
  +++ b/local-symbols
-@@ -59,14 +59,6 @@ MAC80211_MESH_PS_DEBUG=
+@@ -53,14 +53,6 @@ MAC80211_MESH_PS_DEBUG=
   MAC80211_TDLS_DEBUG=
   MAC80211_DEBUG_COUNTERS=
   MAC80211_STA_HASH_MAX_SIZE=
diff --git 
a/package/kernel/mac80211/patches/build/210-wireless_netns_local_backport.patch 
b/package/kernel/mac80211/patches/build/210-wireless_netns_local_backport.patch
index 9b0e95e8453c0a..031cc183ca2f12 100644
--- 
a/package/kernel/mac80211/patches/build/210-wireless_netns_local_backport.patch
+++ 
b/package/kernel/mac80211/patches/build/210-wireless_netns_local_backport.patch
@@ -1,6 +1,6 @@
  --- a/net/wireless/core.c
  +++ b/net/wireless/core.c
-@@ -165,11 +165,15 @@ int cfg80211_switch_netns(struct cfg8021
+@@ -162,11 +162,15 @@ int cfg80211_switch_netns(struct cfg8021
       list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
           if (!wdev->netdev)
               continue;
@@ -16,7 +16,7 @@
       }

       if (err) {
-@@ -181,11 +185,15 @@ int cfg80211_switch_netns(struct cfg8021
+@@ -178,11 +182,15 @@ int cfg80211_switch_netns(struct cfg8021
                                list) {
               if (!wdev->netdev)
                   continue;
@@ -32,7 +32,7 @@
           }

           return err;
-@@ -1518,7 +1526,9 @@ static int cfg80211_netdev_notifier_call
+@@ -1520,7 +1528,9 @@ static int cfg80211_netdev_notifier_call
           SET_NETDEV_DEVTYPE(dev, &wiphy_type);
           wdev->netdev = dev;
           /* can only change netns with wiphy */
diff --git 
a/package/kernel/mac80211/patches/build/220-brcmfmac_usb_driver_backport.patch 
b/package/kernel/mac80211/patches/build/220-brcmfmac_usb_driver_backport.patch
index 25dab46905428b..f769a1d326385b 100644
--- 
a/package/kernel/mac80211/patches/build/220-brcmfmac_usb_driver_backport.patch
+++ 
b/package/kernel/mac80211/patches/build/220-brcmfmac_usb_driver_backport.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
  +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
-@@ -1574,7 +1574,11 @@ static int brcmf_usb_reset_device(struct
+@@ -1577,7 +1577,11 @@ static int brcmf_usb_reset_device(struct

   void brcmf_usb_exit(void)
   {
diff --git 
a/package/kernel/mac80211/patches/build/230-fix-init_vqs-build-error-on-kernel-6.6.patch 
b/package/kernel/mac80211/patches/build/230-fix-init_vqs-build-error-on-kernel-6.6.patch
index 4b0fe6003f6692..d12835d2d67aea 100644
--- 
a/package/kernel/mac80211/patches/build/230-fix-init_vqs-build-error-on-kernel-6.6.patch
+++ 
b/package/kernel/mac80211/patches/build/230-fix-init_vqs-build-error-on-kernel-6.6.patch
@@ -1,6 +1,6 @@
  --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
  +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
-@@ -6629,6 +6629,7 @@ static void hwsim_virtio_rx_done(struct
+@@ -6668,6 +6668,7 @@ static void hwsim_virtio_rx_done(struct

   static int init_vqs(struct virtio_device *vdev)
   {
@@ -8,7 +8,7 @@
       struct virtqueue_info vqs_info[HWSIM_NUM_VQS] = {
           [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
           [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
-@@ -6636,6 +6637,19 @@ static int init_vqs(struct virtio_device
+@@ -6675,6 +6676,19 @@ static int init_vqs(struct virtio_device

       return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
                      hwsim_vqs, vqs_info, NULL);
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
index 93a213265c641c..1a3be12de0c734 100644
--- 
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
@@ -152,7 +152,7 @@ Signed-off-by: Pali Rohár <pali at kernel.org>

  --- a/drivers/net/wireless/marvell/mwifiex/main.h
  +++ b/drivers/net/wireless/marvell/mwifiex/main.h
-@@ -1100,6 +1100,8 @@ void mwifiex_cancel_all_pending_cmd(stru
+@@ -1096,6 +1096,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);

diff --git 
a/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch 
b/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
index cc3aa56618555c..957da81d054fd1 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/602-01-wifi-rt2x00-Add-support-for-loading-EEPROM-from-user.patch
@@ -21,7 +21,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>

  --- a/local-symbols
  +++ b/local-symbols
-@@ -339,6 +339,7 @@ RT2X00_LIB_FIRMWARE=
+@@ -334,6 +334,7 @@ RT2X00_LIB_FIRMWARE=
   RT2X00_LIB_CRYPTO=
   RT2X00_LIB_LEDS=
   RT2X00_LIB_DEBUGFS=
diff --git 
a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch 
b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
index de2cf2dca73125..db5ceb47a62410 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
@@ -30,4 +30,4 @@ Signed-off-by: John Crispin <blogic at openwrt.org>
  +        .of_match_table    = rt2880_wmac_match,
       },
       .probe        = rt2800soc_probe,
-     .remove        = rt2x00soc_remove,
+ #if LINUX_VERSION_IS_GEQ(6,13,0)
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 4a819039da0b26..3adf74faa2d1a6 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch
@@ -8,7 +8,7 @@

   #include "rt2x00.h"
   #include "rt2800lib.h"
-@@ -11282,6 +11283,17 @@ static int rt2800_init_eeprom(struct rt2
+@@ -11276,6 +11277,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/620-01-rt2x00-respect-rt2800-hardware-TX-queue-index.patch 
b/package/kernel/mac80211/patches/rt2x00/620-01-rt2x00-respect-rt2800-hardware-TX-queue-index.patch
index e2c75979dfec2a..1d88ac7c60c453 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/620-01-rt2x00-respect-rt2800-hardware-TX-queue-index.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/620-01-rt2x00-respect-rt2800-hardware-TX-queue-index.patch
@@ -114,7 +114,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
           queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);

           if (unlikely(rt2x00queue_empty(queue))) {
-@@ -12188,8 +12197,9 @@ int rt2800_conf_tx(struct ieee80211_hw *
+@@ -12182,8 +12191,9 @@ int rt2800_conf_tx(struct ieee80211_hw *
       queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);

       /* Update WMM TXOP register */
@@ -126,7 +126,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
       field.bit_mask = 0xffff << field.bit_offset;

       reg = rt2800_register_read(rt2x00dev, offset);
-@@ -12197,7 +12207,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
+@@ -12191,7 +12201,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
       rt2800_register_write(rt2x00dev, offset, reg);

       /* Update WMM registers */
@@ -135,7 +135,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
       field.bit_mask = 0xf << field.bit_offset;

       reg = rt2800_register_read(rt2x00dev, WMM_AIFSN_CFG);
-@@ -12213,7 +12223,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
+@@ -12207,7 +12217,7 @@ int rt2800_conf_tx(struct ieee80211_hw *
       rt2800_register_write(rt2x00dev, WMM_CWMAX_CFG, reg);

       /* Update EDCA registers */
diff --git 
a/package/kernel/mac80211/patches/rt2x00/621-01-rt2x00-always-calibrate-MT7620-when-switching-channe.patch 
b/package/kernel/mac80211/patches/rt2x00/621-01-rt2x00-always-calibrate-MT7620-when-switching-channe.patch
index e66fbd43694cae..01ae04e6e21c6c 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/621-01-rt2x00-always-calibrate-MT7620-when-switching-channe.patch
+++ 
b/package/kernel/mac80211/patches/rt2x00/621-01-rt2x00-always-calibrate-MT7620-when-switching-channe.patch
@@ -42,7 +42,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
       }
       if (flags & IEEE80211_CONF_CHANGE_POWER)
           rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
-@@ -10427,15 +10438,19 @@ static void rt2800_restore_rf_bbp_rt6352
+@@ -10421,15 +10432,19 @@ static void rt2800_restore_rf_bbp_rt6352
       }
   }

@@ -65,7 +65,7 @@ Signed-off-by: Shiji Yang <yangshiji66 at outlook.com>
       rt2800_rf_self_txdc_cal(rt2x00dev);
       rt2800_rxdcoc_calibration(rt2x00dev);
       rt2800_bw_filter_calibration(rt2x00dev, true);
-@@ -10766,9 +10781,6 @@ static void rt2800_init_rfcsr_6352(struc
+@@ -10760,9 +10775,6 @@ 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/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
index a92de135948ee5..7b63c7ab5f2f21 100644
--- 
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
@@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle <daniel at makrotopia.org>
   static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
       [EEPROM_CHIP_ID]        = 0x0000,
       [EEPROM_VERSION]        = 0x0001,
-@@ -10428,8 +10446,10 @@ static void rt2800_restore_rf_bbp_rt6352
+@@ -10422,8 +10440,10 @@ static void rt2800_restore_rf_bbp_rt6352
   static void rt2800_calibration_rt6352_stage1(struct rt2x00_dev 
*rt2x00dev)
   {
       if (rt2x00_has_cap_external_pa(rt2x00dev) ||
@@ -64,7 +64,7 @@ Signed-off-by: Daniel Golle <daniel at makrotopia.org>

       rt2800_r_calibration(rt2x00dev);
   }
-@@ -10453,6 +10473,8 @@ static void rt2800_calibration_rt6352_st
+@@ -10447,6 +10467,8 @@ static void rt2800_calibration_rt6352_st
           !rt2x00_has_cap_external_lna_bg(rt2x00dev))
           return;

diff --git 
a/package/kernel/mac80211/patches/rt2x00/996-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
index eb0237a389381e..0b2e7313dd7c44 100644
--- 
a/package/kernel/mac80211/patches/rt2x00/996-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
@@ -203,7 +203,7 @@

       /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
       rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
-@@ -10404,6 +10434,9 @@ static void rt2800_restore_rf_bbp_rt6352
+@@ -10398,6 +10428,9 @@ static void rt2800_restore_rf_bbp_rt6352
           rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0);
       }

@@ -213,7 +213,7 @@
       if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
           rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16);
           rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23);
-@@ -10485,6 +10518,9 @@ static void rt2800_calibration_rt6352_st
+@@ -10479,6 +10512,9 @@ static void rt2800_calibration_rt6352_st
           rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
       }

@@ -223,7 +223,7 @@
       if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
           rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
           rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
-@@ -10575,31 +10611,36 @@ static void rt2800_init_rfcsr_6352(struc
+@@ -10569,31 +10605,36 @@ static void rt2800_init_rfcsr_6352(struc
       rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
       rt2800_rfcsr_write(rt2x00dev, 43, 0x00);

@@ -285,7 +285,7 @@

       /* Initialize RF channel register to default value */
       rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
-@@ -10665,63 +10706,71 @@ static void rt2800_init_rfcsr_6352(struc
+@@ -10659,63 +10700,71 @@ static void rt2800_init_rfcsr_6352(struc

       rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);

@@ -412,7 +412,7 @@

       /* Initialize RF DC calibration register to default value */
       rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
-@@ -10784,12 +10833,17 @@ static void rt2800_init_rfcsr_6352(struc
+@@ -10778,12 +10827,17 @@ static void rt2800_init_rfcsr_6352(struc
       rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
       rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);

diff --git 
a/package/kernel/mac80211/patches/rtl/071-v6.14.9-wifi-rtw88-Extend-rtw_fw_send_ra_info-for-RTL8814AU.patch 
b/package/kernel/mac80211/patches/rtl/071-v6.14.9-wifi-rtw88-Extend-rtw_fw_send_ra_info-for-RTL8814AU.patch
index 9366a54cb5b6e0..eb7d43f32ca0b0 100644
--- 
a/package/kernel/mac80211/patches/rtl/071-v6.14.9-wifi-rtw88-Extend-rtw_fw_send_ra_info-for-RTL8814AU.patch
+++ 
b/package/kernel/mac80211/patches/rtl/071-v6.14.9-wifi-rtw88-Extend-rtw_fw_send_ra_info-for-RTL8814AU.patch
@@ -19,7 +19,7 @@ Link: 
https://patch.msgid.link/08e2f328-1aab-4e50-93ac-c1e5dd9541ac@gmail.com

  --- a/drivers/net/wireless/realtek/rtw88/fw.c
  +++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -736,6 +736,7 @@ void rtw_fw_send_ra_info(struct rtw_dev
+@@ -735,6 +735,7 @@ void rtw_fw_send_ra_info(struct rtw_dev
   {
       u8 h2c_pkt[H2C_PKT_SIZE] = {0};
       bool disable_pt = true;
@@ -27,7 +27,7 @@ Link: 
https://patch.msgid.link/08e2f328-1aab-4e50-93ac-c1e5dd9541ac@gmail.com

       SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO);

-@@ -756,6 +757,20 @@ void rtw_fw_send_ra_info(struct rtw_dev
+@@ -755,6 +756,20 @@ void rtw_fw_send_ra_info(struct rtw_dev
       si->init_ra_lv = 0;

       rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
diff --git 
a/package/kernel/mac80211/patches/rtl/072-v6.15-wifi-rtw88-Constify-some-more-structs-and-arrays.patch 
b/package/kernel/mac80211/patches/rtl/072-v6.15-wifi-rtw88-Constify-some-more-structs-and-arrays.patch
index 6d3b4e61f9b12e..fe16a7ec2025cf 100644
--- 
a/package/kernel/mac80211/patches/rtl/072-v6.15-wifi-rtw88-Constify-some-more-structs-and-arrays.patch
+++ 
b/package/kernel/mac80211/patches/rtl/072-v6.15-wifi-rtw88-Constify-some-more-structs-and-arrays.patch
@@ -202,7 +202,7 @@ Link: 
https://patch.msgid.link/502f124e-ccf3-4c09-80a4-1e5c5304822b@gmail.com
       .setup = rtw_sdio_setup,
  --- a/drivers/net/wireless/realtek/rtw88/usb.c
  +++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -844,7 +844,7 @@ static void rtw_usb_dynamic_rx_agg(struc
+@@ -881,7 +881,7 @@ static void rtw_usb_dynamic_rx_agg(struc
       }
   }

diff --git 
a/package/kernel/mac80211/patches/rtl/094-v6.16-wifi-rtw88-usb-Remove-redundant-flush_workqueue-call.patch 
b/package/kernel/mac80211/patches/rtl/094-v6.16-wifi-rtw88-usb-Remove-redundant-flush_workqueue-call.patch
index 41e670fd11513f..f819b8d9552f0c 100644
--- 
a/package/kernel/mac80211/patches/rtl/094-v6.16-wifi-rtw88-usb-Remove-redundant-flush_workqueue-call.patch
+++ 
b/package/kernel/mac80211/patches/rtl/094-v6.16-wifi-rtw88-usb-Remove-redundant-flush_workqueue-call.patch
@@ -26,15 +26,15 @@ Link: 
https://patch.msgid.link/20250324080303.408084-1-nichen@iscas.ac.cn

  --- a/drivers/net/wireless/realtek/rtw88/usb.c
  +++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -901,7 +901,6 @@ static void rtw_usb_deinit_rx(struct rtw
+@@ -952,7 +952,6 @@ static void rtw_usb_deinit_rx(struct rtw

       skb_queue_purge(&rtwusb->rx_queue);

  -    flush_workqueue(rtwusb->rxwq);
       destroy_workqueue(rtwusb->rxwq);
- }

-@@ -928,7 +927,6 @@ static void rtw_usb_deinit_tx(struct rtw
+     skb_queue_purge(&rtwusb->rx_free_queue);
+@@ -981,7 +980,6 @@ static void rtw_usb_deinit_tx(struct rtw
   {
       struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);

diff --git 
a/package/kernel/mac80211/patches/rtl/095-v6.16-wifi-rtw88-usb-Enable-switching-the-RTL8814AU-to-USB.patch 
b/package/kernel/mac80211/patches/rtl/095-v6.16-wifi-rtw88-usb-Enable-switching-the-RTL8814AU-to-USB.patch
index edd3cd5e704bff..f4d79bdae3c80b 100644
--- 
a/package/kernel/mac80211/patches/rtl/095-v6.16-wifi-rtw88-usb-Enable-switching-the-RTL8814AU-to-USB.patch
+++ 
b/package/kernel/mac80211/patches/rtl/095-v6.16-wifi-rtw88-usb-Enable-switching-the-RTL8814AU-to-USB.patch
@@ -20,7 +20,7 @@ Link: 
https://patch.msgid.link/d3608f70-e04f-4f6b-987a-022c8e317165@gmail.com

  --- a/drivers/net/wireless/realtek/rtw88/usb.c
  +++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -1043,7 +1043,8 @@ static int rtw_usb_switch_mode_new(struc
+@@ -1096,7 +1096,8 @@ static int rtw_usb_switch_mode_new(struc

   static bool rtw_usb3_chip_old(u8 chip_id)
   {
diff --git 
a/package/kernel/mac80211/patches/rtl/096-v6.16-wifi-rtw88-usb-Enable-RX-aggregation-for-RTL8814AU.patch 
b/package/kernel/mac80211/patches/rtl/096-v6.16-wifi-rtw88-usb-Enable-RX-aggregation-for-RTL8814AU.patch
index 9709528e701fee..ef5c3db77a0421 100644
--- 
a/package/kernel/mac80211/patches/rtl/096-v6.16-wifi-rtw88-usb-Enable-RX-aggregation-for-RTL8814AU.patch
+++ 
b/package/kernel/mac80211/patches/rtl/096-v6.16-wifi-rtw88-usb-Enable-RX-aggregation-for-RTL8814AU.patch
@@ -18,7 +18,7 @@ Link: 
https://patch.msgid.link/672397ac-dd4d-4420-8b3e-7011578e2243@gmail.com

  --- a/drivers/net/wireless/realtek/rtw88/usb.c
  +++ b/drivers/net/wireless/realtek/rtw88/usb.c
-@@ -829,6 +829,7 @@ static void rtw_usb_dynamic_rx_agg(struc
+@@ -866,6 +866,7 @@ static void rtw_usb_dynamic_rx_agg(struc
       case RTW_CHIP_TYPE_8822C:
       case RTW_CHIP_TYPE_8822B:
       case RTW_CHIP_TYPE_8821C:
diff --git 
a/package/kernel/mac80211/patches/rtl/107-v6.16-wifi-rtw88-usb-Upload-the-firmware-in-bigger-chunks.patch 
b/package/kernel/mac80211/patches/rtl/107-v6.16-wifi-rtw88-usb-Upload-the-firmware-in-bigger-chunks.patch
index 8031e46556d36a..d3d660edb9cac3 100644
--- 
a/package/kernel/mac80211/patches/rtl/107-v6.16-wifi-rtw88-usb-Upload-the-firmware-in-bigger-chunks.patch
+++ 
b/package/kernel/mac80211/patches/rtl/107-v6.16-wifi-rtw88-usb-Upload-the-firmware-in-bigger-chunks.patch
@@ -204,7 +204,7 @@ Link: 
https://patch.msgid.link/43f1daad-3ec0-4a3b-a50c-9cd9eb2c2f52@gmail.com
   static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping)
   {
       switch (dma_mapping) {
-@@ -855,6 +909,7 @@ static const struct rtw_hci_ops rtw_usb_
+@@ -892,6 +946,7 @@ static const struct rtw_hci_ops rtw_usb_
       .link_ps = rtw_usb_link_ps,
       .interface_cfg = rtw_usb_interface_cfg,
       .dynamic_rx_agg = rtw_usb_dynamic_rx_agg,
diff --git 
a/package/kernel/mac80211/patches/rtl/108-v6.16-wifi-rtw88-Fix-the-random-error-beacon-valid-message.patch 
b/package/kernel/mac80211/patches/rtl/108-v6.16-wifi-rtw88-Fix-the-random-error-beacon-valid-message.patch
index 8008b58ff4d400..adf585e004f31a 100644
--- 
a/package/kernel/mac80211/patches/rtl/108-v6.16-wifi-rtw88-Fix-the-random-error-beacon-valid-message.patch
+++ 
b/package/kernel/mac80211/patches/rtl/108-v6.16-wifi-rtw88-Fix-the-random-error-beacon-valid-message.patch
@@ -35,7 +35,7 @@ Link: 
https://patch.msgid.link/c248c40a-d432-47ed-90e0-d81ee6c32464@gmail.com

  --- a/drivers/net/wireless/realtek/rtw88/fw.c
  +++ b/drivers/net/wireless/realtek/rtw88/fw.c
-@@ -1467,7 +1467,7 @@ void rtw_add_rsvd_page_sta(struct rtw_de
+@@ -1466,7 +1466,7 @@ void rtw_add_rsvd_page_sta(struct rtw_de
   int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
                   u8 *buf, u32 size)
   {
@@ -44,7 +44,7 @@ Link: 
https://patch.msgid.link/c248c40a-d432-47ed-90e0-d81ee6c32464@gmail.com
       u8 val;
       u16 rsvd_pg_head;
       u32 bcn_valid_addr;
-@@ -1479,6 +1479,8 @@ int rtw_fw_write_data_rsvd_page(struct r
+@@ -1478,6 +1478,8 @@ int rtw_fw_write_data_rsvd_page(struct r
       if (!size)
           return -EINVAL;

@@ -53,7 +53,7 @@ Link: 
https://patch.msgid.link/c248c40a-d432-47ed-90e0-d81ee6c32464@gmail.com
       if (rtw_chip_wcpu_11n(rtwdev)) {
           rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID);
       } else {
-@@ -1492,6 +1494,9 @@ int rtw_fw_write_data_rsvd_page(struct r
+@@ -1491,6 +1493,9 @@ int rtw_fw_write_data_rsvd_page(struct r
       val |= BIT_ENSWBCN >> 8;
       rtw_write8(rtwdev, REG_CR + 1, val);

@@ -63,7 +63,7 @@ Link: 
https://patch.msgid.link/c248c40a-d432-47ed-90e0-d81ee6c32464@gmail.com
       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) {
           val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);
           bckp[1] = val;
-@@ -1522,6 +1527,7 @@ restore:
+@@ -1521,6 +1526,7 @@ restore:
       rsvd_pg_head = rtwdev->fifo.rsvd_boundary;
       rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2,
               rsvd_pg_head | BIT_BCN_VALID_V1);
diff --git 
a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch 
b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
index 68534f4e7b40e1..5e8b97d18dd5ff 100644
--- 
a/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
+++ 
b/package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
@@ -9,9 +9,9 @@ Used for AP+STA support in OpenWrt - preserve AP mode 
keys across STA reconnect

  --- a/net/mac80211/cfg.c
  +++ b/net/mac80211/cfg.c
-@@ -1649,12 +1649,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1678,12 +1678,6 @@ static int ieee80211_stop_ap(struct wiph

-     __sta_info_flush(sdata, true, link_id);
+     __sta_info_flush(sdata, true, link_id, NULL);

  -    ieee80211_remove_link_keys(link, &keys);
  -    if (!list_empty(&keys)) {
diff --git 
a/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch 
b/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
index c9496b5e709cd3..7433f52fc589de 100644
--- a/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
+++ b/package/kernel/mac80211/patches/subsys/130-disable_auto_vif.patch
@@ -1,6 +1,6 @@
  --- a/net/mac80211/main.c
  +++ b/net/mac80211/main.c
-@@ -1583,24 +1583,6 @@ int ieee80211_register_hw(struct ieee802
+@@ -1593,24 +1593,6 @@ int ieee80211_register_hw(struct ieee802

       ieee80211_check_wbrf_support(local);

diff --git a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch 
b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
index ca4ac8adb626a3..8f8d4ab818bc85 100644
--- a/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
+++ b/package/kernel/mac80211/patches/subsys/210-ap_scan.patch
@@ -8,7 +8,7 @@ Subject: [PATCH] mac80211: allow scans in access point 
mode (for site survey)

  --- a/net/mac80211/cfg.c
  +++ b/net/mac80211/cfg.c
-@@ -2863,6 +2863,8 @@ static int ieee80211_scan(struct wiphy *
+@@ -2892,6 +2892,8 @@ static int ieee80211_scan(struct wiphy *
            */
           fallthrough;
       case NL80211_IFTYPE_AP:
diff --git 
a/package/kernel/mac80211/patches/subsys/220-allow-ibss-mixed.patch 
b/package/kernel/mac80211/patches/subsys/220-allow-ibss-mixed.patch
index 378ca275f5ba80..ea8fb0c6b31400 100644
--- a/package/kernel/mac80211/patches/subsys/220-allow-ibss-mixed.patch
+++ b/package/kernel/mac80211/patches/subsys/220-allow-ibss-mixed.patch
@@ -16,7 +16,7 @@ and we should ignore this.

  --- a/net/wireless/core.c
  +++ b/net/wireless/core.c
-@@ -678,21 +678,6 @@ int wiphy_verify_iface_combinations(stru
+@@ -671,21 +671,6 @@ int wiphy_verify_iface_combinations(stru
                       c->limits[j].max > 1))
                   return -EINVAL;

diff --git 
a/package/kernel/mac80211/patches/subsys/230-avoid-crashing-missing-band.patch 
b/package/kernel/mac80211/patches/subsys/230-avoid-crashing-missing-band.patch
index 9e9e3844b7ac5b..e85207cb6bb376 100644
--- 
a/package/kernel/mac80211/patches/subsys/230-avoid-crashing-missing-band.patch
+++ 
b/package/kernel/mac80211/patches/subsys/230-avoid-crashing-missing-band.patch
@@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail at david-bauer.net>

  --- a/net/mac80211/sta_info.c
  +++ b/net/mac80211/sta_info.c
-@@ -2439,6 +2439,13 @@ static void sta_stats_decode_rate(struct
+@@ -2474,6 +2474,13 @@ static void sta_stats_decode_rate(struct

           sband = local->hw.wiphy->bands[band];

diff --git 
a/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch 
b/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
index edec97cce94022..f7690c89c75da5 100644
--- 
a/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
+++ 
b/package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
@@ -28,7 +28,7 @@ Signed-off-by: Johannes Berg <johannes.berg at intel.com>

  --- a/net/mac80211/sta_info.c
  +++ b/net/mac80211/sta_info.c
-@@ -565,6 +565,7 @@ __sta_info_alloc(struct ieee80211_sub_if
+@@ -583,6 +583,7 @@ __sta_info_alloc(struct ieee80211_sub_if
       spin_lock_init(&sta->ps_lock);
       INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
       wiphy_work_init(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
diff --git 
a/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch 
b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
index 6cf46ce7e51459..d329ad7b6fa1e3 100644
--- 
a/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
+++ 
b/package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
@@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/net/mac80211/tx.c
  +++ b/net/mac80211/tx.c
-@@ -4081,7 +4081,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4083,7 +4083,7 @@ struct ieee80211_txq *ieee80211_next_txq

           if (deficit < 0)
               sta->airtime[txqi->txq.ac].deficit +=
@@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

           if (deficit < 0 || !aql_check) {
               list_move_tail(&txqi->schedule_order,
-@@ -4224,7 +4224,8 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4226,7 +4226,8 @@ bool ieee80211_txq_may_transmit(struct i
           }
           sta = container_of(iter->txq.sta, struct sta_info, sta);
           if (ieee80211_sta_deficit(sta, ac) < 0)
@@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
           list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
       }

-@@ -4232,7 +4233,7 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4234,7 +4235,7 @@ bool ieee80211_txq_may_transmit(struct i
       if (sta->airtime[ac].deficit >= 0)
           goto out;

diff --git 
a/package/kernel/mac80211/patches/subsys/320-mac80211-add-AQL-support-for-broadcast-packets.patch 
b/package/kernel/mac80211/patches/subsys/320-mac80211-add-AQL-support-for-broadcast-packets.patch
index 9513dc14bc34da..e5f44e8858f2a2 100644
--- 
a/package/kernel/mac80211/patches/subsys/320-mac80211-add-AQL-support-for-broadcast-packets.patch
+++ 
b/package/kernel/mac80211/patches/subsys/320-mac80211-add-AQL-support-for-broadcast-packets.patch
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/include/net/cfg80211.h
  +++ b/include/net/cfg80211.h
-@@ -3423,6 +3423,7 @@ enum wiphy_params_flags {
+@@ -3435,6 +3435,7 @@ enum wiphy_params_flags {
   /* The per TXQ device queue limit in airtime */
   #define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_L    5000
   #define IEEE80211_DEFAULT_AQL_TXQ_LIMIT_H    12000
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

  --- a/net/mac80211/ieee80211_i.h
  +++ b/net/mac80211/ieee80211_i.h
-@@ -1351,10 +1351,12 @@ struct ieee80211_local {
+@@ -1362,10 +1362,12 @@ struct ieee80211_local {
       spinlock_t handle_wake_tx_queue_lock;

       u16 airtime_flags;
@@ -85,7 +85,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
       const struct ieee80211_ops *ops;
  --- a/net/mac80211/main.c
  +++ b/net/mac80211/main.c
-@@ -954,6 +954,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -959,6 +959,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
       spin_lock_init(&local->rx_path_lock);
       spin_lock_init(&local->queue_stop_reason_lock);

@@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
           spin_lock_init(&local->active_txq_lock[i]);
  --- a/net/mac80211/sta_info.c
  +++ b/net/mac80211/sta_info.c
-@@ -2353,13 +2353,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre
+@@ -2388,13 +2388,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre

   void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local,
                         struct sta_info *sta, u8 ac,
@@ -127,7 +127,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
               atomic_add(tx_airtime,
  --- a/net/mac80211/tx.c
  +++ b/net/mac80211/tx.c
-@@ -2554,7 +2554,7 @@ static u16 ieee80211_store_ack_skb(struc
+@@ -2555,7 +2555,7 @@ static u16 ieee80211_store_ack_skb(struc

           spin_lock_irqsave(&local->ack_status_lock, flags);
           id = idr_alloc(&local->ack_status_frames, ack_skb,
@@ -136,7 +136,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
           spin_unlock_irqrestore(&local->ack_status_lock, flags);

           if (id >= 0) {
-@@ -3982,20 +3982,20 @@ begin:
+@@ -3984,20 +3984,20 @@ begin:
   encap_out:
       info->control.vif = vif;

@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
       }

       return skb;
-@@ -4047,6 +4047,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4049,6 +4049,7 @@ struct ieee80211_txq *ieee80211_next_txq
       struct ieee80211_txq *ret = NULL;
       struct txq_info *txqi = NULL, *head = NULL;
       bool found_eligible_txq = false;
@@ -175,7 +175,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

       spin_lock_bh(&local->active_txq_lock[ac]);

-@@ -4070,26 +4071,26 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4072,26 +4073,26 @@ struct ieee80211_txq *ieee80211_next_txq
       if (!head)
           head = txqi;

@@ -214,7 +214,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
       if (txqi->schedule_round == local->schedule_round[ac])
           goto out;

-@@ -4154,7 +4155,8 @@ bool ieee80211_txq_airtime_check(struct
+@@ -4156,7 +4157,8 @@ bool ieee80211_txq_airtime_check(struct
           return true;

       if (!txq->sta)
@@ -224,7 +224,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>

       if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
           return true;
-@@ -4203,15 +4205,15 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4205,15 +4207,15 @@ bool ieee80211_txq_may_transmit(struct i

       spin_lock_bh(&local->active_txq_lock[ac]);

@@ -245,7 +245,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
           if (iter == txqi)
  --- a/include/net/mac80211.h
  +++ b/include/net/mac80211.h
-@@ -1222,8 +1222,8 @@ struct ieee80211_tx_info {
+@@ -1237,8 +1237,8 @@ struct ieee80211_tx_info {
           status_data_idr:1,
           status_data:13,
           hw_queue:4,
@@ -278,7 +278,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
           rcu_read_unlock();
       }

-@@ -1158,10 +1158,11 @@ void ieee80211_tx_status_ext(struct ieee
+@@ -1161,10 +1161,11 @@ void ieee80211_tx_status_ext(struct ieee
           /* Do this here to avoid the expensive lookup of the sta
            * in ieee80211_report_used_skb().
            */
diff --git 
a/package/kernel/mac80211/patches/subsys/350-mac80211-allow-scanning-while-on-radar-channel.patch 
b/package/kernel/mac80211/patches/subsys/350-mac80211-allow-scanning-while-on-radar-channel.patch
index d469955a9002dd..dd297af9c1d855 100644
--- 
a/package/kernel/mac80211/patches/subsys/350-mac80211-allow-scanning-while-on-radar-channel.patch
+++ 
b/package/kernel/mac80211/patches/subsys/350-mac80211-allow-scanning-while-on-radar-channel.patch
@@ -1,6 +1,6 @@
  --- a/net/mac80211/cfg.c
  +++ b/net/mac80211/cfg.c
-@@ -3473,6 +3473,27 @@ static int ieee80211_set_bitrate_mask(st
+@@ -3526,6 +3526,27 @@ static int ieee80211_set_bitrate_mask(st
       return 0;
   }

@@ -28,7 +28,7 @@
   static int ieee80211_start_radar_detection(struct wiphy *wiphy,
                          struct net_device *dev,
                          struct cfg80211_chan_def *chandef,
-@@ -3486,7 +3507,7 @@ static int ieee80211_start_radar_detecti
+@@ -3539,7 +3560,7 @@ static int ieee80211_start_radar_detecti

       lockdep_assert_wiphy(local->hw.wiphy);

@@ -37,7 +37,7 @@
           return -EBUSY;

       link_data = sdata_dereference(sdata->link[link_id], sdata);
-@@ -3978,7 +3999,7 @@ __ieee80211_channel_switch(struct wiphy
+@@ -4031,7 +4052,7 @@ __ieee80211_channel_switch(struct wiphy

       lockdep_assert_wiphy(local->hw.wiphy);

@@ -48,7 +48,7 @@
       if (sdata->wdev.links[link_id].cac_started)
  --- a/net/mac80211/chan.c
  +++ b/net/mac80211/chan.c
-@@ -629,14 +629,24 @@ ieee80211_find_chanctx(struct ieee80211_
+@@ -644,14 +644,24 @@ ieee80211_find_chanctx(struct ieee80211_
       return NULL;
   }

@@ -77,7 +77,7 @@

  --- a/net/mac80211/ieee80211_i.h
  +++ b/net/mac80211/ieee80211_i.h
-@@ -1947,6 +1947,12 @@ int ieee80211_mesh_finish_csa(struct iee
+@@ -1960,6 +1960,12 @@ int ieee80211_mesh_finish_csa(struct iee
                     u64 *changed);

   /* scan/BSS handling */
@@ -90,7 +90,7 @@
   void ieee80211_scan_work(struct wiphy *wiphy, struct wiphy_work *work);
   int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
                   const u8 *ssid, u8 ssid_len,
-@@ -1985,6 +1991,7 @@ void ieee80211_sched_scan_stopped_work(s
+@@ -1998,6 +2004,7 @@ void ieee80211_sched_scan_stopped_work(s
   /* off-channel/mgmt-tx */
   void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local);
   void ieee80211_offchannel_return(struct ieee80211_local *local);
@@ -98,7 +98,7 @@
   void ieee80211_roc_setup(struct ieee80211_local *local);
   void ieee80211_start_next_roc(struct ieee80211_local *local);
   void ieee80211_reconfig_roc(struct ieee80211_local *local);
-@@ -2629,6 +2636,8 @@ bool ieee80211_chandef_s1g_oper(const st
+@@ -2643,6 +2650,8 @@ bool ieee80211_chandef_s1g_oper(const st
                   struct cfg80211_chan_def *chandef);
   void ieee80211_chandef_downgrade(struct cfg80211_chan_def *chandef,
                    struct ieee80211_conn_settings *conn);
@@ -107,7 +107,7 @@
   static inline void
   ieee80211_chanreq_downgrade(struct ieee80211_chan_req *chanreq,
                   struct ieee80211_conn_settings *conn)
-@@ -2685,7 +2694,7 @@ void ieee80211_recalc_chanctx_min_def(st
+@@ -2699,7 +2708,7 @@ void ieee80211_recalc_chanctx_min_def(st
                         struct ieee80211_chanctx *ctx,
                         struct ieee80211_link_data *rsvd_for,
                         bool check_reserved);
@@ -334,9 +334,9 @@
           rcu_assign_pointer(local->scan_sdata, sdata);
  --- a/net/mac80211/util.c
  +++ b/net/mac80211/util.c
-@@ -3644,6 +3644,23 @@ again:
-     WARN_ON_ONCE(!cfg80211_chandef_valid(c));
+@@ -877,6 +877,23 @@ struct wireless_dev *ieee80211_vif_to_wd
   }
+ EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);

  +u32 ieee80211_chandef_radio_mask(struct ieee80211_local *local,
  +                 struct cfg80211_chan_def *chandef)
@@ -356,11 +356,11 @@
  +}
  +
   /*
-  * Returns true if smps_mode_new is strictly more restrictive than
-  * smps_mode_old.
+  * Nothing should have been stuffed into the workqueue during
+  * the suspend->resume cycle. Since we can't check each caller
  --- a/net/wireless/util.c
  +++ b/net/wireless/util.c
-@@ -2911,6 +2911,9 @@ bool cfg80211_radio_chandef_valid(const
+@@ -2907,6 +2907,9 @@ bool cfg80211_radio_chandef_valid(const
   {
       u32 freq, width;

diff --git 
a/package/kernel/mac80211/patches/subsys/400-v6.16-wifi-mac80211-do-not-offer-a-mesh-path-if-forwarding.patch 
b/package/kernel/mac80211/patches/subsys/400-v6.16-wifi-mac80211-do-not-offer-a-mesh-path-if-forwarding.patch
index 7c2c0b9f3fb2c0..71ae00e0162792 100644
--- 
a/package/kernel/mac80211/patches/subsys/400-v6.16-wifi-mac80211-do-not-offer-a-mesh-path-if-forwarding.patch
+++ 
b/package/kernel/mac80211/patches/subsys/400-v6.16-wifi-mac80211-do-not-offer-a-mesh-path-if-forwarding.patch
@@ -27,7 +27,7 @@ Reviewed-by: Rouven Czerwinski <rouven at czerwinskis.de>

  --- a/net/mac80211/mesh_hwmp.c
  +++ b/net/mac80211/mesh_hwmp.c
-@@ -630,7 +630,7 @@ static void hwmp_preq_frame_process(stru
+@@ -636,7 +636,7 @@ static void hwmp_preq_frame_process(stru
                   mesh_path_add_gate(mpath);
           }
           rcu_read_unlock();
@@ -36,7 +36,7 @@ Reviewed-by: Rouven Czerwinski <rouven at czerwinskis.de>
           rcu_read_lock();
           mpath = mesh_path_lookup(sdata, target_addr);
           if (mpath) {
-@@ -648,6 +648,8 @@ static void hwmp_preq_frame_process(stru
+@@ -654,6 +654,8 @@ static void hwmp_preq_frame_process(stru
               }
           }
           rcu_read_unlock();
@@ -45,7 +45,7 @@ Reviewed-by: Rouven Czerwinski <rouven at czerwinskis.de>
       }

       if (reply) {
-@@ -665,7 +667,7 @@ static void hwmp_preq_frame_process(stru
+@@ -671,7 +673,7 @@ static void hwmp_preq_frame_process(stru
           }
       }


 From ea4f586bff8f55a85d1f3f44be8cd2a3494031ef Mon Sep 17 00:00:00 2001
From: Mieczyslaw Nalewaj <namiltd at yahoo.com>
Date: Sun, 8 Jun 2025 18:57:07 +0200
Subject: [PATCH 14/14] mac80211: rtw88: change invalid patch name

Rename 091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
to 092-v6.15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch.

Signed-off-by: Mieczyslaw Nalewaj <namiltd at yahoo.com>
---
  ...15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch} | 0
  1 file changed, 0 insertions(+), 0 deletions(-)
  rename 
package/kernel/mac80211/patches/rtl/{091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch 
=> 092-v6.15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch} 
(100%)

diff --git 
a/package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch 
b/package/kernel/mac80211/patches/rtl/092-v6.15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
similarity index 100%
rename from 
package/kernel/mac80211/patches/rtl/091-v6.15wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch
rename to 
package/kernel/mac80211/patches/rtl/092-v6.15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch




More information about the openwrt-devel mailing list