[][MAC80211][misc][Add Filogic 880/860/830/820/630 Release Information]

[Description]
Add external release information and add compiler build information.
Filogic 880/860 WiFi7 MLO Alpha Release
Filogic 830/820/630 WiFi6 MP2.3 Release

[Release-log]
N/A

Change-Id: I11679aa3b32c842a1ec57bf342d6950d6c30d5f2
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8970625
diff --git a/autobuild_mac80211_release/0001-wifi7-mac80211-generate-hostapd-setting-from-ap-cap.patch b/autobuild_mac80211_release/0001-wifi7-mac80211-generate-hostapd-setting-from-ap-cap.patch
index 4f03685..09f6ffb 100644
--- a/autobuild_mac80211_release/0001-wifi7-mac80211-generate-hostapd-setting-from-ap-cap.patch
+++ b/autobuild_mac80211_release/0001-wifi7-mac80211-generate-hostapd-setting-from-ap-cap.patch
@@ -24,8 +24,8 @@
 @@ -305,6 +310,7 @@ define Build/Prepare
  	mkdir -p $(PKG_BUILD_DIR)
  	$(PKG_UNPACK)
- 	$(Build/Patch)
 +	$(CP) $(SOURCE_PATH)/* $(PKG_BUILD_DIR) 2>/dev/null || :
+ 	$(Build/Patch)
  	rm -rf \
  		$(PKG_BUILD_DIR)/include/linux/ssb \
  		$(PKG_BUILD_DIR)/include/linux/bcma \
diff --git a/autobuild_mac80211_release/Release.md b/autobuild_mac80211_release/Release.md
index 94bf80f..790aa0a 100644
--- a/autobuild_mac80211_release/Release.md
+++ b/autobuild_mac80211_release/Release.md
@@ -1,5 +1,22 @@
 # Mediatek Upstream SoftMAC WiFi Driver - MT76 Release Note
+## Compile Environment Requirement
+Use Ubuntu 18.04
+Install below tarball
+### OpenWRT
+RUN apt-get install -y uuid-dev
+### Toolchain
+RUN apt-get install -y gcc-aarch64-linux-gnu
+RUN apt-get install -y clang-6.0
+
+---
+[!NOTE] 
+Latest Release Version
+## Filogic 880/860 WiFi7 MLO Alpha Release (20240426)
 
+## Filogic 830/820/630 WiFi6 MP2.3 Release (20240426)
+---
+[!NOTE] 
+Old Release Version
 ## Filogic 880 WiFi7 Non-MLO SDK Release (20240112)
 Please note that the upcoming MLO SDK will not be able to use patches to support WiFi 7 MLO based on the 20240112 non-MLO SDK revision.
 It is essential to be aware that a complete upgrade of the SDK codebase is mandatory due to the Software MLO Architecture Change.
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/.config b/autobuild_mac80211_release/mt7988_mt7996_mac80211/.config
deleted file mode 100644
index d825f94..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/.config
+++ /dev/null
@@ -1,6331 +0,0 @@
-#
-# Automatically generated file; DO NOT EDIT.
-# OpenWrt Configuration
-#
-CONFIG_MODULES=y
-CONFIG_HAVE_DOT_CONFIG=y
-CONFIG_DEFAULT_TARGET_mediatek_mt7988=y
-# CONFIG_TARGET_sunxi is not set
-# CONFIG_TARGET_apm821xx is not set
-# CONFIG_TARGET_ath25 is not set
-# CONFIG_TARGET_ath79 is not set
-# CONFIG_TARGET_bcm27xx is not set
-# CONFIG_TARGET_bcm53xx is not set
-# CONFIG_TARGET_bcm47xx is not set
-# CONFIG_TARGET_bcm4908 is not set
-# CONFIG_TARGET_bcm63xx is not set
-# CONFIG_TARGET_octeon is not set
-# CONFIG_TARGET_gemini is not set
-# CONFIG_TARGET_mpc85xx is not set
-# CONFIG_TARGET_imx6 is not set
-# CONFIG_TARGET_mxs is not set
-# CONFIG_TARGET_lantiq is not set
-# CONFIG_TARGET_malta is not set
-# CONFIG_TARGET_pistachio is not set
-# CONFIG_TARGET_mvebu is not set
-# CONFIG_TARGET_kirkwood is not set
-CONFIG_TARGET_mediatek=y
-# CONFIG_TARGET_ramips is not set
-# CONFIG_TARGET_at91 is not set
-# CONFIG_TARGET_tegra is not set
-# CONFIG_TARGET_layerscape is not set
-# CONFIG_TARGET_octeontx is not set
-# CONFIG_TARGET_oxnas is not set
-# CONFIG_TARGET_armvirt is not set
-# CONFIG_TARGET_ipq40xx is not set
-# CONFIG_TARGET_ipq806x is not set
-# CONFIG_TARGET_realtek is not set
-# CONFIG_TARGET_rockchip is not set
-# CONFIG_TARGET_arc770 is not set
-# CONFIG_TARGET_archs38 is not set
-# CONFIG_TARGET_omap is not set
-# CONFIG_TARGET_uml is not set
-# CONFIG_TARGET_zynq is not set
-# CONFIG_TARGET_x86 is not set
-# CONFIG_TARGET_mediatek_mt7622 is not set
-# CONFIG_TARGET_mediatek_mt7623 is not set
-# CONFIG_TARGET_mediatek_mt7629 is not set
-# CONFIG_TARGET_mediatek_mt7986 is not set
-# CONFIG_TARGET_mediatek_mt7981 is not set
-CONFIG_TARGET_mediatek_mt7988=y
-CONFIG_TARGET_MULTI_PROFILE=y
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand-sb is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-emmc-sb is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand-4pcie is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-sfp-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-88d-10g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-e2p5g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-i2p5g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-snfi-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-spim-nor is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-emmc is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-sd is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-gsw-10g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-gsw-10g-sfp-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-e2p5g-spim-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-snfi-nand is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-spim-nor is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-emmc is not set
-# CONFIG_TARGET_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-sd is not set
-
-#
-# Target Devices
-#
-# CONFIG_TARGET_ALL_PROFILES is not set
-CONFIG_TARGET_PER_DEVICE_ROOTFS=y
-CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-88d-10g-spim-nand=y
-CONFIG_TARGET_DEVICE_PACKAGES_mediatek_mt7988_DEVICE_mediatek_mt7988a-88d-10g-spim-nand="nand-utils"
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-emmc is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-emmc-sb is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-sd is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-snfi-nand is not set
-CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-spim-nand=y
-CONFIG_TARGET_DEVICE_PACKAGES_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-spim-nand="nand-utils"
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-10g-spim-nor is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-e2p5g-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-dsa-i2p5g-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-sfp-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand-4pcie is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988a-gsw-10g-spim-nand-sb is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-emmc is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-sd is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-snfi-nand is not set
-CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-spim-nand=y
-CONFIG_TARGET_DEVICE_PACKAGES_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-spim-nand="nand-utils"
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-10g-spim-nor is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-dsa-e2p5g-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-gsw-10g-sfp-spim-nand is not set
-# CONFIG_TARGET_DEVICE_mediatek_mt7988_DEVICE_mediatek_mt7988d-gsw-10g-spim-nand is not set
-# end of Target Devices
-
-CONFIG_HAS_SUBTARGETS=y
-CONFIG_HAS_DEVICES=y
-CONFIG_TARGET_BOARD="mediatek"
-CONFIG_TARGET_SUBTARGET="mt7988"
-CONFIG_TARGET_ARCH_PACKAGES="aarch64_cortex-a53"
-CONFIG_DEFAULT_TARGET_OPTIMIZATION="-Os -pipe -mcpu=cortex-a53"
-CONFIG_CPU_TYPE="cortex-a53"
-CONFIG_LINUX_5_4=y
-CONFIG_DEFAULT_base-files=y
-CONFIG_MODULE_DEFAULT_base-files=y
-CONFIG_MODULE_DEFAULT_blkid=y
-CONFIG_MODULE_DEFAULT_blockdev=y
-CONFIG_DEFAULT_busybox=y
-CONFIG_MODULE_DEFAULT_busybox=y
-CONFIG_DEFAULT_ca-bundle=y
-CONFIG_MODULE_DEFAULT_ca-bundle=y
-CONFIG_DEFAULT_dnsmasq=y
-CONFIG_MODULE_DEFAULT_dnsmasq=y
-CONFIG_DEFAULT_dropbear=y
-CONFIG_MODULE_DEFAULT_dropbear=y
-CONFIG_MODULE_DEFAULT_e2fsprogs=y
-CONFIG_DEFAULT_firewall=y
-CONFIG_MODULE_DEFAULT_firewall=y
-CONFIG_DEFAULT_fstools=y
-CONFIG_MODULE_DEFAULT_fstools=y
-CONFIG_DEFAULT_ip6tables=y
-CONFIG_MODULE_DEFAULT_ip6tables=y
-CONFIG_DEFAULT_iptables=y
-CONFIG_MODULE_DEFAULT_iptables=y
-CONFIG_MODULE_DEFAULT_kmod-fs-ext4=y
-CONFIG_MODULE_DEFAULT_kmod-fs-f2fs=y
-CONFIG_MODULE_DEFAULT_kmod-fs-vfat=y
-CONFIG_DEFAULT_kmod-gpio-button-hotplug=y
-CONFIG_MODULE_DEFAULT_kmod-gpio-button-hotplug=y
-CONFIG_DEFAULT_kmod-ipt-offload=y
-CONFIG_MODULE_DEFAULT_kmod-ipt-offload=y
-CONFIG_DEFAULT_kmod-leds-gpio=y
-CONFIG_MODULE_DEFAULT_kmod-leds-gpio=y
-CONFIG_MODULE_DEFAULT_kmod-mmc=y
-CONFIG_MODULE_DEFAULT_kmod-nls-cp437=y
-CONFIG_MODULE_DEFAULT_kmod-nls-iso8859-1=y
-CONFIG_DEFAULT_libc=y
-CONFIG_MODULE_DEFAULT_libc=y
-CONFIG_DEFAULT_libgcc=y
-CONFIG_MODULE_DEFAULT_libgcc=y
-CONFIG_DEFAULT_libustream-wolfssl=y
-CONFIG_MODULE_DEFAULT_libustream-wolfssl=y
-CONFIG_DEFAULT_logd=y
-CONFIG_MODULE_DEFAULT_logd=y
-CONFIG_MODULE_DEFAULT_losetup=y
-CONFIG_MODULE_DEFAULT_mkf2fs=y
-CONFIG_DEFAULT_mtd=y
-CONFIG_MODULE_DEFAULT_mtd=y
-CONFIG_DEFAULT_netifd=y
-CONFIG_MODULE_DEFAULT_netifd=y
-CONFIG_DEFAULT_odhcp6c=y
-CONFIG_MODULE_DEFAULT_odhcp6c=y
-CONFIG_DEFAULT_odhcpd-ipv6only=y
-CONFIG_MODULE_DEFAULT_odhcpd-ipv6only=y
-CONFIG_DEFAULT_opkg=y
-CONFIG_MODULE_DEFAULT_opkg=y
-CONFIG_DEFAULT_ppp=y
-CONFIG_MODULE_DEFAULT_ppp=y
-CONFIG_DEFAULT_ppp-mod-pppoe=y
-CONFIG_MODULE_DEFAULT_ppp-mod-pppoe=y
-CONFIG_DEFAULT_procd=y
-CONFIG_MODULE_DEFAULT_procd=y
-CONFIG_DEFAULT_uci=y
-CONFIG_MODULE_DEFAULT_uci=y
-CONFIG_DEFAULT_uclient-fetch=y
-CONFIG_MODULE_DEFAULT_uclient-fetch=y
-CONFIG_DEFAULT_urandom-seed=y
-CONFIG_MODULE_DEFAULT_urandom-seed=y
-CONFIG_DEFAULT_urngd=y
-CONFIG_MODULE_DEFAULT_urngd=y
-CONFIG_AUDIO_SUPPORT=y
-CONFIG_GPIO_SUPPORT=y
-CONFIG_PCI_SUPPORT=y
-CONFIG_USB_SUPPORT=y
-CONFIG_RTC_SUPPORT=y
-CONFIG_USES_DEVICETREE=y
-CONFIG_USES_INITRAMFS=y
-CONFIG_USES_SQUASHFS=y
-CONFIG_NAND_SUPPORT=y
-CONFIG_ARCH_64BIT=y
-CONFIG_VIRTIO_SUPPORT=y
-CONFIG_aarch64=y
-CONFIG_ARCH="aarch64"
-
-#
-# Target Images
-#
-CONFIG_TARGET_ROOTFS_INITRAMFS=y
-CONFIG_TARGET_INITRAMFS_COMPRESSION_NONE=y
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP is not set
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2 is not set
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA is not set
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO is not set
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4 is not set
-# CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ is not set
-CONFIG_EXTERNAL_CPIO=""
-# CONFIG_TARGET_INITRAMFS_FORCE is not set
-
-#
-# Root filesystem archives
-#
-# CONFIG_TARGET_ROOTFS_CPIOGZ is not set
-# CONFIG_TARGET_ROOTFS_TARGZ is not set
-
-#
-# Root filesystem images
-#
-# CONFIG_TARGET_ROOTFS_EXT4FS is not set
-CONFIG_TARGET_ROOTFS_SQUASHFS=y
-CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=256
-CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP=y
-CONFIG_TARGET_UBIFS_JOURNAL_SIZE=""
-
-#
-# Image Options
-#
-# end of Target Images
-
-# CONFIG_EXPERIMENTAL is not set
-
-#
-# Global build settings
-#
-# CONFIG_JSON_OVERVIEW_IMAGE_INFO is not set
-# CONFIG_ALL_NONSHARED is not set
-# CONFIG_ALL_KMODS is not set
-# CONFIG_ALL is not set
-# CONFIG_BUILDBOT is not set
-CONFIG_SIGNED_PACKAGES=y
-CONFIG_SIGNATURE_CHECK=y
-CONFIG_DOWNLOAD_CHECK_CERTIFICATE=y
-
-#
-# General build options
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_BUILD_PATENTED is not set
-# CONFIG_BUILD_NLS is not set
-CONFIG_SHADOW_PASSWORDS=y
-# CONFIG_CLEAN_IPKG is not set
-# CONFIG_IPK_FILES_CHECKSUMS is not set
-# CONFIG_INCLUDE_CONFIG is not set
-# CONFIG_REPRODUCIBLE_DEBUG_INFO is not set
-CONFIG_COLLECT_KERNEL_DEBUG=y
-
-#
-# Kernel build options
-#
-CONFIG_KERNEL_BUILD_USER=""
-CONFIG_KERNEL_BUILD_DOMAIN=""
-CONFIG_KERNEL_PRINTK=y
-CONFIG_KERNEL_CRASHLOG=y
-CONFIG_KERNEL_SWAP=y
-# CONFIG_KERNEL_PROC_STRIPPED is not set
-CONFIG_KERNEL_DEBUG_FS=y
-CONFIG_KERNEL_ARM_PMU=y
-CONFIG_KERNEL_PERF_EVENTS=y
-CONFIG_KERNEL_PROFILING=y
-# CONFIG_KERNEL_UBSAN is not set
-# CONFIG_KERNEL_KASAN is not set
-# CONFIG_KERNEL_KCOV is not set
-# CONFIG_KERNEL_TASKSTATS is not set
-CONFIG_KERNEL_KALLSYMS=y
-CONFIG_KERNEL_FTRACE=y
-# CONFIG_KERNEL_FTRACE_SYSCALLS is not set
-# CONFIG_KERNEL_ENABLE_DEFAULT_TRACERS is not set
-# CONFIG_KERNEL_FUNCTION_TRACER is not set
-# CONFIG_KERNEL_IRQSOFF_TRACER is not set
-# CONFIG_KERNEL_PREEMPT_TRACER is not set
-CONFIG_KERNEL_DEBUG_KERNEL=y
-CONFIG_KERNEL_DEBUG_INFO=y
-# CONFIG_KERNEL_DYNAMIC_DEBUG is not set
-CONFIG_KERNEL_KPROBES=y
-CONFIG_KERNEL_KPROBE_EVENTS=y
-CONFIG_KERNEL_AIO=y
-CONFIG_KERNEL_IO_URING=y
-CONFIG_KERNEL_FHANDLE=y
-CONFIG_KERNEL_FANOTIFY=y
-# CONFIG_KERNEL_BLK_DEV_BSG is not set
-# CONFIG_KERNEL_HUGETLB_PAGE is not set
-CONFIG_KERNEL_MAGIC_SYSRQ=y
-# CONFIG_KERNEL_DEBUG_PINCTRL is not set
-# CONFIG_KERNEL_DEBUG_GPIO is not set
-CONFIG_KERNEL_COREDUMP=y
-CONFIG_KERNEL_ELF_CORE=y
-# CONFIG_KERNEL_PROVE_LOCKING is not set
-# CONFIG_KERNEL_SOFTLOCKUP_DETECTOR is not set
-# CONFIG_KERNEL_DETECT_HUNG_TASK is not set
-# CONFIG_KERNEL_WQ_WATCHDOG is not set
-# CONFIG_KERNEL_DEBUG_ATOMIC_SLEEP is not set
-# CONFIG_KERNEL_DEBUG_VM is not set
-CONFIG_KERNEL_PRINTK_TIME=y
-# CONFIG_KERNEL_SLABINFO is not set
-# CONFIG_KERNEL_PROC_PAGE_MONITOR is not set
-# CONFIG_KERNEL_KEXEC is not set
-# CONFIG_USE_RFKILL is not set
-# CONFIG_USE_SPARSE is not set
-# CONFIG_KERNEL_DEVTMPFS is not set
-# CONFIG_KERNEL_KEYS is not set
-CONFIG_KERNEL_CGROUPS=y
-# CONFIG_KERNEL_CGROUP_DEBUG is not set
-CONFIG_KERNEL_FREEZER=y
-CONFIG_KERNEL_CGROUP_FREEZER=y
-CONFIG_KERNEL_CGROUP_DEVICE=y
-# CONFIG_KERNEL_CGROUP_HUGETLB is not set
-CONFIG_KERNEL_CGROUP_PIDS=y
-CONFIG_KERNEL_CGROUP_RDMA=y
-CONFIG_KERNEL_CGROUP_BPF=y
-CONFIG_KERNEL_CPUSETS=y
-# CONFIG_KERNEL_PROC_PID_CPUSET is not set
-CONFIG_KERNEL_CGROUP_CPUACCT=y
-CONFIG_KERNEL_RESOURCE_COUNTERS=y
-CONFIG_KERNEL_MM_OWNER=y
-CONFIG_KERNEL_MEMCG=y
-# CONFIG_KERNEL_MEMCG_SWAP is not set
-CONFIG_KERNEL_MEMCG_KMEM=y
-# CONFIG_KERNEL_CGROUP_PERF is not set
-CONFIG_KERNEL_CGROUP_SCHED=y
-CONFIG_KERNEL_FAIR_GROUP_SCHED=y
-# CONFIG_KERNEL_CFS_BANDWIDTH is not set
-CONFIG_KERNEL_RT_GROUP_SCHED=y
-CONFIG_KERNEL_BLK_CGROUP=y
-# CONFIG_KERNEL_CFQ_GROUP_IOSCHED is not set
-# CONFIG_KERNEL_BLK_DEV_THROTTLING is not set
-# CONFIG_KERNEL_DEBUG_BLK_CGROUP is not set
-CONFIG_KERNEL_NET_CLS_CGROUP=y
-# CONFIG_KERNEL_CGROUP_NET_CLASSID is not set
-# CONFIG_KERNEL_CGROUP_NET_PRIO is not set
-CONFIG_KERNEL_NAMESPACES=y
-CONFIG_KERNEL_UTS_NS=y
-CONFIG_KERNEL_IPC_NS=y
-CONFIG_KERNEL_USER_NS=y
-CONFIG_KERNEL_PID_NS=y
-CONFIG_KERNEL_NET_NS=y
-CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES=y
-CONFIG_KERNEL_POSIX_MQUEUE=y
-CONFIG_KERNEL_SECCOMP_FILTER=y
-CONFIG_KERNEL_SECCOMP=y
-CONFIG_KERNEL_IP_MROUTE=y
-CONFIG_KERNEL_IPV6=y
-CONFIG_KERNEL_IPV6_MULTIPLE_TABLES=y
-CONFIG_KERNEL_IPV6_SUBTREES=y
-CONFIG_KERNEL_IPV6_MROUTE=y
-# CONFIG_KERNEL_IPV6_PIMSM_V2 is not set
-CONFIG_KERNEL_IPV6_SEG6_LWTUNNEL=y
-# CONFIG_KERNEL_LWTUNNEL_BPF is not set
-# CONFIG_KERNEL_IP_PNP is not set
-
-#
-# Filesystem ACL and attr support options
-#
-# CONFIG_USE_FS_ACL_ATTR is not set
-# CONFIG_KERNEL_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_BTRFS_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_EXT4_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_F2FS_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_JFFS2_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_TMPFS_POSIX_ACL is not set
-# CONFIG_KERNEL_CIFS_ACL is not set
-# CONFIG_KERNEL_HFS_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_HFSPLUS_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_NFS_ACL_SUPPORT is not set
-# CONFIG_KERNEL_NFS_V3_ACL_SUPPORT is not set
-# CONFIG_KERNEL_NFSD_V2_ACL_SUPPORT is not set
-# CONFIG_KERNEL_NFSD_V3_ACL_SUPPORT is not set
-# CONFIG_KERNEL_REISER_FS_POSIX_ACL is not set
-# CONFIG_KERNEL_XFS_POSIX_ACL is not set
-# CONFIG_KERNEL_JFS_POSIX_ACL is not set
-# end of Filesystem ACL and attr support options
-
-CONFIG_KERNEL_DEVMEM=y
-# CONFIG_KERNEL_DEVKMEM is not set
-CONFIG_KERNEL_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_KERNEL_SQUASHFS_XATTR is not set
-CONFIG_KERNEL_CC_OPTIMIZE_FOR_PERFORMANCE=y
-# CONFIG_KERNEL_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_KERNEL_AUDIT is not set
-# CONFIG_KERNEL_SECURITY is not set
-# CONFIG_KERNEL_SECURITY_NETWORK is not set
-# CONFIG_KERNEL_SECURITY_SELINUX is not set
-# CONFIG_KERNEL_EXT4_FS_SECURITY is not set
-# CONFIG_KERNEL_F2FS_FS_SECURITY is not set
-# CONFIG_KERNEL_UBIFS_FS_SECURITY is not set
-# CONFIG_KERNEL_JFFS2_FS_SECURITY is not set
-# end of Kernel build options
-
-#
-# Package build options
-#
-# CONFIG_DEBUG is not set
-CONFIG_IPV6=y
-
-#
-# Stripping options
-#
-# CONFIG_NO_STRIP is not set
-# CONFIG_USE_STRIP is not set
-CONFIG_USE_SSTRIP=y
-CONFIG_SSTRIP_ARGS="-z"
-# CONFIG_STRIP_KERNEL_EXPORTS is not set
-# CONFIG_USE_MKLIBS is not set
-
-#
-# Hardening build options
-#
-CONFIG_PKG_CHECK_FORMAT_SECURITY=y
-# CONFIG_PKG_ASLR_PIE_NONE is not set
-CONFIG_PKG_ASLR_PIE_REGULAR=y
-# CONFIG_PKG_ASLR_PIE_ALL is not set
-# CONFIG_PKG_CC_STACKPROTECTOR_NONE is not set
-CONFIG_PKG_CC_STACKPROTECTOR_REGULAR=y
-# CONFIG_PKG_CC_STACKPROTECTOR_STRONG is not set
-# CONFIG_KERNEL_CC_STACKPROTECTOR_NONE is not set
-CONFIG_KERNEL_CC_STACKPROTECTOR_REGULAR=y
-# CONFIG_KERNEL_CC_STACKPROTECTOR_STRONG is not set
-CONFIG_KERNEL_STACKPROTECTOR=y
-# CONFIG_KERNEL_STACKPROTECTOR_STRONG is not set
-# CONFIG_PKG_FORTIFY_SOURCE_NONE is not set
-CONFIG_PKG_FORTIFY_SOURCE_1=y
-# CONFIG_PKG_FORTIFY_SOURCE_2 is not set
-# CONFIG_PKG_RELRO_NONE is not set
-# CONFIG_PKG_RELRO_PARTIAL is not set
-CONFIG_PKG_RELRO_FULL=y
-# CONFIG_SELINUX is not set
-# end of Global build settings
-
-# CONFIG_DEVEL is not set
-# CONFIG_BROKEN is not set
-CONFIG_BINARY_FOLDER=""
-CONFIG_DOWNLOAD_FOLDER=""
-CONFIG_LOCALMIRROR=""
-CONFIG_AUTOREBUILD=y
-# CONFIG_AUTOREMOVE is not set
-CONFIG_BUILD_SUFFIX=""
-CONFIG_TARGET_ROOTFS_DIR=""
-# CONFIG_CCACHE is not set
-CONFIG_CCACHE_DIR=""
-CONFIG_KERNEL_CFLAGS=""
-CONFIG_EXTERNAL_KERNEL_TREE=""
-CONFIG_KERNEL_GIT_CLONE_URI=""
-CONFIG_BUILD_LOG_DIR=""
-CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves -fno-plt"
-CONFIG_TARGET_OPTIMIZATION="-Os -pipe -mcpu=cortex-a53"
-# CONFIG_EXTRA_TARGET_ARCH is not set
-CONFIG_EXTRA_BINUTILS_CONFIG_OPTIONS=""
-CONFIG_EXTRA_GCC_CONFIG_OPTIONS=""
-# CONFIG_GCC_DEFAULT_PIE is not set
-# CONFIG_GCC_DEFAULT_SSP is not set
-# CONFIG_SJLJ_EXCEPTIONS is not set
-# CONFIG_INSTALL_GFORTRAN is not set
-CONFIG_GDB=y
-# CONFIG_HAS_PREBUILT_LLVM_TOOLCHAIN is not set
-CONFIG_USE_MUSL=y
-CONFIG_SSP_SUPPORT=y
-CONFIG_BINUTILS_VERSION_2_34=y
-CONFIG_BINUTILS_VERSION="2.34"
-CONFIG_GCC_VERSION="8.4.0"
-# CONFIG_GCC_USE_IREMAP is not set
-CONFIG_LIBC="musl"
-CONFIG_TARGET_SUFFIX="musl"
-# CONFIG_IB is not set
-# CONFIG_SDK is not set
-# CONFIG_MAKE_TOOLCHAIN is not set
-# CONFIG_IMAGEOPT is not set
-# CONFIG_PREINITOPT is not set
-CONFIG_TARGET_PREINIT_SUPPRESS_STDERR=y
-# CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE is not set
-CONFIG_TARGET_PREINIT_TIMEOUT=2
-# CONFIG_TARGET_PREINIT_SHOW_NETMSG is not set
-# CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG is not set
-CONFIG_TARGET_PREINIT_IFNAME=""
-CONFIG_TARGET_PREINIT_IP="192.168.1.1"
-CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0"
-CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255"
-# CONFIG_INITOPT is not set
-CONFIG_TARGET_INIT_PATH="/usr/sbin:/usr/bin:/sbin:/bin"
-CONFIG_TARGET_INIT_ENV=""
-CONFIG_TARGET_INIT_CMD="/sbin/init"
-CONFIG_TARGET_INIT_SUPPRESS_STDERR=y
-# CONFIG_VERSIONOPT is not set
-CONFIG_PER_FEED_REPO=y
-CONFIG_FEED_mtk_openwrt_feed=y
-CONFIG_FEED_packages=y
-CONFIG_FEED_luci=y
-CONFIG_FEED_routing=y
-
-#
-# Base system
-#
-# CONFIG_PACKAGE_attendedsysupgrade-common is not set
-# CONFIG_PACKAGE_auc is not set
-CONFIG_PACKAGE_base-files=y
-# CONFIG_PACKAGE_block-mount is not set
-# CONFIG_PACKAGE_blockd is not set
-# CONFIG_PACKAGE_bridge is not set
-CONFIG_PACKAGE_busybox=y
-# CONFIG_BUSYBOX_CUSTOM is not set
-CONFIG_BUSYBOX_DEFAULT_HAVE_DOT_CONFIG=y
-# CONFIG_BUSYBOX_DEFAULT_DESKTOP is not set
-# CONFIG_BUSYBOX_DEFAULT_EXTRA_COMPAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEDORA_COMPAT is not set
-CONFIG_BUSYBOX_DEFAULT_INCLUDE_SUSv2=y
-CONFIG_BUSYBOX_DEFAULT_LONG_OPTS=y
-CONFIG_BUSYBOX_DEFAULT_SHOW_USAGE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_USAGE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_USAGE is not set
-CONFIG_BUSYBOX_DEFAULT_LFS=y
-# CONFIG_BUSYBOX_DEFAULT_PAM is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVPTS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UTMP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WTMP is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDFILE=y
-CONFIG_BUSYBOX_DEFAULT_PID_FILE_PATH="/var/run"
-# CONFIG_BUSYBOX_DEFAULT_BUSYBOX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHOW_SCRIPT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALLER is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_NO_USR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG_QUIET is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_APPLETS=y
-CONFIG_BUSYBOX_DEFAULT_BUSYBOX_EXEC_PATH="/proc/self/exe"
-# CONFIG_BUSYBOX_DEFAULT_SELINUX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CLEAN_UP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOG_INFO is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOG=y
-# CONFIG_BUSYBOX_DEFAULT_STATIC is not set
-# CONFIG_BUSYBOX_DEFAULT_PIE is not set
-# CONFIG_BUSYBOX_DEFAULT_NOMMU is not set
-# CONFIG_BUSYBOX_DEFAULT_BUILD_LIBBUSYBOX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LIBBUSYBOX_STATIC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INDIVIDUAL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHARED_BUSYBOX is not set
-CONFIG_BUSYBOX_DEFAULT_CROSS_COMPILER_PREFIX=""
-CONFIG_BUSYBOX_DEFAULT_SYSROOT=""
-CONFIG_BUSYBOX_DEFAULT_EXTRA_CFLAGS=""
-CONFIG_BUSYBOX_DEFAULT_EXTRA_LDFLAGS=""
-CONFIG_BUSYBOX_DEFAULT_EXTRA_LDLIBS=""
-# CONFIG_BUSYBOX_DEFAULT_USE_PORTABLE_CODE is not set
-# CONFIG_BUSYBOX_DEFAULT_STACK_OPTIMIZATION_386 is not set
-# CONFIG_BUSYBOX_DEFAULT_STATIC_LIBGCC is not set
-CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SYMLINKS=y
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_HARDLINKS is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_DONT is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SYMLINK is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_HARDLINK is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
-CONFIG_BUSYBOX_DEFAULT_PREFIX="./_install"
-# CONFIG_BUSYBOX_DEFAULT_DEBUG is not set
-# CONFIG_BUSYBOX_DEFAULT_DEBUG_PESSIMIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_DEBUG_SANITIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_UNIT_TEST is not set
-# CONFIG_BUSYBOX_DEFAULT_WERROR is not set
-# CONFIG_BUSYBOX_DEFAULT_WARN_SIMPLE_MSG is not set
-CONFIG_BUSYBOX_DEFAULT_NO_DEBUG_LIB=y
-# CONFIG_BUSYBOX_DEFAULT_DMALLOC is not set
-# CONFIG_BUSYBOX_DEFAULT_EFENCE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_BSS_TAIL is not set
-# CONFIG_BUSYBOX_DEFAULT_FLOAT_DURATION is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RTMINMAX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RTMINMAX_USE_LIBC_DEFINITIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_USE_MALLOC is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_ON_STACK=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_IN_BSS is not set
-CONFIG_BUSYBOX_DEFAULT_PASSWORD_MINLEN=6
-CONFIG_BUSYBOX_DEFAULT_MD5_SMALL=1
-CONFIG_BUSYBOX_DEFAULT_SHA3_SMALL=1
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FAST_TOP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_ETC_NETWORKS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_ETC_SERVICES is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_MAX_LEN=512
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_VI is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_HISTORY=256
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVEHISTORY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVE_ON_EXIT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_REVERSE_SEARCH is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TAB_COMPLETION=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_USERNAME_COMPLETION is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_FANCY_PROMPT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_WINCH is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_ASK_TERMINAL is not set
-# CONFIG_BUSYBOX_DEFAULT_LOCALE_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_USING_LOCALE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_UNICODE_IN_ENV is not set
-CONFIG_BUSYBOX_DEFAULT_SUBST_WCHAR=0
-CONFIG_BUSYBOX_DEFAULT_LAST_SUPPORTED_WCHAR=0
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_COMBINING_WCHARS is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_WIDE_WCHARS is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_BIDI_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_NEUTRAL_TABLE is not set
-# CONFIG_BUSYBOX_DEFAULT_UNICODE_PRESERVE_BROKEN is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_NON_POSIX_CP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_CP_MESSAGE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_SENDFILE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_COPYBUF_KB=4
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SKIP_ROOTFS is not set
-CONFIG_BUSYBOX_DEFAULT_MONOTONIC_SYSCALL=y
-CONFIG_BUSYBOX_DEFAULT_IOCTL_HEX2STR_ERROR=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWIB is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_XZ is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_LZMA is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_BZ2 is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_GZ=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_Z is not set
-# CONFIG_BUSYBOX_DEFAULT_AR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_LONG_FILENAMES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_CREATE is not set
-# CONFIG_BUSYBOX_DEFAULT_UNCOMPRESS is not set
-CONFIG_BUSYBOX_DEFAULT_GUNZIP=y
-CONFIG_BUSYBOX_DEFAULT_ZCAT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_GUNZIP_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_BUNZIP2=y
-CONFIG_BUSYBOX_DEFAULT_BZCAT=y
-# CONFIG_BUSYBOX_DEFAULT_UNLZMA is not set
-# CONFIG_BUSYBOX_DEFAULT_LZCAT is not set
-# CONFIG_BUSYBOX_DEFAULT_LZMA is not set
-# CONFIG_BUSYBOX_DEFAULT_UNXZ is not set
-# CONFIG_BUSYBOX_DEFAULT_XZCAT is not set
-# CONFIG_BUSYBOX_DEFAULT_XZ is not set
-# CONFIG_BUSYBOX_DEFAULT_BZIP2 is not set
-CONFIG_BUSYBOX_DEFAULT_BZIP2_SMALL=0
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BZIP2_DECOMPRESS=y
-# CONFIG_BUSYBOX_DEFAULT_CPIO is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_O is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_P is not set
-# CONFIG_BUSYBOX_DEFAULT_DPKG is not set
-# CONFIG_BUSYBOX_DEFAULT_DPKG_DEB is not set
-CONFIG_BUSYBOX_DEFAULT_GZIP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_GZIP_FAST=0
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_LEVELS is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_DECOMPRESS=y
-# CONFIG_BUSYBOX_DEFAULT_LZOP is not set
-# CONFIG_BUSYBOX_DEFAULT_UNLZOP is not set
-# CONFIG_BUSYBOX_DEFAULT_LZOPCAT is not set
-# CONFIG_BUSYBOX_DEFAULT_LZOP_COMPR_HIGH is not set
-# CONFIG_BUSYBOX_DEFAULT_RPM is not set
-# CONFIG_BUSYBOX_DEFAULT_RPM2CPIO is not set
-CONFIG_BUSYBOX_DEFAULT_TAR=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_CREATE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_AUTODETECT is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_FROM=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_GNU_EXTENSIONS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_TO_COMMAND is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_UNAME_GNAME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_NOPRESERVE_TIME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_SELINUX is not set
-# CONFIG_BUSYBOX_DEFAULT_UNZIP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_CDF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_BZIP2 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_LZMA is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNZIP_XZ is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LZMA_FAST is not set
-CONFIG_BUSYBOX_DEFAULT_BASENAME=y
-CONFIG_BUSYBOX_DEFAULT_CAT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CATN is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CATV is not set
-CONFIG_BUSYBOX_DEFAULT_CHGRP=y
-CONFIG_BUSYBOX_DEFAULT_CHMOD=y
-CONFIG_BUSYBOX_DEFAULT_CHOWN=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHOWN_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_CHROOT=y
-# CONFIG_BUSYBOX_DEFAULT_CKSUM is not set
-# CONFIG_BUSYBOX_DEFAULT_COMM is not set
-CONFIG_BUSYBOX_DEFAULT_CP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CP_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CP_REFLINK is not set
-CONFIG_BUSYBOX_DEFAULT_CUT=y
-CONFIG_BUSYBOX_DEFAULT_DATE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_ISOFMT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_NANO is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_COMPAT is not set
-CONFIG_BUSYBOX_DEFAULT_DD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_SIGNAL_HANDLING=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_THIRD_STATUS_LINE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_IBS_OBS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_STATUS is not set
-CONFIG_BUSYBOX_DEFAULT_DF=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DF_FANCY is not set
-CONFIG_BUSYBOX_DEFAULT_DIRNAME=y
-# CONFIG_BUSYBOX_DEFAULT_DOS2UNIX is not set
-# CONFIG_BUSYBOX_DEFAULT_UNIX2DOS is not set
-CONFIG_BUSYBOX_DEFAULT_DU=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
-CONFIG_BUSYBOX_DEFAULT_ECHO=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_ECHO=y
-CONFIG_BUSYBOX_DEFAULT_ENV=y
-# CONFIG_BUSYBOX_DEFAULT_EXPAND is not set
-# CONFIG_BUSYBOX_DEFAULT_UNEXPAND is not set
-CONFIG_BUSYBOX_DEFAULT_EXPR=y
-CONFIG_BUSYBOX_DEFAULT_EXPR_MATH_SUPPORT_64=y
-# CONFIG_BUSYBOX_DEFAULT_FACTOR is not set
-CONFIG_BUSYBOX_DEFAULT_FALSE=y
-# CONFIG_BUSYBOX_DEFAULT_FOLD is not set
-CONFIG_BUSYBOX_DEFAULT_HEAD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_HEAD=y
-# CONFIG_BUSYBOX_DEFAULT_HOSTID is not set
-CONFIG_BUSYBOX_DEFAULT_ID=y
-# CONFIG_BUSYBOX_DEFAULT_GROUPS is not set
-# CONFIG_BUSYBOX_DEFAULT_INSTALL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALL_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_LINK is not set
-CONFIG_BUSYBOX_DEFAULT_LN=y
-# CONFIG_BUSYBOX_DEFAULT_LOGNAME is not set
-CONFIG_BUSYBOX_DEFAULT_LS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FILETYPES=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FOLLOWLINKS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_RECURSIVE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_WIDTH=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_SORTFILES=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_TIMESTAMPS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_USERNAME=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR_IS_DEFAULT=y
-CONFIG_BUSYBOX_DEFAULT_MD5SUM=y
-# CONFIG_BUSYBOX_DEFAULT_SHA1SUM is not set
-CONFIG_BUSYBOX_DEFAULT_SHA256SUM=y
-# CONFIG_BUSYBOX_DEFAULT_SHA512SUM is not set
-# CONFIG_BUSYBOX_DEFAULT_SHA3SUM is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MD5_SHA1_SUM_CHECK=y
-CONFIG_BUSYBOX_DEFAULT_MKDIR=y
-CONFIG_BUSYBOX_DEFAULT_MKFIFO=y
-CONFIG_BUSYBOX_DEFAULT_MKNOD=y
-CONFIG_BUSYBOX_DEFAULT_MKTEMP=y
-CONFIG_BUSYBOX_DEFAULT_MV=y
-CONFIG_BUSYBOX_DEFAULT_NICE=y
-# CONFIG_BUSYBOX_DEFAULT_NL is not set
-# CONFIG_BUSYBOX_DEFAULT_NOHUP is not set
-# CONFIG_BUSYBOX_DEFAULT_NPROC is not set
-# CONFIG_BUSYBOX_DEFAULT_OD is not set
-# CONFIG_BUSYBOX_DEFAULT_PASTE is not set
-# CONFIG_BUSYBOX_DEFAULT_PRINTENV is not set
-CONFIG_BUSYBOX_DEFAULT_PRINTF=y
-CONFIG_BUSYBOX_DEFAULT_PWD=y
-CONFIG_BUSYBOX_DEFAULT_READLINK=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_READLINK_FOLLOW=y
-# CONFIG_BUSYBOX_DEFAULT_REALPATH is not set
-CONFIG_BUSYBOX_DEFAULT_RM=y
-CONFIG_BUSYBOX_DEFAULT_RMDIR=y
-CONFIG_BUSYBOX_DEFAULT_SEQ=y
-# CONFIG_BUSYBOX_DEFAULT_SHRED is not set
-# CONFIG_BUSYBOX_DEFAULT_SHUF is not set
-CONFIG_BUSYBOX_DEFAULT_SLEEP=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_SLEEP=y
-CONFIG_BUSYBOX_DEFAULT_SORT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SORT_BIG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SORT_OPTIMIZE_MEMORY is not set
-# CONFIG_BUSYBOX_DEFAULT_SPLIT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SPLIT_FANCY is not set
-# CONFIG_BUSYBOX_DEFAULT_STAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_STAT_FORMAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_STAT_FILESYSTEM is not set
-# CONFIG_BUSYBOX_DEFAULT_STTY is not set
-# CONFIG_BUSYBOX_DEFAULT_SUM is not set
-CONFIG_BUSYBOX_DEFAULT_SYNC=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYNC_FANCY is not set
-CONFIG_BUSYBOX_DEFAULT_FSYNC=y
-# CONFIG_BUSYBOX_DEFAULT_TAC is not set
-CONFIG_BUSYBOX_DEFAULT_TAIL=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_TAIL=y
-CONFIG_BUSYBOX_DEFAULT_TEE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TEE_USE_BLOCK_IO=y
-CONFIG_BUSYBOX_DEFAULT_TEST=y
-CONFIG_BUSYBOX_DEFAULT_TEST1=y
-CONFIG_BUSYBOX_DEFAULT_TEST2=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TEST_64=y
-# CONFIG_BUSYBOX_DEFAULT_TIMEOUT is not set
-CONFIG_BUSYBOX_DEFAULT_TOUCH=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_NODEREF is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_SUSV3=y
-CONFIG_BUSYBOX_DEFAULT_TR=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_CLASSES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_EQUIV is not set
-CONFIG_BUSYBOX_DEFAULT_TRUE=y
-# CONFIG_BUSYBOX_DEFAULT_TRUNCATE is not set
-# CONFIG_BUSYBOX_DEFAULT_TTY is not set
-CONFIG_BUSYBOX_DEFAULT_UNAME=y
-CONFIG_BUSYBOX_DEFAULT_UNAME_OSNAME="GNU/Linux"
-# CONFIG_BUSYBOX_DEFAULT_BB_ARCH is not set
-CONFIG_BUSYBOX_DEFAULT_UNIQ=y
-# CONFIG_BUSYBOX_DEFAULT_UNLINK is not set
-# CONFIG_BUSYBOX_DEFAULT_USLEEP is not set
-# CONFIG_BUSYBOX_DEFAULT_UUDECODE is not set
-# CONFIG_BUSYBOX_DEFAULT_BASE32 is not set
-# CONFIG_BUSYBOX_DEFAULT_BASE64 is not set
-# CONFIG_BUSYBOX_DEFAULT_UUENCODE is not set
-CONFIG_BUSYBOX_DEFAULT_WC=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WC_LARGE is not set
-# CONFIG_BUSYBOX_DEFAULT_WHO is not set
-# CONFIG_BUSYBOX_DEFAULT_W is not set
-# CONFIG_BUSYBOX_DEFAULT_USERS is not set
-# CONFIG_BUSYBOX_DEFAULT_WHOAMI is not set
-CONFIG_BUSYBOX_DEFAULT_YES=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_PRESERVE_HARDLINKS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_HUMAN_READABLE=y
-# CONFIG_BUSYBOX_DEFAULT_CHVT is not set
-CONFIG_BUSYBOX_DEFAULT_CLEAR=y
-# CONFIG_BUSYBOX_DEFAULT_DEALLOCVT is not set
-# CONFIG_BUSYBOX_DEFAULT_DUMPKMAP is not set
-# CONFIG_BUSYBOX_DEFAULT_FGCONSOLE is not set
-# CONFIG_BUSYBOX_DEFAULT_KBD_MODE is not set
-# CONFIG_BUSYBOX_DEFAULT_LOADFONT is not set
-# CONFIG_BUSYBOX_DEFAULT_SETFONT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFONT_TEXTUAL_MAP is not set
-CONFIG_BUSYBOX_DEFAULT_DEFAULT_SETFONT_DIR=""
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_PSF2 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_RAW is not set
-# CONFIG_BUSYBOX_DEFAULT_LOADKMAP is not set
-# CONFIG_BUSYBOX_DEFAULT_OPENVT is not set
-CONFIG_BUSYBOX_DEFAULT_RESET=y
-# CONFIG_BUSYBOX_DEFAULT_RESIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RESIZE_PRINT is not set
-# CONFIG_BUSYBOX_DEFAULT_SETCONSOLE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETCONSOLE_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_SETKEYCODES is not set
-# CONFIG_BUSYBOX_DEFAULT_SETLOGCONS is not set
-# CONFIG_BUSYBOX_DEFAULT_SHOWKEY is not set
-# CONFIG_BUSYBOX_DEFAULT_PIPE_PROGRESS is not set
-# CONFIG_BUSYBOX_DEFAULT_RUN_PARTS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_FANCY is not set
-CONFIG_BUSYBOX_DEFAULT_START_STOP_DAEMON=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_FANCY is not set
-CONFIG_BUSYBOX_DEFAULT_WHICH=y
-# CONFIG_BUSYBOX_DEFAULT_MINIPS is not set
-# CONFIG_BUSYBOX_DEFAULT_NUKE is not set
-# CONFIG_BUSYBOX_DEFAULT_RESUME is not set
-# CONFIG_BUSYBOX_DEFAULT_RUN_INIT is not set
-CONFIG_BUSYBOX_DEFAULT_AWK=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_LIBM=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_GNU_EXTENSIONS=y
-CONFIG_BUSYBOX_DEFAULT_CMP=y
-# CONFIG_BUSYBOX_DEFAULT_DIFF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_DIR is not set
-# CONFIG_BUSYBOX_DEFAULT_ED is not set
-# CONFIG_BUSYBOX_DEFAULT_PATCH is not set
-CONFIG_BUSYBOX_DEFAULT_SED=y
-CONFIG_BUSYBOX_DEFAULT_VI=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_MAX_LEN=1024
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_8BIT is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_COLON=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_YANKMARK=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SEARCH=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_REGEX_SEARCH is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_USE_SIGNALS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_DOT_CMD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_READONLY=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SETOPTS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SET=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_WIN_RESIZE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_ASK_TERMINAL=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE_MAX=0
-CONFIG_BUSYBOX_DEFAULT_FEATURE_ALLOW_EXEC=y
-CONFIG_BUSYBOX_DEFAULT_FIND=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRINT0=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MTIME=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MMIN=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PERM=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_TYPE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXECUTABLE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_XDEV=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MAXDEPTH=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NEWER=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_INUM is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC_PLUS is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_USER=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_GROUP=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NOT=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DEPTH=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PAREN=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_SIZE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRUNE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_QUIT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DELETE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EMPTY is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PATH=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_REGEX=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_CONTEXT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_LINKS is not set
-CONFIG_BUSYBOX_DEFAULT_GREP=y
-CONFIG_BUSYBOX_DEFAULT_EGREP=y
-CONFIG_BUSYBOX_DEFAULT_FGREP=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_GREP_CONTEXT=y
-CONFIG_BUSYBOX_DEFAULT_XARGS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_CONFIRMATION=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_QUOTES=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_TERMOPT=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_REPL_STR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_PARALLEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_ARGS_FILE is not set
-# CONFIG_BUSYBOX_DEFAULT_BOOTCHARTD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_CONFIG_FILE is not set
-CONFIG_BUSYBOX_DEFAULT_HALT=y
-CONFIG_BUSYBOX_DEFAULT_POWEROFF=y
-CONFIG_BUSYBOX_DEFAULT_REBOOT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WAIT_FOR_INIT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CALL_TELINIT is not set
-CONFIG_BUSYBOX_DEFAULT_TELINIT_PATH=""
-# CONFIG_BUSYBOX_DEFAULT_INIT is not set
-# CONFIG_BUSYBOX_DEFAULT_LINUXRC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_INITTAB is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_REMOVED is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_DELAY=0
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SCTTY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SYSLOG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_QUIET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_COREDUMPS is not set
-CONFIG_BUSYBOX_DEFAULT_INIT_TERMINAL_TYPE=""
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_MODIFY_CMDLINE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SHADOWPASSWDS=y
-# CONFIG_BUSYBOX_DEFAULT_USE_BB_PWD_GRP is not set
-# CONFIG_BUSYBOX_DEFAULT_USE_BB_SHADOW is not set
-# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT is not set
-# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT_SHA is not set
-# CONFIG_BUSYBOX_DEFAULT_ADD_SHELL is not set
-# CONFIG_BUSYBOX_DEFAULT_REMOVE_SHELL is not set
-# CONFIG_BUSYBOX_DEFAULT_ADDGROUP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_ADDUSER_TO_GROUP is not set
-# CONFIG_BUSYBOX_DEFAULT_ADDUSER is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_NAMES is not set
-CONFIG_BUSYBOX_DEFAULT_LAST_ID=0
-CONFIG_BUSYBOX_DEFAULT_FIRST_SYSTEM_ID=0
-CONFIG_BUSYBOX_DEFAULT_LAST_SYSTEM_ID=0
-# CONFIG_BUSYBOX_DEFAULT_CHPASSWD is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DEFAULT_PASSWD_ALGO="md5"
-# CONFIG_BUSYBOX_DEFAULT_CRYPTPW is not set
-# CONFIG_BUSYBOX_DEFAULT_MKPASSWD is not set
-# CONFIG_BUSYBOX_DEFAULT_DELUSER is not set
-# CONFIG_BUSYBOX_DEFAULT_DELGROUP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEL_USER_FROM_GROUP is not set
-# CONFIG_BUSYBOX_DEFAULT_GETTY is not set
-CONFIG_BUSYBOX_DEFAULT_LOGIN=y
-CONFIG_BUSYBOX_DEFAULT_LOGIN_SESSION_AS_CHILD=y
-# CONFIG_BUSYBOX_DEFAULT_LOGIN_SCRIPTS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NOLOGIN is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SECURETTY is not set
-CONFIG_BUSYBOX_DEFAULT_PASSWD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_PASSWD_WEAK_CHECK=y
-# CONFIG_BUSYBOX_DEFAULT_SU is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_SYSLOG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_CHECKS_SHELLS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set
-# CONFIG_BUSYBOX_DEFAULT_SULOGIN is not set
-# CONFIG_BUSYBOX_DEFAULT_VLOCK is not set
-# CONFIG_BUSYBOX_DEFAULT_CHATTR is not set
-# CONFIG_BUSYBOX_DEFAULT_FSCK is not set
-# CONFIG_BUSYBOX_DEFAULT_LSATTR is not set
-# CONFIG_BUSYBOX_DEFAULT_TUNE2FS is not set
-# CONFIG_BUSYBOX_DEFAULT_MODPROBE_SMALL is not set
-# CONFIG_BUSYBOX_DEFAULT_DEPMOD is not set
-# CONFIG_BUSYBOX_DEFAULT_INSMOD is not set
-# CONFIG_BUSYBOX_DEFAULT_LSMOD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
-# CONFIG_BUSYBOX_DEFAULT_MODINFO is not set
-# CONFIG_BUSYBOX_DEFAULT_MODPROBE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_BLACKLIST is not set
-# CONFIG_BUSYBOX_DEFAULT_RMMOD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CMDLINE_MODULE_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_2_4_MODULES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_VERSION_CHECKING is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOADINKMEM is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP_FULL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_TAINTED_MODULE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_TRY_MMAP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_ALIAS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_SYMBOLS is not set
-CONFIG_BUSYBOX_DEFAULT_DEFAULT_MODULES_DIR=""
-CONFIG_BUSYBOX_DEFAULT_DEFAULT_DEPMOD_FILE=""
-# CONFIG_BUSYBOX_DEFAULT_ACPID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_ACPID_COMPAT is not set
-# CONFIG_BUSYBOX_DEFAULT_BLKDISCARD is not set
-# CONFIG_BUSYBOX_DEFAULT_BLKID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BLKID_TYPE is not set
-# CONFIG_BUSYBOX_DEFAULT_BLOCKDEV is not set
-# CONFIG_BUSYBOX_DEFAULT_CAL is not set
-# CONFIG_BUSYBOX_DEFAULT_CHRT is not set
-CONFIG_BUSYBOX_DEFAULT_DMESG=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_DMESG_PRETTY=y
-# CONFIG_BUSYBOX_DEFAULT_EJECT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_EJECT_SCSI is not set
-# CONFIG_BUSYBOX_DEFAULT_FALLOCATE is not set
-# CONFIG_BUSYBOX_DEFAULT_FATATTR is not set
-# CONFIG_BUSYBOX_DEFAULT_FBSET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_FANCY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_READMODE is not set
-# CONFIG_BUSYBOX_DEFAULT_FDFORMAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FDISK is not set
-# CONFIG_BUSYBOX_DEFAULT_FDISK_SUPPORT_LARGE_DISKS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_WRITABLE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_AIX_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SGI_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUN_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_OSF_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_GPT_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_ADVANCED is not set
-# CONFIG_BUSYBOX_DEFAULT_FINDFS is not set
-CONFIG_BUSYBOX_DEFAULT_FLOCK=y
-# CONFIG_BUSYBOX_DEFAULT_FDFLUSH is not set
-# CONFIG_BUSYBOX_DEFAULT_FREERAMDISK is not set
-# CONFIG_BUSYBOX_DEFAULT_FSCK_MINIX is not set
-# CONFIG_BUSYBOX_DEFAULT_FSFREEZE is not set
-# CONFIG_BUSYBOX_DEFAULT_FSTRIM is not set
-# CONFIG_BUSYBOX_DEFAULT_GETOPT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_GETOPT_LONG is not set
-CONFIG_BUSYBOX_DEFAULT_HEXDUMP=y
-# CONFIG_BUSYBOX_DEFAULT_HD is not set
-# CONFIG_BUSYBOX_DEFAULT_XXD is not set
-CONFIG_BUSYBOX_DEFAULT_HWCLOCK=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWCLOCK_ADJTIME_FHS is not set
-# CONFIG_BUSYBOX_DEFAULT_IONICE is not set
-# CONFIG_BUSYBOX_DEFAULT_IPCRM is not set
-# CONFIG_BUSYBOX_DEFAULT_IPCS is not set
-# CONFIG_BUSYBOX_DEFAULT_LAST is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LAST_FANCY is not set
-# CONFIG_BUSYBOX_DEFAULT_LOSETUP is not set
-CONFIG_BUSYBOX_DEFAULT_LSPCI=y
-CONFIG_BUSYBOX_DEFAULT_LSUSB=y
-# CONFIG_BUSYBOX_DEFAULT_MDEV is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_CONF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME_REGEXP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_EXEC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_LOAD_FIRMWARE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_DAEMON is not set
-# CONFIG_BUSYBOX_DEFAULT_MESG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MESG_ENABLE_ONLY_GROUP is not set
-# CONFIG_BUSYBOX_DEFAULT_MKE2FS is not set
-# CONFIG_BUSYBOX_DEFAULT_MKFS_EXT2 is not set
-# CONFIG_BUSYBOX_DEFAULT_MKFS_MINIX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MINIX2 is not set
-# CONFIG_BUSYBOX_DEFAULT_MKFS_REISER is not set
-# CONFIG_BUSYBOX_DEFAULT_MKDOSFS is not set
-# CONFIG_BUSYBOX_DEFAULT_MKFS_VFAT is not set
-CONFIG_BUSYBOX_DEFAULT_MKSWAP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MKSWAP_UUID is not set
-# CONFIG_BUSYBOX_DEFAULT_MORE is not set
-CONFIG_BUSYBOX_DEFAULT_MOUNT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FAKE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_VERBOSE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_HELPERS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LABEL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_NFS is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_CIFS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FLAGS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FSTAB=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_OTHERTAB is not set
-# CONFIG_BUSYBOX_DEFAULT_MOUNTPOINT is not set
-# CONFIG_BUSYBOX_DEFAULT_NOLOGIN is not set
-# CONFIG_BUSYBOX_DEFAULT_NOLOGIN_DEPENDENCIES is not set
-# CONFIG_BUSYBOX_DEFAULT_NSENTER is not set
-CONFIG_BUSYBOX_DEFAULT_PIVOT_ROOT=y
-# CONFIG_BUSYBOX_DEFAULT_RDATE is not set
-# CONFIG_BUSYBOX_DEFAULT_RDEV is not set
-# CONFIG_BUSYBOX_DEFAULT_READPROFILE is not set
-# CONFIG_BUSYBOX_DEFAULT_RENICE is not set
-# CONFIG_BUSYBOX_DEFAULT_REV is not set
-# CONFIG_BUSYBOX_DEFAULT_RTCWAKE is not set
-# CONFIG_BUSYBOX_DEFAULT_SCRIPT is not set
-# CONFIG_BUSYBOX_DEFAULT_SCRIPTREPLAY is not set
-# CONFIG_BUSYBOX_DEFAULT_SETARCH is not set
-# CONFIG_BUSYBOX_DEFAULT_LINUX32 is not set
-# CONFIG_BUSYBOX_DEFAULT_LINUX64 is not set
-# CONFIG_BUSYBOX_DEFAULT_SETPRIV is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_DUMP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_CAPABILITIES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETPRIV_CAPABILITY_NAMES is not set
-# CONFIG_BUSYBOX_DEFAULT_SETSID is not set
-CONFIG_BUSYBOX_DEFAULT_SWAPON=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_DISCARD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_PRI=y
-CONFIG_BUSYBOX_DEFAULT_SWAPOFF=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPONOFF_LABEL is not set
-CONFIG_BUSYBOX_DEFAULT_SWITCH_ROOT=y
-# CONFIG_BUSYBOX_DEFAULT_TASKSET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TASKSET_FANCY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TASKSET_CPULIST is not set
-# CONFIG_BUSYBOX_DEFAULT_UEVENT is not set
-CONFIG_BUSYBOX_DEFAULT_UMOUNT=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_UMOUNT_ALL=y
-# CONFIG_BUSYBOX_DEFAULT_UNSHARE is not set
-# CONFIG_BUSYBOX_DEFAULT_WALL is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP_CREATE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MTAB_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_VOLUMEID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_BCACHE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_BTRFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_CRAMFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EROFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXFAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_F2FS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_FAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_HFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ISO9660 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_JFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXRAID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXSWAP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LUKS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_MINIX is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NILFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NTFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_OCFS2 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_REISERFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ROMFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SQUASHFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SYSV is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_UBIFS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_UDF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_XFS is not set
-# CONFIG_BUSYBOX_DEFAULT_ADJTIMEX is not set
-# CONFIG_BUSYBOX_DEFAULT_BBCONFIG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_BBCONFIG is not set
-# CONFIG_BUSYBOX_DEFAULT_BC is not set
-# CONFIG_BUSYBOX_DEFAULT_DC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DC_BIG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DC_LIBM is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BC_INTERACTIVE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_BC_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_BEEP is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_FREQ=0
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_LENGTH_MS=0
-# CONFIG_BUSYBOX_DEFAULT_CHAT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_NOFAIL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_TTY_HIFI is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_IMPLICIT_CR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SWALLOW_OPTS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SEND_ESCAPES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_VAR_ABORT_LEN is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_CLR_ABORT is not set
-# CONFIG_BUSYBOX_DEFAULT_CONSPY is not set
-CONFIG_BUSYBOX_DEFAULT_CROND=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_D is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_CALL_SENDMAIL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_SPECIAL_TIMES is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_DIR="/etc"
-CONFIG_BUSYBOX_DEFAULT_CRONTAB=y
-# CONFIG_BUSYBOX_DEFAULT_DEVFSD is not set
-# CONFIG_BUSYBOX_DEFAULT_DEVFSD_MODLOAD is not set
-# CONFIG_BUSYBOX_DEFAULT_DEVFSD_FG_NP is not set
-# CONFIG_BUSYBOX_DEFAULT_DEVFSD_VERBOSE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVFS is not set
-# CONFIG_BUSYBOX_DEFAULT_DEVMEM is not set
-# CONFIG_BUSYBOX_DEFAULT_FBSPLASH is not set
-# CONFIG_BUSYBOX_DEFAULT_FLASH_ERASEALL is not set
-# CONFIG_BUSYBOX_DEFAULT_FLASH_LOCK is not set
-# CONFIG_BUSYBOX_DEFAULT_FLASH_UNLOCK is not set
-# CONFIG_BUSYBOX_DEFAULT_FLASHCP is not set
-# CONFIG_BUSYBOX_DEFAULT_HDPARM is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_GET_IDENTITY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_GETSET_DMA is not set
-# CONFIG_BUSYBOX_DEFAULT_HEXEDIT is not set
-# CONFIG_BUSYBOX_DEFAULT_I2CGET is not set
-# CONFIG_BUSYBOX_DEFAULT_I2CSET is not set
-# CONFIG_BUSYBOX_DEFAULT_I2CDUMP is not set
-# CONFIG_BUSYBOX_DEFAULT_I2CDETECT is not set
-# CONFIG_BUSYBOX_DEFAULT_I2CTRANSFER is not set
-# CONFIG_BUSYBOX_DEFAULT_INOTIFYD is not set
-CONFIG_BUSYBOX_DEFAULT_LESS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MAXLINES=9999999
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_BRACKETS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_FLAGS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_TRUNCATE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MARKS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_REGEXP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_WINCH is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_ASK_TERMINAL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_DASHCMD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_LINENUMS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_RAW is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_ENV is not set
-CONFIG_BUSYBOX_DEFAULT_LOCK=y
-# CONFIG_BUSYBOX_DEFAULT_LSSCSI is not set
-# CONFIG_BUSYBOX_DEFAULT_MAKEDEVS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_LEAF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_TABLE is not set
-# CONFIG_BUSYBOX_DEFAULT_MAN is not set
-# CONFIG_BUSYBOX_DEFAULT_MICROCOM is not set
-# CONFIG_BUSYBOX_DEFAULT_MIM is not set
-# CONFIG_BUSYBOX_DEFAULT_MT is not set
-# CONFIG_BUSYBOX_DEFAULT_NANDWRITE is not set
-# CONFIG_BUSYBOX_DEFAULT_NANDDUMP is not set
-# CONFIG_BUSYBOX_DEFAULT_PARTPROBE is not set
-# CONFIG_BUSYBOX_DEFAULT_RAIDAUTORUN is not set
-# CONFIG_BUSYBOX_DEFAULT_READAHEAD is not set
-# CONFIG_BUSYBOX_DEFAULT_RFKILL is not set
-# CONFIG_BUSYBOX_DEFAULT_RUNLEVEL is not set
-# CONFIG_BUSYBOX_DEFAULT_RX is not set
-# CONFIG_BUSYBOX_DEFAULT_SETFATTR is not set
-# CONFIG_BUSYBOX_DEFAULT_SETSERIAL is not set
-CONFIG_BUSYBOX_DEFAULT_STRINGS=y
-CONFIG_BUSYBOX_DEFAULT_TIME=y
-# CONFIG_BUSYBOX_DEFAULT_TS is not set
-# CONFIG_BUSYBOX_DEFAULT_TTYSIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIATTACH is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIDETACH is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIMKVOL is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIRMVOL is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIRSVOL is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIUPDATEVOL is not set
-# CONFIG_BUSYBOX_DEFAULT_UBIRENAME is not set
-# CONFIG_BUSYBOX_DEFAULT_VOLNAME is not set
-# CONFIG_BUSYBOX_DEFAULT_WATCHDOG is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IPV6=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNIX_LOCAL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_IPV4_ADDRESS is not set
-CONFIG_BUSYBOX_DEFAULT_VERBOSE_RESOLUTION_ERRORS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TLS_SHA1 is not set
-# CONFIG_BUSYBOX_DEFAULT_ARP is not set
-# CONFIG_BUSYBOX_DEFAULT_ARPING is not set
-CONFIG_BUSYBOX_DEFAULT_BRCTL=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_FANCY=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_SHOW=y
-# CONFIG_BUSYBOX_DEFAULT_DNSD is not set
-# CONFIG_BUSYBOX_DEFAULT_ETHER_WAKE is not set
-# CONFIG_BUSYBOX_DEFAULT_FTPD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_WRITE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_AUTHENTICATION is not set
-# CONFIG_BUSYBOX_DEFAULT_FTPGET is not set
-# CONFIG_BUSYBOX_DEFAULT_FTPPUT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPGETPUT_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_HOSTNAME is not set
-# CONFIG_BUSYBOX_DEFAULT_DNSDOMAINNAME is not set
-# CONFIG_BUSYBOX_DEFAULT_HTTPD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_RANGES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SETUID is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_BASIC_AUTH is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_AUTH_MD5 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CGI is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ENCODE_URL_STR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ERROR_PAGES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_PROXY is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_GZIP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ETAG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_LAST_MODIFIED is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_DATE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ACL_IP is not set
-CONFIG_BUSYBOX_DEFAULT_IFCONFIG=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_STATUS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_SLIP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_HW=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_BROADCAST_PLUS=y
-# CONFIG_BUSYBOX_DEFAULT_IFENSLAVE is not set
-# CONFIG_BUSYBOX_DEFAULT_IFPLUGD is not set
-# CONFIG_BUSYBOX_DEFAULT_IFUP is not set
-# CONFIG_BUSYBOX_DEFAULT_IFDOWN is not set
-CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_IFSTATE_PATH=""
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV4 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV6 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_MAPPING is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
-# CONFIG_BUSYBOX_DEFAULT_INETD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_RPC is not set
-CONFIG_BUSYBOX_DEFAULT_IP=y
-# CONFIG_BUSYBOX_DEFAULT_IPADDR is not set
-# CONFIG_BUSYBOX_DEFAULT_IPLINK is not set
-# CONFIG_BUSYBOX_DEFAULT_IPROUTE is not set
-# CONFIG_BUSYBOX_DEFAULT_IPTUNNEL is not set
-# CONFIG_BUSYBOX_DEFAULT_IPRULE is not set
-# CONFIG_BUSYBOX_DEFAULT_IPNEIGH is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ADDRESS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_LINK=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ROUTE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ROUTE_DIR="/etc/iproute2"
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_TUNNEL is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RULE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_NEIGH=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RARE_PROTOCOLS is not set
-# CONFIG_BUSYBOX_DEFAULT_IPCALC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_FANCY is not set
-# CONFIG_BUSYBOX_DEFAULT_FAKEIDENTD is not set
-# CONFIG_BUSYBOX_DEFAULT_NAMEIF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NAMEIF_EXTENDED is not set
-# CONFIG_BUSYBOX_DEFAULT_NBDCLIENT is not set
-CONFIG_BUSYBOX_DEFAULT_NC=y
-# CONFIG_BUSYBOX_DEFAULT_NETCAT is not set
-# CONFIG_BUSYBOX_DEFAULT_NC_SERVER is not set
-# CONFIG_BUSYBOX_DEFAULT_NC_EXTRA is not set
-# CONFIG_BUSYBOX_DEFAULT_NC_110_COMPAT is not set
-CONFIG_BUSYBOX_DEFAULT_NETMSG=y
-CONFIG_BUSYBOX_DEFAULT_NETSTAT=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_WIDE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_PRG=y
-# CONFIG_BUSYBOX_DEFAULT_NSLOOKUP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_BIG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_NSLOOKUP_OPENWRT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NSLOOKUP_OPENWRT_LONG_OPTIONS is not set
-CONFIG_BUSYBOX_DEFAULT_NTPD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_SERVER=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_CONF is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_NTP_AUTH is not set
-CONFIG_BUSYBOX_DEFAULT_PING=y
-CONFIG_BUSYBOX_DEFAULT_PING6=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_PING=y
-# CONFIG_BUSYBOX_DEFAULT_PSCAN is not set
-CONFIG_BUSYBOX_DEFAULT_ROUTE=y
-# CONFIG_BUSYBOX_DEFAULT_SLATTACH is not set
-# CONFIG_BUSYBOX_DEFAULT_SSL_CLIENT is not set
-# CONFIG_BUSYBOX_DEFAULT_TC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TC_INGRESS is not set
-# CONFIG_BUSYBOX_DEFAULT_TCPSVD is not set
-# CONFIG_BUSYBOX_DEFAULT_UDPSVD is not set
-CONFIG_BUSYBOX_DEFAULT_TELNET=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_TTYPE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_AUTOLOGIN=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_WIDTH is not set
-CONFIG_BUSYBOX_DEFAULT_TELNETD=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_STANDALONE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_INETD_WAIT is not set
-CONFIG_BUSYBOX_DEFAULT_TFTP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_HPA_COMPAT is not set
-# CONFIG_BUSYBOX_DEFAULT_TFTPD is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_GET=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PUT=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_BLOCKSIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_TFTP_DEBUG is not set
-# CONFIG_BUSYBOX_DEFAULT_TLS is not set
-CONFIG_BUSYBOX_DEFAULT_TRACEROUTE=y
-CONFIG_BUSYBOX_DEFAULT_TRACEROUTE6=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_VERBOSE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_USE_ICMP is not set
-# CONFIG_BUSYBOX_DEFAULT_TUNCTL is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TUNCTL_UG is not set
-CONFIG_BUSYBOX_DEFAULT_VCONFIG=y
-# CONFIG_BUSYBOX_DEFAULT_WGET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_LONG_OPTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_STATUSBAR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_AUTHENTICATION is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_TIMEOUT is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_HTTPS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_OPENSSL is not set
-# CONFIG_BUSYBOX_DEFAULT_WHOIS is not set
-# CONFIG_BUSYBOX_DEFAULT_ZCIP is not set
-# CONFIG_BUSYBOX_DEFAULT_UDHCPD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set
-CONFIG_BUSYBOX_DEFAULT_DHCPD_LEASES_FILE=""
-# CONFIG_BUSYBOX_DEFAULT_DUMPLEASES is not set
-# CONFIG_BUSYBOX_DEFAULT_DHCPRELAY is not set
-CONFIG_BUSYBOX_DEFAULT_UDHCPC=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_ARPING is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_SANITIZEOPT is not set
-CONFIG_BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
-# CONFIG_BUSYBOX_DEFAULT_UDHCPC6 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC3646 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC4704 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC4833 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC6_RFC5970 is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_PORT is not set
-CONFIG_BUSYBOX_DEFAULT_UDHCP_DEBUG=0
-CONFIG_BUSYBOX_DEFAULT_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
-CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_RFC3397=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_8021Q is not set
-CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_UDHCPC_CMD_OPTIONS=""
-# CONFIG_BUSYBOX_DEFAULT_LPD is not set
-# CONFIG_BUSYBOX_DEFAULT_LPR is not set
-# CONFIG_BUSYBOX_DEFAULT_LPQ is not set
-# CONFIG_BUSYBOX_DEFAULT_MAKEMIME is not set
-# CONFIG_BUSYBOX_DEFAULT_POPMAILDIR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_POPMAILDIR_DELIVERY is not set
-# CONFIG_BUSYBOX_DEFAULT_REFORMIME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_REFORMIME_COMPAT is not set
-# CONFIG_BUSYBOX_DEFAULT_SENDMAIL is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_MIME_CHARSET=""
-CONFIG_BUSYBOX_DEFAULT_FREE=y
-# CONFIG_BUSYBOX_DEFAULT_FUSER is not set
-# CONFIG_BUSYBOX_DEFAULT_IOSTAT is not set
-CONFIG_BUSYBOX_DEFAULT_KILL=y
-CONFIG_BUSYBOX_DEFAULT_KILLALL=y
-# CONFIG_BUSYBOX_DEFAULT_KILLALL5 is not set
-# CONFIG_BUSYBOX_DEFAULT_LSOF is not set
-CONFIG_BUSYBOX_DEFAULT_MPSTAT=y
-# CONFIG_BUSYBOX_DEFAULT_NMETER is not set
-CONFIG_BUSYBOX_DEFAULT_PGREP=y
-# CONFIG_BUSYBOX_DEFAULT_PKILL is not set
-CONFIG_BUSYBOX_DEFAULT_PIDOF=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_SINGLE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_OMIT is not set
-# CONFIG_BUSYBOX_DEFAULT_PMAP is not set
-# CONFIG_BUSYBOX_DEFAULT_POWERTOP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_POWERTOP_INTERACTIVE is not set
-CONFIG_BUSYBOX_DEFAULT_PS=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_WIDE=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_LONG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_TIME is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_UNUSUAL_SYSTEMS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_ADDITIONAL_COLUMNS is not set
-# CONFIG_BUSYBOX_DEFAULT_PSTREE is not set
-# CONFIG_BUSYBOX_DEFAULT_PWDX is not set
-# CONFIG_BUSYBOX_DEFAULT_SMEMCAP is not set
-CONFIG_BUSYBOX_DEFAULT_BB_SYSCTL=y
-CONFIG_BUSYBOX_DEFAULT_TOP=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_INTERACTIVE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_CPU is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_DECIMALS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_PROCESS is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOPMEM is not set
-CONFIG_BUSYBOX_DEFAULT_UPTIME=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_UPTIME_UTMP_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_WATCH is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHOW_THREADS is not set
-# CONFIG_BUSYBOX_DEFAULT_CHPST is not set
-# CONFIG_BUSYBOX_DEFAULT_SETUIDGID is not set
-# CONFIG_BUSYBOX_DEFAULT_ENVUIDGID is not set
-# CONFIG_BUSYBOX_DEFAULT_ENVDIR is not set
-# CONFIG_BUSYBOX_DEFAULT_SOFTLIMIT is not set
-# CONFIG_BUSYBOX_DEFAULT_RUNSV is not set
-# CONFIG_BUSYBOX_DEFAULT_RUNSVDIR is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUNSVDIR_LOG is not set
-# CONFIG_BUSYBOX_DEFAULT_SV is not set
-CONFIG_BUSYBOX_DEFAULT_SV_DEFAULT_SERVICE_DIR=""
-# CONFIG_BUSYBOX_DEFAULT_SVC is not set
-# CONFIG_BUSYBOX_DEFAULT_SVOK is not set
-# CONFIG_BUSYBOX_DEFAULT_SVLOGD is not set
-# CONFIG_BUSYBOX_DEFAULT_CHCON is not set
-# CONFIG_BUSYBOX_DEFAULT_GETENFORCE is not set
-# CONFIG_BUSYBOX_DEFAULT_GETSEBOOL is not set
-# CONFIG_BUSYBOX_DEFAULT_LOAD_POLICY is not set
-# CONFIG_BUSYBOX_DEFAULT_MATCHPATHCON is not set
-# CONFIG_BUSYBOX_DEFAULT_RUNCON is not set
-# CONFIG_BUSYBOX_DEFAULT_SELINUXENABLED is not set
-# CONFIG_BUSYBOX_DEFAULT_SESTATUS is not set
-# CONFIG_BUSYBOX_DEFAULT_SETENFORCE is not set
-# CONFIG_BUSYBOX_DEFAULT_SETFILES is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFILES_CHECK_OPTION is not set
-# CONFIG_BUSYBOX_DEFAULT_RESTORECON is not set
-# CONFIG_BUSYBOX_DEFAULT_SETSEBOOL is not set
-CONFIG_BUSYBOX_DEFAULT_SH_IS_ASH=y
-# CONFIG_BUSYBOX_DEFAULT_SH_IS_HUSH is not set
-# CONFIG_BUSYBOX_DEFAULT_SH_IS_NONE is not set
-# CONFIG_BUSYBOX_DEFAULT_BASH_IS_ASH is not set
-# CONFIG_BUSYBOX_DEFAULT_BASH_IS_HUSH is not set
-CONFIG_BUSYBOX_DEFAULT_BASH_IS_NONE=y
-CONFIG_BUSYBOX_DEFAULT_SHELL_ASH=y
-CONFIG_BUSYBOX_DEFAULT_ASH=y
-# CONFIG_BUSYBOX_DEFAULT_ASH_OPTIMIZE_FOR_SIZE is not set
-CONFIG_BUSYBOX_DEFAULT_ASH_INTERNAL_GLOB=y
-CONFIG_BUSYBOX_DEFAULT_ASH_BASH_COMPAT=y
-# CONFIG_BUSYBOX_DEFAULT_ASH_BASH_SOURCE_CURDIR is not set
-# CONFIG_BUSYBOX_DEFAULT_ASH_BASH_NOT_FOUND_HOOK is not set
-CONFIG_BUSYBOX_DEFAULT_ASH_JOB_CONTROL=y
-CONFIG_BUSYBOX_DEFAULT_ASH_ALIAS=y
-# CONFIG_BUSYBOX_DEFAULT_ASH_RANDOM_SUPPORT is not set
-CONFIG_BUSYBOX_DEFAULT_ASH_EXPAND_PRMT=y
-# CONFIG_BUSYBOX_DEFAULT_ASH_IDLE_TIMEOUT is not set
-# CONFIG_BUSYBOX_DEFAULT_ASH_MAIL is not set
-CONFIG_BUSYBOX_DEFAULT_ASH_ECHO=y
-CONFIG_BUSYBOX_DEFAULT_ASH_PRINTF=y
-CONFIG_BUSYBOX_DEFAULT_ASH_TEST=y
-# CONFIG_BUSYBOX_DEFAULT_ASH_HELP is not set
-CONFIG_BUSYBOX_DEFAULT_ASH_GETOPTS=y
-CONFIG_BUSYBOX_DEFAULT_ASH_CMDCMD=y
-# CONFIG_BUSYBOX_DEFAULT_CTTYHACK is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH is not set
-# CONFIG_BUSYBOX_DEFAULT_SHELL_HUSH is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_BASH_COMPAT is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_BRACE_EXPANSION is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_LINENO_VAR is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_BASH_SOURCE_CURDIR is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_INTERACTIVE is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_SAVEHISTORY is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_JOB is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_TICK is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_IF is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_LOOPS is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_CASE is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_FUNCTIONS is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_LOCAL is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_RANDOM_SUPPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_MODE_X is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_ECHO is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_PRINTF is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_TEST is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_HELP is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_EXPORT is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_EXPORT_N is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_READONLY is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_KILL is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_WAIT is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_COMMAND is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_TRAP is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_TYPE is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_TIMES is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_READ is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_SET is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_UNSET is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_ULIMIT is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_UMASK is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_GETOPTS is not set
-# CONFIG_BUSYBOX_DEFAULT_HUSH_MEMLEAK is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH=y
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH_64=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_MATH_BASE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_STANDALONE is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_NOFORK=y
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_READ_FRAC is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_HISTFILESIZE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_EMBEDDED_SCRIPTS is not set
-# CONFIG_BUSYBOX_DEFAULT_KLOGD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_KLOGD_KLOGCTL is not set
-CONFIG_BUSYBOX_DEFAULT_LOGGER=y
-# CONFIG_BUSYBOX_DEFAULT_LOGREAD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOGREAD_REDUCED_LOCKING is not set
-# CONFIG_BUSYBOX_DEFAULT_SYSLOGD is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_ROTATE_LOGFILE is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_REMOTE_LOG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_DUP is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_CFG is not set
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG is not set
-CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0
-# CONFIG_BUSYBOX_DEFAULT_FEATURE_KMSG_SYSLOG is not set
-# CONFIG_PACKAGE_busybox-selinux is not set
-CONFIG_PACKAGE_ca-bundle=m
-# CONFIG_PACKAGE_ca-certificates is not set
-CONFIG_PACKAGE_dnsmasq=y
-# CONFIG_PACKAGE_dnsmasq-dhcpv6 is not set
-# CONFIG_PACKAGE_dnsmasq-full is not set
-CONFIG_PACKAGE_dropbear=y
-
-#
-# Configuration
-#
-CONFIG_DROPBEAR_CURVE25519=y
-# CONFIG_DROPBEAR_ECC is not set
-# CONFIG_DROPBEAR_ED25519 is not set
-CONFIG_DROPBEAR_CHACHA20POLY1305=y
-# CONFIG_DROPBEAR_ZLIB is not set
-CONFIG_DROPBEAR_DBCLIENT=y
-CONFIG_DROPBEAR_SCP=y
-# CONFIG_DROPBEAR_ASKPASS is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_ead is not set
-CONFIG_PACKAGE_firewall=y
-CONFIG_PACKAGE_fstools=y
-CONFIG_FSTOOLS_UBIFS_EXTROOT=y
-# CONFIG_FSTOOLS_OVL_MOUNT_FULL_ACCESS_TIME is not set
-# CONFIG_FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB is not set
-CONFIG_PACKAGE_fwtool=y
-CONFIG_PACKAGE_getrandom=y
-CONFIG_PACKAGE_jsonfilter=y
-# CONFIG_PACKAGE_libatomic is not set
-CONFIG_PACKAGE_libc=y
-CONFIG_PACKAGE_libgcc=y
-# CONFIG_PACKAGE_libgomp is not set
-CONFIG_PACKAGE_libpthread=y
-CONFIG_PACKAGE_librt=y
-# CONFIG_PACKAGE_libstdcpp is not set
-CONFIG_PACKAGE_logd=y
-CONFIG_PACKAGE_mtd=y
-CONFIG_PACKAGE_netifd=y
-# CONFIG_PACKAGE_nft-qos is not set
-# CONFIG_PACKAGE_om-watchdog is not set
-CONFIG_PACKAGE_openwrt-keyring=y
-CONFIG_PACKAGE_opkg=y
-CONFIG_PACKAGE_procd=y
-
-#
-# Configuration
-#
-# CONFIG_PROCD_SHOW_BOOT is not set
-# CONFIG_PROCD_ZRAM_TMPFS is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_procd-selinux is not set
-# CONFIG_PACKAGE_procd-ujail is not set
-# CONFIG_PACKAGE_procd-ujail-console is not set
-# CONFIG_PACKAGE_qos-scripts is not set
-# CONFIG_PACKAGE_refpolicy is not set
-# CONFIG_PACKAGE_resolveip is not set
-CONFIG_PACKAGE_rpcd=y
-CONFIG_PACKAGE_rpcd-mod-file=y
-CONFIG_PACKAGE_rpcd-mod-iwinfo=y
-# CONFIG_PACKAGE_rpcd-mod-rpcsys is not set
-# CONFIG_PACKAGE_selinux-policy is not set
-# CONFIG_PACKAGE_snapshot-tool is not set
-# CONFIG_PACKAGE_sqm-scripts is not set
-# CONFIG_PACKAGE_sqm-scripts-extra is not set
-CONFIG_PACKAGE_swconfig=y
-CONFIG_PACKAGE_ubox=y
-CONFIG_PACKAGE_ubus=y
-CONFIG_PACKAGE_ubusd=y
-# CONFIG_PACKAGE_ucert is not set
-# CONFIG_PACKAGE_ucert-full is not set
-CONFIG_PACKAGE_uci=y
-CONFIG_PACKAGE_urandom-seed=y
-CONFIG_PACKAGE_urngd=y
-CONFIG_PACKAGE_usign=y
-# CONFIG_PACKAGE_uxc is not set
-# CONFIG_PACKAGE_wireless-tools is not set
-# CONFIG_PACKAGE_zram-swap is not set
-# end of Base system
-
-#
-# Administration
-#
-
-#
-# Zabbix
-#
-# CONFIG_PACKAGE_zabbix-agentd is not set
-# CONFIG_PACKAGE_zabbix-agentd-gnutls is not set
-# CONFIG_PACKAGE_zabbix-agentd-openssl is not set
-# CONFIG_PACKAGE_zabbix-extra-mac80211 is not set
-# CONFIG_PACKAGE_zabbix-extra-network is not set
-# CONFIG_PACKAGE_zabbix-extra-wifi is not set
-# CONFIG_PACKAGE_zabbix-get is not set
-# CONFIG_PACKAGE_zabbix-get-gnutls is not set
-# CONFIG_PACKAGE_zabbix-get-openssl is not set
-# CONFIG_PACKAGE_zabbix-proxy is not set
-# CONFIG_PACKAGE_zabbix-proxy-gnutls is not set
-# CONFIG_PACKAGE_zabbix-proxy-openssl is not set
-# CONFIG_PACKAGE_zabbix-sender is not set
-# CONFIG_PACKAGE_zabbix-sender-gnutls is not set
-# CONFIG_PACKAGE_zabbix-sender-openssl is not set
-# CONFIG_PACKAGE_zabbix-server is not set
-
-#
-# Database Software
-#
-# CONFIG_ZABBIX_MYSQL is not set
-CONFIG_ZABBIX_POSTGRESQL=y
-# CONFIG_PACKAGE_zabbix-server-frontend is not set
-# CONFIG_PACKAGE_zabbix-server-gnutls is not set
-# CONFIG_PACKAGE_zabbix-server-openssl is not set
-# end of Zabbix
-
-#
-# openwisp
-#
-# CONFIG_PACKAGE_netjson-monitoring is not set
-# CONFIG_PACKAGE_openwisp-config is not set
-# CONFIG_PACKAGE_openwisp-monitoring is not set
-# end of openwisp
-
-# CONFIG_PACKAGE_atop is not set
-# CONFIG_PACKAGE_backuppc is not set
-# CONFIG_PACKAGE_debian-archive-keyring is not set
-# CONFIG_PACKAGE_debootstrap is not set
-# CONFIG_PACKAGE_gkrellmd is not set
-# CONFIG_PACKAGE_htop is not set
-# CONFIG_PACKAGE_ipmitool is not set
-# CONFIG_PACKAGE_monit is not set
-# CONFIG_PACKAGE_monit-nossl is not set
-# CONFIG_PACKAGE_muninlite is not set
-# CONFIG_PACKAGE_netatop is not set
-# CONFIG_PACKAGE_netdata is not set
-# CONFIG_PACKAGE_nyx is not set
-# CONFIG_PACKAGE_schroot is not set
-
-#
-# Configuration
-#
-# CONFIG_SCHROOT_BTRFS is not set
-# CONFIG_SCHROOT_LOOPBACK is not set
-# CONFIG_SCHROOT_LVM is not set
-# CONFIG_SCHROOT_UUID is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_sudo is not set
-# CONFIG_PACKAGE_syslog-ng is not set
-# end of Administration
-
-#
-# Boot Loaders
-#
-# CONFIG_PACKAGE_optee-mediatek is not set
-# end of Boot Loaders
-
-#
-# Development
-#
-
-#
-# Libraries
-#
-# CONFIG_PACKAGE_libncurses-dev is not set
-# CONFIG_PACKAGE_libxml2-dev is not set
-# CONFIG_PACKAGE_zlib-dev is not set
-# end of Libraries
-
-# CONFIG_PACKAGE_ar is not set
-# CONFIG_PACKAGE_autoconf is not set
-# CONFIG_PACKAGE_automake is not set
-# CONFIG_PACKAGE_binutils is not set
-# CONFIG_PACKAGE_delve is not set
-# CONFIG_PACKAGE_diffutils is not set
-# CONFIG_PACKAGE_gcc is not set
-# CONFIG_PACKAGE_gdb is not set
-# CONFIG_PACKAGE_gdbserver is not set
-# CONFIG_PACKAGE_gitlab-runner is not set
-# CONFIG_PACKAGE_libtool-bin is not set
-# CONFIG_PACKAGE_lpc21isp is not set
-# CONFIG_PACKAGE_lttng-tools is not set
-# CONFIG_PACKAGE_m4 is not set
-# CONFIG_PACKAGE_make is not set
-# CONFIG_PACKAGE_meson is not set
-CONFIG_PACKAGE_mt76-test=y
-# CONFIG_PACKAGE_mt76-vendor is not set
-# CONFIG_PACKAGE_mwctl is not set
-# CONFIG_PACKAGE_ninja is not set
-CONFIG_PACKAGE_objdump=y
-# CONFIG_PACKAGE_packr is not set
-# CONFIG_PACKAGE_patch is not set
-CONFIG_PACKAGE_perf=y
-# CONFIG_PACKAGE_pkg-config is not set
-# CONFIG_PACKAGE_pkgconf is not set
-# CONFIG_PACKAGE_trace-cmd is not set
-# CONFIG_PACKAGE_trace-cmd-extra is not set
-# CONFIG_PACKAGE_valgrind is not set
-# end of Development
-
-#
-# Extra packages
-#
-# CONFIG_PACKAGE_jose is not set
-CONFIG_PACKAGE_libiwinfo-data=y
-# CONFIG_PACKAGE_libjose is not set
-# CONFIG_PACKAGE_nginx is not set
-# CONFIG_PACKAGE_nginx-mod-luci-ssl is not set
-# CONFIG_PACKAGE_nginx-util is not set
-# CONFIG_PACKAGE_tang is not set
-# end of Extra packages
-
-#
-# Firmware
-#
-
-#
-# ath10k Board-Specific Overrides
-#
-# end of ath10k Board-Specific Overrides
-
-# CONFIG_PACKAGE_aircard-pcmcia-firmware is not set
-# CONFIG_PACKAGE_amdgpu-firmware is not set
-# CONFIG_PACKAGE_ar3k-firmware is not set
-# CONFIG_PACKAGE_ath10k-board-qca4019 is not set
-# CONFIG_PACKAGE_ath10k-board-qca9377 is not set
-# CONFIG_PACKAGE_ath10k-board-qca9887 is not set
-# CONFIG_PACKAGE_ath10k-board-qca9888 is not set
-# CONFIG_PACKAGE_ath10k-board-qca988x is not set
-# CONFIG_PACKAGE_ath10k-board-qca9984 is not set
-# CONFIG_PACKAGE_ath10k-board-qca99x0 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca4019 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca4019-ct-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca6174 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9377 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9887 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9887-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9887-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9888 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9888-ct-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca988x is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca988x-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca988x-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9984 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca9984-ct-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca99x0 is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct-full-htt is not set
-# CONFIG_PACKAGE_ath10k-firmware-qca99x0-ct-htt is not set
-# CONFIG_PACKAGE_ath6k-firmware is not set
-# CONFIG_PACKAGE_ath9k-htc-firmware is not set
-# CONFIG_PACKAGE_b43legacy-firmware is not set
-# CONFIG_PACKAGE_bnx2-firmware is not set
-# CONFIG_PACKAGE_bnx2x-firmware is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-4329-sdio is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43430-sdio-rpi-3b is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43430-sdio-rpi-zero-w is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43430a0-sdio is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43455-sdio-rpi-3b-plus is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43455-sdio-rpi-4b is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-43602a1-pcie is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-4366b1-pcie is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-4366c0-pcie is not set
-# CONFIG_PACKAGE_brcmfmac-firmware-usb is not set
-# CONFIG_PACKAGE_brcmsmac-firmware is not set
-# CONFIG_PACKAGE_carl9170-firmware is not set
-# CONFIG_PACKAGE_cypress-firmware-43012-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-43340-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-43362-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-4339-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-43430-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-43455-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-4354-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-4356-pcie is not set
-# CONFIG_PACKAGE_cypress-firmware-4356-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-43570-pcie is not set
-# CONFIG_PACKAGE_cypress-firmware-4373-sdio is not set
-# CONFIG_PACKAGE_cypress-firmware-4373-usb is not set
-# CONFIG_PACKAGE_cypress-firmware-54591-pcie is not set
-# CONFIG_PACKAGE_e100-firmware is not set
-# CONFIG_PACKAGE_edgeport-firmware is not set
-# CONFIG_PACKAGE_eip197-mini-firmware is not set
-# CONFIG_PACKAGE_ibt-firmware is not set
-# CONFIG_PACKAGE_iwl3945-firmware is not set
-# CONFIG_PACKAGE_iwl4965-firmware is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl100 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl1000 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl105 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl135 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl2000 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl2030 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl3160 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl3168 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl5000 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl5150 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2a is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl6000g2b is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl6050 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl7260 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl7265 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl7265d is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl8260c is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl8265 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl9000 is not set
-# CONFIG_PACKAGE_iwlwifi-firmware-iwl9260 is not set
-# CONFIG_PACKAGE_libertas-sdio-firmware is not set
-# CONFIG_PACKAGE_libertas-spi-firmware is not set
-# CONFIG_PACKAGE_libertas-usb-firmware is not set
-# CONFIG_PACKAGE_mt7601u-firmware is not set
-# CONFIG_PACKAGE_mt7622bt-firmware is not set
-# CONFIG_PACKAGE_mwifiex-pcie-firmware is not set
-# CONFIG_PACKAGE_mwifiex-sdio-firmware is not set
-# CONFIG_PACKAGE_mwl8k-firmware is not set
-# CONFIG_PACKAGE_p54-pci-firmware is not set
-# CONFIG_PACKAGE_p54-spi-firmware is not set
-# CONFIG_PACKAGE_p54-usb-firmware is not set
-# CONFIG_PACKAGE_prism54-firmware is not set
-# CONFIG_PACKAGE_r8169-firmware is not set
-# CONFIG_PACKAGE_radeon-firmware is not set
-# CONFIG_PACKAGE_rs9113-firmware is not set
-# CONFIG_PACKAGE_rt2800-pci-firmware is not set
-# CONFIG_PACKAGE_rt2800-usb-firmware is not set
-# CONFIG_PACKAGE_rt61-pci-firmware is not set
-# CONFIG_PACKAGE_rt73-usb-firmware is not set
-# CONFIG_PACKAGE_rtl8188eu-firmware is not set
-# CONFIG_PACKAGE_rtl8192ce-firmware is not set
-# CONFIG_PACKAGE_rtl8192cu-firmware is not set
-# CONFIG_PACKAGE_rtl8192de-firmware is not set
-# CONFIG_PACKAGE_rtl8192eu-firmware is not set
-# CONFIG_PACKAGE_rtl8192se-firmware is not set
-# CONFIG_PACKAGE_rtl8192su-firmware is not set
-# CONFIG_PACKAGE_rtl8723au-firmware is not set
-# CONFIG_PACKAGE_rtl8723bu-firmware is not set
-# CONFIG_PACKAGE_rtl8821ae-firmware is not set
-# CONFIG_PACKAGE_rtl8822be-firmware is not set
-# CONFIG_PACKAGE_rtl8822ce-firmware is not set
-# CONFIG_PACKAGE_ti-3410-firmware is not set
-# CONFIG_PACKAGE_ti-5052-firmware is not set
-# CONFIG_PACKAGE_wil6210-firmware is not set
-CONFIG_PACKAGE_wireless-regdb=y
-# CONFIG_PACKAGE_wl12xx-firmware is not set
-# CONFIG_PACKAGE_wl18xx-firmware is not set
-# end of Firmware
-
-#
-# Fonts
-#
-
-#
-# DejaVu
-#
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuMathTeXGyre is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSans is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSans-Bold is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSans-BoldOblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSans-ExtraLight is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSans-Oblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansCondensed is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansCondensed-Bold is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansCondensed-BoldOblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansCondensed-Oblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansMono is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansMono-Bold is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansMono-BoldOblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSansMono-Oblique is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerif is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerif-Bold is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerif-BoldItalic is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerif-Italic is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerifCondensed is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerifCondensed-Bold is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerifCondensed-BoldItalic is not set
-# CONFIG_PACKAGE_dejavu-fonts-ttf-DejaVuSerifCondensed-Italic is not set
-# end of DejaVu
-# end of Fonts
-
-#
-# Kernel modules
-#
-
-#
-# Block Devices
-#
-# CONFIG_PACKAGE_kmod-aoe is not set
-# CONFIG_PACKAGE_kmod-ata-ahci is not set
-# CONFIG_PACKAGE_kmod-ata-artop is not set
-# CONFIG_PACKAGE_kmod-ata-core is not set
-# CONFIG_PACKAGE_kmod-ata-marvell-sata is not set
-# CONFIG_PACKAGE_kmod-ata-nvidia-sata is not set
-# CONFIG_PACKAGE_kmod-ata-pdc202xx-old is not set
-# CONFIG_PACKAGE_kmod-ata-piix is not set
-# CONFIG_PACKAGE_kmod-ata-sil is not set
-# CONFIG_PACKAGE_kmod-ata-sil24 is not set
-# CONFIG_PACKAGE_kmod-ata-via-sata is not set
-# CONFIG_PACKAGE_kmod-block2mtd is not set
-# CONFIG_PACKAGE_kmod-dax is not set
-# CONFIG_PACKAGE_kmod-dm is not set
-# CONFIG_PACKAGE_kmod-dm-raid is not set
-# CONFIG_PACKAGE_kmod-iosched-bfq is not set
-# CONFIG_PACKAGE_kmod-iscsi-initiator is not set
-# CONFIG_PACKAGE_kmod-loop is not set
-# CONFIG_PACKAGE_kmod-md-mod is not set
-# CONFIG_PACKAGE_kmod-nbd is not set
-# CONFIG_PACKAGE_kmod-nvme is not set
-# CONFIG_PACKAGE_kmod-scsi-cdrom is not set
-CONFIG_PACKAGE_kmod-scsi-core=y
-# CONFIG_PACKAGE_kmod-scsi-generic is not set
-# CONFIG_PACKAGE_kmod-scsi-tape is not set
-# end of Block Devices
-
-#
-# CAN Support
-#
-# CONFIG_PACKAGE_kmod-can is not set
-# end of CAN Support
-
-#
-# Cryptographic API modules
-#
-CONFIG_PACKAGE_kmod-crypto-aead=y
-# CONFIG_PACKAGE_kmod-crypto-arc4 is not set
-# CONFIG_PACKAGE_kmod-crypto-authenc is not set
-# CONFIG_PACKAGE_kmod-crypto-cbc is not set
-CONFIG_PACKAGE_kmod-crypto-ccm=y
-CONFIG_PACKAGE_kmod-crypto-cmac=y
-CONFIG_PACKAGE_kmod-crypto-crc32=m
-CONFIG_PACKAGE_kmod-crypto-crc32c=m
-CONFIG_PACKAGE_kmod-crypto-ctr=y
-# CONFIG_PACKAGE_kmod-crypto-cts is not set
-# CONFIG_PACKAGE_kmod-crypto-deflate is not set
-# CONFIG_PACKAGE_kmod-crypto-des is not set
-# CONFIG_PACKAGE_kmod-crypto-ecb is not set
-# CONFIG_PACKAGE_kmod-crypto-ecdh is not set
-# CONFIG_PACKAGE_kmod-crypto-echainiv is not set
-# CONFIG_PACKAGE_kmod-crypto-eip197 is not set
-# CONFIG_PACKAGE_kmod-crypto-fcrypt is not set
-CONFIG_PACKAGE_kmod-crypto-gcm=y
-CONFIG_PACKAGE_kmod-crypto-gf128=y
-CONFIG_PACKAGE_kmod-crypto-ghash=y
-CONFIG_PACKAGE_kmod-crypto-hash=y
-CONFIG_PACKAGE_kmod-crypto-hmac=y
-# CONFIG_PACKAGE_kmod-crypto-hw-geode is not set
-# CONFIG_PACKAGE_kmod-crypto-hw-hifn-795x is not set
-# CONFIG_PACKAGE_kmod-crypto-hw-padlock is not set
-# CONFIG_PACKAGE_kmod-crypto-hw-talitos is not set
-# CONFIG_PACKAGE_kmod-crypto-kpp is not set
-CONFIG_PACKAGE_kmod-crypto-manager=y
-# CONFIG_PACKAGE_kmod-crypto-md4 is not set
-# CONFIG_PACKAGE_kmod-crypto-md5 is not set
-# CONFIG_PACKAGE_kmod-crypto-michael-mic is not set
-# CONFIG_PACKAGE_kmod-crypto-misc is not set
-CONFIG_PACKAGE_kmod-crypto-null=y
-# CONFIG_PACKAGE_kmod-crypto-pcbc is not set
-CONFIG_PACKAGE_kmod-crypto-pcompress=y
-# CONFIG_PACKAGE_kmod-crypto-rmd160 is not set
-CONFIG_PACKAGE_kmod-crypto-rng=y
-CONFIG_PACKAGE_kmod-crypto-seqiv=y
-# CONFIG_PACKAGE_kmod-crypto-sha1 is not set
-CONFIG_PACKAGE_kmod-crypto-sha256=y
-# CONFIG_PACKAGE_kmod-crypto-sha512 is not set
-# CONFIG_PACKAGE_kmod-crypto-test is not set
-# CONFIG_PACKAGE_kmod-crypto-user is not set
-# CONFIG_PACKAGE_kmod-crypto-wq is not set
-# CONFIG_PACKAGE_kmod-crypto-xcbc is not set
-# CONFIG_PACKAGE_kmod-crypto-xts is not set
-# CONFIG_PACKAGE_kmod-cryptodev is not set
-# end of Cryptographic API modules
-
-#
-# Filesystems
-#
-# CONFIG_PACKAGE_kmod-fs-9p is not set
-# CONFIG_PACKAGE_kmod-fs-afs is not set
-# CONFIG_PACKAGE_kmod-fs-antfs is not set
-# CONFIG_PACKAGE_kmod-fs-autofs4 is not set
-# CONFIG_PACKAGE_kmod-fs-btrfs is not set
-# CONFIG_PACKAGE_kmod-fs-cifs is not set
-# CONFIG_PACKAGE_kmod-fs-configfs is not set
-# CONFIG_PACKAGE_kmod-fs-cramfs is not set
-# CONFIG_PACKAGE_kmod-fs-exfat is not set
-# CONFIG_PACKAGE_kmod-fs-exportfs is not set
-CONFIG_PACKAGE_kmod-fs-ext4=m
-CONFIG_PACKAGE_kmod-fs-f2fs=m
-# CONFIG_PACKAGE_kmod-fs-fscache is not set
-# CONFIG_PACKAGE_kmod-fs-hfs is not set
-# CONFIG_PACKAGE_kmod-fs-hfsplus is not set
-# CONFIG_PACKAGE_kmod-fs-isofs is not set
-# CONFIG_PACKAGE_kmod-fs-jfs is not set
-# CONFIG_PACKAGE_kmod-fs-ksmbd is not set
-# CONFIG_PACKAGE_kmod-fs-minix is not set
-# CONFIG_PACKAGE_kmod-fs-msdos is not set
-# CONFIG_PACKAGE_kmod-fs-nfs is not set
-# CONFIG_PACKAGE_kmod-fs-nfs-common is not set
-# CONFIG_PACKAGE_kmod-fs-nfs-common-rpcsec is not set
-# CONFIG_PACKAGE_kmod-fs-nfs-v3 is not set
-# CONFIG_PACKAGE_kmod-fs-nfs-v4 is not set
-# CONFIG_PACKAGE_kmod-fs-nfsd is not set
-# CONFIG_PACKAGE_kmod-fs-ntfs is not set
-# CONFIG_PACKAGE_kmod-fs-reiserfs is not set
-# CONFIG_PACKAGE_kmod-fs-squashfs is not set
-# CONFIG_PACKAGE_kmod-fs-udf is not set
-CONFIG_PACKAGE_kmod-fs-vfat=m
-# CONFIG_PACKAGE_kmod-fs-xfs is not set
-# CONFIG_PACKAGE_kmod-fuse is not set
-# end of Filesystems
-
-#
-# FireWire support
-#
-# CONFIG_PACKAGE_kmod-firewire is not set
-# end of FireWire support
-
-#
-# Hardware Monitoring Support
-#
-# CONFIG_PACKAGE_kmod-gl-mifi-mcu is not set
-# CONFIG_PACKAGE_kmod-hwmon-ad7418 is not set
-# CONFIG_PACKAGE_kmod-hwmon-adcxx is not set
-# CONFIG_PACKAGE_kmod-hwmon-ads1015 is not set
-# CONFIG_PACKAGE_kmod-hwmon-adt7410 is not set
-# CONFIG_PACKAGE_kmod-hwmon-adt7475 is not set
-CONFIG_PACKAGE_kmod-hwmon-core=y
-# CONFIG_PACKAGE_kmod-hwmon-dme1737 is not set
-# CONFIG_PACKAGE_kmod-hwmon-drivetemp is not set
-# CONFIG_PACKAGE_kmod-hwmon-gpiofan is not set
-# CONFIG_PACKAGE_kmod-hwmon-ina209 is not set
-# CONFIG_PACKAGE_kmod-hwmon-ina2xx is not set
-# CONFIG_PACKAGE_kmod-hwmon-it87 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm63 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm75 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm77 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm85 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm90 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm92 is not set
-# CONFIG_PACKAGE_kmod-hwmon-lm95241 is not set
-# CONFIG_PACKAGE_kmod-hwmon-ltc4151 is not set
-# CONFIG_PACKAGE_kmod-hwmon-mcp3021 is not set
-# CONFIG_PACKAGE_kmod-hwmon-pwmfan is not set
-# CONFIG_PACKAGE_kmod-hwmon-sch5627 is not set
-# CONFIG_PACKAGE_kmod-hwmon-sht21 is not set
-# CONFIG_PACKAGE_kmod-hwmon-tmp102 is not set
-# CONFIG_PACKAGE_kmod-hwmon-tmp103 is not set
-# CONFIG_PACKAGE_kmod-hwmon-tmp421 is not set
-# CONFIG_PACKAGE_kmod-hwmon-vid is not set
-# CONFIG_PACKAGE_kmod-hwmon-w83793 is not set
-# CONFIG_PACKAGE_kmod-pmbus-core is not set
-# CONFIG_PACKAGE_kmod-pmbus-zl6100 is not set
-# end of Hardware Monitoring Support
-
-#
-# I2C support
-#
-# CONFIG_PACKAGE_kmod-i2c-algo-bit is not set
-# CONFIG_PACKAGE_kmod-i2c-algo-pca is not set
-# CONFIG_PACKAGE_kmod-i2c-algo-pcf is not set
-# CONFIG_PACKAGE_kmod-i2c-core is not set
-# CONFIG_PACKAGE_kmod-i2c-gpio is not set
-# CONFIG_PACKAGE_kmod-i2c-mux is not set
-# CONFIG_PACKAGE_kmod-i2c-mux-gpio is not set
-# CONFIG_PACKAGE_kmod-i2c-mux-pca9541 is not set
-# CONFIG_PACKAGE_kmod-i2c-mux-pca954x is not set
-# CONFIG_PACKAGE_kmod-i2c-pxa is not set
-# CONFIG_PACKAGE_kmod-i2c-smbus is not set
-# CONFIG_PACKAGE_kmod-i2c-tiny-usb is not set
-# end of I2C support
-
-#
-# Industrial I/O Modules
-#
-# CONFIG_PACKAGE_kmod-iio-ad799x is not set
-# CONFIG_PACKAGE_kmod-iio-am2315 is not set
-# CONFIG_PACKAGE_kmod-iio-bh1750 is not set
-# CONFIG_PACKAGE_kmod-iio-bme680 is not set
-# CONFIG_PACKAGE_kmod-iio-bme680-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-bme680-spi is not set
-# CONFIG_PACKAGE_kmod-iio-bmp280 is not set
-# CONFIG_PACKAGE_kmod-iio-bmp280-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-bmp280-spi is not set
-# CONFIG_PACKAGE_kmod-iio-ccs811 is not set
-# CONFIG_PACKAGE_kmod-iio-core is not set
-# CONFIG_PACKAGE_kmod-iio-dht11 is not set
-# CONFIG_PACKAGE_kmod-iio-fxas21002c is not set
-# CONFIG_PACKAGE_kmod-iio-fxas21002c-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-fxas21002c-spi is not set
-# CONFIG_PACKAGE_kmod-iio-fxos8700 is not set
-# CONFIG_PACKAGE_kmod-iio-fxos8700-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-fxos8700-spi is not set
-# CONFIG_PACKAGE_kmod-iio-hmc5843 is not set
-# CONFIG_PACKAGE_kmod-iio-htu21 is not set
-# CONFIG_PACKAGE_kmod-iio-kfifo-buf is not set
-# CONFIG_PACKAGE_kmod-iio-lsm6dsx is not set
-# CONFIG_PACKAGE_kmod-iio-lsm6dsx-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-lsm6dsx-spi is not set
-# CONFIG_PACKAGE_kmod-iio-si7020 is not set
-# CONFIG_PACKAGE_kmod-iio-sps30 is not set
-# CONFIG_PACKAGE_kmod-iio-st_accel is not set
-# CONFIG_PACKAGE_kmod-iio-st_accel-i2c is not set
-# CONFIG_PACKAGE_kmod-iio-st_accel-spi is not set
-# CONFIG_PACKAGE_kmod-iio-tsl4531 is not set
-# CONFIG_PACKAGE_kmod-industrialio-triggered-buffer is not set
-# end of Industrial I/O Modules
-
-#
-# Input modules
-#
-# CONFIG_PACKAGE_kmod-hid is not set
-# CONFIG_PACKAGE_kmod-hid-generic is not set
-# CONFIG_PACKAGE_kmod-input-core is not set
-# CONFIG_PACKAGE_kmod-input-evdev is not set
-# CONFIG_PACKAGE_kmod-input-gpio-encoder is not set
-# CONFIG_PACKAGE_kmod-input-gpio-keys is not set
-# CONFIG_PACKAGE_kmod-input-gpio-keys-polled is not set
-# CONFIG_PACKAGE_kmod-input-joydev is not set
-# CONFIG_PACKAGE_kmod-input-matrixkmap is not set
-# CONFIG_PACKAGE_kmod-input-polldev is not set
-# CONFIG_PACKAGE_kmod-input-touchscreen-ads7846 is not set
-# CONFIG_PACKAGE_kmod-input-uinput is not set
-# end of Input modules
-
-#
-# LED modules
-#
-CONFIG_PACKAGE_kmod-leds-gpio=y
-# CONFIG_PACKAGE_kmod-leds-pca963x is not set
-# CONFIG_PACKAGE_kmod-leds-uleds is not set
-# CONFIG_PACKAGE_kmod-ledtrig-activity is not set
-# CONFIG_PACKAGE_kmod-ledtrig-gpio is not set
-# CONFIG_PACKAGE_kmod-ledtrig-oneshot is not set
-# CONFIG_PACKAGE_kmod-ledtrig-pattern is not set
-# CONFIG_PACKAGE_kmod-ledtrig-transient is not set
-# end of LED modules
-
-#
-# Libraries
-#
-# CONFIG_PACKAGE_kmod-lib-cordic is not set
-CONFIG_PACKAGE_kmod-lib-crc-ccitt=y
-# CONFIG_PACKAGE_kmod-lib-crc-itu-t is not set
-CONFIG_PACKAGE_kmod-lib-crc16=m
-# CONFIG_PACKAGE_kmod-lib-crc32c is not set
-# CONFIG_PACKAGE_kmod-lib-crc7 is not set
-# CONFIG_PACKAGE_kmod-lib-crc8 is not set
-# CONFIG_PACKAGE_kmod-lib-lz4 is not set
-# CONFIG_PACKAGE_kmod-lib-textsearch is not set
-# CONFIG_PACKAGE_kmod-lib-zstd is not set
-# end of Libraries
-
-#
-# Native Language Support
-#
-CONFIG_PACKAGE_kmod-nls-base=y
-# CONFIG_PACKAGE_kmod-nls-cp1250 is not set
-# CONFIG_PACKAGE_kmod-nls-cp1251 is not set
-CONFIG_PACKAGE_kmod-nls-cp437=m
-# CONFIG_PACKAGE_kmod-nls-cp775 is not set
-# CONFIG_PACKAGE_kmod-nls-cp850 is not set
-# CONFIG_PACKAGE_kmod-nls-cp852 is not set
-# CONFIG_PACKAGE_kmod-nls-cp862 is not set
-# CONFIG_PACKAGE_kmod-nls-cp864 is not set
-# CONFIG_PACKAGE_kmod-nls-cp866 is not set
-# CONFIG_PACKAGE_kmod-nls-cp932 is not set
-# CONFIG_PACKAGE_kmod-nls-cp936 is not set
-# CONFIG_PACKAGE_kmod-nls-cp950 is not set
-CONFIG_PACKAGE_kmod-nls-iso8859-1=m
-# CONFIG_PACKAGE_kmod-nls-iso8859-13 is not set
-# CONFIG_PACKAGE_kmod-nls-iso8859-15 is not set
-# CONFIG_PACKAGE_kmod-nls-iso8859-2 is not set
-# CONFIG_PACKAGE_kmod-nls-iso8859-6 is not set
-# CONFIG_PACKAGE_kmod-nls-iso8859-8 is not set
-# CONFIG_PACKAGE_kmod-nls-koi8r is not set
-CONFIG_PACKAGE_kmod-nls-utf8=m
-# end of Native Language Support
-
-#
-# Netfilter Extensions
-#
-# CONFIG_PACKAGE_kmod-arptables is not set
-# CONFIG_PACKAGE_kmod-br-netfilter is not set
-# CONFIG_PACKAGE_kmod-ebtables is not set
-# CONFIG_PACKAGE_kmod-ebtables-ipv4 is not set
-# CONFIG_PACKAGE_kmod-ebtables-ipv6 is not set
-# CONFIG_PACKAGE_kmod-ebtables-watchers is not set
-CONFIG_PACKAGE_kmod-ip6tables=y
-# CONFIG_PACKAGE_kmod-ip6tables-extra is not set
-# CONFIG_PACKAGE_kmod-ipt-account is not set
-# CONFIG_PACKAGE_kmod-ipt-chaos is not set
-# CONFIG_PACKAGE_kmod-ipt-checksum is not set
-# CONFIG_PACKAGE_kmod-ipt-cluster is not set
-# CONFIG_PACKAGE_kmod-ipt-clusterip is not set
-# CONFIG_PACKAGE_kmod-ipt-compat-xtables is not set
-# CONFIG_PACKAGE_kmod-ipt-condition is not set
-CONFIG_PACKAGE_kmod-ipt-conntrack=y
-# CONFIG_PACKAGE_kmod-ipt-conntrack-extra is not set
-# CONFIG_PACKAGE_kmod-ipt-conntrack-label is not set
-# CONFIG_PACKAGE_kmod-ipt-coova is not set
-CONFIG_PACKAGE_kmod-ipt-core=y
-# CONFIG_PACKAGE_kmod-ipt-debug is not set
-# CONFIG_PACKAGE_kmod-ipt-delude is not set
-# CONFIG_PACKAGE_kmod-ipt-dhcpmac is not set
-# CONFIG_PACKAGE_kmod-ipt-dnetmap is not set
-# CONFIG_PACKAGE_kmod-ipt-extra is not set
-# CONFIG_PACKAGE_kmod-ipt-filter is not set
-# CONFIG_PACKAGE_kmod-ipt-fuzzy is not set
-# CONFIG_PACKAGE_kmod-ipt-geoip is not set
-# CONFIG_PACKAGE_kmod-ipt-hashlimit is not set
-# CONFIG_PACKAGE_kmod-ipt-iface is not set
-# CONFIG_PACKAGE_kmod-ipt-ipmark is not set
-# CONFIG_PACKAGE_kmod-ipt-ipopt is not set
-# CONFIG_PACKAGE_kmod-ipt-ipp2p is not set
-# CONFIG_PACKAGE_kmod-ipt-iprange is not set
-# CONFIG_PACKAGE_kmod-ipt-ipsec is not set
-# CONFIG_PACKAGE_kmod-ipt-ipset is not set
-# CONFIG_PACKAGE_kmod-ipt-ipv4options is not set
-# CONFIG_PACKAGE_kmod-ipt-led is not set
-# CONFIG_PACKAGE_kmod-ipt-length2 is not set
-# CONFIG_PACKAGE_kmod-ipt-logmark is not set
-# CONFIG_PACKAGE_kmod-ipt-lscan is not set
-# CONFIG_PACKAGE_kmod-ipt-lua is not set
-CONFIG_PACKAGE_kmod-ipt-nat=y
-# CONFIG_PACKAGE_kmod-ipt-nat-extra is not set
-# CONFIG_PACKAGE_kmod-ipt-nat6 is not set
-# CONFIG_PACKAGE_kmod-ipt-nathelper-rtsp is not set
-# CONFIG_PACKAGE_kmod-ipt-nflog is not set
-# CONFIG_PACKAGE_kmod-ipt-nfqueue is not set
-CONFIG_PACKAGE_kmod-ipt-offload=y
-# CONFIG_PACKAGE_kmod-ipt-physdev is not set
-# CONFIG_PACKAGE_kmod-ipt-proto is not set
-# CONFIG_PACKAGE_kmod-ipt-psd is not set
-# CONFIG_PACKAGE_kmod-ipt-quota2 is not set
-# CONFIG_PACKAGE_kmod-ipt-raw is not set
-# CONFIG_PACKAGE_kmod-ipt-raw6 is not set
-# CONFIG_PACKAGE_kmod-ipt-rpfilter is not set
-# CONFIG_PACKAGE_kmod-ipt-sysrq is not set
-# CONFIG_PACKAGE_kmod-ipt-tarpit is not set
-# CONFIG_PACKAGE_kmod-ipt-tee is not set
-# CONFIG_PACKAGE_kmod-ipt-tproxy is not set
-# CONFIG_PACKAGE_kmod-ipt-u32 is not set
-# CONFIG_PACKAGE_kmod-netatop is not set
-CONFIG_PACKAGE_kmod-nf-conntrack=y
-# CONFIG_PACKAGE_kmod-nf-conntrack-netlink is not set
-CONFIG_PACKAGE_kmod-nf-conntrack6=y
-CONFIG_PACKAGE_kmod-nf-flow=y
-# CONFIG_PACKAGE_kmod-nf-flow-netlink is not set
-CONFIG_PACKAGE_kmod-nf-ipt=y
-CONFIG_PACKAGE_kmod-nf-ipt6=y
-# CONFIG_PACKAGE_kmod-nf-ipvs is not set
-CONFIG_PACKAGE_kmod-nf-nat=y
-# CONFIG_PACKAGE_kmod-nf-nat6 is not set
-# CONFIG_PACKAGE_kmod-nf-nathelper is not set
-# CONFIG_PACKAGE_kmod-nf-nathelper-extra is not set
-CONFIG_PACKAGE_kmod-nf-reject=y
-CONFIG_PACKAGE_kmod-nf-reject6=y
-# CONFIG_PACKAGE_kmod-nfnetlink is not set
-# CONFIG_PACKAGE_kmod-nfnetlink-log is not set
-# CONFIG_PACKAGE_kmod-nfnetlink-queue is not set
-# CONFIG_PACKAGE_kmod-nft-arp is not set
-# CONFIG_PACKAGE_kmod-nft-bridge is not set
-# CONFIG_PACKAGE_kmod-nft-core is not set
-# CONFIG_PACKAGE_kmod-nft-fib is not set
-# CONFIG_PACKAGE_kmod-nft-nat is not set
-# CONFIG_PACKAGE_kmod-nft-nat6 is not set
-# CONFIG_PACKAGE_kmod-nft-netdev is not set
-# CONFIG_PACKAGE_kmod-nft-offload is not set
-# CONFIG_PACKAGE_kmod-nft-queue is not set
-# end of Netfilter Extensions
-
-#
-# Network Devices
-#
-# CONFIG_PACKAGE_kmod-3c59x is not set
-# CONFIG_PACKAGE_kmod-8139cp is not set
-# CONFIG_PACKAGE_kmod-8139too is not set
-# CONFIG_PACKAGE_kmod-alx is not set
-# CONFIG_PACKAGE_kmod-aquantia_aqtion is not set
-# CONFIG_PACKAGE_kmod-atl1 is not set
-# CONFIG_PACKAGE_kmod-atl1c is not set
-# CONFIG_PACKAGE_kmod-atl1e is not set
-# CONFIG_PACKAGE_kmod-atl2 is not set
-# CONFIG_PACKAGE_kmod-b44 is not set
-# CONFIG_PACKAGE_kmod-be2net is not set
-# CONFIG_PACKAGE_kmod-bnx2 is not set
-# CONFIG_PACKAGE_kmod-bnx2x is not set
-# CONFIG_PACKAGE_kmod-dm9000 is not set
-# CONFIG_PACKAGE_kmod-dummy is not set
-# CONFIG_PACKAGE_kmod-e100 is not set
-# CONFIG_PACKAGE_kmod-e1000 is not set
-# CONFIG_PACKAGE_kmod-et131x is not set
-# CONFIG_PACKAGE_kmod-ethoc is not set
-# CONFIG_PACKAGE_kmod-forcedeth is not set
-# CONFIG_PACKAGE_kmod-hfcmulti is not set
-# CONFIG_PACKAGE_kmod-hfcpci is not set
-# CONFIG_PACKAGE_kmod-i40e is not set
-# CONFIG_PACKAGE_kmod-iavf is not set
-# CONFIG_PACKAGE_kmod-ifb is not set
-# CONFIG_PACKAGE_kmod-igb is not set
-# CONFIG_PACKAGE_kmod-igc is not set
-# CONFIG_PACKAGE_kmod-ixgbe is not set
-# CONFIG_PACKAGE_kmod-ixgbevf is not set
-# CONFIG_PACKAGE_kmod-libphy is not set
-# CONFIG_PACKAGE_kmod-macvlan is not set
-# CONFIG_PACKAGE_kmod-mdio-gpio is not set
-# CONFIG_PACKAGE_kmod-mediatek_hnat is not set
-# CONFIG_PACKAGE_kmod-mii is not set
-# CONFIG_PACKAGE_kmod-mlx4-core is not set
-# CONFIG_PACKAGE_kmod-mlx5-core is not set
-# CONFIG_PACKAGE_kmod-natsemi is not set
-# CONFIG_PACKAGE_kmod-ne2k-pci is not set
-# CONFIG_PACKAGE_kmod-niu is not set
-# CONFIG_PACKAGE_kmod-of-mdio is not set
-# CONFIG_PACKAGE_kmod-pcnet32 is not set
-# CONFIG_PACKAGE_kmod-phy-bcm84881 is not set
-# CONFIG_PACKAGE_kmod-phy-broadcom is not set
-# CONFIG_PACKAGE_kmod-phy-realtek is not set
-# CONFIG_PACKAGE_kmod-phylink is not set
-# CONFIG_PACKAGE_kmod-r6040 is not set
-# CONFIG_PACKAGE_kmod-r8169 is not set
-# CONFIG_PACKAGE_kmod-sfc is not set
-# CONFIG_PACKAGE_kmod-sfc-falcon is not set
-# CONFIG_PACKAGE_kmod-sfp is not set
-# CONFIG_PACKAGE_kmod-siit is not set
-# CONFIG_PACKAGE_kmod-sis190 is not set
-# CONFIG_PACKAGE_kmod-sis900 is not set
-# CONFIG_PACKAGE_kmod-skge is not set
-# CONFIG_PACKAGE_kmod-sky2 is not set
-# CONFIG_PACKAGE_kmod-solos-pci is not set
-# CONFIG_PACKAGE_kmod-spi-ks8995 is not set
-# CONFIG_PACKAGE_kmod-swconfig is not set
-# CONFIG_PACKAGE_kmod-switch-bcm53xx is not set
-# CONFIG_PACKAGE_kmod-switch-bcm53xx-mdio is not set
-# CONFIG_PACKAGE_kmod-switch-ip17xx is not set
-# CONFIG_PACKAGE_kmod-switch-rtl8306 is not set
-# CONFIG_PACKAGE_kmod-switch-rtl8366-smi is not set
-# CONFIG_PACKAGE_kmod-switch-rtl8366rb is not set
-# CONFIG_PACKAGE_kmod-switch-rtl8366s is not set
-# CONFIG_PACKAGE_kmod-switch-rtl8367b is not set
-# CONFIG_PACKAGE_kmod-tg3 is not set
-# CONFIG_PACKAGE_kmod-tulip is not set
-# CONFIG_PACKAGE_kmod-via-rhine is not set
-# CONFIG_PACKAGE_kmod-via-velocity is not set
-# CONFIG_PACKAGE_kmod-vmxnet3 is not set
-# end of Network Devices
-
-#
-# Network Support
-#
-# CONFIG_PACKAGE_kmod-9pnet is not set
-# CONFIG_PACKAGE_kmod-atm is not set
-# CONFIG_PACKAGE_kmod-ax25 is not set
-# CONFIG_PACKAGE_kmod-batman-adv is not set
-# CONFIG_PACKAGE_kmod-bonding is not set
-# CONFIG_PACKAGE_kmod-bpf-test is not set
-# CONFIG_PACKAGE_kmod-dnsresolver is not set
-# CONFIG_PACKAGE_kmod-fou is not set
-# CONFIG_PACKAGE_kmod-fou6 is not set
-# CONFIG_PACKAGE_kmod-geneve is not set
-# CONFIG_PACKAGE_kmod-gre is not set
-# CONFIG_PACKAGE_kmod-gre6 is not set
-# CONFIG_PACKAGE_kmod-ip6-tunnel is not set
-# CONFIG_PACKAGE_kmod-ipip is not set
-# CONFIG_PACKAGE_kmod-ipsec is not set
-# CONFIG_PACKAGE_kmod-iptunnel6 is not set
-# CONFIG_PACKAGE_kmod-jool is not set
-# CONFIG_PACKAGE_kmod-l2tp is not set
-# CONFIG_PACKAGE_kmod-l2tp-eth is not set
-# CONFIG_PACKAGE_kmod-l2tp-ip is not set
-# CONFIG_PACKAGE_kmod-macremapper is not set
-# CONFIG_PACKAGE_kmod-macsec is not set
-# CONFIG_PACKAGE_kmod-misdn is not set
-# CONFIG_PACKAGE_kmod-mpls is not set
-# CONFIG_PACKAGE_kmod-nat46 is not set
-# CONFIG_PACKAGE_kmod-netem is not set
-# CONFIG_PACKAGE_kmod-netlink-diag is not set
-# CONFIG_PACKAGE_kmod-nlmon is not set
-# CONFIG_PACKAGE_kmod-nsh is not set
-# CONFIG_PACKAGE_kmod-openvswitch is not set
-# CONFIG_PACKAGE_kmod-openvswitch-geneve is not set
-# CONFIG_PACKAGE_kmod-openvswitch-gre is not set
-# CONFIG_PACKAGE_kmod-openvswitch-vxlan is not set
-# CONFIG_PACKAGE_kmod-pf-ring is not set
-# CONFIG_PACKAGE_kmod-pktgen is not set
-CONFIG_PACKAGE_kmod-ppp=y
-# CONFIG_PACKAGE_kmod-mppe is not set
-# CONFIG_PACKAGE_kmod-ppp-synctty is not set
-# CONFIG_PACKAGE_kmod-pppoa is not set
-CONFIG_PACKAGE_kmod-pppoe=y
-# CONFIG_PACKAGE_kmod-pppol2tp is not set
-CONFIG_PACKAGE_kmod-pppox=y
-# CONFIG_PACKAGE_kmod-pptp is not set
-# CONFIG_PACKAGE_kmod-sched is not set
-# CONFIG_PACKAGE_kmod-sched-act-vlan is not set
-# CONFIG_PACKAGE_kmod-sched-bpf is not set
-# CONFIG_PACKAGE_kmod-sched-cake is not set
-# CONFIG_PACKAGE_kmod-sched-connmark is not set
-# CONFIG_PACKAGE_kmod-sched-core is not set
-# CONFIG_PACKAGE_kmod-sched-ctinfo is not set
-# CONFIG_PACKAGE_kmod-sched-flower is not set
-# CONFIG_PACKAGE_kmod-sched-ipset is not set
-# CONFIG_PACKAGE_kmod-sched-mqprio is not set
-# CONFIG_PACKAGE_kmod-sctp is not set
-# CONFIG_PACKAGE_kmod-sit is not set
-CONFIG_PACKAGE_kmod-slhc=y
-# CONFIG_PACKAGE_kmod-slip is not set
-# CONFIG_PACKAGE_kmod-tcp-bbr is not set
-# CONFIG_PACKAGE_kmod-tcp-hybla is not set
-# CONFIG_PACKAGE_kmod-trelay is not set
-# CONFIG_PACKAGE_kmod-tun is not set
-# CONFIG_PACKAGE_kmod-veth is not set
-# CONFIG_PACKAGE_kmod-vxlan is not set
-# CONFIG_PACKAGE_kmod-wireguard is not set
-# end of Network Support
-
-#
-# Other modules
-#
-# CONFIG_PACKAGE_kmod-6lowpan is not set
-# CONFIG_PACKAGE_kmod-ath3k is not set
-# CONFIG_PACKAGE_kmod-bcma is not set
-# CONFIG_PACKAGE_kmod-bluetooth is not set
-# CONFIG_PACKAGE_kmod-bluetooth-6lowpan is not set
-# CONFIG_PACKAGE_kmod-btmrvl is not set
-# CONFIG_PACKAGE_kmod-button-hotplug is not set
-# CONFIG_PACKAGE_kmod-echo is not set
-# CONFIG_PACKAGE_kmod-eeprom-93cx6 is not set
-# CONFIG_PACKAGE_kmod-eeprom-at24 is not set
-# CONFIG_PACKAGE_kmod-eeprom-at25 is not set
-# CONFIG_PACKAGE_kmod-gpio-beeper is not set
-CONFIG_PACKAGE_kmod-gpio-button-hotplug=y
-# CONFIG_PACKAGE_kmod-gpio-dev is not set
-# CONFIG_PACKAGE_kmod-gpio-mcp23s08 is not set
-# CONFIG_PACKAGE_kmod-gpio-nxp-74hc164 is not set
-# CONFIG_PACKAGE_kmod-gpio-pca953x is not set
-# CONFIG_PACKAGE_kmod-gpio-pcf857x is not set
-# CONFIG_PACKAGE_kmod-ikconfig is not set
-# CONFIG_PACKAGE_kmod-it87-wdt is not set
-# CONFIG_PACKAGE_kmod-itco-wdt is not set
-# CONFIG_PACKAGE_kmod-lp is not set
-CONFIG_PACKAGE_kmod-mmc=m
-# CONFIG_PACKAGE_kmod-mtd-rw is not set
-# CONFIG_PACKAGE_kmod-mtdoops is not set
-# CONFIG_PACKAGE_kmod-mtdram is not set
-CONFIG_PACKAGE_kmod-mtdtests=y
-# CONFIG_PACKAGE_kmod-parport-pc is not set
-# CONFIG_PACKAGE_kmod-ppdev is not set
-# CONFIG_PACKAGE_kmod-pps is not set
-# CONFIG_PACKAGE_kmod-pps-gpio is not set
-# CONFIG_PACKAGE_kmod-pps-ldisc is not set
-# CONFIG_PACKAGE_kmod-ptp is not set
-# CONFIG_PACKAGE_kmod-random-core is not set
-# CONFIG_PACKAGE_kmod-rtc-ds1307 is not set
-# CONFIG_PACKAGE_kmod-rtc-ds1374 is not set
-# CONFIG_PACKAGE_kmod-rtc-ds1672 is not set
-# CONFIG_PACKAGE_kmod-rtc-em3027 is not set
-# CONFIG_PACKAGE_kmod-rtc-isl1208 is not set
-# CONFIG_PACKAGE_kmod-rtc-pcf2123 is not set
-# CONFIG_PACKAGE_kmod-rtc-pcf2127 is not set
-# CONFIG_PACKAGE_kmod-rtc-pcf8563 is not set
-# CONFIG_PACKAGE_kmod-rtc-rs5c372a is not set
-# CONFIG_PACKAGE_kmod-rtc-rx8025 is not set
-# CONFIG_PACKAGE_kmod-rtc-s35390a is not set
-# CONFIG_PACKAGE_kmod-sdhci is not set
-# CONFIG_PACKAGE_kmod-serial-8250 is not set
-# CONFIG_PACKAGE_kmod-serial-8250-exar is not set
-# CONFIG_PACKAGE_kmod-softdog is not set
-# CONFIG_PACKAGE_kmod-ssb is not set
-CONFIG_PACKAGE_kmod-thermal=y
-# CONFIG_PACKAGE_kmod-tpm is not set
-# CONFIG_PACKAGE_kmod-tpm-i2c-atmel is not set
-# CONFIG_PACKAGE_kmod-tpm-i2c-infineon is not set
-# CONFIG_PACKAGE_kmod-w83627hf-wdt is not set
-# CONFIG_PACKAGE_kmod-zram is not set
-# end of Other modules
-
-#
-# PCMCIA support
-#
-# end of PCMCIA support
-
-#
-# SPI Support
-#
-# CONFIG_PACKAGE_kmod-mmc-spi is not set
-# CONFIG_PACKAGE_kmod-spi-bitbang is not set
-# CONFIG_PACKAGE_kmod-spi-dev is not set
-# CONFIG_PACKAGE_kmod-spi-gpio is not set
-# end of SPI Support
-
-#
-# Sound Support
-#
-# CONFIG_PACKAGE_kmod-sound-core is not set
-# end of Sound Support
-
-#
-# USB Support
-#
-# CONFIG_PACKAGE_kmod-chaoskey is not set
-# CONFIG_PACKAGE_kmod-usb-acm is not set
-# CONFIG_PACKAGE_kmod-usb-atm is not set
-# CONFIG_PACKAGE_kmod-usb-cm109 is not set
-# CONFIG_PACKAGE_kmod-usb-core is not set
-# CONFIG_PACKAGE_kmod-usb-dwc2 is not set
-# CONFIG_PACKAGE_kmod-usb-dwc3 is not set
-# CONFIG_PACKAGE_kmod-usb-hid is not set
-# CONFIG_PACKAGE_kmod-usb-hid-cp2112 is not set
-# CONFIG_PACKAGE_kmod-usb-ledtrig-usbport is not set
-# CONFIG_PACKAGE_kmod-usb-net is not set
-# CONFIG_PACKAGE_kmod-usb-net-aqc111 is not set
-# CONFIG_PACKAGE_kmod-usb-net-asix is not set
-# CONFIG_PACKAGE_kmod-usb-net-asix-ax88179 is not set
-# CONFIG_PACKAGE_kmod-usb-net-cdc-eem is not set
-# CONFIG_PACKAGE_kmod-usb-net-cdc-ether is not set
-# CONFIG_PACKAGE_kmod-usb-net-cdc-mbim is not set
-# CONFIG_PACKAGE_kmod-usb-net-cdc-ncm is not set
-# CONFIG_PACKAGE_kmod-usb-net-cdc-subset is not set
-# CONFIG_PACKAGE_kmod-usb-net-dm9601-ether is not set
-# CONFIG_PACKAGE_kmod-usb-net-hso is not set
-# CONFIG_PACKAGE_kmod-usb-net-huawei-cdc-ncm is not set
-# CONFIG_PACKAGE_kmod-usb-net-ipheth is not set
-# CONFIG_PACKAGE_kmod-usb-net-kalmia is not set
-# CONFIG_PACKAGE_kmod-usb-net-kaweth is not set
-# CONFIG_PACKAGE_kmod-usb-net-mcs7830 is not set
-# CONFIG_PACKAGE_kmod-usb-net-pegasus is not set
-# CONFIG_PACKAGE_kmod-usb-net-pl is not set
-# CONFIG_PACKAGE_kmod-usb-net-qmi-wwan is not set
-# CONFIG_PACKAGE_kmod-usb-net-rndis is not set
-# CONFIG_PACKAGE_kmod-usb-net-rtl8150 is not set
-# CONFIG_PACKAGE_kmod-usb-net-rtl8152 is not set
-# CONFIG_PACKAGE_kmod-usb-net-sierrawireless is not set
-# CONFIG_PACKAGE_kmod-usb-net-smsc95xx is not set
-# CONFIG_PACKAGE_kmod-usb-net-sr9700 is not set
-# CONFIG_PACKAGE_kmod-usb-ohci is not set
-# CONFIG_PACKAGE_kmod-usb-ohci-pci is not set
-# CONFIG_PACKAGE_kmod-usb-printer is not set
-# CONFIG_PACKAGE_kmod-usb-serial is not set
-# CONFIG_PACKAGE_kmod-usb-serial-ark3116 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-belkin is not set
-# CONFIG_PACKAGE_kmod-usb-serial-ch341 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-cp210x is not set
-# CONFIG_PACKAGE_kmod-usb-serial-cypress-m8 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-edgeport is not set
-# CONFIG_PACKAGE_kmod-usb-serial-ftdi is not set
-# CONFIG_PACKAGE_kmod-usb-serial-garmin is not set
-# CONFIG_PACKAGE_kmod-usb-serial-ipw is not set
-# CONFIG_PACKAGE_kmod-usb-serial-keyspan is not set
-# CONFIG_PACKAGE_kmod-usb-serial-mct is not set
-# CONFIG_PACKAGE_kmod-usb-serial-mos7720 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-mos7840 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-option is not set
-# CONFIG_PACKAGE_kmod-usb-serial-oti6858 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-pl2303 is not set
-# CONFIG_PACKAGE_kmod-usb-serial-qualcomm is not set
-# CONFIG_PACKAGE_kmod-usb-serial-sierrawireless is not set
-# CONFIG_PACKAGE_kmod-usb-serial-simple is not set
-# CONFIG_PACKAGE_kmod-usb-serial-ti-usb is not set
-# CONFIG_PACKAGE_kmod-usb-serial-visor is not set
-# CONFIG_PACKAGE_kmod-usb-storage is not set
-# CONFIG_PACKAGE_kmod-usb-storage-extras is not set
-# CONFIG_PACKAGE_kmod-usb-storage-uas is not set
-# CONFIG_PACKAGE_kmod-usb-uhci is not set
-# CONFIG_PACKAGE_kmod-usb-wdm is not set
-# CONFIG_PACKAGE_kmod-usb-yealink is not set
-# CONFIG_PACKAGE_kmod-usb2 is not set
-# CONFIG_PACKAGE_kmod-usb2-pci is not set
-# CONFIG_PACKAGE_kmod-usb3 is not set
-# CONFIG_PACKAGE_kmod-usbip is not set
-# CONFIG_PACKAGE_kmod-usbip-client is not set
-# CONFIG_PACKAGE_kmod-usbip-server is not set
-# CONFIG_PACKAGE_kmod-usbmon is not set
-# end of USB Support
-
-#
-# Video Support
-#
-# CONFIG_PACKAGE_kmod-video-core is not set
-# end of Video Support
-
-#
-# Virtualization
-#
-# end of Virtualization
-
-#
-# Voice over IP
-#
-# end of Voice over IP
-
-#
-# W1 support
-#
-# CONFIG_PACKAGE_kmod-w1 is not set
-# end of W1 support
-
-#
-# WPAN 802.15.4 Support
-#
-# CONFIG_PACKAGE_kmod-at86rf230 is not set
-# CONFIG_PACKAGE_kmod-atusb is not set
-# CONFIG_PACKAGE_kmod-ca8210 is not set
-# CONFIG_PACKAGE_kmod-cc2520 is not set
-# CONFIG_PACKAGE_kmod-fakelb is not set
-# CONFIG_PACKAGE_kmod-ieee802154 is not set
-# CONFIG_PACKAGE_kmod-ieee802154-6lowpan is not set
-# CONFIG_PACKAGE_kmod-mac802154 is not set
-# CONFIG_PACKAGE_kmod-mrf24j40 is not set
-# end of WPAN 802.15.4 Support
-
-#
-# Wireless Drivers
-#
-# CONFIG_PACKAGE_kmod-ar5523 is not set
-# CONFIG_PACKAGE_kmod-ath is not set
-# CONFIG_PACKAGE_kmod-ath10k is not set
-# CONFIG_PACKAGE_kmod-ath10k-ct is not set
-# CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers is not set
-# CONFIG_PACKAGE_kmod-ath10k-smallbuffers is not set
-# CONFIG_PACKAGE_kmod-ath11k is not set
-# CONFIG_PACKAGE_kmod-ath11k-pci is not set
-# CONFIG_PACKAGE_kmod-ath5k is not set
-# CONFIG_PACKAGE_kmod-ath6kl-sdio is not set
-# CONFIG_PACKAGE_kmod-ath6kl-usb is not set
-# CONFIG_PACKAGE_kmod-ath9k is not set
-# CONFIG_PACKAGE_kmod-ath9k-htc is not set
-# CONFIG_PACKAGE_kmod-b43 is not set
-# CONFIG_PACKAGE_kmod-brcmfmac is not set
-# CONFIG_PACKAGE_kmod-brcmsmac is not set
-# CONFIG_PACKAGE_kmod-brcmutil is not set
-# CONFIG_PACKAGE_kmod-carl9170 is not set
-CONFIG_PACKAGE_kmod-cfg80211=y
-CONFIG_PACKAGE_CFG80211_TESTMODE=y
-# CONFIG_PACKAGE_kmod-iwlwifi is not set
-CONFIG_PACKAGE_kmod-mac80211=y
-CONFIG_PACKAGE_MAC80211_DEBUGFS=y
-# CONFIG_PACKAGE_MAC80211_TRACING is not set
-CONFIG_PACKAGE_MAC80211_MESH=y
-# CONFIG_PACKAGE_kmod-mac80211-hwsim is not set
-# CONFIG_PACKAGE_kmod-mt76 is not set
-CONFIG_PACKAGE_kmod-mt76-connac=y
-CONFIG_PACKAGE_kmod-mt76-core=y
-# CONFIG_PACKAGE_kmod-mt7601u is not set
-# CONFIG_PACKAGE_kmod-mt7603 is not set
-# CONFIG_PACKAGE_kmod-mt7615-firmware is not set
-# CONFIG_PACKAGE_kmod-mt7615e is not set
-# CONFIG_PACKAGE_kmod-mt7622-firmware is not set
-# CONFIG_PACKAGE_kmod-mt7663-firmware-ap is not set
-# CONFIG_PACKAGE_kmod-mt7663-firmware-sta is not set
-# CONFIG_PACKAGE_kmod-mt7663s is not set
-# CONFIG_PACKAGE_kmod-mt7663u is not set
-# CONFIG_PACKAGE_kmod-mt76x0e is not set
-# CONFIG_PACKAGE_kmod-mt76x0u is not set
-# CONFIG_PACKAGE_kmod-mt76x2 is not set
-# CONFIG_PACKAGE_kmod-mt76x2u is not set
-# CONFIG_PACKAGE_kmod-mt7915-firmware is not set
-# CONFIG_PACKAGE_kmod-mt7915e is not set
-# CONFIG_PACKAGE_kmod-mt7916-firmware is not set
-# CONFIG_PACKAGE_kmod-mt7921-firmware is not set
-# CONFIG_PACKAGE_kmod-mt7921e is not set
-# CONFIG_PACKAGE_kmod-mt7921s is not set
-# CONFIG_PACKAGE_kmod-mt7921u is not set
-# CONFIG_PACKAGE_kmod-mt7986-firmware is not set
-CONFIG_PACKAGE_kmod-mt7996e=y
-# CONFIG_PACKAGE_kmod-mwifiex-pcie is not set
-# CONFIG_PACKAGE_kmod-mwifiex-sdio is not set
-# CONFIG_PACKAGE_kmod-mwl8k is not set
-# CONFIG_PACKAGE_kmod-net-prism54 is not set
-# CONFIG_PACKAGE_kmod-net-rtl8192su is not set
-# CONFIG_PACKAGE_kmod-owl-loader is not set
-# CONFIG_PACKAGE_kmod-rsi91x is not set
-# CONFIG_PACKAGE_kmod-rsi91x-sdio is not set
-# CONFIG_PACKAGE_kmod-rsi91x-usb is not set
-# CONFIG_PACKAGE_kmod-rt2800-pci is not set
-# CONFIG_PACKAGE_kmod-rt2800-usb is not set
-# CONFIG_PACKAGE_kmod-rt2x00-lib is not set
-# CONFIG_PACKAGE_kmod-rtl8192ce is not set
-# CONFIG_PACKAGE_kmod-rtl8192cu is not set
-# CONFIG_PACKAGE_kmod-rtl8192de is not set
-# CONFIG_PACKAGE_kmod-rtl8192se is not set
-# CONFIG_PACKAGE_kmod-rtl8723bs is not set
-# CONFIG_PACKAGE_kmod-rtl8812au-ct is not set
-# CONFIG_PACKAGE_kmod-rtl8821ae is not set
-# CONFIG_PACKAGE_kmod-rtl8xxxu is not set
-# CONFIG_PACKAGE_kmod-rtw88 is not set
-# CONFIG_PACKAGE_kmod-wil6210 is not set
-# CONFIG_PACKAGE_kmod-wl12xx is not set
-# CONFIG_PACKAGE_kmod-wl18xx is not set
-# CONFIG_PACKAGE_kmod-wlcore is not set
-# end of Wireless Drivers
-# end of Kernel modules
-
-#
-# Languages
-#
-
-#
-# Erlang
-#
-# CONFIG_PACKAGE_erlang is not set
-# CONFIG_PACKAGE_erlang-asn1 is not set
-# CONFIG_PACKAGE_erlang-compiler is not set
-# CONFIG_PACKAGE_erlang-crypto is not set
-# CONFIG_PACKAGE_erlang-erl-interface is not set
-# CONFIG_PACKAGE_erlang-hipe is not set
-# CONFIG_PACKAGE_erlang-inets is not set
-# CONFIG_PACKAGE_erlang-mnesia is not set
-# CONFIG_PACKAGE_erlang-os_mon is not set
-# CONFIG_PACKAGE_erlang-public-key is not set
-# CONFIG_PACKAGE_erlang-reltool is not set
-# CONFIG_PACKAGE_erlang-runtime-tools is not set
-# CONFIG_PACKAGE_erlang-snmp is not set
-# CONFIG_PACKAGE_erlang-ssh is not set
-# CONFIG_PACKAGE_erlang-ssl is not set
-# CONFIG_PACKAGE_erlang-syntax-tools is not set
-# CONFIG_PACKAGE_erlang-tools is not set
-# CONFIG_PACKAGE_erlang-xmerl is not set
-# end of Erlang
-
-#
-# Go
-#
-# CONFIG_PACKAGE_golang is not set
-
-#
-# Configuration
-#
-CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT=""
-CONFIG_GOLANG_BUILD_CACHE_DIR=""
-# CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_golang-doc is not set
-# CONFIG_PACKAGE_golang-github-jedisct1-dnscrypt-proxy2-dev is not set
-# CONFIG_PACKAGE_golang-github-nextdns-nextdns-dev is not set
-# CONFIG_PACKAGE_golang-gitlab-yawning-obfs4-dev is not set
-# CONFIG_PACKAGE_golang-src is not set
-# CONFIG_PACKAGE_golang-torproject-tor-fw-helper-dev is not set
-# end of Go
-
-#
-# Lua
-#
-# CONFIG_PACKAGE_dkjson is not set
-# CONFIG_PACKAGE_json4lua is not set
-# CONFIG_PACKAGE_ldbus is not set
-CONFIG_PACKAGE_libiwinfo-lua=y
-# CONFIG_PACKAGE_linotify is not set
-# CONFIG_PACKAGE_lpeg is not set
-# CONFIG_PACKAGE_lsqlite3 is not set
-CONFIG_PACKAGE_lua=y
-# CONFIG_PACKAGE_lua-argparse is not set
-# CONFIG_PACKAGE_lua-bencode is not set
-# CONFIG_PACKAGE_lua-bit32 is not set
-# CONFIG_PACKAGE_lua-cjson is not set
-# CONFIG_PACKAGE_lua-copas is not set
-# CONFIG_PACKAGE_lua-coxpcall is not set
-# CONFIG_PACKAGE_lua-ev is not set
-# CONFIG_PACKAGE_lua-examples is not set
-# CONFIG_PACKAGE_lua-libmodbus is not set
-# CONFIG_PACKAGE_lua-lzlib is not set
-# CONFIG_PACKAGE_lua-md5 is not set
-# CONFIG_PACKAGE_lua-mobdebug is not set
-# CONFIG_PACKAGE_lua-mosquitto is not set
-# CONFIG_PACKAGE_lua-openssl is not set
-# CONFIG_PACKAGE_lua-penlight is not set
-# CONFIG_PACKAGE_lua-rings is not set
-# CONFIG_PACKAGE_lua-rs232 is not set
-# CONFIG_PACKAGE_lua-sha2 is not set
-# CONFIG_PACKAGE_lua-wsapi-base is not set
-# CONFIG_PACKAGE_lua-wsapi-xavante is not set
-# CONFIG_PACKAGE_lua-xavante is not set
-# CONFIG_PACKAGE_lua5.3 is not set
-# CONFIG_PACKAGE_luabitop is not set
-# CONFIG_PACKAGE_luac is not set
-# CONFIG_PACKAGE_luac5.3 is not set
-# CONFIG_PACKAGE_luaexpat is not set
-# CONFIG_PACKAGE_luafilesystem is not set
-# CONFIG_PACKAGE_luajit is not set
-# CONFIG_PACKAGE_lualanes is not set
-# CONFIG_PACKAGE_luaposix is not set
-# CONFIG_PACKAGE_luarocks is not set
-# CONFIG_PACKAGE_luasec is not set
-# CONFIG_PACKAGE_luasoap is not set
-# CONFIG_PACKAGE_luasocket is not set
-# CONFIG_PACKAGE_luasocket5.3 is not set
-# CONFIG_PACKAGE_luasql-mysql is not set
-# CONFIG_PACKAGE_luasql-pgsql is not set
-# CONFIG_PACKAGE_luasql-sqlite3 is not set
-# CONFIG_PACKAGE_luasrcdiet is not set
-# CONFIG_PACKAGE_luv is not set
-# CONFIG_PACKAGE_lyaml is not set
-# CONFIG_PACKAGE_lzmq is not set
-# CONFIG_PACKAGE_uuid is not set
-# end of Lua
-
-#
-# Node.js
-#
-# end of Node.js
-
-#
-# PHP7
-#
-# CONFIG_PACKAGE_php7 is not set
-# end of PHP7
-
-#
-# PHP8
-#
-# CONFIG_PACKAGE_php8 is not set
-# end of PHP8
-
-#
-# Perl
-#
-# CONFIG_PACKAGE_perl is not set
-# end of Perl
-
-#
-# Python
-#
-# CONFIG_PACKAGE_libpython3 is not set
-# CONFIG_PACKAGE_micropython is not set
-# CONFIG_PACKAGE_micropython-lib is not set
-# CONFIG_PACKAGE_python-periphery is not set
-# CONFIG_PACKAGE_python-pip-conf is not set
-# CONFIG_PACKAGE_python3 is not set
-# CONFIG_PACKAGE_python3-aiohttp is not set
-# CONFIG_PACKAGE_python3-aiohttp-cors is not set
-# CONFIG_PACKAGE_python3-apipkg is not set
-# CONFIG_PACKAGE_python3-appdirs is not set
-# CONFIG_PACKAGE_python3-asgiref is not set
-# CONFIG_PACKAGE_python3-asn1crypto is not set
-# CONFIG_PACKAGE_python3-astral is not set
-# CONFIG_PACKAGE_python3-async-timeout is not set
-# CONFIG_PACKAGE_python3-asyncio is not set
-# CONFIG_PACKAGE_python3-atomicwrites is not set
-# CONFIG_PACKAGE_python3-attrs is not set
-# CONFIG_PACKAGE_python3-augeas is not set
-# CONFIG_PACKAGE_python3-automat is not set
-# CONFIG_PACKAGE_python3-awscli is not set
-# CONFIG_PACKAGE_python3-babel is not set
-# CONFIG_PACKAGE_python3-base is not set
-# CONFIG_PACKAGE_python3-bcrypt is not set
-# CONFIG_PACKAGE_python3-bidict is not set
-# CONFIG_PACKAGE_python3-boto3 is not set
-# CONFIG_PACKAGE_python3-botocore is not set
-# CONFIG_PACKAGE_python3-bottle is not set
-# CONFIG_PACKAGE_python3-cached-property is not set
-# CONFIG_PACKAGE_python3-cachelib is not set
-# CONFIG_PACKAGE_python3-cachetools is not set
-# CONFIG_PACKAGE_python3-certifi is not set
-# CONFIG_PACKAGE_python3-cffi is not set
-# CONFIG_PACKAGE_python3-cgi is not set
-# CONFIG_PACKAGE_python3-cgitb is not set
-# CONFIG_PACKAGE_python3-chardet is not set
-# CONFIG_PACKAGE_python3-ciso8601 is not set
-# CONFIG_PACKAGE_python3-click is not set
-# CONFIG_PACKAGE_python3-click-log is not set
-# CONFIG_PACKAGE_python3-codecs is not set
-# CONFIG_PACKAGE_python3-colorama is not set
-# CONFIG_PACKAGE_python3-constantly is not set
-# CONFIG_PACKAGE_python3-contextlib2 is not set
-# CONFIG_PACKAGE_python3-cryptodome is not set
-# CONFIG_PACKAGE_python3-cryptodomex is not set
-# CONFIG_PACKAGE_python3-cryptography is not set
-# CONFIG_PACKAGE_python3-ctypes is not set
-# CONFIG_PACKAGE_python3-curl is not set
-# CONFIG_PACKAGE_python3-dateutil is not set
-# CONFIG_PACKAGE_python3-dbm is not set
-# CONFIG_PACKAGE_python3-decimal is not set
-# CONFIG_PACKAGE_python3-decorator is not set
-# CONFIG_PACKAGE_python3-defusedxml is not set
-# CONFIG_PACKAGE_python3-dev is not set
-# CONFIG_PACKAGE_python3-distro is not set
-# CONFIG_PACKAGE_python3-distutils is not set
-# CONFIG_PACKAGE_python3-django is not set
-# CONFIG_PACKAGE_python3-django-appconf is not set
-# CONFIG_PACKAGE_python3-django-compressor is not set
-# CONFIG_PACKAGE_python3-django-cors-headers is not set
-# CONFIG_PACKAGE_python3-django-etesync-journal is not set
-# CONFIG_PACKAGE_python3-django-formtools is not set
-# CONFIG_PACKAGE_python3-django-jsonfield is not set
-# CONFIG_PACKAGE_python3-django-jsonfield2 is not set
-# CONFIG_PACKAGE_python3-django-picklefield is not set
-# CONFIG_PACKAGE_python3-django-postoffice is not set
-# CONFIG_PACKAGE_python3-django-ranged-response is not set
-# CONFIG_PACKAGE_python3-django-restframework is not set
-# CONFIG_PACKAGE_python3-django-restframework39 is not set
-# CONFIG_PACKAGE_python3-django-simple-captcha is not set
-# CONFIG_PACKAGE_python3-django-statici18n is not set
-# CONFIG_PACKAGE_python3-django-webpack-loader is not set
-# CONFIG_PACKAGE_python3-django1 is not set
-# CONFIG_PACKAGE_python3-dns is not set
-# CONFIG_PACKAGE_python3-docker is not set
-# CONFIG_PACKAGE_python3-dockerpty is not set
-# CONFIG_PACKAGE_python3-docopt is not set
-# CONFIG_PACKAGE_python3-docutils is not set
-# CONFIG_PACKAGE_python3-dotenv is not set
-# CONFIG_PACKAGE_python3-drf-nested-routers is not set
-# CONFIG_PACKAGE_python3-email is not set
-# CONFIG_PACKAGE_python3-engineio is not set
-# CONFIG_PACKAGE_python3-et_xmlfile is not set
-# CONFIG_PACKAGE_python3-evdev is not set
-# CONFIG_PACKAGE_python3-eventlet is not set
-# CONFIG_PACKAGE_python3-execnet is not set
-# CONFIG_PACKAGE_python3-flask is not set
-# CONFIG_PACKAGE_python3-flask-babel is not set
-# CONFIG_PACKAGE_python3-flask-httpauth is not set
-# CONFIG_PACKAGE_python3-flask-login is not set
-# CONFIG_PACKAGE_python3-flask-seasurf is not set
-# CONFIG_PACKAGE_python3-flask-session is not set
-# CONFIG_PACKAGE_python3-flask-socketio is not set
-# CONFIG_PACKAGE_python3-flup is not set
-# CONFIG_PACKAGE_python3-gdbm is not set
-# CONFIG_PACKAGE_python3-gmpy2 is not set
-# CONFIG_PACKAGE_python3-gnupg is not set
-# CONFIG_PACKAGE_python3-gpiod is not set
-# CONFIG_PACKAGE_python3-greenlet is not set
-# CONFIG_PACKAGE_python3-hyperlink is not set
-# CONFIG_PACKAGE_python3-idna is not set
-# CONFIG_PACKAGE_python3-ifaddr is not set
-# CONFIG_PACKAGE_python3-incremental is not set
-# CONFIG_PACKAGE_python3-influxdb is not set
-# CONFIG_PACKAGE_python3-iniconfig is not set
-# CONFIG_PACKAGE_python3-intelhex is not set
-# CONFIG_PACKAGE_python3-itsdangerous is not set
-# CONFIG_PACKAGE_python3-jdcal is not set
-# CONFIG_PACKAGE_python3-jinja2 is not set
-# CONFIG_PACKAGE_python3-jmespath is not set
-# CONFIG_PACKAGE_python3-jsonpath-ng is not set
-# CONFIG_PACKAGE_python3-jsonschema is not set
-# CONFIG_PACKAGE_python3-lib2to3 is not set
-# CONFIG_PACKAGE_python3-libmodbus is not set
-# CONFIG_PACKAGE_python3-libselinux is not set
-# CONFIG_PACKAGE_python3-libsemanage is not set
-# CONFIG_PACKAGE_python3-light is not set
-
-#
-# Configuration
-#
-# CONFIG_PYTHON3_BLUETOOTH_SUPPORT is not set
-# CONFIG_PYTHON3_HOST_PIP_CACHE_WORLD_READABLE is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_python3-logging is not set
-# CONFIG_PACKAGE_python3-lxml is not set
-# CONFIG_PACKAGE_python3-lzma is not set
-# CONFIG_PACKAGE_python3-markdown is not set
-# CONFIG_PACKAGE_python3-markupsafe is not set
-# CONFIG_PACKAGE_python3-maxminddb is not set
-# CONFIG_PACKAGE_python3-more-itertools is not set
-# CONFIG_PACKAGE_python3-msgpack is not set
-# CONFIG_PACKAGE_python3-multidict is not set
-# CONFIG_PACKAGE_python3-multiprocessing is not set
-# CONFIG_PACKAGE_python3-ncurses is not set
-# CONFIG_PACKAGE_python3-netdisco is not set
-# CONFIG_PACKAGE_python3-netifaces is not set
-# CONFIG_PACKAGE_python3-networkx is not set
-# CONFIG_PACKAGE_python3-newt is not set
-# CONFIG_PACKAGE_python3-numpy is not set
-# CONFIG_PACKAGE_python3-oauthlib is not set
-# CONFIG_PACKAGE_python3-openpyxl is not set
-# CONFIG_PACKAGE_python3-openssl is not set
-# CONFIG_PACKAGE_python3-packaging is not set
-# CONFIG_PACKAGE_python3-paho-mqtt is not set
-# CONFIG_PACKAGE_python3-paramiko is not set
-# CONFIG_PACKAGE_python3-parsley is not set
-# CONFIG_PACKAGE_python3-passlib is not set
-# CONFIG_PACKAGE_python3-pillow is not set
-# CONFIG_PACKAGE_python3-pip is not set
-# CONFIG_PACKAGE_python3-pkg-resources is not set
-# CONFIG_PACKAGE_python3-pluggy is not set
-# CONFIG_PACKAGE_python3-ply is not set
-# CONFIG_PACKAGE_python3-psutil is not set
-# CONFIG_PACKAGE_python3-psycopg2 is not set
-# CONFIG_PACKAGE_python3-py is not set
-# CONFIG_PACKAGE_python3-pyasn1 is not set
-# CONFIG_PACKAGE_python3-pyasn1-modules is not set
-# CONFIG_PACKAGE_python3-pycparser is not set
-# CONFIG_PACKAGE_python3-pydoc is not set
-# CONFIG_PACKAGE_python3-pyinotify is not set
-# CONFIG_PACKAGE_python3-pyjwt is not set
-# CONFIG_PACKAGE_python3-pymysql is not set
-# CONFIG_PACKAGE_python3-pynacl is not set
-# CONFIG_PACKAGE_python3-pyodbc is not set
-# CONFIG_PACKAGE_python3-pyopenssl is not set
-# CONFIG_PACKAGE_python3-pyotp is not set
-# CONFIG_PACKAGE_python3-pyparsing is not set
-# CONFIG_PACKAGE_python3-pyroute2 is not set
-# CONFIG_PACKAGE_python3-pyrsistent is not set
-# CONFIG_PACKAGE_python3-pyserial is not set
-# CONFIG_PACKAGE_python3-pysocks is not set
-# CONFIG_PACKAGE_python3-pytest is not set
-# CONFIG_PACKAGE_python3-pytest-forked is not set
-# CONFIG_PACKAGE_python3-pytest-xdist is not set
-# CONFIG_PACKAGE_python3-pytz is not set
-# CONFIG_PACKAGE_python3-qrcode is not set
-# CONFIG_PACKAGE_python3-rcssmin is not set
-# CONFIG_PACKAGE_python3-readline is not set
-# CONFIG_PACKAGE_python3-requests is not set
-# CONFIG_PACKAGE_python3-requests-oauthlib is not set
-# CONFIG_PACKAGE_python3-rsa is not set
-# CONFIG_PACKAGE_python3-ruamel-yaml is not set
-# CONFIG_PACKAGE_python3-s3transfer is not set
-# CONFIG_PACKAGE_python3-schedule is not set
-# CONFIG_PACKAGE_python3-schema is not set
-# CONFIG_PACKAGE_python3-seafile-ccnet is not set
-# CONFIG_PACKAGE_python3-seafile-server is not set
-# CONFIG_PACKAGE_python3-searpc is not set
-# CONFIG_PACKAGE_python3-sentry-sdk is not set
-# CONFIG_PACKAGE_python3-sepolgen is not set
-# CONFIG_PACKAGE_python3-sepolicy is not set
-# CONFIG_PACKAGE_python3-service-identity is not set
-# CONFIG_PACKAGE_python3-setuptools is not set
-# CONFIG_PACKAGE_python3-simplejson is not set
-# CONFIG_PACKAGE_python3-six is not set
-# CONFIG_PACKAGE_python3-slugify is not set
-# CONFIG_PACKAGE_python3-smbus is not set
-# CONFIG_PACKAGE_python3-socketio is not set
-# CONFIG_PACKAGE_python3-speedtest-cli is not set
-# CONFIG_PACKAGE_python3-sqlalchemy is not set
-# CONFIG_PACKAGE_python3-sqlite3 is not set
-# CONFIG_PACKAGE_python3-sqlparse is not set
-# CONFIG_PACKAGE_python3-stem is not set
-# CONFIG_PACKAGE_python3-sysrepo is not set
-# CONFIG_PACKAGE_python3-text-unidecode is not set
-# CONFIG_PACKAGE_python3-texttable is not set
-# CONFIG_PACKAGE_python3-toml is not set
-# CONFIG_PACKAGE_python3-tornado is not set
-# CONFIG_PACKAGE_python3-twisted is not set
-# CONFIG_PACKAGE_python3-typing-extensions is not set
-# CONFIG_PACKAGE_python3-ubus is not set
-# CONFIG_PACKAGE_python3-uci is not set
-# CONFIG_PACKAGE_python3-unidecode is not set
-# CONFIG_PACKAGE_python3-unittest is not set
-# CONFIG_PACKAGE_python3-urllib is not set
-# CONFIG_PACKAGE_python3-urllib3 is not set
-# CONFIG_PACKAGE_python3-vobject is not set
-# CONFIG_PACKAGE_python3-voluptuous is not set
-# CONFIG_PACKAGE_python3-voluptuous-serialize is not set
-# CONFIG_PACKAGE_python3-wcwidth is not set
-# CONFIG_PACKAGE_python3-websocket-client is not set
-# CONFIG_PACKAGE_python3-websockets is not set
-# CONFIG_PACKAGE_python3-werkzeug is not set
-# CONFIG_PACKAGE_python3-xml is not set
-# CONFIG_PACKAGE_python3-xmltodict is not set
-# CONFIG_PACKAGE_python3-yaml is not set
-# CONFIG_PACKAGE_python3-yarl is not set
-# CONFIG_PACKAGE_python3-zeroconf is not set
-# CONFIG_PACKAGE_python3-zipp is not set
-# CONFIG_PACKAGE_python3-zope-interface is not set
-# end of Python
-
-#
-# Ruby
-#
-# CONFIG_PACKAGE_ruby is not set
-# end of Ruby
-
-#
-# Tcl
-#
-# CONFIG_PACKAGE_tcl is not set
-# end of Tcl
-
-#
-# ucode
-#
-CONFIG_PACKAGE_ucode=y
-CONFIG_PACKAGE_ucode-mod-fs=y
-# CONFIG_PACKAGE_ucode-mod-math is not set
-CONFIG_PACKAGE_ucode-mod-nl80211=y
-# CONFIG_PACKAGE_ucode-mod-resolv is not set
-CONFIG_PACKAGE_ucode-mod-rtnl=y
-# CONFIG_PACKAGE_ucode-mod-struct is not set
-CONFIG_PACKAGE_ucode-mod-ubus=y
-# CONFIG_PACKAGE_ucode-mod-uci is not set
-CONFIG_PACKAGE_ucode-mod-uloop=y
-# end of ucode
-
-# CONFIG_PACKAGE_chicken-scheme-full is not set
-# CONFIG_PACKAGE_chicken-scheme-interpreter is not set
-# CONFIG_PACKAGE_slsh is not set
-# end of Languages
-
-#
-# Libraries
-#
-
-#
-# Compression
-#
-CONFIG_PACKAGE_libbz2=y
-# CONFIG_PACKAGE_liblz4 is not set
-# CONFIG_PACKAGE_liblzma is not set
-# CONFIG_PACKAGE_libunrar is not set
-# CONFIG_PACKAGE_libzip-gnutls is not set
-# CONFIG_PACKAGE_libzip-mbedtls is not set
-# CONFIG_PACKAGE_libzip-nossl is not set
-# CONFIG_PACKAGE_libzip-openssl is not set
-# CONFIG_PACKAGE_libzstd is not set
-# end of Compression
-
-#
-# Database
-#
-# CONFIG_PACKAGE_libmariadb is not set
-# CONFIG_PACKAGE_libpq is not set
-# CONFIG_PACKAGE_libpqxx is not set
-# CONFIG_PACKAGE_libsqlite3 is not set
-# CONFIG_PACKAGE_pgsqlodbc is not set
-# CONFIG_PACKAGE_psqlodbca is not set
-# CONFIG_PACKAGE_psqlodbcw is not set
-# CONFIG_PACKAGE_redis-cli is not set
-# CONFIG_PACKAGE_redis-server is not set
-# CONFIG_PACKAGE_redis-utils is not set
-# CONFIG_PACKAGE_tdb is not set
-# CONFIG_PACKAGE_unixodbc is not set
-# end of Database
-
-#
-# Filesystem
-#
-# CONFIG_PACKAGE_libacl is not set
-# CONFIG_PACKAGE_libattr is not set
-# CONFIG_PACKAGE_libfuse is not set
-# CONFIG_PACKAGE_libfuse3 is not set
-# CONFIG_PACKAGE_libow is not set
-# CONFIG_PACKAGE_libow-capi is not set
-CONFIG_PACKAGE_libsysfs=y
-# end of Filesystem
-
-#
-# Firewall
-#
-# CONFIG_PACKAGE_libfko is not set
-CONFIG_PACKAGE_libip4tc=y
-CONFIG_PACKAGE_libip6tc=y
-CONFIG_PACKAGE_libxtables=y
-# CONFIG_PACKAGE_libxtables-nft is not set
-# end of Firewall
-
-#
-# Instant Messaging
-#
-# CONFIG_PACKAGE_quasselc is not set
-# end of Instant Messaging
-
-#
-# IoT
-#
-# CONFIG_PACKAGE_libmraa is not set
-# CONFIG_PACKAGE_libmraa-python3 is not set
-# CONFIG_PACKAGE_libupm is not set
-# CONFIG_PACKAGE_libupm-a110x is not set
-# CONFIG_PACKAGE_libupm-a110x-python3 is not set
-# CONFIG_PACKAGE_libupm-abp is not set
-# CONFIG_PACKAGE_libupm-abp-python3 is not set
-# CONFIG_PACKAGE_libupm-ad8232 is not set
-# CONFIG_PACKAGE_libupm-ad8232-python3 is not set
-# CONFIG_PACKAGE_libupm-adafruitms1438 is not set
-# CONFIG_PACKAGE_libupm-adafruitms1438-python3 is not set
-# CONFIG_PACKAGE_libupm-adafruitss is not set
-# CONFIG_PACKAGE_libupm-adafruitss-python3 is not set
-# CONFIG_PACKAGE_libupm-adc121c021 is not set
-# CONFIG_PACKAGE_libupm-adc121c021-python3 is not set
-# CONFIG_PACKAGE_libupm-adis16448 is not set
-# CONFIG_PACKAGE_libupm-adis16448-python3 is not set
-# CONFIG_PACKAGE_libupm-ads1x15 is not set
-# CONFIG_PACKAGE_libupm-ads1x15-python3 is not set
-# CONFIG_PACKAGE_libupm-adxl335 is not set
-# CONFIG_PACKAGE_libupm-adxl335-python3 is not set
-# CONFIG_PACKAGE_libupm-adxl345 is not set
-# CONFIG_PACKAGE_libupm-adxl345-python3 is not set
-# CONFIG_PACKAGE_libupm-adxrs610 is not set
-# CONFIG_PACKAGE_libupm-adxrs610-python3 is not set
-# CONFIG_PACKAGE_libupm-am2315 is not set
-# CONFIG_PACKAGE_libupm-am2315-python3 is not set
-# CONFIG_PACKAGE_libupm-apa102 is not set
-# CONFIG_PACKAGE_libupm-apa102-python3 is not set
-# CONFIG_PACKAGE_libupm-apds9002 is not set
-# CONFIG_PACKAGE_libupm-apds9002-python3 is not set
-# CONFIG_PACKAGE_libupm-apds9930 is not set
-# CONFIG_PACKAGE_libupm-apds9930-python3 is not set
-# CONFIG_PACKAGE_libupm-at42qt1070 is not set
-# CONFIG_PACKAGE_libupm-at42qt1070-python3 is not set
-# CONFIG_PACKAGE_libupm-bh1749 is not set
-# CONFIG_PACKAGE_libupm-bh1749-python3 is not set
-# CONFIG_PACKAGE_libupm-bh1750 is not set
-# CONFIG_PACKAGE_libupm-bh1750-python3 is not set
-# CONFIG_PACKAGE_libupm-bh1792 is not set
-# CONFIG_PACKAGE_libupm-bh1792-python3 is not set
-# CONFIG_PACKAGE_libupm-biss0001 is not set
-# CONFIG_PACKAGE_libupm-biss0001-python3 is not set
-# CONFIG_PACKAGE_libupm-bma220 is not set
-# CONFIG_PACKAGE_libupm-bma220-python3 is not set
-# CONFIG_PACKAGE_libupm-bma250e is not set
-# CONFIG_PACKAGE_libupm-bma250e-python3 is not set
-# CONFIG_PACKAGE_libupm-bmg160 is not set
-# CONFIG_PACKAGE_libupm-bmg160-python3 is not set
-# CONFIG_PACKAGE_libupm-bmi160 is not set
-# CONFIG_PACKAGE_libupm-bmi160-python3 is not set
-# CONFIG_PACKAGE_libupm-bmm150 is not set
-# CONFIG_PACKAGE_libupm-bmm150-python3 is not set
-# CONFIG_PACKAGE_libupm-bmp280 is not set
-# CONFIG_PACKAGE_libupm-bmp280-python3 is not set
-# CONFIG_PACKAGE_libupm-bmpx8x is not set
-# CONFIG_PACKAGE_libupm-bmpx8x-python3 is not set
-# CONFIG_PACKAGE_libupm-bmx055 is not set
-# CONFIG_PACKAGE_libupm-bmx055-python3 is not set
-# CONFIG_PACKAGE_libupm-bno055 is not set
-# CONFIG_PACKAGE_libupm-bno055-python3 is not set
-# CONFIG_PACKAGE_libupm-button is not set
-# CONFIG_PACKAGE_libupm-button-python3 is not set
-# CONFIG_PACKAGE_libupm-buzzer is not set
-# CONFIG_PACKAGE_libupm-buzzer-python3 is not set
-# CONFIG_PACKAGE_libupm-cjq4435 is not set
-# CONFIG_PACKAGE_libupm-cjq4435-python3 is not set
-# CONFIG_PACKAGE_libupm-collision is not set
-# CONFIG_PACKAGE_libupm-collision-python3 is not set
-# CONFIG_PACKAGE_libupm-curieimu is not set
-# CONFIG_PACKAGE_libupm-curieimu-python3 is not set
-# CONFIG_PACKAGE_libupm-cwlsxxa is not set
-# CONFIG_PACKAGE_libupm-cwlsxxa-python3 is not set
-# CONFIG_PACKAGE_libupm-dfrec is not set
-# CONFIG_PACKAGE_libupm-dfrec-python3 is not set
-# CONFIG_PACKAGE_libupm-dfrorp is not set
-# CONFIG_PACKAGE_libupm-dfrorp-python3 is not set
-# CONFIG_PACKAGE_libupm-dfrph is not set
-# CONFIG_PACKAGE_libupm-dfrph-python3 is not set
-# CONFIG_PACKAGE_libupm-ds1307 is not set
-# CONFIG_PACKAGE_libupm-ds1307-python3 is not set
-# CONFIG_PACKAGE_libupm-ds1808lc is not set
-# CONFIG_PACKAGE_libupm-ds1808lc-python3 is not set
-# CONFIG_PACKAGE_libupm-ds18b20 is not set
-# CONFIG_PACKAGE_libupm-ds18b20-python3 is not set
-# CONFIG_PACKAGE_libupm-ds2413 is not set
-# CONFIG_PACKAGE_libupm-ds2413-python3 is not set
-# CONFIG_PACKAGE_libupm-ecezo is not set
-# CONFIG_PACKAGE_libupm-ecezo-python3 is not set
-# CONFIG_PACKAGE_libupm-ecs1030 is not set
-# CONFIG_PACKAGE_libupm-ecs1030-python3 is not set
-# CONFIG_PACKAGE_libupm-ehr is not set
-# CONFIG_PACKAGE_libupm-ehr-python3 is not set
-# CONFIG_PACKAGE_libupm-eldriver is not set
-# CONFIG_PACKAGE_libupm-eldriver-python3 is not set
-# CONFIG_PACKAGE_libupm-electromagnet is not set
-# CONFIG_PACKAGE_libupm-electromagnet-python3 is not set
-# CONFIG_PACKAGE_libupm-emg is not set
-# CONFIG_PACKAGE_libupm-emg-python3 is not set
-# CONFIG_PACKAGE_libupm-enc03r is not set
-# CONFIG_PACKAGE_libupm-enc03r-python3 is not set
-# CONFIG_PACKAGE_libupm-flex is not set
-# CONFIG_PACKAGE_libupm-flex-python3 is not set
-# CONFIG_PACKAGE_libupm-gas is not set
-# CONFIG_PACKAGE_libupm-gas-python3 is not set
-# CONFIG_PACKAGE_libupm-gp2y0a is not set
-# CONFIG_PACKAGE_libupm-gp2y0a-python3 is not set
-# CONFIG_PACKAGE_libupm-gprs is not set
-# CONFIG_PACKAGE_libupm-gprs-python3 is not set
-# CONFIG_PACKAGE_libupm-gsr is not set
-# CONFIG_PACKAGE_libupm-gsr-python3 is not set
-# CONFIG_PACKAGE_libupm-guvas12d is not set
-# CONFIG_PACKAGE_libupm-guvas12d-python3 is not set
-# CONFIG_PACKAGE_libupm-h3lis331dl is not set
-# CONFIG_PACKAGE_libupm-h3lis331dl-python3 is not set
-# CONFIG_PACKAGE_libupm-h803x is not set
-# CONFIG_PACKAGE_libupm-h803x-python3 is not set
-# CONFIG_PACKAGE_libupm-hcsr04 is not set
-# CONFIG_PACKAGE_libupm-hcsr04-python3 is not set
-# CONFIG_PACKAGE_libupm-hdc1000 is not set
-# CONFIG_PACKAGE_libupm-hdc1000-python3 is not set
-# CONFIG_PACKAGE_libupm-hdxxvxta is not set
-# CONFIG_PACKAGE_libupm-hdxxvxta-python3 is not set
-# CONFIG_PACKAGE_libupm-hka5 is not set
-# CONFIG_PACKAGE_libupm-hka5-python3 is not set
-# CONFIG_PACKAGE_libupm-hlg150h is not set
-# CONFIG_PACKAGE_libupm-hlg150h-python3 is not set
-# CONFIG_PACKAGE_libupm-hm11 is not set
-# CONFIG_PACKAGE_libupm-hm11-python3 is not set
-# CONFIG_PACKAGE_libupm-hmc5883l is not set
-# CONFIG_PACKAGE_libupm-hmc5883l-python3 is not set
-# CONFIG_PACKAGE_libupm-hmtrp is not set
-# CONFIG_PACKAGE_libupm-hmtrp-python3 is not set
-# CONFIG_PACKAGE_libupm-hp20x is not set
-# CONFIG_PACKAGE_libupm-hp20x-python3 is not set
-# CONFIG_PACKAGE_libupm-ht9170 is not set
-# CONFIG_PACKAGE_libupm-ht9170-python3 is not set
-# CONFIG_PACKAGE_libupm-htu21d is not set
-# CONFIG_PACKAGE_libupm-htu21d-python3 is not set
-# CONFIG_PACKAGE_libupm-hwxpxx is not set
-# CONFIG_PACKAGE_libupm-hwxpxx-python3 is not set
-# CONFIG_PACKAGE_libupm-hx711 is not set
-# CONFIG_PACKAGE_libupm-hx711-python3 is not set
-# CONFIG_PACKAGE_libupm-ili9341 is not set
-# CONFIG_PACKAGE_libupm-ili9341-python3 is not set
-# CONFIG_PACKAGE_libupm-ims is not set
-# CONFIG_PACKAGE_libupm-ims-python3 is not set
-# CONFIG_PACKAGE_libupm-ina132 is not set
-# CONFIG_PACKAGE_libupm-ina132-python3 is not set
-# CONFIG_PACKAGE_libupm-interfaces is not set
-# CONFIG_PACKAGE_libupm-interfaces-python3 is not set
-# CONFIG_PACKAGE_libupm-isd1820 is not set
-# CONFIG_PACKAGE_libupm-isd1820-python3 is not set
-# CONFIG_PACKAGE_libupm-itg3200 is not set
-# CONFIG_PACKAGE_libupm-itg3200-python3 is not set
-# CONFIG_PACKAGE_libupm-jhd1313m1 is not set
-# CONFIG_PACKAGE_libupm-jhd1313m1-python3 is not set
-# CONFIG_PACKAGE_libupm-joystick12 is not set
-# CONFIG_PACKAGE_libupm-joystick12-python3 is not set
-# CONFIG_PACKAGE_libupm-kx122 is not set
-# CONFIG_PACKAGE_libupm-kx122-python3 is not set
-# CONFIG_PACKAGE_libupm-kxcjk1013 is not set
-# CONFIG_PACKAGE_libupm-kxcjk1013-python3 is not set
-# CONFIG_PACKAGE_libupm-kxtj3 is not set
-# CONFIG_PACKAGE_libupm-kxtj3-python3 is not set
-# CONFIG_PACKAGE_libupm-l298 is not set
-# CONFIG_PACKAGE_libupm-l298-python3 is not set
-# CONFIG_PACKAGE_libupm-l3gd20 is not set
-# CONFIG_PACKAGE_libupm-l3gd20-python3 is not set
-# CONFIG_PACKAGE_libupm-lcd is not set
-# CONFIG_PACKAGE_libupm-lcd-python3 is not set
-# CONFIG_PACKAGE_libupm-lcdks is not set
-# CONFIG_PACKAGE_libupm-lcdks-python3 is not set
-# CONFIG_PACKAGE_libupm-lcm1602 is not set
-# CONFIG_PACKAGE_libupm-lcm1602-python3 is not set
-# CONFIG_PACKAGE_libupm-ldt0028 is not set
-# CONFIG_PACKAGE_libupm-ldt0028-python3 is not set
-# CONFIG_PACKAGE_libupm-led is not set
-# CONFIG_PACKAGE_libupm-led-python3 is not set
-# CONFIG_PACKAGE_libupm-lidarlitev3 is not set
-# CONFIG_PACKAGE_libupm-lidarlitev3-python3 is not set
-# CONFIG_PACKAGE_libupm-light is not set
-# CONFIG_PACKAGE_libupm-light-python3 is not set
-# CONFIG_PACKAGE_libupm-linefinder is not set
-# CONFIG_PACKAGE_libupm-linefinder-python3 is not set
-# CONFIG_PACKAGE_libupm-lis2ds12 is not set
-# CONFIG_PACKAGE_libupm-lis2ds12-python3 is not set
-# CONFIG_PACKAGE_libupm-lis3dh is not set
-# CONFIG_PACKAGE_libupm-lis3dh-python3 is not set
-# CONFIG_PACKAGE_libupm-lm35 is not set
-# CONFIG_PACKAGE_libupm-lm35-python3 is not set
-# CONFIG_PACKAGE_libupm-lol is not set
-# CONFIG_PACKAGE_libupm-lol-python3 is not set
-# CONFIG_PACKAGE_libupm-loudness is not set
-# CONFIG_PACKAGE_libupm-loudness-python3 is not set
-# CONFIG_PACKAGE_libupm-lp8860 is not set
-# CONFIG_PACKAGE_libupm-lp8860-python3 is not set
-# CONFIG_PACKAGE_libupm-lpd8806 is not set
-# CONFIG_PACKAGE_libupm-lpd8806-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm303agr is not set
-# CONFIG_PACKAGE_libupm-lsm303agr-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm303d is not set
-# CONFIG_PACKAGE_libupm-lsm303d-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm303dlh is not set
-# CONFIG_PACKAGE_libupm-lsm303dlh-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm6ds3h is not set
-# CONFIG_PACKAGE_libupm-lsm6ds3h-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm6dsl is not set
-# CONFIG_PACKAGE_libupm-lsm6dsl-python3 is not set
-# CONFIG_PACKAGE_libupm-lsm9ds0 is not set
-# CONFIG_PACKAGE_libupm-lsm9ds0-python3 is not set
-# CONFIG_PACKAGE_libupm-m24lr64e is not set
-# CONFIG_PACKAGE_libupm-m24lr64e-python3 is not set
-# CONFIG_PACKAGE_libupm-mag3110 is not set
-# CONFIG_PACKAGE_libupm-mag3110-python3 is not set
-# CONFIG_PACKAGE_libupm-max30100 is not set
-# CONFIG_PACKAGE_libupm-max30100-python3 is not set
-# CONFIG_PACKAGE_libupm-max31723 is not set
-# CONFIG_PACKAGE_libupm-max31723-python3 is not set
-# CONFIG_PACKAGE_libupm-max31855 is not set
-# CONFIG_PACKAGE_libupm-max31855-python3 is not set
-# CONFIG_PACKAGE_libupm-max44000 is not set
-# CONFIG_PACKAGE_libupm-max44000-python3 is not set
-# CONFIG_PACKAGE_libupm-max44009 is not set
-# CONFIG_PACKAGE_libupm-max44009-python3 is not set
-# CONFIG_PACKAGE_libupm-max5487 is not set
-# CONFIG_PACKAGE_libupm-max5487-python3 is not set
-# CONFIG_PACKAGE_libupm-maxds3231m is not set
-# CONFIG_PACKAGE_libupm-maxds3231m-python3 is not set
-# CONFIG_PACKAGE_libupm-maxsonarez is not set
-# CONFIG_PACKAGE_libupm-maxsonarez-python3 is not set
-# CONFIG_PACKAGE_libupm-mb704x is not set
-# CONFIG_PACKAGE_libupm-mb704x-python3 is not set
-# CONFIG_PACKAGE_libupm-mcp2515 is not set
-# CONFIG_PACKAGE_libupm-mcp2515-python3 is not set
-# CONFIG_PACKAGE_libupm-mcp9808 is not set
-# CONFIG_PACKAGE_libupm-mcp9808-python3 is not set
-# CONFIG_PACKAGE_libupm-md is not set
-# CONFIG_PACKAGE_libupm-md-python3 is not set
-# CONFIG_PACKAGE_libupm-mg811 is not set
-# CONFIG_PACKAGE_libupm-mg811-python3 is not set
-# CONFIG_PACKAGE_libupm-mhz16 is not set
-# CONFIG_PACKAGE_libupm-mhz16-python3 is not set
-# CONFIG_PACKAGE_libupm-mic is not set
-# CONFIG_PACKAGE_libupm-mic-python3 is not set
-# CONFIG_PACKAGE_libupm-micsv89 is not set
-# CONFIG_PACKAGE_libupm-micsv89-python3 is not set
-# CONFIG_PACKAGE_libupm-mlx90614 is not set
-# CONFIG_PACKAGE_libupm-mlx90614-python3 is not set
-# CONFIG_PACKAGE_libupm-mma7361 is not set
-# CONFIG_PACKAGE_libupm-mma7361-python3 is not set
-# CONFIG_PACKAGE_libupm-mma7455 is not set
-# CONFIG_PACKAGE_libupm-mma7455-python3 is not set
-# CONFIG_PACKAGE_libupm-mma7660 is not set
-# CONFIG_PACKAGE_libupm-mma7660-python3 is not set
-# CONFIG_PACKAGE_libupm-mma8x5x is not set
-# CONFIG_PACKAGE_libupm-mma8x5x-python3 is not set
-# CONFIG_PACKAGE_libupm-mmc35240 is not set
-# CONFIG_PACKAGE_libupm-mmc35240-python3 is not set
-# CONFIG_PACKAGE_libupm-moisture is not set
-# CONFIG_PACKAGE_libupm-moisture-python3 is not set
-# CONFIG_PACKAGE_libupm-mpl3115a2 is not set
-# CONFIG_PACKAGE_libupm-mpl3115a2-python3 is not set
-# CONFIG_PACKAGE_libupm-mpr121 is not set
-# CONFIG_PACKAGE_libupm-mpr121-python3 is not set
-# CONFIG_PACKAGE_libupm-mpu9150 is not set
-# CONFIG_PACKAGE_libupm-mpu9150-python3 is not set
-# CONFIG_PACKAGE_libupm-mq303a is not set
-# CONFIG_PACKAGE_libupm-mq303a-python3 is not set
-# CONFIG_PACKAGE_libupm-ms5611 is not set
-# CONFIG_PACKAGE_libupm-ms5611-python3 is not set
-# CONFIG_PACKAGE_libupm-ms5803 is not set
-# CONFIG_PACKAGE_libupm-ms5803-python3 is not set
-# CONFIG_PACKAGE_libupm-my9221 is not set
-# CONFIG_PACKAGE_libupm-my9221-python3 is not set
-# CONFIG_PACKAGE_libupm-nlgpio16 is not set
-# CONFIG_PACKAGE_libupm-nlgpio16-python3 is not set
-# CONFIG_PACKAGE_libupm-nmea_gps is not set
-# CONFIG_PACKAGE_libupm-nmea_gps-python3 is not set
-# CONFIG_PACKAGE_libupm-nrf24l01 is not set
-# CONFIG_PACKAGE_libupm-nrf24l01-python3 is not set
-# CONFIG_PACKAGE_libupm-nrf8001 is not set
-# CONFIG_PACKAGE_libupm-nrf8001-python3 is not set
-# CONFIG_PACKAGE_libupm-nunchuck is not set
-# CONFIG_PACKAGE_libupm-nunchuck-python3 is not set
-# CONFIG_PACKAGE_libupm-o2 is not set
-# CONFIG_PACKAGE_libupm-o2-python3 is not set
-# CONFIG_PACKAGE_libupm-otp538u is not set
-# CONFIG_PACKAGE_libupm-otp538u-python3 is not set
-# CONFIG_PACKAGE_libupm-ozw is not set
-# CONFIG_PACKAGE_libupm-ozw-python3 is not set
-# CONFIG_PACKAGE_libupm-p9813 is not set
-# CONFIG_PACKAGE_libupm-p9813-python3 is not set
-# CONFIG_PACKAGE_libupm-pca9685 is not set
-# CONFIG_PACKAGE_libupm-pca9685-python3 is not set
-# CONFIG_PACKAGE_libupm-pn532 is not set
-# CONFIG_PACKAGE_libupm-pn532-python3 is not set
-# CONFIG_PACKAGE_libupm-ppd42ns is not set
-# CONFIG_PACKAGE_libupm-ppd42ns-python3 is not set
-# CONFIG_PACKAGE_libupm-pulsensor is not set
-# CONFIG_PACKAGE_libupm-pulsensor-python3 is not set
-# CONFIG_PACKAGE_libupm-relay is not set
-# CONFIG_PACKAGE_libupm-relay-python3 is not set
-# CONFIG_PACKAGE_libupm-rf22 is not set
-# CONFIG_PACKAGE_libupm-rf22-python3 is not set
-# CONFIG_PACKAGE_libupm-rfr359f is not set
-# CONFIG_PACKAGE_libupm-rfr359f-python3 is not set
-# CONFIG_PACKAGE_libupm-rgbringcoder is not set
-# CONFIG_PACKAGE_libupm-rgbringcoder-python3 is not set
-# CONFIG_PACKAGE_libupm-rhusb is not set
-# CONFIG_PACKAGE_libupm-rhusb-python3 is not set
-# CONFIG_PACKAGE_libupm-rn2903 is not set
-# CONFIG_PACKAGE_libupm-rn2903-python3 is not set
-# CONFIG_PACKAGE_libupm-rotary is not set
-# CONFIG_PACKAGE_libupm-rotary-python3 is not set
-# CONFIG_PACKAGE_libupm-rotaryencoder is not set
-# CONFIG_PACKAGE_libupm-rotaryencoder-python3 is not set
-# CONFIG_PACKAGE_libupm-rpr220 is not set
-# CONFIG_PACKAGE_libupm-rpr220-python3 is not set
-# CONFIG_PACKAGE_libupm-rsc is not set
-# CONFIG_PACKAGE_libupm-rsc-python3 is not set
-# CONFIG_PACKAGE_libupm-scam is not set
-# CONFIG_PACKAGE_libupm-scam-python3 is not set
-# CONFIG_PACKAGE_libupm-sensortemplate is not set
-# CONFIG_PACKAGE_libupm-sensortemplate-python3 is not set
-# CONFIG_PACKAGE_libupm-servo is not set
-# CONFIG_PACKAGE_libupm-servo-python3 is not set
-# CONFIG_PACKAGE_libupm-sht1x is not set
-# CONFIG_PACKAGE_libupm-sht1x-python3 is not set
-# CONFIG_PACKAGE_libupm-si1132 is not set
-# CONFIG_PACKAGE_libupm-si1132-python3 is not set
-# CONFIG_PACKAGE_libupm-si114x is not set
-# CONFIG_PACKAGE_libupm-si114x-python3 is not set
-# CONFIG_PACKAGE_libupm-si7005 is not set
-# CONFIG_PACKAGE_libupm-si7005-python3 is not set
-# CONFIG_PACKAGE_libupm-slide is not set
-# CONFIG_PACKAGE_libupm-slide-python3 is not set
-# CONFIG_PACKAGE_libupm-sm130 is not set
-# CONFIG_PACKAGE_libupm-sm130-python3 is not set
-# CONFIG_PACKAGE_libupm-smartdrive is not set
-# CONFIG_PACKAGE_libupm-smartdrive-python3 is not set
-# CONFIG_PACKAGE_libupm-speaker is not set
-# CONFIG_PACKAGE_libupm-speaker-python3 is not set
-# CONFIG_PACKAGE_libupm-ssd1351 is not set
-# CONFIG_PACKAGE_libupm-ssd1351-python3 is not set
-# CONFIG_PACKAGE_libupm-st7735 is not set
-# CONFIG_PACKAGE_libupm-st7735-python3 is not set
-# CONFIG_PACKAGE_libupm-stepmotor is not set
-# CONFIG_PACKAGE_libupm-stepmotor-python3 is not set
-# CONFIG_PACKAGE_libupm-sx1276 is not set
-# CONFIG_PACKAGE_libupm-sx1276-python3 is not set
-# CONFIG_PACKAGE_libupm-sx6119 is not set
-# CONFIG_PACKAGE_libupm-sx6119-python3 is not set
-# CONFIG_PACKAGE_libupm-t3311 is not set
-# CONFIG_PACKAGE_libupm-t3311-python3 is not set
-# CONFIG_PACKAGE_libupm-t6713 is not set
-# CONFIG_PACKAGE_libupm-t6713-python3 is not set
-# CONFIG_PACKAGE_libupm-ta12200 is not set
-# CONFIG_PACKAGE_libupm-ta12200-python3 is not set
-# CONFIG_PACKAGE_libupm-tca9548a is not set
-# CONFIG_PACKAGE_libupm-tca9548a-python3 is not set
-# CONFIG_PACKAGE_libupm-tcs3414cs is not set
-# CONFIG_PACKAGE_libupm-tcs3414cs-python3 is not set
-# CONFIG_PACKAGE_libupm-tcs37727 is not set
-# CONFIG_PACKAGE_libupm-tcs37727-python3 is not set
-# CONFIG_PACKAGE_libupm-teams is not set
-# CONFIG_PACKAGE_libupm-teams-python3 is not set
-# CONFIG_PACKAGE_libupm-temperature is not set
-# CONFIG_PACKAGE_libupm-temperature-python3 is not set
-# CONFIG_PACKAGE_libupm-tex00 is not set
-# CONFIG_PACKAGE_libupm-tex00-python3 is not set
-# CONFIG_PACKAGE_libupm-th02 is not set
-# CONFIG_PACKAGE_libupm-th02-python3 is not set
-# CONFIG_PACKAGE_libupm-tm1637 is not set
-# CONFIG_PACKAGE_libupm-tm1637-python3 is not set
-# CONFIG_PACKAGE_libupm-tmp006 is not set
-# CONFIG_PACKAGE_libupm-tmp006-python3 is not set
-# CONFIG_PACKAGE_libupm-tsl2561 is not set
-# CONFIG_PACKAGE_libupm-tsl2561-python3 is not set
-# CONFIG_PACKAGE_libupm-ttp223 is not set
-# CONFIG_PACKAGE_libupm-ttp223-python3 is not set
-# CONFIG_PACKAGE_libupm-uartat is not set
-# CONFIG_PACKAGE_libupm-uartat-python3 is not set
-# CONFIG_PACKAGE_libupm-uln200xa is not set
-# CONFIG_PACKAGE_libupm-uln200xa-python3 is not set
-# CONFIG_PACKAGE_libupm-ultrasonic is not set
-# CONFIG_PACKAGE_libupm-ultrasonic-python3 is not set
-# CONFIG_PACKAGE_libupm-urm37 is not set
-# CONFIG_PACKAGE_libupm-urm37-python3 is not set
-# CONFIG_PACKAGE_libupm-utilities is not set
-# CONFIG_PACKAGE_libupm-utilities-python3 is not set
-# CONFIG_PACKAGE_libupm-vcap is not set
-# CONFIG_PACKAGE_libupm-vcap-python3 is not set
-# CONFIG_PACKAGE_libupm-vdiv is not set
-# CONFIG_PACKAGE_libupm-vdiv-python3 is not set
-# CONFIG_PACKAGE_libupm-veml6070 is not set
-# CONFIG_PACKAGE_libupm-veml6070-python3 is not set
-# CONFIG_PACKAGE_libupm-water is not set
-# CONFIG_PACKAGE_libupm-water-python3 is not set
-# CONFIG_PACKAGE_libupm-waterlevel is not set
-# CONFIG_PACKAGE_libupm-waterlevel-python3 is not set
-# CONFIG_PACKAGE_libupm-wfs is not set
-# CONFIG_PACKAGE_libupm-wfs-python3 is not set
-# CONFIG_PACKAGE_libupm-wheelencoder is not set
-# CONFIG_PACKAGE_libupm-wheelencoder-python3 is not set
-# CONFIG_PACKAGE_libupm-wt5001 is not set
-# CONFIG_PACKAGE_libupm-wt5001-python3 is not set
-# CONFIG_PACKAGE_libupm-xbee is not set
-# CONFIG_PACKAGE_libupm-xbee-python3 is not set
-# CONFIG_PACKAGE_libupm-yg1006 is not set
-# CONFIG_PACKAGE_libupm-yg1006-python3 is not set
-# CONFIG_PACKAGE_libupm-zfm20 is not set
-# CONFIG_PACKAGE_libupm-zfm20-python3 is not set
-# end of IoT
-
-#
-# Languages
-#
-# CONFIG_PACKAGE_libyaml is not set
-# end of Languages
-
-#
-# LibElektra
-#
-# CONFIG_PACKAGE_libelektra-boost is not set
-# CONFIG_PACKAGE_libelektra-core is not set
-# CONFIG_PACKAGE_libelektra-cpp is not set
-# CONFIG_PACKAGE_libelektra-crypto is not set
-# CONFIG_PACKAGE_libelektra-curlget is not set
-# CONFIG_PACKAGE_libelektra-dbus is not set
-# CONFIG_PACKAGE_libelektra-extra is not set
-# CONFIG_PACKAGE_libelektra-lua is not set
-# CONFIG_PACKAGE_libelektra-plugins is not set
-# CONFIG_PACKAGE_libelektra-python3 is not set
-# CONFIG_PACKAGE_libelektra-resolvers is not set
-# CONFIG_PACKAGE_libelektra-xerces is not set
-# CONFIG_PACKAGE_libelektra-xml is not set
-# CONFIG_PACKAGE_libelektra-yajl is not set
-# CONFIG_PACKAGE_libelektra-yamlcpp is not set
-# CONFIG_PACKAGE_libelektra-zmq is not set
-# end of LibElektra
-
-#
-# Networking
-#
-# CONFIG_PACKAGE_libdcwproto is not set
-# CONFIG_PACKAGE_libdcwsocket is not set
-# CONFIG_PACKAGE_libsctp is not set
-# CONFIG_PACKAGE_libuhttpd-mbedtls is not set
-# CONFIG_PACKAGE_libuhttpd-nossl is not set
-# CONFIG_PACKAGE_libuhttpd-openssl is not set
-# CONFIG_PACKAGE_libuhttpd-wolfssl is not set
-# CONFIG_PACKAGE_libulfius-gnutls is not set
-# CONFIG_PACKAGE_libulfius-nossl is not set
-# CONFIG_PACKAGE_libunbound is not set
-# CONFIG_PACKAGE_libuwsc-mbedtls is not set
-# CONFIG_PACKAGE_libuwsc-nossl is not set
-# CONFIG_PACKAGE_libuwsc-openssl is not set
-# CONFIG_PACKAGE_libuwsc-wolfssl is not set
-# end of Networking
-
-#
-# SSL
-#
-# CONFIG_PACKAGE_libgnutls is not set
-# CONFIG_PACKAGE_libgnutls-dane is not set
-# CONFIG_PACKAGE_libmbedtls is not set
-# CONFIG_PACKAGE_libnss is not set
-CONFIG_PACKAGE_libopenssl=y
-
-#
-# Build Options
-#
-# CONFIG_OPENSSL_OPTIMIZE_SPEED is not set
-CONFIG_OPENSSL_WITH_ASM=y
-CONFIG_OPENSSL_WITH_DEPRECATED=y
-# CONFIG_OPENSSL_NO_DEPRECATED is not set
-CONFIG_OPENSSL_WITH_ERROR_MESSAGES=y
-
-#
-# Protocol Support
-#
-CONFIG_OPENSSL_WITH_TLS13=y
-# CONFIG_OPENSSL_WITH_DTLS is not set
-# CONFIG_OPENSSL_WITH_NPN is not set
-CONFIG_OPENSSL_WITH_SRP=y
-CONFIG_OPENSSL_WITH_CMS=y
-
-#
-# Algorithm Selection
-#
-# CONFIG_OPENSSL_WITH_EC2M is not set
-CONFIG_OPENSSL_WITH_CHACHA_POLY1305=y
-# CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM is not set
-CONFIG_OPENSSL_WITH_PSK=y
-
-#
-# Less commonly used build options
-#
-# CONFIG_OPENSSL_WITH_ARIA is not set
-# CONFIG_OPENSSL_WITH_CAMELLIA is not set
-# CONFIG_OPENSSL_WITH_IDEA is not set
-# CONFIG_OPENSSL_WITH_SEED is not set
-# CONFIG_OPENSSL_WITH_SM234 is not set
-# CONFIG_OPENSSL_WITH_BLAKE2 is not set
-# CONFIG_OPENSSL_WITH_MDC2 is not set
-# CONFIG_OPENSSL_WITH_WHIRLPOOL is not set
-# CONFIG_OPENSSL_WITH_COMPRESSION is not set
-# CONFIG_OPENSSL_WITH_RFC3779 is not set
-
-#
-# Engine/Hardware Support
-#
-CONFIG_OPENSSL_ENGINE=y
-# CONFIG_OPENSSL_ENGINE_BUILTIN is not set
-# CONFIG_OPENSSL_WITH_GOST is not set
-# CONFIG_PACKAGE_libopenssl-afalg is not set
-# CONFIG_PACKAGE_libopenssl-afalg_sync is not set
-# CONFIG_PACKAGE_libopenssl-conf is not set
-# CONFIG_PACKAGE_libopenssl-devcrypto is not set
-CONFIG_PACKAGE_libwolfssl=m
-CONFIG_WOLFSSL_HAS_AES_CCM=y
-CONFIG_WOLFSSL_HAS_CHACHA_POLY=y
-CONFIG_WOLFSSL_HAS_DH=y
-CONFIG_WOLFSSL_HAS_ARC4=y
-CONFIG_WOLFSSL_HAS_CERTGEN=y
-CONFIG_WOLFSSL_HAS_TLSV10=y
-CONFIG_WOLFSSL_HAS_TLSV13=y
-CONFIG_WOLFSSL_HAS_SESSION_TICKET=y
-# CONFIG_WOLFSSL_HAS_DTLS is not set
-CONFIG_WOLFSSL_HAS_OCSP=y
-CONFIG_WOLFSSL_HAS_WPAS=y
-CONFIG_WOLFSSL_HAS_ECC25519=y
-CONFIG_WOLFSSL_ALT_NAMES=y
-CONFIG_WOLFSSL_HAS_NO_HW=y
-# CONFIG_WOLFSSL_HAS_AFALG is not set
-# CONFIG_WOLFSSL_HAS_DEVCRYPTO_CBC is not set
-# CONFIG_WOLFSSL_HAS_DEVCRYPTO_AES is not set
-# CONFIG_WOLFSSL_HAS_DEVCRYPTO_FULL is not set
-# end of SSL
-
-#
-# Sound
-#
-# CONFIG_PACKAGE_alsa-ucm-conf is not set
-# CONFIG_PACKAGE_liblo is not set
-# end of Sound
-
-#
-# libimobiledevice
-#
-# CONFIG_PACKAGE_libimobiledevice is not set
-# CONFIG_PACKAGE_libirecovery is not set
-# CONFIG_PACKAGE_libplist is not set
-# CONFIG_PACKAGE_libplistcxx is not set
-# CONFIG_PACKAGE_libusbmuxd is not set
-# end of libimobiledevice
-
-# CONFIG_PACKAGE_acsccid is not set
-# CONFIG_PACKAGE_alsa-lib is not set
-# CONFIG_PACKAGE_argp-standalone is not set
-# CONFIG_PACKAGE_bind-libs is not set
-# CONFIG_PACKAGE_bluez-libs is not set
-# CONFIG_PACKAGE_boost is not set
-# CONFIG_boost-context-exclude is not set
-# CONFIG_boost-coroutine-exclude is not set
-# CONFIG_boost-fiber-exclude is not set
-# CONFIG_PACKAGE_cJSON is not set
-# CONFIG_PACKAGE_ccid is not set
-# CONFIG_PACKAGE_check is not set
-# CONFIG_PACKAGE_confuse is not set
-# CONFIG_PACKAGE_czmq is not set
-# CONFIG_PACKAGE_dtndht is not set
-# CONFIG_PACKAGE_getdns is not set
-# CONFIG_PACKAGE_giflib is not set
-# CONFIG_PACKAGE_glib2 is not set
-# CONFIG_PACKAGE_google-authenticator-libpam is not set
-# CONFIG_PACKAGE_hidapi is not set
-# CONFIG_PACKAGE_ibrcommon is not set
-# CONFIG_PACKAGE_ibrdtn is not set
-# CONFIG_PACKAGE_icu is not set
-# CONFIG_PACKAGE_icu-data-tools is not set
-# CONFIG_PACKAGE_icu-full-data is not set
-# CONFIG_PACKAGE_jansson is not set
-# CONFIG_PACKAGE_json-glib is not set
-# CONFIG_PACKAGE_jsoncpp is not set
-# CONFIG_PACKAGE_knot-libs is not set
-# CONFIG_PACKAGE_knot-libzscanner is not set
-# CONFIG_PACKAGE_libaio is not set
-# CONFIG_PACKAGE_libantlr3c is not set
-# CONFIG_PACKAGE_libao is not set
-# CONFIG_PACKAGE_libapr is not set
-# CONFIG_PACKAGE_libaprutil is not set
-# CONFIG_PACKAGE_libarchive is not set
-# CONFIG_PACKAGE_libarchive-noopenssl is not set
-# CONFIG_PACKAGE_libasm is not set
-# CONFIG_PACKAGE_libassuan is not set
-# CONFIG_PACKAGE_libatasmart is not set
-# CONFIG_PACKAGE_libaudit is not set
-# CONFIG_PACKAGE_libauparse is not set
-# CONFIG_PACKAGE_libavahi-client is not set
-# CONFIG_PACKAGE_libavahi-compat-libdnssd is not set
-# CONFIG_PACKAGE_libavahi-dbus-support is not set
-# CONFIG_PACKAGE_libavahi-nodbus-support is not set
-CONFIG_PACKAGE_libbfd=y
-CONFIG_PACKAGE_libblkid=y
-CONFIG_PACKAGE_libblobmsg-json=y
-CONFIG_PACKAGE_libbpf=y
-# CONFIG_PACKAGE_libbsd is not set
-# CONFIG_PACKAGE_libcap is not set
-# CONFIG_PACKAGE_libcap-ng is not set
-# CONFIG_PACKAGE_libcares is not set
-# CONFIG_PACKAGE_libcbor is not set
-# CONFIG_PACKAGE_libcgroup is not set
-# CONFIG_PACKAGE_libcharset is not set
-# CONFIG_PACKAGE_libcoap is not set
-CONFIG_PACKAGE_libcomerr=m
-# CONFIG_PACKAGE_libconfig is not set
-CONFIG_PACKAGE_libctf=y
-# CONFIG_PACKAGE_libcurl is not set
-# CONFIG_PACKAGE_libdaemon is not set
-# CONFIG_PACKAGE_libdaq is not set
-# CONFIG_PACKAGE_libdaq3 is not set
-# CONFIG_PACKAGE_libdb47 is not set
-# CONFIG_PACKAGE_libdb47xx is not set
-# CONFIG_PACKAGE_libdbi is not set
-# CONFIG_PACKAGE_libdbus is not set
-# CONFIG_PACKAGE_libdevmapper is not set
-# CONFIG_PACKAGE_libdevmapper-selinux is not set
-# CONFIG_PACKAGE_libdmapsharing is not set
-# CONFIG_PACKAGE_libdnet is not set
-# CONFIG_PACKAGE_libdrm is not set
-# CONFIG_PACKAGE_libdvbcsa is not set
-CONFIG_PACKAGE_libdw=y
-# CONFIG_PACKAGE_libecdsautil is not set
-# CONFIG_PACKAGE_libedit is not set
-CONFIG_PACKAGE_libelf=y
-# CONFIG_PACKAGE_libesmtp is not set
-# CONFIG_PACKAGE_libestr is not set
-# CONFIG_PACKAGE_libev is not set
-# CONFIG_PACKAGE_libevdev is not set
-# CONFIG_PACKAGE_libevent2 is not set
-# CONFIG_PACKAGE_libevent2-core is not set
-# CONFIG_PACKAGE_libevent2-extra is not set
-# CONFIG_PACKAGE_libevent2-openssl is not set
-# CONFIG_PACKAGE_libevent2-pthreads is not set
-# CONFIG_PACKAGE_libexif is not set
-# CONFIG_PACKAGE_libexpat is not set
-# CONFIG_PACKAGE_libexslt is not set
-CONFIG_PACKAGE_libext2fs=m
-# CONFIG_PACKAGE_libextractor is not set
-CONFIG_PACKAGE_libf2fs=m
-# CONFIG_PACKAGE_libf2fs-selinux is not set
-# CONFIG_PACKAGE_libfaad2 is not set
-# CONFIG_PACKAGE_libfastjson is not set
-# CONFIG_PACKAGE_libfdisk is not set
-# CONFIG_PACKAGE_libfdt is not set
-# CONFIG_PACKAGE_libffi is not set
-# CONFIG_PACKAGE_libffmpeg-audio-dec is not set
-# CONFIG_PACKAGE_libffmpeg-custom is not set
-# CONFIG_PACKAGE_libffmpeg-full is not set
-# CONFIG_PACKAGE_libffmpeg-mini is not set
-# CONFIG_PACKAGE_libfido2 is not set
-# CONFIG_PACKAGE_libflac is not set
-# CONFIG_PACKAGE_libfmt is not set
-# CONFIG_PACKAGE_libfreetype is not set
-CONFIG_PACKAGE_libfstools-bootparam=y
-# CONFIG_PACKAGE_libfstrm is not set
-# CONFIG_PACKAGE_libftdi is not set
-# CONFIG_PACKAGE_libftdi1 is not set
-# CONFIG_PACKAGE_libgabe is not set
-# CONFIG_PACKAGE_libgcrypt is not set
-# CONFIG_PACKAGE_libgd is not set
-# CONFIG_PACKAGE_libgd-full is not set
-# CONFIG_PACKAGE_libgdbm is not set
-# CONFIG_PACKAGE_libgee is not set
-# CONFIG_PACKAGE_libgmp is not set
-# CONFIG_PACKAGE_libgnurl is not set
-# CONFIG_PACKAGE_libgpg-error is not set
-# CONFIG_PACKAGE_libgpgme is not set
-# CONFIG_PACKAGE_libgpgmepp is not set
-# CONFIG_PACKAGE_libgphoto2 is not set
-# CONFIG_PACKAGE_libgpiod is not set
-# CONFIG_PACKAGE_libgps is not set
-CONFIG_PACKAGE_libgsl=y
-# CONFIG_PACKAGE_libh2o is not set
-# CONFIG_PACKAGE_libh2o-evloop is not set
-# CONFIG_PACKAGE_libhamlib is not set
-# CONFIG_PACKAGE_libhavege is not set
-# CONFIG_PACKAGE_libhiredis is not set
-# CONFIG_PACKAGE_libhttp-parser is not set
-# CONFIG_PACKAGE_libhwloc is not set
-# CONFIG_PACKAGE_libi2c is not set
-# CONFIG_PACKAGE_libical is not set
-# CONFIG_PACKAGE_libiconv is not set
-# CONFIG_PACKAGE_libiconv-full is not set
-# CONFIG_PACKAGE_libid3tag is not set
-# CONFIG_PACKAGE_libidn is not set
-# CONFIG_PACKAGE_libidn2 is not set
-# CONFIG_PACKAGE_libiio is not set
-# CONFIG_PACKAGE_libinotifytools is not set
-# CONFIG_PACKAGE_libinput is not set
-# CONFIG_PACKAGE_libintl is not set
-# CONFIG_PACKAGE_libintl-full is not set
-# CONFIG_PACKAGE_libipfs-http-client is not set
-# CONFIG_PACKAGE_libiw is not set
-CONFIG_PACKAGE_libiwinfo=y
-# CONFIG_PACKAGE_libjpeg-turbo is not set
-CONFIG_PACKAGE_libjson-c=y
-# CONFIG_PACKAGE_libkeyutils is not set
-# CONFIG_PACKAGE_libkmod is not set
-# CONFIG_PACKAGE_libksba is not set
-CONFIG_PACKAGE_libkvcutil=y
-# CONFIG_PACKAGE_libldns is not set
-# CONFIG_PACKAGE_libleptonica is not set
-# CONFIG_PACKAGE_libloragw is not set
-# CONFIG_PACKAGE_libltdl is not set
-CONFIG_PACKAGE_liblua=y
-# CONFIG_PACKAGE_liblua5.3 is not set
-CONFIG_PACKAGE_liblucihttp=y
-CONFIG_PACKAGE_liblucihttp-lua=y
-# CONFIG_PACKAGE_liblzo is not set
-# CONFIG_PACKAGE_libmad is not set
-# CONFIG_PACKAGE_libmagic is not set
-# CONFIG_PACKAGE_libmaxminddb is not set
-# CONFIG_PACKAGE_libmbim is not set
-# CONFIG_PACKAGE_libmcrypt is not set
-# CONFIG_PACKAGE_libmicrohttpd-no-ssl is not set
-# CONFIG_PACKAGE_libmicrohttpd-ssl is not set
-# CONFIG_PACKAGE_libmilter-sendmail is not set
-# CONFIG_PACKAGE_libminiupnpc is not set
-# CONFIG_PACKAGE_libmms is not set
-# CONFIG_PACKAGE_libmnl is not set
-# CONFIG_PACKAGE_libmodbus is not set
-# CONFIG_PACKAGE_libmosquitto-nossl is not set
-# CONFIG_PACKAGE_libmosquitto-ssl is not set
-# CONFIG_PACKAGE_libmount is not set
-# CONFIG_PACKAGE_libmpdclient is not set
-# CONFIG_PACKAGE_libmpeg2 is not set
-# CONFIG_PACKAGE_libmpg123 is not set
-# CONFIG_PACKAGE_libnatpmp is not set
-# CONFIG_PACKAGE_libncurses is not set
-# CONFIG_PACKAGE_libndpi is not set
-# CONFIG_PACKAGE_libneon is not set
-# CONFIG_PACKAGE_libnet-1.2.x is not set
-# CONFIG_PACKAGE_libnetconf2 is not set
-# CONFIG_PACKAGE_libnetfilter-acct is not set
-# CONFIG_PACKAGE_libnetfilter-conntrack is not set
-# CONFIG_PACKAGE_libnetfilter-cthelper is not set
-# CONFIG_PACKAGE_libnetfilter-cttimeout is not set
-# CONFIG_PACKAGE_libnetfilter-log is not set
-# CONFIG_PACKAGE_libnetfilter-queue is not set
-# CONFIG_PACKAGE_libnetsnmp is not set
-# CONFIG_PACKAGE_libnettle is not set
-# CONFIG_PACKAGE_libnewt is not set
-# CONFIG_PACKAGE_libnfnetlink is not set
-# CONFIG_PACKAGE_libnftnl is not set
-# CONFIG_PACKAGE_libnghttp2 is not set
-# CONFIG_PACKAGE_libnl is not set
-# CONFIG_PACKAGE_libnl-core is not set
-# CONFIG_PACKAGE_libnl-genl is not set
-# CONFIG_PACKAGE_libnl-nf is not set
-# CONFIG_PACKAGE_libnl-route is not set
-CONFIG_PACKAGE_libnl-tiny=y
-# CONFIG_PACKAGE_libnopoll is not set
-# CONFIG_PACKAGE_libnpth is not set
-# CONFIG_PACKAGE_libnpupnp is not set
-# CONFIG_PACKAGE_libogg is not set
-# CONFIG_PACKAGE_liboil is not set
-CONFIG_PACKAGE_libopcodes=y
-# CONFIG_PACKAGE_libopendkim is not set
-# CONFIG_PACKAGE_libopenobex is not set
-# CONFIG_PACKAGE_libopensc is not set
-# CONFIG_PACKAGE_libopenzwave is not set
-# CONFIG_PACKAGE_liboping is not set
-# CONFIG_PACKAGE_libopus is not set
-# CONFIG_PACKAGE_libopusenc is not set
-# CONFIG_PACKAGE_libopusfile is not set
-# CONFIG_PACKAGE_liborcania is not set
-# CONFIG_PACKAGE_libout123 is not set
-# CONFIG_PACKAGE_libowipcalc is not set
-# CONFIG_PACKAGE_libp11 is not set
-# CONFIG_PACKAGE_libpagekite is not set
-# CONFIG_PACKAGE_libpam is not set
-# CONFIG_PACKAGE_libpbc is not set
-CONFIG_PACKAGE_libpcap=y
-
-#
-# Configuration
-#
-# CONFIG_PCAP_HAS_USB is not set
-# CONFIG_PCAP_HAS_NETFILTER is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_libpci is not set
-# CONFIG_PACKAGE_libpciaccess is not set
-# CONFIG_PACKAGE_libpcre is not set
-# CONFIG_PACKAGE_libpcre16 is not set
-# CONFIG_PACKAGE_libpcre2 is not set
-# CONFIG_PACKAGE_libpcre2-16 is not set
-# CONFIG_PACKAGE_libpcre2-32 is not set
-# CONFIG_PACKAGE_libpcre32 is not set
-# CONFIG_PACKAGE_libpcrecpp is not set
-# CONFIG_PACKAGE_libpcsclite is not set
-# CONFIG_PACKAGE_libpfring is not set
-# CONFIG_PACKAGE_libpkcs11-spy is not set
-# CONFIG_PACKAGE_libpkgconf is not set
-# CONFIG_PACKAGE_libpng is not set
-# CONFIG_PACKAGE_libpopt is not set
-# CONFIG_PACKAGE_libprotobuf-c is not set
-# CONFIG_PACKAGE_libpsl is not set
-# CONFIG_PACKAGE_libqmi is not set
-# CONFIG_PACKAGE_libqrencode is not set
-# CONFIG_PACKAGE_libqrtr-glib is not set
-# CONFIG_PACKAGE_libradcli is not set
-# CONFIG_PACKAGE_libradiotap is not set
-# CONFIG_PACKAGE_libreadline is not set
-# CONFIG_PACKAGE_libredblack is not set
-# CONFIG_PACKAGE_librouteros is not set
-# CONFIG_PACKAGE_libroxml is not set
-# CONFIG_PACKAGE_librrd1 is not set
-# CONFIG_PACKAGE_librtlsdr is not set
-# CONFIG_PACKAGE_libruby is not set
-# CONFIG_PACKAGE_libsamplerate is not set
-# CONFIG_PACKAGE_libsane is not set
-# CONFIG_PACKAGE_libsasl2 is not set
-# CONFIG_PACKAGE_libsearpc is not set
-# CONFIG_PACKAGE_libseccomp is not set
-# CONFIG_PACKAGE_libselinux is not set
-# CONFIG_PACKAGE_libsemanage is not set
-# CONFIG_PACKAGE_libsensors is not set
-# CONFIG_PACKAGE_libsepol is not set
-# CONFIG_PACKAGE_libshout is not set
-# CONFIG_PACKAGE_libshout-full is not set
-# CONFIG_PACKAGE_libshout-nossl is not set
-# CONFIG_PACKAGE_libsispmctl is not set
-# CONFIG_PACKAGE_libslang2 is not set
-# CONFIG_PACKAGE_libslang2-mod-base64 is not set
-# CONFIG_PACKAGE_libslang2-mod-chksum is not set
-# CONFIG_PACKAGE_libslang2-mod-csv is not set
-# CONFIG_PACKAGE_libslang2-mod-fcntl is not set
-# CONFIG_PACKAGE_libslang2-mod-fork is not set
-# CONFIG_PACKAGE_libslang2-mod-histogram is not set
-# CONFIG_PACKAGE_libslang2-mod-iconv is not set
-# CONFIG_PACKAGE_libslang2-mod-json is not set
-# CONFIG_PACKAGE_libslang2-mod-onig is not set
-# CONFIG_PACKAGE_libslang2-mod-pcre is not set
-# CONFIG_PACKAGE_libslang2-mod-png is not set
-# CONFIG_PACKAGE_libslang2-mod-rand is not set
-# CONFIG_PACKAGE_libslang2-mod-select is not set
-# CONFIG_PACKAGE_libslang2-mod-slsmg is not set
-# CONFIG_PACKAGE_libslang2-mod-socket is not set
-# CONFIG_PACKAGE_libslang2-mod-stats is not set
-# CONFIG_PACKAGE_libslang2-mod-sysconf is not set
-# CONFIG_PACKAGE_libslang2-mod-termios is not set
-# CONFIG_PACKAGE_libslang2-mod-varray is not set
-# CONFIG_PACKAGE_libslang2-mod-zlib is not set
-# CONFIG_PACKAGE_libslang2-modules is not set
-CONFIG_PACKAGE_libsmartcols=m
-# CONFIG_PACKAGE_libsndfile is not set
-# CONFIG_PACKAGE_libsoc is not set
-# CONFIG_PACKAGE_libsocks is not set
-# CONFIG_PACKAGE_libsodium is not set
-# CONFIG_PACKAGE_libsoup is not set
-# CONFIG_PACKAGE_libsoxr is not set
-# CONFIG_PACKAGE_libspeex is not set
-# CONFIG_PACKAGE_libspeexdsp is not set
-# CONFIG_PACKAGE_libspice-server is not set
-CONFIG_PACKAGE_libss=m
-# CONFIG_PACKAGE_libssh is not set
-# CONFIG_PACKAGE_libssh2 is not set
-# CONFIG_PACKAGE_libstoken is not set
-# CONFIG_PACKAGE_libstrophe is not set
-# CONFIG_PACKAGE_libsyn123 is not set
-# CONFIG_PACKAGE_libsysrepo is not set
-# CONFIG_PACKAGE_libtalloc is not set
-# CONFIG_PACKAGE_libtasn1 is not set
-# CONFIG_PACKAGE_libtheora is not set
-# CONFIG_PACKAGE_libtiff is not set
-# CONFIG_PACKAGE_libtiffxx is not set
-# CONFIG_PACKAGE_libtins is not set
-# CONFIG_PACKAGE_libtirpc is not set
-# CONFIG_PACKAGE_libtorrent-rasterbar is not set
-CONFIG_PACKAGE_libubox=y
-# CONFIG_PACKAGE_libubox-lua is not set
-CONFIG_PACKAGE_libubus=y
-CONFIG_PACKAGE_libubus-lua=y
-CONFIG_PACKAGE_libuci=y
-# CONFIG_PACKAGE_libuci-lua is not set
-# CONFIG_PACKAGE_libuci2 is not set
-CONFIG_PACKAGE_libuclient=y
-CONFIG_PACKAGE_libucode=y
-# CONFIG_PACKAGE_libudev-zero is not set
-# CONFIG_PACKAGE_libudns is not set
-# CONFIG_PACKAGE_libuecc is not set
-# CONFIG_PACKAGE_libugpio is not set
-# CONFIG_PACKAGE_libunistring is not set
-# CONFIG_PACKAGE_libunwind is not set
-# CONFIG_PACKAGE_libupnp is not set
-# CONFIG_PACKAGE_libupnpp is not set
-# CONFIG_PACKAGE_liburcu is not set
-# CONFIG_PACKAGE_liburing is not set
-# CONFIG_PACKAGE_libusb-1.0 is not set
-# CONFIG_PACKAGE_libusb-compat is not set
-# CONFIG_PACKAGE_libustream-mbedtls is not set
-# CONFIG_PACKAGE_libustream-openssl is not set
-CONFIG_PACKAGE_libustream-wolfssl=m
-CONFIG_PACKAGE_libuuid=y
-# CONFIG_PACKAGE_libuv is not set
-# CONFIG_PACKAGE_libuwifi is not set
-# CONFIG_PACKAGE_libv4l is not set
-# CONFIG_PACKAGE_libvorbis is not set
-# CONFIG_PACKAGE_libvorbisidec is not set
-# CONFIG_PACKAGE_libvpx is not set
-# CONFIG_PACKAGE_libwebp is not set
-# CONFIG_PACKAGE_libwebsockets-full is not set
-# CONFIG_PACKAGE_libwebsockets-mbedtls is not set
-# CONFIG_PACKAGE_libwebsockets-openssl is not set
-# CONFIG_PACKAGE_libwpactrl is not set
-# CONFIG_PACKAGE_libwrap is not set
-# CONFIG_PACKAGE_libxerces-c is not set
-# CONFIG_PACKAGE_libxerces-c-samples is not set
-# CONFIG_PACKAGE_libxml2 is not set
-# CONFIG_PACKAGE_libxslt is not set
-# CONFIG_PACKAGE_libyaml-cpp is not set
-# CONFIG_PACKAGE_libyang is not set
-# CONFIG_PACKAGE_libyang-cpp is not set
-# CONFIG_PACKAGE_libyubikey is not set
-# CONFIG_PACKAGE_libzmq-curve is not set
-# CONFIG_PACKAGE_libzmq-nc is not set
-# CONFIG_PACKAGE_linux-atm is not set
-# CONFIG_PACKAGE_lmdb is not set
-# CONFIG_PACKAGE_log4cplus is not set
-# CONFIG_PACKAGE_loudmouth is not set
-# CONFIG_PACKAGE_lttng-ust is not set
-# CONFIG_PACKAGE_minizip is not set
-# CONFIG_PACKAGE_msgpack-c is not set
-# CONFIG_PACKAGE_mtdev is not set
-# CONFIG_PACKAGE_musl-fts is not set
-# CONFIG_PACKAGE_mxml is not set
-# CONFIG_PACKAGE_nspr is not set
-# CONFIG_PACKAGE_oniguruma is not set
-# CONFIG_PACKAGE_open-isns is not set
-# CONFIG_PACKAGE_p11-kit is not set
-# CONFIG_PACKAGE_pixman is not set
-# CONFIG_PACKAGE_poco is not set
-# CONFIG_PACKAGE_poco-all is not set
-# CONFIG_PACKAGE_protobuf is not set
-# CONFIG_PACKAGE_protobuf-lite is not set
-# CONFIG_PACKAGE_pthsem is not set
-# CONFIG_PACKAGE_re2 is not set
-CONFIG_PACKAGE_rpcd-mod-luci=y
-# CONFIG_PACKAGE_rpcd-mod-rad2-enc is not set
-CONFIG_PACKAGE_rpcd-mod-rrdns=y
-# CONFIG_PACKAGE_sbc is not set
-# CONFIG_PACKAGE_serdisplib is not set
-# CONFIG_PACKAGE_terminfo is not set
-# CONFIG_PACKAGE_tinycdb is not set
-# CONFIG_PACKAGE_uclibcxx is not set
-# CONFIG_PACKAGE_uw-imap is not set
-# CONFIG_PACKAGE_xmlrpc-c is not set
-# CONFIG_PACKAGE_xmlrpc-c-client is not set
-# CONFIG_PACKAGE_xmlrpc-c-server is not set
-# CONFIG_PACKAGE_yajl is not set
-# CONFIG_PACKAGE_yubico-pam is not set
-CONFIG_PACKAGE_zlib=y
-
-#
-# Configuration
-#
-# CONFIG_ZLIB_OPTIMIZE_SPEED is not set
-# end of Configuration
-# end of Libraries
-
-#
-# LuCI
-#
-
-#
-# 1. Collections
-#
-CONFIG_PACKAGE_luci=y
-# CONFIG_PACKAGE_luci-lib-docker is not set
-# CONFIG_PACKAGE_luci-nginx is not set
-# CONFIG_PACKAGE_luci-ssl is not set
-# CONFIG_PACKAGE_luci-ssl-nginx is not set
-# CONFIG_PACKAGE_luci-ssl-openssl is not set
-# end of 1. Collections
-
-#
-# 2. Modules
-#
-CONFIG_PACKAGE_luci-base=y
-# CONFIG_LUCI_SRCDIET is not set
-CONFIG_LUCI_JSMIN=y
-CONFIG_LUCI_CSSTIDY=y
-
-#
-# Translations
-#
-# CONFIG_LUCI_LANG_ar is not set
-# CONFIG_LUCI_LANG_bg is not set
-# CONFIG_LUCI_LANG_bn_BD is not set
-# CONFIG_LUCI_LANG_ca is not set
-# CONFIG_LUCI_LANG_cs is not set
-# CONFIG_LUCI_LANG_da is not set
-# CONFIG_LUCI_LANG_de is not set
-# CONFIG_LUCI_LANG_el is not set
-# CONFIG_LUCI_LANG_en is not set
-# CONFIG_LUCI_LANG_es is not set
-# CONFIG_LUCI_LANG_fi is not set
-# CONFIG_LUCI_LANG_fr is not set
-# CONFIG_LUCI_LANG_he is not set
-# CONFIG_LUCI_LANG_hi is not set
-# CONFIG_LUCI_LANG_hu is not set
-# CONFIG_LUCI_LANG_it is not set
-# CONFIG_LUCI_LANG_ja is not set
-# CONFIG_LUCI_LANG_ko is not set
-# CONFIG_LUCI_LANG_mr is not set
-# CONFIG_LUCI_LANG_ms is not set
-# CONFIG_LUCI_LANG_nb_NO is not set
-# CONFIG_LUCI_LANG_nl is not set
-# CONFIG_LUCI_LANG_pl is not set
-# CONFIG_LUCI_LANG_pt is not set
-# CONFIG_LUCI_LANG_pt_BR is not set
-# CONFIG_LUCI_LANG_ro is not set
-# CONFIG_LUCI_LANG_ru is not set
-# CONFIG_LUCI_LANG_sk is not set
-# CONFIG_LUCI_LANG_sv is not set
-# CONFIG_LUCI_LANG_tr is not set
-# CONFIG_LUCI_LANG_uk is not set
-# CONFIG_LUCI_LANG_vi is not set
-# CONFIG_LUCI_LANG_zh_Hans is not set
-# CONFIG_LUCI_LANG_zh_Hant is not set
-# end of Translations
-
-# CONFIG_PACKAGE_luci-compat is not set
-CONFIG_PACKAGE_luci-mod-admin-full=y
-# CONFIG_PACKAGE_luci-mod-battstatus is not set
-# CONFIG_PACKAGE_luci-mod-dashboard is not set
-# CONFIG_PACKAGE_luci-mod-failsafe is not set
-CONFIG_PACKAGE_luci-mod-network=y
-# CONFIG_PACKAGE_luci-mod-rpc is not set
-CONFIG_PACKAGE_luci-mod-status=y
-CONFIG_PACKAGE_luci-mod-system=y
-# end of 2. Modules
-
-#
-# 3. Applications
-#
-# CONFIG_PACKAGE_luci-app-acl is not set
-# CONFIG_PACKAGE_luci-app-acme is not set
-# CONFIG_PACKAGE_luci-app-adblock is not set
-# CONFIG_PACKAGE_luci-app-advanced-reboot is not set
-# CONFIG_PACKAGE_luci-app-ahcp is not set
-# CONFIG_PACKAGE_luci-app-aria2 is not set
-# CONFIG_PACKAGE_luci-app-attendedsysupgrade is not set
-# CONFIG_PACKAGE_luci-app-babeld is not set
-# CONFIG_PACKAGE_luci-app-banip is not set
-# CONFIG_PACKAGE_luci-app-bcp38 is not set
-# CONFIG_PACKAGE_luci-app-bird1-ipv4 is not set
-# CONFIG_PACKAGE_luci-app-bird1-ipv6 is not set
-# CONFIG_PACKAGE_luci-app-bmx6 is not set
-# CONFIG_PACKAGE_luci-app-bmx7 is not set
-# CONFIG_PACKAGE_luci-app-cjdns is not set
-# CONFIG_PACKAGE_luci-app-clamav is not set
-# CONFIG_PACKAGE_luci-app-commands is not set
-# CONFIG_PACKAGE_luci-app-cshark is not set
-# CONFIG_PACKAGE_luci-app-dawn is not set
-# CONFIG_PACKAGE_luci-app-dcwapd is not set
-# CONFIG_PACKAGE_luci-app-ddns is not set
-# CONFIG_PACKAGE_luci-app-diag-core is not set
-# CONFIG_PACKAGE_luci-app-dnscrypt-proxy is not set
-# CONFIG_PACKAGE_luci-app-dockerman is not set
-# CONFIG_PACKAGE_luci-app-dump1090 is not set
-# CONFIG_PACKAGE_luci-app-dynapoint is not set
-# CONFIG_PACKAGE_luci-app-eoip is not set
-CONFIG_PACKAGE_luci-app-firewall=y
-# CONFIG_PACKAGE_luci-app-frpc is not set
-# CONFIG_PACKAGE_luci-app-frps is not set
-# CONFIG_PACKAGE_luci-app-fwknopd is not set
-# CONFIG_PACKAGE_luci-app-hd-idle is not set
-# CONFIG_PACKAGE_luci-app-hnet is not set
-# CONFIG_PACKAGE_luci-app-https-dns-proxy is not set
-# CONFIG_PACKAGE_luci-app-ksmbd is not set
-# CONFIG_PACKAGE_luci-app-ledtrig-rssi is not set
-# CONFIG_PACKAGE_luci-app-ledtrig-switch is not set
-# CONFIG_PACKAGE_luci-app-ledtrig-usbport is not set
-# CONFIG_PACKAGE_luci-app-lxc is not set
-# CONFIG_PACKAGE_luci-app-minidlna is not set
-# CONFIG_PACKAGE_luci-app-mjpg-streamer is not set
-# CONFIG_PACKAGE_luci-app-mwan3 is not set
-# CONFIG_PACKAGE_luci-app-nextdns is not set
-# CONFIG_PACKAGE_luci-app-nft-qos is not set
-# CONFIG_PACKAGE_luci-app-nlbwmon is not set
-# CONFIG_PACKAGE_luci-app-ntpc is not set
-# CONFIG_PACKAGE_luci-app-nut is not set
-# CONFIG_PACKAGE_luci-app-ocserv is not set
-# CONFIG_PACKAGE_luci-app-olsr is not set
-# CONFIG_PACKAGE_luci-app-olsr-services is not set
-# CONFIG_PACKAGE_luci-app-olsr-viz is not set
-# CONFIG_PACKAGE_luci-app-omcproxy is not set
-# CONFIG_PACKAGE_luci-app-openvpn is not set
-CONFIG_PACKAGE_luci-app-opkg=y
-# CONFIG_PACKAGE_luci-app-p910nd is not set
-# CONFIG_PACKAGE_luci-app-pagekitec is not set
-# CONFIG_PACKAGE_luci-app-polipo is not set
-# CONFIG_PACKAGE_luci-app-privoxy is not set
-# CONFIG_PACKAGE_luci-app-qos is not set
-# CONFIG_PACKAGE_luci-app-radicale is not set
-# CONFIG_PACKAGE_luci-app-radicale2 is not set
-# CONFIG_PACKAGE_luci-app-rp-pppoe-server is not set
-# CONFIG_PACKAGE_luci-app-samba4 is not set
-# CONFIG_PACKAGE_luci-app-ser2net is not set
-# CONFIG_PACKAGE_luci-app-shadowsocks-libev is not set
-# CONFIG_PACKAGE_luci-app-shairplay is not set
-# CONFIG_PACKAGE_luci-app-siitwizard is not set
-# CONFIG_PACKAGE_luci-app-simple-adblock is not set
-# CONFIG_PACKAGE_luci-app-smartdns is not set
-# CONFIG_PACKAGE_luci-app-snmpd is not set
-# CONFIG_PACKAGE_luci-app-softether is not set
-# CONFIG_PACKAGE_luci-app-splash is not set
-# CONFIG_PACKAGE_luci-app-sqm is not set
-# CONFIG_PACKAGE_luci-app-squid is not set
-# CONFIG_PACKAGE_luci-app-statistics is not set
-# CONFIG_PACKAGE_luci-app-tinyproxy is not set
-# CONFIG_PACKAGE_luci-app-transmission is not set
-# CONFIG_PACKAGE_luci-app-travelmate is not set
-# CONFIG_PACKAGE_luci-app-ttyd is not set
-# CONFIG_PACKAGE_luci-app-udpxy is not set
-# CONFIG_PACKAGE_luci-app-uhttpd is not set
-# CONFIG_PACKAGE_luci-app-unbound is not set
-# CONFIG_PACKAGE_luci-app-upnp is not set
-# CONFIG_PACKAGE_luci-app-vnstat is not set
-# CONFIG_PACKAGE_luci-app-vnstat2 is not set
-# CONFIG_PACKAGE_luci-app-vpn-policy-routing is not set
-# CONFIG_PACKAGE_luci-app-vpnbypass is not set
-# CONFIG_PACKAGE_luci-app-watchcat is not set
-# CONFIG_PACKAGE_luci-app-wifischedule is not set
-# CONFIG_PACKAGE_luci-app-wireguard is not set
-# CONFIG_PACKAGE_luci-app-wol is not set
-# CONFIG_PACKAGE_luci-app-xinetd is not set
-# CONFIG_PACKAGE_luci-app-yggdrasil is not set
-# end of 3. Applications
-
-#
-# 4. Themes
-#
-CONFIG_PACKAGE_luci-theme-bootstrap=y
-# CONFIG_PACKAGE_luci-theme-material is not set
-# CONFIG_PACKAGE_luci-theme-openwrt is not set
-# CONFIG_PACKAGE_luci-theme-openwrt-2020 is not set
-# end of 4. Themes
-
-#
-# 5. Protocols
-#
-# CONFIG_PACKAGE_luci-proto-3g is not set
-# CONFIG_PACKAGE_luci-proto-bonding is not set
-# CONFIG_PACKAGE_luci-proto-gre is not set
-# CONFIG_PACKAGE_luci-proto-hnet is not set
-# CONFIG_PACKAGE_luci-proto-ipip is not set
-CONFIG_PACKAGE_luci-proto-ipv6=y
-# CONFIG_PACKAGE_luci-proto-modemmanager is not set
-# CONFIG_PACKAGE_luci-proto-ncm is not set
-# CONFIG_PACKAGE_luci-proto-openconnect is not set
-# CONFIG_PACKAGE_luci-proto-openfortivpn is not set
-CONFIG_PACKAGE_luci-proto-ppp=y
-# CONFIG_PACKAGE_luci-proto-pppossh is not set
-# CONFIG_PACKAGE_luci-proto-qmi is not set
-# CONFIG_PACKAGE_luci-proto-relay is not set
-# CONFIG_PACKAGE_luci-proto-sstp is not set
-# CONFIG_PACKAGE_luci-proto-vpnc is not set
-# CONFIG_PACKAGE_luci-proto-vxlan is not set
-# CONFIG_PACKAGE_luci-proto-wireguard is not set
-# end of 5. Protocols
-
-#
-# 6. Libraries
-#
-CONFIG_PACKAGE_luci-lib-base=y
-# CONFIG_PACKAGE_luci-lib-dracula is not set
-# CONFIG_PACKAGE_luci-lib-httpclient is not set
-# CONFIG_PACKAGE_luci-lib-httpprotoutils is not set
-CONFIG_PACKAGE_luci-lib-ip=y
-# CONFIG_PACKAGE_luci-lib-ipkg is not set
-# CONFIG_PACKAGE_luci-lib-iptparser is not set
-# CONFIG_PACKAGE_luci-lib-jquery-1-4 is not set
-# CONFIG_PACKAGE_luci-lib-json is not set
-CONFIG_PACKAGE_luci-lib-jsonc=y
-CONFIG_PACKAGE_luci-lib-nixio=y
-CONFIG_PACKAGE_luci-lib-nixio_notls=y
-# CONFIG_PACKAGE_luci-lib-nixio_axtls is not set
-# CONFIG_PACKAGE_luci-lib-nixio_cyassl is not set
-# CONFIG_PACKAGE_luci-lib-nixio_openssl is not set
-# CONFIG_PACKAGE_luci-lib-px5g is not set
-# end of 6. Libraries
-
-# CONFIG_PACKAGE_luci-i18n-base-ar is not set
-# CONFIG_PACKAGE_luci-i18n-base-bg is not set
-# CONFIG_PACKAGE_luci-i18n-base-bn is not set
-# CONFIG_PACKAGE_luci-i18n-base-ca is not set
-# CONFIG_PACKAGE_luci-i18n-base-cs is not set
-# CONFIG_PACKAGE_luci-i18n-base-da is not set
-# CONFIG_PACKAGE_luci-i18n-base-de is not set
-# CONFIG_PACKAGE_luci-i18n-base-el is not set
-# CONFIG_PACKAGE_luci-i18n-base-en is not set
-# CONFIG_PACKAGE_luci-i18n-base-es is not set
-# CONFIG_PACKAGE_luci-i18n-base-fi is not set
-# CONFIG_PACKAGE_luci-i18n-base-fr is not set
-# CONFIG_PACKAGE_luci-i18n-base-he is not set
-# CONFIG_PACKAGE_luci-i18n-base-hi is not set
-# CONFIG_PACKAGE_luci-i18n-base-hu is not set
-# CONFIG_PACKAGE_luci-i18n-base-it is not set
-# CONFIG_PACKAGE_luci-i18n-base-ja is not set
-# CONFIG_PACKAGE_luci-i18n-base-ko is not set
-# CONFIG_PACKAGE_luci-i18n-base-mr is not set
-# CONFIG_PACKAGE_luci-i18n-base-ms is not set
-# CONFIG_PACKAGE_luci-i18n-base-nl is not set
-# CONFIG_PACKAGE_luci-i18n-base-no is not set
-# CONFIG_PACKAGE_luci-i18n-base-pl is not set
-# CONFIG_PACKAGE_luci-i18n-base-pt is not set
-# CONFIG_PACKAGE_luci-i18n-base-pt-br is not set
-# CONFIG_PACKAGE_luci-i18n-base-ro is not set
-# CONFIG_PACKAGE_luci-i18n-base-ru is not set
-# CONFIG_PACKAGE_luci-i18n-base-sk is not set
-# CONFIG_PACKAGE_luci-i18n-base-sv is not set
-# CONFIG_PACKAGE_luci-i18n-base-tr is not set
-# CONFIG_PACKAGE_luci-i18n-base-uk is not set
-# CONFIG_PACKAGE_luci-i18n-base-vi is not set
-# CONFIG_PACKAGE_luci-i18n-base-zh-cn is not set
-# CONFIG_PACKAGE_luci-i18n-base-zh-tw is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ar is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-bg is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-bn is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ca is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-cs is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-da is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-de is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-el is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-en is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-es is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-fi is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-fr is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-he is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-hi is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-hu is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-it is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ja is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ko is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-mr is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ms is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-no is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-pl is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-pt is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-pt-br is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ro is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-ru is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-sk is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-sv is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-tr is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-uk is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-vi is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-zh-cn is not set
-# CONFIG_PACKAGE_luci-i18n-firewall-zh-tw is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ar is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-bg is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-bn is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ca is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-cs is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-da is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-de is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-el is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-en is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-es is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-fi is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-fr is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-he is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-hi is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-hu is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-it is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ja is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ko is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-mr is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ms is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-no is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-pl is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-pt is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-pt-br is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ro is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-ru is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-sk is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-sv is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-tr is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-uk is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-vi is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-zh-cn is not set
-# CONFIG_PACKAGE_luci-i18n-opkg-zh-tw is not set
-# end of LuCI
-
-#
-# Mail
-#
-# CONFIG_PACKAGE_alpine is not set
-# CONFIG_PACKAGE_bogofilter is not set
-# CONFIG_PACKAGE_dovecot is not set
-# CONFIG_PACKAGE_dovecot-pigeonhole is not set
-# CONFIG_PACKAGE_dovecot-utils is not set
-# CONFIG_PACKAGE_emailrelay is not set
-# CONFIG_PACKAGE_exim is not set
-# CONFIG_PACKAGE_exim-gnutls is not set
-# CONFIG_PACKAGE_exim-ldap is not set
-# CONFIG_PACKAGE_exim-openssl is not set
-# CONFIG_PACKAGE_fdm is not set
-# CONFIG_PACKAGE_greyfix is not set
-# CONFIG_PACKAGE_mailsend is not set
-# CONFIG_PACKAGE_mailsend-nossl is not set
-# CONFIG_PACKAGE_mblaze is not set
-# CONFIG_PACKAGE_msmtp is not set
-# CONFIG_PACKAGE_msmtp-mta is not set
-# CONFIG_PACKAGE_msmtp-nossl is not set
-# CONFIG_PACKAGE_msmtp-queue is not set
-# CONFIG_PACKAGE_mutt is not set
-# CONFIG_PACKAGE_nail is not set
-# CONFIG_PACKAGE_opendkim is not set
-# CONFIG_PACKAGE_opendkim-tools is not set
-# CONFIG_PACKAGE_postfix is not set
-
-#
-# Select postfix build options
-#
-CONFIG_POSTFIX_TLS=y
-CONFIG_POSTFIX_SASL=y
-CONFIG_POSTFIX_LDAP=y
-# CONFIG_POSTFIX_DB is not set
-CONFIG_POSTFIX_CDB=y
-CONFIG_POSTFIX_SQLITE=y
-# CONFIG_POSTFIX_MYSQL is not set
-# CONFIG_POSTFIX_PGSQL is not set
-CONFIG_POSTFIX_PCRE=y
-# CONFIG_POSTFIX_EAI is not set
-# end of Select postfix build options
-
-# CONFIG_PACKAGE_spamc is not set
-# CONFIG_PACKAGE_spamc-ssl is not set
-# end of Mail
-
-#
-# MTK Properties
-#
-
-#
-# Applications
-#
-# CONFIG_PACKAGE_1905daemon is not set
-# CONFIG_PACKAGE_8021xd is not set
-# CONFIG_PACKAGE_AFC is not set
-# CONFIG_PACKAGE_ControlAppC is not set
-# CONFIG_PACKAGE_apcli_detectd is not set
-# CONFIG_PACKAGE_ated_ext is not set
-CONFIG_PACKAGE_atenl=y
-# CONFIG_PACKAGE_bluedroid is not set
-# CONFIG_PACKAGE_bndstrg_plus is not set
-CONFIG_PACKAGE_datconf=y
-CONFIG_PACKAGE_datconf-lua=y
-# CONFIG_PACKAGE_fwdd is not set
-# CONFIG_PACKAGE_hostapd-2.9 is not set
-# CONFIG_PACKAGE_ioctl_test is not set
-# CONFIG_PACKAGE_l2ogre is not set
-# CONFIG_PACKAGE_mapd is not set
-CONFIG_PACKAGE_mii_mgr=y
-# CONFIG_PACKAGE_miniupnpd-1.6 is not set
-# CONFIG_PACKAGE_mtk-efuse-nl-tool is not set
-# CONFIG_PACKAGE_mtk-roek-tool is not set
-# CONFIG_PACKAGE_netfilter-flowtable is not set
-# CONFIG_PACKAGE_openssl-fips-ext is not set
-CONFIG_PACKAGE_regs=y
-CONFIG_PACKAGE_sigma_daemon=y
-# CONFIG_SIGMA_DAEMON_AUTOSTART is not set
-# CONFIG_PACKAGE_sigma_dut is not set
-# CONFIG_PACKAGE_sigma_one is not set
-CONFIG_PACKAGE_switch=y
-# CONFIG_PACKAGE_uart_launcher is not set
-# CONFIG_PACKAGE_ufsd_tools is not set
-# CONFIG_PACKAGE_user_daemon is not set
-# CONFIG_PACKAGE_wapp is not set
-# CONFIG_PACKAGE_wificonf is not set
-# CONFIG_PACKAGE_wpa_supplicant-2.9 is not set
-# CONFIG_PACKAGE_wpa_supplicant-dev-11be is not set
-# end of Applications
-
-#
-# Drivers
-#
-# CONFIG_PACKAGE_kmod-atf-fuzzer is not set
-CONFIG_MT7988_ATF_SMC=y
-# CONFIG_MT7986_ATF_SMC is not set
-CONFIG_MTK_PLAT_NUM_SMC=7
-# CONFIG_PACKAGE_kmod-btmtk_uart is not set
-# CONFIG_PACKAGE_kmod-clickos is not set
-# CONFIG_PACKAGE_kmod-conninfra is not set
-# CONFIG_PACKAGE_kmod-gen4m is not set
-# CONFIG_PACKAGE_kmod-hw_nat is not set
-# CONFIG_PACKAGE_kmod-mapfilter is not set
-# CONFIG_PACKAGE_kmod-mt7902_gen4m is not set
-# CONFIG_PACKAGE_kmod-mt7915 is not set
-# CONFIG_PACKAGE_kmod-mt_hwifi is not set
-# CONFIG_PACKAGE_kmod-mt_cfg80211 is not set
-# CONFIG_PACKAGE_kmod-mt_wifi is not set
-# CONFIG_PACKAGE_kmod-mt_wifi7 is not set
-# CONFIG_PACKAGE_kmod-mt_wifi_cmn is not set
-# CONFIG_PACKAGE_kmod-mtfwd is not set
-# CONFIG_PACKAGE_kmod-mtk-efuse-nl-drv is not set
-# CONFIG_PACKAGE_kmod-mtk-roek-nl-drv is not set
-# CONFIG_PACKAGE_kmod-mtqos is not set
-# CONFIG_PACKAGE_kmod-ufsd_driver is not set
-# CONFIG_PACKAGE_kmod-warp is not set
-# CONFIG_PACKAGE_wifi-profile is not set
-# end of Drivers
-
-#
-# Libraries
-#
-# CONFIG_PACKAGE_libmapd is not set
-# end of Libraries
-
-#
-# Misc
-#
-# CONFIG_PACKAGE_ephy-utils is not set
-# CONFIG_PACKAGE_eslt is not set
-# CONFIG_PACKAGE_mtk-base-files is not set
-# CONFIG_PACKAGE_mtk_factory_rw is not set
-# CONFIG_PACKAGE_mtk_failsafe is not set
-# CONFIG_PACKAGE_wslt is not set
-# end of Misc
-# end of MTK Properties
-
-#
-# Multimedia
-#
-
-#
-# Streaming
-#
-# CONFIG_PACKAGE_oggfwd is not set
-# end of Streaming
-
-# CONFIG_PACKAGE_ffmpeg is not set
-# CONFIG_PACKAGE_ffprobe is not set
-# CONFIG_PACKAGE_fswebcam is not set
-# CONFIG_PACKAGE_gerbera is not set
-# CONFIG_PACKAGE_gphoto2 is not set
-# CONFIG_PACKAGE_graphicsmagick is not set
-# CONFIG_PACKAGE_grilo is not set
-# CONFIG_PACKAGE_grilo-plugins is not set
-# CONFIG_PACKAGE_gst1-libav is not set
-# CONFIG_PACKAGE_gstreamer1-libs is not set
-# CONFIG_PACKAGE_gstreamer1-plugins-bad is not set
-# CONFIG_PACKAGE_gstreamer1-plugins-base is not set
-# CONFIG_PACKAGE_gstreamer1-plugins-good is not set
-# CONFIG_PACKAGE_gstreamer1-plugins-ugly is not set
-# CONFIG_PACKAGE_gstreamer1-utils is not set
-# CONFIG_PACKAGE_icecast is not set
-# CONFIG_PACKAGE_imagemagick is not set
-# CONFIG_PACKAGE_lcdgrilo is not set
-# CONFIG_PACKAGE_minidlna is not set
-# CONFIG_PACKAGE_minisatip is not set
-# CONFIG_PACKAGE_mjpg-streamer is not set
-# CONFIG_PACKAGE_motion is not set
-# CONFIG_PACKAGE_tvheadend is not set
-# CONFIG_PACKAGE_v4l2rtspserver is not set
-# CONFIG_PACKAGE_vips is not set
-# CONFIG_PACKAGE_xupnpd is not set
-# CONFIG_PACKAGE_youtube-dl is not set
-# end of Multimedia
-
-#
-# Network
-#
-
-#
-# BitTorrent
-#
-# CONFIG_PACKAGE_mktorrent is not set
-# CONFIG_PACKAGE_opentracker is not set
-# CONFIG_PACKAGE_opentracker6 is not set
-# CONFIG_PACKAGE_rtorrent is not set
-# CONFIG_PACKAGE_rtorrent-rpc is not set
-# CONFIG_PACKAGE_transmission-cli is not set
-# CONFIG_PACKAGE_transmission-daemon is not set
-# CONFIG_PACKAGE_transmission-remote is not set
-# CONFIG_PACKAGE_transmission-web is not set
-# CONFIG_PACKAGE_transmission-web-control is not set
-# end of BitTorrent
-
-#
-# Captive Portals
-#
-# CONFIG_PACKAGE_apfree-wifidog is not set
-# CONFIG_PACKAGE_coova-chilli is not set
-# CONFIG_PACKAGE_mesh11sd is not set
-# CONFIG_PACKAGE_nodogsplash is not set
-# CONFIG_PACKAGE_opennds is not set
-# CONFIG_PACKAGE_wifidog is not set
-# CONFIG_PACKAGE_wifidog-tls is not set
-# end of Captive Portals
-
-#
-# Cloud Manager
-#
-# CONFIG_PACKAGE_rclone-ng is not set
-# CONFIG_PACKAGE_rclone-webui-react is not set
-# end of Cloud Manager
-
-#
-# Dial-in/up
-#
-# CONFIG_PACKAGE_rp-pppoe-common is not set
-# CONFIG_PACKAGE_rp-pppoe-relay is not set
-# CONFIG_PACKAGE_rp-pppoe-server is not set
-# end of Dial-in/up
-
-#
-# Download Manager
-#
-# CONFIG_PACKAGE_ariang is not set
-# CONFIG_PACKAGE_ariang-nginx is not set
-# CONFIG_PACKAGE_leech is not set
-# CONFIG_PACKAGE_webui-aria2 is not set
-# end of Download Manager
-
-#
-# File Transfer
-#
-# CONFIG_PACKAGE_aria2 is not set
-# CONFIG_PACKAGE_atftp is not set
-# CONFIG_PACKAGE_atftpd is not set
-# CONFIG_PACKAGE_curl is not set
-# CONFIG_PACKAGE_gnurl is not set
-# CONFIG_PACKAGE_lftp is not set
-# CONFIG_PACKAGE_rclone is not set
-# CONFIG_PACKAGE_rclone-config is not set
-# CONFIG_PACKAGE_rsync is not set
-# CONFIG_PACKAGE_rsyncd is not set
-# CONFIG_PACKAGE_vsftpd is not set
-# CONFIG_PACKAGE_vsftpd-tls is not set
-# CONFIG_PACKAGE_wget-nossl is not set
-# CONFIG_PACKAGE_wget-ssl is not set
-# end of File Transfer
-
-#
-# Filesystem
-#
-# CONFIG_PACKAGE_davfs2 is not set
-# CONFIG_PACKAGE_ksmbd-avahi-service is not set
-# CONFIG_PACKAGE_ksmbd-server is not set
-# CONFIG_PACKAGE_ksmbd-utils is not set
-# CONFIG_PACKAGE_netatalk is not set
-# CONFIG_PACKAGE_nfs-kernel-server is not set
-# CONFIG_PACKAGE_owftpd is not set
-# CONFIG_PACKAGE_owhttpd is not set
-# CONFIG_PACKAGE_owserver is not set
-# CONFIG_PACKAGE_sshfs is not set
-# end of Filesystem
-
-#
-# Firewall
-#
-# CONFIG_PACKAGE_arptables is not set
-# CONFIG_PACKAGE_conntrack is not set
-# CONFIG_PACKAGE_conntrackd is not set
-# CONFIG_PACKAGE_ebtables is not set
-# CONFIG_PACKAGE_fwknop is not set
-# CONFIG_PACKAGE_fwknopd is not set
-CONFIG_PACKAGE_ip6tables=y
-# CONFIG_PACKAGE_ip6tables-extra is not set
-# CONFIG_PACKAGE_ip6tables-mod-nat is not set
-CONFIG_PACKAGE_iptables=y
-# CONFIG_IPTABLES_CONNLABEL is not set
-# CONFIG_IPTABLES_NFTABLES is not set
-# CONFIG_PACKAGE_iptables-mod-account is not set
-# CONFIG_PACKAGE_iptables-mod-chaos is not set
-# CONFIG_PACKAGE_iptables-mod-checksum is not set
-# CONFIG_PACKAGE_iptables-mod-cluster is not set
-# CONFIG_PACKAGE_iptables-mod-clusterip is not set
-# CONFIG_PACKAGE_iptables-mod-condition is not set
-# CONFIG_PACKAGE_iptables-mod-conntrack-extra is not set
-# CONFIG_PACKAGE_iptables-mod-delude is not set
-# CONFIG_PACKAGE_iptables-mod-dhcpmac is not set
-# CONFIG_PACKAGE_iptables-mod-dnetmap is not set
-# CONFIG_PACKAGE_iptables-mod-extra is not set
-# CONFIG_PACKAGE_iptables-mod-filter is not set
-# CONFIG_PACKAGE_iptables-mod-fuzzy is not set
-# CONFIG_PACKAGE_iptables-mod-geoip is not set
-# CONFIG_PACKAGE_iptables-mod-hashlimit is not set
-# CONFIG_PACKAGE_iptables-mod-iface is not set
-# CONFIG_PACKAGE_iptables-mod-ipmark is not set
-# CONFIG_PACKAGE_iptables-mod-ipopt is not set
-# CONFIG_PACKAGE_iptables-mod-ipp2p is not set
-# CONFIG_PACKAGE_iptables-mod-iprange is not set
-# CONFIG_PACKAGE_iptables-mod-ipsec is not set
-# CONFIG_PACKAGE_iptables-mod-ipv4options is not set
-# CONFIG_PACKAGE_iptables-mod-led is not set
-# CONFIG_PACKAGE_iptables-mod-length2 is not set
-# CONFIG_PACKAGE_iptables-mod-logmark is not set
-# CONFIG_PACKAGE_iptables-mod-lscan is not set
-# CONFIG_PACKAGE_iptables-mod-lua is not set
-# CONFIG_PACKAGE_iptables-mod-nat-extra is not set
-# CONFIG_PACKAGE_iptables-mod-nflog is not set
-# CONFIG_PACKAGE_iptables-mod-nfqueue is not set
-# CONFIG_PACKAGE_iptables-mod-physdev is not set
-# CONFIG_PACKAGE_iptables-mod-proto is not set
-# CONFIG_PACKAGE_iptables-mod-psd is not set
-# CONFIG_PACKAGE_iptables-mod-quota2 is not set
-# CONFIG_PACKAGE_iptables-mod-rpfilter is not set
-# CONFIG_PACKAGE_iptables-mod-sysrq is not set
-# CONFIG_PACKAGE_iptables-mod-tarpit is not set
-# CONFIG_PACKAGE_iptables-mod-tee is not set
-# CONFIG_PACKAGE_iptables-mod-tproxy is not set
-# CONFIG_PACKAGE_iptables-mod-trace is not set
-# CONFIG_PACKAGE_iptables-mod-u32 is not set
-# CONFIG_PACKAGE_iptaccount is not set
-# CONFIG_PACKAGE_iptgeoip is not set
-
-#
-# Select iptgeoip options
-#
-# CONFIG_IPTGEOIP_PRESERVE is not set
-# end of Select iptgeoip options
-
-# CONFIG_PACKAGE_miniupnpc is not set
-# CONFIG_PACKAGE_miniupnpd is not set
-# CONFIG_PACKAGE_natpmpc is not set
-# CONFIG_PACKAGE_nftables-json is not set
-# CONFIG_PACKAGE_nftables-nojson is not set
-# CONFIG_PACKAGE_shorewall is not set
-# CONFIG_PACKAGE_shorewall-core is not set
-# CONFIG_PACKAGE_shorewall-lite is not set
-# CONFIG_PACKAGE_shorewall6 is not set
-# CONFIG_PACKAGE_shorewall6-lite is not set
-# CONFIG_PACKAGE_snort is not set
-# CONFIG_PACKAGE_snort3 is not set
-# end of Firewall
-
-#
-# Firewall Tunnel
-#
-# CONFIG_PACKAGE_iodine is not set
-# CONFIG_PACKAGE_iodined is not set
-# end of Firewall Tunnel
-
-#
-# FreeRADIUS (version 3)
-#
-# CONFIG_PACKAGE_freeradius3 is not set
-# CONFIG_PACKAGE_freeradius3-common is not set
-# CONFIG_PACKAGE_freeradius3-utils is not set
-# end of FreeRADIUS (version 3)
-
-#
-# IP Addresses and Names
-#
-# CONFIG_PACKAGE_aggregate is not set
-# CONFIG_PACKAGE_announce is not set
-# CONFIG_PACKAGE_avahi-autoipd is not set
-# CONFIG_PACKAGE_avahi-daemon-service-http is not set
-# CONFIG_PACKAGE_avahi-daemon-service-ssh is not set
-# CONFIG_PACKAGE_avahi-dbus-daemon is not set
-# CONFIG_PACKAGE_avahi-dnsconfd is not set
-# CONFIG_PACKAGE_avahi-nodbus-daemon is not set
-# CONFIG_PACKAGE_avahi-utils is not set
-# CONFIG_PACKAGE_bind-check is not set
-# CONFIG_PACKAGE_bind-client is not set
-# CONFIG_PACKAGE_bind-dig is not set
-# CONFIG_PACKAGE_bind-dnssec is not set
-# CONFIG_PACKAGE_bind-host is not set
-# CONFIG_PACKAGE_bind-nslookup is not set
-# CONFIG_PACKAGE_bind-rndc is not set
-# CONFIG_PACKAGE_bind-server is not set
-# CONFIG_PACKAGE_bind-tools is not set
-# CONFIG_PACKAGE_ddns-scripts is not set
-# CONFIG_PACKAGE_ddns-scripts-services is not set
-# CONFIG_PACKAGE_dhcp-forwarder is not set
-# CONFIG_PACKAGE_dnscrypt-proxy is not set
-# CONFIG_PACKAGE_dnscrypt-proxy-resolvers is not set
-# CONFIG_PACKAGE_dnsdist is not set
-# CONFIG_PACKAGE_drill is not set
-# CONFIG_PACKAGE_hostip is not set
-# CONFIG_PACKAGE_idn is not set
-# CONFIG_PACKAGE_idn2 is not set
-# CONFIG_PACKAGE_inadyn is not set
-# CONFIG_PACKAGE_isc-dhcp-client-ipv4 is not set
-# CONFIG_PACKAGE_isc-dhcp-client-ipv6 is not set
-# CONFIG_PACKAGE_isc-dhcp-relay-ipv4 is not set
-# CONFIG_PACKAGE_isc-dhcp-relay-ipv6 is not set
-# CONFIG_PACKAGE_kadnode is not set
-# CONFIG_PACKAGE_kea-admin is not set
-# CONFIG_PACKAGE_kea-ctrl is not set
-# CONFIG_PACKAGE_kea-dhcp-ddns is not set
-# CONFIG_PACKAGE_kea-dhcp4 is not set
-# CONFIG_PACKAGE_kea-dhcp6 is not set
-# CONFIG_PACKAGE_kea-lfc is not set
-# CONFIG_PACKAGE_kea-libs is not set
-# CONFIG_PACKAGE_kea-perfdhcp is not set
-# CONFIG_PACKAGE_kea-shell is not set
-# CONFIG_PACKAGE_knot is not set
-# CONFIG_PACKAGE_knot-dig is not set
-# CONFIG_PACKAGE_knot-host is not set
-# CONFIG_PACKAGE_knot-keymgr is not set
-# CONFIG_PACKAGE_knot-nsupdate is not set
-# CONFIG_PACKAGE_knot-resolver is not set
-
-#
-# Configuration
-#
-# CONFIG_PACKAGE_knot-resolver_dnstap is not set
-# end of Configuration
-
-# CONFIG_PACKAGE_knot-tests is not set
-# CONFIG_PACKAGE_knot-zonecheck is not set
-# CONFIG_PACKAGE_ldns-examples is not set
-# CONFIG_PACKAGE_mdns-utils is not set
-# CONFIG_PACKAGE_mdnsd is not set
-# CONFIG_PACKAGE_mdnsresponder is not set
-# CONFIG_PACKAGE_nsd is not set
-# CONFIG_PACKAGE_nsd-control is not set
-# CONFIG_PACKAGE_nsd-control-setup is not set
-# CONFIG_PACKAGE_nsd-nossl is not set
-# CONFIG_PACKAGE_ohybridproxy is not set
-# CONFIG_PACKAGE_overture is not set
-# CONFIG_PACKAGE_pdns is not set
-# CONFIG_PACKAGE_pdns-ixfrdist is not set
-# CONFIG_PACKAGE_pdns-recursor is not set
-# CONFIG_PACKAGE_pdns-tools is not set
-# CONFIG_PACKAGE_stubby is not set
-# CONFIG_PACKAGE_tor-hs is not set
-# CONFIG_PACKAGE_torsocks is not set
-# CONFIG_PACKAGE_unbound-anchor is not set
-# CONFIG_PACKAGE_unbound-checkconf is not set
-# CONFIG_PACKAGE_unbound-control is not set
-# CONFIG_PACKAGE_unbound-control-setup is not set
-# CONFIG_PACKAGE_unbound-daemon is not set
-# CONFIG_PACKAGE_unbound-host is not set
-# CONFIG_PACKAGE_wsdd2 is not set
-# CONFIG_PACKAGE_zonestitcher is not set
-# end of IP Addresses and Names
-
-#
-# Instant Messaging
-#
-# CONFIG_PACKAGE_bitlbee is not set
-# CONFIG_PACKAGE_irssi is not set
-# CONFIG_PACKAGE_ngircd is not set
-# CONFIG_PACKAGE_ngircd-nossl is not set
-# CONFIG_PACKAGE_prosody is not set
-# CONFIG_PACKAGE_quassel-irssi is not set
-# CONFIG_PACKAGE_umurmur-mbedtls is not set
-# CONFIG_PACKAGE_umurmur-openssl is not set
-# CONFIG_PACKAGE_znc is not set
-# end of Instant Messaging
-
-#
-# Linux ATM tools
-#
-# CONFIG_PACKAGE_atm-aread is not set
-# CONFIG_PACKAGE_atm-atmaddr is not set
-# CONFIG_PACKAGE_atm-atmdiag is not set
-# CONFIG_PACKAGE_atm-atmdump is not set
-# CONFIG_PACKAGE_atm-atmloop is not set
-# CONFIG_PACKAGE_atm-atmsigd is not set
-# CONFIG_PACKAGE_atm-atmswitch is not set
-# CONFIG_PACKAGE_atm-atmtcp is not set
-# CONFIG_PACKAGE_atm-awrite is not set
-# CONFIG_PACKAGE_atm-bus is not set
-# CONFIG_PACKAGE_atm-debug-tools is not set
-# CONFIG_PACKAGE_atm-diagnostics is not set
-# CONFIG_PACKAGE_atm-esi is not set
-# CONFIG_PACKAGE_atm-ilmid is not set
-# CONFIG_PACKAGE_atm-ilmidiag is not set
-# CONFIG_PACKAGE_atm-lecs is not set
-# CONFIG_PACKAGE_atm-les is not set
-# CONFIG_PACKAGE_atm-mpcd is not set
-# CONFIG_PACKAGE_atm-saaldump is not set
-# CONFIG_PACKAGE_atm-sonetdiag is not set
-# CONFIG_PACKAGE_atm-svc_recv is not set
-# CONFIG_PACKAGE_atm-svc_send is not set
-# CONFIG_PACKAGE_atm-tools is not set
-# CONFIG_PACKAGE_atm-ttcp_atm is not set
-# CONFIG_PACKAGE_atm-zeppelin is not set
-# CONFIG_PACKAGE_br2684ctl is not set
-# end of Linux ATM tools
-
-#
-# LoRaWAN
-#
-# CONFIG_PACKAGE_libloragw-tests is not set
-# CONFIG_PACKAGE_libloragw-utils is not set
-# end of LoRaWAN
-
-#
-# NMAP Suite
-#
-# CONFIG_PACKAGE_ncat is not set
-# CONFIG_PACKAGE_ncat-full is not set
-# CONFIG_PACKAGE_ncat-ssl is not set
-# CONFIG_PACKAGE_ndiff is not set
-# CONFIG_PACKAGE_nmap is not set
-# CONFIG_PACKAGE_nmap-full is not set
-# CONFIG_PACKAGE_nmap-ssl is not set
-# CONFIG_PACKAGE_nping is not set
-# CONFIG_PACKAGE_nping-ssl is not set
-# end of NMAP Suite
-
-#
-# NTRIP
-#
-# CONFIG_PACKAGE_ntripcaster is not set
-# CONFIG_PACKAGE_ntripclient is not set
-# CONFIG_PACKAGE_ntripserver is not set
-# end of NTRIP
-
-#
-# OLSR.org network framework
-#
-# CONFIG_PACKAGE_oonf-dlep-proxy is not set
-# CONFIG_PACKAGE_oonf-dlep-radio is not set
-# CONFIG_PACKAGE_oonf-init-scripts is not set
-# CONFIG_PACKAGE_oonf-olsrd2 is not set
-# end of OLSR.org network framework
-
-#
-# Open vSwitch
-#
-# CONFIG_PACKAGE_openvswitch is not set
-# CONFIG_PACKAGE_openvswitch-ovn-host is not set
-# CONFIG_PACKAGE_openvswitch-ovn-north is not set
-# CONFIG_PACKAGE_openvswitch-python3 is not set
-# end of Open vSwitch
-
-#
-# OpenLDAP
-#
-# CONFIG_PACKAGE_libopenldap is not set
-CONFIG_OPENLDAP_DEBUG=y
-# CONFIG_OPENLDAP_CRYPT is not set
-# CONFIG_OPENLDAP_MONITOR is not set
-# CONFIG_OPENLDAP_DB47 is not set
-# CONFIG_OPENLDAP_ICU is not set
-# CONFIG_PACKAGE_openldap-server is not set
-# CONFIG_PACKAGE_openldap-utils is not set
-# end of OpenLDAP
-
-#
-# Printing
-#
-# CONFIG_PACKAGE_p910nd is not set
-# end of Printing
-
-#
-# Routing and Redirection
-#
-# CONFIG_PACKAGE_babel-pinger is not set
-# CONFIG_PACKAGE_babeld is not set
-# CONFIG_PACKAGE_batmand is not set
-# CONFIG_PACKAGE_bcp38 is not set
-# CONFIG_PACKAGE_bfdd is not set
-# CONFIG_PACKAGE_bird1-ipv4 is not set
-# CONFIG_PACKAGE_bird1-ipv4-uci is not set
-# CONFIG_PACKAGE_bird1-ipv6 is not set
-# CONFIG_PACKAGE_bird1-ipv6-uci is not set
-# CONFIG_PACKAGE_bird1c-ipv4 is not set
-# CONFIG_PACKAGE_bird1c-ipv6 is not set
-# CONFIG_PACKAGE_bird1cl-ipv4 is not set
-# CONFIG_PACKAGE_bird1cl-ipv6 is not set
-# CONFIG_PACKAGE_bird2 is not set
-# CONFIG_PACKAGE_bird2c is not set
-# CONFIG_PACKAGE_bird2cl is not set
-# CONFIG_PACKAGE_bmx6 is not set
-# CONFIG_PACKAGE_bmx7 is not set
-# CONFIG_PACKAGE_cjdns is not set
-# CONFIG_PACKAGE_cjdns-tests is not set
-# CONFIG_PACKAGE_dcstad is not set
-# CONFIG_PACKAGE_dcwapd is not set
-# CONFIG_PACKAGE_devlink is not set
-# CONFIG_PACKAGE_frr is not set
-# CONFIG_PACKAGE_genl is not set
-# CONFIG_PACKAGE_igmpproxy is not set
-# CONFIG_PACKAGE_ip-bridge is not set
-CONFIG_PACKAGE_ip-full=y
-# CONFIG_PACKAGE_ip-tiny is not set
-# CONFIG_PACKAGE_lldpd is not set
-# CONFIG_PACKAGE_mcproxy is not set
-# CONFIG_PACKAGE_mrmctl is not set
-# CONFIG_PACKAGE_mwan3 is not set
-# CONFIG_PACKAGE_nstat is not set
-# CONFIG_PACKAGE_olsrd is not set
-# CONFIG_PACKAGE_prince is not set
-# CONFIG_PACKAGE_quagga is not set
-# CONFIG_PACKAGE_rdma is not set
-# CONFIG_PACKAGE_relayd is not set
-# CONFIG_PACKAGE_smcroute is not set
-# CONFIG_PACKAGE_ss is not set
-# CONFIG_PACKAGE_sslh is not set
-# CONFIG_PACKAGE_tc-bpf is not set
-# CONFIG_PACKAGE_tc-full is not set
-# CONFIG_PACKAGE_tc-mod-iptables is not set
-# CONFIG_PACKAGE_tc-tiny is not set
-# CONFIG_PACKAGE_tcpproxy is not set
-# CONFIG_PACKAGE_vis is not set
-# CONFIG_PACKAGE_yggdrasil is not set
-# end of Routing and Redirection
-
-#
-# SSH
-#
-# CONFIG_PACKAGE_autossh is not set
-# CONFIG_PACKAGE_openssh-client is not set
-# CONFIG_PACKAGE_openssh-client-utils is not set
-# CONFIG_PACKAGE_openssh-keygen is not set
-# CONFIG_PACKAGE_openssh-moduli is not set
-# CONFIG_PACKAGE_openssh-server is not set
-# CONFIG_PACKAGE_openssh-server-pam is not set
-# CONFIG_PACKAGE_openssh-sftp-avahi-service is not set
-# CONFIG_PACKAGE_openssh-sftp-client is not set
-# CONFIG_PACKAGE_openssh-sftp-server is not set
-# CONFIG_PACKAGE_sshtunnel is not set
-# CONFIG_PACKAGE_tmate is not set
-# end of SSH
-
-#
-# THC-IPv6 attack and analyzing toolkit
-#
-# CONFIG_PACKAGE_thc-ipv6-address6 is not set
-# CONFIG_PACKAGE_thc-ipv6-alive6 is not set
-# CONFIG_PACKAGE_thc-ipv6-covert-send6 is not set
-# CONFIG_PACKAGE_thc-ipv6-covert-send6d is not set
-# CONFIG_PACKAGE_thc-ipv6-denial6 is not set
-# CONFIG_PACKAGE_thc-ipv6-detect-new-ip6 is not set
-# CONFIG_PACKAGE_thc-ipv6-detect-sniffer6 is not set
-# CONFIG_PACKAGE_thc-ipv6-dnsdict6 is not set
-# CONFIG_PACKAGE_thc-ipv6-dnsrevenum6 is not set
-# CONFIG_PACKAGE_thc-ipv6-dos-new-ip6 is not set
-# CONFIG_PACKAGE_thc-ipv6-dump-router6 is not set
-# CONFIG_PACKAGE_thc-ipv6-exploit6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-advertise6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-dhcps6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-dns6d is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-dnsupdate6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-mipv6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-mld26 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-mld6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-mldrouter6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-router26 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-router6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fake-solicitate6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-advertise6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-dhcpc6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-mld26 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-mld6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-mldrouter6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-router26 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-router6 is not set
-# CONFIG_PACKAGE_thc-ipv6-flood-solicitate6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fragmentation6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcpc6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcps6 is not set
-# CONFIG_PACKAGE_thc-ipv6-fuzz-ip6 is not set
-# CONFIG_PACKAGE_thc-ipv6-implementation6 is not set
-# CONFIG_PACKAGE_thc-ipv6-implementation6d is not set
-# CONFIG_PACKAGE_thc-ipv6-inverse-lookup6 is not set
-# CONFIG_PACKAGE_thc-ipv6-kill-router6 is not set
-# CONFIG_PACKAGE_thc-ipv6-ndpexhaust6 is not set
-# CONFIG_PACKAGE_thc-ipv6-node-query6 is not set
-# CONFIG_PACKAGE_thc-ipv6-parasite6 is not set
-# CONFIG_PACKAGE_thc-ipv6-passive-discovery6 is not set
-# CONFIG_PACKAGE_thc-ipv6-randicmp6 is not set
-# CONFIG_PACKAGE_thc-ipv6-redir6 is not set
-# CONFIG_PACKAGE_thc-ipv6-rsmurf6 is not set
-# CONFIG_PACKAGE_thc-ipv6-sendpees6 is not set
-# CONFIG_PACKAGE_thc-ipv6-sendpeesmp6 is not set
-# CONFIG_PACKAGE_thc-ipv6-smurf6 is not set
-# CONFIG_PACKAGE_thc-ipv6-thcping6 is not set
-# CONFIG_PACKAGE_thc-ipv6-toobig6 is not set
-# CONFIG_PACKAGE_thc-ipv6-trace6 is not set
-# end of THC-IPv6 attack and analyzing toolkit
-
-#
-# Tcpreplay
-#
-# CONFIG_PACKAGE_tcpbridge is not set
-# CONFIG_PACKAGE_tcpcapinfo is not set
-# CONFIG_PACKAGE_tcpliveplay is not set
-# CONFIG_PACKAGE_tcpprep is not set
-# CONFIG_PACKAGE_tcpreplay is not set
-# CONFIG_PACKAGE_tcpreplay-all is not set
-# CONFIG_PACKAGE_tcpreplay-edit is not set
-# CONFIG_PACKAGE_tcprewrite is not set
-# end of Tcpreplay
-
-#
-# Time Synchronization
-#
-# CONFIG_PACKAGE_chrony is not set
-# CONFIG_PACKAGE_chrony-nts is not set
-# CONFIG_PACKAGE_htpdate is not set
-# CONFIG_PACKAGE_linuxptp is not set
-# CONFIG_PACKAGE_ntp-keygen is not set
-# CONFIG_PACKAGE_ntp-utils is not set
-# CONFIG_PACKAGE_ntpclient is not set
-# CONFIG_PACKAGE_ntpd is not set
-# CONFIG_PACKAGE_ntpdate is not set
-# end of Time Synchronization
-
-#
-# VPN
-#
-# CONFIG_PACKAGE_chaosvpn is not set
-# CONFIG_PACKAGE_eoip is not set
-# CONFIG_PACKAGE_fastd is not set
-# CONFIG_PACKAGE_libreswan is not set
-# CONFIG_PACKAGE_ocserv is not set
-# CONFIG_PACKAGE_openconnect is not set
-# CONFIG_PACKAGE_openfortivpn is not set
-# CONFIG_PACKAGE_openvpn-easy-rsa is not set
-# CONFIG_PACKAGE_openvpn-mbedtls is not set
-# CONFIG_PACKAGE_openvpn-openssl is not set
-# CONFIG_PACKAGE_pptpd is not set
-# CONFIG_PACKAGE_softethervpn-base is not set
-# CONFIG_PACKAGE_softethervpn-bridge is not set
-# CONFIG_PACKAGE_softethervpn-client is not set
-# CONFIG_PACKAGE_softethervpn-server is not set
-# CONFIG_PACKAGE_softethervpn5-bridge is not set
-# CONFIG_PACKAGE_softethervpn5-client is not set
-# CONFIG_PACKAGE_softethervpn5-server is not set
-# CONFIG_PACKAGE_sstp-client is not set
-# CONFIG_PACKAGE_strongswan is not set
-# CONFIG_PACKAGE_tailscale is not set
-# CONFIG_PACKAGE_tailscaled is not set
-# CONFIG_PACKAGE_tinc is not set
-# CONFIG_PACKAGE_uanytun is not set
-# CONFIG_PACKAGE_uanytun-nettle is not set
-# CONFIG_PACKAGE_uanytun-nocrypt is not set
-# CONFIG_PACKAGE_uanytun-sslcrypt is not set
-# CONFIG_PACKAGE_vpnc is not set
-# CONFIG_PACKAGE_vpnc-scripts is not set
-# CONFIG_PACKAGE_wireguard-tools is not set
-# CONFIG_PACKAGE_xl2tpd is not set
-# CONFIG_PACKAGE_zerotier is not set
-# end of VPN
-
-#
-# Version Control Systems
-#
-# CONFIG_PACKAGE_git is not set
-# CONFIG_PACKAGE_git-http is not set
-# CONFIG_PACKAGE_subversion-client is not set
-# CONFIG_PACKAGE_subversion-libs is not set
-# CONFIG_PACKAGE_subversion-server is not set
-# end of Version Control Systems
-
-#
-# WWAN
-#
-# CONFIG_PACKAGE_adb-enablemodem is not set
-# CONFIG_PACKAGE_comgt is not set
-# CONFIG_PACKAGE_comgt-directip is not set
-# CONFIG_PACKAGE_comgt-ncm is not set
-# CONFIG_PACKAGE_umbim is not set
-# CONFIG_PACKAGE_uqmi is not set
-# end of WWAN
-
-#
-# Web Servers/Proxies
-#
-# CONFIG_PACKAGE_apache is not set
-CONFIG_PACKAGE_cgi-io=y
-# CONFIG_PACKAGE_clamav is not set
-# CONFIG_PACKAGE_etebase is not set
-# CONFIG_PACKAGE_freshclam is not set
-# CONFIG_PACKAGE_frpc is not set
-# CONFIG_PACKAGE_frps is not set
-# CONFIG_PACKAGE_gateway-go is not set
-# CONFIG_PACKAGE_gunicorn3 is not set
-# CONFIG_PACKAGE_haproxy is not set
-# CONFIG_PACKAGE_haproxy-nossl is not set
-# CONFIG_PACKAGE_kcptun-client is not set
-# CONFIG_PACKAGE_kcptun-config is not set
-# CONFIG_PACKAGE_kcptun-server is not set
-# CONFIG_PACKAGE_librespeed-go is not set
-# CONFIG_PACKAGE_lighttpd is not set
-# CONFIG_PACKAGE_nginx-all-module is not set
-# CONFIG_PACKAGE_nginx-mod-luci is not set
-# CONFIG_PACKAGE_nginx-ssl is not set
-# CONFIG_PACKAGE_nginx-ssl-util is not set
-# CONFIG_PACKAGE_nginx-ssl-util-nopcre is not set
-# CONFIG_PACKAGE_polipo is not set
-# CONFIG_PACKAGE_privoxy is not set
-# CONFIG_PACKAGE_python3-gunicorn is not set
-# CONFIG_PACKAGE_radicale is not set
-# CONFIG_PACKAGE_radicale2 is not set
-# CONFIG_PACKAGE_radicale2-examples is not set
-# CONFIG_PACKAGE_shadowsocks-libev-config is not set
-# CONFIG_PACKAGE_shadowsocks-libev-ss-local is not set
-# CONFIG_PACKAGE_shadowsocks-libev-ss-redir is not set
-# CONFIG_PACKAGE_shadowsocks-libev-ss-rules is not set
-# CONFIG_PACKAGE_shadowsocks-libev-ss-server is not set
-# CONFIG_PACKAGE_shadowsocks-libev-ss-tunnel is not set
-# CONFIG_PACKAGE_sockd is not set
-# CONFIG_PACKAGE_socksify is not set
-# CONFIG_PACKAGE_spawn-fcgi is not set
-# CONFIG_PACKAGE_squid is not set
-# CONFIG_PACKAGE_tinyproxy is not set
-CONFIG_PACKAGE_uhttpd=y
-# CONFIG_PACKAGE_uhttpd-mod-lua is not set
-CONFIG_PACKAGE_uhttpd-mod-ubus=y
-# CONFIG_PACKAGE_uwsgi is not set
-# CONFIG_PACKAGE_v2raya is not set
-# CONFIG_PACKAGE_xfrpc is not set
-# end of Web Servers/Proxies
-
-#
-# Wireless
-#
-# CONFIG_PACKAGE_aircrack-ng is not set
-# CONFIG_PACKAGE_airmon-ng is not set
-# CONFIG_PACKAGE_dynapoint is not set
-# CONFIG_PACKAGE_hcxdumptool is not set
-# CONFIG_PACKAGE_hcxtools is not set
-# CONFIG_PACKAGE_horst is not set
-# CONFIG_PACKAGE_kismet-client is not set
-# CONFIG_PACKAGE_kismet-drone is not set
-# CONFIG_PACKAGE_kismet-server is not set
-# CONFIG_PACKAGE_pixiewps is not set
-# CONFIG_PACKAGE_reaver is not set
-# CONFIG_PACKAGE_wavemon is not set
-# CONFIG_PACKAGE_wifischedule is not set
-# end of Wireless
-
-#
-# WirelessAPD
-#
-# CONFIG_PACKAGE_eapol-test is not set
-# CONFIG_PACKAGE_eapol-test-mbedtls is not set
-# CONFIG_PACKAGE_eapol-test-openssl is not set
-# CONFIG_PACKAGE_eapol-test-wolfssl is not set
-# CONFIG_PACKAGE_hostapd is not set
-# CONFIG_PACKAGE_hostapd-basic is not set
-# CONFIG_PACKAGE_hostapd-basic-mbedtls is not set
-# CONFIG_PACKAGE_hostapd-basic-openssl is not set
-# CONFIG_PACKAGE_hostapd-basic-wolfssl is not set
-CONFIG_PACKAGE_hostapd-common=y
-# CONFIG_PACKAGE_hostapd-mbedtls is not set
-# CONFIG_PACKAGE_hostapd-mini is not set
-# CONFIG_PACKAGE_hostapd-openssl is not set
-CONFIG_PACKAGE_hostapd-utils=y
-# CONFIG_PACKAGE_hostapd-wolfssl is not set
-# CONFIG_PACKAGE_hs20-client is not set
-# CONFIG_PACKAGE_hs20-common is not set
-# CONFIG_PACKAGE_hs20-server is not set
-CONFIG_PACKAGE_wpa-cli=y
-# CONFIG_PACKAGE_wpa-supplicant is not set
-# CONFIG_WPA_RFKILL_SUPPORT is not set
-CONFIG_WPA_MSG_MIN_PRIORITY=2
-# CONFIG_WPA_WOLFSSL is not set
-CONFIG_DRIVER_11AC_SUPPORT=y
-CONFIG_DRIVER_11AX_SUPPORT=y
-CONFIG_DRIVER_11BE_SUPPORT=y
-CONFIG_WPA_ENABLE_WEP=y
-CONFIG_WPA_MBO_SUPPORT=y
-# CONFIG_PACKAGE_wpa-supplicant-basic is not set
-# CONFIG_PACKAGE_wpa-supplicant-mbedtls is not set
-# CONFIG_PACKAGE_wpa-supplicant-mesh-mbedtls is not set
-# CONFIG_PACKAGE_wpa-supplicant-mesh-openssl is not set
-# CONFIG_PACKAGE_wpa-supplicant-mesh-wolfssl is not set
-# CONFIG_PACKAGE_wpa-supplicant-mini is not set
-# CONFIG_PACKAGE_wpa-supplicant-openssl is not set
-# CONFIG_PACKAGE_wpa-supplicant-p2p is not set
-# CONFIG_PACKAGE_wpa-supplicant-wolfssl is not set
-# CONFIG_PACKAGE_wpad is not set
-# CONFIG_PACKAGE_wpad-basic is not set
-# CONFIG_PACKAGE_wpad-basic-mbedtls is not set
-# CONFIG_PACKAGE_wpad-basic-openssl is not set
-# CONFIG_PACKAGE_wpad-basic-wolfssl is not set
-# CONFIG_PACKAGE_wpad-mbedtls is not set
-# CONFIG_PACKAGE_wpad-mesh-mbedtls is not set
-# CONFIG_PACKAGE_wpad-mesh-openssl is not set
-# CONFIG_PACKAGE_wpad-mesh-wolfssl is not set
-# CONFIG_PACKAGE_wpad-mini is not set
-CONFIG_PACKAGE_wpad-openssl=y
-# CONFIG_PACKAGE_wpad-wolfssl is not set
-# end of WirelessAPD
-
-#
-# arp-scan
-#
-# CONFIG_PACKAGE_arp-scan is not set
-# CONFIG_PACKAGE_arp-scan-database is not set
-# end of arp-scan
-
-# CONFIG_PACKAGE_464xlat is not set
-# CONFIG_PACKAGE_6in4 is not set
-# CONFIG_PACKAGE_6rd is not set
-# CONFIG_PACKAGE_6to4 is not set
-# CONFIG_PACKAGE_UDPspeeder is not set
-# CONFIG_PACKAGE_acme is not set
-# CONFIG_PACKAGE_acme-dnsapi is not set
-# CONFIG_PACKAGE_adblock is not set
-# CONFIG_PACKAGE_addrwatch is not set
-# CONFIG_PACKAGE_addrwatch-mysql is not set
-# CONFIG_PACKAGE_addrwatch-stdout is not set
-# CONFIG_PACKAGE_addrwatch-syslog is not set
-# CONFIG_PACKAGE_adguardhome is not set
-# CONFIG_PACKAGE_ahcpd is not set
-# CONFIG_PACKAGE_alfred is not set
-# CONFIG_PACKAGE_apcupsd is not set
-# CONFIG_PACKAGE_apcupsd-cgi is not set
-# CONFIG_PACKAGE_apinger is not set
-# CONFIG_PACKAGE_atlas-probe is not set
-# CONFIG_PACKAGE_atlas-sw-probe is not set
-# CONFIG_PACKAGE_atlas-sw-probe-rpc is not set
-# CONFIG_PACKAGE_banip is not set
-# CONFIG_PACKAGE_batctl-default is not set
-# CONFIG_PACKAGE_batctl-full is not set
-# CONFIG_PACKAGE_batctl-tiny is not set
-# CONFIG_PACKAGE_beanstalkd is not set
-# CONFIG_PACKAGE_bmon is not set
-# CONFIG_PACKAGE_boinc is not set
-# CONFIG_PACKAGE_bpftool-full is not set
-# CONFIG_PACKAGE_bpftool-minimal is not set
-# CONFIG_PACKAGE_bwm-ng is not set
-# CONFIG_PACKAGE_bwping is not set
-# CONFIG_PACKAGE_chat is not set
-# CONFIG_PACKAGE_cifsmount is not set
-# CONFIG_PACKAGE_coap-server is not set
-# CONFIG_PACKAGE_conserver is not set
-# CONFIG_PACKAGE_crowdsec is not set
-# CONFIG_PACKAGE_crowdsec-firewall-bouncer is not set
-# CONFIG_PACKAGE_cshark is not set
-# CONFIG_PACKAGE_daemonlogger is not set
-# CONFIG_PACKAGE_darkstat is not set
-# CONFIG_PACKAGE_dawn is not set
-# CONFIG_PACKAGE_dhcpcd is not set
-# CONFIG_PACKAGE_dmapd is not set
-# CONFIG_PACKAGE_dnscrypt-proxy2 is not set
-# CONFIG_PACKAGE_dnstap is not set
-# CONFIG_PACKAGE_dnstop is not set
-# CONFIG_PACKAGE_ds-lite is not set
-# CONFIG_PACKAGE_esniper is not set
-# CONFIG_PACKAGE_etherwake is not set
-# CONFIG_PACKAGE_etherwake-nfqueue is not set
-CONFIG_PACKAGE_ethtool=y
-# CONFIG_ETHTOOL_PRETTY_DUMP is not set
-# CONFIG_PACKAGE_fail2ban is not set
-# CONFIG_PACKAGE_fakeidentd is not set
-# CONFIG_PACKAGE_fakepop is not set
-# CONFIG_PACKAGE_family-dns is not set
-# CONFIG_PACKAGE_foolsm is not set
-# CONFIG_PACKAGE_fping is not set
-# CONFIG_PACKAGE_generate-ipv6-address is not set
-# CONFIG_PACKAGE_geth is not set
-# CONFIG_PACKAGE_git-lfs is not set
-# CONFIG_PACKAGE_gnunet is not set
-# CONFIG_PACKAGE_gre is not set
-# CONFIG_PACKAGE_hnet-full is not set
-# CONFIG_PACKAGE_hnet-full-l2tp is not set
-# CONFIG_PACKAGE_hnet-full-secure is not set
-# CONFIG_PACKAGE_hnetd-nossl is not set
-# CONFIG_PACKAGE_hnetd-openssl is not set
-# CONFIG_PACKAGE_httping is not set
-# CONFIG_PACKAGE_httping-nossl is not set
-# CONFIG_PACKAGE_https-dns-proxy is not set
-# CONFIG_PACKAGE_i2pd is not set
-# CONFIG_PACKAGE_ibrdtn-tools is not set
-# CONFIG_PACKAGE_ibrdtnd is not set
-# CONFIG_PACKAGE_ifstat is not set
-# CONFIG_PACKAGE_iftop is not set
-# CONFIG_PACKAGE_iiod is not set
-# CONFIG_PACKAGE_iperf is not set
-CONFIG_PACKAGE_iperf3=y
-# CONFIG_PACKAGE_iperf3-ssl is not set
-# CONFIG_PACKAGE_ipip is not set
-# CONFIG_PACKAGE_ipset is not set
-# CONFIG_PACKAGE_ipset-dns is not set
-# CONFIG_PACKAGE_iptraf-ng is not set
-# CONFIG_PACKAGE_iputils-arping is not set
-# CONFIG_PACKAGE_iputils-clockdiff is not set
-# CONFIG_PACKAGE_iputils-ping is not set
-# CONFIG_PACKAGE_iputils-tftpd is not set
-# CONFIG_PACKAGE_iputils-tracepath is not set
-# CONFIG_PACKAGE_ipvsadm is not set
-# CONFIG_PACKAGE_iw is not set
-CONFIG_PACKAGE_iw-full=y
-# CONFIG_PACKAGE_jool-tools is not set
-# CONFIG_PACKAGE_keepalived is not set
-# CONFIG_PACKAGE_knxd is not set
-# CONFIG_PACKAGE_kplex is not set
-# CONFIG_PACKAGE_krb5-client is not set
-# CONFIG_PACKAGE_krb5-libs is not set
-# CONFIG_PACKAGE_krb5-server is not set
-# CONFIG_PACKAGE_krb5-server-extras is not set
-# CONFIG_PACKAGE_libipset is not set
-# CONFIG_PACKAGE_libndp is not set
-# CONFIG_PACKAGE_linknx is not set
-# CONFIG_PACKAGE_lynx is not set
-# CONFIG_PACKAGE_mac-telnet-client is not set
-# CONFIG_PACKAGE_mac-telnet-discover is not set
-# CONFIG_PACKAGE_mac-telnet-ping is not set
-# CONFIG_PACKAGE_mac-telnet-server is not set
-# CONFIG_PACKAGE_map is not set
-# CONFIG_PACKAGE_mbusd is not set
-# CONFIG_PACKAGE_memcached is not set
-# CONFIG_PACKAGE_mii-tool is not set
-# CONFIG_PACKAGE_mikrotik-btest is not set
-# CONFIG_PACKAGE_mini_snmpd is not set
-# CONFIG_PACKAGE_minimalist-pcproxy is not set
-# CONFIG_PACKAGE_miredo is not set
-# CONFIG_PACKAGE_modemmanager is not set
-# CONFIG_PACKAGE_mosquitto-client-nossl is not set
-# CONFIG_PACKAGE_mosquitto-client-ssl is not set
-# CONFIG_PACKAGE_mosquitto-nossl is not set
-# CONFIG_PACKAGE_mosquitto-ssl is not set
-# CONFIG_PACKAGE_mrd6 is not set
-# CONFIG_PACKAGE_mstpd is not set
-# CONFIG_PACKAGE_mtkhnat_util is not set
-# CONFIG_PACKAGE_mtr is not set
-# CONFIG_PACKAGE_nbd is not set
-# CONFIG_PACKAGE_nbd-server is not set
-# CONFIG_PACKAGE_ncp is not set
-# CONFIG_PACKAGE_ndppd is not set
-# CONFIG_PACKAGE_ndptool is not set
-# CONFIG_PACKAGE_nebula is not set
-# CONFIG_PACKAGE_nebula-cert is not set
-# CONFIG_PACKAGE_net-tools-route is not set
-# CONFIG_PACKAGE_netcat is not set
-# CONFIG_PACKAGE_netdiscover is not set
-# CONFIG_PACKAGE_netifyd is not set
-# CONFIG_PACKAGE_netperf is not set
-# CONFIG_PACKAGE_netsniff-ng is not set
-# CONFIG_PACKAGE_netstinky is not set
-# CONFIG_PACKAGE_nextdns is not set
-# CONFIG_PACKAGE_nfdump is not set
-# CONFIG_PACKAGE_nlbwmon is not set
-# CONFIG_PACKAGE_noping is not set
-# CONFIG_PACKAGE_nut is not set
-# CONFIG_PACKAGE_obfs4proxy is not set
-CONFIG_PACKAGE_odhcp6c=y
-CONFIG_PACKAGE_odhcp6c_ext_cer_id=0
-# CONFIG_PACKAGE_odhcpd is not set
-CONFIG_PACKAGE_odhcpd-ipv6only=y
-
-#
-# Configuration
-#
-CONFIG_PACKAGE_odhcpd_ipv6only_ext_cer_id=0
-# end of Configuration
-
-# CONFIG_PACKAGE_ola is not set
-CONFIG_PACKAGE_omcproxy=y
-# CONFIG_PACKAGE_onionshare-cli is not set
-# CONFIG_PACKAGE_ooniprobe is not set
-# CONFIG_PACKAGE_oor is not set
-# CONFIG_PACKAGE_open-iscsi is not set
-# CONFIG_PACKAGE_oping is not set
-# CONFIG_PACKAGE_ostiary is not set
-# CONFIG_PACKAGE_pagekitec is not set
-# CONFIG_PACKAGE_pcapplusplus is not set
-# CONFIG_PACKAGE_pen is not set
-# CONFIG_PACKAGE_phantap is not set
-# CONFIG_PACKAGE_pimbd is not set
-# CONFIG_PACKAGE_pingcheck is not set
-# CONFIG_PACKAGE_port-mirroring is not set
-CONFIG_PACKAGE_ppp=y
-# CONFIG_PACKAGE_ppp-mod-passwordfd is not set
-# CONFIG_PACKAGE_ppp-mod-pppoa is not set
-CONFIG_PACKAGE_ppp-mod-pppoe=y
-# CONFIG_PACKAGE_ppp-mod-pppol2tp is not set
-# CONFIG_PACKAGE_ppp-mod-pptp is not set
-# CONFIG_PACKAGE_ppp-mod-radius is not set
-# CONFIG_PACKAGE_ppp-multilink is not set
-# CONFIG_PACKAGE_pppdump is not set
-# CONFIG_PACKAGE_pppoe-discovery is not set
-# CONFIG_PACKAGE_pppossh is not set
-# CONFIG_PACKAGE_pppstats is not set
-# CONFIG_PACKAGE_proto-bonding is not set
-# CONFIG_PACKAGE_proxychains-ng is not set
-# CONFIG_PACKAGE_ptunnel-ng is not set
-# CONFIG_PACKAGE_radsecproxy is not set
-# CONFIG_PACKAGE_ratched is not set
-# CONFIG_PACKAGE_ratechecker is not set
-# CONFIG_PACKAGE_redsocks is not set
-# CONFIG_PACKAGE_remserial is not set
-# CONFIG_PACKAGE_restic-rest-server is not set
-# CONFIG_PACKAGE_rpcapd is not set
-# CONFIG_PACKAGE_rpcbind is not set
-# CONFIG_PACKAGE_rssileds is not set
-# CONFIG_PACKAGE_rsyslog is not set
-# CONFIG_PACKAGE_safe-search is not set
-# CONFIG_PACKAGE_samba4-admin is not set
-# CONFIG_PACKAGE_samba4-client is not set
-# CONFIG_PACKAGE_samba4-libs is not set
-# CONFIG_PACKAGE_samba4-server is not set
-# CONFIG_PACKAGE_samba4-utils is not set
-# CONFIG_PACKAGE_samplicator is not set
-# CONFIG_PACKAGE_scapy is not set
-# CONFIG_PACKAGE_sctp-tools is not set
-# CONFIG_PACKAGE_seafile-ccnet is not set
-# CONFIG_PACKAGE_seafile-seahub is not set
-# CONFIG_PACKAGE_seafile-server is not set
-# CONFIG_PACKAGE_seafile-server-fuse is not set
-# CONFIG_PACKAGE_ser2net is not set
-# CONFIG_PACKAGE_simple-adblock is not set
-# CONFIG_PACKAGE_smartdns is not set
-# CONFIG_PACKAGE_smbinfo is not set
-# CONFIG_PACKAGE_snmp-mibs is not set
-# CONFIG_PACKAGE_snmp-utils is not set
-# CONFIG_PACKAGE_snmpd is not set
-# CONFIG_PACKAGE_snmptrapd is not set
-# CONFIG_PACKAGE_snowflake-broker is not set
-# CONFIG_PACKAGE_snowflake-client is not set
-# CONFIG_PACKAGE_snowflake-distinctcounter is not set
-# CONFIG_PACKAGE_snowflake-probetest is not set
-# CONFIG_PACKAGE_snowflake-proxy is not set
-# CONFIG_PACKAGE_snowflake-server is not set
-# CONFIG_PACKAGE_socat is not set
-# CONFIG_PACKAGE_softflowd is not set
-# CONFIG_PACKAGE_soloscli is not set
-# CONFIG_PACKAGE_speedtest-netperf is not set
-# CONFIG_PACKAGE_speedtestcli is not set
-# CONFIG_PACKAGE_spoofer is not set
-# CONFIG_PACKAGE_static-neighbor-reports is not set
-# CONFIG_PACKAGE_stunnel is not set
-# CONFIG_PACKAGE_switchdev-poller is not set
-# CONFIG_PACKAGE_tac_plus is not set
-# CONFIG_PACKAGE_tac_plus-pam is not set
-# CONFIG_PACKAGE_tayga is not set
-CONFIG_PACKAGE_tcpdump=y
-# CONFIG_PACKAGE_tcpdump-mini is not set
-# CONFIG_PACKAGE_tgt is not set
-# CONFIG_PACKAGE_tor is not set
-# CONFIG_PACKAGE_tor-basic is not set
-# CONFIG_PACKAGE_tor-fw-helper is not set
-# CONFIG_PACKAGE_trafficshaper is not set
-# CONFIG_PACKAGE_travelmate is not set
-# CONFIG_PACKAGE_u2pnpd is not set
-# CONFIG_PACKAGE_uacme is not set
-CONFIG_PACKAGE_uclient-fetch=y
-# CONFIG_PACKAGE_udptunnel is not set
-# CONFIG_PACKAGE_udpxy is not set
-# CONFIG_PACKAGE_ulogd is not set
-# CONFIG_PACKAGE_umdns is not set
-# CONFIG_PACKAGE_usbip is not set
-# CONFIG_PACKAGE_usteer is not set
-# CONFIG_PACKAGE_vallumd is not set
-# CONFIG_PACKAGE_vncrepeater is not set
-# CONFIG_PACKAGE_vnstat is not set
-# CONFIG_PACKAGE_vnstat2 is not set
-# CONFIG_PACKAGE_vpn-policy-routing is not set
-# CONFIG_PACKAGE_vpnbypass is not set
-# CONFIG_PACKAGE_vti is not set
-# CONFIG_PACKAGE_vxlan is not set
-# CONFIG_PACKAGE_wakeonlan is not set
-# CONFIG_PACKAGE_wg-installer-client is not set
-# CONFIG_PACKAGE_wpan-tools is not set
-# CONFIG_PACKAGE_wwan is not set
-# CONFIG_PACKAGE_xinetd is not set
-# CONFIG_PACKAGE_xray-core is not set
-# end of Network
-
-#
-# Sound
-#
-# CONFIG_PACKAGE_alsa-utils is not set
-# CONFIG_PACKAGE_alsa-utils-seq is not set
-# CONFIG_PACKAGE_alsa-utils-tests is not set
-# CONFIG_PACKAGE_aserver is not set
-# CONFIG_PACKAGE_espeak is not set
-# CONFIG_PACKAGE_faad2 is not set
-# CONFIG_PACKAGE_fdk-aac is not set
-# CONFIG_PACKAGE_forked-daapd is not set
-# CONFIG_PACKAGE_ices is not set
-# CONFIG_PACKAGE_lame is not set
-# CONFIG_PACKAGE_lame-lib is not set
-# CONFIG_PACKAGE_liblo-utils is not set
-# CONFIG_PACKAGE_madplay is not set
-# CONFIG_PACKAGE_moc is not set
-# CONFIG_PACKAGE_mpc is not set
-# CONFIG_PACKAGE_mpd-avahi-service is not set
-# CONFIG_PACKAGE_mpd-full is not set
-# CONFIG_PACKAGE_mpd-mini is not set
-# CONFIG_PACKAGE_mpg123 is not set
-# CONFIG_PACKAGE_opus-tools is not set
-# CONFIG_PACKAGE_pianod is not set
-# CONFIG_PACKAGE_pianod-client is not set
-# CONFIG_PACKAGE_portaudio is not set
-# CONFIG_PACKAGE_pulseaudio-daemon is not set
-# CONFIG_PACKAGE_pulseaudio-daemon-avahi is not set
-# CONFIG_PACKAGE_shairplay is not set
-# CONFIG_PACKAGE_shairport-sync-mbedtls is not set
-# CONFIG_PACKAGE_shairport-sync-mini is not set
-# CONFIG_PACKAGE_shairport-sync-openssl is not set
-# CONFIG_PACKAGE_shine is not set
-# CONFIG_PACKAGE_sox is not set
-# CONFIG_PACKAGE_squeezelite-full is not set
-# CONFIG_PACKAGE_squeezelite-mini is not set
-# CONFIG_PACKAGE_svox is not set
-# CONFIG_PACKAGE_upmpdcli is not set
-# end of Sound
-
-#
-# Utilities
-#
-
-#
-# BigClown
-#
-# CONFIG_PACKAGE_bigclown-control-tool is not set
-# CONFIG_PACKAGE_bigclown-firmware-tool is not set
-# CONFIG_PACKAGE_bigclown-gateway is not set
-# CONFIG_PACKAGE_bigclown-mqtt2influxdb is not set
-# end of BigClown
-
-#
-# Boot Loaders
-#
-# CONFIG_PACKAGE_fconfig is not set
-CONFIG_PACKAGE_uboot-envtools=y
-# end of Boot Loaders
-
-#
-# Compression
-#
-# CONFIG_PACKAGE_bsdtar is not set
-# CONFIG_PACKAGE_bsdtar-noopenssl is not set
-# CONFIG_PACKAGE_bzip2 is not set
-# CONFIG_PACKAGE_gzip is not set
-# CONFIG_PACKAGE_lz4 is not set
-# CONFIG_PACKAGE_pigz is not set
-# CONFIG_PACKAGE_unrar is not set
-# CONFIG_PACKAGE_unzip is not set
-# CONFIG_PACKAGE_xz-utils is not set
-# CONFIG_PACKAGE_zipcmp is not set
-# CONFIG_PACKAGE_zipmerge is not set
-# CONFIG_PACKAGE_ziptool is not set
-# CONFIG_PACKAGE_zstd is not set
-# end of Compression
-
-#
-# Database
-#
-# CONFIG_PACKAGE_mariadb-client is not set
-# CONFIG_PACKAGE_mariadb-server-base is not set
-# CONFIG_PACKAGE_pgsql-cli is not set
-# CONFIG_PACKAGE_pgsql-cli-extra is not set
-# CONFIG_PACKAGE_pgsql-server is not set
-# CONFIG_PACKAGE_rrdcgi1 is not set
-# CONFIG_PACKAGE_rrdtool1 is not set
-# CONFIG_PACKAGE_sqlite3-cli is not set
-# CONFIG_PACKAGE_unixodbc-tools is not set
-# end of Database
-
-#
-# Disc
-#
-# CONFIG_PACKAGE_blkdiscard is not set
-CONFIG_PACKAGE_blkid=m
-CONFIG_PACKAGE_blockdev=m
-# CONFIG_PACKAGE_cfdisk is not set
-# CONFIG_PACKAGE_cgdisk is not set
-# CONFIG_PACKAGE_dmsetup is not set
-# CONFIG_PACKAGE_eject is not set
-# CONFIG_PACKAGE_fdisk is not set
-# CONFIG_PACKAGE_findfs is not set
-# CONFIG_PACKAGE_fio is not set
-# CONFIG_PACKAGE_fixparts is not set
-# CONFIG_PACKAGE_gdisk is not set
-# CONFIG_PACKAGE_hd-idle is not set
-# CONFIG_PACKAGE_hdparm is not set
-# CONFIG_PACKAGE_lsblk is not set
-# CONFIG_PACKAGE_lvm2 is not set
-# CONFIG_PACKAGE_lvm2-selinux is not set
-# CONFIG_PACKAGE_mdadm is not set
-# CONFIG_PACKAGE_parted is not set
-# CONFIG_PACKAGE_partx-utils is not set
-# CONFIG_PACKAGE_sfdisk is not set
-# CONFIG_PACKAGE_sgdisk is not set
-# CONFIG_PACKAGE_wipefs is not set
-# end of Disc
-
-#
-# Editors
-#
-# CONFIG_PACKAGE_joe is not set
-# CONFIG_PACKAGE_jupp is not set
-# CONFIG_PACKAGE_mg is not set
-# CONFIG_PACKAGE_nano is not set
-# CONFIG_PACKAGE_nano-full is not set
-# CONFIG_PACKAGE_nano-plus is not set
-# CONFIG_PACKAGE_vim is not set
-# CONFIG_PACKAGE_vim-full is not set
-# CONFIG_PACKAGE_vim-fuller is not set
-# CONFIG_PACKAGE_vim-help is not set
-# CONFIG_PACKAGE_vim-runtime is not set
-# CONFIG_PACKAGE_zile is not set
-# end of Editors
-
-#
-# Encryption
-#
-# CONFIG_PACKAGE_ccrypt is not set
-# CONFIG_PACKAGE_certtool is not set
-# CONFIG_PACKAGE_cryptsetup is not set
-# CONFIG_PACKAGE_cryptsetup-ssh is not set
-# CONFIG_PACKAGE_gnupg is not set
-# CONFIG_PACKAGE_gnupg2 is not set
-# CONFIG_PACKAGE_gnupg2-dirmngr is not set
-# CONFIG_PACKAGE_gnutls-utils is not set
-# CONFIG_PACKAGE_gpgv is not set
-# CONFIG_PACKAGE_gpgv2 is not set
-# CONFIG_PACKAGE_keyctl is not set
-# CONFIG_PACKAGE_keyutils is not set
-# CONFIG_PACKAGE_px5g-mbedtls is not set
-# CONFIG_PACKAGE_px5g-standalone is not set
-# CONFIG_PACKAGE_px5g-wolfssl is not set
-# CONFIG_PACKAGE_stoken is not set
-# end of Encryption
-
-#
-# Filesystem
-#
-# CONFIG_PACKAGE_acl is not set
-# CONFIG_PACKAGE_afuse is not set
-# CONFIG_PACKAGE_antfs-mount is not set
-# CONFIG_PACKAGE_attr is not set
-# CONFIG_PACKAGE_badblocks is not set
-# CONFIG_PACKAGE_btrfs-progs is not set
-# CONFIG_PACKAGE_chattr is not set
-# CONFIG_PACKAGE_debugfs is not set
-# CONFIG_PACKAGE_dosfstools is not set
-# CONFIG_PACKAGE_dumpe2fs is not set
-# CONFIG_PACKAGE_e2freefrag is not set
-CONFIG_PACKAGE_e2fsprogs=m
-# CONFIG_PACKAGE_e4crypt is not set
-# CONFIG_PACKAGE_exfat-fsck is not set
-# CONFIG_PACKAGE_exfat-mkfs is not set
-# CONFIG_PACKAGE_f2fs-tools is not set
-# CONFIG_PACKAGE_f2fs-tools-selinux is not set
-# CONFIG_PACKAGE_f2fsck is not set
-# CONFIG_PACKAGE_f2fsck-selinux is not set
-# CONFIG_PACKAGE_filefrag is not set
-# CONFIG_PACKAGE_fstrim is not set
-# CONFIG_PACKAGE_fuse-utils is not set
-# CONFIG_PACKAGE_fuse3-utils is not set
-# CONFIG_PACKAGE_hfsfsck is not set
-# CONFIG_PACKAGE_lsattr is not set
-CONFIG_PACKAGE_mkf2fs=m
-# CONFIG_PACKAGE_mkf2fs-selinux is not set
-# CONFIG_PACKAGE_mkhfs is not set
-# CONFIG_PACKAGE_ncdu is not set
-# CONFIG_PACKAGE_nfs-utils is not set
-# CONFIG_PACKAGE_nfs-utils-libs is not set
-# CONFIG_PACKAGE_ntfs-3g is not set
-# CONFIG_PACKAGE_ntfs-3g-low is not set
-# CONFIG_PACKAGE_ntfs-3g-utils is not set
-# CONFIG_PACKAGE_owfs is not set
-# CONFIG_PACKAGE_owshell is not set
-# CONFIG_PACKAGE_resize2fs is not set
-# CONFIG_PACKAGE_squashfs-tools-mksquashfs is not set
-# CONFIG_PACKAGE_squashfs-tools-unsquashfs is not set
-# CONFIG_PACKAGE_swap-utils is not set
-# CONFIG_PACKAGE_sysfsutils is not set
-# CONFIG_PACKAGE_tune2fs is not set
-# CONFIG_PACKAGE_xfs-admin is not set
-# CONFIG_PACKAGE_xfs-fsck is not set
-# CONFIG_PACKAGE_xfs-growfs is not set
-# CONFIG_PACKAGE_xfs-mkfs is not set
-# end of Filesystem
-
-#
-# Image Manipulation
-#
-# CONFIG_PACKAGE_libjpeg-turbo-utils is not set
-# CONFIG_PACKAGE_tiff-utils is not set
-# end of Image Manipulation
-
-#
-# Microcontroller programming
-#
-# CONFIG_PACKAGE_avrdude is not set
-# CONFIG_PACKAGE_dfu-programmer is not set
-# CONFIG_PACKAGE_stm32flash is not set
-# end of Microcontroller programming
-
-#
-# RTKLIB Suite
-#
-# CONFIG_PACKAGE_convbin is not set
-# CONFIG_PACKAGE_pos2kml is not set
-# CONFIG_PACKAGE_rnx2rtkp is not set
-# CONFIG_PACKAGE_rtkrcv is not set
-# CONFIG_PACKAGE_str2str is not set
-# end of RTKLIB Suite
-
-#
-# Shells
-#
-# CONFIG_PACKAGE_bash is not set
-# CONFIG_PACKAGE_fish is not set
-# CONFIG_PACKAGE_klish is not set
-# CONFIG_PACKAGE_mksh is not set
-# CONFIG_PACKAGE_tcsh is not set
-# CONFIG_PACKAGE_zsh is not set
-# end of Shells
-
-#
-# Terminal
-#
-# CONFIG_PACKAGE_agetty is not set
-# CONFIG_PACKAGE_dvtm is not set
-# CONFIG_PACKAGE_minicom is not set
-# CONFIG_PACKAGE_picocom is not set
-# CONFIG_PACKAGE_rtty-mbedtls is not set
-# CONFIG_PACKAGE_rtty-nossl is not set
-# CONFIG_PACKAGE_rtty-openssl is not set
-# CONFIG_PACKAGE_rtty-wolfssl is not set
-# CONFIG_PACKAGE_screen is not set
-# CONFIG_PACKAGE_script-utils is not set
-# CONFIG_PACKAGE_serialconsole is not set
-# CONFIG_PACKAGE_setterm is not set
-# CONFIG_PACKAGE_tio is not set
-# CONFIG_PACKAGE_tmux is not set
-# CONFIG_PACKAGE_ttyd is not set
-# CONFIG_PACKAGE_wall is not set
-# end of Terminal
-
-#
-# Virtualization
-#
-# end of Virtualization
-
-#
-# Zoneinfo
-#
-# CONFIG_PACKAGE_zoneinfo-africa is not set
-# CONFIG_PACKAGE_zoneinfo-all is not set
-# CONFIG_PACKAGE_zoneinfo-asia is not set
-# CONFIG_PACKAGE_zoneinfo-atlantic is not set
-# CONFIG_PACKAGE_zoneinfo-australia-nz is not set
-# CONFIG_PACKAGE_zoneinfo-core is not set
-# CONFIG_PACKAGE_zoneinfo-europe is not set
-# CONFIG_PACKAGE_zoneinfo-india is not set
-# CONFIG_PACKAGE_zoneinfo-northamerica is not set
-# CONFIG_PACKAGE_zoneinfo-pacific is not set
-# CONFIG_PACKAGE_zoneinfo-poles is not set
-# CONFIG_PACKAGE_zoneinfo-simple is not set
-# CONFIG_PACKAGE_zoneinfo-southamerica is not set
-# end of Zoneinfo
-
-#
-# libimobiledevice
-#
-# CONFIG_PACKAGE_idevicerestore is not set
-# CONFIG_PACKAGE_irecovery is not set
-# CONFIG_PACKAGE_libimobiledevice-utils is not set
-# CONFIG_PACKAGE_libusbmuxd-utils is not set
-# CONFIG_PACKAGE_plistutil is not set
-# CONFIG_PACKAGE_usbmuxd is not set
-# end of libimobiledevice
-
-#
-# libselinux tools
-#
-# CONFIG_PACKAGE_libselinux-avcstat is not set
-# CONFIG_PACKAGE_libselinux-compute_av is not set
-# CONFIG_PACKAGE_libselinux-compute_create is not set
-# CONFIG_PACKAGE_libselinux-compute_member is not set
-# CONFIG_PACKAGE_libselinux-compute_relabel is not set
-# CONFIG_PACKAGE_libselinux-getconlist is not set
-# CONFIG_PACKAGE_libselinux-getdefaultcon is not set
-# CONFIG_PACKAGE_libselinux-getenforce is not set
-# CONFIG_PACKAGE_libselinux-getfilecon is not set
-# CONFIG_PACKAGE_libselinux-getpidcon is not set
-# CONFIG_PACKAGE_libselinux-getsebool is not set
-# CONFIG_PACKAGE_libselinux-getseuser is not set
-# CONFIG_PACKAGE_libselinux-matchpathcon is not set
-# CONFIG_PACKAGE_libselinux-policyvers is not set
-# CONFIG_PACKAGE_libselinux-sefcontext_compile is not set
-# CONFIG_PACKAGE_libselinux-selabel_digest is not set
-# CONFIG_PACKAGE_libselinux-selabel_get_digests_all_partial_matches is not set
-# CONFIG_PACKAGE_libselinux-selabel_lookup is not set
-# CONFIG_PACKAGE_libselinux-selabel_lookup_best_match is not set
-# CONFIG_PACKAGE_libselinux-selabel_partial_match is not set
-# CONFIG_PACKAGE_libselinux-selinux_check_access is not set
-# CONFIG_PACKAGE_libselinux-selinux_check_securetty_context is not set
-# CONFIG_PACKAGE_libselinux-selinuxenabled is not set
-# CONFIG_PACKAGE_libselinux-selinuxexeccon is not set
-# CONFIG_PACKAGE_libselinux-setenforce is not set
-# CONFIG_PACKAGE_libselinux-setfilecon is not set
-# CONFIG_PACKAGE_libselinux-togglesebool is not set
-# CONFIG_PACKAGE_libselinux-validatetrans is not set
-# end of libselinux tools
-
-# CONFIG_PACKAGE_acpid is not set
-# CONFIG_PACKAGE_adb is not set
-# CONFIG_PACKAGE_airos-dfs-reset is not set
-# CONFIG_PACKAGE_ap51-flash is not set
-# CONFIG_PACKAGE_apk is not set
-# CONFIG_PACKAGE_at is not set
-# CONFIG_PACKAGE_atheepmgr is not set
-# CONFIG_PACKAGE_audit is not set
-# CONFIG_PACKAGE_audit-utils is not set
-# CONFIG_PACKAGE_augeas is not set
-# CONFIG_PACKAGE_augeas-lenses is not set
-# CONFIG_PACKAGE_augeas-lenses-tests is not set
-# CONFIG_PACKAGE_bandwidthd is not set
-# CONFIG_PACKAGE_bandwidthd-pgsql is not set
-# CONFIG_PACKAGE_bandwidthd-php is not set
-# CONFIG_PACKAGE_bandwidthd-sqlite is not set
-# CONFIG_PACKAGE_banhostlist is not set
-# CONFIG_PACKAGE_bc is not set
-# CONFIG_PACKAGE_bluelog is not set
-# CONFIG_PACKAGE_bluez-daemon is not set
-# CONFIG_PACKAGE_bluez-utils is not set
-# CONFIG_PACKAGE_bluez-utils-extra is not set
-# CONFIG_PACKAGE_bonniexx is not set
-# CONFIG_PACKAGE_bottlerocket is not set
-# CONFIG_PACKAGE_bsdiff is not set
-# CONFIG_PACKAGE_bspatch is not set
-# CONFIG_PACKAGE_byobu is not set
-# CONFIG_PACKAGE_byobu-utils is not set
-# CONFIG_PACKAGE_cache-domains-mbedtls is not set
-# CONFIG_PACKAGE_cache-domains-openssl is not set
-# CONFIG_PACKAGE_cache-domains-wolfssl is not set
-# CONFIG_PACKAGE_cal is not set
-# CONFIG_PACKAGE_canutils is not set
-# CONFIG_PACKAGE_cgroup-tools is not set
-# CONFIG_PACKAGE_cgroupfs-mount is not set
-# CONFIG_PACKAGE_checkpolicy is not set
-# CONFIG_PACKAGE_checksec is not set
-# CONFIG_PACKAGE_checksec_automator is not set
-# CONFIG_PACKAGE_chkcon is not set
-# CONFIG_PACKAGE_cmdpad is not set
-# CONFIG_PACKAGE_cni is not set
-# CONFIG_PACKAGE_cni-plugins is not set
-# CONFIG_PACKAGE_coap-client is not set
-# CONFIG_PACKAGE_collectd is not set
-# CONFIG_PACKAGE_conmon is not set
-# CONFIG_PACKAGE_containerd is not set
-# CONFIG_PACKAGE_coremark is not set
-# CONFIG_PACKAGE_coreutils is not set
-# CONFIG_PACKAGE_crconf is not set
-# CONFIG_PACKAGE_crelay is not set
-# CONFIG_PACKAGE_crun is not set
-# CONFIG_PACKAGE_csstidy is not set
-# CONFIG_PACKAGE_ct-bugcheck is not set
-# CONFIG_PACKAGE_ctop is not set
-# CONFIG_PACKAGE_dbus is not set
-# CONFIG_PACKAGE_dbus-utils is not set
-# CONFIG_PACKAGE_device-observatory is not set
-# CONFIG_PACKAGE_dfu-util is not set
-CONFIG_PACKAGE_dieharder=y
-# CONFIG_PACKAGE_digitemp is not set
-# CONFIG_PACKAGE_digitemp-usb is not set
-# CONFIG_PACKAGE_dmesg is not set
-# CONFIG_PACKAGE_docker is not set
-# CONFIG_PACKAGE_docker-compose is not set
-# CONFIG_PACKAGE_dockerd is not set
-# CONFIG_PACKAGE_domoticz is not set
-# CONFIG_PACKAGE_dropbearconvert is not set
-# CONFIG_PACKAGE_dtc is not set
-# CONFIG_PACKAGE_dumb-init is not set
-# CONFIG_PACKAGE_dump1090 is not set
-# CONFIG_PACKAGE_ecdsautils is not set
-# CONFIG_PACKAGE_elektra-kdb is not set
-# CONFIG_PACKAGE_evtest is not set
-# CONFIG_PACKAGE_extract is not set
-# CONFIG_PACKAGE_fdt-utils is not set
-# CONFIG_PACKAGE_file is not set
-# CONFIG_PACKAGE_findutils is not set
-# CONFIG_PACKAGE_findutils-find is not set
-# CONFIG_PACKAGE_findutils-locate is not set
-# CONFIG_PACKAGE_findutils-xargs is not set
-# CONFIG_PACKAGE_flashrom is not set
-# CONFIG_PACKAGE_flashrom-pci is not set
-# CONFIG_PACKAGE_flashrom-spi is not set
-# CONFIG_PACKAGE_flashrom-usb is not set
-# CONFIG_PACKAGE_flock is not set
-# CONFIG_PACKAGE_fritz-caldata is not set
-# CONFIG_PACKAGE_fritz-tffs is not set
-# CONFIG_PACKAGE_fritz-tffs-nand is not set
-# CONFIG_PACKAGE_ftdi_eeprom is not set
-# CONFIG_PACKAGE_gammu is not set
-# CONFIG_PACKAGE_gawk is not set
-# CONFIG_PACKAGE_gddrescue is not set
-# CONFIG_PACKAGE_getopt is not set
-# CONFIG_PACKAGE_giflib-utils is not set
-# CONFIG_PACKAGE_gkermit is not set
-# CONFIG_PACKAGE_gnuplot is not set
-# CONFIG_PACKAGE_gpioctl-sysfs is not set
-# CONFIG_PACKAGE_gpiod-tools is not set
-# CONFIG_PACKAGE_gpsd is not set
-# CONFIG_PACKAGE_gpsd-clients is not set
-# CONFIG_PACKAGE_gpsd-utils is not set
-# CONFIG_PACKAGE_grep is not set
-# CONFIG_PACKAGE_hamlib is not set
-# CONFIG_PACKAGE_haserl is not set
-# CONFIG_PACKAGE_hashdeep is not set
-# CONFIG_PACKAGE_haveged is not set
-# CONFIG_PACKAGE_hplip-common is not set
-# CONFIG_PACKAGE_hplip-sane is not set
-# CONFIG_PACKAGE_hub-ctrl is not set
-# CONFIG_PACKAGE_hwclock is not set
-# CONFIG_PACKAGE_hwinfo is not set
-# CONFIG_PACKAGE_hwloc-utils is not set
-# CONFIG_PACKAGE_i2c-tools is not set
-# CONFIG_PACKAGE_iconv is not set
-# CONFIG_PACKAGE_iio-utils is not set
-# CONFIG_PACKAGE_inotifywait is not set
-# CONFIG_PACKAGE_inotifywatch is not set
-# CONFIG_PACKAGE_io is not set
-# CONFIG_PACKAGE_ioctlfuzzer is not set
-# CONFIG_PACKAGE_ipfs-http-client-tests is not set
-# CONFIG_PACKAGE_irqbalance is not set
-# CONFIG_PACKAGE_iwcap is not set
-CONFIG_PACKAGE_iwinfo=y
-# CONFIG_PACKAGE_jq is not set
-CONFIG_PACKAGE_jshn=y
-# CONFIG_PACKAGE_kmod is not set
-CONFIG_PACKAGE_kvcedit=y
-# CONFIG_PACKAGE_lcd4linux-custom is not set
-# CONFIG_PACKAGE_lcdproc-clients is not set
-# CONFIG_PACKAGE_lcdproc-drivers is not set
-# CONFIG_PACKAGE_lcdproc-server is not set
-# CONFIG_PACKAGE_less is not set
-# CONFIG_PACKAGE_less-wide is not set
-CONFIG_PACKAGE_libjson-script=y
-# CONFIG_PACKAGE_libnetwork is not set
-# CONFIG_PACKAGE_librespeed-cli is not set
-# CONFIG_PACKAGE_libxml2-utils is not set
-# CONFIG_PACKAGE_lm-sensors is not set
-# CONFIG_PACKAGE_lm-sensors-detect is not set
-# CONFIG_PACKAGE_logger is not set
-# CONFIG_PACKAGE_logrotate is not set
-# CONFIG_PACKAGE_look is not set
-CONFIG_PACKAGE_losetup=m
-# CONFIG_PACKAGE_lrzsz is not set
-# CONFIG_PACKAGE_lscpu is not set
-# CONFIG_PACKAGE_lsof is not set
-# CONFIG_PACKAGE_lxc is not set
-# CONFIG_PACKAGE_maccalc is not set
-# CONFIG_PACKAGE_macchanger is not set
-# CONFIG_PACKAGE_mbedtls-util is not set
-# CONFIG_PACKAGE_mbim-utils is not set
-# CONFIG_PACKAGE_mbtools is not set
-# CONFIG_PACKAGE_mc is not set
-# CONFIG_PACKAGE_mcookie is not set
-# CONFIG_PACKAGE_memtester is not set
-# CONFIG_PACKAGE_micrond is not set
-# CONFIG_PACKAGE_miniflux is not set
-# CONFIG_PACKAGE_mmc-utils is not set
-# CONFIG_PACKAGE_more is not set
-# CONFIG_PACKAGE_moreutils is not set
-# CONFIG_PACKAGE_mosh-client is not set
-# CONFIG_PACKAGE_mosh-server is not set
-# CONFIG_PACKAGE_mount-utils is not set
-# CONFIG_PACKAGE_mpack is not set
-# CONFIG_PACKAGE_mt-st is not set
-# CONFIG_PACKAGE_namei is not set
-CONFIG_PACKAGE_nand-utils=y
-# CONFIG_PACKAGE_naywatch is not set
-# CONFIG_PACKAGE_netopeer2-cli is not set
-# CONFIG_PACKAGE_netopeer2-server is not set
-# CONFIG_PACKAGE_netwhere is not set
-# CONFIG_PACKAGE_nnn is not set
-# CONFIG_PACKAGE_nsenter is not set
-# CONFIG_PACKAGE_nss-utils is not set
-# CONFIG_PACKAGE_oath-toolkit is not set
-# CONFIG_PACKAGE_oci-runtime-tool is not set
-# CONFIG_PACKAGE_open-plc-utils is not set
-# CONFIG_PACKAGE_open2300 is not set
-# CONFIG_PACKAGE_openobex is not set
-# CONFIG_PACKAGE_openobex-apps is not set
-# CONFIG_PACKAGE_openocd is not set
-# CONFIG_PACKAGE_opensc-utils is not set
-# CONFIG_PACKAGE_openssl-util is not set
-# CONFIG_PACKAGE_openzwave is not set
-# CONFIG_PACKAGE_openzwave-config is not set
-# CONFIG_PACKAGE_owipcalc is not set
-# CONFIG_PACKAGE_pciids is not set
-# CONFIG_PACKAGE_pciutils is not set
-# CONFIG_PACKAGE_pcsc-tools is not set
-# CONFIG_PACKAGE_pcscd is not set
-# CONFIG_PACKAGE_podman is not set
-# CONFIG_PACKAGE_podman-selinux is not set
-# CONFIG_PACKAGE_policycoreutils is not set
-# CONFIG_PACKAGE_powertop is not set
-# CONFIG_PACKAGE_pps-tools is not set
-# CONFIG_PACKAGE_prlimit is not set
-# CONFIG_PACKAGE_procps-ng is not set
-# CONFIG_PACKAGE_progress is not set
-# CONFIG_PACKAGE_prometheus is not set
-# CONFIG_PACKAGE_prometheus-node-exporter-lua is not set
-# CONFIG_PACKAGE_prometheus-statsd-exporter is not set
-# CONFIG_PACKAGE_pservice is not set
-# CONFIG_PACKAGE_psmisc is not set
-# CONFIG_PACKAGE_pv is not set
-# CONFIG_PACKAGE_qmi-utils is not set
-# CONFIG_PACKAGE_qrencode is not set
-# CONFIG_PACKAGE_quota is not set
-# CONFIG_PACKAGE_ravpower-mcu is not set
-# CONFIG_PACKAGE_readsb is not set
-# CONFIG_PACKAGE_relayctl is not set
-# CONFIG_PACKAGE_rename is not set
-# CONFIG_PACKAGE_reptyr is not set
-# CONFIG_PACKAGE_restic is not set
-CONFIG_PACKAGE_rng-tools=y
-# CONFIG_PACKAGE_rtl-ais is not set
-# CONFIG_PACKAGE_rtl-sdr is not set
-# CONFIG_PACKAGE_rtl_433 is not set
-# CONFIG_PACKAGE_runc is not set
-# CONFIG_PACKAGE_sane-backends is not set
-# CONFIG_PACKAGE_sane-daemon is not set
-# CONFIG_PACKAGE_sane-frontends is not set
-# CONFIG_PACKAGE_secilc is not set
-# CONFIG_PACKAGE_sed is not set
-# CONFIG_PACKAGE_selinux-audit2allow is not set
-# CONFIG_PACKAGE_selinux-chcat is not set
-# CONFIG_PACKAGE_selinux-semanage is not set
-# CONFIG_PACKAGE_semodule-utils is not set
-# CONFIG_PACKAGE_serdisplib-tools is not set
-# CONFIG_PACKAGE_setools is not set
-# CONFIG_PACKAGE_setserial is not set
-# CONFIG_PACKAGE_shadow-utils is not set
-# CONFIG_PACKAGE_sipcalc is not set
-# CONFIG_PACKAGE_sispmctl is not set
-# CONFIG_PACKAGE_slide-switch is not set
-# CONFIG_PACKAGE_smartd is not set
-# CONFIG_PACKAGE_smartd-mail is not set
-# CONFIG_PACKAGE_smartmontools is not set
-# CONFIG_PACKAGE_smartmontools-drivedb is not set
-# CONFIG_PACKAGE_smstools3 is not set
-# CONFIG_PACKAGE_sockread is not set
-# CONFIG_PACKAGE_spi-tools is not set
-# CONFIG_PACKAGE_spidev-test is not set
-# CONFIG_PACKAGE_ssdeep is not set
-# CONFIG_PACKAGE_sshpass is not set
-# CONFIG_PACKAGE_strace is not set
-CONFIG_STRACE_NONE=y
-# CONFIG_STRACE_LIBDW is not set
-# CONFIG_STRACE_LIBUNWIND is not set
-# CONFIG_PACKAGE_streamtest is not set
-# CONFIG_PACKAGE_stress is not set
-# CONFIG_PACKAGE_stress-ng is not set
-# CONFIG_PACKAGE_sumo is not set
-# CONFIG_PACKAGE_syncthing is not set
-# CONFIG_PACKAGE_sysrepo is not set
-# CONFIG_PACKAGE_sysrepocfg is not set
-# CONFIG_PACKAGE_sysrepoctl is not set
-# CONFIG_PACKAGE_sysstat is not set
-# CONFIG_PACKAGE_tar is not set
-# CONFIG_PACKAGE_taskwarrior is not set
-# CONFIG_PACKAGE_telegraf is not set
-# CONFIG_PACKAGE_telegraf-full is not set
-# CONFIG_PACKAGE_telldus-core is not set
-# CONFIG_PACKAGE_temperusb is not set
-# CONFIG_PACKAGE_tesseract is not set
-# CONFIG_PACKAGE_tini is not set
-# CONFIG_PACKAGE_tinyionice is not set
-# CONFIG_PACKAGE_tracertools is not set
-# CONFIG_PACKAGE_tree is not set
-# CONFIG_PACKAGE_triggerhappy is not set
-CONFIG_PACKAGE_ubi-utils=y
-# CONFIG_PACKAGE_ubnt-manager is not set
-# CONFIG_PACKAGE_udns-dnsget is not set
-# CONFIG_PACKAGE_udns-ex-rdns is not set
-# CONFIG_PACKAGE_udns-rblcheck is not set
-# CONFIG_PACKAGE_ugps is not set
-# CONFIG_PACKAGE_uhubctl is not set
-# CONFIG_PACKAGE_uledd is not set
-# CONFIG_PACKAGE_unshare is not set
-# CONFIG_PACKAGE_usb-modeswitch is not set
-# CONFIG_PACKAGE_usbids is not set
-# CONFIG_PACKAGE_usbutils is not set
-# CONFIG_PACKAGE_uuidd is not set
-# CONFIG_PACKAGE_uuidgen is not set
-# CONFIG_PACKAGE_uvcdynctrl is not set
-# CONFIG_PACKAGE_v4l-utils is not set
-# CONFIG_PACKAGE_view1090 is not set
-# CONFIG_PACKAGE_viewadsb is not set
-# CONFIG_PACKAGE_watchcat is not set
-# CONFIG_PACKAGE_whereis is not set
-# CONFIG_PACKAGE_which is not set
-# CONFIG_PACKAGE_whiptail is not set
-# CONFIG_PACKAGE_whois is not set
-# CONFIG_PACKAGE_wifitoggle is not set
-# CONFIG_PACKAGE_wipe is not set
-# CONFIG_PACKAGE_xsltproc is not set
-# CONFIG_PACKAGE_xxd is not set
-# CONFIG_PACKAGE_yanglint is not set
-# CONFIG_PACKAGE_yara is not set
-# CONFIG_PACKAGE_ykpers is not set
-# CONFIG_PACKAGE_yq is not set
-# end of Utilities
-
-#
-# Xorg
-#
-
-#
-# Font-Utils
-#
-# CONFIG_PACKAGE_fontconfig is not set
-# end of Font-Utils
-# end of Xorg
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/0002-add-EHT-config-for-hostapd.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/0002-add-EHT-config-for-hostapd.patch
deleted file mode 100644
index d448233..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/0002-add-EHT-config-for-hostapd.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in
-index 87ad7e0..c42620a 100644
---- a/package/network/services/hostapd/Config.in
-+++ b/package/network/services/hostapd/Config.in
-@@ -82,6 +82,10 @@ config DRIVER_11AX_SUPPORT
- 	default n
- 	select WPA_MBO_SUPPORT
- 
-+config DRIVER_11BE_SUPPORT
-+	bool
-+	default n
-+
- config WPA_ENABLE_WEP
- 	bool "Enable support for unsecure and obsolete WEP"
- 	help
-diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile
-index 7a31c36..4897a2f 100644
---- a/package/network/services/hostapd/Makefile
-+++ b/package/network/services/hostapd/Makefile
-@@ -29,6 +29,7 @@ PKG_CONFIG_DEPENDS:= \
- 	CONFIG_WPA_RFKILL_SUPPORT \
- 	CONFIG_DRIVER_11AC_SUPPORT \
- 	CONFIG_DRIVER_11AX_SUPPORT \
-+	CONFIG_DRIVER_11BE_SUPPORT \
- 	CONFIG_WPA_ENABLE_WEP
- 
- PKG_BUILD_FLAGS:=gc-sections lto
-@@ -81,6 +82,10 @@ ifneq ($(CONFIG_DRIVER_11AX_SUPPORT),)
-   HOSTAPD_IEEE80211AX:=y
- endif
- 
-+ifneq ($(CONFIG_DRIVER_11BE_SUPPORT),)
-+  HOSTAPD_IEEE80211BE:=y
-+endif
-+
- CORE_DEPENDS = +ucode +libubus +libucode +ucode-mod-fs +ucode-mod-nl80211 +ucode-mod-rtnl +ucode-mod-ubus +ucode-mod-uloop +libblobmsg-json +libudebug
- 
- DRIVER_MAKEOPTS= \
-@@ -88,6 +93,7 @@ DRIVER_MAKEOPTS= \
- 	CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \
- 	CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \
- 	CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \
-+	CONFIG_IEEE80211BE=$(HOSTAPD_IEEE80211BE) \
- 	CONFIG_MBO=$(CONFIG_WPA_MBO_SUPPORT) \
- 	CONFIG_UCODE=y
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/lede-branch-build-sanity.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211/lede-branch-build-sanity.sh
deleted file mode 100755
index d7caeda..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/lede-branch-build-sanity.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/bash
-source ./autobuild/lede-build-sanity.sh
-
-#get the brach_name
-temp=${0%/*}
-branch_name=${temp##*/}
-swpath=0
-backport_new=1
-hostapd_new=1
-args=
-
-for arg in $*; do
-	case "$arg" in
-	"swpath")
-		swpath=1
-		;;
-	"kasan")
-		kasan=1
-		;;
-	*)
-		args="$args $arg"
-		;;
-	esac
-done
-set -- $args
-
-change_dot_config() {
-	[ "$swpath" = "1" ] && {
-		echo "==========SW PATH========="
-		sed -i 's/CONFIG_BRIDGE_NETFILTER=y/# CONFIG_BRIDGE_NETFILTER is not set/g' ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		sed -i 's/CONFIG_NETFILTER_FAMILY_BRIDGE=y/# CONFIG_NETFILTER_FAMILY_BRIDGE is not set/g' ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		sed -i 's/CONFIG_SKB_EXTENSIONS=y/# CONFIG_SKB_EXTENSIONS is not set/g' ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		sed -i '/AUTOLOAD:=$(call AutoProbe,mt7996e)/a\  MODPARAMS.mt7996e:=wed_enable=0' ${BUILD_DIR}/package/kernel/mt76/Makefile
-	}
-	[ "$backport_new" = "1" ] && {
-		rm -rf ${BUILD_DIR}/package/kernel/mt76/patches/*revert-for-backports*.patch
-	}
-	[ "$kasan" = "1" ] && {
-		sed -i 's/# CONFIG_KERNEL_KASAN is not set/CONFIG_KERNEL_KASAN=y/g' ${BUILD_DIR}/.config
-		sed -i 's/# CONFIG_KERNEL_KALLSYMS is not set/CONFIG_KERNEL_KALLSYMS=y/g' ${BUILD_DIR}/.config
-		echo "CONFIG_KERNEL_KASAN_OUTLINE=y" >> ${BUILD_DIR}/.config
-		echo "CONFIG_DEBUG_KMEMLEAK=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "# CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF is not set" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=16000" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_DEBUG_KMEMLEAK_TEST=m" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_KALLSYMS=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_KASAN=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_KASAN_GENERIC=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "# CONFIG_KASAN_INLINE is not set" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_KASAN_OUTLINE=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_KASAN_SHADOW_OFFSET=0xdfffffd000000000" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "# CONFIG_TEST_KASAN is not set" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_SLUB_DEBUG=y" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-		echo "CONFIG_FRAME_WARN=4096" >> ${BUILD_DIR}/target/linux/mediatek/mt7988/config-5.4
-	}
-}
-
-#step1 clean
-#clean
-#do prepare stuff
-prepare
-
-prepare_flowoffload
-
-#prepare mac80211 mt76 wifi stuff
-prepare_mac80211 ${backport_new} ${hostapd_new}
-
-# find ${BUILD_DIR}/package/kernel/mt76/patches -name "*-mt76-*.patch" -delete
-rm -rf ${BUILD_DIR}/package/kernel/mt76/patches/*
-
-# remove crypto-eip package since it not support at mt76 yet
-rm -rf ${BUILD_DIR}/package/mtk_soc/drivers/crypto-eip/
-
-# ========== specific modification on mt7996 autobuild for EHT support ==========
-# patch hostapd to use latest version and add 11BE config
-patch -p1 < ${BUILD_DIR}/autobuild/${branch_name}/0002-add-EHT-config-for-hostapd.patch || exit 1
-
-# remove some iw patches to let EHT work normally
-rm -rf ${BUILD_DIR}/package/network/utils/iw/patches/001-nl80211_h_sync.patch
-rm -rf ${BUILD_DIR}/package/network/utils/iw/patches/120-antenna_gain.patch
-# ===========================================================
-
-prepare_final ${branch_name}
-
-change_dot_config
-
-#step2 build
-if [ -z ${1} ]; then
-	build_log ${branch_name} -j1 || [ "$LOCAL" != "1" ]
-fi
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0001-mtk-Revert-wifi-mt76-mt7996-fill-txd-by-host-driver.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0001-mtk-Revert-wifi-mt76-mt7996-fill-txd-by-host-driver.patch
deleted file mode 100644
index 93e37fb..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0001-mtk-Revert-wifi-mt76-mt7996-fill-txd-by-host-driver.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 5278bba5f5096bf42e0d808d4c23b2af3d16dd73 Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Tue, 19 Sep 2023 11:21:23 +0800
-Subject: [PATCH 01/17] mtk: Revert "wifi: mt76: mt7996: fill txd by host
- driver"
-
-This reverts commit 325a0c4931990d553487024c4f76c776492bdcc2.
----
- mt7996/mac.c | 13 +++++++++----
- 1 file changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index bc7111a7..3afdd7eb 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -938,8 +938,11 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- 		return id;
- 
- 	pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
--	mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
--			      pid, qid, 0);
-+	memset(txwi_ptr, 0, MT_TXD_SIZE);
-+	/* Transmit non qos data by 802.11 header and need to fill txd by host*/
-+	if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
-+		mt7996_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
-+				      pid, qid, 0);
- 
- 	txp = (struct mt76_connac_txp_common *)(txwi + MT_TXD_SIZE);
- 	for (i = 0; i < nbuf; i++) {
-@@ -956,8 +959,10 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- 	}
- 	txp->fw.nbuf = nbuf;
- 
--	txp->fw.flags =
--		cpu_to_le16(MT_CT_INFO_FROM_HOST | MT_CT_INFO_APPLY_TXD);
-+	txp->fw.flags = cpu_to_le16(MT_CT_INFO_FROM_HOST);
-+
-+	if (!is_8023 || pid >= MT_PACKET_ID_FIRST)
-+		txp->fw.flags |= cpu_to_le16(MT_CT_INFO_APPLY_TXD);
- 
- 	if (!key)
- 		txp->fw.flags |= cpu_to_le16(MT_CT_INFO_NONE_CIPHER_FRAME);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0002-mtk-wifi-mt76-connac-use-peer-address-for-station-BM.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0002-mtk-wifi-mt76-connac-use-peer-address-for-station-BM.patch
deleted file mode 100644
index 4067faf..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0002-mtk-wifi-mt76-connac-use-peer-address-for-station-BM.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From b4eb6156a2693382e93c5a2d5d3c564c0a2bb198 Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Thu, 24 Aug 2023 18:38:11 +0800
-Subject: [PATCH 02/17] mtk: wifi: mt76: connac: use peer address for station
- BMC entry
-
-Set peer address and aid for the BMC wtbl of station interface. For some
-functions such as parsing MU_EDCA parameters from beacon, firmware will
-need peer address to do the correct mapping.
-
-Reported-by: Howard Hsu <howard-yh.hsu@mediatek.com>
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
----
- mt76_connac_mcu.c | 9 ++++++++-
- mt7996/main.c     | 3 +++
- 2 files changed, 11 insertions(+), 1 deletion(-)
-
-diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
-index 368c5f46..fec158ec 100644
---- a/mt76_connac_mcu.c
-+++ b/mt76_connac_mcu.c
-@@ -392,7 +392,14 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
- 
- 	if (!sta) {
- 		basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
--		eth_broadcast_addr(basic->peer_addr);
-+
-+		if (vif->type == NL80211_IFTYPE_STATION &&
-+		    !is_zero_ether_addr(vif->bss_conf.bssid)) {
-+			memcpy(basic->peer_addr, vif->bss_conf.bssid, ETH_ALEN);
-+			basic->aid = cpu_to_le16(vif->cfg.aid);
-+		} else {
-+			eth_broadcast_addr(basic->peer_addr);
-+		}
- 		return;
- 	}
- 
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 2bf8e8a8..37e40f1d 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -598,6 +598,9 @@ static void mt7996_bss_info_changed(struct ieee80211_hw *hw,
- 	if ((changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid)) ||
- 	    (changed & BSS_CHANGED_ASSOC && vif->cfg.assoc) ||
- 	    (changed & BSS_CHANGED_BEACON_ENABLED && info->enable_beacon)) {
-+		/* reset bmc wtbl once BSSID changed */
-+		if (changed & BSS_CHANGED_BSSID)
-+			mt7996_mcu_add_sta(dev, vif, NULL, false);
- 		mt7996_mcu_add_bss_info(phy, vif, true);
- 		mt7996_mcu_add_sta(dev, vif, NULL, true);
- 	}
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0003-mtk-wifi-mt76-mt7996-disable-rx-header-translation-f.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0003-mtk-wifi-mt76-mt7996-disable-rx-header-translation-f.patch
deleted file mode 100644
index 520f6a9..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0003-mtk-wifi-mt76-mt7996-disable-rx-header-translation-f.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From ac159c7469469353fa25787ceb7f25c8e33c59fb Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Tue, 5 Sep 2023 17:31:49 +0800
-Subject: [PATCH 03/17] mtk: wifi: mt76: mt7996: disable rx header translation
- for BMC entry
-
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
----
- mt7996/mcu.c | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 1356ac14..7f412d6c 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1778,10 +1778,10 @@ mt7996_mcu_sta_hdr_trans_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
- 	else
- 		hdr_trans->from_ds = true;
- 
--	wcid = (struct mt76_wcid *)sta->drv_priv;
--	if (!wcid)
-+	if (!sta)
- 		return;
- 
-+	wcid = (struct mt76_wcid *)sta->drv_priv;
- 	hdr_trans->dis_rx_hdr_tran = !test_bit(MT_WCID_FLAG_HDR_TRANS, &wcid->flags);
- 	if (test_bit(MT_WCID_FLAG_4ADDR, &wcid->flags)) {
- 		hdr_trans->to_ds = true;
-@@ -2154,6 +2154,9 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 	if (!enable)
- 		goto out;
- 
-+	/* starec hdr trans */
-+	mt7996_mcu_sta_hdr_trans_tlv(dev, skb, vif, sta);
-+
- 	/* tag order is in accordance with firmware dependency. */
- 	if (sta) {
- 		/* starec hdrt mode */
-@@ -2178,8 +2181,6 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 		mt7996_mcu_sta_muru_tlv(dev, skb, vif, sta);
- 		/* starec bfee */
- 		mt7996_mcu_sta_bfee_tlv(dev, skb, vif, sta);
--		/* starec hdr trans */
--		mt7996_mcu_sta_hdr_trans_tlv(dev, skb, vif, sta);
- 	}
- 
- 	ret = mt7996_mcu_add_group(dev, vif, sta);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0004-mtk-wifi-mt76-mt7996-set-RCPI-value-in-rate-control-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0004-mtk-wifi-mt76-mt7996-set-RCPI-value-in-rate-control-.patch
deleted file mode 100644
index bcbf32a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0004-mtk-wifi-mt76-mt7996-set-RCPI-value-in-rate-control-.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 8f88d7ea931cb3fcc12f609598f8997e66051bff Mon Sep 17 00:00:00 2001
-From: Peter Chiu <chui-hao.chiu@mediatek.com>
-Date: Mon, 13 Nov 2023 20:15:39 +0800
-Subject: [PATCH 04/17] mtk: wifi: mt76: mt7996: set RCPI value in rate control
- command
-
-Set RCPI values in mt7996_mcu_sta_rate_ctrl_tlv(), which can make the
-FW rate control be initialized with a better MCS selection table.
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
----
- mt7996/mcu.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 7f412d6c..0f1905f2 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1968,6 +1968,7 @@ static void
- mt7996_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7996_dev *dev,
- 			     struct ieee80211_vif *vif, struct ieee80211_sta *sta)
- {
-+#define INIT_RCPI 180
- 	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
- 	struct mt76_phy *mphy = mvif->phy->mt76;
- 	struct cfg80211_chan_def *chandef = &mphy->chandef;
-@@ -2065,6 +2066,8 @@ mt7996_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7996_dev *dev,
- 					       IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
- 	}
- 	ra->sta_cap = cpu_to_le32(cap);
-+
-+	memset(ra->rx_rcpi, INIT_RCPI, sizeof(ra->rx_rcpi));
- }
- 
- int mt7996_mcu_add_rate_ctrl(struct mt7996_dev *dev, struct ieee80211_vif *vif,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0005-mtk-wifi-mt76-mt7996-enable-hw-cso-module.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0005-mtk-wifi-mt76-mt7996-enable-hw-cso-module.patch
deleted file mode 100644
index 2321fa4..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0005-mtk-wifi-mt76-mt7996-enable-hw-cso-module.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From 01b4af6ea238a69c90d136cdf4684869481d03b7 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Wed, 3 Jan 2024 15:21:44 +0800
-Subject: [PATCH 05/17] mtk: wifi: mt76: mt7996: enable hw cso module
-
-The cso module needs to be enabled. The cso mudule can help identify if the traffic
-is TCP traffic. This can assist the firmware in adjusting algorithms to
-improve overall performance.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt76_connac_mcu.h |  7 +++++++
- mt7996/mcu.c      | 15 +++++++++++++++
- 2 files changed, 22 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 2a4aa796..f1cd2e50 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -610,6 +610,12 @@ struct sta_rec_ra_fixed {
- 	u8 mmps_mode;
- } __packed;
- 
-+struct sta_rec_tx_proc {
-+	__le16 tag;
-+	__le16 len;
-+	__le32 flag;
-+} __packed;
-+
- /* wtbl_rec */
- 
- struct wtbl_req_hdr {
-@@ -777,6 +783,7 @@ struct wtbl_raw {
- 					 sizeof(struct sta_rec_ra_fixed) + \
- 					 sizeof(struct sta_rec_he_6g_capa) + \
- 					 sizeof(struct sta_rec_pn_info) + \
-+					 sizeof(struct sta_rec_tx_proc) + \
- 					 sizeof(struct tlv) +		\
- 					 MT76_CONNAC_WTBL_UPDATE_MAX_SIZE)
- 
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 0f1905f2..aa054167 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1748,6 +1748,19 @@ mt7996_mcu_sta_bfee_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
- 	bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);
- }
- 
-+static void
-+mt7996_mcu_sta_tx_proc_tlv(struct sk_buff *skb)
-+{
-+	struct sta_rec_tx_proc *tx_proc;
-+	struct tlv *tlv;
-+
-+	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_TX_PROC, sizeof(*tx_proc));
-+
-+	tx_proc = (struct sta_rec_tx_proc *)tlv;
-+	/* CSO is enabled if this flag exists. */
-+	tx_proc->flag = cpu_to_le32(0);
-+}
-+
- static void
- mt7996_mcu_sta_hdrt_tlv(struct mt7996_dev *dev, struct sk_buff *skb)
- {
-@@ -2159,6 +2172,8 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 
- 	/* starec hdr trans */
- 	mt7996_mcu_sta_hdr_trans_tlv(dev, skb, vif, sta);
-+	/* starec tx proc */
-+	mt7996_mcu_sta_tx_proc_tlv(skb);
- 
- 	/* tag order is in accordance with firmware dependency. */
- 	if (sta) {
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0006-mtk-wifi-mt76-mt7996-fix-non-main-BSS-no-beacon-issu.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0006-mtk-wifi-mt76-mt7996-fix-non-main-BSS-no-beacon-issu.patch
deleted file mode 100644
index 38cb111..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0006-mtk-wifi-mt76-mt7996-fix-non-main-BSS-no-beacon-issu.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 962986bbac91d5a97482f9ae74655ffca70763b1 Mon Sep 17 00:00:00 2001
-From: Henry Yen <henry.yen@mediatek.com>
-Date: Fri, 2 Feb 2024 16:42:24 +0800
-Subject: [PATCH 06/17] mtk: wifi: mt76: mt7996: fix non-main BSS no beacon
- issue for legacy MBSS scenario
-
-Fix non-main BSS no beacon issue for mt7992 legacy MBSS scenario.
-
-There are some design differences between mt7996 and mt7992 in terms of
-MBSS time offset. The original MBSS MCU CMD usage is not applicable to
-mt7992, so we modify the flow to avoid abnormal beaconing behavior
-in MBSS scenario.
-
-Signed-off-by: Henry.Yen <henry.yen@mediatek.com>
-
----
- mt7996/mcu.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index aa054167..6b8a5076 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -819,11 +819,14 @@ mt7996_mcu_bss_mbssid_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
- 	struct bss_info_uni_mbssid *mbssid;
- 	struct tlv *tlv;
- 
-+	if (!vif->bss_conf.bssid_indicator)
-+		return;
-+
- 	tlv = mt7996_mcu_add_uni_tlv(skb, UNI_BSS_INFO_11V_MBSSID, sizeof(*mbssid));
- 
- 	mbssid = (struct bss_info_uni_mbssid *)tlv;
- 
--	if (enable && vif->bss_conf.bssid_indicator) {
-+	if (enable) {
- 		mbssid->max_indicator = vif->bss_conf.bssid_indicator;
- 		mbssid->mbss_idx = vif->bss_conf.bssid_index;
- 		mbssid->tx_bss_omac_idx = 0;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0007-mtk-wifi-mt76-mt7996-initialize-variable-to-avoid-un.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0007-mtk-wifi-mt76-mt7996-initialize-variable-to-avoid-un.patch
deleted file mode 100644
index 33200ad..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0007-mtk-wifi-mt76-mt7996-initialize-variable-to-avoid-un.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 354503529d28d44fc94ea65815da5bf0cbdb79e7 Mon Sep 17 00:00:00 2001
-From: Henry Yen <henry.yen@mediatek.com>
-Date: Fri, 19 Jan 2024 11:11:19 +0800
-Subject: [PATCH 07/17] mtk: wifi: mt76: mt7996: initialize variable to avoid
- unexpected IRQ handling
-
-Initialize the variable to avoid processing unexpected interrupts given from wrong source.
-
-Signed-off-by: Henry.Yen <henry.yen@mediatek.com>
-
----
- mt7996/mmio.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index 341fa089..8fe56ed9 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -519,7 +519,7 @@ static void mt7996_irq_tasklet(struct tasklet_struct *t)
- 	struct mt7996_dev *dev = from_tasklet(dev, t, mt76.irq_tasklet);
- 	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
- 	struct mtk_wed_device *wed_hif2 = &dev->mt76.mmio.wed_hif2;
--	u32 i, intr, mask, intr1;
-+	u32 i, intr, mask, intr1 = 0;
- 
- 	if (dev->hif2 && mtk_wed_device_active(wed_hif2)) {
- 		mtk_wed_device_irq_set_mask(wed_hif2, 0);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-mtk-wifi-mt76-mt7996-enable-ser-query.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-mtk-wifi-mt76-mt7996-enable-ser-query.patch
deleted file mode 100644
index e35b141..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-mtk-wifi-mt76-mt7996-enable-ser-query.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From f664f6c14d38adc2bf43f4f969ea21eb3daa48a7 Mon Sep 17 00:00:00 2001
-From: Peter Chiu <chui-hao.chiu@mediatek.com>
-Date: Mon, 30 Oct 2023 20:19:41 +0800
-Subject: [PATCH 08/17] mtk: wifi: mt76: mt7996: enable ser query
-
-Do not return -EINVAL when action is UNI_CMD_SER_QUERY for user
-to dump SER information from FW.
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
----
- mt7996/mcu.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 6b8a5076..0981f592 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3860,6 +3860,8 @@ int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 val, u8 band)
- 	};
- 
- 	switch (action) {
-+	case UNI_CMD_SER_QUERY:
-+		break;
- 	case UNI_CMD_SER_SET:
- 		req.set.mask = cpu_to_le32(val);
- 		break;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0009-mtk-wifi-mt76-mt7996-Fix-TGax-HE-4.51.1_24G-fail.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0009-mtk-wifi-mt76-mt7996-Fix-TGax-HE-4.51.1_24G-fail.patch
deleted file mode 100644
index 2cf4eec..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0009-mtk-wifi-mt76-mt7996-Fix-TGax-HE-4.51.1_24G-fail.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 8e5ba5be6820fa12541785907085f312f13e3e04 Mon Sep 17 00:00:00 2001
-From: mtk27745 <rex.lu@mediatek.com>
-Date: Fri, 17 Nov 2023 11:01:04 +0800
-Subject: [PATCH 09/17] mtk: wifi: mt76: mt7996: Fix TGax HE-4.51.1_24G fail
-
-According to sta capability to decide to enable/disable wed pao when create ppe entry.
-without this patch, TGax HE-4.51.1_24G will test fail
-
-Signed-off-by: mtk27745 <rex.lu@mediatek.com>
----
- mt7996/main.c | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 37e40f1d..625f87b4 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -1447,7 +1447,12 @@ mt7996_net_fill_forward_path(struct ieee80211_hw *hw,
- 	path->mtk_wdma.queue = 0;
- 	path->mtk_wdma.wcid = msta->wcid.idx;
- 
--	path->mtk_wdma.amsdu = mtk_wed_is_amsdu_supported(wed);
-+	if (ieee80211_hw_check(hw, SUPPORTS_AMSDU_IN_AMPDU) &&
-+	    mtk_wed_is_amsdu_supported(wed))
-+		path->mtk_wdma.amsdu = msta->wcid.amsdu;
-+	else
-+		path->mtk_wdma.amsdu = 0;
-+
- 	ctx->dev = NULL;
- 
- 	return 0;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0010-mtk-wifi-mt76-mt7996-add-eagle-default-bin-of-differ.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0010-mtk-wifi-mt76-mt7996-add-eagle-default-bin-of-differ.patch
deleted file mode 100644
index 9c922d6..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0010-mtk-wifi-mt76-mt7996-add-eagle-default-bin-of-differ.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From 22607765799dad52bcf304ffd5f393878c4317bf Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Thu, 20 Jul 2023 17:27:22 +0800
-Subject: [PATCH 10/17] mtk: wifi: mt76: mt7996: add eagle default bin of
- different sku variants
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/eeprom.c |  2 ++
- mt7996/init.c   |  4 ++++
- mt7996/mt7996.h | 28 ++++++++++++++++++++++++++--
- 3 files changed, 32 insertions(+), 2 deletions(-)
-
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 4a823711..7505a8b7 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -26,6 +26,8 @@ static char *mt7996_eeprom_name(struct mt7996_dev *dev)
- {
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
-+		if (dev->chip_sku == MT7996_SKU_404)
-+			return MT7996_EEPROM_DEFAULT_404;
- 		return MT7996_EEPROM_DEFAULT;
- 	case 0x7992:
- 		return MT7992_EEPROM_DEFAULT;
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 9aa97e4a..274863dc 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -897,6 +897,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
- 	INIT_LIST_HEAD(&dev->wed_rro.poll_list);
- 	spin_lock_init(&dev->wed_rro.lock);
- 
-+	ret = mt7996_get_chip_sku(dev);
-+	if (ret)
-+		return ret;
-+
- 	ret = mt7996_dma_init(dev);
- 	if (ret)
- 		return ret;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 36d1f247..b6df2167 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -40,6 +40,7 @@
- #define MT7992_ROM_PATCH		"mediatek/mt7996/mt7992_rom_patch.bin"
- 
- #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
-+#define MT7996_EEPROM_DEFAULT_404	"mediatek/mt7996/mt7996_eeprom_dual_404.bin"
- #define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom.bin"
- #define MT7996_EEPROM_SIZE		7680
- #define MT7996_EEPROM_BLOCK_SIZE	16
-@@ -88,6 +89,11 @@ struct mt7996_sta;
- struct mt7996_dfs_pulse;
- struct mt7996_dfs_pattern;
- 
-+enum mt7996_sku_type {
-+	MT7996_SKU_404,
-+	MT7996_SKU_444,
-+};
-+
- enum mt7996_ram_type {
- 	MT7996_RAM_TYPE_WM,
- 	MT7996_RAM_TYPE_WA,
-@@ -257,6 +263,8 @@ struct mt7996_dev {
- 	struct cfg80211_chan_def rdd2_chandef;
- 	struct mt7996_phy *rdd2_phy;
- 
-+	u8 chip_sku;
-+
- 	u16 chainmask;
- 	u8 chainshift[__MT_MAX_BAND];
- 	u32 hif_idx;
-@@ -398,6 +406,23 @@ mt7996_phy3(struct mt7996_dev *dev)
- 	return __mt7996_phy(dev, MT_BAND2);
- }
- 
-+static inline int
-+mt7996_get_chip_sku(struct mt7996_dev *dev)
-+{
-+	u32 val = mt76_rr(dev, MT_PAD_GPIO);
-+
-+	/* reserve for future variants */
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		dev->chip_sku = FIELD_GET(MT_PAD_GPIO_ADIE_COMB, val) <= 1;
-+		break;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	return 0;
-+}
-+
- static inline bool
- mt7996_band_valid(struct mt7996_dev *dev, u8 band)
- {
-@@ -405,8 +430,7 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
- 		return band <= MT_BAND1;
- 
- 	/* tri-band support */
--	if (band <= MT_BAND2 &&
--	    mt76_get_field(dev, MT_PAD_GPIO, MT_PAD_GPIO_ADIE_COMB) <= 1)
-+	if (band <= MT_BAND2 && dev->chip_sku)
- 		return true;
- 
- 	return band == MT_BAND0 || band == MT_BAND2;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0011-mtk-wifi-mt76-mt7996-add-kite-fw-default-bin-for-dif.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0011-mtk-wifi-mt76-mt7996-add-kite-fw-default-bin-for-dif.patch
deleted file mode 100644
index dd04ff3..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0011-mtk-wifi-mt76-mt7996-add-kite-fw-default-bin-for-dif.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-From fcf4d59b7cbd6c298ca90b0eae6aec63544b14d9 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 21 Jul 2023 10:41:28 +0800
-Subject: [PATCH 11/17] mtk: wifi: mt76: mt7996: add kite fw & default bin for
- different sku variants
-
-Add fem type (2i5i, 2i5e, 2e5e, ...)
-Add Kite default bin for each fem type since loading wrong default bin
-will fail to setup interface
-Add eeprom fem type check
-
-Add adie 7976c efuse check
-Efuse offset 0x470 will be set to 0xc after final test if 7976c adie is used
-Chip manufactoring factories may transfer, which leads to different adie chip versions,
-so we add this efuse check to avoid 7976c recognition failure.
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-GPIO ADie Combination of BE5040 should be considered as don't care
-instead of 0
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Only check eeprom chip id when fem type (= MT7996_FEM_UNSET) is not determined yet
-Without this fix, mt7996_check_eeprom will return EINVAL in mt7996_eeprom_check_fw_mode
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/eeprom.c | 38 +++++++++++++++++++++++++++++--
- mt7996/eeprom.h |  1 +
- mt7996/init.c   | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mcu.c    |  7 +++++-
- mt7996/mt7996.h | 49 +++++++++++++++++++++++++---------------
- mt7996/regs.h   |  7 ++++++
- 6 files changed, 140 insertions(+), 21 deletions(-)
-
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 7505a8b7..3260d1fe 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -9,14 +9,33 @@
- 
- static int mt7996_check_eeprom(struct mt7996_dev *dev)
- {
-+#define FEM_INT				0
-+#define FEM_EXT				3
- 	u8 *eeprom = dev->mt76.eeprom.data;
-+	u8 i, fem[__MT_MAX_BAND], fem_type;
- 	u16 val = get_unaligned_le16(eeprom);
- 
-+	for (i = 0; i < __MT_MAX_BAND; i++)
-+		fem[i] = eeprom[MT_EE_WIFI_CONF + 6 + i] & MT_EE_WIFI_PA_LNA_CONFIG;
-+
- 	switch (val) {
- 	case 0x7990:
- 		return is_mt7996(&dev->mt76) ? 0 : -EINVAL;
- 	case 0x7992:
--		return is_mt7992(&dev->mt76) ? 0 : -EINVAL;
-+		if (dev->fem_type == MT7996_FEM_UNSET)
-+			return is_mt7992(&dev->mt76) ? 0 : -EINVAL;
-+
-+		if (fem[0] == FEM_EXT && fem[1] == FEM_EXT)
-+			fem_type = MT7996_FEM_EXT;
-+		else if (fem[0] == FEM_INT && fem[1] == FEM_INT)
-+			fem_type = MT7996_FEM_INT;
-+		else if (fem[0] == FEM_INT && fem[1] == FEM_EXT)
-+			fem_type = MT7996_FEM_MIX;
-+		else
-+			return -EINVAL;
-+
-+		return (is_mt7992(&dev->mt76) ? 0 : -EINVAL) |
-+		       (dev->fem_type == fem_type ? 0 : -EINVAL);
- 	default:
- 		return -EINVAL;
- 	}
-@@ -30,7 +49,18 @@ static char *mt7996_eeprom_name(struct mt7996_dev *dev)
- 			return MT7996_EEPROM_DEFAULT_404;
- 		return MT7996_EEPROM_DEFAULT;
- 	case 0x7992:
--		return MT7992_EEPROM_DEFAULT;
-+		if (dev->chip_sku == MT7992_SKU_23) {
-+			if (dev->fem_type == MT7996_FEM_INT)
-+				return MT7992_EEPROM_DEFAULT_23;
-+			return MT7992_EEPROM_DEFAULT_23_EXT;
-+		} else if (dev->chip_sku == MT7992_SKU_44) {
-+			if (dev->fem_type == MT7996_FEM_INT)
-+				return MT7992_EEPROM_DEFAULT;
-+			else if (dev->fem_type == MT7996_FEM_MIX)
-+				return MT7992_EEPROM_DEFAULT_MIX;
-+			return MT7992_EEPROM_DEFAULT_EXT;
-+		}
-+		return MT7992_EEPROM_DEFAULT_24;
- 	default:
- 		return MT7996_EEPROM_DEFAULT;
- 	}
-@@ -221,6 +251,10 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
- {
- 	int ret;
- 
-+	ret = mt7996_get_chip_sku(dev);
-+	if (ret)
-+		return ret;
-+
- 	ret = mt7996_eeprom_load(dev);
- 	if (ret < 0) {
- 		if (ret != -EINVAL)
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 412d6e2f..72c38ad3 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -29,6 +29,7 @@ enum mt7996_eeprom_field {
- #define MT_EE_WIFI_CONF0_BAND_SEL		GENMASK(2, 0)
- #define MT_EE_WIFI_CONF1_BAND_SEL		GENMASK(5, 3)
- #define MT_EE_WIFI_CONF2_BAND_SEL		GENMASK(2, 0)
-+#define MT_EE_WIFI_PA_LNA_CONFIG		GENMASK(1, 0)
- 
- #define MT_EE_WIFI_CONF1_TX_PATH_BAND0		GENMASK(5, 3)
- #define MT_EE_WIFI_CONF2_TX_PATH_BAND1		GENMASK(2, 0)
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 274863dc..0e3cdc05 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -882,6 +882,65 @@ out:
- #endif
- }
- 
-+int mt7996_get_chip_sku(struct mt7996_dev *dev)
-+{
-+#define MT7976C_CHIP_VER	0x8a10
-+#define MT7976C_HL_CHIP_VER	0x8b00
-+#define MT7976C_PS_CHIP_VER	0x8c10
-+#define MT7976C_EFUSE_OFFSET	0x470
-+#define MT7976C_EFUSE_VALUE	0xc
-+	u32 regval, val = mt76_rr(dev, MT_PAD_GPIO);
-+	u16 adie_chip_id, adie_chip_ver;
-+	u8 adie_comb, adie_num, adie_idx = 0;
-+
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		adie_comb = FIELD_GET(MT_PAD_GPIO_ADIE_COMB, val);
-+		if (adie_comb <= 1)
-+			dev->chip_sku = MT7996_SKU_444;
-+		else
-+			dev->chip_sku = MT7996_SKU_404;
-+		break;
-+	case 0x7992:
-+		adie_comb = FIELD_GET(MT_PAD_GPIO_ADIE_COMB_7992, val);
-+		adie_num = FIELD_GET(MT_PAD_GPIO_ADIE_NUM_7992, val);
-+		adie_idx = !adie_num;
-+		if (adie_num)
-+			dev->chip_sku = MT7992_SKU_23;
-+		else if (adie_comb)
-+			dev->chip_sku = MT7992_SKU_44;
-+		else
-+			dev->chip_sku = MT7992_SKU_24;
-+		break;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state)) {
-+		u8 buf[MT7996_EEPROM_BLOCK_SIZE];
-+		u8 idx = MT7976C_EFUSE_OFFSET % MT7996_EEPROM_BLOCK_SIZE;
-+		bool is_7976c;
-+
-+		mt7996_mcu_rf_regval(dev, MT_ADIE_CHIP_ID(adie_idx), &regval, false);
-+		adie_chip_id = FIELD_GET(MT_ADIE_CHIP_ID_MASK, regval);
-+		adie_chip_ver = FIELD_GET(MT_ADIE_VERSION_MASK, regval);
-+		mt7996_mcu_get_eeprom(dev, MT7976C_EFUSE_OFFSET, buf);
-+		is_7976c = (adie_chip_ver == MT7976C_CHIP_VER) ||
-+			   (adie_chip_ver == MT7976C_HL_CHIP_VER) ||
-+			   (adie_chip_ver == MT7976C_PS_CHIP_VER) ||
-+			   (buf[idx] == MT7976C_EFUSE_VALUE);
-+		if (adie_chip_id == 0x7975 || (adie_chip_id == 0x7976 && is_7976c) ||
-+		    adie_chip_id == 0x7979)
-+			dev->fem_type = MT7996_FEM_INT;
-+		else if (adie_chip_id == 0x7977 && adie_comb == 1)
-+			dev->fem_type = MT7996_FEM_MIX;
-+		else
-+			dev->fem_type = MT7996_FEM_EXT;
-+	}
-+
-+	return 0;
-+}
-+
- static int mt7996_init_hardware(struct mt7996_dev *dev)
- {
- 	int ret, idx;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 0981f592..5aefecb0 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -14,7 +14,12 @@
- 	char *_fw;						\
- 	switch (mt76_chip(&(_dev)->mt76)) {			\
- 	case 0x7992:						\
--		_fw = MT7992_##name;				\
-+		if ((_dev)->chip_sku == MT7992_SKU_23)		\
-+			_fw = MT7992_##name##_23;		\
-+		else if ((_dev)->chip_sku == MT7992_SKU_24)	\
-+			_fw = MT7992_##name##_24;		\
-+		else						\
-+			_fw = MT7992_##name;			\
- 		break;						\
- 	case 0x7990:						\
- 	default:						\
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b6df2167..7e5ec212 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -39,9 +39,24 @@
- #define MT7992_FIRMWARE_DSP		"mediatek/mt7996/mt7992_dsp.bin"
- #define MT7992_ROM_PATCH		"mediatek/mt7996/mt7992_rom_patch.bin"
- 
-+#define MT7992_FIRMWARE_WA_24		"mediatek/mt7996/mt7992_wa_24.bin"
-+#define MT7992_FIRMWARE_WM_24		"mediatek/mt7996/mt7992_wm_24.bin"
-+#define MT7992_FIRMWARE_DSP_24		"mediatek/mt7996/mt7992_dsp_24.bin"
-+#define MT7992_ROM_PATCH_24		"mediatek/mt7996/mt7992_rom_patch_24.bin"
-+
-+#define MT7992_FIRMWARE_WA_23		"mediatek/mt7996/mt7992_wa_23.bin"
-+#define MT7992_FIRMWARE_WM_23		"mediatek/mt7996/mt7992_wm_23.bin"
-+#define MT7992_FIRMWARE_DSP_23		"mediatek/mt7996/mt7992_dsp_23.bin"
-+#define MT7992_ROM_PATCH_23		"mediatek/mt7996/mt7992_rom_patch_23.bin"
-+
- #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
- #define MT7996_EEPROM_DEFAULT_404	"mediatek/mt7996/mt7996_eeprom_dual_404.bin"
--#define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom.bin"
-+#define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom_2i5i.bin"
-+#define MT7992_EEPROM_DEFAULT_EXT	"mediatek/mt7996/mt7992_eeprom_2e5e.bin"
-+#define MT7992_EEPROM_DEFAULT_MIX	"mediatek/mt7996/mt7992_eeprom_2i5e.bin"
-+#define MT7992_EEPROM_DEFAULT_24	"mediatek/mt7996/mt7992_eeprom_24_2i5i.bin"
-+#define MT7992_EEPROM_DEFAULT_23	"mediatek/mt7996/mt7992_eeprom_23_2i5i.bin"
-+#define MT7992_EEPROM_DEFAULT_23_EXT	"mediatek/mt7996/mt7992_eeprom_23_2e5e.bin"
- #define MT7996_EEPROM_SIZE		7680
- #define MT7996_EEPROM_BLOCK_SIZE	16
- #define MT7996_TOKEN_SIZE		16384
-@@ -89,11 +104,24 @@ struct mt7996_sta;
- struct mt7996_dfs_pulse;
- struct mt7996_dfs_pattern;
- 
-+enum mt7996_fem_type {
-+	MT7996_FEM_UNSET,
-+	MT7996_FEM_EXT,
-+	MT7996_FEM_INT,
-+	MT7996_FEM_MIX,
-+};
-+
- enum mt7996_sku_type {
- 	MT7996_SKU_404,
- 	MT7996_SKU_444,
- };
- 
-+enum mt7992_sku_type {
-+	MT7992_SKU_23,
-+	MT7992_SKU_24,
-+	MT7992_SKU_44,
-+};
-+
- enum mt7996_ram_type {
- 	MT7996_RAM_TYPE_WM,
- 	MT7996_RAM_TYPE_WA,
-@@ -264,6 +292,7 @@ struct mt7996_dev {
- 	struct mt7996_phy *rdd2_phy;
- 
- 	u8 chip_sku;
-+	u8 fem_type;
- 
- 	u16 chainmask;
- 	u8 chainshift[__MT_MAX_BAND];
-@@ -406,23 +435,6 @@ mt7996_phy3(struct mt7996_dev *dev)
- 	return __mt7996_phy(dev, MT_BAND2);
- }
- 
--static inline int
--mt7996_get_chip_sku(struct mt7996_dev *dev)
--{
--	u32 val = mt76_rr(dev, MT_PAD_GPIO);
--
--	/* reserve for future variants */
--	switch (mt76_chip(&dev->mt76)) {
--	case 0x7990:
--		dev->chip_sku = FIELD_GET(MT_PAD_GPIO_ADIE_COMB, val) <= 1;
--		break;
--	default:
--		return -EINVAL;
--	}
--
--	return 0;
--}
--
- static inline bool
- mt7996_band_valid(struct mt7996_dev *dev, u8 band)
- {
-@@ -461,6 +473,7 @@ int mt7996_init_tx_queues(struct mt7996_phy *phy, int idx,
- 			  int n_desc, int ring_base, struct mtk_wed_device *wed);
- void mt7996_init_txpower(struct mt7996_phy *phy);
- int mt7996_txbf_init(struct mt7996_dev *dev);
-+int mt7996_get_chip_sku(struct mt7996_dev *dev);
- void mt7996_reset(struct mt7996_dev *dev);
- int mt7996_run(struct ieee80211_hw *hw);
- int mt7996_mcu_init(struct mt7996_dev *dev);
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 47b429d8..cf12c5e0 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -662,6 +662,13 @@ enum offs_rev {
- 
- #define MT_PAD_GPIO				0x700056f0
- #define MT_PAD_GPIO_ADIE_COMB			GENMASK(16, 15)
-+#define MT_PAD_GPIO_ADIE_COMB_7992		GENMASK(17, 16)
-+#define MT_PAD_GPIO_ADIE_NUM_7992		BIT(15)
-+
-+/* ADIE */
-+#define MT_ADIE_CHIP_ID(_idx)                  (0x0f00002c + ((_idx) << 28))
-+#define MT_ADIE_VERSION_MASK                   GENMASK(15, 0)
-+#define MT_ADIE_CHIP_ID_MASK                   GENMASK(31, 16)
- 
- #define MT_HW_REV				0x70010204
- #define MT_HW_REV1				0x8a00
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0012-mtk-wifi-mt76-mt7996-ACS-channel-time-too-long-on-du.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0012-mtk-wifi-mt76-mt7996-ACS-channel-time-too-long-on-du.patch
deleted file mode 100644
index 0959871..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0012-mtk-wifi-mt76-mt7996-ACS-channel-time-too-long-on-du.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 35f210176257373e9b71821ca3246b10f1bb1b2a Mon Sep 17 00:00:00 2001
-From: "fancy.liu" <fancy.liu@mediatek.com>
-Date: Tue, 14 Nov 2023 10:13:24 +0800
-Subject: [PATCH 12/17] mtk: wifi: mt76: mt7996: ACS channel time too long on
- duty channel
-
-Step and issue:
-1. Set channel to 36 in hostapd config;
-2. Bootup;
-3. Enable ACS through UCI command and reload;
-4. Check hostapd log, channel 36 channel_time is much longer than other channels.
-
-Root cause:
-The reset chan_stat condition missed duty channel.
-
-Solution:
-When scan start, need to reset chan_stat in each channel switch.
-
-Signed-off-by: fancy.liu <fancy.liu@mediatek.com>
-
-Issue:
-There's a chance that the channel time for duty channel is zero in ACS
-scan.
-
-Root cause:
-The chan_stat may be reset when restore to duty channel.
-Mac80211 will notify to hostapd when scan done and then restore to duty
-channel.
-And mt76 will clear scan flag after restore done.
-If hostapd get the chan_stat before channel_restore, will get the
-correct channel time;
-If hostapd get the chan_stat after channel_restore, will get zero
-channel time;
-
-Solution:
-When channel switch, will check the mac80211 scan state but not the mt76 scan flag.
-Mac80211 scan state will be set in scanning, and will be reset after
-scan done and before restore to duty channel.
-
-Signed-off-by: fancy.liu <fancy.liu@mediatek.com>
----
- mac80211.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/mac80211.c b/mac80211.c
-index b603d40c..6e8ac6f4 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -928,6 +928,7 @@ void mt76_set_channel(struct mt76_phy *phy)
- 	struct cfg80211_chan_def *chandef = &hw->conf.chandef;
- 	bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
- 	int timeout = HZ / 5;
-+	unsigned long was_scanning = ieee80211_get_scanning(hw);
- 
- 	wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout);
- 	mt76_update_survey(phy);
-@@ -942,7 +943,7 @@ void mt76_set_channel(struct mt76_phy *phy)
- 	if (!offchannel)
- 		phy->main_chan = chandef->chan;
- 
--	if (chandef->chan != phy->main_chan)
-+	if (chandef->chan != phy->main_chan || was_scanning)
- 		memset(phy->chan_state, 0, sizeof(*phy->chan_state));
- }
- EXPORT_SYMBOL_GPL(mt76_set_channel);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0013-mtk-wifi-mt76-mt7996-Fixed-null-pointer-dereference-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0013-mtk-wifi-mt76-mt7996-Fixed-null-pointer-dereference-.patch
deleted file mode 100644
index 25d942c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0013-mtk-wifi-mt76-mt7996-Fixed-null-pointer-dereference-.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From cd699c6764e92f89aef0c75fa0c5a5c69402bcf6 Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Thu, 26 Oct 2023 10:08:10 +0800
-Subject: [PATCH 13/17] mtk: wifi: mt76: mt7996: Fixed null pointer dereference
- issue
-
-Without this patch, when the station is still in Authentication stage and
-sends a "Notify bandwidth change action frame" to AP at the same time,
-there will be a race condition that causes a crash to occur because the AP
-access "msta->vif" that has not been fully initialized.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
-Signed-off-by: Money Wang <money.wang@mediatek.com>
-Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
----
- mt7996/main.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 625f87b4..ad2c6a9d 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -1063,9 +1063,16 @@ static void mt7996_sta_rc_update(struct ieee80211_hw *hw,
- 				 struct ieee80211_sta *sta,
- 				 u32 changed)
- {
-+	struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
- 	struct mt7996_phy *phy = mt7996_hw_phy(hw);
- 	struct mt7996_dev *dev = phy->dev;
- 
-+	if (!msta->vif) {
-+		dev_warn(dev->mt76.dev, "Un-initialized STA %pM wcid %d in rc_work\n",
-+			 sta->addr, msta->wcid.idx);
-+		return;
-+	}
-+
- 	mt7996_sta_rc_work(&changed, sta);
- 	ieee80211_queue_work(hw, &dev->rc_work);
- }
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0014-mtk-wifi-mt76-add-sanity-check-to-prevent-kernel-cra.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0014-mtk-wifi-mt76-add-sanity-check-to-prevent-kernel-cra.patch
deleted file mode 100644
index 8839a71..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0014-mtk-wifi-mt76-add-sanity-check-to-prevent-kernel-cra.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 5cb8c91ff8f579d192f93e258314199fc33355c8 Mon Sep 17 00:00:00 2001
-From: Peter Chiu <chui-hao.chiu@mediatek.com>
-Date: Mon, 30 Oct 2023 11:06:19 +0800
-Subject: [PATCH 14/17] mtk: wifi: mt76: add sanity check to prevent kernel
- crash
-
-wcid may not be initialized when mac80211 calls mt76.tx and it would lead to
-kernel crash.
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
----
- tx.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/tx.c b/tx.c
-index 5cf6edee..ab42f69b 100644
---- a/tx.c
-+++ b/tx.c
-@@ -345,6 +345,14 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
- 
- 	info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
- 
-+	if (!wcid->tx_pending.prev || !wcid->tx_pending.next) {
-+		dev_warn(phy->dev->dev, "Un-initialized STA %pM wcid %d in mt76_tx\n",
-+			 sta->addr, wcid->idx);
-+
-+		ieee80211_free_txskb(phy->hw, skb);
-+		return;
-+	}
-+
- 	spin_lock_bh(&wcid->tx_pending.lock);
- 	__skb_queue_tail(&wcid->tx_pending, skb);
- 	spin_unlock_bh(&wcid->tx_pending.lock);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0015-mtk-wifi-mt76-mt7996-add-firmware-WA-s-coredump.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0015-mtk-wifi-mt76-mt7996-add-firmware-WA-s-coredump.patch
deleted file mode 100644
index 66ee8cf..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0015-mtk-wifi-mt76-mt7996-add-firmware-WA-s-coredump.patch
+++ /dev/null
@@ -1,597 +0,0 @@
-From 5a195822d50b588206b18344df61b36bc7e26e6e Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Fri, 19 May 2023 14:16:50 +0800
-Subject: [PATCH 15/17] mtk: wifi: mt76: mt7996: add firmware WA's coredump.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- mt7996/coredump.c | 180 ++++++++++++++++++++++++++++++----------------
- mt7996/coredump.h |  35 ++++++---
- mt7996/mac.c      |  31 +++++---
- mt7996/mcu.c      |   5 ++
- mt7996/mt7996.h   |   7 +-
- mt7996/regs.h     |   7 +-
- 6 files changed, 182 insertions(+), 83 deletions(-)
-
-diff --git a/mt7996/coredump.c b/mt7996/coredump.c
-index ccab0d7b..60b88085 100644
---- a/mt7996/coredump.c
-+++ b/mt7996/coredump.c
-@@ -7,11 +7,11 @@
- #include <linux/utsname.h>
- #include "coredump.h"
- 
--static bool coredump_memdump;
-+static bool coredump_memdump = true;
- module_param(coredump_memdump, bool, 0644);
- MODULE_PARM_DESC(coredump_memdump, "Optional ability to dump firmware memory");
- 
--static const struct mt7996_mem_region mt7996_mem_regions[] = {
-+static const struct mt7996_mem_region mt7996_wm_mem_regions[] = {
- 	{
- 		.start = 0x00800000,
- 		.len = 0x0004ffff,
-@@ -44,27 +44,55 @@ static const struct mt7996_mem_region mt7996_mem_regions[] = {
- 	},
- };
- 
-+static const struct mt7996_mem_region mt7996_wa_mem_regions[] = {
-+	{
-+		.start = 0xE0000000,
-+		.len = 0x0000ffff,
-+		.name = "CRAM",
-+	},
-+	{
-+		.start = 0xE0010000,
-+		.len = 0x000117ff,
-+		.name = "CRAM2",
-+	},
-+	{
-+		.start = 0x10000000,
-+		.len = 0x0001bfff,
-+		.name = "ILM",
-+	},
-+	{
-+		.start = 0x10200000,
-+		.len = 0x00063fff,
-+		.name = "DLM",
-+	},
-+};
-+
- const struct mt7996_mem_region*
--mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)
-+mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
- {
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
- 	case 0x7991:
--		*num = ARRAY_SIZE(mt7996_mem_regions);
--		return &mt7996_mem_regions[0];
-+		if (type == MT7996_RAM_TYPE_WA) {
-+			*num = ARRAY_SIZE(mt7996_wa_mem_regions);
-+			return &mt7996_wa_mem_regions[0];
-+		}
-+
-+		*num = ARRAY_SIZE(mt7996_wm_mem_regions);
-+		return &mt7996_wm_mem_regions[0];
- 	default:
- 		return NULL;
- 	}
- }
- 
--static int mt7996_coredump_get_mem_size(struct mt7996_dev *dev)
-+static int mt7996_coredump_get_mem_size(struct mt7996_dev *dev, u8 type)
- {
- 	const struct mt7996_mem_region *mem_region;
- 	size_t size = 0;
- 	u32 num;
- 	int i;
- 
--	mem_region = mt7996_coredump_get_mem_layout(dev, &num);
-+	mem_region = mt7996_coredump_get_mem_layout(dev, type, &num);
- 	if (!mem_region)
- 		return 0;
- 
-@@ -81,14 +109,13 @@ static int mt7996_coredump_get_mem_size(struct mt7996_dev *dev)
- 	return size;
- }
- 
--struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)
-+struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type)
- {
--	struct mt7996_crash_data *crash_data = dev->coredump.crash_data;
-+	struct mt7996_crash_data *crash_data = dev->coredump.crash_data[type];
- 
- 	lockdep_assert_held(&dev->dump_mutex);
- 
--	if (coredump_memdump &&
--	    !mt76_poll_msec(dev, MT_FW_DUMP_STATE, 0x3, 0x2, 500))
-+	if (!coredump_memdump)
- 		return NULL;
- 
- 	guid_gen(&crash_data->guid);
-@@ -98,12 +125,15 @@ struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)
- }
- 
- static void
--mt7996_coredump_fw_state(struct mt7996_dev *dev, struct mt7996_coredump *dump,
-+mt7996_coredump_fw_state(struct mt7996_dev *dev, u8 type, struct mt7996_coredump *dump,
- 			 bool *exception)
- {
--	u32 count;
-+	u32 count, reg = MT_FW_WM_DUMP_STATE;
-+
-+	if (type == MT7996_RAM_TYPE_WA)
-+		reg = MT_FW_WA_DUMP_STATE;
- 
--	count = mt76_rr(dev, MT_FW_ASSERT_CNT);
-+	count = mt76_rr(dev, reg);
- 
- 	/* normal mode: driver can manually trigger assert for detail info */
- 	if (!count)
-@@ -115,53 +145,59 @@ mt7996_coredump_fw_state(struct mt7996_dev *dev, struct mt7996_coredump *dump,
- }
- 
- static void
--mt7996_coredump_fw_stack(struct mt7996_dev *dev, struct mt7996_coredump *dump,
-+mt7996_coredump_fw_stack(struct mt7996_dev *dev, u8 type, struct mt7996_coredump *dump,
- 			 bool exception)
- {
--	u32 oldest, i, idx;
-+	u32 reg, i, offset = 0, val = MT7996_RAM_TYPE_WM;
- 
--	strscpy(dump->pc_current, "program counter", sizeof(dump->pc_current));
-+	if (type == MT7996_RAM_TYPE_WA) {
-+		offset = MT_MCU_WA_EXCP_BASE - MT_MCU_WM_EXCP_BASE;
-+		val = MT7996_RAM_TYPE_WA;
-+	}
- 
--	/* 0: WM PC log output */
--	mt76_wr(dev, MT_CONN_DBG_CTL_OUT_SEL, 0);
-+	/* 0: WM PC log output, 1: WA PC log output  */
-+	mt76_wr(dev, MT_CONN_DBG_CTL_OUT_SEL, val);
- 	/* choose 33th PC log buffer to read current PC index */
- 	mt76_wr(dev, MT_CONN_DBG_CTL_PC_LOG_SEL, 0x3f);
- 
- 	/* read current PC */
--	dump->pc_stack[0] = mt76_rr(dev, MT_CONN_DBG_CTL_PC_LOG);
-+	for (i = 0; i < 10; i++)
-+		dump->pc_cur[i] = mt76_rr(dev, MT_CONN_DBG_CTL_PC_LOG);
- 
- 	/* stop call stack record */
- 	if (!exception) {
--		mt76_clear(dev, MT_MCU_WM_EXCP_PC_CTRL, BIT(0));
--		mt76_clear(dev, MT_MCU_WM_EXCP_LR_CTRL, BIT(0));
-+		mt76_clear(dev, MT_MCU_WM_EXCP_PC_CTRL + offset, BIT(0));
-+		mt76_clear(dev, MT_MCU_WM_EXCP_LR_CTRL + offset, BIT(0));
- 	}
- 
--	oldest = (u32)mt76_get_field(dev, MT_MCU_WM_EXCP_PC_CTRL,
--				     GENMASK(20, 16)) + 2;
--	for (i = 0; i < 16; i++) {
--		idx = ((oldest + 2 * i + 1) % 32);
--		dump->pc_stack[i + 1] =
--			mt76_rr(dev, MT_MCU_WM_EXCP_PC_LOG + idx * 4);
-+	/* read PC log */
-+	dump->pc_dbg_ctrl = mt76_rr(dev, MT_MCU_WM_EXCP_PC_CTRL + offset);
-+	dump->pc_cur_idx = FIELD_GET(MT_MCU_WM_EXCP_PC_CTRL_IDX_STATUS,
-+				     dump->pc_dbg_ctrl);
-+	for (i = 0; i < 32; i++) {
-+		reg = MT_MCU_WM_EXCP_PC_LOG + i * 4 + offset;
-+		dump->pc_stack[i] = mt76_rr(dev, reg);
- 	}
- 
--	oldest = (u32)mt76_get_field(dev, MT_MCU_WM_EXCP_LR_CTRL,
--				     GENMASK(20, 16)) + 2;
--	for (i = 0; i < 16; i++) {
--		idx = ((oldest + 2 * i + 1) % 32);
--		dump->lr_stack[i] =
--			mt76_rr(dev, MT_MCU_WM_EXCP_LR_LOG + idx * 4);
-+	/* read LR log */
-+	dump->lr_dbg_ctrl = mt76_rr(dev, MT_MCU_WM_EXCP_LR_CTRL + offset);
-+	dump->lr_cur_idx = FIELD_GET(MT_MCU_WM_EXCP_LR_CTRL_IDX_STATUS,
-+				     dump->lr_dbg_ctrl);
-+	for (i = 0; i < 32; i++) {
-+		reg = MT_MCU_WM_EXCP_LR_LOG + i * 4 + offset;
-+		dump->lr_stack[i] = mt76_rr(dev, reg);
- 	}
- 
- 	/* start call stack record */
- 	if (!exception) {
--		mt76_set(dev, MT_MCU_WM_EXCP_PC_CTRL, BIT(0));
--		mt76_set(dev, MT_MCU_WM_EXCP_LR_CTRL, BIT(0));
-+		mt76_set(dev, MT_MCU_WM_EXCP_PC_CTRL + offset, BIT(0));
-+		mt76_set(dev, MT_MCU_WM_EXCP_LR_CTRL + offset, BIT(0));
- 	}
- }
- 
--static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev)
-+static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8 type)
- {
--	struct mt7996_crash_data *crash_data = dev->coredump.crash_data;
-+	struct mt7996_crash_data *crash_data = dev->coredump.crash_data[type];
- 	struct mt7996_coredump *dump;
- 	struct mt7996_coredump_mem *dump_mem;
- 	size_t len, sofar = 0, hdr_len = sizeof(*dump);
-@@ -186,20 +222,31 @@ static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev)
- 
- 	dump = (struct mt7996_coredump *)(buf);
- 	dump->len = len;
-+	dump->hdr_len = hdr_len;
- 
- 	/* plain text */
- 	strscpy(dump->magic, "mt76-crash-dump", sizeof(dump->magic));
- 	strscpy(dump->kernel, init_utsname()->release, sizeof(dump->kernel));
-+	strscpy(dump->fw_type, ((type == MT7996_RAM_TYPE_WA) ? "WA" : "WM"),
-+		sizeof(dump->fw_type));
- 	strscpy(dump->fw_ver, dev->mt76.hw->wiphy->fw_version,
- 		sizeof(dump->fw_ver));
-+	strscpy(dump->fw_patch_date, dev->patch_build_date,
-+		sizeof(dump->fw_patch_date));
-+	strscpy(dump->fw_ram_date[MT7996_RAM_TYPE_WM],
-+		dev->ram_build_date[MT7996_RAM_TYPE_WM],
-+		MT7996_BUILD_TIME_LEN);
-+	strscpy(dump->fw_ram_date[MT7996_RAM_TYPE_WA],
-+		dev->ram_build_date[MT7996_RAM_TYPE_WA],
-+		MT7996_BUILD_TIME_LEN);
- 
- 	guid_copy(&dump->guid, &crash_data->guid);
- 	dump->tv_sec = crash_data->timestamp.tv_sec;
- 	dump->tv_nsec = crash_data->timestamp.tv_nsec;
- 	dump->device_id = mt76_chip(&dev->mt76);
- 
--	mt7996_coredump_fw_state(dev, dump, &exception);
--	mt7996_coredump_fw_stack(dev, dump, exception);
-+	mt7996_coredump_fw_state(dev, type, dump, &exception);
-+	mt7996_coredump_fw_stack(dev, type, dump, exception);
- 
- 	/* gather memory content */
- 	dump_mem = (struct mt7996_coredump_mem *)(buf + sofar);
-@@ -213,17 +260,19 @@ static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev)
- 	return dump;
- }
- 
--int mt7996_coredump_submit(struct mt7996_dev *dev)
-+int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type)
- {
- 	struct mt7996_coredump *dump;
- 
--	dump = mt7996_coredump_build(dev);
-+	dump = mt7996_coredump_build(dev, type);
- 	if (!dump) {
- 		dev_warn(dev->mt76.dev, "no crash dump data found\n");
- 		return -ENODATA;
- 	}
- 
- 	dev_coredumpv(dev->mt76.dev, dump, dump->len, GFP_KERNEL);
-+	dev_info(dev->mt76.dev, "%s coredump completed\n",
-+		 wiphy_name(dev->mt76.hw->wiphy));
- 
- 	return 0;
- }
-@@ -231,23 +280,26 @@ int mt7996_coredump_submit(struct mt7996_dev *dev)
- int mt7996_coredump_register(struct mt7996_dev *dev)
- {
- 	struct mt7996_crash_data *crash_data;
-+	int i;
- 
--	crash_data = vzalloc(sizeof(*dev->coredump.crash_data));
--	if (!crash_data)
--		return -ENOMEM;
-+	for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
-+		crash_data = vzalloc(sizeof(*dev->coredump.crash_data[i]));
-+		if (!crash_data)
-+			return -ENOMEM;
- 
--	dev->coredump.crash_data = crash_data;
-+		dev->coredump.crash_data[i] = crash_data;
- 
--	if (coredump_memdump) {
--		crash_data->memdump_buf_len = mt7996_coredump_get_mem_size(dev);
--		if (!crash_data->memdump_buf_len)
--			/* no memory content */
--			return 0;
-+		if (coredump_memdump) {
-+			crash_data->memdump_buf_len = mt7996_coredump_get_mem_size(dev, i);
-+			if (!crash_data->memdump_buf_len)
-+				/* no memory content */
-+				return 0;
- 
--		crash_data->memdump_buf = vzalloc(crash_data->memdump_buf_len);
--		if (!crash_data->memdump_buf) {
--			vfree(crash_data);
--			return -ENOMEM;
-+			crash_data->memdump_buf = vzalloc(crash_data->memdump_buf_len);
-+			if (!crash_data->memdump_buf) {
-+				vfree(crash_data);
-+				return -ENOMEM;
-+			}
- 		}
- 	}
- 
-@@ -256,13 +308,17 @@ int mt7996_coredump_register(struct mt7996_dev *dev)
- 
- void mt7996_coredump_unregister(struct mt7996_dev *dev)
- {
--	if (dev->coredump.crash_data->memdump_buf) {
--		vfree(dev->coredump.crash_data->memdump_buf);
--		dev->coredump.crash_data->memdump_buf = NULL;
--		dev->coredump.crash_data->memdump_buf_len = 0;
--	}
-+	int i;
- 
--	vfree(dev->coredump.crash_data);
--	dev->coredump.crash_data = NULL;
-+	for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
-+		if (dev->coredump.crash_data[i]->memdump_buf) {
-+			vfree(dev->coredump.crash_data[i]->memdump_buf);
-+			dev->coredump.crash_data[i]->memdump_buf = NULL;
-+			dev->coredump.crash_data[i]->memdump_buf_len = 0;
-+		}
-+
-+		vfree(dev->coredump.crash_data[i]);
-+		dev->coredump.crash_data[i] = NULL;
-+	}
- }
- 
-diff --git a/mt7996/coredump.h b/mt7996/coredump.h
-index af2ba219..01ed3731 100644
---- a/mt7996/coredump.h
-+++ b/mt7996/coredump.h
-@@ -6,10 +6,13 @@
- 
- #include "mt7996.h"
- 
-+#define MT7996_COREDUMP_MAX	(MT7996_RAM_TYPE_WA + 1)
-+
- struct mt7996_coredump {
- 	char magic[16];
- 
- 	u32 len;
-+	u32 hdr_len;
- 
- 	guid_t guid;
- 
-@@ -21,17 +24,28 @@ struct mt7996_coredump {
- 	char kernel[64];
- 	/* firmware version */
- 	char fw_ver[ETHTOOL_FWVERS_LEN];
-+	char fw_patch_date[MT7996_BUILD_TIME_LEN];
-+	char fw_ram_date[MT7996_COREDUMP_MAX][MT7996_BUILD_TIME_LEN];
- 
- 	u32 device_id;
- 
-+	/* fw type */
-+	char fw_type[8];
-+
- 	/* exception state */
- 	char fw_state[12];
- 
- 	/* program counters */
--	char pc_current[16];
--	u32 pc_stack[17];
--	/* link registers */
--	u32 lr_stack[16];
-+	u32 pc_dbg_ctrl;
-+	u32 pc_cur_idx;
-+	u32 pc_cur[10];
-+	/* PC registers */
-+	u32 pc_stack[32];
-+
-+	u32 lr_dbg_ctrl;
-+	u32 lr_cur_idx;
-+	/* LR registers */
-+	u32 lr_stack[32];
- 
- 	/* memory content */
- 	u8 data[];
-@@ -43,6 +57,7 @@ struct mt7996_coredump_mem {
- } __packed;
- 
- struct mt7996_mem_hdr {
-+	char name[64];
- 	u32 start;
- 	u32 len;
- 	u8 data[];
-@@ -58,27 +73,27 @@ struct mt7996_mem_region {
- #ifdef CONFIG_DEV_COREDUMP
- 
- const struct mt7996_mem_region *
--mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num);
--struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev);
--int mt7996_coredump_submit(struct mt7996_dev *dev);
-+mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num);
-+struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type);
-+int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type);
- int mt7996_coredump_register(struct mt7996_dev *dev);
- void mt7996_coredump_unregister(struct mt7996_dev *dev);
- 
- #else /* CONFIG_DEV_COREDUMP */
- 
- static inline const struct mt7996_mem_region *
--mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)
-+mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
- {
- 	return NULL;
- }
- 
--static inline int mt7996_coredump_submit(struct mt7996_dev *dev)
-+static inline int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type)
- {
- 	return 0;
- }
- 
- static inline struct
--mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)
-+mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type)
- {
- 	return NULL;
- }
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 3afdd7eb..d88bbfb2 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1998,28 +1998,25 @@ void mt7996_mac_reset_work(struct work_struct *work)
- }
- 
- /* firmware coredump */
--void mt7996_mac_dump_work(struct work_struct *work)
-+void mt7996_mac_fw_coredump(struct mt7996_dev *dev, u8 type)
- {
- 	const struct mt7996_mem_region *mem_region;
- 	struct mt7996_crash_data *crash_data;
--	struct mt7996_dev *dev;
- 	struct mt7996_mem_hdr *hdr;
- 	size_t buf_len;
- 	int i;
- 	u32 num;
- 	u8 *buf;
- 
--	dev = container_of(work, struct mt7996_dev, dump_work);
--
- 	mutex_lock(&dev->dump_mutex);
- 
--	crash_data = mt7996_coredump_new(dev);
-+	crash_data = mt7996_coredump_new(dev, type);
- 	if (!crash_data) {
- 		mutex_unlock(&dev->dump_mutex);
--		goto skip_coredump;
-+		return;
- 	}
- 
--	mem_region = mt7996_coredump_get_mem_layout(dev, &num);
-+	mem_region = mt7996_coredump_get_mem_layout(dev, type, &num);
- 	if (!mem_region || !crash_data->memdump_buf_len) {
- 		mutex_unlock(&dev->dump_mutex);
- 		goto skip_memdump;
-@@ -2029,6 +2026,9 @@ void mt7996_mac_dump_work(struct work_struct *work)
- 	buf_len = crash_data->memdump_buf_len;
- 
- 	/* dumping memory content... */
-+	dev_info(dev->mt76.dev, "%s start coredump for %s\n",
-+		 wiphy_name(dev->mt76.hw->wiphy),
-+		 ((type == MT7996_RAM_TYPE_WA) ? "WA" : "WM"));
- 	memset(buf, 0, buf_len);
- 	for (i = 0; i < num; i++) {
- 		if (mem_region->len > buf_len) {
-@@ -2045,6 +2045,7 @@ void mt7996_mac_dump_work(struct work_struct *work)
- 		mt7996_memcpy_fromio(dev, buf, mem_region->start,
- 				     mem_region->len);
- 
-+		strscpy(hdr->name, mem_region->name, sizeof(mem_region->name));
- 		hdr->start = mem_region->start;
- 		hdr->len = mem_region->len;
- 
-@@ -2061,8 +2062,20 @@ void mt7996_mac_dump_work(struct work_struct *work)
- 	mutex_unlock(&dev->dump_mutex);
- 
- skip_memdump:
--	mt7996_coredump_submit(dev);
--skip_coredump:
-+	mt7996_coredump_submit(dev, type);
-+}
-+
-+void mt7996_mac_dump_work(struct work_struct *work)
-+{
-+	struct mt7996_dev *dev;
-+
-+	dev = container_of(work, struct mt7996_dev, dump_work);
-+	if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
-+		mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WA);
-+
-+	if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WM_WDT)
-+		mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WM);
-+
- 	queue_work(dev->mt76.wq, &dev->reset_work);
- }
- 
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 5aefecb0..88fb196d 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -2702,6 +2702,8 @@ static int mt7996_load_patch(struct mt7996_dev *dev)
- 
- 	dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
- 		 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
-+	memcpy(dev->patch_build_date, hdr->build_date,
-+	       sizeof(dev->patch_build_date));
- 
- 	for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
- 		struct mt7996_patch_sec *sec;
-@@ -2828,6 +2830,9 @@ static int __mt7996_load_ram(struct mt7996_dev *dev, const char *fw_type,
- 	}
- 
- 	hdr = (const void *)(fw->data + fw->size - sizeof(*hdr));
-+	memcpy(dev->ram_build_date[ram_type],
-+	       hdr->build_date,
-+	       sizeof(dev->ram_build_date[ram_type]));
- 	dev_info(dev->mt76.dev, "%s Firmware Version: %.10s, Build Time: %.15s\n",
- 		 fw_type, hdr->fw_ver, hdr->build_date);
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 7e5ec212..e1610d3b 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -83,6 +83,8 @@
- #define MT7996_CRIT_TEMP		110
- #define MT7996_MAX_TEMP			120
- 
-+#define MT7996_BUILD_TIME_LEN		24
-+
- #define MT7996_RRO_MAX_SESSION		1024
- #define MT7996_RRO_WINDOW_MAX_LEN	1024
- #define MT7996_RRO_ADDR_ELEM_LEN	128
-@@ -126,6 +128,7 @@ enum mt7996_ram_type {
- 	MT7996_RAM_TYPE_WM,
- 	MT7996_RAM_TYPE_WA,
- 	MT7996_RAM_TYPE_DSP,
-+	__MT7996_RAM_TYPE_MAX,
- };
- 
- enum mt7996_txq_id {
-@@ -316,9 +319,11 @@ struct mt7996_dev {
- 	struct mutex dump_mutex;
- #ifdef CONFIG_DEV_COREDUMP
- 	struct {
--		struct mt7996_crash_data *crash_data;
-+		struct mt7996_crash_data *crash_data[__MT7996_RAM_TYPE_MAX];
- 	} coredump;
- #endif
-+	char patch_build_date[MT7996_BUILD_TIME_LEN];
-+	char ram_build_date[__MT7996_RAM_TYPE_MAX][MT7996_BUILD_TIME_LEN];
- 
- 	struct list_head sta_rc_list;
- 	struct list_head twt_list;
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index cf12c5e0..4c20a67d 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -597,7 +597,8 @@ enum offs_rev {
- 
- /* FW MODE SYNC */
- #define MT_FW_ASSERT_CNT			0x02208274
--#define MT_FW_DUMP_STATE			0x02209e90
-+#define MT_FW_WM_DUMP_STATE			0x02209e90
-+#define MT_FW_WA_DUMP_STATE			0x7C05B080
- 
- #define MT_SWDEF_BASE				0x00401400
- 
-@@ -714,11 +715,15 @@ enum offs_rev {
- #define MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR		BIT(29)
- 
- /* CONN MCU EXCP CON */
-+#define MT_MCU_WA_EXCP_BASE			0x890d0000
- #define MT_MCU_WM_EXCP_BASE			0x89050000
-+
- #define MT_MCU_WM_EXCP(ofs)			(MT_MCU_WM_EXCP_BASE + (ofs))
- #define MT_MCU_WM_EXCP_PC_CTRL			MT_MCU_WM_EXCP(0x100)
-+#define MT_MCU_WM_EXCP_PC_CTRL_IDX_STATUS	GENMASK(20, 16)
- #define MT_MCU_WM_EXCP_PC_LOG			MT_MCU_WM_EXCP(0x104)
- #define MT_MCU_WM_EXCP_LR_CTRL			MT_MCU_WM_EXCP(0x200)
-+#define MT_MCU_WM_EXCP_LR_CTRL_IDX_STATUS	GENMASK(20, 16)
- #define MT_MCU_WM_EXCP_LR_LOG			MT_MCU_WM_EXCP(0x204)
- 
- /* CONN AFE CTL CON */
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0016-mtk-wifi-mt76-mt7996-add-preamble-puncture-support-f.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0016-mtk-wifi-mt76-mt7996-add-preamble-puncture-support-f.patch
deleted file mode 100644
index 2ed6aca..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0016-mtk-wifi-mt76-mt7996-add-preamble-puncture-support-f.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 86aed1e2968dcb516b60cad4361048c2df7a8119 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Fri, 22 Sep 2023 10:32:37 +0800
-Subject: [PATCH 16/17] mtk: wifi: mt76: mt7996: add preamble puncture support
- for mt7996
-
-Add support configure preamble puncture feature through mcu commands.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt76_connac_mcu.h |  1 +
- mt7996/mcu.c      | 30 ++++++++++++++++++++++++++++++
- mt7996/mcu.h      |  4 ++++
- mt7996/mt7996.h   |  2 ++
- 4 files changed, 37 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index f1cd2e50..482782f7 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1270,6 +1270,7 @@ enum {
- 	MCU_UNI_CMD_CHANNEL_SWITCH = 0x34,
- 	MCU_UNI_CMD_THERMAL = 0x35,
- 	MCU_UNI_CMD_VOW = 0x37,
-+	MCU_UNI_CMD_PP = 0x38,
- 	MCU_UNI_CMD_FIXED_RATE_TABLE = 0x40,
- 	MCU_UNI_CMD_RRO = 0x57,
- 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 88fb196d..b9939e0c 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -4540,3 +4540,33 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
- 				     MCU_WM_UNI_CMD(TXPOWER), true);
- }
-+
-+int mt7996_mcu_set_pp_en(struct mt7996_phy *phy, bool auto_mode,
-+			 u8 force_bitmap_ctrl, u16 bitmap)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		bool mgmt_mode;
-+		u8 band_idx;
-+		u8 force_bitmap_ctrl;
-+		bool auto_mode;
-+		__le16 bitmap;
-+		u8 _rsv2[2];
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_PP_EN_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+
-+		.mgmt_mode = !auto_mode,
-+		.band_idx = phy->mt76->band_idx,
-+		.force_bitmap_ctrl = force_bitmap_ctrl,
-+		.auto_mode = auto_mode,
-+		.bitmap = cpu_to_le16(bitmap),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(PP),
-+				 &req, sizeof(req), false);
-+}
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index a9ba63d1..238c4c53 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -923,6 +923,10 @@ enum {
- 	MT7996_SEC_MODE_MAX,
- };
- 
-+enum {
-+	UNI_CMD_PP_EN_CTRL,
-+};
-+
- #define MT7996_PATCH_SEC		GENMASK(31, 24)
- #define MT7996_PATCH_SCRAMBLE_KEY	GENMASK(15, 8)
- #define MT7996_PATCH_AES_KEY		GENMASK(7, 0)
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index e1610d3b..4176e51a 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -654,6 +654,8 @@ int mt7996_mcu_bcn_prot_enable(struct mt7996_dev *dev, struct ieee80211_vif *vif
- int mt7996_mcu_wtbl_update_hdr_trans(struct mt7996_dev *dev,
- 				     struct ieee80211_vif *vif,
- 				     struct ieee80211_sta *sta);
-+int mt7996_mcu_set_pp_en(struct mt7996_phy *phy, bool auto_mode, u8 force_bitmap,
-+			 u16 bitmap);
- #ifdef CONFIG_MAC80211_DEBUGFS
- void mt7996_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 			    struct ieee80211_sta *sta, struct dentry *dir);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0017-mtk-wifi-mt76-mt7996-add-sanity-check-for-NAPI-sched.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0017-mtk-wifi-mt76-mt7996-add-sanity-check-for-NAPI-sched.patch
deleted file mode 100644
index dbfb384..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0017-mtk-wifi-mt76-mt7996-add-sanity-check-for-NAPI-sched.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 19ea1497e7aea34be6e8851a1aca75e3eb58b58f Mon Sep 17 00:00:00 2001
-From: "Henry.Yen" <henry.yen@mediatek.com>
-Date: Tue, 16 Jan 2024 11:30:02 +0800
-Subject: [PATCH 17/17] mtk: wifi: mt76: mt7996: add sanity check for NAPI
- schedule
-
-Add sanity check for NAPI schedule.
-
-It's observed that host driver might occasionally receive
-interrupts from unexpected Rx ring, whose Rx NAPI hasn't been
-prepared yet. Under such situation, __napi_poll crash issue
-would occur, so we add sanity check to prevent it.
-
-If without this patch, we might encounter kernel crash issue
-especially in WED-on & RRO-on software path.
-
-Signed-off-by: Henry.Yen <henry.yen@mediatek.com>
-
----
- mt7996/mmio.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index 8fe56ed9..367a204d 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -560,7 +560,7 @@ static void mt7996_irq_tasklet(struct tasklet_struct *t)
- 		napi_schedule(&dev->mt76.tx_napi);
- 
- 	for (i = 0; i < __MT_RXQ_MAX; i++) {
--		if ((intr & MT_INT_RX(i)))
-+		if ((intr & MT_INT_RX(i)) && dev->mt76.napi[i].poll)
- 			napi_schedule(&dev->mt76.napi[i]);
- 	}
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0999-mtk-wifi-mt76-mt7996-for-build-pass.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0999-mtk-wifi-mt76-mt7996-for-build-pass.patch
deleted file mode 100644
index 9c72243..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0999-mtk-wifi-mt76-mt7996-for-build-pass.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From 1df5a85005f59c81ddc50c6378562e4c9bc31056 Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Thu, 3 Nov 2022 00:27:17 +0800
-Subject: [PATCH 0999/1044] mtk: wifi: mt76: mt7996: for build pass
-
----
- debugfs.c         | 3 +++
- dma.c             | 2 +-
- eeprom.c          | 8 +++++++-
- mcu.c             | 1 +
- mt7615/mcu.c      | 1 +
- mt76_connac_mcu.c | 1 +
- mt7915/mcu.c      | 1 +
- mt7996/dma.c      | 4 ++--
- mt7996/eeprom.c   | 1 +
- mt7996/mcu.c      | 1 +
- 10 files changed, 19 insertions(+), 4 deletions(-)
-
-diff --git a/debugfs.c b/debugfs.c
-index c4649ba0..ac5207e5 100644
---- a/debugfs.c
-+++ b/debugfs.c
-@@ -33,8 +33,11 @@ mt76_napi_threaded_set(void *data, u64 val)
- 	if (!mt76_is_mmio(dev))
- 		return -EOPNOTSUPP;
- 
-+#if 0
-+	/* need to backport patch from networking stack */
- 	if (dev->napi_dev.threaded != val)
- 		return dev_set_threaded(&dev->napi_dev, val);
-+#endif
- 
- 	return 0;
- }
-diff --git a/dma.c b/dma.c
-index f4f88c44..56044639 100644
---- a/dma.c
-+++ b/dma.c
-@@ -883,7 +883,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- 		    !(dev->drv->rx_check(dev, data, len)))
- 			goto free_frag;
- 
--		skb = napi_build_skb(data, q->buf_size);
-+		skb = build_skb(data, q->buf_size);
- 		if (!skb)
- 			goto free_frag;
- 
-diff --git a/eeprom.c b/eeprom.c
-index 0bc66cc1..7d5cf28f 100644
---- a/eeprom.c
-+++ b/eeprom.c
-@@ -163,9 +163,15 @@ void
- mt76_eeprom_override(struct mt76_phy *phy)
- {
- 	struct mt76_dev *dev = phy->dev;
-+#ifdef CONFIG_OF
- 	struct device_node *np = dev->dev->of_node;
-+	const u8 *mac = NULL;
- 
--	of_get_mac_address(np, phy->macaddr);
-+	if (np)
-+		mac = of_get_mac_address(np);
-+	if (!IS_ERR_OR_NULL(mac))
-+		ether_addr_copy(phy->macaddr, mac);
-+#endif
- 
- 	if (!is_valid_ether_addr(phy->macaddr)) {
- 		eth_random_addr(phy->macaddr);
-diff --git a/mcu.c b/mcu.c
-index a8cafa39..fa4b0544 100644
---- a/mcu.c
-+++ b/mcu.c
-@@ -4,6 +4,7 @@
-  */
- 
- #include "mt76.h"
-+#include <linux/moduleparam.h>
- 
- struct sk_buff *
- __mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data,
-diff --git a/mt7615/mcu.c b/mt7615/mcu.c
-index ae34d019..c9444c6d 100644
---- a/mt7615/mcu.c
-+++ b/mt7615/mcu.c
-@@ -10,6 +10,7 @@
- #include "mcu.h"
- #include "mac.h"
- #include "eeprom.h"
-+#include <linux/moduleparam.h>
- 
- static bool prefer_offload_fw = true;
- module_param(prefer_offload_fw, bool, 0644);
-diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
-index fec158ec..42f12672 100644
---- a/mt76_connac_mcu.c
-+++ b/mt76_connac_mcu.c
-@@ -4,6 +4,7 @@
- #include <linux/firmware.h>
- #include "mt76_connac2_mac.h"
- #include "mt76_connac_mcu.h"
-+#include <linux/module.h>
- 
- int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option)
- {
-diff --git a/mt7915/mcu.c b/mt7915/mcu.c
-index fe54a2f4..35d57989 100644
---- a/mt7915/mcu.c
-+++ b/mt7915/mcu.c
-@@ -6,6 +6,7 @@
- #include "mcu.h"
- #include "mac.h"
- #include "eeprom.h"
-+#include <linux/moduleparam.h>
- 
- #define fw_name(_dev, name, ...)	({			\
- 	char *_fw;						\
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index 73e633d0..759a58e8 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -641,8 +641,8 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 	if (ret < 0)
- 		return ret;
- 
--	netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
--			  mt7996_poll_tx);
-+	netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
-+			  mt7996_poll_tx, NAPI_POLL_WEIGHT);
- 	napi_enable(&dev->mt76.tx_napi);
- 
- 	mt7996_dma_enable(dev, false);
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 3260d1fe..121a3c95 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -138,6 +138,7 @@ static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
- 	if (ret)
- 		return ret;
- 
-+	cap = 0x4b249248;	/* internal hardcode */
- 	if (cap) {
- 		dev->has_eht = !(cap & MODE_HE_ONLY);
- 		dev->wtbl_size_group = u32_get_bits(cap, WTBL_SIZE_GROUP);
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index b9939e0c..e92a3e53 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -5,6 +5,7 @@
- 
- #include <linux/firmware.h>
- #include <linux/fs.h>
-+#include <linux/moduleparam.h>
- #include "mt7996.h"
- #include "mcu.h"
- #include "mac.h"
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1000-mtk-wifi-mt76-mt7996-add-debug-tool.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1000-mtk-wifi-mt76-mt7996-add-debug-tool.patch
deleted file mode 100644
index bfbb09d..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1000-mtk-wifi-mt76-mt7996-add-debug-tool.patch
+++ /dev/null
@@ -1,5237 +0,0 @@
-From 57b3bc3bdbb3fb05897ff92ff59e970598fbf223 Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Fri, 24 Mar 2023 14:02:32 +0800
-Subject: [PATCH 1000/1044] mtk: wifi: mt76: mt7996: add debug tool
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Add PSM bit in sta_info
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
-
-Remove the duplicate function in mtk_debugfs.c & mtk_debug_i.c
-Only enable mt7996_mcu_fw_log_2_host function in mcu.c
-
-Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
-
-Support more ids category NDPA/NDP TXD/FBK and debug log recommended by
-CTD members.
-
-This commit equals to run the follwoing commands on Logan driver:
-command:
-1. iwpriv ra0 set fw_dbg=1:84
-2. iwpriv ra0 set fw_dbg=2:84
-3. iwpriv ra0 set fw_dbg=1:101
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
-
-mtk: wifi: mt76: mt7996: add wtbl_info support for mt7992
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-mtk: wifi: mt76: mt7996: add mt7992 & mt7996 CR debug offset revision
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-mtk: wifi: mt76: mt7992: refactor code for FW log
-
-Refactor code for FW log.
-
-Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
----
- mt76.h               |    2 +
- mt7996/Makefile      |    4 +
- mt7996/coredump.c    |   10 +-
- mt7996/coredump.h    |    7 +
- mt7996/debugfs.c     |   64 +-
- mt7996/mac.c         |    3 +
- mt7996/mt7996.h      |   11 +
- mt7996/mtk_debug.h   | 2286 ++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_debugfs.c | 2484 ++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.c     |   18 +
- mt7996/mtk_mcu.h     |   16 +
- tools/fwlog.c        |   25 +-
- 12 files changed, 4905 insertions(+), 25 deletions(-)
- create mode 100644 mt7996/mtk_debug.h
- create mode 100644 mt7996/mtk_debugfs.c
- create mode 100644 mt7996/mtk_mcu.c
- create mode 100644 mt7996/mtk_mcu.h
-
-diff --git a/mt76.h b/mt76.h
-index 294e379a..8cf21f98 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -394,6 +394,8 @@ struct mt76_txwi_cache {
- 		struct sk_buff *skb;
- 		void *ptr;
- 	};
-+
-+	unsigned long jiffies;
- };
- 
- struct mt76_rx_tid {
-diff --git a/mt7996/Makefile b/mt7996/Makefile
-index 07c8b555..a056b40e 100644
---- a/mt7996/Makefile
-+++ b/mt7996/Makefile
-@@ -1,4 +1,6 @@
- # SPDX-License-Identifier: ISC
-+EXTRA_CFLAGS += -DCONFIG_MT76_LEDS
-+EXTRA_CFLAGS += -DCONFIG_MTK_DEBUG
- 
- obj-$(CONFIG_MT7996E) += mt7996e.o
- 
-@@ -6,3 +8,5 @@ mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \
- 	     debugfs.o mmio.o
- 
- mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o
-+
-+mt7996e-y += mtk_debugfs.o mtk_mcu.o
-diff --git a/mt7996/coredump.c b/mt7996/coredump.c
-index 60b88085..a7f91b56 100644
---- a/mt7996/coredump.c
-+++ b/mt7996/coredump.c
-@@ -195,7 +195,7 @@ mt7996_coredump_fw_stack(struct mt7996_dev *dev, u8 type, struct mt7996_coredump
- 	}
- }
- 
--static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8 type)
-+struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8 type, bool full_dump)
- {
- 	struct mt7996_crash_data *crash_data = dev->coredump.crash_data[type];
- 	struct mt7996_coredump *dump;
-@@ -206,7 +206,7 @@ static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8
- 
- 	len = hdr_len;
- 
--	if (coredump_memdump && crash_data->memdump_buf_len)
-+	if (full_dump && coredump_memdump && crash_data->memdump_buf_len)
- 		len += sizeof(*dump_mem) + crash_data->memdump_buf_len;
- 
- 	sofar += hdr_len;
-@@ -248,6 +248,9 @@ static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8
- 	mt7996_coredump_fw_state(dev, type, dump, &exception);
- 	mt7996_coredump_fw_stack(dev, type, dump, exception);
- 
-+	if (!full_dump)
-+		goto skip_dump_mem;
-+
- 	/* gather memory content */
- 	dump_mem = (struct mt7996_coredump_mem *)(buf + sofar);
- 	dump_mem->len = crash_data->memdump_buf_len;
-@@ -255,6 +258,7 @@ static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8
- 		memcpy(dump_mem->data, crash_data->memdump_buf,
- 		       crash_data->memdump_buf_len);
- 
-+skip_dump_mem:
- 	mutex_unlock(&dev->dump_mutex);
- 
- 	return dump;
-@@ -264,7 +268,7 @@ int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type)
- {
- 	struct mt7996_coredump *dump;
- 
--	dump = mt7996_coredump_build(dev, type);
-+	dump = mt7996_coredump_build(dev, type, true);
- 	if (!dump) {
- 		dev_warn(dev->mt76.dev, "no crash dump data found\n");
- 		return -ENODATA;
-diff --git a/mt7996/coredump.h b/mt7996/coredump.h
-index 01ed3731..93cd84a0 100644
---- a/mt7996/coredump.h
-+++ b/mt7996/coredump.h
-@@ -75,6 +75,7 @@ struct mt7996_mem_region {
- const struct mt7996_mem_region *
- mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num);
- struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type);
-+struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8 type, bool full_dump);
- int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type);
- int mt7996_coredump_register(struct mt7996_dev *dev);
- void mt7996_coredump_unregister(struct mt7996_dev *dev);
-@@ -92,6 +93,12 @@ static inline int mt7996_coredump_submit(struct mt7996_dev *dev, u8 type)
- 	return 0;
- }
- 
-+static inline struct
-+mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev, u8 type, bool full_dump)
-+{
-+	return NULL;
-+}
-+
- static inline struct
- mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type)
- {
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 9bd95358..1637b39d 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -290,11 +290,39 @@ mt7996_fw_debug_wm_set(void *data, u64 val)
- 		DEBUG_SPL,
- 		DEBUG_RPT_RX,
- 		DEBUG_RPT_RA = 68,
--	} debug;
-+		DEBUG_IDS_SND = 84,
-+		DEBUG_IDS_PP = 93,
-+		DEBUG_IDS_RA = 94,
-+		DEBUG_IDS_BF = 95,
-+		DEBUG_IDS_SR = 96,
-+		DEBUG_IDS_RU = 97,
-+		DEBUG_IDS_MUMIMO = 98,
-+		DEBUG_IDS_ERR_LOG = 101,
-+	};
-+	u8 debug_category[] = {
-+		DEBUG_TXCMD,
-+		DEBUG_CMD_RPT_TX,
-+		DEBUG_CMD_RPT_TRIG,
-+		DEBUG_SPL,
-+		DEBUG_RPT_RX,
-+		DEBUG_RPT_RA,
-+		DEBUG_IDS_SND,
-+		DEBUG_IDS_PP,
-+		DEBUG_IDS_RA,
-+		DEBUG_IDS_BF,
-+		DEBUG_IDS_SR,
-+		DEBUG_IDS_RU,
-+		DEBUG_IDS_MUMIMO,
-+		DEBUG_IDS_ERR_LOG,
-+	};
- 	bool tx, rx, en;
- 	int ret;
-+	u8 i;
- 
- 	dev->fw_debug_wm = val ? MCU_FW_LOG_TO_HOST : 0;
-+#ifdef CONFIG_MTK_DEBUG
-+	dev->fw_debug_wm = val;
-+#endif
- 
- 	if (dev->fw_debug_bin)
- 		val = MCU_FW_LOG_RELAY;
-@@ -309,18 +337,21 @@ mt7996_fw_debug_wm_set(void *data, u64 val)
- 	if (ret)
- 		return ret;
- 
--	for (debug = DEBUG_TXCMD; debug <= DEBUG_RPT_RA; debug++) {
--		if (debug == 67)
--			continue;
--
--		if (debug == DEBUG_RPT_RX)
-+	for (i = 0; i < ARRAY_SIZE(debug_category); i++) {
-+		if (debug_category[i] == DEBUG_RPT_RX)
- 			val = en && rx;
- 		else
- 			val = en && tx;
- 
--		ret = mt7996_mcu_fw_dbg_ctrl(dev, debug, val);
-+		ret = mt7996_mcu_fw_dbg_ctrl(dev, debug_category[i], val);
- 		if (ret)
- 			return ret;
-+
-+		if (debug_category[i] == DEBUG_IDS_SND && en) {
-+			ret = mt7996_mcu_fw_dbg_ctrl(dev, debug_category[i], 2);
-+			if (ret)
-+				return ret;
-+		}
- 	}
- 
- 	return 0;
-@@ -401,11 +432,12 @@ mt7996_fw_debug_bin_set(void *data, u64 val)
- 	};
- 	struct mt7996_dev *dev = data;
- 
--	if (!dev->relay_fwlog)
-+	if (!dev->relay_fwlog) {
- 		dev->relay_fwlog = relay_open("fwlog_data", dev->debugfs_dir,
- 					      1500, 512, &relay_cb, NULL);
--	if (!dev->relay_fwlog)
--		return -ENOMEM;
-+		if (!dev->relay_fwlog)
-+			return -ENOMEM;
-+	}
- 
- 	dev->fw_debug_bin = val;
- 
-@@ -819,6 +851,11 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
- 	if (phy == &dev->phy)
- 		dev->debugfs_dir = dir;
- 
-+#ifdef CONFIG_MTK_DEBUG
-+	debugfs_create_u16("wlan_idx", 0600, dir, &dev->wlan_idx);
-+	mt7996_mtk_init_debugfs(phy, dir);
-+#endif
-+
- 	return 0;
- }
- 
-@@ -830,7 +867,11 @@ mt7996_debugfs_write_fwlog(struct mt7996_dev *dev, const void *hdr, int hdrlen,
- 	unsigned long flags;
- 	void *dest;
- 
-+	if (!dev->relay_fwlog)
-+		return;
-+
- 	spin_lock_irqsave(&lock, flags);
-+
- 	dest = relay_reserve(dev->relay_fwlog, hdrlen + len + 4);
- 	if (dest) {
- 		*(u32 *)dest = hdrlen + len;
-@@ -863,9 +904,6 @@ void mt7996_debugfs_rx_fw_monitor(struct mt7996_dev *dev, const void *data, int
- 		.msg_type = cpu_to_le16(PKT_TYPE_RX_FW_MONITOR),
- 	};
- 
--	if (!dev->relay_fwlog)
--		return;
--
- 	hdr.serial_id = cpu_to_le16(dev->fw_debug_seq++);
- 	hdr.timestamp = cpu_to_le32(mt76_rr(dev, MT_LPON_FRCR(0)));
- 	hdr.len = *(__le16 *)data;
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index d88bbfb2..1f53d230 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -936,6 +936,9 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
- 	id = mt76_token_consume(mdev, &t);
- 	if (id < 0)
- 		return id;
-+#ifdef CONFIG_MTK_DEBUG
-+	t->jiffies = jiffies;
-+#endif
- 
- 	pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
- 	memset(txwi_ptr, 0, MT_TXD_SIZE);
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 4176e51a..34159f97 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -370,6 +370,17 @@ struct mt7996_dev {
- 	spinlock_t reg_lock;
- 
- 	u8 wtbl_size_group;
-+
-+#ifdef CONFIG_MTK_DEBUG
-+	u16 wlan_idx;
-+	struct {
-+		u8 sku_disable;
-+		u32 fw_dbg_module;
-+		u8 fw_dbg_lv;
-+		u32 bcn_total_cnt[__MT_MAX_BAND];
-+	} dbg;
-+	const struct mt7996_dbg_reg_desc *dbg_reg;
-+#endif
- };
- 
- enum {
-diff --git a/mt7996/mtk_debug.h b/mt7996/mtk_debug.h
-new file mode 100644
-index 00000000..27d8f1cb
---- /dev/null
-+++ b/mt7996/mtk_debug.h
-@@ -0,0 +1,2286 @@
-+#ifndef __MTK_DEBUG_H
-+#define __MTK_DEBUG_H
-+
-+#ifdef CONFIG_MTK_DEBUG
-+#define NO_SHIFT_DEFINE 0xFFFFFFFF
-+#define BITS(m, n)              (~(BIT(m)-1) & ((BIT(n) - 1) | BIT(n)))
-+
-+#define GET_FIELD(_field, _reg)	\
-+	({	\
-+		(((_reg) & (_field##_MASK)) >> (_field##_SHIFT));	\
-+	})
-+
-+#define __DBG_OFFS(id)		(dev->dbg_reg->offs_rev[(id)])
-+
-+enum dbg_offs_rev {
-+	AGG_AALCR2,
-+	AGG_AALCR3,
-+	AGG_AALCR4,
-+	AGG_AALCR5,
-+	AGG_AALCR6,
-+	AGG_AALCR7,
-+	MIB_TDRCR0,
-+	MIB_TDRCR1,
-+	MIB_TDRCR2,
-+	MIB_TDRCR3,
-+	MIB_TDRCR4,
-+	MIB_RSCR26,
-+	MIB_TSCR18,
-+	MIB_TRDR0,
-+	MIB_TRDR2,
-+	MIB_TRDR3,
-+	MIB_TRDR4,
-+	MIB_TRDR5,
-+	MIB_TRDR6,
-+	MIB_TRDR7,
-+	MIB_TRDR8,
-+	MIB_TRDR9,
-+	MIB_TRDR10,
-+	MIB_TRDR11,
-+	MIB_TRDR12,
-+	MIB_TRDR13,
-+	MIB_TRDR14,
-+	MIB_TRDR15,
-+	MIB_MSR0,
-+	MIB_MSR1,
-+	MIB_MSR2,
-+	MIB_MCTR5,
-+	MIB_MCTR6,
-+	__MT_DBG_OFFS_REV_MAX,
-+};
-+
-+static const u32 mt7996_dbg_offs[] = {
-+	[AGG_AALCR2]		= 0x128,
-+	[AGG_AALCR3]		= 0x12c,
-+	[AGG_AALCR4]		= 0x130,
-+	[AGG_AALCR5]		= 0x134,
-+	[AGG_AALCR6]		= 0x138,
-+	[AGG_AALCR7]		= 0x13c,
-+	[MIB_TDRCR0]		= 0x728,
-+	[MIB_TDRCR1]		= 0x72c,
-+	[MIB_TDRCR2]		= 0x730,
-+	[MIB_TDRCR3]		= 0x734,
-+	[MIB_TDRCR4]		= 0x738,
-+	[MIB_RSCR26]		= 0x950,
-+	[MIB_TSCR18]		= 0xa1c,
-+	[MIB_TRDR0]		= 0xa24,
-+	[MIB_TRDR2]		= 0xa2c,
-+	[MIB_TRDR3]		= 0xa30,
-+	[MIB_TRDR4]		= 0xa34,
-+	[MIB_TRDR5]		= 0xa38,
-+	[MIB_TRDR6]		= 0xa3c,
-+	[MIB_TRDR7]		= 0xa40,
-+	[MIB_TRDR8]		= 0xa44,
-+	[MIB_TRDR9]		= 0xa48,
-+	[MIB_TRDR10]		= 0xa4c,
-+	[MIB_TRDR11]		= 0xa50,
-+	[MIB_TRDR12]		= 0xa54,
-+	[MIB_TRDR13]		= 0xa58,
-+	[MIB_TRDR14]		= 0xa5c,
-+	[MIB_TRDR15]		= 0xa60,
-+	[MIB_MSR0]		= 0xa64,
-+	[MIB_MSR1]		= 0xa68,
-+	[MIB_MSR2]		= 0xa6c,
-+	[MIB_MCTR5]		= 0xa70,
-+	[MIB_MCTR6]		= 0xa74,
-+};
-+
-+static const u32 mt7992_dbg_offs[] = {
-+	[AGG_AALCR2]		= 0x12c,
-+	[AGG_AALCR3]		= 0x130,
-+	[AGG_AALCR4]		= 0x134,
-+	[AGG_AALCR5]		= 0x138,
-+	[AGG_AALCR6]		= 0x13c,
-+	[AGG_AALCR7]		= 0x140,
-+	[MIB_TDRCR0]		= 0x768,
-+	[MIB_TDRCR1]		= 0x76c,
-+	[MIB_TDRCR2]		= 0x770,
-+	[MIB_TDRCR3]		= 0x774,
-+	[MIB_TDRCR4]		= 0x778,
-+	[MIB_RSCR26]		= 0x994,
-+	[MIB_TSCR18]		= 0xb18,
-+	[MIB_TRDR0]		= 0xb20,
-+	[MIB_TRDR2]		= 0xb28,
-+	[MIB_TRDR3]		= 0xb2c,
-+	[MIB_TRDR4]		= 0xb30,
-+	[MIB_TRDR5]		= 0xb34,
-+	[MIB_TRDR6]		= 0xb38,
-+	[MIB_TRDR7]		= 0xb3c,
-+	[MIB_TRDR8]		= 0xb40,
-+	[MIB_TRDR9]		= 0xb44,
-+	[MIB_TRDR10]		= 0xb48,
-+	[MIB_TRDR11]		= 0xb4c,
-+	[MIB_TRDR12]		= 0xb50,
-+	[MIB_TRDR13]		= 0xb54,
-+	[MIB_TRDR14]		= 0xb58,
-+	[MIB_TRDR15]		= 0xb5c,
-+	[MIB_MSR0]		= 0xb60,
-+	[MIB_MSR1]		= 0xb64,
-+	[MIB_MSR2]		= 0xb68,
-+	[MIB_MCTR5]		= 0xb6c,
-+	[MIB_MCTR6]		= 0xb70,
-+};
-+
-+/* used to differentiate between generations */
-+struct mt7996_dbg_reg_desc {
-+	const u32 id;
-+	const u32 *offs_rev;
-+};
-+
-+/* AGG */
-+#define BN0_WF_AGG_TOP_BASE                                    0x820e2000
-+#define BN1_WF_AGG_TOP_BASE                                    0x820f2000
-+#define IP1_BN0_WF_AGG_TOP_BASE                                0x830e2000
-+
-+#define BN0_WF_AGG_TOP_SCR_ADDR                                (BN0_WF_AGG_TOP_BASE + 0x0) // 2000
-+#define BN0_WF_AGG_TOP_SCR0_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x4) // 2004
-+#define BN0_WF_AGG_TOP_SCR1_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x8) // 2008
-+#define BN0_WF_AGG_TOP_BCR_ADDR                                (BN0_WF_AGG_TOP_BASE + 0xc) // 200C
-+#define BN0_WF_AGG_TOP_BWCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x10) // 2010
-+#define BN0_WF_AGG_TOP_ARCR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x14) // 2014
-+#define BN0_WF_AGG_TOP_ARUCR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x18) // 2018
-+#define BN0_WF_AGG_TOP_ARDCR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x1c) // 201C
-+#define BN0_WF_AGG_TOP_AALCR0_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x20) // 2020
-+#define BN0_WF_AGG_TOP_AALCR1_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x24) // 2024
-+#define BN0_WF_AGG_TOP_PCR0_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x28) // 2028
-+#define BN0_WF_AGG_TOP_PCR1_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x2c) // 202C
-+#define BN0_WF_AGG_TOP_TTCR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x30) // 2030
-+#define BN0_WF_AGG_TOP_TTCR1_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x34) // 2034
-+#define BN0_WF_AGG_TOP_ACR1_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x38) // 2038
-+#define BN0_WF_AGG_TOP_ACR4_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x3c) // 203C
-+#define BN0_WF_AGG_TOP_ACR5_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x40) // 2040
-+#define BN0_WF_AGG_TOP_ACR6_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x44) // 2044
-+#define BN0_WF_AGG_TOP_ACR8_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x4c) // 204C
-+#define BN0_WF_AGG_TOP_MRCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x50) // 2050
-+#define BN0_WF_AGG_TOP_MMPDR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x54) // 2054
-+#define BN0_WF_AGG_TOP_GFPDR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x58) // 2058
-+#define BN0_WF_AGG_TOP_VHTPDR_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x5c) // 205C
-+#define BN0_WF_AGG_TOP_HEPDR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x60) // 2060
-+#define BN0_WF_AGG_TOP_CTCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x64) // 2064
-+#define BN0_WF_AGG_TOP_ATCR3_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x68) // 2068
-+#define BN0_WF_AGG_TOP_SRCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x6c) // 206C
-+#define BN0_WF_AGG_TOP_VBCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x70) // 2070
-+#define BN0_WF_AGG_TOP_TCR_ADDR                                (BN0_WF_AGG_TOP_BASE + 0x74) // 2074
-+#define BN0_WF_AGG_TOP_SRHS_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x78) // 2078
-+#define BN0_WF_AGG_TOP_DBRCR0_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x7c) // 207C
-+#define BN0_WF_AGG_TOP_DBRCR1_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x80) // 2080
-+#define BN0_WF_AGG_TOP_CTETCR_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x84) // 2084
-+#define BN0_WF_AGG_TOP_WPDR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x88) // 2088
-+#define BN0_WF_AGG_TOP_PLRPDR_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x8c) // 208C
-+#define BN0_WF_AGG_TOP_CECR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x90) // 2090
-+#define BN0_WF_AGG_TOP_OMRCR0_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x94) // 2094
-+#define BN0_WF_AGG_TOP_OMRCR1_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x98) // 2098
-+#define BN0_WF_AGG_TOP_OMRCR2_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x9c) // 209C
-+#define BN0_WF_AGG_TOP_OMRCR3_ADDR                             (BN0_WF_AGG_TOP_BASE + 0xa0) // 20A0
-+#define BN0_WF_AGG_TOP_TMCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0xa4) // 20A4
-+#define BN0_WF_AGG_TOP_TWTCR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0xa8) // 20A8
-+#define BN0_WF_AGG_TOP_TWTSTACR_ADDR                           (BN0_WF_AGG_TOP_BASE + 0xac) // 20AC
-+#define BN0_WF_AGG_TOP_TWTE0TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xb0) // 20B0
-+#define BN0_WF_AGG_TOP_TWTE1TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xb4) // 20B4
-+#define BN0_WF_AGG_TOP_TWTE2TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xb8) // 20B8
-+#define BN0_WF_AGG_TOP_TWTE3TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xbc) // 20BC
-+#define BN0_WF_AGG_TOP_TWTE4TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xc0) // 20C0
-+#define BN0_WF_AGG_TOP_TWTE5TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xc4) // 20C4
-+#define BN0_WF_AGG_TOP_TWTE6TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xc8) // 20C8
-+#define BN0_WF_AGG_TOP_TWTE7TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xcc) // 20CC
-+#define BN0_WF_AGG_TOP_TWTE8TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xd0) // 20D0
-+#define BN0_WF_AGG_TOP_TWTE9TB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xd4) // 20D4
-+#define BN0_WF_AGG_TOP_TWTEATB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xd8) // 20D8
-+#define BN0_WF_AGG_TOP_TWTEBTB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xdc) // 20DC
-+#define BN0_WF_AGG_TOP_TWTECTB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xe0) // 20E0
-+#define BN0_WF_AGG_TOP_TWTEDTB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xe4) // 20E4
-+#define BN0_WF_AGG_TOP_TWTEETB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xe8) // 20E8
-+#define BN0_WF_AGG_TOP_TWTEFTB_ADDR                            (BN0_WF_AGG_TOP_BASE + 0xec) // 20EC
-+#define BN0_WF_AGG_TOP_ATCR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x108) // 2108
-+#define BN0_WF_AGG_TOP_ATCR1_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x10c) // 210C
-+#define BN0_WF_AGG_TOP_TCCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x110) // 2110
-+#define BN0_WF_AGG_TOP_TFCR_ADDR                               (BN0_WF_AGG_TOP_BASE + 0x114) // 2114
-+#define BN0_WF_AGG_TOP_MUCR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x118) // 2118
-+#define BN0_WF_AGG_TOP_MUCR1_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x11c) // 211C
-+#define BN0_WF_AGG_TOP_AALCR2_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR2))
-+#define BN0_WF_AGG_TOP_AALCR3_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR3))
-+#define BN0_WF_AGG_TOP_AALCR4_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR4))
-+#define BN0_WF_AGG_TOP_AALCR5_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR5))
-+#define BN0_WF_AGG_TOP_AALCR6_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR6))
-+#define BN0_WF_AGG_TOP_AALCR7_ADDR                             (BN0_WF_AGG_TOP_BASE + __DBG_OFFS(AGG_AALCR7))
-+#define BN0_WF_AGG_TOP_CSDCR0_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x150) // 2150
-+#define BN0_WF_AGG_TOP_CSDCR1_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x154) // 2154
-+#define BN0_WF_AGG_TOP_CSDCR2_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x158) // 2158
-+#define BN0_WF_AGG_TOP_CSDCR3_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x15c) // 215C
-+#define BN0_WF_AGG_TOP_CSDCR4_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x160) // 2160
-+#define BN0_WF_AGG_TOP_DYNSCR_ADDR                             (BN0_WF_AGG_TOP_BASE + 0x178) // 2178
-+#define BN0_WF_AGG_TOP_DYNSSCR_ADDR                            (BN0_WF_AGG_TOP_BASE + 0x198) // 2198
-+#define BN0_WF_AGG_TOP_TCDCNT0_ADDR                            (BN0_WF_AGG_TOP_BASE + 0x2c8) // 22C8
-+#define BN0_WF_AGG_TOP_TCDCNT1_ADDR                            (BN0_WF_AGG_TOP_BASE + 0x2cc) // 22CC
-+#define BN0_WF_AGG_TOP_TCSR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2d0) // 22D0
-+#define BN0_WF_AGG_TOP_TCSR1_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2d4) // 22D4
-+#define BN0_WF_AGG_TOP_TCSR2_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2d8) // 22D8
-+#define BN0_WF_AGG_TOP_DCR_ADDR                                (BN0_WF_AGG_TOP_BASE + 0x2e4) // 22E4
-+#define BN0_WF_AGG_TOP_SMDCR_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2e8) // 22E8
-+#define BN0_WF_AGG_TOP_TXCMDSMCR_ADDR                          (BN0_WF_AGG_TOP_BASE + 0x2ec) // 22EC
-+#define BN0_WF_AGG_TOP_SMCR0_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2f0) // 22F0
-+#define BN0_WF_AGG_TOP_SMCR1_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2f4) // 22F4
-+#define BN0_WF_AGG_TOP_SMCR2_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2f8) // 22F8
-+#define BN0_WF_AGG_TOP_SMCR3_ADDR                              (BN0_WF_AGG_TOP_BASE + 0x2fc) // 22FC
-+
-+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR0_ADDR
-+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_MASK              0x03FF0000                // AC01_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR0_ADDR
-+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_MASK              0x000003FF                // AC00_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR1_ADDR
-+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_MASK              0x03FF0000                // AC03_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR1_ADDR
-+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_MASK              0x000003FF                // AC02_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR2_ADDR
-+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_MASK              0x03FF0000                // AC11_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR2_ADDR
-+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_MASK              0x000003FF                // AC10_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR3_ADDR
-+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_MASK              0x03FF0000                // AC13_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR3_ADDR
-+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_MASK              0x000003FF                // AC12_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR4_ADDR
-+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_MASK              0x03FF0000                // AC21_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR4_ADDR
-+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_MASK              0x000003FF                // AC20_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR5_ADDR
-+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_MASK              0x03FF0000                // AC23_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR5_ADDR
-+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_MASK              0x000003FF                // AC22_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_SHFT              0
-+
-+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR6_ADDR
-+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_MASK              0x03FF0000                // AC31_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR6_ADDR
-+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_MASK              0x000003FF                // AC30_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_SHFT              0
-+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR7_ADDR
-+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_MASK              0x03FF0000                // AC33_AGG_LIMIT[25..16]
-+#define BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_SHFT              16
-+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_ADDR              BN0_WF_AGG_TOP_AALCR7_ADDR
-+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_MASK              0x000003FF                // AC32_AGG_LIMIT[9..0]
-+#define BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_SHFT              0
-+
-+/* DMA */
-+struct queue_desc {
-+	u32 hw_desc_base;
-+	u16 ring_size;
-+	char *const ring_info;
-+};
-+
-+// HOST DMA
-+#define WF_WFDMA_HOST_DMA0_BASE                                0xd4000
-+
-+#define WF_WFDMA_HOST_DMA0_HOST_INT_STA_ADDR                                   \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x200) /* 4200 */
-+#define WF_WFDMA_HOST_DMA0_HOST_INT_ENA_ADDR                                   \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0X204) /* 4204 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR                                  \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x208) /* 4208 */
-+
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR                      \
-+	WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK                      \
-+	0x00000008 /* RX_DMA_BUSY[3] */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT 3
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_ADDR                        \
-+	WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK                        \
-+	0x00000004 /* RX_DMA_EN[2] */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT 2
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR                      \
-+	WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK                      \
-+	0x00000002 /* TX_DMA_BUSY[1] */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT 1
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_ADDR                        \
-+	WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK                        \
-+	0x00000001 /* TX_DMA_EN[0] */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT 0
-+
-+
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x300) /* 4300 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x304) /* 4304 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x308) /* 4308 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x30c) /* 430C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x310) /* 4310 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x314) /* 4314 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x318) /* 4318 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x31c) /* 431C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x320) /* 4320 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x324) /* 4324 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x328) /* 4328 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x32c) /* 432C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x330) /* 4330 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x334) /* 4334 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x338) /* 4338 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x33c) /* 433C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x340) /* 4340 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x344) /* 4344 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x348) /* 4348 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x34c) /* 434C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x350) /* 4350 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x354) /* 4354 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x358) /* 4358 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x35c) /* 435C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x360) /* 4360 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x364) /* 4364 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x368) /* 4368 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x36c) /* 436C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x400) /* 4400 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x404) /* 4404 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x408) /* 4408 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x40c) /* 440C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x410) /* 4410 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x414) /* 4414 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x418) /* 4418 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x41c) /* 441C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x420) /* 4420 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x424) /* 4424 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x428) /* 4428 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x42c) /* 442C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x430) /* 4430 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x434) /* 4434 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x438) /* 4438 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x43c) /* 443C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x440) /* 4440 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x444) /* 4444 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x448) /* 4448 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x44c) /* 444C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL0_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x450) /* 4450 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL1_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x454) /* 4454 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL2_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x458) /* 4458 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL3_ADDR                          \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x45c) /* 445c */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL0_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x460) // 4460
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL1_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x464) // 4464
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL2_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x468) // 4468
-+#define WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL3_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x46c) // 446C
-+
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x500) /* 4500 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x504) /* 4504 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x508) /* 4508 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x50c) /* 450C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x510) /* 4510 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x514) /* 4514 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x518) /* 4518 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x51c) /* 451C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x520) /* 4520 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x524) /* 4524 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x528) /* 4528 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x52C) /* 452C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x530) /* 4530 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x534) /* 4534 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x538) /* 4538 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x53C) /* 453C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x540) /* 4540 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x544) /* 4544 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x548) /* 4548 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x54c) /* 454C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x550) /* 4550 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x554) /* 4554 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x558) /* 4558 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x55c) /* 455C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x560) /* 4560 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x564) /* 4564 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x568) /* 4568 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x56c) /* 456C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x570) /* 4570 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x574) /* 4574 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x578) /* 4578 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x57c) /* 457C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x580) /* 4580 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x584) /* 4584 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x588) /* 4588 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x58c) /* 458C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x590) /* 4590 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL1_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x594) /* 4594 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL2_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x598) /* 4598 */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL3_ADDR                           \
-+	(WF_WFDMA_HOST_DMA0_BASE + 0x59c) /* 459C */
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL0_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5a0) // 45A0
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL1_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5a4) // 45A4
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL2_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5a8) // 45A8
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL3_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5ac) // 45AC
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL0_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5b0) // 45B0
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL1_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5b4) // 45B4
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL2_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5b8) // 45B8
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL3_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5bc) // 45BC
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL0_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5C0) // 45C0
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL1_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5C4) // 45C4
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL2_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5C8) // 45C8
-+#define WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL3_ADDR          (WF_WFDMA_HOST_DMA0_BASE + 0x5CC) // 45CC
-+
-+// HOST PCIE1 DMA
-+#define WF_WFDMA_HOST_DMA0_PCIE1_BASE				0xd8000
-+
-+#define WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_STA_ADDR		(WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x200) // 8200
-+#define WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_ENA_ADDR		(WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0X204) // 8204
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_ADDR		(WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x208) // 8208
-+
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_PDMA_BT_SIZE_SHFT	4
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK		0x00000008
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT		3
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK		0x00000004
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT		2
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK		0x00000002
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT		1
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK		0x00000001
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT		0
-+
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL0_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x450) // 8450
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL1_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x454) // 8454
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL2_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x458) // 8458
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL3_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x45c) // 845C
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL0_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x460) // 8460
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL1_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x464) // 8464
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL2_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x468) // 8468
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL3_ADDR    (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x46c) // 846C
-+
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x530) // 8530
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x534) // 8534
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x538) // 8538
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x53C) // 853C
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL0_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x550) // 8550
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x554) // 8554
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x558) // 8558
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x55c) // 855C
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x560) // 8560
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x564) // 8564
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x568) // 8568
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x56c) // 856C
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL0_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x570) // 8570
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x574) // 8574
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x578) // 8578
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x57c) // 857C
-+//MCU DMA
-+//#define WF_WFDMA_MCU_DMA0_BASE                                 0x02000
-+#define WF_WFDMA_MCU_DMA0_BASE                                 0x54000000
-+
-+#define WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR                    (WF_WFDMA_MCU_DMA0_BASE + 0x200) // 0200
-+#define WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR                    (WF_WFDMA_MCU_DMA0_BASE + 0X204) // 0204
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR                   (WF_WFDMA_MCU_DMA0_BASE + 0x208) // 0208
-+
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR       WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK       0x00000008                // RX_DMA_BUSY[3]
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT       3
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_ADDR         WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK         0x00000004                // RX_DMA_EN[2]
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT         2
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR       WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK       0x00000002                // TX_DMA_BUSY[1]
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT       1
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_ADDR         WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK         0x00000001                // TX_DMA_EN[0]
-+#define WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT         0
-+
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x300) // 0300
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x304) // 0304
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x308) // 0308
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x30c) // 030C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x310) // 0310
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x314) // 0314
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x318) // 0318
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x31c) // 031C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x320) // 0320
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x324) // 0324
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x328) // 0328
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x32c) // 032C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x330) // 0330
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x334) // 0334
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x338) // 0338
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x33c) // 033C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x340) // 0340
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x344) // 0344
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x348) // 0348
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x34c) // 034C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x350) // 0350
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x354) // 0354
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x358) // 0358
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x35c) // 035C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x360) // 0360
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x364) // 0364
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x368) // 0368
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x36c) // 036C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x370) // 0370
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x374) // 0374
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x378) // 0378
-+#define WF_WFDMA_MCU_DMA0_WPDMA_TX_RING7_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x37c) // 037C
-+
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x500) // 0500
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x504) // 0504
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x508) // 0508
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x50c) // 050C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x510) // 0510
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x514) // 0514
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x518) // 0518
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x51c) // 051C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x520) // 0520
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x524) // 0524
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x528) // 0528
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x52C) // 052C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x530) // 0530
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x534) // 0534
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x538) // 0538
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x53C) // 053C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x540) // 0540
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x544) // 0544
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x548) // 0548
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x54C) // 054C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x550) // 0550
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x554) // 0554
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x558) // 0558
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x55C) // 055C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x560) // 0560
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x564) // 0564
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x568) // 0568
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x56c) // 056C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x570) // 0570
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x574) // 0574
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x578) // 0578
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x57c) // 057C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x580) // 0580
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x584) // 0584
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x588) // 0588
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x58c) // 058C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x590) // 0590
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL1_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x594) // 0594
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL2_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x598) // 0598
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL3_ADDR            (WF_WFDMA_MCU_DMA0_BASE + 0x59c) // 059C
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL0_ADDR           (WF_WFDMA_MCU_DMA0_BASE + 0x5A0) // 05A0
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL1_ADDR           (WF_WFDMA_MCU_DMA0_BASE + 0x5A4) // 05A4
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL2_ADDR           (WF_WFDMA_MCU_DMA0_BASE + 0x5A8) // 05A8
-+#define WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL3_ADDR           (WF_WFDMA_MCU_DMA0_BASE + 0x5Ac) // 05AC
-+
-+// MEM DMA
-+#define WF_WFDMA_MEM_DMA_BASE                                  0x58000000
-+
-+#define WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR                     (WF_WFDMA_MEM_DMA_BASE + 0x200) // 0200
-+#define WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR                     (WF_WFDMA_MEM_DMA_BASE + 0X204) // 0204
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR                    (WF_WFDMA_MEM_DMA_BASE + 0x208) // 0208
-+
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_ADDR        WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK        0x00000008                // RX_DMA_BUSY[3]
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT        3
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_ADDR          WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK          0x00000004                // RX_DMA_EN[2]
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT          2
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_ADDR        WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK        0x00000002                // TX_DMA_BUSY[1]
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT        1
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_ADDR          WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK          0x00000001                // TX_DMA_EN[0]
-+#define WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT          0
-+
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x300) // 0300
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x304) // 0304
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x308) // 0308
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x30c) // 030C
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x310) // 0310
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x314) // 0314
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x318) // 0318
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x31c) // 031C
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x320) // 0320
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x324) // 0324
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x328) // 0328
-+#define WF_WFDMA_MEM_DMA_WPDMA_TX_RING2_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x32c) // 032C
-+
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x500) // 0500
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x504) // 0504
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x508) // 0508
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x50c) // 050C
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x510) // 0510
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x514) // 0514
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x518) // 0518
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x51c) // 051C
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL0_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x520) // 0520
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL1_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x524) // 0524
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL2_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x528) // 0528
-+#define WF_WFDMA_MEM_DMA_WPDMA_RX_RING2_CTRL3_ADDR             (WF_WFDMA_MEM_DMA_BASE + 0x52C) // 052C
-+
-+/* MIB */
-+#define WF_UMIB_TOP_BASE                                       0x820cd000
-+#define BN0_WF_MIB_TOP_BASE                                    0x820ed000
-+#define BN1_WF_MIB_TOP_BASE                                    0x820fd000
-+#define IP1_BN0_WF_MIB_TOP_BASE                                0x830ed000
-+
-+#define WF_UMIB_TOP_B0BROCR_ADDR                               (WF_UMIB_TOP_BASE + 0x484) // D484
-+#define WF_UMIB_TOP_B0BRBCR_ADDR                               (WF_UMIB_TOP_BASE + 0x4D4) // D4D4
-+#define WF_UMIB_TOP_B0BRDCR_ADDR                               (WF_UMIB_TOP_BASE + 0x524) // D524
-+#define WF_UMIB_TOP_B1BROCR_ADDR                               (WF_UMIB_TOP_BASE + 0x5E8) // D5E8
-+#define WF_UMIB_TOP_B2BROCR_ADDR                               (WF_UMIB_TOP_BASE + 0x74C) // D74C
-+
-+#define BN0_WF_MIB_TOP_M0SCR0_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x000) // D000
-+#define BN0_WF_MIB_TOP_M0SDR6_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x020) // D020
-+#define BN0_WF_MIB_TOP_M0SDR9_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x024) // D024
-+#define BN0_WF_MIB_TOP_M0SDR18_ADDR                            (BN0_WF_MIB_TOP_BASE + 0x030) // D030
-+#define BN0_WF_MIB_TOP_BTOCR_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x400) // D400
-+#define BN0_WF_MIB_TOP_BTBCR_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x450) // D450
-+#define BN0_WF_MIB_TOP_BTDCR_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x590) // D590
-+#define BN0_WF_MIB_TOP_BTCR_ADDR                               (BN0_WF_MIB_TOP_BASE + 0x5A0) // D5A0
-+#define BN0_WF_MIB_TOP_RVSR0_ADDR                              (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RVSR0))
-+
-+#define BN0_WF_MIB_TOP_TSCR0_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6B0) // D6B0
-+#define BN0_WF_MIB_TOP_TSCR3_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6BC) // D6BC
-+#define BN0_WF_MIB_TOP_TSCR4_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6C0) // D6C0
-+#define BN0_WF_MIB_TOP_TSCR5_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6C4) // D6C4
-+#define BN0_WF_MIB_TOP_TSCR6_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6C8) // D6C8
-+#define BN0_WF_MIB_TOP_TSCR7_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6D0) // D6D0
-+#define BN0_WF_MIB_TOP_TSCR8_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6CC) // D6CC
-+
-+#define BN0_WF_MIB_TOP_TBCR0_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6EC) // D6EC
-+#define BN0_WF_MIB_TOP_TBCR1_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6F0) // D6F0
-+#define BN0_WF_MIB_TOP_TBCR2_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6F4) // D6F4
-+#define BN0_WF_MIB_TOP_TBCR3_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6F8) // D6F8
-+#define BN0_WF_MIB_TOP_TBCR4_ADDR                              (BN0_WF_MIB_TOP_BASE + 0x6FC) // D6FC
-+
-+#define BN0_WF_MIB_TOP_TDRCR0_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TDRCR0))
-+#define BN0_WF_MIB_TOP_TDRCR1_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TDRCR1))
-+#define BN0_WF_MIB_TOP_TDRCR2_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TDRCR2))
-+#define BN0_WF_MIB_TOP_TDRCR3_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TDRCR3))
-+#define BN0_WF_MIB_TOP_TDRCR4_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TDRCR4))
-+
-+#define BN0_WF_MIB_TOP_BTSCR0_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x5E0) // D5E0
-+#define BN0_WF_MIB_TOP_BTSCR1_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x5F0) // D5F0
-+#define BN0_WF_MIB_TOP_BTSCR2_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x600) // D600
-+#define BN0_WF_MIB_TOP_BTSCR3_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x610) // D610
-+#define BN0_WF_MIB_TOP_BTSCR4_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x620) // D620
-+#define BN0_WF_MIB_TOP_BTSCR5_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_BTSCR5))
-+#define BN0_WF_MIB_TOP_BTSCR6_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_BTSCR6))
-+
-+#define BN0_WF_MIB_TOP_RSCR1_ADDR                              (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR1))
-+#define BN0_WF_MIB_TOP_BSCR2_ADDR                              (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_BSCR2))
-+#define BN0_WF_MIB_TOP_TSCR18_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TSCR18))
-+
-+#define BN0_WF_MIB_TOP_MSR0_ADDR                               (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_MSR0))
-+#define BN0_WF_MIB_TOP_MSR1_ADDR                               (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_MSR1))
-+#define BN0_WF_MIB_TOP_MSR2_ADDR                               (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_MSR2))
-+#define BN0_WF_MIB_TOP_MCTR5_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_MCTR5))
-+#define BN0_WF_MIB_TOP_MCTR6_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_MCTR6))
-+
-+#define BN0_WF_MIB_TOP_RSCR26_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_RSCR26))
-+#define BN0_WF_MIB_TOP_RSCR27_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR27))
-+#define BN0_WF_MIB_TOP_RSCR28_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR28))
-+#define BN0_WF_MIB_TOP_RSCR31_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR31))
-+#define BN0_WF_MIB_TOP_RSCR33_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR33))
-+#define BN0_WF_MIB_TOP_RSCR35_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR35))
-+#define BN0_WF_MIB_TOP_RSCR36_ADDR                             (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_RSCR36))
-+
-+#define BN0_WF_MIB_TOP_TSCR3_AMPDU_MPDU_COUNT_MASK             0xFFFFFFFF                // AMPDU_MPDU_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_TSCR4_AMPDU_ACKED_COUNT_MASK            0xFFFFFFFF                // AMPDU_ACKED_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK          0x0000FFFF                // CHANNEL_IDLE_COUNT[15..0]
-+#define BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK             0x00FFFFFF                // CCA_NAV_TX_TIME[23..0]
-+#define BN0_WF_MIB_TOP_RSCR26_RX_MDRDY_COUNT_MASK              0xFFFFFFFF                // RX_MDRDY_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_MSR0_CCK_MDRDY_TIME_MASK                0xFFFFFFFF                // CCK_MDRDY_TIME[31..0]
-+#define BN0_WF_MIB_TOP_MSR1_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK  0xFFFFFFFF                // OFDM_LG_MIXED_VHT_MDRDY_TIME[31..0]
-+#define BN0_WF_MIB_TOP_MSR2_OFDM_GREEN_MDRDY_TIME_MASK         0xFFFFFFFF                // OFDM_GREEN_MDRDY_TIME[31..0]
-+#define BN0_WF_MIB_TOP_MCTR5_P_CCA_TIME_MASK                   0xFFFFFFFF                // P_CCA_TIME[31..0]
-+#define BN0_WF_MIB_TOP_MCTR6_S_CCA_TIME_MASK                   0xFFFFFFFF                // S_CCA_TIME[31..0]
-+#define BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK                  0x00FFFFFF                // P_ED_TIME[23..0]
-+#define BN0_WF_MIB_TOP_TSCR18_BEACONTXCOUNT_MASK               0xFFFFFFFF                // BEACONTXCOUNT[31..0]
-+#define BN0_WF_MIB_TOP_TBCR0_TX_20MHZ_CNT_MASK                 0xFFFFFFFF                // TX_20MHZ_CNT[31..0]
-+#define BN0_WF_MIB_TOP_TBCR1_TX_40MHZ_CNT_MASK                 0xFFFFFFFF                // TX_40MHZ_CNT[31..0]
-+#define BN0_WF_MIB_TOP_TBCR2_TX_80MHZ_CNT_MASK                 0xFFFFFFFF                // TX_80MHZ_CNT[31..0]
-+#define BN0_WF_MIB_TOP_TBCR3_TX_160MHZ_CNT_MASK                0xFFFFFFFF                // TX_160MHZ_CNT[31..0]
-+#define BN0_WF_MIB_TOP_TBCR4_TX_320MHZ_CNT_MASK                0xFFFFFFFF                // TX_320MHZ_CNT[31..0]
-+#define BN0_WF_MIB_TOP_BSCR2_MUBF_TX_COUNT_MASK                0xFFFFFFFF                // MUBF_TX_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_RVSR0_VEC_MISS_COUNT_MASK               0xFFFFFFFF                // VEC_MISS_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_RSCR35_DELIMITER_FAIL_COUNT_MASK        0xFFFFFFFF                // DELIMITER_FAIL_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_RSCR1_RX_FCS_ERROR_COUNT_MASK           0xFFFFFFFF                // RX_FCS_ERROR_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_RSCR33_RX_FIFO_FULL_COUNT_MASK          0xFFFFFFFF                // RX_FIFO_FULL_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_RSCR36_RX_LEN_MISMATCH_MASK             0xFFFFFFFF                // RX_LEN_MISMATCH[31..0]
-+#define BN0_WF_MIB_TOP_RSCR31_RX_MPDU_COUNT_MASK               0xFFFFFFFF                // RX_MPDU_COUNT[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR5_RTSTXCOUNTn_MASK                 0xFFFFFFFF                // RTSTXCOUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR6_RTSRETRYCOUNTn_MASK              0xFFFFFFFF                // RTSRETRYCOUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR0_BAMISSCOUNTn_MASK                0xFFFFFFFF                // BAMISSCOUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR1_ACKFAILCOUNTn_MASK               0xFFFFFFFF                // ACKFAILCOUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR2_FRAMERETRYCOUNTn_MASK            0xFFFFFFFF                // FRAMERETRYCOUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR3_FRAMERETRY2COUNTn_MASK           0xFFFFFFFF                // FRAMERETRY2COUNTn[31..0]
-+#define BN0_WF_MIB_TOP_BTSCR4_FRAMERETRY3COUNTn_MASK           0xFFFFFFFF                // FRAMERETRY3COUNTn[31..0]
-+#define BN0_WF_MIB_TOP_TRARC0_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0B0) // D0B0
-+#define BN0_WF_MIB_TOP_TRARC1_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0B4) // D0B4
-+#define BN0_WF_MIB_TOP_TRARC2_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0B8) // D0B8
-+#define BN0_WF_MIB_TOP_TRARC3_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0BC) // D0BC
-+#define BN0_WF_MIB_TOP_TRARC4_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0C0) // D0C0
-+#define BN0_WF_MIB_TOP_TRARC5_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0C4) // D0C4
-+#define BN0_WF_MIB_TOP_TRARC6_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0C8) // D0C8
-+#define BN0_WF_MIB_TOP_TRARC7_ADDR                             (BN0_WF_MIB_TOP_BASE + 0x0CC) // D0CC
-+
-+#define BN0_WF_MIB_TOP_TRDR0_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR0))
-+#define BN0_WF_MIB_TOP_TRDR1_ADDR                              (BN0_WF_MIB_TOP_BASE + __OFFS(MIB_TRDR1))
-+#define BN0_WF_MIB_TOP_TRDR2_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR2))
-+#define BN0_WF_MIB_TOP_TRDR3_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR3))
-+#define BN0_WF_MIB_TOP_TRDR4_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR4))
-+#define BN0_WF_MIB_TOP_TRDR5_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR5))
-+#define BN0_WF_MIB_TOP_TRDR6_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR6))
-+#define BN0_WF_MIB_TOP_TRDR7_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR7))
-+#define BN0_WF_MIB_TOP_TRDR8_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR8))
-+#define BN0_WF_MIB_TOP_TRDR9_ADDR                              (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR9))
-+#define BN0_WF_MIB_TOP_TRDR10_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR10))
-+#define BN0_WF_MIB_TOP_TRDR11_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR11))
-+#define BN0_WF_MIB_TOP_TRDR12_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR12))
-+#define BN0_WF_MIB_TOP_TRDR13_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR13))
-+#define BN0_WF_MIB_TOP_TRDR14_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR14))
-+#define BN0_WF_MIB_TOP_TRDR15_ADDR                             (BN0_WF_MIB_TOP_BASE + __DBG_OFFS(MIB_TRDR15))
-+
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_ADDR              BN0_WF_MIB_TOP_TRARC0_ADDR
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_MASK              0x03FF0000                // AGG_RANG_SEL_1[25..16]
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_SHFT              16
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_ADDR              BN0_WF_MIB_TOP_TRARC0_ADDR
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_MASK              0x000003FF                // AGG_RANG_SEL_0[9..0]
-+#define BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_SHFT              0
-+
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_ADDR              BN0_WF_MIB_TOP_TRARC1_ADDR
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_MASK              0x03FF0000                // AGG_RANG_SEL_3[25..16]
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_SHFT              16
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_ADDR              BN0_WF_MIB_TOP_TRARC1_ADDR
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_MASK              0x000003FF                // AGG_RANG_SEL_2[9..0]
-+#define BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_SHFT              0
-+
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_ADDR              BN0_WF_MIB_TOP_TRARC2_ADDR
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_MASK              0x03FF0000                // AGG_RANG_SEL_5[25..16]
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_SHFT              16
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_ADDR              BN0_WF_MIB_TOP_TRARC2_ADDR
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_MASK              0x000003FF                // AGG_RANG_SEL_4[9..0]
-+#define BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_SHFT              0
-+
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_ADDR              BN0_WF_MIB_TOP_TRARC3_ADDR
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_MASK              0x03FF0000                // AGG_RANG_SEL_7[25..16]
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_SHFT              16
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_ADDR              BN0_WF_MIB_TOP_TRARC3_ADDR
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_MASK              0x000003FF                // AGG_RANG_SEL_6[9..0]
-+#define BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_SHFT              0
-+
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_ADDR              BN0_WF_MIB_TOP_TRARC4_ADDR
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_MASK              0x03FF0000                // AGG_RANG_SEL_9[25..16]
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_SHFT              16
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_ADDR              BN0_WF_MIB_TOP_TRARC4_ADDR
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_MASK              0x000003FF                // AGG_RANG_SEL_8[9..0]
-+#define BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_SHFT              0
-+
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_ADDR             BN0_WF_MIB_TOP_TRARC5_ADDR
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_MASK             0x03FF0000                // AGG_RANG_SEL_11[25..16]
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_SHFT             16
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_ADDR             BN0_WF_MIB_TOP_TRARC5_ADDR
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_MASK             0x000003FF                // AGG_RANG_SEL_10[9..0]
-+#define BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_SHFT             0
-+
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_ADDR             BN0_WF_MIB_TOP_TRARC6_ADDR
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_MASK             0x03FF0000                // AGG_RANG_SEL_13[25..16]
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_SHFT             16
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_ADDR             BN0_WF_MIB_TOP_TRARC6_ADDR
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_MASK             0x000003FF                // AGG_RANG_SEL_12[9..0]
-+#define BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_SHFT             0
-+
-+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_ADDR             BN0_WF_MIB_TOP_TRARC7_ADDR
-+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_MASK             0x000003FF                // AGG_RANG_SEL_14[9..0]
-+#define BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_SHFT             0
-+
-+/* RRO TOP */
-+#define WF_RRO_TOP_BASE                                        0xA000 /*0x820C2000 */
-+#define WF_RRO_TOP_IND_CMD_0_CTRL0_ADDR                        (WF_RRO_TOP_BASE + 0x40) // 2040
-+											//
-+/* WTBL */
-+enum mt7996_wtbl_type {
-+	WTBL_TYPE_LMAC, 	/* WTBL in LMAC */
-+	WTBL_TYPE_UMAC, 	/* WTBL in UMAC */
-+	WTBL_TYPE_KEY,		/* Key Table */
-+	MAX_NUM_WTBL_TYPE
-+};
-+
-+struct berse_wtbl_parse {
-+	u8 *name;
-+	u32 mask;
-+	u32 shift;
-+	u8 new_line;
-+};
-+
-+enum muar_idx {
-+	MUAR_INDEX_OWN_MAC_ADDR_0 = 0,
-+	MUAR_INDEX_OWN_MAC_ADDR_1,
-+	MUAR_INDEX_OWN_MAC_ADDR_2,
-+	MUAR_INDEX_OWN_MAC_ADDR_3,
-+	MUAR_INDEX_OWN_MAC_ADDR_4,
-+	MUAR_INDEX_OWN_MAC_ADDR_BC_MC = 0xE,
-+	MUAR_INDEX_UNMATCHED = 0xF,
-+	MUAR_INDEX_OWN_MAC_ADDR_11 = 0x11,
-+	MUAR_INDEX_OWN_MAC_ADDR_12,
-+	MUAR_INDEX_OWN_MAC_ADDR_13,
-+	MUAR_INDEX_OWN_MAC_ADDR_14,
-+	MUAR_INDEX_OWN_MAC_ADDR_15,
-+	MUAR_INDEX_OWN_MAC_ADDR_16,
-+	MUAR_INDEX_OWN_MAC_ADDR_17,
-+	MUAR_INDEX_OWN_MAC_ADDR_18,
-+	MUAR_INDEX_OWN_MAC_ADDR_19,
-+	MUAR_INDEX_OWN_MAC_ADDR_1A,
-+	MUAR_INDEX_OWN_MAC_ADDR_1B,
-+	MUAR_INDEX_OWN_MAC_ADDR_1C,
-+	MUAR_INDEX_OWN_MAC_ADDR_1D,
-+	MUAR_INDEX_OWN_MAC_ADDR_1E,
-+	MUAR_INDEX_OWN_MAC_ADDR_1F,
-+	MUAR_INDEX_OWN_MAC_ADDR_20,
-+	MUAR_INDEX_OWN_MAC_ADDR_21,
-+	MUAR_INDEX_OWN_MAC_ADDR_22,
-+	MUAR_INDEX_OWN_MAC_ADDR_23,
-+	MUAR_INDEX_OWN_MAC_ADDR_24,
-+	MUAR_INDEX_OWN_MAC_ADDR_25,
-+	MUAR_INDEX_OWN_MAC_ADDR_26,
-+	MUAR_INDEX_OWN_MAC_ADDR_27,
-+	MUAR_INDEX_OWN_MAC_ADDR_28,
-+	MUAR_INDEX_OWN_MAC_ADDR_29,
-+	MUAR_INDEX_OWN_MAC_ADDR_2A,
-+	MUAR_INDEX_OWN_MAC_ADDR_2B,
-+	MUAR_INDEX_OWN_MAC_ADDR_2C,
-+	MUAR_INDEX_OWN_MAC_ADDR_2D,
-+	MUAR_INDEX_OWN_MAC_ADDR_2E,
-+	MUAR_INDEX_OWN_MAC_ADDR_2F
-+};
-+
-+enum cipher_suit {
-+	IGTK_CIPHER_SUIT_NONE = 0,
-+	IGTK_CIPHER_SUIT_BIP,
-+	IGTK_CIPHER_SUIT_BIP_256
-+};
-+
-+#define LWTBL_LEN_IN_DW			36
-+#define UWTBL_LEN_IN_DW			16
-+
-+#define MT_DBG_WTBL_BASE		0x820D8000
-+
-+#define MT_DBG_WTBLON_TOP_BASE		0x820d4000
-+#define MT_DBG_WTBLON_TOP_WDUCR_ADDR	(MT_DBG_WTBLON_TOP_BASE + 0x0370) // 4370
-+#define MT_DBG_WTBLON_TOP_WDUCR_GROUP	GENMASK(4, 0)
-+
-+#define MT_DBG_UWTBL_TOP_BASE		0x820c4000
-+#define MT_DBG_UWTBL_TOP_WDUCR_ADDR	(MT_DBG_UWTBL_TOP_BASE + 0x0104) // 4104
-+#define MT_DBG_UWTBL_TOP_WDUCR_GROUP	GENMASK(5, 0)
-+#define MT_DBG_UWTBL_TOP_WDUCR_TARGET	BIT(31)
-+
-+#define LWTBL_IDX2BASE_ID		GENMASK(14, 8)
-+#define LWTBL_IDX2BASE_DW		GENMASK(7, 2)
-+#define LWTBL_IDX2BASE(_id, _dw)	(MT_DBG_WTBL_BASE | \
-+					FIELD_PREP(LWTBL_IDX2BASE_ID, _id) | \
-+					FIELD_PREP(LWTBL_IDX2BASE_DW, _dw))
-+
-+#define UWTBL_IDX2BASE_ID		GENMASK(12, 6)
-+#define UWTBL_IDX2BASE_DW		GENMASK(5, 2)
-+#define UWTBL_IDX2BASE(_id, _dw)	(MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
-+					FIELD_PREP(UWTBL_IDX2BASE_ID, _id) | \
-+					FIELD_PREP(UWTBL_IDX2BASE_DW, _dw))
-+
-+#define KEYTBL_IDX2BASE_KEY		GENMASK(12, 6)
-+#define KEYTBL_IDX2BASE_DW		GENMASK(5, 2)
-+#define KEYTBL_IDX2BASE(_key, _dw)	(MT_DBG_UWTBL_TOP_BASE | 0x2000 | \
-+					FIELD_PREP(KEYTBL_IDX2BASE_KEY, _key) | \
-+					FIELD_PREP(KEYTBL_IDX2BASE_DW, _dw))
-+
-+// UMAC WTBL
-+// DW0
-+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__DW                         0
-+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__ADDR                       0
-+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__MASK                       0x0000ffff // 15- 0
-+#define WF_UWTBL_PEER_MLD_ADDRESS_47_32__SHIFT                      0
-+#define WF_UWTBL_OWN_MLD_ID_DW                                      0
-+#define WF_UWTBL_OWN_MLD_ID_ADDR                                    0
-+#define WF_UWTBL_OWN_MLD_ID_MASK                                    0x003f0000 // 21-16
-+#define WF_UWTBL_OWN_MLD_ID_SHIFT                                   16
-+// DW1
-+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__DW                          1
-+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__ADDR                        4
-+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__MASK                        0xffffffff // 31- 0
-+#define WF_UWTBL_PEER_MLD_ADDRESS_31_0__SHIFT                       0
-+// DW2
-+#define WF_UWTBL_PN_31_0__DW                                        2
-+#define WF_UWTBL_PN_31_0__ADDR                                      8
-+#define WF_UWTBL_PN_31_0__MASK                                      0xffffffff // 31- 0
-+#define WF_UWTBL_PN_31_0__SHIFT                                     0
-+// DW3
-+#define WF_UWTBL_PN_47_32__DW                                       3
-+#define WF_UWTBL_PN_47_32__ADDR                                     12
-+#define WF_UWTBL_PN_47_32__MASK                                     0x0000ffff // 15- 0
-+#define WF_UWTBL_PN_47_32__SHIFT                                    0
-+#define WF_UWTBL_COM_SN_DW                                          3
-+#define WF_UWTBL_COM_SN_ADDR                                        12
-+#define WF_UWTBL_COM_SN_MASK                                        0x0fff0000 // 27-16
-+#define WF_UWTBL_COM_SN_SHIFT                                       16
-+// DW4
-+#define WF_UWTBL_TID0_SN_DW                                         4
-+#define WF_UWTBL_TID0_SN_ADDR                                       16
-+#define WF_UWTBL_TID0_SN_MASK                                       0x00000fff // 11- 0
-+#define WF_UWTBL_TID0_SN_SHIFT                                      0
-+#define WF_UWTBL_RX_BIPN_31_0__DW                                   4
-+#define WF_UWTBL_RX_BIPN_31_0__ADDR                                 16
-+#define WF_UWTBL_RX_BIPN_31_0__MASK                                 0xffffffff // 31- 0
-+#define WF_UWTBL_RX_BIPN_31_0__SHIFT                                0
-+#define WF_UWTBL_TID1_SN_DW                                         4
-+#define WF_UWTBL_TID1_SN_ADDR                                       16
-+#define WF_UWTBL_TID1_SN_MASK                                       0x00fff000 // 23-12
-+#define WF_UWTBL_TID1_SN_SHIFT                                      12
-+#define WF_UWTBL_TID2_SN_7_0__DW                                    4
-+#define WF_UWTBL_TID2_SN_7_0__ADDR                                  16
-+#define WF_UWTBL_TID2_SN_7_0__MASK                                  0xff000000 // 31-24
-+#define WF_UWTBL_TID2_SN_7_0__SHIFT                                 24
-+// DW5
-+#define WF_UWTBL_TID2_SN_11_8__DW                                   5
-+#define WF_UWTBL_TID2_SN_11_8__ADDR                                 20
-+#define WF_UWTBL_TID2_SN_11_8__MASK                                 0x0000000f //  3- 0
-+#define WF_UWTBL_TID2_SN_11_8__SHIFT                                0
-+#define WF_UWTBL_RX_BIPN_47_32__DW                                  5
-+#define WF_UWTBL_RX_BIPN_47_32__ADDR                                20
-+#define WF_UWTBL_RX_BIPN_47_32__MASK                                0x0000ffff // 15- 0
-+#define WF_UWTBL_RX_BIPN_47_32__SHIFT                               0
-+#define WF_UWTBL_TID3_SN_DW                                         5
-+#define WF_UWTBL_TID3_SN_ADDR                                       20
-+#define WF_UWTBL_TID3_SN_MASK                                       0x0000fff0 // 15- 4
-+#define WF_UWTBL_TID3_SN_SHIFT                                      4
-+#define WF_UWTBL_TID4_SN_DW                                         5
-+#define WF_UWTBL_TID4_SN_ADDR                                       20
-+#define WF_UWTBL_TID4_SN_MASK                                       0x0fff0000 // 27-16
-+#define WF_UWTBL_TID4_SN_SHIFT                                      16
-+#define WF_UWTBL_TID5_SN_3_0__DW                                    5
-+#define WF_UWTBL_TID5_SN_3_0__ADDR                                  20
-+#define WF_UWTBL_TID5_SN_3_0__MASK                                  0xf0000000 // 31-28
-+#define WF_UWTBL_TID5_SN_3_0__SHIFT                                 28
-+// DW6
-+#define WF_UWTBL_TID5_SN_11_4__DW                                   6
-+#define WF_UWTBL_TID5_SN_11_4__ADDR                                 24
-+#define WF_UWTBL_TID5_SN_11_4__MASK                                 0x000000ff //  7- 0
-+#define WF_UWTBL_TID5_SN_11_4__SHIFT                                0
-+#define WF_UWTBL_KEY_LOC2_DW                                        6
-+#define WF_UWTBL_KEY_LOC2_ADDR                                      24
-+#define WF_UWTBL_KEY_LOC2_MASK                                      0x00001fff // 12- 0
-+#define WF_UWTBL_KEY_LOC2_SHIFT                                     0
-+#define WF_UWTBL_TID6_SN_DW                                         6
-+#define WF_UWTBL_TID6_SN_ADDR                                       24
-+#define WF_UWTBL_TID6_SN_MASK                                       0x000fff00 // 19- 8
-+#define WF_UWTBL_TID6_SN_SHIFT                                      8
-+#define WF_UWTBL_TID7_SN_DW                                         6
-+#define WF_UWTBL_TID7_SN_ADDR                                       24
-+#define WF_UWTBL_TID7_SN_MASK                                       0xfff00000 // 31-20
-+#define WF_UWTBL_TID7_SN_SHIFT                                      20
-+// DW7
-+#define WF_UWTBL_KEY_LOC0_DW                                        7
-+#define WF_UWTBL_KEY_LOC0_ADDR                                      28
-+#define WF_UWTBL_KEY_LOC0_MASK                                      0x00001fff // 12- 0
-+#define WF_UWTBL_KEY_LOC0_SHIFT                                     0
-+#define WF_UWTBL_KEY_LOC1_DW                                        7
-+#define WF_UWTBL_KEY_LOC1_ADDR                                      28
-+#define WF_UWTBL_KEY_LOC1_MASK                                      0x1fff0000 // 28-16
-+#define WF_UWTBL_KEY_LOC1_SHIFT                                     16
-+// DW8
-+#define WF_UWTBL_AMSDU_CFG_DW                                       8
-+#define WF_UWTBL_AMSDU_CFG_ADDR                                     32
-+#define WF_UWTBL_AMSDU_CFG_MASK                                     0x00000fff // 11- 0
-+#define WF_UWTBL_AMSDU_CFG_SHIFT                                    0
-+#define WF_UWTBL_SEC_ADDR_MODE_DW                                   8
-+#define WF_UWTBL_SEC_ADDR_MODE_ADDR                                 32
-+#define WF_UWTBL_SEC_ADDR_MODE_MASK                                 0x00300000 // 21-20
-+#define WF_UWTBL_SEC_ADDR_MODE_SHIFT                                20
-+#define WF_UWTBL_WMM_Q_DW                                           8
-+#define WF_UWTBL_WMM_Q_ADDR                                         32
-+#define WF_UWTBL_WMM_Q_MASK                                         0x06000000 // 26-25
-+#define WF_UWTBL_WMM_Q_SHIFT                                        25
-+#define WF_UWTBL_QOS_DW                                             8
-+#define WF_UWTBL_QOS_ADDR                                           32
-+#define WF_UWTBL_QOS_MASK                                           0x08000000 // 27-27
-+#define WF_UWTBL_QOS_SHIFT                                          27
-+#define WF_UWTBL_HT_DW                                              8
-+#define WF_UWTBL_HT_ADDR                                            32
-+#define WF_UWTBL_HT_MASK                                            0x10000000 // 28-28
-+#define WF_UWTBL_HT_SHIFT                                           28
-+#define WF_UWTBL_HDRT_MODE_DW                                       8
-+#define WF_UWTBL_HDRT_MODE_ADDR                                     32
-+#define WF_UWTBL_HDRT_MODE_MASK                                     0x20000000 // 29-29
-+#define WF_UWTBL_HDRT_MODE_SHIFT                                    29
-+// DW9
-+#define WF_UWTBL_RELATED_IDX0_DW                                    9
-+#define WF_UWTBL_RELATED_IDX0_ADDR                                  36
-+#define WF_UWTBL_RELATED_IDX0_MASK                                  0x00000fff // 11- 0
-+#define WF_UWTBL_RELATED_IDX0_SHIFT                                 0
-+#define WF_UWTBL_RELATED_BAND0_DW                                   9
-+#define WF_UWTBL_RELATED_BAND0_ADDR                                 36
-+#define WF_UWTBL_RELATED_BAND0_MASK                                 0x00003000 // 13-12
-+#define WF_UWTBL_RELATED_BAND0_SHIFT                                12
-+#define WF_UWTBL_PRIMARY_MLD_BAND_DW                                9
-+#define WF_UWTBL_PRIMARY_MLD_BAND_ADDR                              36
-+#define WF_UWTBL_PRIMARY_MLD_BAND_MASK                              0x0000c000 // 15-14
-+#define WF_UWTBL_PRIMARY_MLD_BAND_SHIFT                             14
-+#define WF_UWTBL_RELATED_IDX1_DW                                    9
-+#define WF_UWTBL_RELATED_IDX1_ADDR                                  36
-+#define WF_UWTBL_RELATED_IDX1_MASK                                  0x0fff0000 // 27-16
-+#define WF_UWTBL_RELATED_IDX1_SHIFT                                 16
-+#define WF_UWTBL_RELATED_BAND1_DW                                   9
-+#define WF_UWTBL_RELATED_BAND1_ADDR                                 36
-+#define WF_UWTBL_RELATED_BAND1_MASK                                 0x30000000 // 29-28
-+#define WF_UWTBL_RELATED_BAND1_SHIFT                                28
-+#define WF_UWTBL_SECONDARY_MLD_BAND_DW                              9
-+#define WF_UWTBL_SECONDARY_MLD_BAND_ADDR                            36
-+#define WF_UWTBL_SECONDARY_MLD_BAND_MASK                            0xc0000000 // 31-30
-+#define WF_UWTBL_SECONDARY_MLD_BAND_SHIFT                           30
-+
-+/* LMAC WTBL */
-+// DW0
-+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__DW                        0
-+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__ADDR                      0
-+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_PEER_LINK_ADDRESS_47_32__SHIFT                     0
-+#define WF_LWTBL_MUAR_DW                                            0
-+#define WF_LWTBL_MUAR_ADDR                                          0
-+#define WF_LWTBL_MUAR_MASK \
-+	0x003f0000 // 21-16
-+#define WF_LWTBL_MUAR_SHIFT                                         16
-+#define WF_LWTBL_RCA1_DW                                            0
-+#define WF_LWTBL_RCA1_ADDR                                          0
-+#define WF_LWTBL_RCA1_MASK \
-+	0x00400000 // 22-22
-+#define WF_LWTBL_RCA1_SHIFT                                         22
-+#define WF_LWTBL_KID_DW                                             0
-+#define WF_LWTBL_KID_ADDR                                           0
-+#define WF_LWTBL_KID_MASK \
-+	0x01800000 // 24-23
-+#define WF_LWTBL_KID_SHIFT                                          23
-+#define WF_LWTBL_RCID_DW                                            0
-+#define WF_LWTBL_RCID_ADDR                                          0
-+#define WF_LWTBL_RCID_MASK \
-+	0x02000000 // 25-25
-+#define WF_LWTBL_RCID_SHIFT                                         25
-+#define WF_LWTBL_BAND_DW                                            0
-+#define WF_LWTBL_BAND_ADDR                                          0
-+#define WF_LWTBL_BAND_MASK \
-+	0x0c000000 // 27-26
-+#define WF_LWTBL_BAND_SHIFT                                         26
-+#define WF_LWTBL_RV_DW                                              0
-+#define WF_LWTBL_RV_ADDR                                            0
-+#define WF_LWTBL_RV_MASK \
-+	0x10000000 // 28-28
-+#define WF_LWTBL_RV_SHIFT                                           28
-+#define WF_LWTBL_RCA2_DW                                            0
-+#define WF_LWTBL_RCA2_ADDR                                          0
-+#define WF_LWTBL_RCA2_MASK \
-+	0x20000000 // 29-29
-+#define WF_LWTBL_RCA2_SHIFT                                         29
-+#define WF_LWTBL_WPI_FLAG_DW                                        0
-+#define WF_LWTBL_WPI_FLAG_ADDR                                      0
-+#define WF_LWTBL_WPI_FLAG_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_WPI_FLAG_SHIFT                                     30
-+// DW1
-+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__DW                         1
-+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__ADDR                       4
-+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__MASK \
-+	0xffffffff // 31- 0
-+#define WF_LWTBL_PEER_LINK_ADDRESS_31_0__SHIFT                      0
-+// DW2
-+#define WF_LWTBL_AID_DW                                             2
-+#define WF_LWTBL_AID_ADDR                                           8
-+#define WF_LWTBL_AID_MASK \
-+	0x00000fff // 11- 0
-+#define WF_LWTBL_AID_SHIFT                                          0
-+#define WF_LWTBL_GID_SU_DW                                          2
-+#define WF_LWTBL_GID_SU_ADDR                                        8
-+#define WF_LWTBL_GID_SU_MASK \
-+	0x00001000 // 12-12
-+#define WF_LWTBL_GID_SU_SHIFT                                       12
-+#define WF_LWTBL_SPP_EN_DW                                          2
-+#define WF_LWTBL_SPP_EN_ADDR                                        8
-+#define WF_LWTBL_SPP_EN_MASK \
-+	0x00002000 // 13-13
-+#define WF_LWTBL_SPP_EN_SHIFT                                       13
-+#define WF_LWTBL_WPI_EVEN_DW                                        2
-+#define WF_LWTBL_WPI_EVEN_ADDR                                      8
-+#define WF_LWTBL_WPI_EVEN_MASK \
-+	0x00004000 // 14-14
-+#define WF_LWTBL_WPI_EVEN_SHIFT                                     14
-+#define WF_LWTBL_AAD_OM_DW                                          2
-+#define WF_LWTBL_AAD_OM_ADDR                                        8
-+#define WF_LWTBL_AAD_OM_MASK \
-+	0x00008000 // 15-15
-+#define WF_LWTBL_AAD_OM_SHIFT                                       15
-+/* kite DW2 field bit 13-14 */
-+#define WF_LWTBL_DUAL_PTEC_EN_DW                                    2
-+#define WF_LWTBL_DUAL_PTEC_EN_ADDR                                  8
-+#define WF_LWTBL_DUAL_PTEC_EN_MASK \
-+	0x00002000 // 13-13
-+#define WF_LWTBL_DUAL_PTEC_EN_SHIFT                                 13
-+#define WF_LWTBL_DUAL_CTS_CAP_DW                                    2
-+#define WF_LWTBL_DUAL_CTS_CAP_ADDR                                  8
-+#define WF_LWTBL_DUAL_CTS_CAP_MASK \
-+	0x00004000 // 14-14
-+#define WF_LWTBL_DUAL_CTS_CAP_SHIFT                                 14
-+#define WF_LWTBL_CIPHER_SUIT_PGTK_DW                                2
-+#define WF_LWTBL_CIPHER_SUIT_PGTK_ADDR                              8
-+#define WF_LWTBL_CIPHER_SUIT_PGTK_MASK \
-+	0x001f0000 // 20-16
-+#define WF_LWTBL_CIPHER_SUIT_PGTK_SHIFT                             16
-+#define WF_LWTBL_FD_DW                                              2
-+#define WF_LWTBL_FD_ADDR                                            8
-+#define WF_LWTBL_FD_MASK \
-+	0x00200000 // 21-21
-+#define WF_LWTBL_FD_SHIFT                                           21
-+#define WF_LWTBL_TD_DW                                              2
-+#define WF_LWTBL_TD_ADDR                                            8
-+#define WF_LWTBL_TD_MASK \
-+	0x00400000 // 22-22
-+#define WF_LWTBL_TD_SHIFT                                           22
-+#define WF_LWTBL_SW_DW                                              2
-+#define WF_LWTBL_SW_ADDR                                            8
-+#define WF_LWTBL_SW_MASK \
-+	0x00800000 // 23-23
-+#define WF_LWTBL_SW_SHIFT                                           23
-+#define WF_LWTBL_UL_DW                                              2
-+#define WF_LWTBL_UL_ADDR                                            8
-+#define WF_LWTBL_UL_MASK \
-+	0x01000000 // 24-24
-+#define WF_LWTBL_UL_SHIFT                                           24
-+#define WF_LWTBL_TX_PS_DW                                           2
-+#define WF_LWTBL_TX_PS_ADDR                                         8
-+#define WF_LWTBL_TX_PS_MASK \
-+	0x02000000 // 25-25
-+#define WF_LWTBL_TX_PS_SHIFT                                        25
-+#define WF_LWTBL_QOS_DW                                             2
-+#define WF_LWTBL_QOS_ADDR                                           8
-+#define WF_LWTBL_QOS_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_QOS_SHIFT                                          26
-+#define WF_LWTBL_HT_DW                                              2
-+#define WF_LWTBL_HT_ADDR                                            8
-+#define WF_LWTBL_HT_MASK \
-+	0x08000000 // 27-27
-+#define WF_LWTBL_HT_SHIFT                                           27
-+#define WF_LWTBL_VHT_DW                                             2
-+#define WF_LWTBL_VHT_ADDR                                           8
-+#define WF_LWTBL_VHT_MASK \
-+	0x10000000 // 28-28
-+#define WF_LWTBL_VHT_SHIFT                                          28
-+#define WF_LWTBL_HE_DW                                              2
-+#define WF_LWTBL_HE_ADDR                                            8
-+#define WF_LWTBL_HE_MASK \
-+	0x20000000 // 29-29
-+#define WF_LWTBL_HE_SHIFT                                           29
-+#define WF_LWTBL_EHT_DW                                             2
-+#define WF_LWTBL_EHT_ADDR                                           8
-+#define WF_LWTBL_EHT_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_EHT_SHIFT                                          30
-+#define WF_LWTBL_MESH_DW                                            2
-+#define WF_LWTBL_MESH_ADDR                                          8
-+#define WF_LWTBL_MESH_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_MESH_SHIFT                                         31
-+// DW3
-+#define WF_LWTBL_WMM_Q_DW                                           3
-+#define WF_LWTBL_WMM_Q_ADDR                                         12
-+#define WF_LWTBL_WMM_Q_MASK \
-+	0x00000003 // 1- 0
-+#define WF_LWTBL_WMM_Q_SHIFT                                        0
-+#define WF_LWTBL_EHT_SIG_MCS_DW                                     3
-+#define WF_LWTBL_EHT_SIG_MCS_ADDR                                   12
-+#define WF_LWTBL_EHT_SIG_MCS_MASK \
-+	0x0000000c // 3- 2
-+#define WF_LWTBL_EHT_SIG_MCS_SHIFT                                  2
-+#define WF_LWTBL_HDRT_MODE_DW                                       3
-+#define WF_LWTBL_HDRT_MODE_ADDR                                     12
-+#define WF_LWTBL_HDRT_MODE_MASK \
-+	0x00000010 // 4- 4
-+#define WF_LWTBL_HDRT_MODE_SHIFT                                    4
-+#define WF_LWTBL_BEAM_CHG_DW                                        3
-+#define WF_LWTBL_BEAM_CHG_ADDR                                      12
-+#define WF_LWTBL_BEAM_CHG_MASK \
-+	0x00000020 // 5- 5
-+#define WF_LWTBL_BEAM_CHG_SHIFT                                     5
-+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_DW                             3
-+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_ADDR                           12
-+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_MASK \
-+	0x000000c0 // 7- 6
-+#define WF_LWTBL_EHT_LTF_SYM_NUM_OPT_SHIFT                          6
-+#define WF_LWTBL_PFMU_IDX_DW                                        3
-+#define WF_LWTBL_PFMU_IDX_ADDR                                      12
-+#define WF_LWTBL_PFMU_IDX_MASK \
-+	0x0000ff00 // 15- 8
-+#define WF_LWTBL_PFMU_IDX_SHIFT                                     8
-+#define WF_LWTBL_ULPF_IDX_DW                                        3
-+#define WF_LWTBL_ULPF_IDX_ADDR                                      12
-+#define WF_LWTBL_ULPF_IDX_MASK \
-+	0x00ff0000 // 23-16
-+#define WF_LWTBL_ULPF_IDX_SHIFT                                     16
-+#define WF_LWTBL_RIBF_DW                                            3
-+#define WF_LWTBL_RIBF_ADDR                                          12
-+#define WF_LWTBL_RIBF_MASK \
-+	0x01000000 // 24-24
-+#define WF_LWTBL_RIBF_SHIFT                                         24
-+#define WF_LWTBL_ULPF_DW                                            3
-+#define WF_LWTBL_ULPF_ADDR                                          12
-+#define WF_LWTBL_ULPF_MASK \
-+	0x02000000 // 25-25
-+#define WF_LWTBL_ULPF_SHIFT                                         25
-+#define WF_LWTBL_BYPASS_TXSMM_DW                                    3
-+#define WF_LWTBL_BYPASS_TXSMM_ADDR                                  12
-+#define WF_LWTBL_BYPASS_TXSMM_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_BYPASS_TXSMM_SHIFT                                 26
-+#define WF_LWTBL_TBF_HT_DW                                          3
-+#define WF_LWTBL_TBF_HT_ADDR                                        12
-+#define WF_LWTBL_TBF_HT_MASK \
-+	0x08000000 // 27-27
-+#define WF_LWTBL_TBF_HT_SHIFT                                       27
-+#define WF_LWTBL_TBF_VHT_DW                                         3
-+#define WF_LWTBL_TBF_VHT_ADDR                                       12
-+#define WF_LWTBL_TBF_VHT_MASK \
-+	0x10000000 // 28-28
-+#define WF_LWTBL_TBF_VHT_SHIFT                                      28
-+#define WF_LWTBL_TBF_HE_DW                                          3
-+#define WF_LWTBL_TBF_HE_ADDR                                        12
-+#define WF_LWTBL_TBF_HE_MASK \
-+	0x20000000 // 29-29
-+#define WF_LWTBL_TBF_HE_SHIFT                                       29
-+#define WF_LWTBL_TBF_EHT_DW                                         3
-+#define WF_LWTBL_TBF_EHT_ADDR                                       12
-+#define WF_LWTBL_TBF_EHT_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_TBF_EHT_SHIFT                                      30
-+#define WF_LWTBL_IGN_FBK_DW                                         3
-+#define WF_LWTBL_IGN_FBK_ADDR                                       12
-+#define WF_LWTBL_IGN_FBK_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_IGN_FBK_SHIFT                                      31
-+// DW4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE0_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE0_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE0_MASK \
-+	0x00000007 // 2- 0
-+#define WF_LWTBL_NEGOTIATED_WINSIZE0_SHIFT                          0
-+#define WF_LWTBL_NEGOTIATED_WINSIZE1_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE1_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE1_MASK \
-+	0x00000038 // 5- 3
-+#define WF_LWTBL_NEGOTIATED_WINSIZE1_SHIFT                          3
-+#define WF_LWTBL_NEGOTIATED_WINSIZE2_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE2_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE2_MASK \
-+	0x000001c0 // 8- 6
-+#define WF_LWTBL_NEGOTIATED_WINSIZE2_SHIFT                          6
-+#define WF_LWTBL_NEGOTIATED_WINSIZE3_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE3_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE3_MASK \
-+	0x00000e00 // 11- 9
-+#define WF_LWTBL_NEGOTIATED_WINSIZE3_SHIFT                          9
-+#define WF_LWTBL_NEGOTIATED_WINSIZE4_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE4_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE4_MASK \
-+	0x00007000 // 14-12
-+#define WF_LWTBL_NEGOTIATED_WINSIZE4_SHIFT                          12
-+#define WF_LWTBL_NEGOTIATED_WINSIZE5_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE5_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE5_MASK \
-+	0x00038000 // 17-15
-+#define WF_LWTBL_NEGOTIATED_WINSIZE5_SHIFT                          15
-+#define WF_LWTBL_NEGOTIATED_WINSIZE6_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE6_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE6_MASK \
-+	0x001c0000 // 20-18
-+#define WF_LWTBL_NEGOTIATED_WINSIZE6_SHIFT                          18
-+#define WF_LWTBL_NEGOTIATED_WINSIZE7_DW                             4
-+#define WF_LWTBL_NEGOTIATED_WINSIZE7_ADDR                           16
-+#define WF_LWTBL_NEGOTIATED_WINSIZE7_MASK \
-+	0x00e00000 // 23-21
-+#define WF_LWTBL_NEGOTIATED_WINSIZE7_SHIFT                          21
-+#define WF_LWTBL_PE_DW                                              4
-+#define WF_LWTBL_PE_ADDR                                            16
-+#define WF_LWTBL_PE_MASK \
-+	0x03000000 // 25-24
-+#define WF_LWTBL_PE_SHIFT                                           24
-+#define WF_LWTBL_DIS_RHTR_DW                                        4
-+#define WF_LWTBL_DIS_RHTR_ADDR                                      16
-+#define WF_LWTBL_DIS_RHTR_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_DIS_RHTR_SHIFT                                     26
-+#define WF_LWTBL_LDPC_HT_DW                                         4
-+#define WF_LWTBL_LDPC_HT_ADDR                                       16
-+#define WF_LWTBL_LDPC_HT_MASK \
-+	0x08000000 // 27-27
-+#define WF_LWTBL_LDPC_HT_SHIFT                                      27
-+#define WF_LWTBL_LDPC_VHT_DW                                        4
-+#define WF_LWTBL_LDPC_VHT_ADDR                                      16
-+#define WF_LWTBL_LDPC_VHT_MASK \
-+	0x10000000 // 28-28
-+#define WF_LWTBL_LDPC_VHT_SHIFT                                     28
-+#define WF_LWTBL_LDPC_HE_DW                                         4
-+#define WF_LWTBL_LDPC_HE_ADDR                                       16
-+#define WF_LWTBL_LDPC_HE_MASK \
-+	0x20000000 // 29-29
-+#define WF_LWTBL_LDPC_HE_SHIFT                                      29
-+#define WF_LWTBL_LDPC_EHT_DW                                        4
-+#define WF_LWTBL_LDPC_EHT_ADDR                                      16
-+#define WF_LWTBL_LDPC_EHT_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_LDPC_EHT_SHIFT                                     30
-+#define WF_LWTBL_BA_MODE_DW                                         4
-+#define WF_LWTBL_BA_MODE_ADDR                                       16
-+#define WF_LWTBL_BA_MODE_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_BA_MODE_SHIFT                                      31
-+// DW5
-+#define WF_LWTBL_AF_DW                                              5
-+#define WF_LWTBL_AF_ADDR                                            20
-+#define WF_LWTBL_AF_MASK \
-+	0x00000007 // 2- 0
-+#define WF_LWTBL_AF_MASK_7992 \
-+	0x0000000f // 3- 0
-+#define WF_LWTBL_AF_SHIFT                                           0
-+#define WF_LWTBL_AF_HE_DW                                           5
-+#define WF_LWTBL_AF_HE_ADDR                                         20
-+#define WF_LWTBL_AF_HE_MASK \
-+	0x00000018 // 4- 3
-+#define WF_LWTBL_AF_HE_SHIFT                                        3
-+#define WF_LWTBL_RTS_DW                                             5
-+#define WF_LWTBL_RTS_ADDR                                           20
-+#define WF_LWTBL_RTS_MASK \
-+	0x00000020 // 5- 5
-+#define WF_LWTBL_RTS_SHIFT                                          5
-+#define WF_LWTBL_SMPS_DW                                            5
-+#define WF_LWTBL_SMPS_ADDR                                          20
-+#define WF_LWTBL_SMPS_MASK \
-+	0x00000040 // 6- 6
-+#define WF_LWTBL_SMPS_SHIFT                                         6
-+#define WF_LWTBL_DYN_BW_DW                                          5
-+#define WF_LWTBL_DYN_BW_ADDR                                        20
-+#define WF_LWTBL_DYN_BW_MASK \
-+	0x00000080 // 7- 7
-+#define WF_LWTBL_DYN_BW_SHIFT                                       7
-+#define WF_LWTBL_MMSS_DW                                            5
-+#define WF_LWTBL_MMSS_ADDR                                          20
-+#define WF_LWTBL_MMSS_MASK \
-+	0x00000700 // 10- 8
-+#define WF_LWTBL_MMSS_SHIFT                                         8
-+#define WF_LWTBL_USR_DW                                             5
-+#define WF_LWTBL_USR_ADDR                                           20
-+#define WF_LWTBL_USR_MASK \
-+	0x00000800 // 11-11
-+#define WF_LWTBL_USR_SHIFT                                          11
-+#define WF_LWTBL_SR_R_DW                                            5
-+#define WF_LWTBL_SR_R_ADDR                                          20
-+#define WF_LWTBL_SR_R_MASK \
-+	0x00007000 // 14-12
-+#define WF_LWTBL_SR_R_SHIFT                                         12
-+#define WF_LWTBL_SR_ABORT_DW                                        5
-+#define WF_LWTBL_SR_ABORT_ADDR                                      20
-+#define WF_LWTBL_SR_ABORT_MASK \
-+	0x00008000 // 15-15
-+#define WF_LWTBL_SR_ABORT_SHIFT                                     15
-+#define WF_LWTBL_TX_POWER_OFFSET_DW                                 5
-+#define WF_LWTBL_TX_POWER_OFFSET_ADDR                               20
-+#define WF_LWTBL_TX_POWER_OFFSET_MASK \
-+	0x003f0000 // 21-16
-+#define WF_LWTBL_TX_POWER_OFFSET_SHIFT                              16
-+#define WF_LWTBL_LTF_EHT_DW                                         5
-+#define WF_LWTBL_LTF_EHT_ADDR                                       20
-+#define WF_LWTBL_LTF_EHT_MASK \
-+	0x00c00000 // 23-22
-+#define WF_LWTBL_LTF_EHT_SHIFT                                      22
-+#define WF_LWTBL_GI_EHT_DW                                          5
-+#define WF_LWTBL_GI_EHT_ADDR                                        20
-+#define WF_LWTBL_GI_EHT_MASK \
-+	0x03000000 // 25-24
-+#define WF_LWTBL_GI_EHT_SHIFT                                       24
-+#define WF_LWTBL_DOPPL_DW                                           5
-+#define WF_LWTBL_DOPPL_ADDR                                         20
-+#define WF_LWTBL_DOPPL_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_DOPPL_SHIFT                                        26
-+#define WF_LWTBL_TXOP_PS_CAP_DW                                     5
-+#define WF_LWTBL_TXOP_PS_CAP_ADDR                                   20
-+#define WF_LWTBL_TXOP_PS_CAP_MASK \
-+	0x08000000 // 27-27
-+#define WF_LWTBL_TXOP_PS_CAP_SHIFT                                  27
-+#define WF_LWTBL_DU_I_PSM_DW                                        5
-+#define WF_LWTBL_DU_I_PSM_ADDR                                      20
-+#define WF_LWTBL_DU_I_PSM_MASK \
-+	0x10000000 // 28-28
-+#define WF_LWTBL_DU_I_PSM_SHIFT                                     28
-+#define WF_LWTBL_I_PSM_DW                                           5
-+#define WF_LWTBL_I_PSM_ADDR                                         20
-+#define WF_LWTBL_I_PSM_MASK \
-+	0x20000000 // 29-29
-+#define WF_LWTBL_I_PSM_SHIFT                                        29
-+#define WF_LWTBL_PSM_DW                                             5
-+#define WF_LWTBL_PSM_ADDR                                           20
-+#define WF_LWTBL_PSM_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_PSM_SHIFT                                          30
-+#define WF_LWTBL_SKIP_TX_DW                                         5
-+#define WF_LWTBL_SKIP_TX_ADDR                                       20
-+#define WF_LWTBL_SKIP_TX_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_SKIP_TX_SHIFT                                      31
-+// DW6
-+#define WF_LWTBL_CBRN_DW                                            6
-+#define WF_LWTBL_CBRN_ADDR                                          24
-+#define WF_LWTBL_CBRN_MASK \
-+	0x00000007 // 2- 0
-+#define WF_LWTBL_CBRN_SHIFT                                         0
-+#define WF_LWTBL_DBNSS_EN_DW                                        6
-+#define WF_LWTBL_DBNSS_EN_ADDR                                      24
-+#define WF_LWTBL_DBNSS_EN_MASK \
-+	0x00000008 // 3- 3
-+#define WF_LWTBL_DBNSS_EN_SHIFT                                     3
-+#define WF_LWTBL_BAF_EN_DW                                          6
-+#define WF_LWTBL_BAF_EN_ADDR                                        24
-+#define WF_LWTBL_BAF_EN_MASK \
-+	0x00000010 // 4- 4
-+#define WF_LWTBL_BAF_EN_SHIFT                                       4
-+#define WF_LWTBL_RDGBA_DW                                           6
-+#define WF_LWTBL_RDGBA_ADDR                                         24
-+#define WF_LWTBL_RDGBA_MASK \
-+	0x00000020 // 5- 5
-+#define WF_LWTBL_RDGBA_SHIFT                                        5
-+#define WF_LWTBL_R_DW                                               6
-+#define WF_LWTBL_R_ADDR                                             24
-+#define WF_LWTBL_R_MASK \
-+	0x00000040 // 6- 6
-+#define WF_LWTBL_R_SHIFT                                            6
-+#define WF_LWTBL_SPE_IDX_DW                                         6
-+#define WF_LWTBL_SPE_IDX_ADDR                                       24
-+#define WF_LWTBL_SPE_IDX_MASK \
-+	0x00000f80 // 11- 7
-+#define WF_LWTBL_SPE_IDX_SHIFT                                      7
-+#define WF_LWTBL_G2_DW                                              6
-+#define WF_LWTBL_G2_ADDR                                            24
-+#define WF_LWTBL_G2_MASK \
-+	0x00001000 // 12-12
-+#define WF_LWTBL_G2_SHIFT                                           12
-+#define WF_LWTBL_G4_DW                                              6
-+#define WF_LWTBL_G4_ADDR                                            24
-+#define WF_LWTBL_G4_MASK \
-+	0x00002000 // 13-13
-+#define WF_LWTBL_G4_SHIFT                                           13
-+#define WF_LWTBL_G8_DW                                              6
-+#define WF_LWTBL_G8_ADDR                                            24
-+#define WF_LWTBL_G8_MASK \
-+	0x00004000 // 14-14
-+#define WF_LWTBL_G8_SHIFT                                           14
-+#define WF_LWTBL_G16_DW                                             6
-+#define WF_LWTBL_G16_ADDR                                           24
-+#define WF_LWTBL_G16_MASK \
-+	0x00008000 // 15-15
-+#define WF_LWTBL_G16_SHIFT                                          15
-+#define WF_LWTBL_G2_LTF_DW                                          6
-+#define WF_LWTBL_G2_LTF_ADDR                                        24
-+#define WF_LWTBL_G2_LTF_MASK \
-+	0x00030000 // 17-16
-+#define WF_LWTBL_G2_LTF_SHIFT                                       16
-+#define WF_LWTBL_G4_LTF_DW                                          6
-+#define WF_LWTBL_G4_LTF_ADDR                                        24
-+#define WF_LWTBL_G4_LTF_MASK \
-+	0x000c0000 // 19-18
-+#define WF_LWTBL_G4_LTF_SHIFT                                       18
-+#define WF_LWTBL_G8_LTF_DW                                          6
-+#define WF_LWTBL_G8_LTF_ADDR                                        24
-+#define WF_LWTBL_G8_LTF_MASK \
-+	0x00300000 // 21-20
-+#define WF_LWTBL_G8_LTF_SHIFT                                       20
-+#define WF_LWTBL_G16_LTF_DW                                         6
-+#define WF_LWTBL_G16_LTF_ADDR                                       24
-+#define WF_LWTBL_G16_LTF_MASK \
-+	0x00c00000 // 23-22
-+#define WF_LWTBL_G16_LTF_SHIFT                                      22
-+#define WF_LWTBL_G2_HE_DW                                           6
-+#define WF_LWTBL_G2_HE_ADDR                                         24
-+#define WF_LWTBL_G2_HE_MASK \
-+	0x03000000 // 25-24
-+#define WF_LWTBL_G2_HE_SHIFT                                        24
-+#define WF_LWTBL_G4_HE_DW                                           6
-+#define WF_LWTBL_G4_HE_ADDR                                         24
-+#define WF_LWTBL_G4_HE_MASK \
-+	0x0c000000 // 27-26
-+#define WF_LWTBL_G4_HE_SHIFT                                        26
-+#define WF_LWTBL_G8_HE_DW                                           6
-+#define WF_LWTBL_G8_HE_ADDR                                         24
-+#define WF_LWTBL_G8_HE_MASK \
-+	0x30000000 // 29-28
-+#define WF_LWTBL_G8_HE_SHIFT                                        28
-+#define WF_LWTBL_G16_HE_DW                                          6
-+#define WF_LWTBL_G16_HE_ADDR                                        24
-+#define WF_LWTBL_G16_HE_MASK \
-+	0xc0000000 // 31-30
-+#define WF_LWTBL_G16_HE_SHIFT                                       30
-+// DW7
-+#define WF_LWTBL_BA_WIN_SIZE0_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE0_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE0_MASK \
-+	0x0000000f // 3- 0
-+#define WF_LWTBL_BA_WIN_SIZE0_SHIFT                                 0
-+#define WF_LWTBL_BA_WIN_SIZE1_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE1_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE1_MASK \
-+	0x000000f0 // 7- 4
-+#define WF_LWTBL_BA_WIN_SIZE1_SHIFT                                 4
-+#define WF_LWTBL_BA_WIN_SIZE2_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE2_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE2_MASK \
-+	0x00000f00 // 11- 8
-+#define WF_LWTBL_BA_WIN_SIZE2_SHIFT                                 8
-+#define WF_LWTBL_BA_WIN_SIZE3_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE3_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE3_MASK \
-+	0x0000f000 // 15-12
-+#define WF_LWTBL_BA_WIN_SIZE3_SHIFT                                 12
-+#define WF_LWTBL_BA_WIN_SIZE4_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE4_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE4_MASK \
-+	0x000f0000 // 19-16
-+#define WF_LWTBL_BA_WIN_SIZE4_SHIFT                                 16
-+#define WF_LWTBL_BA_WIN_SIZE5_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE5_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE5_MASK \
-+	0x00f00000 // 23-20
-+#define WF_LWTBL_BA_WIN_SIZE5_SHIFT                                 20
-+#define WF_LWTBL_BA_WIN_SIZE6_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE6_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE6_MASK \
-+	0x0f000000 // 27-24
-+#define WF_LWTBL_BA_WIN_SIZE6_SHIFT                                 24
-+#define WF_LWTBL_BA_WIN_SIZE7_DW                                    7
-+#define WF_LWTBL_BA_WIN_SIZE7_ADDR                                  28
-+#define WF_LWTBL_BA_WIN_SIZE7_MASK \
-+	0xf0000000 // 31-28
-+#define WF_LWTBL_BA_WIN_SIZE7_SHIFT                                 28
-+// DW8
-+#define WF_LWTBL_AC0_RTS_FAIL_CNT_DW                                8
-+#define WF_LWTBL_AC0_RTS_FAIL_CNT_ADDR                              32
-+#define WF_LWTBL_AC0_RTS_FAIL_CNT_MASK \
-+	0x0000001f // 4- 0
-+#define WF_LWTBL_AC0_RTS_FAIL_CNT_SHIFT                             0
-+#define WF_LWTBL_AC1_RTS_FAIL_CNT_DW                                8
-+#define WF_LWTBL_AC1_RTS_FAIL_CNT_ADDR                              32
-+#define WF_LWTBL_AC1_RTS_FAIL_CNT_MASK \
-+	0x000003e0 // 9- 5
-+#define WF_LWTBL_AC1_RTS_FAIL_CNT_SHIFT                             5
-+#define WF_LWTBL_AC2_RTS_FAIL_CNT_DW                                8
-+#define WF_LWTBL_AC2_RTS_FAIL_CNT_ADDR                              32
-+#define WF_LWTBL_AC2_RTS_FAIL_CNT_MASK \
-+	0x00007c00 // 14-10
-+#define WF_LWTBL_AC2_RTS_FAIL_CNT_SHIFT                             10
-+#define WF_LWTBL_AC3_RTS_FAIL_CNT_DW                                8
-+#define WF_LWTBL_AC3_RTS_FAIL_CNT_ADDR                              32
-+#define WF_LWTBL_AC3_RTS_FAIL_CNT_MASK \
-+	0x000f8000 // 19-15
-+#define WF_LWTBL_AC3_RTS_FAIL_CNT_SHIFT                             15
-+#define WF_LWTBL_PARTIAL_AID_DW                                     8
-+#define WF_LWTBL_PARTIAL_AID_ADDR                                   32
-+#define WF_LWTBL_PARTIAL_AID_MASK \
-+	0x1ff00000 // 28-20
-+#define WF_LWTBL_PARTIAL_AID_SHIFT                                  20
-+#define WF_LWTBL_CHK_PER_DW                                         8
-+#define WF_LWTBL_CHK_PER_ADDR                                       32
-+#define WF_LWTBL_CHK_PER_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_CHK_PER_SHIFT                                      31
-+// DW9
-+#define WF_LWTBL_RX_AVG_MPDU_SIZE_DW                                9
-+#define WF_LWTBL_RX_AVG_MPDU_SIZE_ADDR                              36
-+#define WF_LWTBL_RX_AVG_MPDU_SIZE_MASK \
-+	0x00003fff // 13- 0
-+#define WF_LWTBL_RX_AVG_MPDU_SIZE_SHIFT                             0
-+#define WF_LWTBL_PRITX_SW_MODE_DW                                   9
-+#define WF_LWTBL_PRITX_SW_MODE_ADDR                                 36
-+#define WF_LWTBL_PRITX_SW_MODE_MASK \
-+	0x00008000 // 15-15
-+#define WF_LWTBL_PRITX_SW_MODE_SHIFT                                15
-+#define WF_LWTBL_PRITX_SW_MODE_MASK_7992 \
-+	0x00004000 // 14-14
-+#define WF_LWTBL_PRITX_SW_MODE_SHIFT_7992                           14
-+#define WF_LWTBL_PRITX_ERSU_DW                                      9
-+#define WF_LWTBL_PRITX_ERSU_ADDR                                    36
-+#define WF_LWTBL_PRITX_ERSU_MASK \
-+	0x00010000 // 16-16
-+#define WF_LWTBL_PRITX_ERSU_SHIFT                                   16
-+#define WF_LWTBL_PRITX_ERSU_MASK_7992 \
-+	0x00008000 // 15-15
-+#define WF_LWTBL_PRITX_ERSU_SHIFT_7992                              15
-+#define WF_LWTBL_PRITX_PLR_DW                                       9
-+#define WF_LWTBL_PRITX_PLR_ADDR                                     36
-+#define WF_LWTBL_PRITX_PLR_MASK \
-+	0x00020000 // 17-17
-+#define WF_LWTBL_PRITX_PLR_SHIFT                                    17
-+#define WF_LWTBL_PRITX_PLR_MASK_7992 \
-+	0x00030000 // 17-16
-+#define WF_LWTBL_PRITX_PLR_SHIFT_7992                               16
-+#define WF_LWTBL_PRITX_DCM_DW                                       9
-+#define WF_LWTBL_PRITX_DCM_ADDR                                     36
-+#define WF_LWTBL_PRITX_DCM_MASK \
-+	0x00040000 // 18-18
-+#define WF_LWTBL_PRITX_DCM_SHIFT                                    18
-+#define WF_LWTBL_PRITX_ER106T_DW                                    9
-+#define WF_LWTBL_PRITX_ER106T_ADDR                                  36
-+#define WF_LWTBL_PRITX_ER106T_MASK \
-+	0x00080000 // 19-19
-+#define WF_LWTBL_PRITX_ER106T_SHIFT                                 19
-+#define WF_LWTBL_FCAP_DW                                            9
-+#define WF_LWTBL_FCAP_ADDR                                          36
-+#define WF_LWTBL_FCAP_MASK \
-+	0x00700000 // 22-20
-+#define WF_LWTBL_FCAP_SHIFT                                         20
-+#define WF_LWTBL_MPDU_FAIL_CNT_DW                                   9
-+#define WF_LWTBL_MPDU_FAIL_CNT_ADDR                                 36
-+#define WF_LWTBL_MPDU_FAIL_CNT_MASK \
-+	0x03800000 // 25-23
-+#define WF_LWTBL_MPDU_FAIL_CNT_SHIFT                                23
-+#define WF_LWTBL_MPDU_OK_CNT_DW                                     9
-+#define WF_LWTBL_MPDU_OK_CNT_ADDR                                   36
-+#define WF_LWTBL_MPDU_OK_CNT_MASK \
-+	0x1c000000 // 28-26
-+#define WF_LWTBL_MPDU_OK_CNT_SHIFT                                  26
-+#define WF_LWTBL_RATE_IDX_DW                                        9
-+#define WF_LWTBL_RATE_IDX_ADDR                                      36
-+#define WF_LWTBL_RATE_IDX_MASK \
-+	0xe0000000 // 31-29
-+#define WF_LWTBL_RATE_IDX_SHIFT                                     29
-+// DW10
-+#define WF_LWTBL_RATE1_DW                                           10
-+#define WF_LWTBL_RATE1_ADDR                                         40
-+#define WF_LWTBL_RATE1_MASK \
-+	0x00007fff // 14- 0
-+#define WF_LWTBL_RATE1_SHIFT                                        0
-+#define WF_LWTBL_RATE2_DW                                           10
-+#define WF_LWTBL_RATE2_ADDR                                         40
-+#define WF_LWTBL_RATE2_MASK \
-+	0x7fff0000 // 30-16
-+#define WF_LWTBL_RATE2_SHIFT                                        16
-+// DW11
-+#define WF_LWTBL_RATE3_DW                                           11
-+#define WF_LWTBL_RATE3_ADDR                                         44
-+#define WF_LWTBL_RATE3_MASK \
-+	0x00007fff // 14- 0
-+#define WF_LWTBL_RATE3_SHIFT                                        0
-+#define WF_LWTBL_RATE4_DW                                           11
-+#define WF_LWTBL_RATE4_ADDR                                         44
-+#define WF_LWTBL_RATE4_MASK \
-+	0x7fff0000 // 30-16
-+#define WF_LWTBL_RATE4_SHIFT                                        16
-+// DW12
-+#define WF_LWTBL_RATE5_DW                                           12
-+#define WF_LWTBL_RATE5_ADDR                                         48
-+#define WF_LWTBL_RATE5_MASK \
-+	0x00007fff // 14- 0
-+#define WF_LWTBL_RATE5_SHIFT                                        0
-+#define WF_LWTBL_RATE6_DW                                           12
-+#define WF_LWTBL_RATE6_ADDR                                         48
-+#define WF_LWTBL_RATE6_MASK \
-+	0x7fff0000 // 30-16
-+#define WF_LWTBL_RATE6_SHIFT                                        16
-+// DW13
-+#define WF_LWTBL_RATE7_DW                                           13
-+#define WF_LWTBL_RATE7_ADDR                                         52
-+#define WF_LWTBL_RATE7_MASK \
-+	0x00007fff // 14- 0
-+#define WF_LWTBL_RATE7_SHIFT                                        0
-+#define WF_LWTBL_RATE8_DW                                           13
-+#define WF_LWTBL_RATE8_ADDR                                         52
-+#define WF_LWTBL_RATE8_MASK \
-+	0x7fff0000 // 30-16
-+#define WF_LWTBL_RATE8_SHIFT                                        16
-+// DW14
-+#define WF_LWTBL_RATE1_TX_CNT_DW                                    14
-+#define WF_LWTBL_RATE1_TX_CNT_ADDR                                  56
-+#define WF_LWTBL_RATE1_TX_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_RATE1_TX_CNT_SHIFT                                 0
-+#define WF_LWTBL_CIPHER_SUIT_IGTK_DW                                14
-+#define WF_LWTBL_CIPHER_SUIT_IGTK_ADDR                              56
-+#define WF_LWTBL_CIPHER_SUIT_IGTK_MASK \
-+	0x00003000 // 13-12
-+#define WF_LWTBL_CIPHER_SUIT_IGTK_SHIFT                             12
-+#define WF_LWTBL_CIPHER_SUIT_BIGTK_DW                               14
-+#define WF_LWTBL_CIPHER_SUIT_BIGTK_ADDR                             56
-+#define WF_LWTBL_CIPHER_SUIT_BIGTK_MASK \
-+	0x0000c000 // 15-14
-+#define WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT                            14
-+#define WF_LWTBL_RATE1_FAIL_CNT_DW                                  14
-+#define WF_LWTBL_RATE1_FAIL_CNT_ADDR                                56
-+#define WF_LWTBL_RATE1_FAIL_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_RATE1_FAIL_CNT_SHIFT                               16
-+// DW15
-+#define WF_LWTBL_RATE2_OK_CNT_DW                                    15
-+#define WF_LWTBL_RATE2_OK_CNT_ADDR                                  60
-+#define WF_LWTBL_RATE2_OK_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_RATE2_OK_CNT_SHIFT                                 0
-+#define WF_LWTBL_RATE3_OK_CNT_DW                                    15
-+#define WF_LWTBL_RATE3_OK_CNT_ADDR                                  60
-+#define WF_LWTBL_RATE3_OK_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_RATE3_OK_CNT_SHIFT                                 16
-+// DW16
-+#define WF_LWTBL_CURRENT_BW_TX_CNT_DW                               16
-+#define WF_LWTBL_CURRENT_BW_TX_CNT_ADDR                             64
-+#define WF_LWTBL_CURRENT_BW_TX_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_CURRENT_BW_TX_CNT_SHIFT                            0
-+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_DW                             16
-+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_ADDR                           64
-+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_CURRENT_BW_FAIL_CNT_SHIFT                          16
-+// DW17
-+#define WF_LWTBL_OTHER_BW_TX_CNT_DW                                 17
-+#define WF_LWTBL_OTHER_BW_TX_CNT_ADDR                               68
-+#define WF_LWTBL_OTHER_BW_TX_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_OTHER_BW_TX_CNT_SHIFT                              0
-+#define WF_LWTBL_OTHER_BW_FAIL_CNT_DW                               17
-+#define WF_LWTBL_OTHER_BW_FAIL_CNT_ADDR                             68
-+#define WF_LWTBL_OTHER_BW_FAIL_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_OTHER_BW_FAIL_CNT_SHIFT                            16
-+// DW18
-+#define WF_LWTBL_RTS_OK_CNT_DW                                      18
-+#define WF_LWTBL_RTS_OK_CNT_ADDR                                    72
-+#define WF_LWTBL_RTS_OK_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_RTS_OK_CNT_SHIFT                                   0
-+#define WF_LWTBL_RTS_FAIL_CNT_DW                                    18
-+#define WF_LWTBL_RTS_FAIL_CNT_ADDR                                  72
-+#define WF_LWTBL_RTS_FAIL_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_RTS_FAIL_CNT_SHIFT                                 16
-+// DW19
-+#define WF_LWTBL_DATA_RETRY_CNT_DW                                  19
-+#define WF_LWTBL_DATA_RETRY_CNT_ADDR                                76
-+#define WF_LWTBL_DATA_RETRY_CNT_MASK \
-+	0x0000ffff // 15- 0
-+#define WF_LWTBL_DATA_RETRY_CNT_SHIFT                               0
-+#define WF_LWTBL_MGNT_RETRY_CNT_DW                                  19
-+#define WF_LWTBL_MGNT_RETRY_CNT_ADDR                                76
-+#define WF_LWTBL_MGNT_RETRY_CNT_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_MGNT_RETRY_CNT_SHIFT                               16
-+// DW20
-+#define WF_LWTBL_AC0_CTT_CDT_CRB_DW                                 20
-+#define WF_LWTBL_AC0_CTT_CDT_CRB_ADDR                               80
-+#define WF_LWTBL_AC0_CTT_CDT_CRB_MASK \
-+	0xffffffff // 31- 0
-+#define WF_LWTBL_AC0_CTT_CDT_CRB_SHIFT                              0
-+// DW21
-+// DO NOT process repeat field(adm[0])
-+// DW22
-+#define WF_LWTBL_AC1_CTT_CDT_CRB_DW                                 22
-+#define WF_LWTBL_AC1_CTT_CDT_CRB_ADDR                               88
-+#define WF_LWTBL_AC1_CTT_CDT_CRB_MASK \
-+	0xffffffff // 31- 0
-+#define WF_LWTBL_AC1_CTT_CDT_CRB_SHIFT                              0
-+// DW23
-+// DO NOT process repeat field(adm[1])
-+// DW24
-+#define WF_LWTBL_AC2_CTT_CDT_CRB_DW                                 24
-+#define WF_LWTBL_AC2_CTT_CDT_CRB_ADDR                               96
-+#define WF_LWTBL_AC2_CTT_CDT_CRB_MASK \
-+	0xffffffff // 31- 0
-+#define WF_LWTBL_AC2_CTT_CDT_CRB_SHIFT                              0
-+// DW25
-+// DO NOT process repeat field(adm[2])
-+// DW26
-+#define WF_LWTBL_AC3_CTT_CDT_CRB_DW                                 26
-+#define WF_LWTBL_AC3_CTT_CDT_CRB_ADDR                               104
-+#define WF_LWTBL_AC3_CTT_CDT_CRB_MASK \
-+	0xffffffff // 31- 0
-+#define WF_LWTBL_AC3_CTT_CDT_CRB_SHIFT                              0
-+// DW27
-+// DO NOT process repeat field(adm[3])
-+// DW28
-+#define WF_LWTBL_RELATED_IDX0_DW                                    28
-+#define WF_LWTBL_RELATED_IDX0_ADDR                                  112
-+#define WF_LWTBL_RELATED_IDX0_MASK \
-+	0x00000fff // 11- 0
-+#define WF_LWTBL_RELATED_IDX0_SHIFT                                 0
-+#define WF_LWTBL_RELATED_BAND0_DW                                   28
-+#define WF_LWTBL_RELATED_BAND0_ADDR                                 112
-+#define WF_LWTBL_RELATED_BAND0_MASK \
-+	0x00003000 // 13-12
-+#define WF_LWTBL_RELATED_BAND0_SHIFT                                12
-+#define WF_LWTBL_PRIMARY_MLD_BAND_DW                                28
-+#define WF_LWTBL_PRIMARY_MLD_BAND_ADDR                              112
-+#define WF_LWTBL_PRIMARY_MLD_BAND_MASK \
-+	0x0000c000 // 15-14
-+#define WF_LWTBL_PRIMARY_MLD_BAND_SHIFT                             14
-+#define WF_LWTBL_RELATED_IDX1_DW                                    28
-+#define WF_LWTBL_RELATED_IDX1_ADDR                                  112
-+#define WF_LWTBL_RELATED_IDX1_MASK \
-+	0x0fff0000 // 27-16
-+#define WF_LWTBL_RELATED_IDX1_SHIFT                                 16
-+#define WF_LWTBL_RELATED_BAND1_DW                                   28
-+#define WF_LWTBL_RELATED_BAND1_ADDR                                 112
-+#define WF_LWTBL_RELATED_BAND1_MASK \
-+	0x30000000 // 29-28
-+#define WF_LWTBL_RELATED_BAND1_SHIFT                                28
-+#define WF_LWTBL_SECONDARY_MLD_BAND_DW                              28
-+#define WF_LWTBL_SECONDARY_MLD_BAND_ADDR                            112
-+#define WF_LWTBL_SECONDARY_MLD_BAND_MASK \
-+	0xc0000000 // 31-30
-+#define WF_LWTBL_SECONDARY_MLD_BAND_SHIFT                           30
-+// DW29
-+#define WF_LWTBL_DISPATCH_POLICY0_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY0_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY0_MASK \
-+	0x00000003 // 1- 0
-+#define WF_LWTBL_DISPATCH_POLICY0_SHIFT                             0
-+#define WF_LWTBL_DISPATCH_POLICY1_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY1_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY1_MASK \
-+	0x0000000c // 3- 2
-+#define WF_LWTBL_DISPATCH_POLICY1_SHIFT                             2
-+#define WF_LWTBL_DISPATCH_POLICY2_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY2_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY2_MASK \
-+	0x00000030 // 5- 4
-+#define WF_LWTBL_DISPATCH_POLICY2_SHIFT                             4
-+#define WF_LWTBL_DISPATCH_POLICY3_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY3_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY3_MASK \
-+	0x000000c0 // 7- 6
-+#define WF_LWTBL_DISPATCH_POLICY3_SHIFT                             6
-+#define WF_LWTBL_DISPATCH_POLICY4_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY4_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY4_MASK \
-+	0x00000300 // 9- 8
-+#define WF_LWTBL_DISPATCH_POLICY4_SHIFT                             8
-+#define WF_LWTBL_DISPATCH_POLICY5_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY5_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY5_MASK \
-+	0x00000c00 // 11-10
-+#define WF_LWTBL_DISPATCH_POLICY5_SHIFT                             10
-+#define WF_LWTBL_DISPATCH_POLICY6_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY6_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY6_MASK \
-+	0x00003000 // 13-12
-+#define WF_LWTBL_DISPATCH_POLICY6_SHIFT                             12
-+#define WF_LWTBL_DISPATCH_POLICY7_DW                                29
-+#define WF_LWTBL_DISPATCH_POLICY7_ADDR                              116
-+#define WF_LWTBL_DISPATCH_POLICY7_MASK \
-+	0x0000c000 // 15-14
-+#define WF_LWTBL_DISPATCH_POLICY7_SHIFT                             14
-+#define WF_LWTBL_OWN_MLD_ID_DW                                      29
-+#define WF_LWTBL_OWN_MLD_ID_ADDR                                    116
-+#define WF_LWTBL_OWN_MLD_ID_MASK \
-+	0x003f0000 // 21-16
-+#define WF_LWTBL_OWN_MLD_ID_SHIFT                                   16
-+#define WF_LWTBL_EMLSR0_DW                                          29
-+#define WF_LWTBL_EMLSR0_ADDR                                        116
-+#define WF_LWTBL_EMLSR0_MASK \
-+	0x00400000 // 22-22
-+#define WF_LWTBL_EMLSR0_SHIFT                                       22
-+#define WF_LWTBL_EMLMR0_DW                                          29
-+#define WF_LWTBL_EMLMR0_ADDR                                        116
-+#define WF_LWTBL_EMLMR0_MASK \
-+	0x00800000 // 23-23
-+#define WF_LWTBL_EMLMR0_SHIFT                                       23
-+#define WF_LWTBL_EMLSR1_DW                                          29
-+#define WF_LWTBL_EMLSR1_ADDR                                        116
-+#define WF_LWTBL_EMLSR1_MASK \
-+	0x01000000 // 24-24
-+#define WF_LWTBL_EMLSR1_SHIFT                                       24
-+#define WF_LWTBL_EMLMR1_DW                                          29
-+#define WF_LWTBL_EMLMR1_ADDR                                        116
-+#define WF_LWTBL_EMLMR1_MASK \
-+	0x02000000 // 25-25
-+#define WF_LWTBL_EMLMR1_SHIFT                                       25
-+#define WF_LWTBL_EMLSR2_DW                                          29
-+#define WF_LWTBL_EMLSR2_ADDR                                        116
-+#define WF_LWTBL_EMLSR2_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_EMLSR2_SHIFT                                       26
-+#define WF_LWTBL_EMLMR2_DW                                          29
-+#define WF_LWTBL_EMLMR2_ADDR                                        116
-+#define WF_LWTBL_EMLMR2_MASK \
-+	0x08000000 // 27-27
-+#define WF_LWTBL_EMLMR2_SHIFT                                       27
-+#define WF_LWTBL_STR_BITMAP_DW                                      29
-+#define WF_LWTBL_STR_BITMAP_ADDR                                    116
-+#define WF_LWTBL_STR_BITMAP_MASK \
-+	0xe0000000 // 31-29
-+#define WF_LWTBL_STR_BITMAP_SHIFT                                   29
-+// DW30
-+#define WF_LWTBL_DISPATCH_ORDER_DW                                  30
-+#define WF_LWTBL_DISPATCH_ORDER_ADDR                                120
-+#define WF_LWTBL_DISPATCH_ORDER_MASK \
-+	0x0000007f // 6- 0
-+#define WF_LWTBL_DISPATCH_ORDER_SHIFT                               0
-+#define WF_LWTBL_DISPATCH_RATIO_DW                                  30
-+#define WF_LWTBL_DISPATCH_RATIO_ADDR                                120
-+#define WF_LWTBL_DISPATCH_RATIO_MASK \
-+	0x00003f80 // 13- 7
-+#define WF_LWTBL_DISPATCH_RATIO_SHIFT                               7
-+#define WF_LWTBL_LINK_MGF_DW                                        30
-+#define WF_LWTBL_LINK_MGF_ADDR                                      120
-+#define WF_LWTBL_LINK_MGF_MASK \
-+	0xffff0000 // 31-16
-+#define WF_LWTBL_LINK_MGF_SHIFT                                     16
-+// DW31
-+#define WF_LWTBL_BFTX_TB_DW                                         31
-+#define WF_LWTBL_BFTX_TB_ADDR                                       124
-+#define WF_LWTBL_BFTX_TB_MASK \
-+	0x00800000 // 23-23
-+#define WF_LWTBL_DROP_DW                                            31
-+#define WF_LWTBL_DROP_ADDR                                          124
-+#define WF_LWTBL_DROP_MASK \
-+	0x01000000 // 24-24
-+#define WF_LWTBL_DROP_SHIFT                                         24
-+#define WF_LWTBL_CASCAD_DW                                          31
-+#define WF_LWTBL_CASCAD_ADDR                                        124
-+#define WF_LWTBL_CASCAD_MASK \
-+	0x02000000 // 25-25
-+#define WF_LWTBL_CASCAD_SHIFT                                       25
-+#define WF_LWTBL_ALL_ACK_DW                                         31
-+#define WF_LWTBL_ALL_ACK_ADDR                                       124
-+#define WF_LWTBL_ALL_ACK_MASK \
-+	0x04000000 // 26-26
-+#define WF_LWTBL_ALL_ACK_SHIFT                                      26
-+#define WF_LWTBL_MPDU_SIZE_DW                                       31
-+#define WF_LWTBL_MPDU_SIZE_ADDR                                     124
-+#define WF_LWTBL_MPDU_SIZE_MASK \
-+	0x18000000 // 28-27
-+#define WF_LWTBL_MPDU_SIZE_SHIFT                                    27
-+#define WF_LWTBL_RXD_DUP_MODE_DW                                    31
-+#define WF_LWTBL_RXD_DUP_MODE_ADDR                                  124
-+#define WF_LWTBL_RXD_DUP_MODE_MASK \
-+	0x60000000 // 30-29
-+#define WF_LWTBL_RXD_DUP_MODE_SHIFT                                 29
-+#define WF_LWTBL_ACK_EN_DW                                          31
-+#define WF_LWTBL_ACK_EN_ADDR                                        128
-+#define WF_LWTBL_ACK_EN_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_ACK_EN_SHIFT                                       31
-+// DW32
-+#define WF_LWTBL_OM_INFO_DW                                         32
-+#define WF_LWTBL_OM_INFO_ADDR                                       128
-+#define WF_LWTBL_OM_INFO_MASK \
-+	0x00000fff // 11- 0
-+#define WF_LWTBL_OM_INFO_SHIFT                                      0
-+#define WF_LWTBL_OM_INFO_EHT_DW                                     32
-+#define WF_LWTBL_OM_INFO_EHT_ADDR                                   128
-+#define WF_LWTBL_OM_INFO_EHT_MASK \
-+	0x0000f000 // 15-12
-+#define WF_LWTBL_OM_INFO_EHT_SHIFT                                  12
-+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_DW                              32
-+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_ADDR                            128
-+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_MASK \
-+	0x00010000 // 16-16
-+#define WF_LWTBL_RXD_DUP_FOR_OM_CHG_SHIFT                           16
-+#define WF_LWTBL_RXD_DUP_WHITE_LIST_DW                              32
-+#define WF_LWTBL_RXD_DUP_WHITE_LIST_ADDR                            128
-+#define WF_LWTBL_RXD_DUP_WHITE_LIST_MASK \
-+	0x1ffe0000 // 28-17
-+#define WF_LWTBL_RXD_DUP_WHITE_LIST_SHIFT                           17
-+// DW33
-+#define WF_LWTBL_USER_RSSI_DW                                       33
-+#define WF_LWTBL_USER_RSSI_ADDR                                     132
-+#define WF_LWTBL_USER_RSSI_MASK \
-+	0x000001ff // 8- 0
-+#define WF_LWTBL_USER_RSSI_SHIFT                                    0
-+#define WF_LWTBL_USER_SNR_DW                                        33
-+#define WF_LWTBL_USER_SNR_ADDR                                      132
-+#define WF_LWTBL_USER_SNR_MASK \
-+	0x00007e00 // 14- 9
-+#define WF_LWTBL_USER_SNR_SHIFT                                     9
-+#define WF_LWTBL_RAPID_REACTION_RATE_DW                             33
-+#define WF_LWTBL_RAPID_REACTION_RATE_ADDR                           132
-+#define WF_LWTBL_RAPID_REACTION_RATE_MASK \
-+	0x0fff0000 // 27-16
-+#define WF_LWTBL_RAPID_REACTION_RATE_SHIFT                          16
-+#define WF_LWTBL_HT_AMSDU_DW                                        33
-+#define WF_LWTBL_HT_AMSDU_ADDR                                      132
-+#define WF_LWTBL_HT_AMSDU_MASK \
-+	0x40000000 // 30-30
-+#define WF_LWTBL_HT_AMSDU_SHIFT                                     30
-+#define WF_LWTBL_AMSDU_CROSS_LG_DW                                  33
-+#define WF_LWTBL_AMSDU_CROSS_LG_ADDR                                132
-+#define WF_LWTBL_AMSDU_CROSS_LG_MASK \
-+	0x80000000 // 31-31
-+#define WF_LWTBL_AMSDU_CROSS_LG_SHIFT                               31
-+// DW34
-+#define WF_LWTBL_RESP_RCPI0_DW                                      34
-+#define WF_LWTBL_RESP_RCPI0_ADDR                                    136
-+#define WF_LWTBL_RESP_RCPI0_MASK \
-+	0x000000ff // 7- 0
-+#define WF_LWTBL_RESP_RCPI0_SHIFT                                   0
-+#define WF_LWTBL_RESP_RCPI1_DW                                      34
-+#define WF_LWTBL_RESP_RCPI1_ADDR                                    136
-+#define WF_LWTBL_RESP_RCPI1_MASK \
-+	0x0000ff00 // 15- 8
-+#define WF_LWTBL_RESP_RCPI1_SHIFT                                   8
-+#define WF_LWTBL_RESP_RCPI2_DW                                      34
-+#define WF_LWTBL_RESP_RCPI2_ADDR                                    136
-+#define WF_LWTBL_RESP_RCPI2_MASK \
-+	0x00ff0000 // 23-16
-+#define WF_LWTBL_RESP_RCPI2_SHIFT                                   16
-+#define WF_LWTBL_RESP_RCPI3_DW                                      34
-+#define WF_LWTBL_RESP_RCPI3_ADDR                                    136
-+#define WF_LWTBL_RESP_RCPI3_MASK \
-+	0xff000000 // 31-24
-+#define WF_LWTBL_RESP_RCPI3_SHIFT                                   24
-+// DW35
-+#define WF_LWTBL_SNR_RX0_DW                                         35
-+#define WF_LWTBL_SNR_RX0_ADDR                                       140
-+#define WF_LWTBL_SNR_RX0_MASK \
-+	0x0000003f // 5- 0
-+#define WF_LWTBL_SNR_RX0_SHIFT                                      0
-+#define WF_LWTBL_SNR_RX1_DW                                         35
-+#define WF_LWTBL_SNR_RX1_ADDR                                       140
-+#define WF_LWTBL_SNR_RX1_MASK \
-+	0x00000fc0 // 11- 6
-+#define WF_LWTBL_SNR_RX1_SHIFT                                      6
-+#define WF_LWTBL_SNR_RX2_DW                                         35
-+#define WF_LWTBL_SNR_RX2_ADDR                                       140
-+#define WF_LWTBL_SNR_RX2_MASK \
-+	0x0003f000 // 17-12
-+#define WF_LWTBL_SNR_RX2_SHIFT                                      12
-+#define WF_LWTBL_SNR_RX3_DW                                         35
-+#define WF_LWTBL_SNR_RX3_ADDR                                       140
-+#define WF_LWTBL_SNR_RX3_MASK \
-+	0x00fc0000 // 23-18
-+#define WF_LWTBL_SNR_RX3_SHIFT                                      18
-+
-+/* WTBL Group - Packet Number */
-+/* DW 2 */
-+#define WTBL_PN0_MASK                   BITS(0, 7)
-+#define WTBL_PN0_OFFSET                 0
-+#define WTBL_PN1_MASK                   BITS(8, 15)
-+#define WTBL_PN1_OFFSET                 8
-+#define WTBL_PN2_MASK                   BITS(16, 23)
-+#define WTBL_PN2_OFFSET                 16
-+#define WTBL_PN3_MASK                   BITS(24, 31)
-+#define WTBL_PN3_OFFSET                 24
-+
-+/* DW 3 */
-+#define WTBL_PN4_MASK                   BITS(0, 7)
-+#define WTBL_PN4_OFFSET                 0
-+#define WTBL_PN5_MASK                   BITS(8, 15)
-+#define WTBL_PN5_OFFSET                 8
-+
-+/* DW 4 */
-+#define WTBL_BIPN0_MASK                 BITS(0, 7)
-+#define WTBL_BIPN0_OFFSET               0
-+#define WTBL_BIPN1_MASK                 BITS(8, 15)
-+#define WTBL_BIPN1_OFFSET               8
-+#define WTBL_BIPN2_MASK                 BITS(16, 23)
-+#define WTBL_BIPN2_OFFSET               16
-+#define WTBL_BIPN3_MASK                 BITS(24, 31)
-+#define WTBL_BIPN3_OFFSET               24
-+
-+/* DW 5 */
-+#define WTBL_BIPN4_MASK                 BITS(0, 7)
-+#define WTBL_BIPN4_OFFSET               0
-+#define WTBL_BIPN5_MASK                 BITS(8, 15)
-+#define WTBL_BIPN5_OFFSET               8
-+
-+/* UWTBL DW 6 */
-+#define WTBL_AMSDU_LEN_MASK             BITS(0, 5)
-+#define WTBL_AMSDU_LEN_OFFSET           0
-+#define WTBL_AMSDU_NUM_MASK             BITS(6, 10)
-+#define WTBL_AMSDU_NUM_OFFSET           6
-+#define WTBL_AMSDU_EN_MASK              BIT(11)
-+#define WTBL_AMSDU_EN_OFFSET            11
-+
-+/* UWTBL DW 8 */
-+#define WTBL_SEC_ADDR_MODE_MASK		BITS(20, 21)
-+#define WTBL_SEC_ADDR_MODE_OFFSET	20
-+
-+/* LWTBL Rate field */
-+#define WTBL_RATE_TX_RATE_MASK          BITS(0, 5)
-+#define WTBL_RATE_TX_RATE_OFFSET        0
-+#define WTBL_RATE_TX_MODE_MASK          BITS(6, 9)
-+#define WTBL_RATE_TX_MODE_OFFSET        6
-+#define WTBL_RATE_NSTS_MASK             BITS(10, 13)
-+#define WTBL_RATE_NSTS_OFFSET           10
-+#define WTBL_RATE_STBC_MASK             BIT(14)
-+#define WTBL_RATE_STBC_OFFSET           14
-+
-+/***** WTBL(LMAC) DW Offset *****/
-+/* LMAC WTBL Group - Peer Unique Information */
-+#define WTBL_GROUP_PEER_INFO_DW_0               0
-+#define WTBL_GROUP_PEER_INFO_DW_1               1
-+
-+/* WTBL Group - TxRx Capability/Information */
-+#define WTBL_GROUP_TRX_CAP_DW_2                 2
-+#define WTBL_GROUP_TRX_CAP_DW_3                 3
-+#define WTBL_GROUP_TRX_CAP_DW_4                 4
-+#define WTBL_GROUP_TRX_CAP_DW_5                 5
-+#define WTBL_GROUP_TRX_CAP_DW_6                 6
-+#define WTBL_GROUP_TRX_CAP_DW_7                 7
-+#define WTBL_GROUP_TRX_CAP_DW_8                 8
-+#define WTBL_GROUP_TRX_CAP_DW_9                 9
-+
-+/* WTBL Group - Auto Rate Table*/
-+#define WTBL_GROUP_AUTO_RATE_1_2                10
-+#define WTBL_GROUP_AUTO_RATE_3_4                11
-+#define WTBL_GROUP_AUTO_RATE_5_6                12
-+#define WTBL_GROUP_AUTO_RATE_7_8                13
-+
-+/* WTBL Group - Tx Counter */
-+#define WTBL_GROUP_TX_CNT_LINE_1                14
-+#define WTBL_GROUP_TX_CNT_LINE_2                15
-+#define WTBL_GROUP_TX_CNT_LINE_3                16
-+#define WTBL_GROUP_TX_CNT_LINE_4                17
-+#define WTBL_GROUP_TX_CNT_LINE_5                18
-+#define WTBL_GROUP_TX_CNT_LINE_6                19
-+
-+/* WTBL Group - Admission Control Counter */
-+#define WTBL_GROUP_ADM_CNT_LINE_1               20
-+#define WTBL_GROUP_ADM_CNT_LINE_2               21
-+#define WTBL_GROUP_ADM_CNT_LINE_3               22
-+#define WTBL_GROUP_ADM_CNT_LINE_4               23
-+#define WTBL_GROUP_ADM_CNT_LINE_5               24
-+#define WTBL_GROUP_ADM_CNT_LINE_6               25
-+#define WTBL_GROUP_ADM_CNT_LINE_7               26
-+#define WTBL_GROUP_ADM_CNT_LINE_8               27
-+
-+/* WTBL Group -MLO Info */
-+#define WTBL_GROUP_MLO_INFO_LINE_1              28
-+#define WTBL_GROUP_MLO_INFO_LINE_2              29
-+#define WTBL_GROUP_MLO_INFO_LINE_3              30
-+
-+/* WTBL Group -RESP Info */
-+#define WTBL_GROUP_RESP_INFO_DW_31              31
-+
-+/* WTBL Group -RX DUP Info */
-+#define WTBL_GROUP_RX_DUP_INFO_DW_32            32
-+
-+/* WTBL Group - Rx Statistics Counter */
-+#define WTBL_GROUP_RX_STAT_CNT_LINE_1           33
-+#define WTBL_GROUP_RX_STAT_CNT_LINE_2           34
-+#define WTBL_GROUP_RX_STAT_CNT_LINE_3           35
-+
-+/* UWTBL Group - HW AMSDU */
-+#define UWTBL_HW_AMSDU_DW                       WF_UWTBL_AMSDU_CFG_DW
-+
-+/* LWTBL DW 4 */
-+#define WTBL_DIS_RHTR                           WF_LWTBL_DIS_RHTR_MASK
-+
-+/* UWTBL DW 5 */
-+#define WTBL_KEY_LINK_DW_KEY_LOC0_MASK          BITS(0, 10)
-+#define WTBL_PSM				WF_LWTBL_PSM_MASK
-+
-+/* Need to sync with FW define */
-+#define INVALID_KEY_ENTRY                       WTBL_KEY_LINK_DW_KEY_LOC0_MASK
-+
-+// RATE
-+#define WTBL_RATE_TX_RATE_MASK          	BITS(0, 5)
-+#define WTBL_RATE_TX_RATE_OFFSET        	0
-+#define WTBL_RATE_TX_MODE_MASK          	BITS(6, 9)
-+#define WTBL_RATE_TX_MODE_OFFSET        	6
-+#define WTBL_RATE_NSTS_MASK             	BITS(10, 13)
-+#define WTBL_RATE_NSTS_OFFSET           	10
-+#define WTBL_RATE_STBC_MASK            	 	BIT(14)
-+#define WTBL_RATE_STBC_OFFSET          	 	14
-+#endif
-+
-+#endif
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-new file mode 100644
-index 00000000..678b009e
---- /dev/null
-+++ b/mt7996/mtk_debugfs.c
-@@ -0,0 +1,2484 @@
-+// SPDX-License-Identifier: ISC
-+/*
-+ * Copyright (C) 2023 MediaTek Inc.
-+ */
-+#include "mt7996.h"
-+#include "../mt76.h"
-+#include "mcu.h"
-+#include "mac.h"
-+#include "eeprom.h"
-+#include "mtk_debug.h"
-+#include "mtk_mcu.h"
-+#include "coredump.h"
-+
-+#ifdef CONFIG_MTK_DEBUG
-+
-+/* AGG INFO */
-+static int
-+mt7996_agginfo_read_per_band(struct seq_file *s, int band_idx)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u64 total_burst, total_ampdu, ampdu_cnt[16];
-+	u32 value, idx, row_idx, col_idx, start_range, agg_rang_sel[16], burst_cnt[16], band_offset = 0;
-+	u8 partial_str[16] = {}, full_str[64] = {};
-+
-+	switch (band_idx) {
-+	case 0:
-+		band_offset = 0;
-+		break;
-+	case 1:
-+		band_offset = BN1_WF_AGG_TOP_BASE - BN0_WF_AGG_TOP_BASE;
-+		break;
-+	case 2:
-+		band_offset = IP1_BN0_WF_AGG_TOP_BASE - BN0_WF_AGG_TOP_BASE;
-+		break;
-+	default:
-+		return 0;
-+	}
-+
-+	seq_printf(s, "Band %d AGG Status\n", band_idx);
-+	seq_printf(s, "===============================\n");
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR0_ADDR + band_offset);
-+	seq_printf(s, "AC00 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR0_AC00_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC01 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR0_AC01_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR1_ADDR + band_offset);
-+	seq_printf(s, "AC02 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR1_AC02_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC03 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR1_AC03_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR2_ADDR + band_offset);
-+	seq_printf(s, "AC10 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR2_AC10_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC11 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR2_AC11_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR3_ADDR + band_offset);
-+	seq_printf(s, "AC12 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR3_AC12_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC13 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR3_AC13_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR4_ADDR + band_offset);
-+	seq_printf(s, "AC20 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR4_AC20_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC21 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR4_AC21_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR5_ADDR + band_offset);
-+	seq_printf(s, "AC22 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR5_AC22_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC23 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR5_AC23_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR6_ADDR + band_offset);
-+	seq_printf(s, "AC30 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR6_AC30_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC31 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR6_AC31_AGG_LIMIT_SHFT);
-+	value = mt76_rr(dev, BN0_WF_AGG_TOP_AALCR7_ADDR + band_offset);
-+	seq_printf(s, "AC32 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR7_AC32_AGG_LIMIT_SHFT);
-+	seq_printf(s, "AC33 Agg limit = %d\t", (value & BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_MASK) >>  BN0_WF_AGG_TOP_AALCR7_AC33_AGG_LIMIT_SHFT);
-+
-+	switch (band_idx) {
-+	case 0:
-+		band_offset = 0;
-+		break;
-+	case 1:
-+		band_offset = BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
-+		break;
-+	case 2:
-+		band_offset = IP1_BN0_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
-+		break;
-+	default:
-+		return 0;
-+	}
-+
-+	seq_printf(s, "===AMPDU Related Counters===\n");
-+
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC0_ADDR + band_offset);
-+	agg_rang_sel[0] = (value & BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_MASK) >> BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_0_SHFT;
-+	agg_rang_sel[1] = (value & BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_MASK) >> BN0_WF_MIB_TOP_TRARC0_AGG_RANG_SEL_1_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC1_ADDR + band_offset);
-+	agg_rang_sel[2] = (value & BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_MASK) >> BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_2_SHFT;
-+	agg_rang_sel[3] = (value & BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_MASK) >> BN0_WF_MIB_TOP_TRARC1_AGG_RANG_SEL_3_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC2_ADDR + band_offset);
-+	agg_rang_sel[4] = (value & BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_MASK) >> BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_4_SHFT;
-+	agg_rang_sel[5] = (value & BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_MASK) >> BN0_WF_MIB_TOP_TRARC2_AGG_RANG_SEL_5_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC3_ADDR + band_offset);
-+	agg_rang_sel[6] = (value & BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_MASK) >> BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_6_SHFT;
-+	agg_rang_sel[7] = (value & BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_MASK) >> BN0_WF_MIB_TOP_TRARC3_AGG_RANG_SEL_7_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC4_ADDR + band_offset);
-+	agg_rang_sel[8] = (value & BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_MASK) >> BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_8_SHFT;
-+	agg_rang_sel[9] = (value & BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_MASK) >> BN0_WF_MIB_TOP_TRARC4_AGG_RANG_SEL_9_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC5_ADDR + band_offset);
-+	agg_rang_sel[10] = (value & BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_MASK) >> BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_10_SHFT;
-+	agg_rang_sel[11] = (value & BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_MASK) >> BN0_WF_MIB_TOP_TRARC5_AGG_RANG_SEL_11_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC6_ADDR + band_offset);
-+	agg_rang_sel[12] = (value & BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_MASK) >> BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_12_SHFT;
-+	agg_rang_sel[13] = (value & BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_MASK) >> BN0_WF_MIB_TOP_TRARC6_AGG_RANG_SEL_13_SHFT;
-+	value = mt76_rr(dev, BN0_WF_MIB_TOP_TRARC7_ADDR + band_offset);
-+	agg_rang_sel[14] = (value & BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_MASK) >> BN0_WF_MIB_TOP_TRARC7_AGG_RANG_SEL_14_SHFT;
-+
-+	burst_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR0_ADDR + band_offset);
-+	burst_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR1_ADDR + band_offset);
-+	burst_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR2_ADDR + band_offset);
-+	burst_cnt[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR3_ADDR + band_offset);
-+	burst_cnt[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR4_ADDR + band_offset);
-+	burst_cnt[5] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR5_ADDR + band_offset);
-+	burst_cnt[6] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR6_ADDR + band_offset);
-+	burst_cnt[7] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR7_ADDR + band_offset);
-+	burst_cnt[8] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR8_ADDR + band_offset);
-+	burst_cnt[9] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR9_ADDR + band_offset);
-+	burst_cnt[10] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR10_ADDR + band_offset);
-+	burst_cnt[11] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR11_ADDR + band_offset);
-+	burst_cnt[12] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR12_ADDR + band_offset);
-+	burst_cnt[13] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR13_ADDR + band_offset);
-+	burst_cnt[14] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR14_ADDR + band_offset);
-+	burst_cnt[15] = mt76_rr(dev, BN0_WF_MIB_TOP_TRDR15_ADDR + band_offset);
-+
-+	start_range = 1;
-+	total_burst = 0;
-+	total_ampdu = 0;
-+	agg_rang_sel[15] = 1023;
-+
-+	/* Need to add 1 after read from AGG_RANG_SEL CR */
-+	for (idx = 0; idx < 16; idx++) {
-+		agg_rang_sel[idx]++;
-+		total_burst += burst_cnt[idx];
-+
-+		if (start_range == agg_rang_sel[idx])
-+			ampdu_cnt[idx] = (u64) start_range * burst_cnt[idx];
-+		else
-+			ampdu_cnt[idx] = (u64) ((start_range + agg_rang_sel[idx]) >> 1) * burst_cnt[idx];
-+
-+		start_range = agg_rang_sel[idx] + 1;
-+		total_ampdu += ampdu_cnt[idx];
-+	}
-+
-+	start_range = 1;
-+	sprintf(full_str, "%13s ", "Tx Agg Range:");
-+
-+	for (row_idx = 0; row_idx < 4; row_idx++) {
-+		for (col_idx = 0; col_idx < 4; col_idx++, idx++) {
-+			idx = 4 * row_idx + col_idx;
-+
-+			if (start_range == agg_rang_sel[idx])
-+				sprintf(partial_str, "%d", agg_rang_sel[idx]);
-+			else
-+				sprintf(partial_str, "%d~%d", start_range, agg_rang_sel[idx]);
-+
-+			start_range = agg_rang_sel[idx] + 1;
-+			sprintf(full_str + strlen(full_str), "%-11s ", partial_str);
-+		}
-+
-+		idx = 4 * row_idx;
-+
-+		seq_printf(s, "%s\n", full_str);
-+		seq_printf(s, "%13s 0x%-9x 0x%-9x 0x%-9x 0x%-9x\n",
-+			row_idx ? "" : "Burst count:",
-+			burst_cnt[idx], burst_cnt[idx + 1],
-+			burst_cnt[idx + 2], burst_cnt[idx + 3]);
-+
-+		if (total_burst != 0) {
-+			if (row_idx == 0)
-+				sprintf(full_str, "%13s ",
-+					"Burst ratio:");
-+			else
-+				sprintf(full_str, "%13s ", "");
-+
-+			for (col_idx = 0; col_idx < 4; col_idx++) {
-+				u64 count = (u64) burst_cnt[idx + col_idx] * 100;
-+
-+				sprintf(partial_str, "(%llu%%)",
-+					div64_u64(count, total_burst));
-+				sprintf(full_str + strlen(full_str),
-+					"%-11s ", partial_str);
-+			}
-+
-+			seq_printf(s, "%s\n", full_str);
-+
-+			if (row_idx == 0)
-+				sprintf(full_str, "%13s ",
-+					"MDPU ratio:");
-+			else
-+				sprintf(full_str, "%13s ", "");
-+
-+			for (col_idx = 0; col_idx < 4; col_idx++) {
-+				u64 count = ampdu_cnt[idx + col_idx] * 100;
-+
-+				sprintf(partial_str, "(%llu%%)",
-+					div64_u64(count, total_ampdu));
-+				sprintf(full_str + strlen(full_str),
-+					"%-11s ", partial_str);
-+			}
-+
-+			seq_printf(s, "%s\n", full_str);
-+		}
-+
-+		sprintf(full_str, "%13s ", "");
-+	}
-+
-+	return 0;
-+}
-+
-+static int mt7996_agginfo_read_band0(struct seq_file *s, void *data)
-+{
-+	mt7996_agginfo_read_per_band(s, MT_BAND0);
-+	return 0;
-+}
-+
-+static int mt7996_agginfo_read_band1(struct seq_file *s, void *data)
-+{
-+	mt7996_agginfo_read_per_band(s, MT_BAND1);
-+	return 0;
-+}
-+
-+static int mt7996_agginfo_read_band2(struct seq_file *s, void *data)
-+{
-+	mt7996_agginfo_read_per_band(s, MT_BAND2);
-+	return 0;
-+}
-+
-+/* AMSDU INFO */
-+static int mt7996_amsdu_result_read(struct seq_file *s, void *data)
-+{
-+#define HW_MSDU_CNT_ADDR 0xf400
-+#define HW_MSDU_NUM_MAX 33
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u32 ple_stat[HW_MSDU_NUM_MAX] = {0}, total_amsdu = 0;
-+	u8 i;
-+
-+	for (i = 0; i < HW_MSDU_NUM_MAX; i++)
-+		ple_stat[i] = mt76_rr(dev, HW_MSDU_CNT_ADDR + i * 0x04);
-+
-+	seq_printf(s, "TXD counter status of MSDU:\n");
-+
-+	for (i = 0; i < HW_MSDU_NUM_MAX; i++)
-+		total_amsdu += ple_stat[i];
-+
-+	for (i = 0; i < HW_MSDU_NUM_MAX; i++) {
-+		seq_printf(s, "AMSDU pack count of %d MSDU in TXD: 0x%x ", i, ple_stat[i]);
-+		if (total_amsdu != 0)
-+			seq_printf(s, "(%d%%)\n", ple_stat[i] * 100 / total_amsdu);
-+		else
-+			seq_printf(s, "\n");
-+	}
-+
-+	return 0;
-+}
-+
-+/* DBG MODLE */
-+static int
-+mt7996_fw_debug_module_set(void *data, u64 module)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	dev->dbg.fw_dbg_module = module;
-+	return 0;
-+}
-+
-+static int
-+mt7996_fw_debug_module_get(void *data, u64 *module)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	*module = dev->dbg.fw_dbg_module;
-+	return 0;
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_module, mt7996_fw_debug_module_get,
-+			 mt7996_fw_debug_module_set, "%lld\n");
-+
-+static int
-+mt7996_fw_debug_level_set(void *data, u64 level)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	dev->dbg.fw_dbg_lv = level;
-+	mt7996_mcu_fw_dbg_ctrl(dev, dev->dbg.fw_dbg_module, dev->dbg.fw_dbg_lv);
-+	return 0;
-+}
-+
-+static int
-+mt7996_fw_debug_level_get(void *data, u64 *level)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	*level = dev->dbg.fw_dbg_lv;
-+	return 0;
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_level, mt7996_fw_debug_level_get,
-+			 mt7996_fw_debug_level_set, "%lld\n");
-+
-+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_set */
-+static int
-+mt7996_wa_set(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+	u32 arg1, arg2, arg3;
-+
-+	arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
-+	arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
-+	arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
-+
-+	return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
-+				arg1, arg2, arg3);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_set, NULL, mt7996_wa_set,
-+			 "0x%llx\n");
-+
-+/* usage: echo 0x[arg3][arg2][arg1] > fw_wa_query */
-+static int
-+mt7996_wa_query(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+	u32 arg1, arg2, arg3;
-+
-+	arg1 = FIELD_GET(GENMASK_ULL(7, 0), val);
-+	arg2 = FIELD_GET(GENMASK_ULL(15, 8), val);
-+	arg3 = FIELD_GET(GENMASK_ULL(23, 16), val);
-+
-+	return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(QUERY),
-+				arg1, arg2, arg3);
-+	return 0;
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_wa_query, NULL, mt7996_wa_query,
-+			 "0x%llx\n");
-+
-+static int mt7996_dump_version(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	seq_printf(s, "Version: 3.3.24.2\n");
-+
-+	if (!test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
-+		return 0;
-+
-+	seq_printf(s, "Rom Patch Build Time: %.16s\n", dev->patch_build_date);
-+	seq_printf(s, "WM Patch Build Time: %.15s, Mode: %s\n",
-+		   dev->ram_build_date[MT7996_RAM_TYPE_WM],
-+		   dev->testmode_enable ? "Testmode" : "Normal mode");
-+	seq_printf(s, "WA Patch Build Time: %.15s\n",
-+		   dev->ram_build_date[MT7996_RAM_TYPE_WA]);
-+	seq_printf(s, "DSP Patch Build Time: %.15s\n",
-+		   dev->ram_build_date[MT7996_RAM_TYPE_DSP]);
-+	return 0;
-+}
-+
-+/* fw wm call trace info dump */
-+void mt7996_show_lp_history(struct seq_file *s, u32 type)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	struct mt7996_crash_data *crash_data;
-+	struct mt7996_coredump *dump;
-+	u64 now = 0;
-+	int i = 0;
-+	u8 fw_type = !!type;
-+
-+	mutex_lock(&dev->dump_mutex);
-+
-+	crash_data = mt7996_coredump_new(dev, fw_type);
-+	if (!crash_data) {
-+		mutex_unlock(&dev->dump_mutex);
-+		seq_printf(s, "the coredump is disable!\n");
-+		return;
-+	}
-+	mutex_unlock(&dev->dump_mutex);
-+
-+	dump = mt7996_coredump_build(dev, fw_type, false);
-+	if (!dump) {
-+		seq_printf(s, "no call stack data found!\n");
-+		return;
-+	}
-+
-+	seq_printf(s, "\x1b[32m%s log output\x1b[0m\n", dump->fw_type);
-+	seq_printf(s, "\x1b[32mfw status: %s\n", dump->fw_state);
-+	mt7996_dump_version(s, NULL);
-+	/* PC log */
-+	now = jiffies;
-+	for (i = 0; i < 10; i++)
-+		seq_printf(s, "\tCurrent PC=%x\n", dump->pc_cur[i]);
-+
-+	seq_printf(s, "PC log contorl=0x%x(T=%llu)(latest PC index = 0x%x)\n",
-+		dump->pc_dbg_ctrl, now, dump->pc_cur_idx);
-+	for (i = 0; i < 32; i++)
-+		seq_printf(s, "\tPC log(%d)=0x%08x\n", i, dump->pc_stack[i]);
-+
-+	/* LR log */
-+	now = jiffies;
-+	seq_printf(s, "\nLR log contorl=0x%x(T=%llu)(latest LR index = 0x%x)\n",
-+		dump->lr_dbg_ctrl, now, dump->lr_cur_idx);
-+	for (i = 0; i < 32; i++)
-+		seq_printf(s, "\tLR log(%d)=0x%08x\n", i, dump->lr_stack[i]);
-+
-+	vfree(dump);
-+}
-+
-+static int mt7996_fw_wa_info_read(struct seq_file *s, void *data)
-+{
-+	seq_printf(s, "======[ShowPcLpHistory]======\n");
-+	mt7996_show_lp_history(s, MT7996_RAM_TYPE_WA);
-+	seq_printf(s, "======[End ShowPcLpHistory]==\n");
-+
-+	return 0;
-+}
-+
-+static int mt7996_fw_wm_info_read(struct seq_file *s, void *data)
-+{
-+	seq_printf(s, "======[ShowPcLpHistory]======\n");
-+	mt7996_show_lp_history(s, MT7996_RAM_TYPE_WM);
-+	seq_printf(s, "======[End ShowPcLpHistory]==\n");
-+
-+	return 0;
-+}
-+
-+/* dma info dump */
-+static void
-+dump_dma_tx_ring_info(struct seq_file *s, struct mt7996_dev *dev,  char *str1, char *str2, u32 ring_base)
-+{
-+	u32 base, cnt, cidx, didx, queue_cnt;
-+
-+	base= mt76_rr(dev, ring_base);
-+	cnt = mt76_rr(dev, ring_base + 4);
-+	cidx = mt76_rr(dev, ring_base + 8);
-+	didx = mt76_rr(dev, ring_base + 12);
-+	queue_cnt = (cidx >= didx) ? (cidx - didx) : (cidx - didx + cnt);
-+
-+	seq_printf(s, "%20s %6s %10x %15x %10x %10x %10x\n", str1, str2, base, cnt, cidx, didx, queue_cnt);
-+}
-+
-+static void
-+dump_dma_rx_ring_info(struct seq_file *s, struct mt7996_dev *dev,  char *str1, char *str2, u32 ring_base)
-+{
-+	u32 base, ctrl1, cnt, cidx, didx, queue_cnt;
-+
-+	base= mt76_rr(dev, ring_base);
-+	ctrl1 = mt76_rr(dev, ring_base + 4);
-+	cidx = mt76_rr(dev, ring_base + 8) & 0xfff;
-+	didx = mt76_rr(dev, ring_base + 12) & 0xfff;
-+	cnt = ctrl1 & 0xfff;
-+	queue_cnt = (didx > cidx) ? (didx - cidx - 1) : (didx - cidx + cnt - 1);
-+
-+	seq_printf(s, "%20s %6s %10x %10x(%3x) %10x %10x %10x\n",
-+		   str1, str2, base, ctrl1, cnt, cidx, didx, queue_cnt);
-+}
-+
-+static void
-+mt7996_show_dma_info(struct seq_file *s, struct mt7996_dev *dev)
-+{
-+	u32 sys_ctrl[10];
-+
-+	/* HOST DMA0 information */
-+	sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_HOST_INT_STA_ADDR);
-+	sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_HOST_INT_ENA_ADDR);
-+	sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_ADDR);
-+
-+	seq_printf(s, "HOST_DMA Configuration\n");
-+	seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
-+		"DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
-+	seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
-+		"DMA0", sys_ctrl[0], sys_ctrl[1], sys_ctrl[2],
-+		(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
-+			>> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
-+		(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
-+			>> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
-+		(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
-+		(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_HOST_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
-+
-+	if (dev->hif2) {
-+		/* HOST DMA1 information */
-+		sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_STA_ADDR);
-+		sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_HOST_INT_ENA_ADDR);
-+		sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_ADDR);
-+
-+		seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
-+			"DMA0P1", sys_ctrl[0], sys_ctrl[1], sys_ctrl[2],
-+			(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
-+				>> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
-+			(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
-+				>> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
-+			(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
-+				>> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
-+			(sys_ctrl[2] & WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
-+				>> WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
-+	}
-+
-+	seq_printf(s, "HOST_DMA0 Ring Configuration\n");
-+	seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
-+		"Name", "Used", "Base", "Ctrl1(Cnt)", "CIDX", "DIDX", "QCnt");
-+	dump_dma_tx_ring_info(s, dev, "T0:TXD0(H2MAC)", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T1:TXD1(H2MAC)", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T2:TXD2(H2MAC)", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T3:", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING3_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T4:", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING4_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T5:", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING5_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T6:", "STA",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING6_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T16:FWDL", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING16_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T17:Cmd(H2WM)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING17_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T18:TXD0(H2WA)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING18_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T19:TXD1(H2WA)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING19_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T20:Cmd(H2WA)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING20_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T21:TXD2(H2WA)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING21_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T22:TXD3(H2WA)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_TX_RING22_CTRL0_ADDR);
-+
-+
-+	dump_dma_rx_ring_info(s, dev, "R0:Event(WM2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R1:Event(WA2H)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R2:TxDone0(WA2H)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", "AP",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R4:Data0(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R8:BUF0(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R9:TxDone0(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R10:MSDU_PG0(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R11:MSDU_PG1(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING11_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R12:MSDU_PG2(MAC2H)", "Both",
-+		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING12_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "IND:IND_CMD(MAC2H)", "Both",
-+		WF_RRO_TOP_IND_CMD_0_CTRL0_ADDR);
-+
-+	if (dev->hif2) {
-+		seq_printf(s, "HOST_DMA0 PCIe1 Ring Configuration\n");
-+		seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
-+			"Name", "Used", "Base", "Ctrl1(Cnt)", "CIDX", "DIDX", "QCnt");
-+		dump_dma_tx_ring_info(s, dev, "T21:TXD2(H2WA)", "AP",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL0_ADDR);
-+		dump_dma_tx_ring_info(s, dev, "T22:TXD?(H2WA)", "AP",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL0_ADDR);
-+
-+		dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", "AP",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR);
-+		dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL0_ADDR);
-+		dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR);
-+		dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL0_ADDR);
-+	}
-+
-+	/* MCU DMA information */
-+	sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_ADDR);
-+	sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_STA_ADDR);
-+	sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MCU_DMA0_HOST_INT_ENA_ADDR);
-+
-+	seq_printf(s, "MCU_DMA Configuration\n");
-+	seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
-+		"DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
-+	seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
-+		"DMA0", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
-+		(sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
-+			>> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
-+			>> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_MCU_DMA0_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
-+
-+	seq_printf(s, "MCU_DMA0 Ring Configuration\n");
-+	seq_printf(s, "%20s %6s %10s %15s %10s %10s %10s\n",
-+		"Name", "Used", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
-+	dump_dma_tx_ring_info(s, dev, "T0:Event(WM2H)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING0_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T1:Event(WA2H)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING1_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T2:TxDone0(WA2H)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING2_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T3:TxDone1(WA2H)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING3_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T4:TXD(WM2MAC)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING4_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T5:TXCMD(WM2MAC)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING5_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T6:TXD(WA2MAC)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_TX_RING6_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R0:FWDL", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING0_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R1:Cmd(H2WM)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING1_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R2:TXD0(H2WA)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING2_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R3:TXD1(H2WA)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING3_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R4:Cmd(H2WA)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R5:Data0(MAC2WM)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R6:TxDone(MAC2WM)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R7:SPL/RPT(MAC2WM)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R8:TxDone(MAC2WA)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R9:Data1(MAC2WM)", "Both",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R10:TXD2(H2WA)", "AP",
-+		WF_WFDMA_MCU_DMA0_WPDMA_RX_RING10_CTRL0_ADDR);
-+
-+	/* MEM DMA information */
-+	sys_ctrl[0] = mt76_rr(dev, WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_ADDR);
-+	sys_ctrl[1] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_STA_ADDR);
-+	sys_ctrl[2] = mt76_rr(dev, WF_WFDMA_MEM_DMA_HOST_INT_ENA_ADDR);
-+
-+	seq_printf(s, "MEM_DMA Configuration\n");
-+	seq_printf(s, "%10s %10s %10s %10s %10s %10s\n",
-+		"DMA", "IntCSR", "IntMask", "Glocfg", "Tx/RxEn", "Tx/RxBusy");
-+	seq_printf(s, "%10s %10x %10x %10x %4x/%5x %4x/%5x\n",
-+		"MEM", sys_ctrl[1], sys_ctrl[2], sys_ctrl[0],
-+		(sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_MASK)
-+			>> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_EN_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_MASK)
-+			>> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_EN_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_TX_DMA_BUSY_SHFT,
-+		(sys_ctrl[0] & WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_MASK)
-+			>> WF_WFDMA_MEM_DMA_WPDMA_GLO_CFG_RX_DMA_BUSY_SHFT);
-+
-+	seq_printf(s, "MEM_DMA Ring Configuration\n");
-+	seq_printf(s, "%20s %6s %10s %10s %10s %10s %10s\n",
-+		"Name", "Used", "Base", "Cnt", "CIDX", "DIDX", "QCnt");
-+	dump_dma_tx_ring_info(s, dev, "T0:CmdEvent(WM2WA)", "AP",
-+		WF_WFDMA_MEM_DMA_WPDMA_TX_RING0_CTRL0_ADDR);
-+	dump_dma_tx_ring_info(s, dev, "T1:CmdEvent(WA2WM)", "AP",
-+		WF_WFDMA_MEM_DMA_WPDMA_TX_RING1_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R0:CmdEvent(WM2WA)", "AP",
-+		WF_WFDMA_MEM_DMA_WPDMA_RX_RING0_CTRL0_ADDR);
-+	dump_dma_rx_ring_info(s, dev, "R1:CmdEvent(WA2WM)", "AP",
-+		WF_WFDMA_MEM_DMA_WPDMA_RX_RING1_CTRL0_ADDR);
-+}
-+
-+static int mt7996_trinfo_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	mt7996_show_dma_info(s, dev);
-+	return 0;
-+}
-+
-+/* MIB INFO */
-+static int mt7996_mibinfo_read_per_band(struct seq_file *s, int band_idx)
-+{
-+#define BSS_NUM	4
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u8 bss_nums = BSS_NUM;
-+	u32 idx;
-+	u32 mac_val, band_offset = 0, band_offset_umib = 0;
-+	u32 msdr6, msdr9, msdr18;
-+	u32 rvsr0, rscr26, rscr35, mctr5, mctr6, msr0, msr1, msr2;
-+	u32 tbcr0, tbcr1, tbcr2, tbcr3, tbcr4;
-+	u32 btscr[7];
-+	u32 tdrcr[5];
-+	u32 mbtocr[16], mbtbcr[16], mbrocr[16], mbrbcr[16];
-+	u32 btcr, btbcr, brocr, brbcr, btdcr, brdcr;
-+	u32 mu_cnt[5];
-+	u32 ampdu_cnt[3];
-+	u64 per;
-+
-+	switch (band_idx) {
-+	case 0:
-+		band_offset = 0;
-+		band_offset_umib = 0;
-+		break;
-+	case 1:
-+		band_offset = BN1_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
-+		band_offset_umib = WF_UMIB_TOP_B1BROCR_ADDR - WF_UMIB_TOP_B0BROCR_ADDR;
-+		break;
-+	case 2:
-+		band_offset = IP1_BN0_WF_MIB_TOP_BASE - BN0_WF_MIB_TOP_BASE;
-+		band_offset_umib = WF_UMIB_TOP_B2BROCR_ADDR - WF_UMIB_TOP_B0BROCR_ADDR;
-+		break;
-+	default:
-+		return true;
-+	}
-+
-+	seq_printf(s, "Band %d MIB Status\n", band_idx);
-+	seq_printf(s, "===============================\n");
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_M0SCR0_ADDR + band_offset);
-+	seq_printf(s, "MIB Status Control=0x%x\n", mac_val);
-+
-+	msdr6 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR6_ADDR + band_offset);
-+	rvsr0 = mt76_rr(dev, BN0_WF_MIB_TOP_RVSR0_ADDR + band_offset);
-+	rscr35 = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR35_ADDR + band_offset);
-+	msdr9 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR9_ADDR + band_offset);
-+	rscr26 = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR26_ADDR + band_offset);
-+	mctr5 = mt76_rr(dev, BN0_WF_MIB_TOP_MCTR5_ADDR + band_offset);
-+	mctr6 = mt76_rr(dev, BN0_WF_MIB_TOP_MCTR6_ADDR + band_offset);
-+	msdr18 = mt76_rr(dev, BN0_WF_MIB_TOP_M0SDR18_ADDR + band_offset);
-+	msr0 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR0_ADDR + band_offset);
-+	msr1 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR1_ADDR + band_offset);
-+	msr2 = mt76_rr(dev, BN0_WF_MIB_TOP_MSR2_ADDR + band_offset);
-+	ampdu_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR0_ADDR + band_offset);
-+	ampdu_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR3_ADDR + band_offset);
-+	ampdu_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR4_ADDR + band_offset);
-+	ampdu_cnt[1] &= BN0_WF_MIB_TOP_TSCR3_AMPDU_MPDU_COUNT_MASK;
-+	ampdu_cnt[2] &= BN0_WF_MIB_TOP_TSCR4_AMPDU_ACKED_COUNT_MASK;
-+
-+	seq_printf(s, "===Phy/Timing Related Counters===\n");
-+	seq_printf(s, "\tChannelIdleCnt=0x%x\n",
-+		msdr6 & BN0_WF_MIB_TOP_M0SDR6_CHANNEL_IDLE_COUNT_MASK);
-+	seq_printf(s, "\tCCA_NAV_Tx_Time=0x%x\n",
-+		msdr9 & BN0_WF_MIB_TOP_M0SDR9_CCA_NAV_TX_TIME_MASK);
-+	seq_printf(s, "\tRx_MDRDY_CNT=0x%x\n",
-+		rscr26 & BN0_WF_MIB_TOP_RSCR26_RX_MDRDY_COUNT_MASK);
-+	seq_printf(s, "\tCCK_MDRDY_TIME=0x%x, OFDM_MDRDY_TIME=0x%x",
-+		msr0 & BN0_WF_MIB_TOP_MSR0_CCK_MDRDY_TIME_MASK,
-+		msr1 & BN0_WF_MIB_TOP_MSR1_OFDM_LG_MIXED_VHT_MDRDY_TIME_MASK);
-+	seq_printf(s, ", OFDM_GREEN_MDRDY_TIME=0x%x\n",
-+		msr2 & BN0_WF_MIB_TOP_MSR2_OFDM_GREEN_MDRDY_TIME_MASK);
-+	seq_printf(s, "\tPrim CCA Time=0x%x\n",
-+		mctr5 & BN0_WF_MIB_TOP_MCTR5_P_CCA_TIME_MASK);
-+	seq_printf(s, "\tSec CCA Time=0x%x\n",
-+		mctr6 & BN0_WF_MIB_TOP_MCTR6_S_CCA_TIME_MASK);
-+	seq_printf(s, "\tPrim ED Time=0x%x\n",
-+		msdr18 & BN0_WF_MIB_TOP_M0SDR18_P_ED_TIME_MASK);
-+
-+	seq_printf(s, "===Tx Related Counters(Generic)===\n");
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR18_ADDR + band_offset);
-+	dev->dbg.bcn_total_cnt[band_idx] +=
-+		(mac_val & BN0_WF_MIB_TOP_TSCR18_BEACONTXCOUNT_MASK);
-+	seq_printf(s, "\tBeaconTxCnt=0x%x\n", dev->dbg.bcn_total_cnt[band_idx]);
-+	dev->dbg.bcn_total_cnt[band_idx] = 0;
-+
-+	tbcr0 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR0_ADDR + band_offset);
-+	seq_printf(s, "\tTx 20MHz Cnt=0x%x\n",
-+		tbcr0 & BN0_WF_MIB_TOP_TBCR0_TX_20MHZ_CNT_MASK);
-+	tbcr1 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR1_ADDR + band_offset);
-+	seq_printf(s, "\tTx 40MHz Cnt=0x%x\n",
-+		tbcr1 & BN0_WF_MIB_TOP_TBCR1_TX_40MHZ_CNT_MASK);
-+	tbcr2 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR2_ADDR + band_offset);
-+	seq_printf(s, "\tTx 80MHz Cnt=0x%x\n",
-+		tbcr2 & BN0_WF_MIB_TOP_TBCR2_TX_80MHZ_CNT_MASK);
-+	tbcr3 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR3_ADDR + band_offset);
-+	seq_printf(s, "\tTx 160MHz Cnt=0x%x\n",
-+		tbcr3 & BN0_WF_MIB_TOP_TBCR3_TX_160MHZ_CNT_MASK);
-+	tbcr4 = mt76_rr(dev, BN0_WF_MIB_TOP_TBCR4_ADDR + band_offset);
-+	seq_printf(s, "\tTx 320MHz Cnt=0x%x\n",
-+		tbcr4 & BN0_WF_MIB_TOP_TBCR4_TX_320MHZ_CNT_MASK);
-+	seq_printf(s, "\tAMPDU Cnt=0x%x\n", ampdu_cnt[0]);
-+	seq_printf(s, "\tAMPDU MPDU Cnt=0x%x\n", ampdu_cnt[1]);
-+	seq_printf(s, "\tAMPDU MPDU Ack Cnt=0x%x\n", ampdu_cnt[2]);
-+	per = (ampdu_cnt[2] == 0 ?
-+		0 : 1000 * (ampdu_cnt[1] - ampdu_cnt[2]) / ampdu_cnt[1]);
-+	seq_printf(s, "\tAMPDU MPDU PER=%llu.%1llu%%\n", per / 10, per % 10);
-+
-+	seq_printf(s, "===MU Related Counters===\n");
-+	mu_cnt[0] = mt76_rr(dev, BN0_WF_MIB_TOP_BSCR2_ADDR + band_offset);
-+	mu_cnt[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR5_ADDR + band_offset);
-+	mu_cnt[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR6_ADDR + band_offset);
-+	mu_cnt[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR8_ADDR + band_offset);
-+	mu_cnt[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TSCR7_ADDR + band_offset);
-+
-+	seq_printf(s, "\tMUBF_TX_COUNT=0x%x\n",
-+		mu_cnt[0] & BN0_WF_MIB_TOP_BSCR2_MUBF_TX_COUNT_MASK);
-+	seq_printf(s, "\tMU_TX_MPDU_COUNT(Ok+Fail)=0x%x\n", mu_cnt[1]);
-+	seq_printf(s, "\tMU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[2]);
-+	seq_printf(s, "\tMU_TO_MU_FAIL_PPDU_COUNT=0x%x\n", mu_cnt[3]);
-+	seq_printf(s, "\tSU_TX_OK_MPDU_COUNT=0x%x\n", mu_cnt[4]);
-+
-+	seq_printf(s, "===Rx Related Counters(Generic)===\n");
-+	seq_printf(s, "\tVector Mismacth Cnt=0x%x\n",
-+		rvsr0 & BN0_WF_MIB_TOP_RVSR0_VEC_MISS_COUNT_MASK);
-+	seq_printf(s, "\tDelimiter Fail Cnt=0x%x\n",
-+		rscr35 & BN0_WF_MIB_TOP_RSCR35_DELIMITER_FAIL_COUNT_MASK);
-+
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR1_ADDR + band_offset);
-+	seq_printf(s, "\tRxFCSErrCnt=0x%x\n",
-+		(mac_val & BN0_WF_MIB_TOP_RSCR1_RX_FCS_ERROR_COUNT_MASK));
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR33_ADDR + band_offset);
-+	seq_printf(s, "\tRxFifoFullCnt=0x%x\n",
-+		(mac_val & BN0_WF_MIB_TOP_RSCR33_RX_FIFO_FULL_COUNT_MASK));
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR36_ADDR + band_offset);
-+	seq_printf(s, "\tRxLenMismatch=0x%x\n",
-+		(mac_val & BN0_WF_MIB_TOP_RSCR36_RX_LEN_MISMATCH_MASK));
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR31_ADDR + band_offset);
-+	seq_printf(s, "\tRxMPDUCnt=0x%x\n",
-+		(mac_val & BN0_WF_MIB_TOP_RSCR31_RX_MPDU_COUNT_MASK));
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR27_ADDR + band_offset);
-+	seq_printf(s, "\tRx AMPDU Cnt=0x%x\n", mac_val);
-+	mac_val = mt76_rr(dev, BN0_WF_MIB_TOP_RSCR28_ADDR + band_offset);
-+	seq_printf(s, "\tRx Total ByteCnt=0x%x\n", mac_val);
-+
-+
-+	/* Per-BSS T/RX Counters */
-+	seq_printf(s, "===Per-BSS Related Tx/Rx Counters===\n");
-+	seq_printf(s, "BSS Idx TxCnt/DataCnt TxByteCnt RxOkCnt/DataCnt RxByteCnt\n");
-+	for (idx = 0; idx < bss_nums; idx++) {
-+		btcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTCR_ADDR + band_offset + idx * 4);
-+		btdcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTDCR_ADDR + band_offset + idx * 4);
-+		btbcr = mt76_rr(dev, BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + idx * 4);
-+
-+		brocr = mt76_rr(dev, WF_UMIB_TOP_B0BROCR_ADDR + band_offset_umib + idx * 4);
-+		brdcr = mt76_rr(dev, WF_UMIB_TOP_B0BRDCR_ADDR + band_offset_umib + idx * 4);
-+		brbcr = mt76_rr(dev, WF_UMIB_TOP_B0BRBCR_ADDR + band_offset_umib + idx * 4);
-+
-+		seq_printf(s, "%d\t 0x%x/0x%x\t 0x%x \t 0x%x/0x%x \t 0x%x\n",
-+			idx, btcr, btdcr, btbcr, brocr, brdcr, brbcr);
-+	}
-+
-+	seq_printf(s, "===Per-BSS Related MIB Counters===\n");
-+	seq_printf(s, "BSS Idx RTSTx/RetryCnt BAMissCnt AckFailCnt FrmRetry1/2/3Cnt\n");
-+
-+	/* Per-BSS TX Status */
-+	for (idx = 0; idx < bss_nums; idx++) {
-+		btscr[0] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR5_ADDR + band_offset + idx * 4);
-+		btscr[1] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR6_ADDR + band_offset + idx * 4);
-+		btscr[2] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR0_ADDR + band_offset + idx * 4);
-+		btscr[3] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR1_ADDR + band_offset + idx * 4);
-+		btscr[4] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR2_ADDR + band_offset + idx * 4);
-+		btscr[5] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR3_ADDR + band_offset + idx * 4);
-+		btscr[6] = mt76_rr(dev, BN0_WF_MIB_TOP_BTSCR4_ADDR + band_offset + idx * 4);
-+
-+		seq_printf(s, "%d:\t0x%x/0x%x  0x%x \t 0x%x \t  0x%x/0x%x/0x%x\n",
-+			idx, (btscr[0] & BN0_WF_MIB_TOP_BTSCR5_RTSTXCOUNTn_MASK),
-+			(btscr[1] & BN0_WF_MIB_TOP_BTSCR6_RTSRETRYCOUNTn_MASK),
-+			(btscr[2] & BN0_WF_MIB_TOP_BTSCR0_BAMISSCOUNTn_MASK),
-+			(btscr[3] & BN0_WF_MIB_TOP_BTSCR1_ACKFAILCOUNTn_MASK),
-+			(btscr[4] & BN0_WF_MIB_TOP_BTSCR2_FRAMERETRYCOUNTn_MASK),
-+			(btscr[5] & BN0_WF_MIB_TOP_BTSCR3_FRAMERETRY2COUNTn_MASK),
-+			(btscr[6] & BN0_WF_MIB_TOP_BTSCR4_FRAMERETRY3COUNTn_MASK));
-+	}
-+
-+	/* Dummy delimiter insertion result */
-+	seq_printf(s, "===Dummy delimiter insertion result===\n");
-+	tdrcr[0] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR0_ADDR + band_offset);
-+	tdrcr[1] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR1_ADDR + band_offset);
-+	tdrcr[2] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR2_ADDR + band_offset);
-+	tdrcr[3] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR3_ADDR + band_offset);
-+	tdrcr[4] = mt76_rr(dev, BN0_WF_MIB_TOP_TDRCR4_ADDR + band_offset);
-+
-+	seq_printf(s, "Range0 = %d\t Range1 = %d\t Range2 = %d\t Range3 = %d\t Range4 = %d\n",
-+		tdrcr[0],
-+		tdrcr[1],
-+		tdrcr[2],
-+		tdrcr[3],
-+		tdrcr[4]);
-+
-+	/* Per-MBSS T/RX Counters */
-+	seq_printf(s, "===Per-MBSS Related Tx/Rx Counters===\n");
-+	seq_printf(s, "MBSSIdx   TxOkCnt  TxByteCnt  RxOkCnt  RxByteCnt\n");
-+
-+	for (idx = 0; idx < 16; idx++) {
-+		mbtocr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTOCR_ADDR + band_offset + (bss_nums + idx) * 4);
-+		mbtbcr[idx] = mt76_rr(dev, BN0_WF_MIB_TOP_BTBCR_ADDR + band_offset + (bss_nums + idx) * 4);
-+
-+		mbrocr[idx] = mt76_rr(dev, WF_UMIB_TOP_B0BROCR_ADDR + band_offset_umib + (bss_nums + idx) * 4);
-+		mbrbcr[idx] = mt76_rr(dev, WF_UMIB_TOP_B0BRBCR_ADDR + band_offset_umib + (bss_nums + idx) * 4);
-+	}
-+
-+	for (idx = 0; idx < 16; idx++) {
-+		seq_printf(s, "%d\t 0x%x\t 0x%x \t 0x%x \t 0x%x\n",
-+			idx, mbtocr[idx], mbtbcr[idx], mbrocr[idx], mbrbcr[idx]);
-+	}
-+
-+	return 0;
-+}
-+
-+static int mt7996_mibinfo_band0(struct seq_file *s, void *data)
-+{
-+	mt7996_mibinfo_read_per_band(s, MT_BAND0);
-+	return 0;
-+}
-+
-+static int mt7996_mibinfo_band1(struct seq_file *s, void *data)
-+{
-+	mt7996_mibinfo_read_per_band(s, MT_BAND1);
-+	return 0;
-+}
-+
-+static int mt7996_mibinfo_band2(struct seq_file *s, void *data)
-+{
-+	mt7996_mibinfo_read_per_band(s, MT_BAND2);
-+	return 0;
-+}
-+
-+/* WTBL INFO */
-+static int
-+mt7996_wtbl_read_raw(struct mt7996_dev *dev, u16 idx,
-+		     enum mt7996_wtbl_type type, u16 start_dw,
-+		     u16 len, void *buf)
-+{
-+	u32 *dest_cpy = (u32 *)buf;
-+	u32 size_dw = len;
-+	u32 src = 0;
-+
-+	if (!buf)
-+		return 0xFF;
-+
-+	if (type == WTBL_TYPE_LMAC) {
-+		mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR,
-+			FIELD_PREP(MT_DBG_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
-+		src = LWTBL_IDX2BASE(idx, start_dw);
-+	} else if (type == WTBL_TYPE_UMAC) {
-+		mt76_wr(dev,  MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
-+		src = UWTBL_IDX2BASE(idx, start_dw);
-+	} else if (type == WTBL_TYPE_KEY) {
-+		mt76_wr(dev,  MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			MT_DBG_UWTBL_TOP_WDUCR_TARGET |
-+			FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
-+		src = KEYTBL_IDX2BASE(idx, start_dw);
-+	}
-+
-+	while (size_dw--) {
-+		*dest_cpy++ = mt76_rr(dev, src);
-+		src += 4;
-+	};
-+
-+	return 0;
-+}
-+
-+#if 0
-+static int
-+mt7996_wtbl_write_raw(struct mt7996_dev *dev, u16 idx,
-+			  enum mt7996_wtbl_type type, u16 start_dw,
-+			  u32 val)
-+{
-+	u32 addr = 0;
-+
-+	if (type == WTBL_TYPE_LMAC) {
-+		mt76_wr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR,
-+			FIELD_PREP(MT_DBG_WTBLON_TOP_WDUCR_GROUP, (idx >> 7)));
-+		addr = LWTBL_IDX2BASE(idx, start_dw);
-+	} else if (type == WTBL_TYPE_UMAC) {
-+		mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
-+		addr = UWTBL_IDX2BASE(idx, start_dw);
-+	} else if (type == WTBL_TYPE_KEY) {
-+		mt76_wr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			MT_DBG_UWTBL_TOP_WDUCR_TARGET |
-+			FIELD_PREP(MT_DBG_UWTBL_TOP_WDUCR_GROUP, (idx >> 7)));
-+		addr = KEYTBL_IDX2BASE(idx, start_dw);
-+	}
-+
-+	mt76_wr(dev, addr, val);
-+
-+	return 0;
-+}
-+#endif
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW0[] = {
-+	{"MUAR_IDX",    WF_LWTBL_MUAR_MASK, WF_LWTBL_MUAR_SHIFT,false},
-+	{"RCA1",        WF_LWTBL_RCA1_MASK, NO_SHIFT_DEFINE,	false},
-+	{"KID",         WF_LWTBL_KID_MASK,  WF_LWTBL_KID_SHIFT,	false},
-+	{"RCID",        WF_LWTBL_RCID_MASK, NO_SHIFT_DEFINE,	false},
-+	{"BAND",        WF_LWTBL_BAND_MASK, WF_LWTBL_BAND_SHIFT,false},
-+	{"RV",          WF_LWTBL_RV_MASK,   NO_SHIFT_DEFINE,	false},
-+	{"RCA2",        WF_LWTBL_RCA2_MASK, NO_SHIFT_DEFINE,	false},
-+	{"WPI_FLAG",    WF_LWTBL_WPI_FLAG_MASK, NO_SHIFT_DEFINE,true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw0_1(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LinkAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n",
-+		lwtbl[4], lwtbl[5], lwtbl[6], lwtbl[7], lwtbl[0], lwtbl[1]);
-+
-+	/* LMAC WTBL DW 0 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 0/1\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_PEER_INFO_DW_0*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW0[i].name) {
-+
-+		if (WTBL_LMAC_DW0[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW0[i].name,
-+					 (dw_value & WTBL_LMAC_DW0[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW0[i].name,
-+					  (dw_value & WTBL_LMAC_DW0[i].mask) >> WTBL_LMAC_DW0[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse *WTBL_LMAC_DW2;
-+static const struct berse_wtbl_parse WTBL_LMAC_DW2_7996[] = {
-+	{"AID",                 WF_LWTBL_AID_MASK,              WF_LWTBL_AID_SHIFT,	false},
-+	{"GID_SU",              WF_LWTBL_GID_SU_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"SPP_EN",              WF_LWTBL_SPP_EN_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"WPI_EVEN",            WF_LWTBL_WPI_EVEN_MASK,         NO_SHIFT_DEFINE,	false},
-+	{"AAD_OM",              WF_LWTBL_AAD_OM_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"CIPHER_PGTK",WF_LWTBL_CIPHER_SUIT_PGTK_MASK, WF_LWTBL_CIPHER_SUIT_PGTK_SHIFT,	true},
-+	{"FROM_DS",             WF_LWTBL_FD_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"TO_DS",               WF_LWTBL_TD_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"SW",                  WF_LWTBL_SW_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"UL",                  WF_LWTBL_UL_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"TX_POWER_SAVE",       WF_LWTBL_TX_PS_MASK,            NO_SHIFT_DEFINE,	true},
-+	{"QOS",                 WF_LWTBL_QOS_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"HT",                  WF_LWTBL_HT_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"VHT",                 WF_LWTBL_VHT_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"HE",                  WF_LWTBL_HE_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"EHT",                 WF_LWTBL_EHT_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"MESH",                WF_LWTBL_MESH_MASK,             NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW2_7992[] = {
-+	{"AID",                 WF_LWTBL_AID_MASK,              WF_LWTBL_AID_SHIFT,	false},
-+	{"GID_SU",              WF_LWTBL_GID_SU_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"DUAL_PTEC_EN",        WF_LWTBL_DUAL_PTEC_EN_MASK,     NO_SHIFT_DEFINE,	false},
-+	{"DUAL_CTS_CAP",        WF_LWTBL_DUAL_CTS_CAP_MASK,     NO_SHIFT_DEFINE,	false},
-+	{"CIPHER_PGTK",WF_LWTBL_CIPHER_SUIT_PGTK_MASK, WF_LWTBL_CIPHER_SUIT_PGTK_SHIFT,	true},
-+	{"FROM_DS",             WF_LWTBL_FD_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"TO_DS",               WF_LWTBL_TD_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"SW",                  WF_LWTBL_SW_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"UL",                  WF_LWTBL_UL_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"TX_POWER_SAVE",       WF_LWTBL_TX_PS_MASK,            NO_SHIFT_DEFINE,	true},
-+	{"QOS",                 WF_LWTBL_QOS_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"HT",                  WF_LWTBL_HT_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"VHT",                 WF_LWTBL_VHT_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"HE",                  WF_LWTBL_HE_MASK,               NO_SHIFT_DEFINE,	false},
-+	{"EHT",                 WF_LWTBL_EHT_MASK,              NO_SHIFT_DEFINE,	false},
-+	{"MESH",                WF_LWTBL_MESH_MASK,             NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw2(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 2 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 2\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_2*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW2[i].name) {
-+
-+		if (WTBL_LMAC_DW2[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW2[i].name,
-+					 (dw_value & WTBL_LMAC_DW2[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW2[i].name,
-+					  (dw_value & WTBL_LMAC_DW2[i].mask) >> WTBL_LMAC_DW2[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW3[] = {
-+	{"WMM_Q",           WF_LWTBL_WMM_Q_MASK,		WF_LWTBL_WMM_Q_SHIFT,		false},
-+	{"EHT_SIG_MCS",     WF_LWTBL_EHT_SIG_MCS_MASK,		WF_LWTBL_EHT_SIG_MCS_SHIFT,	false},
-+	{"HDRT_MODE",       WF_LWTBL_HDRT_MODE_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"BEAM_CHG",        WF_LWTBL_BEAM_CHG_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"EHT_LTF_SYM_NUM", WF_LWTBL_EHT_LTF_SYM_NUM_OPT_MASK,  WF_LWTBL_EHT_LTF_SYM_NUM_OPT_SHIFT,	true},
-+	{"PFMU_IDX",	    WF_LWTBL_PFMU_IDX_MASK,		WF_LWTBL_PFMU_IDX_SHIFT,	false},
-+	{"ULPF_IDX",	    WF_LWTBL_ULPF_IDX_MASK,		WF_LWTBL_ULPF_IDX_SHIFT,	false},
-+	{"RIBF",	    WF_LWTBL_RIBF_MASK,			NO_SHIFT_DEFINE,		false},
-+	{"ULPF",	    WF_LWTBL_ULPF_MASK,			NO_SHIFT_DEFINE,		false},
-+	{"BYPASS_TXSMM",    WF_LWTBL_BYPASS_TXSMM_MASK,         NO_SHIFT_DEFINE,		true},
-+	{"TBF_HT",          WF_LWTBL_TBF_HT_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"TBF_VHT",         WF_LWTBL_TBF_VHT_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"TBF_HE",          WF_LWTBL_TBF_HE_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"TBF_EHT",         WF_LWTBL_TBF_EHT_MASK,		NO_SHIFT_DEFINE,		false},
-+	{"IGN_FBK",         WF_LWTBL_IGN_FBK_MASK,		NO_SHIFT_DEFINE,		true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw3(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 3 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 3\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_3*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW3[i].name) {
-+
-+		if (WTBL_LMAC_DW3[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW3[i].name,
-+					 (dw_value & WTBL_LMAC_DW3[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW3[i].name,
-+					  (dw_value & WTBL_LMAC_DW3[i].mask) >> WTBL_LMAC_DW3[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW4[] = {
-+	{"NEGOTIATED_WINSIZE0",	WF_LWTBL_NEGOTIATED_WINSIZE0_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE0_SHIFT,    false},
-+	{"WINSIZE1",	WF_LWTBL_NEGOTIATED_WINSIZE1_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE1_SHIFT,    false},
-+	{"WINSIZE2",	WF_LWTBL_NEGOTIATED_WINSIZE2_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE2_SHIFT,    false},
-+	{"WINSIZE3",	WF_LWTBL_NEGOTIATED_WINSIZE3_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE3_SHIFT,    true},
-+	{"WINSIZE4",	WF_LWTBL_NEGOTIATED_WINSIZE4_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE4_SHIFT,    false},
-+	{"WINSIZE5",	WF_LWTBL_NEGOTIATED_WINSIZE5_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE5_SHIFT,    false},
-+	{"WINSIZE6",	WF_LWTBL_NEGOTIATED_WINSIZE6_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE6_SHIFT,    false},
-+	{"WINSIZE7",	WF_LWTBL_NEGOTIATED_WINSIZE7_MASK,	WF_LWTBL_NEGOTIATED_WINSIZE7_SHIFT,    true},
-+	{"PE",              WF_LWTBL_PE_MASK,           WF_LWTBL_PE_SHIFT,	false},
-+	{"DIS_RHTR",        WF_LWTBL_DIS_RHTR_MASK,     NO_SHIFT_DEFINE,	false},
-+	{"LDPC_HT",         WF_LWTBL_LDPC_HT_MASK,      NO_SHIFT_DEFINE,	false},
-+	{"LDPC_VHT",        WF_LWTBL_LDPC_VHT_MASK,     NO_SHIFT_DEFINE,	false},
-+	{"LDPC_HE",         WF_LWTBL_LDPC_HE_MASK,      NO_SHIFT_DEFINE,	false},
-+	{"LDPC_EHT",	    WF_LWTBL_LDPC_EHT_MASK,	NO_SHIFT_DEFINE,	true},
-+	{"BA_MODE",	    WF_LWTBL_BA_MODE_MASK,	NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw4(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 4 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 4\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_4*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW4[i].name) {
-+		if (WTBL_LMAC_DW4[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW4[i].name,
-+					 (dw_value & WTBL_LMAC_DW4[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW4[i].name,
-+					  (dw_value & WTBL_LMAC_DW4[i].mask) >> WTBL_LMAC_DW4[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse *WTBL_LMAC_DW5;
-+static const struct berse_wtbl_parse WTBL_LMAC_DW5_7996[] = {
-+	{"AF",                  WF_LWTBL_AF_MASK,           WF_LWTBL_AF_SHIFT,	false},
-+	{"AF_HE",               WF_LWTBL_AF_HE_MASK,        WF_LWTBL_AF_HE_SHIFT,false},
-+	{"RTS",                 WF_LWTBL_RTS_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SMPS",                WF_LWTBL_SMPS_MASK,         NO_SHIFT_DEFINE,	false},
-+	{"DYN_BW",              WF_LWTBL_DYN_BW_MASK,       NO_SHIFT_DEFINE,	true},
-+	{"MMSS",                WF_LWTBL_MMSS_MASK,         WF_LWTBL_MMSS_SHIFT,false},
-+	{"USR",                 WF_LWTBL_USR_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SR_RATE",             WF_LWTBL_SR_R_MASK,         WF_LWTBL_SR_R_SHIFT,false},
-+	{"SR_ABORT",            WF_LWTBL_SR_ABORT_MASK,     NO_SHIFT_DEFINE,	true},
-+	{"TX_POWER_OFFSET",     WF_LWTBL_TX_POWER_OFFSET_MASK,  WF_LWTBL_TX_POWER_OFFSET_SHIFT,	false},
-+	{"LTF_EHT",		WF_LWTBL_LTF_EHT_MASK,      WF_LWTBL_LTF_EHT_SHIFT, false},
-+	{"GI_EHT",		WF_LWTBL_GI_EHT_MASK,       WF_LWTBL_GI_EHT_SHIFT, false},
-+	{"DOPPL",               WF_LWTBL_DOPPL_MASK,        NO_SHIFT_DEFINE,	false},
-+	{"TXOP_PS_CAP",         WF_LWTBL_TXOP_PS_CAP_MASK,  NO_SHIFT_DEFINE,	false},
-+	{"DONOT_UPDATE_I_PSM",  WF_LWTBL_DU_I_PSM_MASK,     NO_SHIFT_DEFINE,	true},
-+	{"I_PSM",               WF_LWTBL_I_PSM_MASK,        NO_SHIFT_DEFINE,	false},
-+	{"PSM",                 WF_LWTBL_PSM_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SKIP_TX",             WF_LWTBL_SKIP_TX_MASK,      NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW5_7992[] = {
-+	{"AF",                  WF_LWTBL_AF_MASK_7992,      WF_LWTBL_AF_SHIFT,	false},
-+	{"RTS",                 WF_LWTBL_RTS_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SMPS",                WF_LWTBL_SMPS_MASK,         NO_SHIFT_DEFINE,	false},
-+	{"DYN_BW",              WF_LWTBL_DYN_BW_MASK,       NO_SHIFT_DEFINE,	true},
-+	{"MMSS",                WF_LWTBL_MMSS_MASK,         WF_LWTBL_MMSS_SHIFT,false},
-+	{"USR",                 WF_LWTBL_USR_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SR_RATE",             WF_LWTBL_SR_R_MASK,         WF_LWTBL_SR_R_SHIFT,false},
-+	{"SR_ABORT",            WF_LWTBL_SR_ABORT_MASK,     NO_SHIFT_DEFINE,	true},
-+	{"TX_POWER_OFFSET",     WF_LWTBL_TX_POWER_OFFSET_MASK,  WF_LWTBL_TX_POWER_OFFSET_SHIFT,	false},
-+	{"LTF_EHT",		WF_LWTBL_LTF_EHT_MASK,      WF_LWTBL_LTF_EHT_SHIFT, false},
-+	{"GI_EHT",		WF_LWTBL_GI_EHT_MASK,       WF_LWTBL_GI_EHT_SHIFT, false},
-+	{"DOPPL",               WF_LWTBL_DOPPL_MASK,        NO_SHIFT_DEFINE,	false},
-+	{"TXOP_PS_CAP",         WF_LWTBL_TXOP_PS_CAP_MASK,  NO_SHIFT_DEFINE,	false},
-+	{"DONOT_UPDATE_I_PSM",  WF_LWTBL_DU_I_PSM_MASK,     NO_SHIFT_DEFINE,	true},
-+	{"I_PSM",               WF_LWTBL_I_PSM_MASK,        NO_SHIFT_DEFINE,	false},
-+	{"PSM",                 WF_LWTBL_PSM_MASK,          NO_SHIFT_DEFINE,	false},
-+	{"SKIP_TX",             WF_LWTBL_SKIP_TX_MASK,      NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw5(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 5 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 5\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_5*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW5[i].name) {
-+		if (WTBL_LMAC_DW5[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW5[i].name,
-+					 (dw_value & WTBL_LMAC_DW5[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW5[i].name,
-+					  (dw_value & WTBL_LMAC_DW5[i].mask) >> WTBL_LMAC_DW5[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW6[] = {
-+	{"CBRN",        WF_LWTBL_CBRN_MASK,	    WF_LWTBL_CBRN_SHIFT,	false},
-+	{"DBNSS_EN",    WF_LWTBL_DBNSS_EN_MASK, NO_SHIFT_DEFINE,	false},
-+	{"BAF_EN",      WF_LWTBL_BAF_EN_MASK,   NO_SHIFT_DEFINE,	false},
-+	{"RDGBA",       WF_LWTBL_RDGBA_MASK,    NO_SHIFT_DEFINE,	false},
-+	{"RDG",         WF_LWTBL_R_MASK,        NO_SHIFT_DEFINE,	false},
-+	{"SPE_IDX",     WF_LWTBL_SPE_IDX_MASK,  WF_LWTBL_SPE_IDX_SHIFT,	true},
-+	{"G2",          WF_LWTBL_G2_MASK,       NO_SHIFT_DEFINE,	false},
-+	{"G4",          WF_LWTBL_G4_MASK,       NO_SHIFT_DEFINE,	false},
-+	{"G8",          WF_LWTBL_G8_MASK,       NO_SHIFT_DEFINE,	false},
-+	{"G16",         WF_LWTBL_G16_MASK,      NO_SHIFT_DEFINE,	true},
-+	{"G2_LTF",      WF_LWTBL_G2_LTF_MASK,   WF_LWTBL_G2_LTF_SHIFT,	false},
-+	{"G4_LTF",      WF_LWTBL_G4_LTF_MASK,   WF_LWTBL_G4_LTF_SHIFT,	false},
-+	{"G8_LTF",      WF_LWTBL_G8_LTF_MASK,   WF_LWTBL_G8_LTF_SHIFT,	false},
-+	{"G16_LTF",     WF_LWTBL_G16_LTF_MASK,  WF_LWTBL_G16_LTF_SHIFT,	true},
-+	{"G2_HE",       WF_LWTBL_G2_HE_MASK,    WF_LWTBL_G2_HE_SHIFT,	false},
-+	{"G4_HE",       WF_LWTBL_G4_HE_MASK,    WF_LWTBL_G4_HE_SHIFT,	false},
-+	{"G8_HE",       WF_LWTBL_G8_HE_MASK,    WF_LWTBL_G8_HE_SHIFT,	false},
-+	{"G16_HE",      WF_LWTBL_G16_HE_MASK,   WF_LWTBL_G16_HE_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw6(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 6 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 6\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_6*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW6[i].name) {
-+		if (WTBL_LMAC_DW6[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW6[i].name,
-+					 (dw_value & WTBL_LMAC_DW6[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW6[i].name,
-+					  (dw_value & WTBL_LMAC_DW6[i].mask) >> WTBL_LMAC_DW6[i].shift);
-+		i++;
-+	}
-+}
-+
-+static void parse_fmac_lwtbl_dw7(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	int i = 0;
-+
-+	/* LMAC WTBL DW 7 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 7\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_7*4]);
-+	dw_value = *addr;
-+
-+	for (i = 0; i < 8; i++) {
-+		seq_printf(s, "\tBA_WIN_SIZE%u:%lu\n", i, ((dw_value & BITS(i*4, i*4+3)) >> i*4));
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW8[] = {
-+	{"RTS_FAIL_CNT_AC0",    WF_LWTBL_AC0_RTS_FAIL_CNT_MASK,	WF_LWTBL_AC0_RTS_FAIL_CNT_SHIFT,	false},
-+	{"AC1",                 WF_LWTBL_AC1_RTS_FAIL_CNT_MASK,	WF_LWTBL_AC1_RTS_FAIL_CNT_SHIFT,	false},
-+	{"AC2",                 WF_LWTBL_AC2_RTS_FAIL_CNT_MASK,	WF_LWTBL_AC2_RTS_FAIL_CNT_SHIFT,	false},
-+	{"AC3",                 WF_LWTBL_AC3_RTS_FAIL_CNT_MASK,	WF_LWTBL_AC3_RTS_FAIL_CNT_SHIFT,	true},
-+	{"PARTIAL_AID",         WF_LWTBL_PARTIAL_AID_MASK,		WF_LWTBL_PARTIAL_AID_SHIFT,	false},
-+	{"CHK_PER",             WF_LWTBL_CHK_PER_MASK,		NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw8(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 8 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 8\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_8*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW8[i].name) {
-+		if (WTBL_LMAC_DW8[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW8[i].name,
-+					 (dw_value & WTBL_LMAC_DW8[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW8[i].name,
-+					  (dw_value & WTBL_LMAC_DW8[i].mask) >> WTBL_LMAC_DW8[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse *WTBL_LMAC_DW9;
-+static const struct berse_wtbl_parse WTBL_LMAC_DW9_7996[] = {
-+	{"RX_AVG_MPDU_SIZE",    WF_LWTBL_RX_AVG_MPDU_SIZE_MASK,    WF_LWTBL_RX_AVG_MPDU_SIZE_SHIFT,	false},
-+	{"PRITX_SW_MODE",       WF_LWTBL_PRITX_SW_MODE_MASK,       NO_SHIFT_DEFINE,	false},
-+	{"PRITX_ERSU",	    WF_LWTBL_PRITX_ERSU_MASK,	       NO_SHIFT_DEFINE,	false},
-+	{"PRITX_PLR",           WF_LWTBL_PRITX_PLR_MASK,           NO_SHIFT_DEFINE,	true},
-+	{"PRITX_DCM",           WF_LWTBL_PRITX_DCM_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"PRITX_ER106T",        WF_LWTBL_PRITX_ER106T_MASK,        NO_SHIFT_DEFINE,	true},
-+	/* {"FCAP(0:20 1:~40)",    WTBL_FCAP_20_TO_160_MHZ,	WTBL_FCAP_20_TO_160_MHZ_OFFSET}, */
-+	{"MPDU_FAIL_CNT",       WF_LWTBL_MPDU_FAIL_CNT_MASK,       WF_LWTBL_MPDU_FAIL_CNT_SHIFT,	false},
-+	{"MPDU_OK_CNT",         WF_LWTBL_MPDU_OK_CNT_MASK,         WF_LWTBL_MPDU_OK_CNT_SHIFT,	false},
-+	{"RATE_IDX",            WF_LWTBL_RATE_IDX_MASK,            WF_LWTBL_RATE_IDX_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW9_7992[] = {
-+	{"RX_AVG_MPDU_SIZE",    WF_LWTBL_RX_AVG_MPDU_SIZE_MASK,    WF_LWTBL_RX_AVG_MPDU_SIZE_SHIFT,	false},
-+	{"PRITX_SW_MODE",       WF_LWTBL_PRITX_SW_MODE_MASK_7992,       NO_SHIFT_DEFINE,	false},
-+	{"PRITX_ERSU",	    WF_LWTBL_PRITX_ERSU_MASK_7992,	       NO_SHIFT_DEFINE,	false},
-+	{"PRITX_PLR",           WF_LWTBL_PRITX_PLR_MASK_7992,           NO_SHIFT_DEFINE,	true},
-+	{"PRITX_DCM",           WF_LWTBL_PRITX_DCM_MASK,           NO_SHIFT_DEFINE,	false},
-+	{"PRITX_ER106T",        WF_LWTBL_PRITX_ER106T_MASK,        NO_SHIFT_DEFINE,	true},
-+	/* {"FCAP(0:20 1:~40)",    WTBL_FCAP_20_TO_160_MHZ,	WTBL_FCAP_20_TO_160_MHZ_OFFSET}, */
-+	{"MPDU_FAIL_CNT",       WF_LWTBL_MPDU_FAIL_CNT_MASK,       WF_LWTBL_MPDU_FAIL_CNT_SHIFT,	false},
-+	{"MPDU_OK_CNT",         WF_LWTBL_MPDU_OK_CNT_MASK,         WF_LWTBL_MPDU_OK_CNT_SHIFT,	false},
-+	{"RATE_IDX",            WF_LWTBL_RATE_IDX_MASK,            WF_LWTBL_RATE_IDX_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+char *fcap_name[] = {"20MHz", "20/40MHz", "20/40/80MHz", "20/40/80/160/80+80MHz", "20/40/80/160/80+80/320MHz"};
-+
-+static void parse_fmac_lwtbl_dw9(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 9 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 9\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_9*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW9[i].name) {
-+		if (WTBL_LMAC_DW9[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW9[i].name,
-+					 (dw_value & WTBL_LMAC_DW9[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW9[i].name,
-+					  (dw_value & WTBL_LMAC_DW9[i].mask) >> WTBL_LMAC_DW9[i].shift);
-+		i++;
-+	}
-+
-+	/* FCAP parser */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "FCAP:%s\n", fcap_name[(dw_value & WF_LWTBL_FCAP_MASK) >> WF_LWTBL_FCAP_SHIFT]);
-+}
-+
-+#define HW_TX_RATE_TO_MODE(_x)			(((_x) & WTBL_RATE_TX_MODE_MASK) >> WTBL_RATE_TX_MODE_OFFSET)
-+#define HW_TX_RATE_TO_MCS(_x, _mode)		((_x) & WTBL_RATE_TX_RATE_MASK >> WTBL_RATE_TX_RATE_OFFSET)
-+#define HW_TX_RATE_TO_NSS(_x)			(((_x) & WTBL_RATE_NSTS_MASK) >> WTBL_RATE_NSTS_OFFSET)
-+#define HW_TX_RATE_TO_STBC(_x)			(((_x) & WTBL_RATE_STBC_MASK) >> WTBL_RATE_STBC_OFFSET)
-+
-+#define MAX_TX_MODE 16
-+static char *HW_TX_MODE_STR[] = {"CCK", "OFDM", "HT-Mix", "HT-GF", "VHT",
-+				 "N/A", "N/A", "N/A",
-+				 "HE_SU", "HE_EXT_SU", "HE_TRIG", "HE_MU",
-+				 "N/A",
-+				 "EHT_EXT_SU", "EHT_TRIG", "EHT_MU",
-+				 "N/A"};
-+static char *HW_TX_RATE_CCK_STR[] = {"1M", "2Mlong", "5.5Mlong", "11Mlong", "N/A", "2Mshort", "5.5Mshort", "11Mshort", "N/A"};
-+static char *HW_TX_RATE_OFDM_STR[] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M", "N/A"};
-+
-+static char *hw_rate_ofdm_str(uint16_t ofdm_idx)
-+{
-+	switch (ofdm_idx) {
-+	case 11: /* 6M */
-+		return HW_TX_RATE_OFDM_STR[0];
-+
-+	case 15: /* 9M */
-+		return HW_TX_RATE_OFDM_STR[1];
-+
-+	case 10: /* 12M */
-+		return HW_TX_RATE_OFDM_STR[2];
-+
-+	case 14: /* 18M */
-+		return HW_TX_RATE_OFDM_STR[3];
-+
-+	case 9: /* 24M */
-+		return HW_TX_RATE_OFDM_STR[4];
-+
-+	case 13: /* 36M */
-+		return HW_TX_RATE_OFDM_STR[5];
-+
-+	case 8: /* 48M */
-+		return HW_TX_RATE_OFDM_STR[6];
-+
-+	case 12: /* 54M */
-+		return HW_TX_RATE_OFDM_STR[7];
-+
-+	default:
-+		return HW_TX_RATE_OFDM_STR[8];
-+	}
-+}
-+
-+static char *hw_rate_str(u8 mode, uint16_t rate_idx)
-+{
-+	if (mode == 0)
-+		return rate_idx < 8 ? HW_TX_RATE_CCK_STR[rate_idx] : HW_TX_RATE_CCK_STR[8];
-+	else if (mode == 1)
-+		return hw_rate_ofdm_str(rate_idx);
-+	else
-+		return "MCS";
-+}
-+
-+static void
-+parse_rate(struct seq_file *s, uint16_t rate_idx, uint16_t txrate)
-+{
-+	uint16_t txmode, mcs, nss, stbc;
-+
-+	txmode = HW_TX_RATE_TO_MODE(txrate);
-+	mcs = HW_TX_RATE_TO_MCS(txrate, txmode);
-+	nss = HW_TX_RATE_TO_NSS(txrate);
-+	stbc = HW_TX_RATE_TO_STBC(txrate);
-+
-+	seq_printf(s, "\tRate%d(0x%x):TxMode=%d(%s), TxRate=%d(%s), Nsts=%d, STBC=%d\n",
-+			  rate_idx + 1, txrate,
-+			  txmode, (txmode < MAX_TX_MODE ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[MAX_TX_MODE]),
-+			  mcs, hw_rate_str(txmode, mcs), nss, stbc);
-+}
-+
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW10[] = {
-+	{"RATE1",       WF_LWTBL_RATE1_MASK,        WF_LWTBL_RATE1_SHIFT},
-+	{"RATE2",       WF_LWTBL_RATE2_MASK,        WF_LWTBL_RATE2_SHIFT},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw10(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 10 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 10\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_1_2*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW10[i].name) {
-+		parse_rate(s, i, (dw_value & WTBL_LMAC_DW10[i].mask) >> WTBL_LMAC_DW10[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW11[] = {
-+	{"RATE3",       WF_LWTBL_RATE3_MASK,        WF_LWTBL_RATE3_SHIFT},
-+	{"RATE4",       WF_LWTBL_RATE4_MASK,        WF_LWTBL_RATE4_SHIFT},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw11(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 11 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 11\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_3_4*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW11[i].name) {
-+		parse_rate(s, i+2, (dw_value & WTBL_LMAC_DW11[i].mask) >> WTBL_LMAC_DW11[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW12[] = {
-+	{"RATE5",       WF_LWTBL_RATE5_MASK,        WF_LWTBL_RATE5_SHIFT},
-+	{"RATE6",       WF_LWTBL_RATE6_MASK,        WF_LWTBL_RATE6_SHIFT},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw12(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 12 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 12\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_5_6*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW12[i].name) {
-+		parse_rate(s, i+4, (dw_value & WTBL_LMAC_DW12[i].mask) >> WTBL_LMAC_DW12[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW13[] = {
-+	{"RATE7",       WF_LWTBL_RATE7_MASK,        WF_LWTBL_RATE7_SHIFT},
-+	{"RATE8",       WF_LWTBL_RATE8_MASK,        WF_LWTBL_RATE8_SHIFT},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw13(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 13 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 13\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_AUTO_RATE_7_8*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW13[i].name) {
-+		parse_rate(s, i+6, (dw_value & WTBL_LMAC_DW13[i].mask) >> WTBL_LMAC_DW13[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW14_BMC[] = {
-+	{"CIPHER_IGTK",         WF_LWTBL_CIPHER_SUIT_IGTK_MASK,    WF_LWTBL_CIPHER_SUIT_IGTK_SHIFT,		false},
-+	{"CIPHER_BIGTK",        WF_LWTBL_CIPHER_SUIT_BIGTK_MASK,   WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW14[] = {
-+	{"RATE1_TX_CNT",      WF_LWTBL_RATE1_TX_CNT_MASK,     WF_LWTBL_RATE1_TX_CNT_SHIFT,   false},
-+	{"RATE1_FAIL_CNT",    WF_LWTBL_RATE1_FAIL_CNT_MASK,   WF_LWTBL_RATE1_FAIL_CNT_SHIFT, true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw14(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr, *muar_addr = 0;
-+	u32 dw_value, muar_dw_value = 0;
-+	u16 i = 0;
-+
-+	/* DUMP DW14 for BMC entry only */
-+	muar_addr = (u32 *)&(lwtbl[WF_LWTBL_MUAR_DW*4]);
-+	muar_dw_value = *muar_addr;
-+	if (((muar_dw_value & WF_LWTBL_MUAR_MASK) >> WF_LWTBL_MUAR_SHIFT)
-+		== MUAR_INDEX_OWN_MAC_ADDR_BC_MC) {
-+		/* LMAC WTBL DW 14 */
-+		seq_printf(s, "\t\n");
-+		seq_printf(s, "LWTBL DW 14\n");
-+		addr = (u32 *)&(lwtbl[WF_LWTBL_CIPHER_SUIT_IGTK_DW*4]);
-+		dw_value = *addr;
-+
-+		while (WTBL_LMAC_DW14_BMC[i].name) {
-+			if (WTBL_LMAC_DW14_BMC[i].shift == NO_SHIFT_DEFINE)
-+				seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW14_BMC[i].name,
-+					(dw_value & WTBL_LMAC_DW14_BMC[i].mask) ? 1 : 0);
-+			else
-+				seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW14_BMC[i].name,
-+					(dw_value & WTBL_LMAC_DW14_BMC[i].mask) >> WTBL_LMAC_DW14_BMC[i].shift);
-+			i++;
-+		}
-+	} else {
-+		seq_printf(s, "\t\n");
-+		seq_printf(s, "LWTBL DW 14\n");
-+		addr = (u32 *)&(lwtbl[WF_LWTBL_CIPHER_SUIT_IGTK_DW*4]);
-+		dw_value = *addr;
-+
-+		while (WTBL_LMAC_DW14[i].name) {
-+			if (WTBL_LMAC_DW14[i].shift == NO_SHIFT_DEFINE)
-+				seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW14[i].name,
-+					(dw_value & WTBL_LMAC_DW14[i].mask) ? 1 : 0);
-+			else
-+				seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW14[i].name,
-+					(dw_value & WTBL_LMAC_DW14[i].mask) >> WTBL_LMAC_DW14[i].shift);
-+			i++;
-+		}
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW28[] = {
-+	{"RELATED_IDX0",	WF_LWTBL_RELATED_IDX0_MASK,		WF_LWTBL_RELATED_IDX0_SHIFT,	false},
-+	{"RELATED_BAND0",	WF_LWTBL_RELATED_BAND0_MASK,		WF_LWTBL_RELATED_BAND0_SHIFT,	false},
-+	{"PRI_MLD_BAND",    WF_LWTBL_PRIMARY_MLD_BAND_MASK,		WF_LWTBL_PRIMARY_MLD_BAND_SHIFT,	true},
-+	{"RELATED_IDX1",	WF_LWTBL_RELATED_IDX1_MASK,		WF_LWTBL_RELATED_IDX1_SHIFT,	false},
-+	{"RELATED_BAND1",   WF_LWTBL_RELATED_BAND1_MASK,		WF_LWTBL_RELATED_BAND1_SHIFT,	false},
-+	{"SEC_MLD_BAND",	WF_LWTBL_SECONDARY_MLD_BAND_MASK,	WF_LWTBL_SECONDARY_MLD_BAND_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw28(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 28 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 28\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_1*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW28[i].name) {
-+		if (WTBL_LMAC_DW28[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW28[i].name,
-+				(dw_value & WTBL_LMAC_DW28[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW28[i].name,
-+				(dw_value & WTBL_LMAC_DW28[i].mask) >>
-+					WTBL_LMAC_DW28[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW29[] = {
-+	{"DISPATCH_POLICY_MLD_TID0", WF_LWTBL_DISPATCH_POLICY0_MASK,	WF_LWTBL_DISPATCH_POLICY0_SHIFT,	false},
-+	{"MLD_TID1",	WF_LWTBL_DISPATCH_POLICY1_MASK,		WF_LWTBL_DISPATCH_POLICY1_SHIFT,	false},
-+	{"MLD_TID2",	WF_LWTBL_DISPATCH_POLICY2_MASK,		WF_LWTBL_DISPATCH_POLICY2_SHIFT,	false},
-+	{"MLD_TID3",	WF_LWTBL_DISPATCH_POLICY3_MASK,	WF_LWTBL_DISPATCH_POLICY3_SHIFT,	true},
-+	{"MLD_TID4",	WF_LWTBL_DISPATCH_POLICY4_MASK,		WF_LWTBL_DISPATCH_POLICY4_SHIFT,	false},
-+	{"MLD_TID5",	WF_LWTBL_DISPATCH_POLICY5_MASK,		WF_LWTBL_DISPATCH_POLICY5_SHIFT,	false},
-+	{"MLD_TID6",	WF_LWTBL_DISPATCH_POLICY6_MASK,		WF_LWTBL_DISPATCH_POLICY6_SHIFT,	false},
-+	{"MLD_TID7",	WF_LWTBL_DISPATCH_POLICY7_MASK,		WF_LWTBL_DISPATCH_POLICY7_SHIFT,	true},
-+	{"OMLD_ID",		WF_LWTBL_OWN_MLD_ID_MASK,	WF_LWTBL_OWN_MLD_ID_SHIFT,	false},
-+	{"EMLSR0",		WF_LWTBL_EMLSR0_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"EMLMR0",		WF_LWTBL_EMLMR0_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"EMLSR1",		WF_LWTBL_EMLSR1_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"EMLMR1",		WF_LWTBL_EMLMR1_MASK,		NO_SHIFT_DEFINE,	true},
-+	{"EMLSR2",		WF_LWTBL_EMLSR2_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"EMLMR2",		WF_LWTBL_EMLMR2_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"STR_BITMAP",	WF_LWTBL_STR_BITMAP_MASK,	WF_LWTBL_STR_BITMAP_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw29(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 29 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 29\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_2*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW29[i].name) {
-+		if (WTBL_LMAC_DW29[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW29[i].name,
-+				(dw_value & WTBL_LMAC_DW29[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW29[i].name,
-+				(dw_value & WTBL_LMAC_DW29[i].mask) >>
-+					WTBL_LMAC_DW29[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW30[] = {
-+	{"DISPATCH_ORDER",	WF_LWTBL_DISPATCH_ORDER_MASK,	WF_LWTBL_DISPATCH_ORDER_SHIFT,	false},
-+	{"DISPATCH_RATIO",	WF_LWTBL_DISPATCH_RATIO_MASK,	WF_LWTBL_DISPATCH_RATIO_SHIFT,	false},
-+	{"LINK_MGF",		WF_LWTBL_LINK_MGF_MASK,		WF_LWTBL_LINK_MGF_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw30(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 30 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 30\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_MLO_INFO_LINE_3*4]);
-+	dw_value = *addr;
-+
-+
-+	while (WTBL_LMAC_DW30[i].name) {
-+		if (WTBL_LMAC_DW30[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW30[i].name,
-+				(dw_value & WTBL_LMAC_DW30[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW30[i].name,
-+				(dw_value & WTBL_LMAC_DW30[i].mask) >> WTBL_LMAC_DW30[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW31[] = {
-+	{"BFTX_TB",          WF_LWTBL_BFTX_TB_MASK,                 NO_SHIFT_DEFINE,    false},
-+	{"DROP",          WF_LWTBL_DROP_MASK,                 NO_SHIFT_DEFINE,    false},
-+	{"CASCAD",	        WF_LWTBL_CASCAD_MASK,			NO_SHIFT_DEFINE,    false},
-+	{"ALL_ACK",	        WF_LWTBL_ALL_ACK_MASK,			NO_SHIFT_DEFINE,    false},
-+	{"MPDU_SIZE",	WF_LWTBL_MPDU_SIZE_MASK,		WF_LWTBL_MPDU_SIZE_SHIFT,  false},
-+	{"RXD_DUP_MODE",	WF_LWTBL_RXD_DUP_MODE_MASK,			WF_LWTBL_RXD_DUP_MODE_SHIFT,  true},
-+	{"ACK_EN",		WF_LWTBL_ACK_EN_MASK,			NO_SHIFT_DEFINE,		true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw31(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 31 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 31\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_RESP_INFO_DW_31*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW31[i].name) {
-+		if (WTBL_LMAC_DW31[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW31[i].name,
-+				(dw_value & WTBL_LMAC_DW31[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW31[i].name,
-+				(dw_value & WTBL_LMAC_DW31[i].mask) >>
-+					WTBL_LMAC_DW31[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW32[] = {
-+	{"OM_INFO",			WF_LWTBL_OM_INFO_MASK,			WF_LWTBL_OM_INFO_SHIFT,		false},
-+	{"OM_INFO_EHT",         WF_LWTBL_OM_INFO_EHT_MASK,         WF_LWTBL_OM_INFO_EHT_SHIFT,  false},
-+	{"RXD_DUP_FOR_OM_CHG",		WF_LWTBL_RXD_DUP_FOR_OM_CHG_MASK,	NO_SHIFT_DEFINE,		false},
-+	{"RXD_DUP_WHITE_LIST",	WF_LWTBL_RXD_DUP_WHITE_LIST_MASK,	WF_LWTBL_RXD_DUP_WHITE_LIST_SHIFT,	false},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw32(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 32 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 32\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_DUP_INFO_DW_32*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW32[i].name) {
-+		if (WTBL_LMAC_DW32[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW32[i].name,
-+				(dw_value & WTBL_LMAC_DW32[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW32[i].name,
-+				(dw_value & WTBL_LMAC_DW32[i].mask) >>
-+					WTBL_LMAC_DW32[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW33[] = {
-+	{"USER_RSSI",                   WF_LWTBL_USER_RSSI_MASK,            WF_LWTBL_USER_RSSI_SHIFT,	false},
-+	{"USER_SNR",                    WF_LWTBL_USER_SNR_MASK,             WF_LWTBL_USER_SNR_SHIFT,	false},
-+	{"RAPID_REACTION_RATE",         WF_LWTBL_RAPID_REACTION_RATE_MASK,  WF_LWTBL_RAPID_REACTION_RATE_SHIFT,	true},
-+	{"HT_AMSDU(Read Only)",         WF_LWTBL_HT_AMSDU_MASK,             NO_SHIFT_DEFINE,	false},
-+	{"AMSDU_CROSS_LG(Read Only)",   WF_LWTBL_AMSDU_CROSS_LG_MASK,       NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw33(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 33 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 33\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_1*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_LMAC_DW33[i].name) {
-+		if (WTBL_LMAC_DW33[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW33[i].name,
-+				(dw_value & WTBL_LMAC_DW33[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW33[i].name,
-+				(dw_value & WTBL_LMAC_DW33[i].mask) >>
-+					WTBL_LMAC_DW33[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW34[] = {
-+	{"RESP_RCPI0",	WF_LWTBL_RESP_RCPI0_MASK,	WF_LWTBL_RESP_RCPI0_SHIFT,	false},
-+	{"RCPI1",	WF_LWTBL_RESP_RCPI1_MASK,	WF_LWTBL_RESP_RCPI1_SHIFT,	false},
-+	{"RCPI2",	WF_LWTBL_RESP_RCPI2_MASK,	WF_LWTBL_RESP_RCPI2_SHIFT,	false},
-+	{"RCPI3",	WF_LWTBL_RESP_RCPI3_MASK,	WF_LWTBL_RESP_RCPI3_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw34(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 34 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 34\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_2*4]);
-+	dw_value = *addr;
-+
-+
-+	while (WTBL_LMAC_DW34[i].name) {
-+		if (WTBL_LMAC_DW34[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW34[i].name,
-+				(dw_value & WTBL_LMAC_DW34[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW34[i].name,
-+				(dw_value & WTBL_LMAC_DW34[i].mask) >>
-+					WTBL_LMAC_DW34[i].shift);
-+		i++;
-+	}
-+}
-+
-+static const struct berse_wtbl_parse WTBL_LMAC_DW35[] = {
-+	{"SNR 0",	WF_LWTBL_SNR_RX0_MASK,		WF_LWTBL_SNR_RX0_SHIFT,	false},
-+	{"SNR 1",	WF_LWTBL_SNR_RX1_MASK,		WF_LWTBL_SNR_RX1_SHIFT,	false},
-+	{"SNR 2",	WF_LWTBL_SNR_RX2_MASK,		WF_LWTBL_SNR_RX2_SHIFT,	false},
-+	{"SNR 3",	WF_LWTBL_SNR_RX3_MASK,		WF_LWTBL_SNR_RX3_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_lwtbl_dw35(struct seq_file *s, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	/* LMAC WTBL DW 35 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "LWTBL DW 35\n");
-+	addr = (u32 *)&(lwtbl[WTBL_GROUP_RX_STAT_CNT_LINE_3*4]);
-+	dw_value = *addr;
-+
-+
-+	while (WTBL_LMAC_DW35[i].name) {
-+		if (WTBL_LMAC_DW35[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_LMAC_DW35[i].name,
-+				(dw_value & WTBL_LMAC_DW35[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_LMAC_DW35[i].name,
-+				(dw_value & WTBL_LMAC_DW35[i].mask) >>
-+					WTBL_LMAC_DW35[i].shift);
-+		i++;
-+	}
-+}
-+
-+static void parse_fmac_lwtbl_rx_stats(struct seq_file *s, u8 *lwtbl)
-+{
-+	parse_fmac_lwtbl_dw33(s, lwtbl);
-+	parse_fmac_lwtbl_dw34(s, lwtbl);
-+	parse_fmac_lwtbl_dw35(s, lwtbl);
-+}
-+
-+static void parse_fmac_lwtbl_mlo_info(struct seq_file *s, u8 *lwtbl)
-+{
-+	parse_fmac_lwtbl_dw28(s, lwtbl);
-+	parse_fmac_lwtbl_dw29(s, lwtbl);
-+	parse_fmac_lwtbl_dw30(s, lwtbl);
-+}
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW9[] = {
-+	{"RELATED_IDX0",	WF_UWTBL_RELATED_IDX0_MASK,		WF_UWTBL_RELATED_IDX0_SHIFT,	false},
-+	{"RELATED_BAND0",	WF_UWTBL_RELATED_BAND0_MASK,		WF_UWTBL_RELATED_BAND0_SHIFT,	false},
-+	{"PRI_MLD_BAND",    WF_UWTBL_PRIMARY_MLD_BAND_MASK,		WF_UWTBL_PRIMARY_MLD_BAND_SHIFT,	true},
-+	{"RELATED_IDX1",	WF_UWTBL_RELATED_IDX1_MASK,		WF_UWTBL_RELATED_IDX1_SHIFT,	false},
-+	{"RELATED_BAND1",   WF_UWTBL_RELATED_BAND1_MASK,		WF_UWTBL_RELATED_BAND1_SHIFT,	false},
-+	{"SEC_MLD_BAND",	WF_UWTBL_SECONDARY_MLD_BAND_MASK,	WF_UWTBL_SECONDARY_MLD_BAND_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_uwtbl_mlo_info(struct seq_file *s, u8 *uwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "MldAddr: %02x:%02x:%02x:%02x:%02x:%02x(D0[B0~15], D1[B0~31])\n",
-+		uwtbl[4], uwtbl[5], uwtbl[6], uwtbl[7], uwtbl[0], uwtbl[1]);
-+
-+	/* UMAC WTBL DW 0 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL DW 0\n");
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_OWN_MLD_ID_DW*4]);
-+	dw_value = *addr;
-+
-+	seq_printf(s, "\t%s:%u\n", "OMLD_ID",
-+		(dw_value & WF_UWTBL_OWN_MLD_ID_MASK) >> WF_UWTBL_OWN_MLD_ID_SHIFT);
-+
-+	/* UMAC WTBL DW 9 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL DW 9\n");
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_RELATED_IDX0_DW*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_UMAC_DW9[i].name) {
-+
-+		if (WTBL_UMAC_DW9[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_UMAC_DW9[i].name,
-+				(dw_value & WTBL_UMAC_DW9[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW9[i].name,
-+				 (dw_value & WTBL_UMAC_DW9[i].mask) >>
-+					WTBL_UMAC_DW9[i].shift);
-+		i++;
-+	}
-+}
-+
-+static bool
-+is_wtbl_bigtk_exist(u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+
-+	addr = (u32 *)&(lwtbl[WF_LWTBL_MUAR_DW*4]);
-+	dw_value = *addr;
-+	if (((dw_value & WF_LWTBL_MUAR_MASK) >> WF_LWTBL_MUAR_SHIFT) ==
-+					MUAR_INDEX_OWN_MAC_ADDR_BC_MC) {
-+		addr = (u32 *)&(lwtbl[WF_LWTBL_CIPHER_SUIT_BIGTK_DW*4]);
-+		dw_value = *addr;
-+		if (((dw_value & WF_LWTBL_CIPHER_SUIT_BIGTK_MASK) >>
-+			WF_LWTBL_CIPHER_SUIT_BIGTK_SHIFT) != IGTK_CIPHER_SUIT_NONE)
-+			return true;
-+	}
-+
-+	return false;
-+}
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW2[] = {
-+	{"PN0",		WTBL_PN0_MASK,		WTBL_PN0_OFFSET,	false},
-+	{"PN1",		WTBL_PN1_MASK,		WTBL_PN1_OFFSET,	false},
-+	{"PN2",		WTBL_PN2_MASK,		WTBL_PN2_OFFSET,	true},
-+	{"PN3",		WTBL_PN3_MASK,		WTBL_PN3_OFFSET,	false},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW3[] = {
-+	{"PN4",     WTBL_PN4_MASK,      WTBL_PN4_OFFSET,	false},
-+	{"PN5",     WTBL_PN5_MASK,      WTBL_PN5_OFFSET,	true},
-+	{"COM_SN",     WF_UWTBL_COM_SN_MASK,     WF_UWTBL_COM_SN_SHIFT,	true},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW4_BIPN[] = {
-+	{"BIPN0",	WTBL_BIPN0_MASK,	WTBL_BIPN0_OFFSET,	false},
-+	{"BIPN1",	WTBL_BIPN1_MASK,	WTBL_BIPN1_OFFSET,	false},
-+	{"BIPN2",	WTBL_BIPN2_MASK,	WTBL_BIPN2_OFFSET,	true},
-+	{"BIPN3",	WTBL_BIPN3_MASK,	WTBL_BIPN3_OFFSET,	false},
-+	{NULL,}
-+};
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW5_BIPN[] = {
-+	{"BIPN4",	WTBL_BIPN4_MASK,	WTBL_BIPN4_OFFSET,	false},
-+	{"BIPN5",	WTBL_BIPN5_MASK,	WTBL_BIPN5_OFFSET,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_uwtbl_pn(struct seq_file *s, u8 *uwtbl, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u16 i = 0;
-+
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL PN\n");
-+
-+	/* UMAC WTBL DW 2/3 */
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_PN_31_0__DW*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_UMAC_DW2[i].name) {
-+		seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW2[i].name,
-+			(dw_value & WTBL_UMAC_DW2[i].mask) >>
-+				WTBL_UMAC_DW2[i].shift);
-+		i++;
-+	}
-+
-+	i = 0;
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_PN_47_32__DW*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_UMAC_DW3[i].name) {
-+		seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW3[i].name,
-+			 (dw_value & WTBL_UMAC_DW3[i].mask) >>
-+			WTBL_UMAC_DW3[i].shift);
-+		i++;
-+	}
-+
-+
-+	/* UMAC WTBL DW 4/5 for BIGTK */
-+	if (is_wtbl_bigtk_exist(lwtbl) == true) {
-+		i = 0;
-+		addr = (u32 *)&(uwtbl[WF_UWTBL_RX_BIPN_31_0__DW*4]);
-+		dw_value = *addr;
-+
-+		while (WTBL_UMAC_DW4_BIPN[i].name) {
-+			seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW4_BIPN[i].name,
-+				(dw_value & WTBL_UMAC_DW4_BIPN[i].mask) >>
-+					WTBL_UMAC_DW4_BIPN[i].shift);
-+			i++;
-+		}
-+
-+		i = 0;
-+		addr = (u32 *)&(uwtbl[WF_UWTBL_RX_BIPN_47_32__DW*4]);
-+		dw_value = *addr;
-+
-+		while (WTBL_UMAC_DW5_BIPN[i].name) {
-+			seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW5_BIPN[i].name,
-+				(dw_value & WTBL_UMAC_DW5_BIPN[i].mask) >>
-+				WTBL_UMAC_DW5_BIPN[i].shift);
-+			i++;
-+		}
-+	}
-+}
-+
-+static void parse_fmac_uwtbl_sn(struct seq_file *s, u8 *uwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 u2SN = 0;
-+
-+	/* UMAC WTBL DW SN part */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL SN\n");
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID0_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID0_SN_MASK) >> WF_UWTBL_TID0_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID0_AC0_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID1_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID1_SN_MASK) >> WF_UWTBL_TID1_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID1_AC1_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID2_SN_7_0__DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID2_SN_7_0__MASK) >>
-+				WF_UWTBL_TID2_SN_7_0__SHIFT;
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID2_SN_11_8__DW*4]);
-+	u2SN |= (((*addr) & WF_UWTBL_TID2_SN_11_8__MASK) >>
-+			WF_UWTBL_TID2_SN_11_8__SHIFT) << 8;
-+	seq_printf(s, "\t%s:%u\n", "TID2_AC2_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID3_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID3_SN_MASK) >> WF_UWTBL_TID3_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID3_AC3_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID4_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID4_SN_MASK) >> WF_UWTBL_TID4_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID4_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID5_SN_3_0__DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID5_SN_3_0__MASK) >>
-+				WF_UWTBL_TID5_SN_3_0__SHIFT;
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID5_SN_11_4__DW*4]);
-+	u2SN |= (((*addr) & WF_UWTBL_TID5_SN_11_4__MASK) >>
-+				WF_UWTBL_TID5_SN_11_4__SHIFT) << 4;
-+	seq_printf(s, "\t%s:%u\n", "TID5_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID6_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID6_SN_MASK) >> WF_UWTBL_TID6_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID6_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_TID7_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_TID7_SN_MASK) >> WF_UWTBL_TID7_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "TID7_SN", u2SN);
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_COM_SN_DW*4]);
-+	u2SN = ((*addr) & WF_UWTBL_COM_SN_MASK) >> WF_UWTBL_COM_SN_SHIFT;
-+	seq_printf(s, "\t%s:%u\n", "COM_SN", u2SN);
-+}
-+
-+static void dump_key_table(
-+	struct seq_file *s,
-+	uint16_t keyloc0,
-+	uint16_t keyloc1,
-+	uint16_t keyloc2
-+)
-+{
-+#define ONE_KEY_ENTRY_LEN_IN_DW                8
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u8 keytbl[ONE_KEY_ENTRY_LEN_IN_DW*4] = {0};
-+	uint16_t x;
-+
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "\t%s:%d\n", "keyloc0", keyloc0);
-+	if (keyloc0 != INVALID_KEY_ENTRY) {
-+
-+		/* Don't swap below two lines, halWtblReadRaw will
-+		* write new value WF_WTBLON_TOP_WDUCR_ADDR
-+		*/
-+		mt7996_wtbl_read_raw(dev, keyloc0,
-+			WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
-+		seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
-+			MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
-+			KEYTBL_IDX2BASE(keyloc0, 0));
-+		for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
-+			seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
-+				x,
-+				keytbl[x * 4 + 3],
-+				keytbl[x * 4 + 2],
-+				keytbl[x * 4 + 1],
-+				keytbl[x * 4]);
-+		}
-+	}
-+
-+	seq_printf(s, "\t%s:%d\n", "keyloc1", keyloc1);
-+	if (keyloc1 != INVALID_KEY_ENTRY) {
-+		/* Don't swap below two lines, halWtblReadRaw will
-+		* write new value WF_WTBLON_TOP_WDUCR_ADDR
-+		*/
-+		mt7996_wtbl_read_raw(dev, keyloc1,
-+			WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
-+		seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
-+			MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
-+			KEYTBL_IDX2BASE(keyloc1, 0));
-+		for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
-+			seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
-+				x,
-+				keytbl[x * 4 + 3],
-+				keytbl[x * 4 + 2],
-+				keytbl[x * 4 + 1],
-+				keytbl[x * 4]);
-+		}
-+	}
-+
-+	seq_printf(s, "\t%s:%d\n", "keyloc2", keyloc2);
-+	if (keyloc2 != INVALID_KEY_ENTRY) {
-+		/* Don't swap below two lines, halWtblReadRaw will
-+		* write new value WF_WTBLON_TOP_WDUCR_ADDR
-+		*/
-+		mt7996_wtbl_read_raw(dev, keyloc2,
-+			WTBL_TYPE_KEY, 0, ONE_KEY_ENTRY_LEN_IN_DW, keytbl);
-+		seq_printf(s, "\t\tKEY WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
-+			MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+			mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
-+			KEYTBL_IDX2BASE(keyloc2, 0));
-+		for (x = 0; x < ONE_KEY_ENTRY_LEN_IN_DW; x++) {
-+			seq_printf(s, "\t\tDW%02d: %02x %02x %02x %02x\n",
-+				x,
-+				keytbl[x * 4 + 3],
-+				keytbl[x * 4 + 2],
-+				keytbl[x * 4 + 1],
-+				keytbl[x * 4]);
-+		}
-+	}
-+}
-+
-+static void parse_fmac_uwtbl_key_info(struct seq_file *s, u8 *uwtbl, u8 *lwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	uint16_t keyloc0 = INVALID_KEY_ENTRY;
-+	uint16_t keyloc1 = INVALID_KEY_ENTRY;
-+	uint16_t keyloc2 = INVALID_KEY_ENTRY;
-+
-+	/* UMAC WTBL DW 7 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL key info\n");
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_KEY_LOC0_DW*4]);
-+	dw_value = *addr;
-+	keyloc0 = (dw_value & WF_UWTBL_KEY_LOC0_MASK) >> WF_UWTBL_KEY_LOC0_SHIFT;
-+	keyloc1 = (dw_value & WF_UWTBL_KEY_LOC1_MASK) >> WF_UWTBL_KEY_LOC1_SHIFT;
-+
-+	seq_printf(s, "\t%s:%u/%u\n", "Key Loc 0/1", keyloc0, keyloc1);
-+
-+	/* UMAC WTBL DW 6 for BIGTK */
-+	if (is_wtbl_bigtk_exist(lwtbl) == true) {
-+		addr = (u32 *)&(uwtbl[WF_UWTBL_KEY_LOC2_DW*4]);
-+		dw_value = *addr;
-+		keyloc2 = (dw_value & WF_UWTBL_KEY_LOC2_MASK) >>
-+			WF_UWTBL_KEY_LOC2_SHIFT;
-+		seq_printf(s, "\t%s:%u\n", "Key Loc 2", keyloc2);
-+	}
-+
-+	/* Parse KEY link */
-+	dump_key_table(s, keyloc0, keyloc1, keyloc2);
-+}
-+
-+static const struct berse_wtbl_parse WTBL_UMAC_DW8[] = {
-+	{"UWTBL_WMM_Q",		WF_UWTBL_WMM_Q_MASK,		WF_UWTBL_WMM_Q_SHIFT,	false},
-+	{"UWTBL_QOS",		WF_UWTBL_QOS_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"UWTBL_HT_VHT_HE",	WF_UWTBL_HT_MASK,		NO_SHIFT_DEFINE,	false},
-+	{"UWTBL_HDRT_MODE",	WF_UWTBL_HDRT_MODE_MASK,	NO_SHIFT_DEFINE,	true},
-+	{NULL,}
-+};
-+
-+static void parse_fmac_uwtbl_msdu_info(struct seq_file *s, u8 *uwtbl)
-+{
-+	u32 *addr = 0;
-+	u32 dw_value = 0;
-+	u32 amsdu_len = 0;
-+	u16 i = 0;
-+
-+	/* UMAC WTBL DW 8 */
-+	seq_printf(s, "\t\n");
-+	seq_printf(s, "UWTBL DW8\n");
-+
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_AMSDU_CFG_DW*4]);
-+	dw_value = *addr;
-+
-+	while (WTBL_UMAC_DW8[i].name) {
-+
-+		if (WTBL_UMAC_DW8[i].shift == NO_SHIFT_DEFINE)
-+			seq_printf(s, "\t%s:%d\n", WTBL_UMAC_DW8[i].name,
-+				(dw_value & WTBL_UMAC_DW8[i].mask) ? 1 : 0);
-+		else
-+			seq_printf(s, "\t%s:%u\n", WTBL_UMAC_DW8[i].name,
-+				(dw_value & WTBL_UMAC_DW8[i].mask) >>
-+					WTBL_UMAC_DW8[i].shift);
-+		i++;
-+	}
-+
-+	/* UMAC WTBL DW 8 - SEC_ADDR_MODE */
-+	addr = (u32 *)&(uwtbl[WF_UWTBL_SEC_ADDR_MODE_DW*4]);
-+	dw_value = *addr;
-+	seq_printf(s, "\t%s:%lu\n", "SEC_ADDR_MODE",
-+		(dw_value & WTBL_SEC_ADDR_MODE_MASK) >> WTBL_SEC_ADDR_MODE_OFFSET);
-+
-+	/* UMAC WTBL DW 8 - AMSDU_CFG */
-+	seq_printf(s, "\t%s:%d\n", "HW AMSDU Enable",
-+				(dw_value & WTBL_AMSDU_EN_MASK) ? 1 : 0);
-+
-+	amsdu_len = (dw_value & WTBL_AMSDU_LEN_MASK) >> WTBL_AMSDU_LEN_OFFSET;
-+	if (amsdu_len == 0)
-+		seq_printf(s, "\t%s:invalid (WTBL value=0x%x)\n", "HW AMSDU Len",
-+			amsdu_len);
-+	else if (amsdu_len == 1)
-+		seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
-+			1,
-+			255,
-+			amsdu_len);
-+	else if (amsdu_len == 2)
-+		seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
-+			256,
-+			511,
-+			amsdu_len);
-+	else if (amsdu_len == 3)
-+		seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
-+			512,
-+			767,
-+			amsdu_len);
-+	else
-+		seq_printf(s, "\t%s:%d~%d (WTBL value=0x%x)\n", "HW AMSDU Len",
-+			256 * (amsdu_len - 1),
-+			256 * (amsdu_len - 1) + 255,
-+			amsdu_len);
-+
-+	seq_printf(s, "\t%s:%lu (WTBL value=0x%lx)\n", "HW AMSDU Num",
-+		((dw_value & WTBL_AMSDU_NUM_MASK) >> WTBL_AMSDU_NUM_OFFSET) + 1,
-+		(dw_value & WTBL_AMSDU_NUM_MASK) >> WTBL_AMSDU_NUM_OFFSET);
-+}
-+
-+static int mt7996_wtbl_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u8 lwtbl[LWTBL_LEN_IN_DW * 4] = {0};
-+	u8 uwtbl[UWTBL_LEN_IN_DW * 4] = {0};
-+	int x;
-+
-+	mt7996_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_LMAC, 0,
-+				 LWTBL_LEN_IN_DW, lwtbl);
-+	seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
-+	seq_printf(s, "LMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
-+		   MT_DBG_WTBLON_TOP_WDUCR_ADDR,
-+		   mt76_rr(dev, MT_DBG_WTBLON_TOP_WDUCR_ADDR),
-+		   LWTBL_IDX2BASE(dev->wlan_idx, 0));
-+	for (x = 0; x < LWTBL_LEN_IN_DW; x++) {
-+		seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
-+			   x,
-+			   lwtbl[x * 4 + 3],
-+			   lwtbl[x * 4 + 2],
-+			   lwtbl[x * 4 + 1],
-+			   lwtbl[x * 4]);
-+	}
-+
-+	/* Parse LWTBL */
-+	parse_fmac_lwtbl_dw0_1(s, lwtbl);
-+	parse_fmac_lwtbl_dw2(s, lwtbl);
-+	parse_fmac_lwtbl_dw3(s, lwtbl);
-+	parse_fmac_lwtbl_dw4(s, lwtbl);
-+	parse_fmac_lwtbl_dw5(s, lwtbl);
-+	parse_fmac_lwtbl_dw6(s, lwtbl);
-+	parse_fmac_lwtbl_dw7(s, lwtbl);
-+	parse_fmac_lwtbl_dw8(s, lwtbl);
-+	parse_fmac_lwtbl_dw9(s, lwtbl);
-+	parse_fmac_lwtbl_dw10(s, lwtbl);
-+	parse_fmac_lwtbl_dw11(s, lwtbl);
-+	parse_fmac_lwtbl_dw12(s, lwtbl);
-+	parse_fmac_lwtbl_dw13(s, lwtbl);
-+	parse_fmac_lwtbl_dw14(s, lwtbl);
-+	parse_fmac_lwtbl_mlo_info(s, lwtbl);
-+	parse_fmac_lwtbl_dw31(s, lwtbl);
-+	parse_fmac_lwtbl_dw32(s, lwtbl);
-+	parse_fmac_lwtbl_rx_stats(s, lwtbl);
-+
-+	mt7996_wtbl_read_raw(dev, dev->wlan_idx, WTBL_TYPE_UMAC, 0,
-+				 UWTBL_LEN_IN_DW, uwtbl);
-+	seq_printf(s, "Dump WTBL info of WLAN_IDX:%d\n", dev->wlan_idx);
-+	seq_printf(s, "UMAC WTBL Addr: group:0x%x=0x%x addr: 0x%lx\n",
-+		   MT_DBG_UWTBL_TOP_WDUCR_ADDR,
-+		   mt76_rr(dev, MT_DBG_UWTBL_TOP_WDUCR_ADDR),
-+		   UWTBL_IDX2BASE(dev->wlan_idx, 0));
-+	for (x = 0; x < UWTBL_LEN_IN_DW; x++) {
-+		seq_printf(s, "DW%02d: %02x %02x %02x %02x\n",
-+			   x,
-+			   uwtbl[x * 4 + 3],
-+			   uwtbl[x * 4 + 2],
-+			   uwtbl[x * 4 + 1],
-+			   uwtbl[x * 4]);
-+	}
-+
-+	/* Parse UWTBL */
-+	parse_fmac_uwtbl_mlo_info(s, uwtbl);
-+	parse_fmac_uwtbl_pn(s, uwtbl, lwtbl);
-+	parse_fmac_uwtbl_sn(s, uwtbl);
-+	parse_fmac_uwtbl_key_info(s, uwtbl, lwtbl);
-+	parse_fmac_uwtbl_msdu_info(s, uwtbl);
-+
-+	return 0;
-+}
-+
-+static int mt7996_sta_info(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u8 lwtbl[LWTBL_LEN_IN_DW*4] = {0};
-+	u16 i = 0;
-+
-+	for (i=0; i < mt7996_wtbl_size(dev); i++) {
-+		mt7996_wtbl_read_raw(dev, i, WTBL_TYPE_LMAC, 0,
-+				     LWTBL_LEN_IN_DW, lwtbl);
-+
-+		if (lwtbl[4] || lwtbl[5] || lwtbl[6] || lwtbl[7] || lwtbl[0] || lwtbl[1]) {
-+			u32 *addr, dw_value;
-+
-+			seq_printf(s, "wcid:%d\tAddr: %02x:%02x:%02x:%02x:%02x:%02x",
-+					i, lwtbl[4], lwtbl[5], lwtbl[6], lwtbl[7], lwtbl[0], lwtbl[1]);
-+
-+			addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_2*4]);
-+			dw_value = *addr;
-+			seq_printf(s, "\t%s:%u", WTBL_LMAC_DW2[0].name,
-+					(dw_value & WTBL_LMAC_DW2[0].mask) >> WTBL_LMAC_DW2[0].shift);
-+
-+			addr = (u32 *)&(lwtbl[WTBL_GROUP_TRX_CAP_DW_5*4]);
-+			dw_value = *addr;
-+			seq_printf(s, "\tPSM:%u\n", !!(dw_value & WF_LWTBL_PSM_MASK));
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+static int mt7996_token_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	int msdu_id;
-+	struct mt76_txwi_cache *txwi;
-+
-+	seq_printf(s, "Token from host:\n");
-+	spin_lock_bh(&dev->mt76.token_lock);
-+	idr_for_each_entry(&dev->mt76.token, txwi, msdu_id) {
-+		seq_printf(s, "%4d (pending time %u ms)\n", msdu_id,
-+			   jiffies_to_msecs(jiffies - txwi->jiffies));
-+	}
-+	spin_unlock_bh(&dev->mt76.token_lock);
-+	seq_printf(s, "\n");
-+
-+	return 0;
-+}
-+
-+int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	u32 device_id = (dev->mt76.rev) >> 16;
-+	int i = 0;
-+	static const struct mt7996_dbg_reg_desc dbg_reg_s[] = {
-+		{ 0x7990, mt7996_dbg_offs },
-+		{ 0x7992, mt7992_dbg_offs },
-+	};
-+
-+	for (i = 0; i < ARRAY_SIZE(dbg_reg_s); i++) {
-+		if (device_id == dbg_reg_s[i].id) {
-+			dev->dbg_reg = &dbg_reg_s[i];
-+			break;
-+		}
-+	}
-+
-+	if (is_mt7996(&dev->mt76)) {
-+		WTBL_LMAC_DW2 = WTBL_LMAC_DW2_7996;
-+		WTBL_LMAC_DW5 = WTBL_LMAC_DW5_7996;
-+		WTBL_LMAC_DW9 = WTBL_LMAC_DW9_7996;
-+	} else {
-+		WTBL_LMAC_DW2 = WTBL_LMAC_DW2_7992;
-+		WTBL_LMAC_DW5 = WTBL_LMAC_DW5_7992;
-+		WTBL_LMAC_DW9 = WTBL_LMAC_DW9_7992;
-+	}
-+
-+	/* agg */
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info0", dir,
-+				    mt7996_agginfo_read_band0);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info1", dir,
-+				    mt7996_agginfo_read_band1);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "agg_info2", dir,
-+				    mt7996_agginfo_read_band2);
-+	/* amsdu */
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "amsdu_info", dir,
-+				    mt7996_amsdu_result_read);
-+
-+	debugfs_create_file("fw_debug_module", 0600, dir, dev,
-+			    &fops_fw_debug_module);
-+	debugfs_create_file("fw_debug_level", 0600, dir, dev,
-+			    &fops_fw_debug_level);
-+	debugfs_create_file("fw_wa_query", 0600, dir, dev, &fops_wa_query);
-+	debugfs_create_file("fw_wa_set", 0600, dir, dev, &fops_wa_set);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "fw_version", dir,
-+				    mt7996_dump_version);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "fw_wa_info", dir,
-+				    mt7996_fw_wa_info_read);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "fw_wm_info", dir,
-+				    mt7996_fw_wm_info_read);
-+
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info0", dir,
-+				    mt7996_mibinfo_band0);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info1", dir,
-+				    mt7996_mibinfo_band1);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "mib_info2", dir,
-+				    mt7996_mibinfo_band2);
-+
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "sta_info", dir,
-+				    mt7996_sta_info);
-+
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "tr_info", dir,
-+				    mt7996_trinfo_read);
-+
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "wtbl_info", dir,
-+				    mt7996_wtbl_read);
-+
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "token", dir, mt7996_token_read);
-+
-+	debugfs_create_u8("sku_disable", 0600, dir, &dev->dbg.sku_disable);
-+
-+	return 0;
-+}
-+
-+#endif
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-new file mode 100644
-index 00000000..e8870166
---- /dev/null
-+++ b/mt7996/mtk_mcu.c
-@@ -0,0 +1,18 @@
-+// SPDX-License-Identifier: ISC
-+/*
-+ * Copyright (C) 2023 MediaTek Inc.
-+ */
-+
-+#include <linux/firmware.h>
-+#include <linux/fs.h>
-+#include "mt7996.h"
-+#include "mcu.h"
-+#include "mac.h"
-+#include "mtk_mcu.h"
-+
-+#ifdef CONFIG_MTK_DEBUG
-+
-+
-+
-+
-+#endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-new file mode 100644
-index 00000000..e741aa27
---- /dev/null
-+++ b/mt7996/mtk_mcu.h
-@@ -0,0 +1,16 @@
-+/* SPDX-License-Identifier: ISC */
-+/*
-+ * Copyright (C) 2023 MediaTek Inc.
-+ */
-+
-+#ifndef __MT7996_MTK_MCU_H
-+#define __MT7996_MTK_MCU_H
-+
-+#include "../mt76_connac_mcu.h"
-+
-+#ifdef CONFIG_MTK_DEBUG
-+
-+
-+#endif
-+
-+#endif
-diff --git a/tools/fwlog.c b/tools/fwlog.c
-index e5d4a105..3c6a61d7 100644
---- a/tools/fwlog.c
-+++ b/tools/fwlog.c
-@@ -26,7 +26,7 @@ static const char *debugfs_path(const char *phyname, const char *file)
- 	return path;
- }
- 
--static int mt76_set_fwlog_en(const char *phyname, bool en)
-+static int mt76_set_fwlog_en(const char *phyname, bool en, char *val)
- {
- 	FILE *f = fopen(debugfs_path(phyname, "fw_debug_bin"), "w");
- 
-@@ -35,7 +35,13 @@ static int mt76_set_fwlog_en(const char *phyname, bool en)
- 		return 1;
- 	}
- 
--	fprintf(f, "7");
-+	if (en && val)
-+		fprintf(f, "%s", val);
-+	else if (en)
-+		fprintf(f, "7");
-+	else
-+		fprintf(f, "0");
-+
- 	fclose(f);
- 
- 	return 0;
-@@ -76,6 +82,7 @@ static void handle_signal(int sig)
- 
- int mt76_fwlog(const char *phyname, int argc, char **argv)
- {
-+#define BUF_SIZE 1504
- 	struct sockaddr_in local = {
- 		.sin_family = AF_INET,
- 		.sin_addr.s_addr = INADDR_ANY,
-@@ -84,9 +91,9 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
- 		.sin_family = AF_INET,
- 		.sin_port = htons(55688),
- 	};
--	char buf[1504];
-+	char *buf = calloc(BUF_SIZE, sizeof(char));
- 	int ret = 0;
--	int yes = 1;
-+	/* int yes = 1; */
- 	int s, fd;
- 
- 	if (argc < 1) {
-@@ -105,13 +112,13 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
- 		return 1;
- 	}
- 
--	setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes));
-+	/* setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); */
- 	if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0) {
- 		perror("bind");
- 		return 1;
- 	}
- 
--	if (mt76_set_fwlog_en(phyname, true))
-+	if (mt76_set_fwlog_en(phyname, true, argv[1]))
- 		return 1;
- 
- 	fd = open(debugfs_path(phyname, "fwlog_data"), O_RDONLY);
-@@ -145,8 +152,8 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
- 		if (!r)
- 			continue;
- 
--		if (len > sizeof(buf)) {
--			fprintf(stderr, "Length error: %d > %d\n", len, (int)sizeof(buf));
-+		if (len > BUF_SIZE) {
-+			fprintf(stderr, "Length error: %d > %d\n", len, BUF_SIZE);
- 			ret = 1;
- 			break;
- 		}
-@@ -171,7 +178,7 @@ int mt76_fwlog(const char *phyname, int argc, char **argv)
- 	close(fd);
- 
- out:
--	mt76_set_fwlog_en(phyname, false);
-+	mt76_set_fwlog_en(phyname, false, NULL);
- 
- 	return ret;
- }
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1001-mtk-wifi-mt76-mt7996-support-record-muru-algo-log-wh.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1001-mtk-wifi-mt76-mt7996-support-record-muru-algo-log-wh.patch
deleted file mode 100644
index eab9300..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1001-mtk-wifi-mt76-mt7996-support-record-muru-algo-log-wh.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From c772657b0835b02b512b101dc2111c99d6c3448c Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Tue, 28 Nov 2023 16:01:33 +0800
-Subject: [PATCH 1001/1044] mtk: wifi: mt76: mt7996: support record muru algo
- log when record fw log
-
-Support record muru algorithm debug log in firmware when we use
-chihuahua tool to record fw log. This can help us to check some key
-point of muru algorithm result, like bsrp status, airtime busy status,
-ru candidate...
-Corresponding to Logan driver, it is the same as execute the iwpriv
-command: iwpriv rax0 set muruDbgInfo=[category]-1
-
-Disable muru debug log when we stop record fwlog. Without this commit,
-if we run $ echo 2 > fw_debug_wm after recording fwlog, it will print
-out too many fw debug log.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/debugfs.c | 35 +++++++++++++++++++++++++++++++++++
- mt7996/mt7996.h  |  1 +
- mt7996/mtk_mcu.c | 21 +++++++++++++++++++++
- mt7996/mtk_mcu.h |  3 +++
- 4 files changed, 60 insertions(+)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 1637b39d..ea78166b 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -423,6 +423,36 @@ remove_buf_file_cb(struct dentry *f)
- 	return 0;
- }
- 
-+static int
-+mt7996_fw_debug_muru_set(void *data)
-+{
-+	struct mt7996_dev *dev = data;
-+	enum {
-+		DEBUG_BSRP_STATUS = 256,
-+		DEBUG_TX_DATA_BYTE_CONUT,
-+		DEBUG_RX_DATA_BYTE_CONUT,
-+		DEBUG_RX_TOTAL_BYTE_CONUT,
-+		DEBUG_INVALID_TID_BSR,
-+		DEBUG_UL_LONG_TERM_PPDU_TYPE,
-+		DEBUG_DL_LONG_TERM_PPDU_TYPE,
-+		DEBUG_PPDU_CLASS_TRIG_ONOFF,
-+		DEBUG_AIRTIME_BUSY_STATUS,
-+		DEBUG_UL_OFDMA_MIMO_STATUS,
-+		DEBUG_RU_CANDIDATE,
-+		DEBUG_MEC_UPDATE_AMSDU,
-+	} debug;
-+	int ret;
-+
-+	for (debug = DEBUG_BSRP_STATUS; debug <= DEBUG_MEC_UPDATE_AMSDU; debug++) {
-+		ret = mt7996_mcu_muru_dbg_info(dev, debug,
-+					       dev->fw_debug_bin & BIT(0));
-+		if (ret)
-+			return ret;
-+	}
-+
-+	return 0;
-+}
-+
- static int
- mt7996_fw_debug_bin_set(void *data, u64 val)
- {
-@@ -431,6 +461,7 @@ mt7996_fw_debug_bin_set(void *data, u64 val)
- 		.remove_buf_file = remove_buf_file_cb,
- 	};
- 	struct mt7996_dev *dev = data;
-+	int ret;
- 
- 	if (!dev->relay_fwlog) {
- 		dev->relay_fwlog = relay_open("fwlog_data", dev->debugfs_dir,
-@@ -443,6 +474,10 @@ mt7996_fw_debug_bin_set(void *data, u64 val)
- 
- 	relay_reset(dev->relay_fwlog);
- 
-+	ret = mt7996_fw_debug_muru_set(dev);
-+	if (ret)
-+		return ret;
-+
- 	return mt7996_fw_debug_wm_set(dev, dev->fw_debug_wm);
- }
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 34159f97..29976860 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -677,6 +677,7 @@ u32 mt7996_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
- 
- #ifdef CONFIG_MTK_DEBUG
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
-+int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index e8870166..c16b25ab 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -15,4 +15,25 @@
- 
- 
- 
-+int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val)
-+{
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le16 item;
-+		u8 __rsv2[2];
-+		__le32 value;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_MURU_DBG_INFO),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.item = cpu_to_le16(item),
-+		.value = cpu_to_le32(val),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &req,
-+				 sizeof(req), true);
-+}
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index e741aa27..7f4d4e02 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -10,6 +10,9 @@
- 
- #ifdef CONFIG_MTK_DEBUG
- 
-+enum {
-+	UNI_CMD_MURU_DBG_INFO = 0x18,
-+};
- 
- #endif
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1002-mtk-wifi-mt76-mt7996-add-check-for-hostapd-config-he.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1002-mtk-wifi-mt76-mt7996-add-check-for-hostapd-config-he.patch
deleted file mode 100644
index b05982a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1002-mtk-wifi-mt76-mt7996-add-check-for-hostapd-config-he.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 90b67bfa2b8f0bfbfd32fd93fb898d20b1e6b984 Mon Sep 17 00:00:00 2001
-From: "Allen.Ye" <allen.ye@mediatek.com>
-Date: Thu, 8 Jun 2023 17:32:33 +0800
-Subject: [PATCH 1002/1044] mtk: wifi: mt76: mt7996: add check for hostapd
- config he_ldpc
-
-Add check for hostapd config he_ldpc.
-This capabilities is checked in mcu_beacon_check_caps in 7915.
-
-Add check for STA LDPC cap, if STA only have BCC we should not overwrite the phy_cap with config he_ldpc.
-
-Signed-off-by: Allen.Ye <allen.ye@mediatek.com>
----
- mt7996/mcu.c | 12 +++++++++---
- 1 file changed, 9 insertions(+), 3 deletions(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index e92a3e53..b488a78f 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1185,7 +1185,8 @@ int mt7996_mcu_add_rx_ba(struct mt7996_dev *dev,
- }
- 
- static void
--mt7996_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
-+mt7996_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
-+		      struct ieee80211_sta *sta)
- {
- 	struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
- 	struct ieee80211_he_mcs_nss_supp mcs_map;
-@@ -1205,6 +1206,11 @@ mt7996_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- 		he->he_phy_cap[i] = elem->phy_cap_info[i];
- 	}
- 
-+	if (vif->type == NL80211_IFTYPE_AP &&
-+	    (elem->phy_cap_info[1] & IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD))
-+		u8p_replace_bits(&he->he_phy_cap[1], vif->bss_conf.he_ldpc,
-+				 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD);
-+
- 	mcs_map = sta->deflink.he_cap.he_mcs_nss_supp;
- 	switch (sta->deflink.bandwidth) {
- 	case IEEE80211_STA_RX_BW_160:
-@@ -2111,7 +2117,7 @@ int mt7996_mcu_add_rate_ctrl(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 	 * update sta_rec_he here.
- 	 */
- 	if (changed)
--		mt7996_mcu_sta_he_tlv(skb, sta);
-+		mt7996_mcu_sta_he_tlv(skb, vif, sta);
- 
- 	/* sta_rec_ra accommodates BW, NSS and only MCS range format
- 	 * i.e 0-{7,8,9} for VHT.
-@@ -2199,7 +2205,7 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 		/* starec amsdu */
- 		mt7996_mcu_sta_amsdu_tlv(dev, skb, vif, sta);
- 		/* starec he */
--		mt7996_mcu_sta_he_tlv(skb, sta);
-+		mt7996_mcu_sta_he_tlv(skb, vif, sta);
- 		/* starec he 6g*/
- 		mt7996_mcu_sta_he_6g_tlv(skb, sta);
- 		/* starec eht */
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1003-mtk-wifi-mt76-testmode-add-atenl-support-in-mt7996.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1003-mtk-wifi-mt76-testmode-add-atenl-support-in-mt7996.patch
deleted file mode 100644
index 4b48730..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1003-mtk-wifi-mt76-testmode-add-atenl-support-in-mt7996.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From a086447ff00030ee7cc2d6b813a0c099ba288990 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Wed, 28 Dec 2022 22:24:25 +0800
-Subject: [PATCH 1003/1044] mtk: wifi: mt76: testmode: add atenl support in
- mt7996
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- testmode.c | 3 ++-
- testmode.h | 2 ++
- 2 files changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/testmode.c b/testmode.c
-index ca4feccf..37783160 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -613,7 +613,8 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- 
- 	if (dev->test_mtd.name &&
- 	    (nla_put_string(msg, MT76_TM_ATTR_MTD_PART, dev->test_mtd.name) ||
--	     nla_put_u32(msg, MT76_TM_ATTR_MTD_OFFSET, dev->test_mtd.offset)))
-+	     nla_put_u32(msg, MT76_TM_ATTR_MTD_OFFSET, dev->test_mtd.offset) ||
-+	     nla_put_u8(msg, MT76_TM_ATTR_BAND_IDX, phy->band_idx)))
- 		goto out;
- 
- 	if (nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, td->tx_count) ||
-diff --git a/testmode.h b/testmode.h
-index 5e2792d8..a40cd74b 100644
---- a/testmode.h
-+++ b/testmode.h
-@@ -17,6 +17,7 @@
-  *
-  * @MT76_TM_ATTR_MTD_PART: mtd partition used for eeprom data (string)
-  * @MT76_TM_ATTR_MTD_OFFSET: offset of eeprom data within the partition (u32)
-+ * @MT76_TM_ATTR_BAND_IDX: band idx of the chip (u8)
-  *
-  * @MT76_TM_ATTR_TX_COUNT: configured number of frames to send when setting
-  *	state to MT76_TM_STATE_TX_FRAMES (u32)
-@@ -56,6 +57,7 @@ enum mt76_testmode_attr {
- 
- 	MT76_TM_ATTR_MTD_PART,
- 	MT76_TM_ATTR_MTD_OFFSET,
-+	MT76_TM_ATTR_BAND_IDX,
- 
- 	MT76_TM_ATTR_TX_COUNT,
- 	MT76_TM_ATTR_TX_LENGTH,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1004-mtk-wifi-mt76-testmode-add-basic-testmode-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1004-mtk-wifi-mt76-testmode-add-basic-testmode-support.patch
deleted file mode 100644
index 73e9626..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1004-mtk-wifi-mt76-testmode-add-basic-testmode-support.patch
+++ /dev/null
@@ -1,2354 +0,0 @@
-From 4c3bdf16f108c081731b1a73a3bd7730657e81d3 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Wed, 1 Mar 2023 11:59:16 +0800
-Subject: [PATCH 1004/1044] mtk: wifi: mt76: testmode: add basic testmode
- support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Add testmode eeprom buffer mode support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Fix power & freq offset issue for iTest power cal & tx/rx verifcation
-1. Wait for fw to tx. Otherwise, iTest testing tool cannot get the
-accurate tx power.
-2. In crystal mode, freq offset is set in 6G band and forwarded to 5G
-and 2G band. Therefore, we should avoid reseting freq offset to 0 when
-6G interface is off.
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-edcca return err in testmode; therefore, bypass it when we are in testmode idle state or testmode bf is on
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- eeprom.c          |   6 +-
- mac80211.c        |   3 +-
- mt76.h            |  36 +++
- mt76_connac_mcu.h |   2 +
- mt7996/Makefile   |   1 +
- mt7996/eeprom.c   |  35 ++-
- mt7996/eeprom.h   |   1 +
- mt7996/init.c     |   8 +
- mt7996/mac.c      |   3 +-
- mt7996/main.c     |  26 ++
- mt7996/mcu.c      |  59 +++-
- mt7996/mcu.h      |  33 +++
- mt7996/mt7996.h   |  28 +-
- mt7996/testmode.c | 740 ++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/testmode.h | 299 +++++++++++++++++++
- testmode.c        | 123 ++++++--
- testmode.h        |  85 +++++-
- tools/fields.c    | 102 ++++++-
- 18 files changed, 1542 insertions(+), 48 deletions(-)
- create mode 100644 mt7996/testmode.c
- create mode 100644 mt7996/testmode.h
-
-diff --git a/eeprom.c b/eeprom.c
-index 7d5cf28f..85bd2a29 100644
---- a/eeprom.c
-+++ b/eeprom.c
-@@ -94,8 +94,10 @@ int mt76_get_of_data_from_mtd(struct mt76_dev *dev, void *eep, int offset, int l
- 	}
- 
- #ifdef CONFIG_NL80211_TESTMODE
--	dev->test_mtd.name = devm_kstrdup(dev->dev, part, GFP_KERNEL);
--	dev->test_mtd.offset = offset;
-+	if (len == dev->eeprom.size) {
-+		dev->test_mtd.name = devm_kstrdup(dev->dev, part, GFP_KERNEL);
-+		dev->test_mtd.offset = offset;
-+	}
- #endif
- 
- out_put_node:
-diff --git a/mac80211.c b/mac80211.c
-index 6e8ac6f4..fea19e19 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -846,7 +846,8 @@ void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb)
- 	}
- 
- #ifdef CONFIG_NL80211_TESTMODE
--	if (phy->test.state == MT76_TM_STATE_RX_FRAMES) {
-+	if (!(phy->test.flag & MT_TM_FW_RX_COUNT) &&
-+	    phy->test.state == MT76_TM_STATE_RX_FRAMES) {
- 		phy->test.rx_stats.packets[q]++;
- 		if (status->flag & RX_FLAG_FAILED_FCS_CRC)
- 			phy->test.rx_stats.fcs_error[q]++;
-diff --git a/mt76.h b/mt76.h
-index 8cf21f98..f2b1e0c2 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -695,14 +695,21 @@ struct mt76_testmode_ops {
- 	int (*set_params)(struct mt76_phy *phy, struct nlattr **tb,
- 			  enum mt76_testmode_state new_state);
- 	int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg);
-+	void (*reset_rx_stats)(struct mt76_phy *phy);
-+	void (*tx_stop)(struct mt76_phy *phy);
-+	int (*set_eeprom)(struct mt76_phy *phy, u32 offset, u8 *val, u8 action);
- };
- 
-+#define MT_TM_FW_RX_COUNT	BIT(0)
-+
- struct mt76_testmode_data {
- 	enum mt76_testmode_state state;
- 
- 	u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)];
- 	struct sk_buff *tx_skb;
- 
-+	u8 sku_en;
-+
- 	u32 tx_count;
- 	u16 tx_mpdu_len;
- 
-@@ -712,6 +719,7 @@ struct mt76_testmode_data {
- 	u8 tx_rate_sgi;
- 	u8 tx_rate_ldpc;
- 	u8 tx_rate_stbc;
-+	u16 tx_preamble_puncture;
- 	u8 tx_ltf;
- 
- 	u8 tx_antenna_mask;
-@@ -721,6 +729,9 @@ struct mt76_testmode_data {
- 	u32 tx_time;
- 	u32 tx_ipg;
- 
-+	bool ibf;
-+	bool ebf;
-+
- 	u32 freq_offset;
- 
- 	u8 tx_power[4];
-@@ -735,7 +746,16 @@ struct mt76_testmode_data {
- 	struct {
- 		u64 packets[__MT_RXQ_MAX];
- 		u64 fcs_error[__MT_RXQ_MAX];
-+		u64 len_mismatch;
- 	} rx_stats;
-+	u8 flag;
-+
-+	struct {
-+		u8 type;
-+		u8 enable;
-+	} cfg;
-+
-+	u8 aid;
- };
- 
- struct mt76_vif {
-@@ -1439,6 +1459,22 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb,
- int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state);
- int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len);
- 
-+static inline void
-+mt76_testmode_param_set(struct mt76_testmode_data *td, u16 idx)
-+{
-+#ifdef CONFIG_NL80211_TESTMODE
-+	td->param_set[idx / 32] |= BIT(idx % 32);
-+#endif
-+}
-+
-+static inline bool
-+mt76_testmode_param_present(struct mt76_testmode_data *td, u16 idx)
-+{
-+#ifdef CONFIG_NL80211_TESTMODE
-+	return td->param_set[idx / 32] & BIT(idx % 32);
-+#endif
-+}
-+
- static inline void mt76_testmode_reset(struct mt76_phy *phy, bool disable)
- {
- #ifdef CONFIG_NL80211_TESTMODE
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 482782f7..2e148011 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1266,12 +1266,14 @@ enum {
- 	MCU_UNI_CMD_EFUSE_CTRL = 0x2d,
- 	MCU_UNI_CMD_RA = 0x2f,
- 	MCU_UNI_CMD_MURU = 0x31,
-+	MCU_UNI_CMD_TESTMODE_RX_STAT = 0x32,
- 	MCU_UNI_CMD_BF = 0x33,
- 	MCU_UNI_CMD_CHANNEL_SWITCH = 0x34,
- 	MCU_UNI_CMD_THERMAL = 0x35,
- 	MCU_UNI_CMD_VOW = 0x37,
- 	MCU_UNI_CMD_PP = 0x38,
- 	MCU_UNI_CMD_FIXED_RATE_TABLE = 0x40,
-+	MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
- 	MCU_UNI_CMD_RRO = 0x57,
- 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
- 	MCU_UNI_CMD_PER_STA_INFO = 0x6d,
-diff --git a/mt7996/Makefile b/mt7996/Makefile
-index a056b40e..7bb17f44 100644
---- a/mt7996/Makefile
-+++ b/mt7996/Makefile
-@@ -8,5 +8,6 @@ mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \
- 	     debugfs.o mmio.o
- 
- mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o
-+mt7996e-$(CONFIG_NL80211_TESTMODE) += testmode.o
- 
- mt7996e-y += mtk_debugfs.o mtk_mcu.o
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 121a3c95..2299793d 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -6,6 +6,11 @@
- #include <linux/firmware.h>
- #include "mt7996.h"
- #include "eeprom.h"
-+#include <linux/moduleparam.h>
-+
-+static bool testmode_enable;
-+module_param(testmode_enable, bool, 0644);
-+MODULE_PARM_DESC(testmode_enable, "Enable testmode");
- 
- static int mt7996_check_eeprom(struct mt7996_dev *dev)
- {
-@@ -43,6 +48,9 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev)
- 
- static char *mt7996_eeprom_name(struct mt7996_dev *dev)
- {
-+	if (dev->testmode_enable)
-+		return MT7996_EEPROM_DEFAULT_TM;
-+
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
- 		if (dev->chip_sku == MT7996_SKU_404)
-@@ -92,21 +100,36 @@ out:
- 	return ret;
- }
- 
--static int mt7996_eeprom_load(struct mt7996_dev *dev)
-+int mt7996_eeprom_check_fw_mode(struct mt7996_dev *dev)
- {
-+	u8 *eeprom;
- 	int ret;
- 
-+	/* load eeprom in flash or bin file mode to determine fw mode */
- 	ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
- 	if (ret < 0)
- 		return ret;
- 
- 	if (ret) {
- 		dev->flash_mode = true;
--	} else {
--		u8 free_block_num;
--		u32 block_num, i;
--		u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;
-+		eeprom = dev->mt76.eeprom.data;
-+		/* testmode enable priority: eeprom field > module parameter */
-+		dev->testmode_enable = !mt7996_check_eeprom(dev) ? eeprom[MT_EE_TESTMODE_EN] :
-+								   testmode_enable;
-+	}
-+
-+	return ret;
-+}
-+
-+static int mt7996_eeprom_load(struct mt7996_dev *dev)
-+{
-+	int ret;
-+	u8 free_block_num;
-+	u32 block_num, i;
-+	u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;
- 
-+	/* flash or bin file mode eeprom is loaded before mcu init */
-+	if (!dev->flash_mode) {
- 		ret = mt7996_mcu_get_eeprom_free_block(dev, &free_block_num);
- 		if (ret < 0)
- 			return ret;
-@@ -118,7 +141,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
- 		/* read eeprom data from efuse */
- 		block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
- 		for (i = 0; i < block_num; i++) {
--			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size);
-+			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size, NULL);
- 			if (ret < 0)
- 				return ret;
- 		}
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 72c38ad3..de3ff4e2 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -14,6 +14,7 @@ enum mt7996_eeprom_field {
- 	MT_EE_MAC_ADDR =	0x004,
- 	MT_EE_MAC_ADDR2 =	0x00a,
- 	MT_EE_WIFI_CONF =	0x190,
-+	MT_EE_TESTMODE_EN =	0x1af,
- 	MT_EE_MAC_ADDR3 =	0x2c0,
- 	MT_EE_RATE_DELTA_2G =	0x1400,
- 	MT_EE_RATE_DELTA_5G =	0x147d,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 0e3cdc05..d4d1a60b 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -966,6 +966,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
- 
- 	set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);
- 
-+	ret = mt7996_eeprom_check_fw_mode(dev);
-+	if (ret < 0)
-+		return ret;
-+
- 	ret = mt7996_mcu_init(dev);
- 	if (ret)
- 		return ret;
-@@ -1384,6 +1388,10 @@ int mt7996_register_device(struct mt7996_dev *dev)
- 
- 	mt7996_init_wiphy(hw, &dev->mt76.mmio.wed);
- 
-+#ifdef CONFIG_NL80211_TESTMODE
-+	dev->mt76.test_ops = &mt7996_testmode_ops;
-+#endif
-+
- 	ret = mt76_register_device(&dev->mt76, true, mt76_rates,
- 				   ARRAY_SIZE(mt76_rates));
- 	if (ret)
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 1f53d230..603f6c0d 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -685,7 +685,8 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
- 				     *info);
- 	}
- 
--	if (rxv && mode >= MT_PHY_TYPE_HE_SU && !(status->flag & RX_FLAG_8023))
-+	if (rxv && mode >= MT_PHY_TYPE_HE_SU && mode < MT_PHY_TYPE_EHT_SU &&
-+	    !(status->flag & RX_FLAG_8023))
- 		mt76_connac3_mac_decode_he_radiotap(skb, rxv, mode);
- 
- 	if (!status->wcid || !ieee80211_is_data_qos(fc) || hw_aggr)
-diff --git a/mt7996/main.c b/mt7996/main.c
-index ad2c6a9d..40b5cee3 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -23,6 +23,18 @@ static bool mt7996_dev_running(struct mt7996_dev *dev)
- 	return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state);
- }
- 
-+static void mt7996_testmode_disable_all(struct mt7996_dev *dev)
-+{
-+	struct mt7996_phy *phy;
-+	int i;
-+
-+	for (i = 0; i < __MT_MAX_BAND; i++) {
-+		phy = __mt7996_phy(dev, i);
-+		if (phy)
-+			mt76_testmode_set_state(phy->mt76, MT76_TM_STATE_OFF);
-+	}
-+}
-+
- int mt7996_run(struct ieee80211_hw *hw)
- {
- 	struct mt7996_dev *dev = mt7996_hw_dev(hw);
-@@ -37,6 +49,8 @@ int mt7996_run(struct ieee80211_hw *hw)
- 			goto out;
- 	}
- 
-+	mt7996_testmode_disable_all(dev);
-+
- 	mt7996_mac_enable_nf(dev, phy->mt76->band_idx);
- 
- 	ret = mt7996_mcu_set_rts_thresh(phy, 0x92b);
-@@ -291,6 +305,11 @@ int mt7996_set_channel(struct mt7996_phy *phy)
- 
- 	mt76_set_channel(phy->mt76);
- 
-+	if (mt76_testmode_enabled(phy->mt76) || phy->mt76->test.bf_en) {
-+		mt7996_tm_update_channel(phy);
-+		goto out;
-+	}
-+
- 	ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_SWITCH);
- 	if (ret)
- 		goto out;
-@@ -398,6 +417,11 @@ static int mt7996_config(struct ieee80211_hw *hw, u32 changed)
- 	int ret;
- 
- 	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
-+		if (!mt76_testmode_enabled(phy->mt76) && !phy->mt76->test.bf_en) {
-+			ret = mt7996_mcu_edcca_enable(phy, true);
-+			if (ret)
-+				return ret;
-+		}
- 		ieee80211_stop_queues(hw);
- 		ret = mt7996_set_channel(phy);
- 		if (ret)
-@@ -1507,6 +1531,8 @@ const struct ieee80211_ops mt7996_ops = {
- 	.sta_set_decap_offload = mt7996_sta_set_decap_offload,
- 	.add_twt_setup = mt7996_mac_add_twt_setup,
- 	.twt_teardown_request = mt7996_twt_teardown_request,
-+	CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
-+	CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
- #ifdef CONFIG_MAC80211_DEBUGFS
- 	.sta_add_debugfs = mt7996_sta_add_debugfs,
- #endif
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index b488a78f..d8795d30 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -2863,8 +2863,12 @@ static int mt7996_load_ram(struct mt7996_dev *dev)
- {
- 	int ret;
- 
--	ret = __mt7996_load_ram(dev, "WM", fw_name(dev, FIRMWARE_WM),
--				MT7996_RAM_TYPE_WM);
-+	if (dev->testmode_enable)
-+		ret = __mt7996_load_ram(dev, "WM_TM", fw_name(dev, FIRMWARE_WM_TM),
-+					MT7996_RAM_TYPE_WM_TM);
-+	else
-+		ret = __mt7996_load_ram(dev, "WM", fw_name(dev, FIRMWARE_WM),
-+					MT7996_RAM_TYPE_WM);
- 	if (ret)
- 		return ret;
- 
-@@ -3555,17 +3559,9 @@ int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
- 				 &req, sizeof(req), true);
- }
- 
--int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
-+int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *read_buf)
- {
--	struct {
--		u8 _rsv[4];
--
--		__le16 tag;
--		__le16 len;
--		__le32 addr;
--		__le32 valid;
--		u8 data[16];
--	} __packed req = {
-+	struct mt7996_mcu_eeprom_info req = {
- 		.tag = cpu_to_le16(UNI_EFUSE_ACCESS),
- 		.len = cpu_to_le16(sizeof(req) - 4),
- 		.addr = cpu_to_le32(round_down(offset,
-@@ -3574,6 +3570,7 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
- 	struct sk_buff *skb;
- 	bool valid;
- 	int ret;
-+	u8 *buf = read_buf;
- 
- 	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
- 					MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL),
-@@ -3584,7 +3581,9 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
- 	valid = le32_to_cpu(*(__le32 *)(skb->data + 16));
- 	if (valid) {
- 		u32 addr = le32_to_cpu(*(__le32 *)(skb->data + 12));
--		u8 *buf = (u8 *)dev->mt76.eeprom.data + addr;
-+
-+		if (!buf)
-+			buf = (u8 *)dev->mt76.eeprom.data + addr;
- 
- 		skb_pull(skb, 48);
- 		memcpy(buf, skb->data, MT7996_EEPROM_BLOCK_SIZE);
-@@ -4577,3 +4576,37 @@ int mt7996_mcu_set_pp_en(struct mt7996_phy *phy, bool auto_mode,
- 	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(PP),
- 				 &req, sizeof(req), false);
- }
-+
-+int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 data)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct tx_power_ctrl req = {
-+		.tag = cpu_to_le16(power_ctrl_id),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.power_ctrl_id = power_ctrl_id,
-+		.band_idx = phy->mt76->band_idx,
-+	};
-+
-+	switch (power_ctrl_id) {
-+	case UNI_TXPOWER_SKU_POWER_LIMIT_CTRL:
-+		req.sku_enable = !!data;
-+		break;
-+	case UNI_TXPOWER_PERCENTAGE_CTRL:
-+		req.percentage_ctrl_enable = !!data;
-+		break;
-+	case UNI_TXPOWER_PERCENTAGE_DROP_CTRL:
-+		req.power_drop_level = data;
-+		break;
-+	case UNI_TXPOWER_BACKOFF_POWER_LIMIT_CTRL:
-+		req.bf_backoff_enable = !!data;
-+		break;
-+	case UNI_TXPOWER_ATE_MODE_CTRL:
-+		req.ate_mode_enable = !!data;
-+		break;
-+	default:
-+		req.sku_enable = !!data;
-+	}
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TXPOWER),
-+				 &req, sizeof(req), false);
-+}
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 238c4c53..325c3c97 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -157,6 +157,16 @@ struct mt7996_mcu_eeprom {
- 	__le16 buf_len;
- } __packed;
- 
-+struct mt7996_mcu_eeprom_info {
-+	u8 _rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+	__le32 addr;
-+	__le32 valid;
-+	u8 data[MT7996_EEPROM_BLOCK_SIZE];
-+} __packed;
-+
- struct mt7996_mcu_phy_rx_info {
- 	u8 category;
- 	u8 rate;
-@@ -889,8 +899,31 @@ enum {
- 	UNI_CMD_THERMAL_PROTECT_DUTY_CONFIG,
- };
- 
-+struct tx_power_ctrl {
-+	u8 _rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 power_ctrl_id;
-+	union {
-+		bool sku_enable;
-+		bool ate_mode_enable;
-+		bool percentage_ctrl_enable;
-+		bool bf_backoff_enable;
-+		u8 power_drop_level;
-+	};
-+	u8 band_idx;
-+	u8 rsv[1];
-+} __packed;
-+
- enum {
-+	UNI_TXPOWER_SKU_POWER_LIMIT_CTRL = 0,
-+	UNI_TXPOWER_PERCENTAGE_CTRL = 1,
-+	UNI_TXPOWER_PERCENTAGE_DROP_CTRL = 2,
-+	UNI_TXPOWER_BACKOFF_POWER_LIMIT_CTRL = 3,
- 	UNI_TXPOWER_POWER_LIMIT_TABLE_CTRL = 4,
-+	UNI_TXPOWER_ATE_MODE_CTRL = 6,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 29976860..5af55492 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -32,25 +32,30 @@
- #define MT7996_FIRMWARE_WA		"mediatek/mt7996/mt7996_wa.bin"
- #define MT7996_FIRMWARE_WM		"mediatek/mt7996/mt7996_wm.bin"
- #define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996_dsp.bin"
-+#define MT7996_FIRMWARE_WM_TM		"mediatek/mt7996/mt7996_wm_tm.bin"
- #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
- 
- #define MT7992_FIRMWARE_WA		"mediatek/mt7996/mt7992_wa.bin"
- #define MT7992_FIRMWARE_WM		"mediatek/mt7996/mt7992_wm.bin"
- #define MT7992_FIRMWARE_DSP		"mediatek/mt7996/mt7992_dsp.bin"
-+#define MT7992_FIRMWARE_WM_TM		"mediatek/mt7996/mt7992_wm_tm.bin"
- #define MT7992_ROM_PATCH		"mediatek/mt7996/mt7992_rom_patch.bin"
- 
- #define MT7992_FIRMWARE_WA_24		"mediatek/mt7996/mt7992_wa_24.bin"
- #define MT7992_FIRMWARE_WM_24		"mediatek/mt7996/mt7992_wm_24.bin"
- #define MT7992_FIRMWARE_DSP_24		"mediatek/mt7996/mt7992_dsp_24.bin"
-+#define MT7992_FIRMWARE_WM_TM_24	"mediatek/mt7996/mt7992_wm_tm_24.bin"
- #define MT7992_ROM_PATCH_24		"mediatek/mt7996/mt7992_rom_patch_24.bin"
- 
- #define MT7992_FIRMWARE_WA_23		"mediatek/mt7996/mt7992_wa_23.bin"
- #define MT7992_FIRMWARE_WM_23		"mediatek/mt7996/mt7992_wm_23.bin"
- #define MT7992_FIRMWARE_DSP_23		"mediatek/mt7996/mt7992_dsp_23.bin"
-+#define MT7992_FIRMWARE_WM_TM_23	"mediatek/mt7996/mt7992_wm_tm_23.bin"
- #define MT7992_ROM_PATCH_23		"mediatek/mt7996/mt7992_rom_patch_23.bin"
- 
- #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
- #define MT7996_EEPROM_DEFAULT_404	"mediatek/mt7996/mt7996_eeprom_dual_404.bin"
-+#define MT7996_EEPROM_DEFAULT_TM	"mediatek/mt7996/mt7996_eeprom_tm.bin"
- #define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom_2i5i.bin"
- #define MT7992_EEPROM_DEFAULT_EXT	"mediatek/mt7996/mt7992_eeprom_2e5e.bin"
- #define MT7992_EEPROM_DEFAULT_MIX	"mediatek/mt7996/mt7992_eeprom_2i5e.bin"
-@@ -126,6 +131,7 @@ enum mt7992_sku_type {
- 
- enum mt7996_ram_type {
- 	MT7996_RAM_TYPE_WM,
-+	MT7996_RAM_TYPE_WM_TM = MT7996_RAM_TYPE_WM,
- 	MT7996_RAM_TYPE_WA,
- 	MT7996_RAM_TYPE_DSP,
- 	__MT7996_RAM_TYPE_MAX,
-@@ -273,6 +279,21 @@ struct mt7996_phy {
- 	struct mt76_channel_state state_ts;
- 
- 	bool has_aux_rx;
-+
-+#ifdef CONFIG_NL80211_TESTMODE
-+	struct {
-+		u32 *reg_backup;
-+
-+		s32 last_freq_offset;
-+		u8 last_rcpi[4];
-+		s8 last_rssi[4];
-+		s8 last_ib_rssi[4];
-+		s8 last_wb_rssi[4];
-+		u8 last_snr;
-+
-+		u8 spe_idx;
-+	} test;
-+#endif
- };
- 
- struct mt7996_dev {
-@@ -353,6 +374,8 @@ struct mt7996_dev {
- 		spinlock_t lock;
- 	} wed_rro;
- 
-+	bool testmode_enable;
-+
- 	bool ibf;
- 	u8 fw_debug_wm;
- 	u8 fw_debug_wa;
-@@ -467,6 +490,7 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
- extern const struct ieee80211_ops mt7996_ops;
- extern struct pci_driver mt7996_pci_driver;
- extern struct pci_driver mt7996_hif_driver;
-+extern const struct mt76_testmode_ops mt7996_testmode_ops;
- 
- struct mt7996_dev *mt7996_mmio_probe(struct device *pdev,
- 				     void __iomem *mem_base, u32 device_id);
-@@ -476,6 +500,7 @@ u64 __mt7996_get_tsf(struct ieee80211_hw *hw, struct mt7996_vif *mvif);
- int mt7996_register_device(struct mt7996_dev *dev);
- void mt7996_unregister_device(struct mt7996_dev *dev);
- int mt7996_eeprom_init(struct mt7996_dev *dev);
-+int mt7996_eeprom_check_fw_mode(struct mt7996_dev *dev);
- int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
- int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
- 				   struct ieee80211_channel *chan);
-@@ -528,7 +553,7 @@ int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev,
- int mt7996_mcu_set_fixed_field(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 			       struct ieee80211_sta *sta, void *data, u32 field);
- int mt7996_mcu_set_eeprom(struct mt7996_dev *dev);
--int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset);
-+int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *read_buf);
- int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num);
- int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap);
- int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 set, u8 band);
-@@ -563,6 +588,7 @@ void mt7996_mcu_rx_event(struct mt7996_dev *dev, struct sk_buff *skb);
- void mt7996_mcu_exit(struct mt7996_dev *dev);
- int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag);
- int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id);
-+int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 data);
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-new file mode 100644
-index 00000000..96079c22
---- /dev/null
-+++ b/mt7996/testmode.c
-@@ -0,0 +1,740 @@
-+// SPDX-License-Identifier: ISC
-+/*
-+ * Copyright (C) 2022 MediaTek Inc.
-+ */
-+
-+#include "mt7996.h"
-+#include "mac.h"
-+#include "mcu.h"
-+#include "testmode.h"
-+
-+enum {
-+	TM_CHANGED_TXPOWER,
-+	TM_CHANGED_FREQ_OFFSET,
-+	TM_CHANGED_SKU_EN,
-+	TM_CHANGED_TX_LENGTH,
-+	TM_CHANGED_TX_TIME,
-+	TM_CHANGED_CFG,
-+
-+	/* must be last */
-+	NUM_TM_CHANGED
-+};
-+
-+static const u8 tm_change_map[] = {
-+	[TM_CHANGED_TXPOWER] = MT76_TM_ATTR_TX_POWER,
-+	[TM_CHANGED_FREQ_OFFSET] = MT76_TM_ATTR_FREQ_OFFSET,
-+	[TM_CHANGED_SKU_EN] = MT76_TM_ATTR_SKU_EN,
-+	[TM_CHANGED_TX_LENGTH] = MT76_TM_ATTR_TX_LENGTH,
-+	[TM_CHANGED_TX_TIME] = MT76_TM_ATTR_TX_TIME,
-+	[TM_CHANGED_CFG] = MT76_TM_ATTR_CFG,
-+};
-+
-+static u8 mt7996_tm_bw_mapping(enum nl80211_chan_width width, enum bw_mapping_method method)
-+{
-+	static const u8 width_to_bw[][NUM_BW_MAP] = {
-+		[NL80211_CHAN_WIDTH_40] = {FW_CDBW_40MHZ, TM_CBW_40MHZ},
-+		[NL80211_CHAN_WIDTH_80] = {FW_CDBW_80MHZ, TM_CBW_80MHZ},
-+		[NL80211_CHAN_WIDTH_80P80] = {FW_CDBW_8080MHZ, TM_CBW_8080MHZ},
-+		[NL80211_CHAN_WIDTH_160] = {FW_CDBW_160MHZ, TM_CBW_160MHZ},
-+		[NL80211_CHAN_WIDTH_5] = {FW_CDBW_5MHZ, TM_CBW_5MHZ},
-+		[NL80211_CHAN_WIDTH_10] = {FW_CDBW_10MHZ, TM_CBW_10MHZ},
-+		[NL80211_CHAN_WIDTH_20] = {FW_CDBW_20MHZ, TM_CBW_20MHZ},
-+		[NL80211_CHAN_WIDTH_20_NOHT] = {FW_CDBW_20MHZ, TM_CBW_20MHZ},
-+		[NL80211_CHAN_WIDTH_320] = {FW_CDBW_320MHZ, TM_CBW_320MHZ},
-+	};
-+
-+	if (width >= ARRAY_SIZE(width_to_bw))
-+		return 0;
-+
-+	return width_to_bw[width][method];
-+}
-+
-+static u8 mt7996_tm_rate_to_phy(u8 tx_rate_mode)
-+{
-+	static const u8 rate_to_phy[] = {
-+		[MT76_TM_TX_MODE_CCK] = MT_PHY_TYPE_CCK,
-+		[MT76_TM_TX_MODE_OFDM] = MT_PHY_TYPE_OFDM,
-+		[MT76_TM_TX_MODE_HT] = MT_PHY_TYPE_HT,
-+		[MT76_TM_TX_MODE_VHT] = MT_PHY_TYPE_VHT,
-+		[MT76_TM_TX_MODE_HE_SU] = MT_PHY_TYPE_HE_SU,
-+		[MT76_TM_TX_MODE_HE_EXT_SU] = MT_PHY_TYPE_HE_EXT_SU,
-+		[MT76_TM_TX_MODE_HE_TB] = MT_PHY_TYPE_HE_TB,
-+		[MT76_TM_TX_MODE_HE_MU] = MT_PHY_TYPE_HE_MU,
-+		[MT76_TM_TX_MODE_EHT_SU] = MT_PHY_TYPE_EHT_SU,
-+		[MT76_TM_TX_MODE_EHT_TRIG] = MT_PHY_TYPE_EHT_TRIG,
-+		[MT76_TM_TX_MODE_EHT_MU] = MT_PHY_TYPE_EHT_MU,
-+	};
-+
-+	if (tx_rate_mode > MT76_TM_TX_MODE_MAX)
-+		return -EINVAL;
-+
-+	return rate_to_phy[tx_rate_mode];
-+}
-+
-+static int
-+mt7996_tm_check_antenna(struct mt7996_phy *phy)
-+{
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+	u8 band_idx = phy->mt76->band_idx;
-+	u32 chainmask = phy->mt76->chainmask;
-+	u32 aux_rx_mask;
-+
-+	chainmask = chainmask >> dev->chainshift[band_idx];
-+	aux_rx_mask = BIT(fls(chainmask)) * phy->has_aux_rx;
-+	if (td->tx_antenna_mask & ~(chainmask | aux_rx_mask)) {
-+		dev_err(dev->mt76.dev,
-+			"tx antenna mask 0x%x exceeds hw limit (chainmask 0x%x, has aux rx: %s)\n",
-+			td->tx_antenna_mask, chainmask, phy->has_aux_rx ? "yes" : "no");
-+		return -EINVAL;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_set(struct mt7996_dev *dev, u32 func_idx, u32 data)
-+{
-+	struct mt7996_tm_req req = {
-+		.rf_test = {
-+			.tag = cpu_to_le16(UNI_RF_TEST_CTRL),
-+			.len = cpu_to_le16(sizeof(req.rf_test)),
-+			.action = RF_ACTION_SET,
-+			.op.rf.func_idx = func_idx,
-+			.op.rf.param.func_data = cpu_to_le32(data),
-+		},
-+	};
-+	bool wait = (data == RF_CMD(START_TX)) ? true : false;
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_CTRL), &req,
-+				 sizeof(req), wait);
-+}
-+
-+static int
-+mt7996_tm_get(struct mt7996_dev *dev, u32 func_idx, u32 data, u32 *result)
-+{
-+	struct mt7996_tm_req req = {
-+		.rf_test = {
-+			.tag = cpu_to_le16(UNI_RF_TEST_CTRL),
-+			.len = cpu_to_le16(sizeof(req.rf_test)),
-+			.action = RF_ACTION_GET,
-+			.op.rf.func_idx = func_idx,
-+			.op.rf.param.func_data = cpu_to_le32(data),
-+		},
-+	};
-+	struct mt7996_tm_event *event;
-+	struct sk_buff *skb;
-+	int ret;
-+
-+	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(TESTMODE_CTRL),
-+					&req, sizeof(req), true, &skb);
-+	if (ret)
-+		return ret;
-+
-+	event = (struct mt7996_tm_event *)skb->data;
-+	*result = event->result.payload_length;
-+
-+	dev_kfree_skb(skb);
-+
-+	return ret;
-+}
-+
-+static void
-+mt7996_tm_set_antenna(struct mt7996_phy *phy, u32 func_idx)
-+{
-+#define SPE_INDEX_MASK		BIT(31)
-+#define TX_ANTENNA_MASK		GENMASK(3, 0)
-+#define RX_ANTENNA_MASK		GENMASK(20, 16)		/* RX antenna mask at most 5 bit */
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	u32 antenna_mask;
-+
-+	if (!mt76_testmode_param_present(td, MT76_TM_ATTR_TX_ANTENNA))
-+		return;
-+
-+	if (func_idx == SET_ID(TX_PATH))
-+		antenna_mask = td->tx_spe_idx ? (SPE_INDEX_MASK | td->tx_spe_idx) :
-+						td->tx_antenna_mask & TX_ANTENNA_MASK;
-+	else if (func_idx == SET_ID(RX_PATH))
-+		antenna_mask = u32_encode_bits(td->tx_antenna_mask, RX_ANTENNA_MASK);
-+	else
-+		return;
-+
-+	mt7996_tm_set(dev, func_idx, antenna_mask);
-+}
-+
-+static void
-+mt7996_tm_set_mac_addr(struct mt7996_dev *dev, u8 *addr, u32 func_idx)
-+{
-+#define REMAIN_PART_TAG		BIT(18)
-+	u32 own_mac_first = 0, own_mac_remain = 0;
-+	int len = sizeof(u32);
-+
-+	memcpy(&own_mac_first, addr, len);
-+	mt7996_tm_set(dev, func_idx, own_mac_first);
-+	/* Set the remain part of mac address */
-+	memcpy(&own_mac_remain, addr + len, ETH_ALEN - len);
-+	mt7996_tm_set(dev, func_idx | REMAIN_PART_TAG, own_mac_remain);
-+}
-+
-+static int
-+mt7996_tm_rf_switch_mode(struct mt7996_dev *dev, u32 op_mode)
-+{
-+	struct mt7996_tm_req req = {
-+		.rf_test = {
-+			.tag = cpu_to_le16(UNI_RF_TEST_CTRL),
-+			.len = cpu_to_le16(sizeof(req.rf_test)),
-+			.action = RF_ACTION_SWITCH_TO_RF_TEST,
-+			.op.op_mode = cpu_to_le32(op_mode),
-+		},
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_CTRL), &req,
-+				 sizeof(req), false);
-+}
-+
-+static void
-+mt7996_tm_init(struct mt7996_phy *phy, bool en)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	u8 rf_test_mode = en ? RF_OPER_RF_TEST : RF_OPER_NORMAL;
-+
-+	if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state))
-+		return;
-+
-+	mt7996_mcu_set_tx_power_ctrl(phy, POWER_CTRL(ATE_MODE), en);
-+	mt7996_mcu_set_tx_power_ctrl(phy, POWER_CTRL(SKU_POWER_LIMIT), !en);
-+	mt7996_mcu_set_tx_power_ctrl(phy, POWER_CTRL(BACKOFF_POWER_LIMIT), !en);
-+
-+	mt7996_tm_rf_switch_mode(dev, rf_test_mode);
-+
-+	mt7996_mcu_add_bss_info(phy, phy->monitor_vif, en);
-+	mt7996_mcu_add_sta(dev, phy->monitor_vif, NULL, en);
-+
-+	mt7996_tm_set(dev, SET_ID(BAND_IDX), phy->mt76->band_idx);
-+
-+	/* use firmware counter for RX stats */
-+	phy->mt76->test.flag |= MT_TM_FW_RX_COUNT;
-+}
-+
-+static void
-+mt7996_tm_update_channel(struct mt7996_phy *phy)
-+{
-+#define CHAN_FREQ_BW_80P80_TAG		(SET_ID(CHAN_FREQ) | BIT(16))
-+	struct mt7996_dev *dev = phy->dev;
-+	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
-+	struct ieee80211_channel *chan = chandef->chan;
-+	u8 width = chandef->width;
-+	static const u8 ch_band[] = {
-+		[NL80211_BAND_2GHZ] = 0,
-+		[NL80211_BAND_5GHZ] = 1,
-+		[NL80211_BAND_6GHZ] = 2,
-+	};
-+
-+	if (!chan || !chandef) {
-+		dev_info(dev->mt76.dev, "chandef not found, channel update failed!\n");
-+		return;
-+	}
-+
-+	/* system bw */
-+	mt7996_tm_set(dev, SET_ID(CBW), mt7996_tm_bw_mapping(width, BW_MAP_NL_TO_FW));
-+
-+	if (width == NL80211_CHAN_WIDTH_80P80) {
-+		width = NL80211_CHAN_WIDTH_160;
-+		mt7996_tm_set(dev, CHAN_FREQ_BW_80P80_TAG, chandef->center_freq2 * 1000);
-+	}
-+
-+	/* TODO: define per-packet bw */
-+	/* per-packet bw */
-+	mt7996_tm_set(dev, SET_ID(DBW), mt7996_tm_bw_mapping(width, BW_MAP_NL_TO_FW));
-+
-+	/* control channel selection index */
-+	mt7996_tm_set(dev, SET_ID(PRIMARY_CH), 0);
-+	mt7996_tm_set(dev, SET_ID(BAND), ch_band[chan->band]);
-+
-+	/* trigger switch channel calibration */
-+	mt7996_tm_set(dev, SET_ID(CHAN_FREQ), chandef->center_freq1 * 1000);
-+
-+	// TODO: update power limit table
-+}
-+
-+static void
-+mt7996_tm_tx_stop(struct mt76_phy *mphy)
-+{
-+	struct mt76_testmode_data *td = &mphy->test;
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(STOP_TEST));
-+	td->tx_pending = 0;
-+}
-+
-+static void
-+mt7996_tm_set_tx_frames(struct mt7996_phy *phy, bool en)
-+{
-+#define FRAME_CONTROL		0x88
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	//TODO: RU operation, replace mcs, nss, and ldpc
-+	if (en) {
-+		mt7996_tm_set(dev, SET_ID(MAC_HEADER), FRAME_CONTROL);
-+		mt7996_tm_set(dev, SET_ID(SEQ_CTRL), 0);
-+		mt7996_tm_set(dev, SET_ID(TX_COUNT), td->tx_count);
-+		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(TX_RATE), td->tx_rate_idx);
-+
-+		if (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_POWER))
-+			mt7996_tm_set(dev, SET_ID(POWER), td->tx_power[0]);
-+
-+		if (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_TIME)) {
-+			mt7996_tm_set(dev, SET_ID(TX_LEN), 0);
-+			mt7996_tm_set(dev, SET_ID(TX_TIME), td->tx_time);
-+		} else {
-+			mt7996_tm_set(dev, SET_ID(TX_LEN), td->tx_mpdu_len);
-+			mt7996_tm_set(dev, SET_ID(TX_TIME), 0);
-+		}
-+
-+		mt7996_tm_set_antenna(phy, SET_ID(TX_PATH));
-+		mt7996_tm_set_antenna(phy, SET_ID(RX_PATH));
-+		mt7996_tm_set(dev, SET_ID(STBC), td->tx_rate_stbc);
-+		mt7996_tm_set(dev, SET_ID(ENCODE_MODE), td->tx_rate_ldpc);
-+		mt7996_tm_set(dev, SET_ID(IBF_ENABLE), td->ibf);
-+		mt7996_tm_set(dev, SET_ID(EBF_ENABLE), td->ebf);
-+		mt7996_tm_set(dev, SET_ID(IPG), td->tx_ipg);
-+		mt7996_tm_set(dev, SET_ID(GI), td->tx_rate_sgi);
-+		mt7996_tm_set(dev, SET_ID(NSS), td->tx_rate_nss);
-+		mt7996_tm_set(dev, SET_ID(AID_OFFSET), 0);
-+		mt7996_tm_set(dev, SET_ID(PUNCTURE), td->tx_preamble_puncture);
-+
-+		mt7996_tm_set(dev, SET_ID(MAX_PE), 2);
-+		mt7996_tm_set(dev, SET_ID(HW_TX_MODE), 0);
-+		mt7996_tm_update_channel(phy);
-+
-+		/* trigger firmware to start TX */
-+		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(START_TX));
-+	} else {
-+		mt7996_tm_tx_stop(phy->mt76);
-+	}
-+}
-+
-+static int
-+mt7996_tm_rx_stats_user_ctrl(struct mt7996_phy *phy, u16 user_idx)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_rx_req req = {
-+		.band = phy->mt76->band_idx,
-+		.user_ctrl = {
-+			.tag = cpu_to_le16(UNI_TM_RX_STAT_SET_USER_CTRL),
-+			.len = cpu_to_le16(sizeof(req.user_ctrl)),
-+			.band_idx = phy->mt76->band_idx,
-+			.user_idx = cpu_to_le16(user_idx),
-+		},
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_RX_STAT), &req,
-+				 sizeof(req), false);
-+}
-+
-+static void
-+mt7996_tm_set_rx_frames(struct mt7996_phy *phy, bool en)
-+{
-+#define RX_MU_DISABLE	0xf800
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+	int ret;
-+
-+	if (en) {
-+		ret = mt7996_tm_rx_stats_user_ctrl(phy, td->aid);
-+		if (ret) {
-+			dev_info(dev->mt76.dev, "Set RX stats user control failed!\n");
-+			return;
-+		}
-+
-+		mt7996_tm_update_channel(phy);
-+
-+		if (td->tx_rate_mode >= MT76_TM_TX_MODE_HE_MU) {
-+			if (td->aid)
-+				ret = mt7996_tm_set(dev, SET_ID(RX_MU_AID), td->aid);
-+			else
-+				ret = mt7996_tm_set(dev, SET_ID(RX_MU_AID), RX_MU_DISABLE);
-+		}
-+		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(GI), td->tx_rate_sgi);
-+		mt7996_tm_set_antenna(phy, SET_ID(RX_PATH));
-+		mt7996_tm_set(dev, SET_ID(MAX_PE), 2);
-+
-+		mt7996_tm_set_mac_addr(dev, td->addr[1], SET_ID(SA));
-+
-+		/* trigger firmware to start RX */
-+		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(START_RX));
-+	} else {
-+		/* trigger firmware to stop RX */
-+		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(STOP_TEST));
-+	}
-+}
-+
-+static void
-+mt7996_tm_set_tx_cont(struct mt7996_phy *phy, bool en)
-+{
-+#define CONT_WAVE_MODE_OFDM	3
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	if (en) {
-+		mt7996_tm_update_channel(phy);
-+		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(TX_RATE), td->tx_rate_idx);
-+		/* fix payload is OFDM */
-+		mt7996_tm_set(dev, SET_ID(CONT_WAVE_MODE), CONT_WAVE_MODE_OFDM);
-+		mt7996_tm_set(dev, SET_ID(ANT_MASK), td->tx_antenna_mask);
-+
-+		/* trigger firmware to start CONT TX */
-+		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(CONT_WAVE));
-+	} else {
-+		/* trigger firmware to stop CONT TX  */
-+		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(STOP_TEST));
-+	}
-+}
-+
-+static void
-+mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
-+{
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	if (changed & BIT(TM_CHANGED_FREQ_OFFSET)) {
-+		mt7996_tm_set(dev, SET_ID(FREQ_OFFSET), td->freq_offset);
-+		mt7996_tm_set(dev, SET_ID(FREQ_OFFSET_C2), td->freq_offset);
-+	}
-+	if (changed & BIT(TM_CHANGED_TXPOWER))
-+		mt7996_tm_set(dev, SET_ID(POWER), td->tx_power[0]);
-+	if (changed & BIT(TM_CHANGED_SKU_EN)) {
-+		mt7996_tm_update_channel(phy);
-+		mt7996_mcu_set_tx_power_ctrl(phy, POWER_CTRL(SKU_POWER_LIMIT), td->sku_en);
-+		mt7996_mcu_set_tx_power_ctrl(phy, POWER_CTRL(BACKOFF_POWER_LIMIT), td->sku_en);
-+		mt7996_mcu_set_txpower_sku(phy);
-+	}
-+	if (changed & BIT(TM_CHANGED_TX_LENGTH)) {
-+		mt7996_tm_set(dev, SET_ID(TX_LEN), td->tx_mpdu_len);
-+		mt7996_tm_set(dev, SET_ID(TX_TIME), 0);
-+	}
-+	if (changed & BIT(TM_CHANGED_TX_TIME)) {
-+		mt7996_tm_set(dev, SET_ID(TX_LEN), 0);
-+		mt7996_tm_set(dev, SET_ID(TX_TIME), td->tx_time);
-+	}
-+	if (changed & BIT(TM_CHANGED_CFG)) {
-+		u32 func_idx = td->cfg.enable ? SET_ID(CFG_ON) : SET_ID(CFG_OFF);
-+
-+		mt7996_tm_set(dev, func_idx, td->cfg.type);
-+	}
-+}
-+
-+static int
-+mt7996_tm_set_state(struct mt76_phy *mphy, enum mt76_testmode_state state)
-+{
-+	struct mt76_testmode_data *td = &mphy->test;
-+	struct mt7996_phy *phy = mphy->priv;
-+	enum mt76_testmode_state prev_state = td->state;
-+
-+	mphy->test.state = state;
-+
-+	if (prev_state != MT76_TM_STATE_OFF)
-+		mt7996_tm_set(phy->dev, SET_ID(BAND_IDX), mphy->band_idx);
-+
-+	if (prev_state == MT76_TM_STATE_TX_FRAMES ||
-+	    state == MT76_TM_STATE_TX_FRAMES)
-+		mt7996_tm_set_tx_frames(phy, state == MT76_TM_STATE_TX_FRAMES);
-+	else if (prev_state == MT76_TM_STATE_RX_FRAMES ||
-+		 state == MT76_TM_STATE_RX_FRAMES)
-+		mt7996_tm_set_rx_frames(phy, state == MT76_TM_STATE_RX_FRAMES);
-+	else if (prev_state == MT76_TM_STATE_TX_CONT ||
-+		 state == MT76_TM_STATE_TX_CONT)
-+		mt7996_tm_set_tx_cont(phy, state == MT76_TM_STATE_TX_CONT);
-+	else if (prev_state == MT76_TM_STATE_OFF ||
-+		 state == MT76_TM_STATE_OFF)
-+		mt7996_tm_init(phy, !(state == MT76_TM_STATE_OFF));
-+
-+	if ((state == MT76_TM_STATE_IDLE &&
-+	     prev_state == MT76_TM_STATE_OFF) ||
-+	    (state == MT76_TM_STATE_OFF &&
-+	     prev_state == MT76_TM_STATE_IDLE)) {
-+		u32 changed = 0;
-+		int i, ret;
-+
-+		for (i = 0; i < ARRAY_SIZE(tm_change_map); i++) {
-+			u16 cur = tm_change_map[i];
-+
-+			if (mt76_testmode_param_present(td, cur))
-+				changed |= BIT(i);
-+		}
-+
-+		ret = mt7996_tm_check_antenna(phy);
-+		if (ret)
-+			return ret;
-+
-+		mt7996_tm_update_params(phy, changed);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_set_params(struct mt76_phy *mphy, struct nlattr **tb,
-+		     enum mt76_testmode_state new_state)
-+{
-+	struct mt76_testmode_data *td = &mphy->test;
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt7996_dev *dev = phy->dev;
-+	u32 changed = 0;
-+	int i, ret;
-+
-+	BUILD_BUG_ON(NUM_TM_CHANGED >= 32);
-+
-+	if (new_state == MT76_TM_STATE_OFF ||
-+	    td->state == MT76_TM_STATE_OFF)
-+		return 0;
-+
-+	ret = mt7996_tm_check_antenna(phy);
-+	if (ret)
-+		return ret;
-+
-+	for (i = 0; i < ARRAY_SIZE(tm_change_map); i++) {
-+		if (tb[tm_change_map[i]])
-+			changed |= BIT(i);
-+	}
-+
-+	mt7996_tm_set(dev, SET_ID(BAND_IDX), mphy->band_idx);
-+	mt7996_tm_update_params(phy, changed);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_get_rx_stats(struct mt7996_phy *phy)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_rx_req req = {
-+		.band = phy->mt76->band_idx,
-+		.rx_stat_all = {
-+			.tag = cpu_to_le16(UNI_TM_RX_STAT_GET_ALL_V2),
-+			.len = cpu_to_le16(sizeof(req.rx_stat_all)),
-+			.band_idx = phy->mt76->band_idx,
-+		},
-+	};
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_tm_rx_event *rx_stats;
-+	struct mt7996_tm_rx_event_stat_all *rx_stats_all;
-+	struct sk_buff *skb;
-+	enum mt76_rxq_id qid;
-+	int i, ret = 0;
-+	u32 mac_rx_mdrdy_cnt;
-+	u16 mac_rx_len_mismatch, fcs_err_count;
-+
-+	if (td->state != MT76_TM_STATE_RX_FRAMES)
-+		return 0;
-+
-+	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(TESTMODE_RX_STAT),
-+					&req, sizeof(req), true, &skb);
-+
-+	if (ret)
-+		return ret;
-+
-+	rx_stats = (struct mt7996_tm_rx_event *)skb->data;
-+	rx_stats_all = &rx_stats->rx_stat_all;
-+
-+	phy->test.last_freq_offset = le32_to_cpu(rx_stats_all->user_info[0].freq_offset);
-+	phy->test.last_snr = le32_to_cpu(rx_stats_all->user_info[0].snr);
-+	for (i = 0; i < ARRAY_SIZE(phy->test.last_rcpi); i++) {
-+		phy->test.last_rcpi[i] = le16_to_cpu(rx_stats_all->rxv_info[i].rcpi);
-+		phy->test.last_rssi[i] = le16_to_cpu(rx_stats_all->rxv_info[i].rssi);
-+		phy->test.last_ib_rssi[i] = rx_stats_all->fagc[i].ib_rssi;
-+		phy->test.last_wb_rssi[i] = rx_stats_all->fagc[i].wb_rssi;
-+	}
-+
-+	if (phy->mt76->band_idx == 2)
-+		qid = MT_RXQ_BAND2;
-+	else if (phy->mt76->band_idx == 1)
-+		qid = MT_RXQ_BAND1;
-+	else
-+		qid = MT_RXQ_MAIN;
-+
-+	fcs_err_count = le16_to_cpu(rx_stats_all->band_info.mac_rx_fcs_err_cnt);
-+	mac_rx_len_mismatch = le16_to_cpu(rx_stats_all->band_info.mac_rx_len_mismatch);
-+	mac_rx_mdrdy_cnt = le32_to_cpu(rx_stats_all->band_info.mac_rx_mdrdy_cnt);
-+	td->rx_stats.packets[qid] += mac_rx_mdrdy_cnt;
-+	td->rx_stats.packets[qid] += fcs_err_count;
-+	td->rx_stats.fcs_error[qid] += fcs_err_count;
-+	td->rx_stats.len_mismatch += mac_rx_len_mismatch;
-+
-+	dev_kfree_skb(skb);
-+
-+	return ret;
-+}
-+
-+static void
-+mt7996_tm_reset_trx_stats(struct mt76_phy *mphy)
-+{
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	memset(&mphy->test.rx_stats, 0, sizeof(mphy->test.rx_stats));
-+	mt7996_tm_set(dev, SET_ID(TRX_COUNTER_RESET), 0);
-+}
-+
-+static int
-+mt7996_tm_get_tx_stats(struct mt7996_phy *phy)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	int ret;
-+
-+	if (td->state != MT76_TM_STATE_TX_FRAMES)
-+		return 0;
-+
-+	ret = mt7996_tm_get(dev, GET_ID(TXED_COUNT), 0, &td->tx_done);
-+	if (ret)
-+		return ret;
-+
-+	td->tx_pending = td->tx_count - td->tx_done;
-+
-+	return ret;
-+}
-+
-+static int
-+mt7996_tm_dump_stats(struct mt76_phy *mphy, struct sk_buff *msg)
-+{
-+	struct mt7996_phy *phy = mphy->priv;
-+	void *rx, *rssi;
-+	int i;
-+
-+	mt7996_tm_set(phy->dev, SET_ID(BAND_IDX), mphy->band_idx);
-+	mt7996_tm_get_rx_stats(phy);
-+	mt7996_tm_get_tx_stats(phy);
-+
-+	rx = nla_nest_start(msg, MT76_TM_STATS_ATTR_LAST_RX);
-+	if (!rx)
-+		return -ENOMEM;
-+
-+	if (nla_put_s32(msg, MT76_TM_RX_ATTR_FREQ_OFFSET, phy->test.last_freq_offset))
-+		return -ENOMEM;
-+
-+	rssi = nla_nest_start(msg, MT76_TM_RX_ATTR_RCPI);
-+	if (!rssi)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < ARRAY_SIZE(phy->test.last_rcpi); i++)
-+		if (nla_put_u8(msg, i, phy->test.last_rcpi[i]))
-+			return -ENOMEM;
-+
-+	nla_nest_end(msg, rssi);
-+
-+	rssi = nla_nest_start(msg, MT76_TM_RX_ATTR_RSSI);
-+	if (!rssi)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < ARRAY_SIZE(phy->test.last_rssi); i++)
-+		if (nla_put_s8(msg, i, phy->test.last_rssi[i]))
-+			return -ENOMEM;
-+
-+	nla_nest_end(msg, rssi);
-+
-+	rssi = nla_nest_start(msg, MT76_TM_RX_ATTR_IB_RSSI);
-+	if (!rssi)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < ARRAY_SIZE(phy->test.last_ib_rssi); i++)
-+		if (nla_put_s8(msg, i, phy->test.last_ib_rssi[i]))
-+			return -ENOMEM;
-+
-+	nla_nest_end(msg, rssi);
-+
-+	rssi = nla_nest_start(msg, MT76_TM_RX_ATTR_WB_RSSI);
-+	if (!rssi)
-+		return -ENOMEM;
-+
-+	for (i = 0; i < ARRAY_SIZE(phy->test.last_wb_rssi); i++)
-+		if (nla_put_s8(msg, i, phy->test.last_wb_rssi[i]))
-+			return -ENOMEM;
-+
-+	nla_nest_end(msg, rssi);
-+
-+	if (nla_put_u8(msg, MT76_TM_RX_ATTR_SNR, phy->test.last_snr))
-+		return -ENOMEM;
-+
-+	nla_nest_end(msg, rx);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_write_back_to_efuse(struct mt7996_dev *dev)
-+{
-+	struct mt7996_mcu_eeprom_info req = {
-+		.tag = cpu_to_le16(UNI_EFUSE_ACCESS),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+	};
-+	u8 read_buf[MT76_TM_EEPROM_BLOCK_SIZE], *eeprom = dev->mt76.eeprom.data;
-+	int i, ret = -EINVAL;
-+
-+	/* prevent from damaging chip id in efuse */
-+	if (mt76_chip(&dev->mt76) != get_unaligned_le16(eeprom))
-+		goto out;
-+
-+	for (i = 0; i < MT7996_EEPROM_SIZE; i += MT76_TM_EEPROM_BLOCK_SIZE) {
-+		req.addr = cpu_to_le32(i);
-+		memcpy(req.data, eeprom + i, MT76_TM_EEPROM_BLOCK_SIZE);
-+
-+		ret = mt7996_mcu_get_eeprom(dev, i, read_buf);
-+		if (ret < 0)
-+			return ret;
-+
-+		if (!memcmp(req.data, read_buf, MT76_TM_EEPROM_BLOCK_SIZE))
-+			continue;
-+
-+		ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(EFUSE_CTRL),
-+					&req, sizeof(req), true);
-+		if (ret)
-+			return ret;
-+	}
-+
-+out:
-+	return ret;
-+}
-+
-+static int
-+mt7996_tm_set_eeprom(struct mt76_phy *mphy, u32 offset, u8 *val, u8 action)
-+{
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt7996_dev *dev = phy->dev;
-+	u8 *eeprom = dev->mt76.eeprom.data;
-+	int ret = 0;
-+
-+	if (offset >= MT7996_EEPROM_SIZE)
-+		return -EINVAL;
-+
-+	switch (action) {
-+	case MT76_TM_EEPROM_ACTION_UPDATE_DATA:
-+		memcpy(eeprom + offset, val, MT76_TM_EEPROM_BLOCK_SIZE);
-+		break;
-+	case MT76_TM_EEPROM_ACTION_UPDATE_BUFFER_MODE:
-+		ret = mt7996_mcu_set_eeprom(dev);
-+		break;
-+	case MT76_TM_EEPROM_ACTION_WRITE_TO_EFUSE:
-+		ret = mt7996_tm_write_back_to_efuse(dev);
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	return ret;
-+}
-+
-+const struct mt76_testmode_ops mt7996_testmode_ops = {
-+	.set_state = mt7996_tm_set_state,
-+	.set_params = mt7996_tm_set_params,
-+	.dump_stats = mt7996_tm_dump_stats,
-+	.reset_rx_stats = mt7996_tm_reset_trx_stats,
-+	.tx_stop = mt7996_tm_tx_stop,
-+	.set_eeprom = mt7996_tm_set_eeprom,
-+};
-diff --git a/mt7996/testmode.h b/mt7996/testmode.h
-new file mode 100644
-index 00000000..319ef257
---- /dev/null
-+++ b/mt7996/testmode.h
-@@ -0,0 +1,299 @@
-+/* SPDX-License-Identifier: ISC */
-+/* Copyright (C) 2020 MediaTek Inc. */
-+
-+#ifndef __MT7996_TESTMODE_H
-+#define __MT7996_TESTMODE_H
-+
-+enum {
-+	TM_CBW_20MHZ,
-+	TM_CBW_40MHZ,
-+	TM_CBW_80MHZ,
-+	TM_CBW_10MHZ,
-+	TM_CBW_5MHZ,
-+	TM_CBW_160MHZ,
-+	TM_CBW_8080MHZ,
-+	TM_CBW_320MHZ = 12,
-+};
-+
-+/* BW defined in FW hal_cal_flow_rom.h */
-+enum {
-+	FW_CDBW_20MHZ,
-+	FW_CDBW_40MHZ,
-+	FW_CDBW_80MHZ,
-+	FW_CDBW_160MHZ,
-+	FW_CDBW_320MHZ,
-+	FW_CDBW_5MHZ,
-+	FW_CDBW_10MHZ,
-+	FW_CDBW_8080MHZ,
-+};
-+
-+enum bw_mapping_method {
-+	BW_MAP_NL_TO_FW,
-+	BW_MAP_NL_TO_TM,
-+
-+	NUM_BW_MAP,
-+};
-+
-+struct mt7996_tm_rf_test {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 action;
-+	u8 icap_len;
-+	u8 _rsv[2];
-+	union {
-+		__le32 op_mode;
-+		__le32 freq;
-+
-+		struct {
-+			__le32 func_idx;
-+			union {
-+				__le32 func_data;
-+				__le32 cal_dump;
-+
-+				u8 _pad[80];
-+			} param;
-+		} rf;
-+	} op;
-+} __packed;
-+
-+struct mt7996_tm_req {
-+	u8 _rsv[4];
-+
-+	struct mt7996_tm_rf_test rf_test;
-+} __packed;
-+
-+struct mt7996_tm_rf_test_result {
-+	__le32 func_idx;
-+	__le32 payload_length;
-+	u8 event[0];
-+};
-+
-+struct mt7996_tm_event {
-+	u8 _rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+	struct mt7996_tm_rf_test_result result;
-+} __packed;
-+
-+enum {
-+	RF_ACTION_SWITCH_TO_RF_TEST,
-+	RF_ACTION_IN_RF_TEST,
-+	RF_ACTION_SET = 3,
-+	RF_ACTION_GET,
-+};
-+
-+enum {
-+	RF_OPER_NORMAL,
-+	RF_OPER_RF_TEST,
-+	RF_OPER_ICAP,
-+	RF_OPER_ICAP_OVERLAP,
-+	RF_OPER_WIFI_SPECTRUM,
-+};
-+
-+enum {
-+	UNI_RF_TEST_CTRL,
-+};
-+
-+#define RF_CMD(cmd)		RF_TEST_CMD_##cmd
-+
-+enum {
-+	RF_TEST_CMD_STOP_TEST = 0,
-+	RF_TEST_CMD_START_TX = 1,
-+	RF_TEST_CMD_START_RX = 2,
-+	RF_TEST_CMD_CONT_WAVE = 10,
-+	RF_TEST_CMD_TX_COMMIT = 18,
-+	RF_TEST_CMD_RX_COMMIT = 19,
-+};
-+
-+#define SET_ID(id)		RF_TEST_ID_SET_##id
-+#define GET_ID(id)		RF_TEST_ID_GET_##id
-+
-+enum {
-+	RF_TEST_ID_SET_COMMAND = 1,
-+	RF_TEST_ID_SET_POWER = 2,
-+	RF_TEST_ID_SET_TX_RATE = 3,
-+	RF_TEST_ID_SET_TX_MODE = 4,
-+	RF_TEST_ID_SET_TX_LEN = 6,
-+	RF_TEST_ID_SET_TX_COUNT = 7,
-+	RF_TEST_ID_SET_IPG = 8,
-+	RF_TEST_ID_SET_GI = 16,
-+	RF_TEST_ID_SET_STBC = 17,
-+	RF_TEST_ID_SET_CHAN_FREQ = 18,
-+	RF_TEST_ID_GET_TXED_COUNT = 32,
-+	RF_TEST_ID_SET_CONT_WAVE_MODE = 65,
-+	RF_TEST_ID_SET_DA = 68,
-+	RF_TEST_ID_SET_SA = 69,
-+	RF_TEST_ID_SET_CBW = 71,
-+	RF_TEST_ID_SET_DBW = 72,
-+	RF_TEST_ID_SET_PRIMARY_CH = 73,
-+	RF_TEST_ID_SET_ENCODE_MODE = 74,
-+	RF_TEST_ID_SET_BAND = 90,
-+	RF_TEST_ID_SET_TRX_COUNTER_RESET = 91,
-+	RF_TEST_ID_SET_MAC_HEADER = 101,
-+	RF_TEST_ID_SET_SEQ_CTRL = 102,
-+	RF_TEST_ID_SET_PAYLOAD = 103,
-+	RF_TEST_ID_SET_BAND_IDX = 104,
-+	RF_TEST_ID_SET_RX_PATH = 106,
-+	RF_TEST_ID_SET_FREQ_OFFSET = 107,
-+	RF_TEST_ID_GET_FREQ_OFFSET = 108,
-+	RF_TEST_ID_SET_TX_PATH = 113,
-+	RF_TEST_ID_SET_NSS = 114,
-+	RF_TEST_ID_SET_ANT_MASK = 115,
-+	RF_TEST_ID_SET_IBF_ENABLE = 126,
-+	RF_TEST_ID_SET_EBF_ENABLE = 127,
-+	RF_TEST_ID_GET_TX_POWER = 136,
-+	RF_TEST_ID_SET_RX_MU_AID = 157,
-+	RF_TEST_ID_SET_HW_TX_MODE = 167,
-+	RF_TEST_ID_SET_PUNCTURE = 168,
-+	RF_TEST_ID_SET_FREQ_OFFSET_C2 = 171,
-+	RF_TEST_ID_GET_FREQ_OFFSET_C2 = 172,
-+	RF_TEST_ID_SET_CFG_ON = 176,
-+	RF_TEST_ID_SET_CFG_OFF = 177,
-+	RF_TEST_ID_SET_BSSID = 189,
-+	RF_TEST_ID_SET_TX_TIME = 190,
-+	RF_TEST_ID_SET_MAX_PE = 191,
-+	RF_TEST_ID_SET_AID_OFFSET = 204,
-+};
-+
-+#define POWER_CTRL(type)	UNI_TXPOWER_##type##_CTRL
-+
-+struct mt7996_tm_rx_stat_user_ctrl {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 band_idx;
-+	u8 rsv;
-+	__le16 user_idx;
-+} __packed;
-+
-+struct mt7996_tm_rx_stat_all {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 band_idx;
-+	u8 rsv[3];
-+} __packed;
-+
-+struct mt7996_tm_rx_req {
-+	u8 band;
-+	u8 _rsv[3];
-+
-+	union {
-+		struct mt7996_tm_rx_stat_user_ctrl user_ctrl;
-+		struct mt7996_tm_rx_stat_all rx_stat_all;
-+	};
-+} __packed;
-+
-+enum {
-+	UNI_TM_RX_STAT_SET_USER_CTRL = 7,
-+	UNI_TM_RX_STAT_GET_ALL_V2 = 9,
-+};
-+
-+struct rx_band_info {
-+	/* mac part */
-+	__le16 mac_rx_fcs_err_cnt;
-+	__le16 mac_rx_len_mismatch;
-+	__le16 mac_rx_fcs_ok_cnt;
-+	u8 rsv1[2];
-+	__le32 mac_rx_mdrdy_cnt;
-+
-+	/* phy part */
-+	__le16 phy_rx_fcs_err_cnt_cck;
-+	__le16 phy_rx_fcs_err_cnt_ofdm;
-+	__le16 phy_rx_pd_cck;
-+	__le16 phy_rx_pd_ofdm;
-+	__le16 phy_rx_sig_err_cck;
-+	__le16 phy_rx_sfd_err_cck;
-+	__le16 phy_rx_sig_err_ofdm;
-+	__le16 phy_rx_tag_err_ofdm;
-+	__le16 phy_rx_mdrdy_cnt_cck;
-+	__le16 phy_rx_mdrdy_cnt_ofdm;
-+} __packed;
-+
-+struct rx_band_info_ext {
-+	/* mac part */
-+	__le32 mac_rx_mpdu_cnt;
-+
-+	/* phy part */
-+	u8 rsv[4];
-+} __packed;
-+
-+struct rx_common_info {
-+	__le16 rx_fifo_full;
-+	u8 rsv[2];
-+	__le32 aci_hit_low;
-+	__le32 aci_hit_high;
-+} __packed;
-+
-+struct rx_common_info_ext {
-+	__le32 driver_rx_count;
-+	__le32 sinr;
-+	__le32 mu_pkt_count;
-+
-+	/* mac part */
-+	u8 _rsv[4];
-+
-+	/* phy part */
-+	u8 sig_mcs;
-+	u8 rsv[3];
-+} __packed;
-+
-+struct rx_rxv_info {
-+	__le16 rcpi;
-+	s16 rssi;
-+	s16 snr;
-+	s16 adc_rssi;
-+} __packed;
-+
-+struct rx_rssi_info {
-+	s8 ib_rssi;
-+	s8 wb_rssi;
-+	u8 rsv[2];
-+} __packed;
-+
-+struct rx_user_info {
-+	s32 freq_offset;
-+	s32 snr;
-+	__le32 fcs_err_count;
-+} __packed;
-+
-+struct rx_user_info_ext {
-+	s8 ne_var_db_all_user;
-+	u8 rsv[3];
-+} __packed;
-+
-+#define MAX_ANTENNA_NUM		8
-+#define MAX_USER_NUM		16
-+
-+struct mt7996_tm_rx_event_stat_all {
-+	__le16 tag;
-+	__le16 len;
-+
-+	struct rx_band_info band_info;
-+	struct rx_band_info_ext band_info_ext;
-+	struct rx_common_info common_info;
-+	struct rx_common_info_ext common_info_ext;
-+
-+	/* RXV info */
-+	struct rx_rxv_info rxv_info[MAX_ANTENNA_NUM];
-+
-+	/* RSSI info */
-+	struct rx_rssi_info fagc[MAX_ANTENNA_NUM];
-+	struct rx_rssi_info inst[MAX_ANTENNA_NUM];
-+
-+	/* User info */
-+	struct rx_user_info user_info[MAX_USER_NUM];
-+	struct rx_user_info_ext user_info_ext[MAX_USER_NUM];
-+} __packed;
-+
-+struct mt7996_tm_rx_event {
-+	u8 _rsv[4];
-+
-+	union {
-+		struct mt7996_tm_rx_event_stat_all rx_stat_all;
-+	};
-+} __packed;
-+
-+#endif
-diff --git a/testmode.c b/testmode.c
-index 37783160..44f3a5bf 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -2,11 +2,13 @@
- /* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
- 
- #include <linux/random.h>
-+#include "mt76_connac.h"
- #include "mt76.h"
- 
- const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
- 	[MT76_TM_ATTR_RESET] = { .type = NLA_FLAG },
- 	[MT76_TM_ATTR_STATE] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_SKU_EN] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_TX_COUNT] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_TX_LENGTH] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_TX_RATE_MODE] = { .type = NLA_U8 },
-@@ -82,6 +84,11 @@ mt76_testmode_max_mpdu_len(struct mt76_phy *phy, u8 tx_rate_mode)
- 		    IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991)
- 			return IEEE80211_MAX_MPDU_LEN_VHT_7991;
- 		return IEEE80211_MAX_MPDU_LEN_VHT_11454;
-+	case MT76_TM_TX_MODE_EHT_SU:
-+	case MT76_TM_TX_MODE_EHT_TRIG:
-+	case MT76_TM_TX_MODE_EHT_MU:
-+		/* TODO: check the limit */
-+		return UINT_MAX;
- 	case MT76_TM_TX_MODE_CCK:
- 	case MT76_TM_TX_MODE_OFDM:
- 	default:
-@@ -183,6 +190,9 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
- 	u8 max_nss = hweight8(phy->antenna_mask);
- 	int ret;
- 
-+	if (is_mt7996(phy->dev))
-+		return 0;
-+
- 	ret = mt76_testmode_alloc_skb(phy, td->tx_mpdu_len);
- 	if (ret)
- 		return ret;
-@@ -275,7 +285,9 @@ mt76_testmode_tx_start(struct mt76_phy *phy)
- 	td->tx_queued = 0;
- 	td->tx_done = 0;
- 	td->tx_pending = td->tx_count;
--	mt76_worker_schedule(&dev->tx_worker);
-+
-+	if (!is_mt7996(dev))
-+		mt76_worker_schedule(&dev->tx_worker);
- }
- 
- static void
-@@ -284,6 +296,11 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
- 	struct mt76_testmode_data *td = &phy->test;
- 	struct mt76_dev *dev = phy->dev;
- 
-+	if (is_mt7996(dev) && dev->test_ops->tx_stop) {
-+		dev->test_ops->tx_stop(phy);
-+		return;
-+	}
-+
- 	mt76_worker_disable(&dev->tx_worker);
- 
- 	td->tx_pending = 0;
-@@ -296,22 +313,11 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
- 	mt76_testmode_free_skb(phy);
- }
- 
--static inline void
--mt76_testmode_param_set(struct mt76_testmode_data *td, u16 idx)
--{
--	td->param_set[idx / 32] |= BIT(idx % 32);
--}
--
--static inline bool
--mt76_testmode_param_present(struct mt76_testmode_data *td, u16 idx)
--{
--	return td->param_set[idx / 32] & BIT(idx % 32);
--}
--
- static void
- mt76_testmode_init_defaults(struct mt76_phy *phy)
- {
- 	struct mt76_testmode_data *td = &phy->test;
-+	u8 addr[ETH_ALEN] = {phy->band_idx, 0x11, 0x22, 0xaa, 0xbb, 0xcc};
- 
- 	if (td->tx_mpdu_len > 0)
- 		return;
-@@ -319,11 +325,18 @@ mt76_testmode_init_defaults(struct mt76_phy *phy)
- 	td->tx_mpdu_len = 1024;
- 	td->tx_count = 1;
- 	td->tx_rate_mode = MT76_TM_TX_MODE_OFDM;
-+	td->tx_rate_idx = 7;
- 	td->tx_rate_nss = 1;
-+	/* 0xffff for OFDMA no puncture */
-+	td->tx_preamble_puncture = ~(td->tx_preamble_puncture & 0);
-+	td->tx_ipg = 50;
- 
--	memcpy(td->addr[0], phy->macaddr, ETH_ALEN);
--	memcpy(td->addr[1], phy->macaddr, ETH_ALEN);
--	memcpy(td->addr[2], phy->macaddr, ETH_ALEN);
-+	/* rx stat user config */
-+	td->aid = 1;
-+
-+	memcpy(td->addr[0], addr, ETH_ALEN);
-+	memcpy(td->addr[1], addr, ETH_ALEN);
-+	memcpy(td->addr[2], addr, ETH_ALEN);
- }
- 
- static int
-@@ -353,7 +366,7 @@ __mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state)
- 	if (state == MT76_TM_STATE_TX_FRAMES)
- 		mt76_testmode_tx_start(phy);
- 	else if (state == MT76_TM_STATE_RX_FRAMES) {
--		memset(&phy->test.rx_stats, 0, sizeof(phy->test.rx_stats));
-+		dev->test_ops->reset_rx_stats(phy);
- 	}
- 
- 	phy->test.state = state;
-@@ -404,6 +417,44 @@ mt76_tm_get_u8(struct nlattr *attr, u8 *dest, u8 min, u8 max)
- 	return 0;
- }
- 
-+static int
-+mt76_testmode_set_eeprom(struct mt76_phy *phy, struct nlattr **tb)
-+{
-+	struct mt76_dev *dev = phy->dev;
-+	u8 action, val[MT76_TM_EEPROM_BLOCK_SIZE];
-+	u32 offset = 0;
-+	int err = -EINVAL;
-+
-+	if (!dev->test_ops->set_eeprom)
-+		return -EOPNOTSUPP;
-+
-+	if (mt76_tm_get_u8(tb[MT76_TM_ATTR_EEPROM_ACTION], &action,
-+			   0, MT76_TM_EEPROM_ACTION_MAX))
-+		goto out;
-+
-+	if (tb[MT76_TM_ATTR_EEPROM_OFFSET]) {
-+		struct nlattr *cur;
-+		int rem, idx = 0;
-+
-+		offset = nla_get_u32(tb[MT76_TM_ATTR_EEPROM_OFFSET]);
-+		if (!!(offset % MT76_TM_EEPROM_BLOCK_SIZE) ||
-+		    !tb[MT76_TM_ATTR_EEPROM_VAL])
-+			goto out;
-+
-+		nla_for_each_nested(cur, tb[MT76_TM_ATTR_EEPROM_VAL], rem) {
-+			if (nla_len(cur) != 1 || idx >= ARRAY_SIZE(val))
-+				goto out;
-+
-+			val[idx++] = nla_get_u8(cur);
-+		}
-+	}
-+
-+	err = dev->test_ops->set_eeprom(phy, offset, val, action);
-+
-+out:
-+	return err;
-+}
-+
- int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		      void *data, int len)
- {
-@@ -427,6 +478,11 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 
- 	mutex_lock(&dev->mutex);
- 
-+	if (tb[MT76_TM_ATTR_EEPROM_ACTION]) {
-+		err = mt76_testmode_set_eeprom(phy, tb);
-+		goto out;
-+	}
-+
- 	if (tb[MT76_TM_ATTR_RESET]) {
- 		mt76_testmode_set_state(phy, MT76_TM_STATE_OFF);
- 		memset(td, 0, sizeof(*td));
-@@ -434,6 +490,9 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 
- 	mt76_testmode_init_defaults(phy);
- 
-+	if (tb[MT76_TM_ATTR_SKU_EN])
-+		td->sku_en = nla_get_u8(tb[MT76_TM_ATTR_SKU_EN]);
-+
- 	if (tb[MT76_TM_ATTR_TX_COUNT])
- 		td->tx_count = nla_get_u32(tb[MT76_TM_ATTR_TX_COUNT]);
- 
-@@ -454,7 +513,8 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_DUTY_CYCLE],
- 			   &td->tx_duty_cycle, 0, 99) ||
- 	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_POWER_CONTROL],
--			   &td->tx_power_control, 0, 1))
-+			   &td->tx_power_control, 0, 1) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_AID], &td->aid, 0, 16))
- 		goto out;
- 
- 	if (tb[MT76_TM_ATTR_TX_LENGTH]) {
-@@ -494,7 +554,9 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 			    idx >= ARRAY_SIZE(td->tx_power))
- 				goto out;
- 
--			td->tx_power[idx++] = nla_get_u8(cur);
-+			err = mt76_tm_get_u8(cur, &td->tx_power[idx++], 0, 63);
-+			if (err)
-+				return err;
- 		}
- 	}
- 
-@@ -512,6 +574,22 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		}
- 	}
- 
-+	if (tb[MT76_TM_ATTR_CFG]) {
-+		struct nlattr *cur;
-+		int rem, idx = 0;
-+
-+		nla_for_each_nested(cur, tb[MT76_TM_ATTR_CFG], rem) {
-+			if (nla_len(cur) != 1 || idx >= 2)
-+				goto out;
-+
-+			if (idx == 0)
-+				td->cfg.type = nla_get_u8(cur);
-+			else
-+				td->cfg.enable = nla_get_u8(cur);
-+			idx++;
-+		}
-+	}
-+
- 	if (dev->test_ops->set_params) {
- 		err = dev->test_ops->set_params(phy, tb, state);
- 		if (err)
-@@ -561,6 +639,9 @@ mt76_testmode_dump_stats(struct mt76_phy *phy, struct sk_buff *msg)
- 	    nla_put_u64_64bit(msg, MT76_TM_STATS_ATTR_RX_PACKETS, rx_packets,
- 			      MT76_TM_STATS_ATTR_PAD) ||
- 	    nla_put_u64_64bit(msg, MT76_TM_STATS_ATTR_RX_FCS_ERROR, rx_fcs_error,
-+			      MT76_TM_STATS_ATTR_PAD) ||
-+	    nla_put_u64_64bit(msg, MT76_TM_STATS_ATTR_RX_LEN_MISMATCH,
-+			      td->rx_stats.len_mismatch,
- 			      MT76_TM_STATS_ATTR_PAD))
- 		return -EMSGSIZE;
- 
-@@ -625,6 +706,8 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- 	    nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_SGI, td->tx_rate_sgi) ||
- 	    nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_LDPC, td->tx_rate_ldpc) ||
- 	    nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_STBC, td->tx_rate_stbc) ||
-+	    nla_put_u8(msg, MT76_TM_ATTR_SKU_EN, td->sku_en) ||
-+	    nla_put_u8(msg, MT76_TM_ATTR_AID, td->aid) ||
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_LTF) &&
- 	     nla_put_u8(msg, MT76_TM_ATTR_TX_LTF, td->tx_ltf)) ||
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_ANTENNA) &&
-@@ -640,7 +723,7 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_POWER_CONTROL) &&
- 	     nla_put_u8(msg, MT76_TM_ATTR_TX_POWER_CONTROL, td->tx_power_control)) ||
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_FREQ_OFFSET) &&
--	     nla_put_u8(msg, MT76_TM_ATTR_FREQ_OFFSET, td->freq_offset)))
-+	     nla_put_u32(msg, MT76_TM_ATTR_FREQ_OFFSET, td->freq_offset)))
- 		goto out;
- 
- 	if (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_POWER)) {
-diff --git a/testmode.h b/testmode.h
-index a40cd74b..96872e8c 100644
---- a/testmode.h
-+++ b/testmode.h
-@@ -5,7 +5,8 @@
- #ifndef __MT76_TESTMODE_H
- #define __MT76_TESTMODE_H
- 
--#define MT76_TM_TIMEOUT	10
-+#define MT76_TM_TIMEOUT			10
-+#define MT76_TM_EEPROM_BLOCK_SIZE	16
- 
- /**
-  * enum mt76_testmode_attr - testmode attributes inside NL80211_ATTR_TESTDATA
-@@ -19,6 +20,7 @@
-  * @MT76_TM_ATTR_MTD_OFFSET: offset of eeprom data within the partition (u32)
-  * @MT76_TM_ATTR_BAND_IDX: band idx of the chip (u8)
-  *
-+ * @MT76_TM_ATTR_SKU_EN: config txpower sku is enabled or disabled in testmode (u8)
-  * @MT76_TM_ATTR_TX_COUNT: configured number of frames to send when setting
-  *	state to MT76_TM_STATE_TX_FRAMES (u32)
-  * @MT76_TM_ATTR_TX_PENDING: pending frames during MT76_TM_STATE_TX_FRAMES (u32)
-@@ -39,6 +41,11 @@
-  *
-  * @MT76_TM_ATTR_STATS: statistics (nested, see &enum mt76_testmode_stats_attr)
-  *
-+ * @MT76_TM_ATTR_PRECAL: Pre-cal data (u8)
-+ * @MT76_TM_ATTR_PRECAL_INFO: group size, dpd size, dpd_info, transmit size,
-+ *                            eeprom cal indicator (u32),
-+ *                            dpd_info = [dpd_per_chan_size, chan_num_2g,
-+ *                                        chan_num_5g, chan_num_6g]
-  * @MT76_TM_ATTR_TX_SPE_IDX: tx spatial extension index (u8)
-  *
-  * @MT76_TM_ATTR_TX_DUTY_CYCLE: packet tx duty cycle (u8)
-@@ -48,6 +55,29 @@
-  * @MT76_TM_ATTR_DRV_DATA: driver specific netlink attrs (nested)
-  *
-  * @MT76_TM_ATTR_MAC_ADDRS: array of nested MAC addresses (nested)
-+ *
-+ * @MT76_TM_ATTR_EEPROM_ACTION: eeprom setting actions
-+ *	(u8, see &enum mt76_testmode_eeprom_action)
-+ * @MT76_TM_ATTR_EEPROM_OFFSET: offset of eeprom data block for writing (u32)
-+ * @MT76_TM_ATTR_EEPROM_VAL: values for writing into a 16-byte data block
-+ *	(nested, u8 attrs)
-+ *
-+ * @MT76_TM_ATTR_CFG: config testmode rf feature (nested, see &mt76_testmode_cfg)
-+ * @MT76_TM_ATTR_TXBF_ACT: txbf setting actions (u8)
-+ * @MT76_TM_ATTR_TXBF_PARAM: txbf parameters (nested)
-+ *
-+ * @MT76_TM_ATTR_OFF_CH_SCAN_CH: config the channel of background chain (ZWDFS) (u8)
-+ * @MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH: config the center channel of background chain (ZWDFS) (u8)
-+ * @MT76_TM_ATTR_OFF_CH_SCAN_BW: config the bandwidth of background chain (ZWDFS) (u8)
-+ * @MT76_TM_ATTR_OFF_CH_SCAN_PATH: config the tx path of background chain (ZWDFS) (u8)
-+ *
-+ * @MT76_TM_ATTR_IPI_THRESHOLD: config the IPI index you want to read (u8)
-+ * @MT76_TM_ATTR_IPI_PERIOD: config the time period for reading
-+ *			     the histogram of specific IPI index (u8)
-+ * @MT76_TM_ATTR_IPI_ANTENNA_INDEX: config the antenna index for reading
-+ *				    the histogram of specific IPI index (u8)
-+ * @MT76_TM_ATTR_IPI_RESET: Reset the IPI counter
-+ *
-  */
- enum mt76_testmode_attr {
- 	MT76_TM_ATTR_UNSPEC,
-@@ -59,6 +89,7 @@ enum mt76_testmode_attr {
- 	MT76_TM_ATTR_MTD_OFFSET,
- 	MT76_TM_ATTR_BAND_IDX,
- 
-+	MT76_TM_ATTR_SKU_EN,
- 	MT76_TM_ATTR_TX_COUNT,
- 	MT76_TM_ATTR_TX_LENGTH,
- 	MT76_TM_ATTR_TX_RATE_MODE,
-@@ -76,6 +107,8 @@ enum mt76_testmode_attr {
- 	MT76_TM_ATTR_FREQ_OFFSET,
- 
- 	MT76_TM_ATTR_STATS,
-+	MT76_TM_ATTR_PRECAL,
-+	MT76_TM_ATTR_PRECAL_INFO,
- 
- 	MT76_TM_ATTR_TX_SPE_IDX,
- 
-@@ -86,6 +119,27 @@ enum mt76_testmode_attr {
- 	MT76_TM_ATTR_DRV_DATA,
- 
- 	MT76_TM_ATTR_MAC_ADDRS,
-+	MT76_TM_ATTR_AID,
-+	MT76_TM_ATTR_RU_ALLOC,
-+	MT76_TM_ATTR_RU_IDX,
-+
-+	MT76_TM_ATTR_EEPROM_ACTION,
-+	MT76_TM_ATTR_EEPROM_OFFSET,
-+	MT76_TM_ATTR_EEPROM_VAL,
-+
-+	MT76_TM_ATTR_CFG,
-+	MT76_TM_ATTR_TXBF_ACT,
-+	MT76_TM_ATTR_TXBF_PARAM,
-+
-+	MT76_TM_ATTR_OFF_CH_SCAN_CH,
-+	MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH,
-+	MT76_TM_ATTR_OFF_CH_SCAN_BW,
-+	MT76_TM_ATTR_OFF_CH_SCAN_PATH,
-+
-+	MT76_TM_ATTR_IPI_THRESHOLD,
-+	MT76_TM_ATTR_IPI_PERIOD,
-+	MT76_TM_ATTR_IPI_ANTENNA_INDEX,
-+	MT76_TM_ATTR_IPI_RESET,
- 
- 	/* keep last */
- 	NUM_MT76_TM_ATTRS,
-@@ -103,6 +157,8 @@ enum mt76_testmode_attr {
-  * @MT76_TM_STATS_ATTR_RX_FCS_ERROR: number of rx packets with FCS error (u64)
-  * @MT76_TM_STATS_ATTR_LAST_RX: information about the last received packet
-  *	see &enum mt76_testmode_rx_attr
-+ * @MT76_TM_STATS_ATTR_RX_LEN_MISMATCH: number of rx packets with length
-+ *	mismatch error (u64)
-  */
- enum mt76_testmode_stats_attr {
- 	MT76_TM_STATS_ATTR_UNSPEC,
-@@ -115,6 +171,7 @@ enum mt76_testmode_stats_attr {
- 	MT76_TM_STATS_ATTR_RX_PACKETS,
- 	MT76_TM_STATS_ATTR_RX_FCS_ERROR,
- 	MT76_TM_STATS_ATTR_LAST_RX,
-+	MT76_TM_STATS_ATTR_RX_LEN_MISMATCH,
- 
- 	/* keep last */
- 	NUM_MT76_TM_STATS_ATTRS,
-@@ -127,6 +184,7 @@ enum mt76_testmode_stats_attr {
-  *
-  * @MT76_TM_RX_ATTR_FREQ_OFFSET: frequency offset (s32)
-  * @MT76_TM_RX_ATTR_RCPI: received channel power indicator (array, u8)
-+ * @MT76_TM_RX_ATTR_RSSI: received signal strength indicator (array, s8)
-  * @MT76_TM_RX_ATTR_IB_RSSI: internal inband RSSI (array, s8)
-  * @MT76_TM_RX_ATTR_WB_RSSI: internal wideband RSSI (array, s8)
-  * @MT76_TM_RX_ATTR_SNR: signal-to-noise ratio (u8)
-@@ -136,6 +194,7 @@ enum mt76_testmode_rx_attr {
- 
- 	MT76_TM_RX_ATTR_FREQ_OFFSET,
- 	MT76_TM_RX_ATTR_RCPI,
-+	MT76_TM_RX_ATTR_RSSI,
- 	MT76_TM_RX_ATTR_IB_RSSI,
- 	MT76_TM_RX_ATTR_WB_RSSI,
- 	MT76_TM_RX_ATTR_SNR,
-@@ -179,6 +238,9 @@ enum mt76_testmode_state {
-  * @MT76_TM_TX_MODE_HE_EXT_SU: 802.11ax extended-range SU
-  * @MT76_TM_TX_MODE_HE_TB: 802.11ax trigger-based
-  * @MT76_TM_TX_MODE_HE_MU: 802.11ax multi-user MIMO
-+ * @MT76_TM_TX_MODE_EHT_SU: 802.11be single-user MIMO
-+ * @MT76_TM_TX_MODE_EHT_TRIG: 802.11be trigger-based
-+ * @MT76_TM_TX_MODE_EHT_MU: 802.11be multi-user MIMO
-  */
- enum mt76_testmode_tx_mode {
- 	MT76_TM_TX_MODE_CCK,
-@@ -189,12 +251,33 @@ enum mt76_testmode_tx_mode {
- 	MT76_TM_TX_MODE_HE_EXT_SU,
- 	MT76_TM_TX_MODE_HE_TB,
- 	MT76_TM_TX_MODE_HE_MU,
-+	MT76_TM_TX_MODE_EHT_SU,
-+	MT76_TM_TX_MODE_EHT_TRIG,
-+	MT76_TM_TX_MODE_EHT_MU,
- 
- 	/* keep last */
- 	NUM_MT76_TM_TX_MODES,
- 	MT76_TM_TX_MODE_MAX = NUM_MT76_TM_TX_MODES - 1,
- };
- 
-+/**
-+ * enum mt76_testmode_eeprom_action - eeprom setting actions
-+ *
-+ * @MT76_TM_EEPROM_ACTION_UPDATE_DATA: update rf values to specific
-+ *	eeprom data block
-+ * @MT76_TM_EEPROM_ACTION_UPDATE_BUFFER_MODE: send updated eeprom data to fw
-+ * @MT76_TM_EEPROM_ACTION_WRITE_TO_EFUSE: write eeprom data back to efuse
-+ */
-+enum mt76_testmode_eeprom_action {
-+	MT76_TM_EEPROM_ACTION_UPDATE_DATA,
-+	MT76_TM_EEPROM_ACTION_UPDATE_BUFFER_MODE,
-+	MT76_TM_EEPROM_ACTION_WRITE_TO_EFUSE,
-+
-+	/* keep last */
-+	NUM_MT76_TM_EEPROM_ACTION,
-+	MT76_TM_EEPROM_ACTION_MAX = NUM_MT76_TM_EEPROM_ACTION - 1,
-+};
-+
- extern const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS];
- 
- #endif
-diff --git a/tools/fields.c b/tools/fields.c
-index e3f69089..055f90f3 100644
---- a/tools/fields.c
-+++ b/tools/fields.c
-@@ -10,6 +10,7 @@ static const char * const testmode_state[] = {
- 	[MT76_TM_STATE_IDLE] = "idle",
- 	[MT76_TM_STATE_TX_FRAMES] = "tx_frames",
- 	[MT76_TM_STATE_RX_FRAMES] = "rx_frames",
-+	[MT76_TM_STATE_TX_CONT] = "tx_cont",
- };
- 
- static const char * const testmode_tx_mode[] = {
-@@ -21,6 +22,9 @@ static const char * const testmode_tx_mode[] = {
- 	[MT76_TM_TX_MODE_HE_EXT_SU] = "he_ext_su",
- 	[MT76_TM_TX_MODE_HE_TB] = "he_tb",
- 	[MT76_TM_TX_MODE_HE_MU] = "he_mu",
-+	[MT76_TM_TX_MODE_EHT_SU] = "eht_su",
-+	[MT76_TM_TX_MODE_EHT_TRIG] = "eht_tb",
-+	[MT76_TM_TX_MODE_EHT_MU] = "eht_mu",
- };
- 
- static void print_enum(const struct tm_field *field, struct nlattr *attr)
-@@ -65,7 +69,7 @@ static bool parse_u8(const struct tm_field *field, int idx,
- 
- static void print_u8(const struct tm_field *field, struct nlattr *attr)
- {
--	printf("%d", nla_get_u8(attr));
-+	printf("%u", nla_get_u8(attr));
- }
- 
- static void print_s8(const struct tm_field *field, struct nlattr *attr)
-@@ -86,12 +90,12 @@ static void print_s32(const struct tm_field *field, struct nlattr *attr)
- 
- static void print_u32(const struct tm_field *field, struct nlattr *attr)
- {
--	printf("%d", nla_get_u32(attr));
-+	printf("%u", nla_get_u32(attr));
- }
- 
- static void print_u64(const struct tm_field *field, struct nlattr *attr)
- {
--	printf("%lld", (unsigned long long)nla_get_u64(attr));
-+	printf("%llu", (unsigned long long)nla_get_u64(attr));
- }
- 
- static bool parse_flag(const struct tm_field *field, int idx,
-@@ -201,6 +205,62 @@ static void print_extra_stats(const struct tm_field *field, struct nlattr **tb)
- 	printf("%srx_per=%.02f%%\n", prefix, 100 * failed / total);
- }
- 
-+static bool parse_mac(const struct tm_field *field, int idx,
-+		      struct nl_msg *msg, const char *val)
-+{
-+#define ETH_ALEN	6
-+	bool ret = true;
-+	char *str, *cur, *ap;
-+	void *a;
-+
-+	str = strdup(val);
-+	ap = str;
-+
-+	a = nla_nest_start(msg, idx);
-+
-+	idx = 0;
-+	while ((cur = strsep(&ap, ",")) != NULL) {
-+		unsigned char addr[ETH_ALEN];
-+		char *val, *tmp = cur;
-+		int i = 0;
-+
-+		while ((val = strsep(&tmp, ":")) != NULL) {
-+			if (i >= ETH_ALEN)
-+				break;
-+
-+			addr[i++] = strtoul(val, NULL, 16);
-+		}
-+
-+		nla_put(msg, idx, ETH_ALEN, addr);
-+
-+		idx++;
-+	}
-+
-+	nla_nest_end(msg, a);
-+
-+	free(str);
-+
-+	return ret;
-+}
-+
-+static void print_mac(const struct tm_field *field, struct nlattr *attr)
-+{
-+#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
-+#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
-+	unsigned char addr[3][6];
-+	struct nlattr *cur;
-+	int idx = 0;
-+	int rem;
-+
-+	nla_for_each_nested(cur, attr, rem) {
-+		if (nla_len(cur) != 6)
-+			continue;
-+		memcpy(addr[idx++], nla_data(cur), 6);
-+	}
-+
-+	printf("" MACSTR "," MACSTR "," MACSTR "",
-+	       MAC2STR(addr[0]), MAC2STR(addr[1]), MAC2STR(addr[2]));
-+}
- 
- #define FIELD_GENERIC(_field, _name, ...)	\
- 	[FIELD_NAME(_field)] = {			\
-@@ -250,10 +310,18 @@ static void print_extra_stats(const struct tm_field *field, struct nlattr **tb)
- 		 ##__VA_ARGS__				\
- 	)
- 
-+#define FIELD_MAC(_field, _name)			\
-+	[FIELD_NAME(_field)] = {			\
-+		.name = _name,				\
-+		.parse = parse_mac,			\
-+		.print = print_mac			\
-+	}
-+
- #define FIELD_NAME(_field) MT76_TM_RX_ATTR_##_field
- static const struct tm_field rx_fields[NUM_MT76_TM_RX_ATTRS] = {
- 	FIELD_RO(s32, FREQ_OFFSET, "freq_offset"),
- 	FIELD_ARRAY_RO(u8, RCPI, "rcpi"),
-+	FIELD_ARRAY_RO(s8, RSSI, "rssi"),
- 	FIELD_ARRAY_RO(s8, IB_RSSI, "ib_rssi"),
- 	FIELD_ARRAY_RO(s8, WB_RSSI, "wb_rssi"),
- 	FIELD_RO(s8, SNR, "snr"),
-@@ -261,6 +329,7 @@ static const struct tm_field rx_fields[NUM_MT76_TM_RX_ATTRS] = {
- static struct nla_policy rx_policy[NUM_MT76_TM_RX_ATTRS] = {
- 	[MT76_TM_RX_ATTR_FREQ_OFFSET] = { .type = NLA_U32 },
- 	[MT76_TM_RX_ATTR_RCPI] = { .type = NLA_NESTED },
-+	[MT76_TM_RX_ATTR_RSSI] = { .type = NLA_NESTED },
- 	[MT76_TM_RX_ATTR_IB_RSSI] = { .type = NLA_NESTED },
- 	[MT76_TM_RX_ATTR_WB_RSSI] = { .type = NLA_NESTED },
- 	[MT76_TM_RX_ATTR_SNR] = { .type = NLA_U8 },
-@@ -274,6 +343,7 @@ static const struct tm_field stats_fields[NUM_MT76_TM_STATS_ATTRS] = {
- 	FIELD_RO(u32, TX_DONE, "tx_done"),
- 	FIELD_RO(u64, RX_PACKETS, "rx_packets"),
- 	FIELD_RO(u64, RX_FCS_ERROR, "rx_fcs_error"),
-+	FIELD_RO(u64, RX_LEN_MISMATCH, "rx_len_mismatch"),
- 	FIELD_NESTED_RO(LAST_RX, rx, "last_"),
- };
- static struct nla_policy stats_policy[NUM_MT76_TM_STATS_ATTRS] = {
-@@ -282,6 +352,7 @@ static struct nla_policy stats_policy[NUM_MT76_TM_STATS_ATTRS] = {
- 	[MT76_TM_STATS_ATTR_TX_DONE] = { .type = NLA_U32 },
- 	[MT76_TM_STATS_ATTR_RX_PACKETS] = { .type = NLA_U64 },
- 	[MT76_TM_STATS_ATTR_RX_FCS_ERROR] = { .type = NLA_U64 },
-+	[MT76_TM_STATS_ATTR_RX_LEN_MISMATCH] = { .type = NLA_U64 },
- };
- #undef FIELD_NAME
- 
-@@ -291,6 +362,7 @@ static const struct tm_field testdata_fields[NUM_MT76_TM_ATTRS] = {
- 	FIELD_ENUM(STATE, "state", testmode_state),
- 	FIELD_RO(string, MTD_PART, "mtd_part"),
- 	FIELD_RO(u32, MTD_OFFSET, "mtd_offset"),
-+	FIELD(u8, SKU_EN, "sku_en"),
- 	FIELD(u32, TX_COUNT, "tx_count"),
- 	FIELD(u32, TX_LENGTH, "tx_length"),
- 	FIELD_ENUM(TX_RATE_MODE, "tx_rate_mode", testmode_tx_mode),
-@@ -300,12 +372,20 @@ static const struct tm_field testdata_fields[NUM_MT76_TM_ATTRS] = {
- 	FIELD(u8, TX_RATE_LDPC, "tx_rate_ldpc"),
- 	FIELD(u8, TX_RATE_STBC, "tx_rate_stbc"),
- 	FIELD(u8, TX_LTF, "tx_ltf"),
-+	FIELD(u8, TX_DUTY_CYCLE, "tx_duty_cycle"),
-+	FIELD(u32, TX_IPG, "tx_ipg"),
-+	FIELD(u32, TX_TIME, "tx_time"),
- 	FIELD(u8, TX_POWER_CONTROL, "tx_power_control"),
- 	FIELD_ARRAY(u8, TX_POWER, "tx_power"),
- 	FIELD(u8, TX_ANTENNA, "tx_antenna"),
- 	FIELD(u32, FREQ_OFFSET, "freq_offset"),
-+	FIELD(u8, AID, "aid"),
-+	FIELD(u8, RU_ALLOC, "ru_alloc"),
-+	FIELD(u8, RU_IDX, "ru_idx"),
-+	FIELD_MAC(MAC_ADDRS, "mac_addrs"),
- 	FIELD_NESTED_RO(STATS, stats, "",
- 			.print_extra = print_extra_stats),
-+
- };
- #undef FIELD_NAME
- 
-@@ -313,6 +393,7 @@ static struct nla_policy testdata_policy[NUM_MT76_TM_ATTRS] = {
- 	[MT76_TM_ATTR_STATE] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_MTD_PART] = { .type = NLA_STRING },
- 	[MT76_TM_ATTR_MTD_OFFSET] = { .type = NLA_U32 },
-+	[MT76_TM_ATTR_SKU_EN] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_TX_COUNT] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_TX_LENGTH] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_TX_RATE_MODE] = { .type = NLA_U8 },
-@@ -322,10 +403,25 @@ static struct nla_policy testdata_policy[NUM_MT76_TM_ATTRS] = {
- 	[MT76_TM_ATTR_TX_RATE_LDPC] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_TX_RATE_STBC] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_TX_LTF] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_TX_DUTY_CYCLE] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_TX_IPG] = { .type = NLA_U32 },
-+	[MT76_TM_ATTR_TX_TIME] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_TX_POWER_CONTROL] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_TX_ANTENNA] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_TX_SPE_IDX] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_FREQ_OFFSET] = { .type = NLA_U32 },
-+	[MT76_TM_ATTR_AID] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_RU_ALLOC] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_RU_IDX] = { .type = NLA_U8 },
- 	[MT76_TM_ATTR_STATS] = { .type = NLA_NESTED },
-+	[MT76_TM_ATTR_TXBF_ACT] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_CH] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_BW] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_IPI_THRESHOLD] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_IPI_PERIOD] = { .type = NLA_U32 },
-+	[MT76_TM_ATTR_IPI_ANTENNA_INDEX] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_IPI_RESET] = { .type = NLA_U8 },
- };
- 
- const struct tm_field msg_field = {
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1005-mtk-wifi-mt76-testmode-add-testmode-pre-calibration-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1005-mtk-wifi-mt76-testmode-add-testmode-pre-calibration-.patch
deleted file mode 100644
index 4d70c33..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1005-mtk-wifi-mt76-testmode-add-testmode-pre-calibration-.patch
+++ /dev/null
@@ -1,899 +0,0 @@
-From 10b5c0f3d23bd9f556654364584d8eb2a9424c6f Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 31 Mar 2023 11:27:24 +0800
-Subject: [PATCH 1005/1044] mtk: wifi: mt76: testmode: add testmode
- pre-calibration support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mac80211.c        |  21 ---
- mt76.h            |  22 +++
- mt76_connac_mcu.h |   2 +
- mt7996/eeprom.c   |  66 +++++++
- mt7996/eeprom.h   |  47 +++++
- mt7996/mcu.c      |   5 +
- mt7996/mt7996.h   |   7 +
- mt7996/testmode.c | 437 ++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/testmode.h |  20 ++-
- testmode.c        |  12 ++
- testmode.h        |   8 +
- tools/fields.c    |   8 +
- 12 files changed, 632 insertions(+), 23 deletions(-)
-
-diff --git a/mac80211.c b/mac80211.c
-index fea19e19..e7d02d15 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -7,27 +7,6 @@
- #include <net/page_pool.h>
- #include "mt76.h"
- 
--#define CHAN2G(_idx, _freq) {			\
--	.band = NL80211_BAND_2GHZ,		\
--	.center_freq = (_freq),			\
--	.hw_value = (_idx),			\
--	.max_power = 30,			\
--}
--
--#define CHAN5G(_idx, _freq) {			\
--	.band = NL80211_BAND_5GHZ,		\
--	.center_freq = (_freq),			\
--	.hw_value = (_idx),			\
--	.max_power = 30,			\
--}
--
--#define CHAN6G(_idx, _freq) {			\
--	.band = NL80211_BAND_6GHZ,		\
--	.center_freq = (_freq),			\
--	.hw_value = (_idx),			\
--	.max_power = 30,			\
--}
--
- static const struct ieee80211_channel mt76_channels_2ghz[] = {
- 	CHAN2G(1, 2412),
- 	CHAN2G(2, 2417),
-diff --git a/mt76.h b/mt76.h
-index f2b1e0c2..14c5fcb1 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -18,6 +18,27 @@
- #include "util.h"
- #include "testmode.h"
- 
-+#define CHAN2G(_idx, _freq) {			\
-+	.band = NL80211_BAND_2GHZ,		\
-+	.center_freq = (_freq),			\
-+	.hw_value = (_idx),			\
-+	.max_power = 30,			\
-+}
-+
-+#define CHAN5G(_idx, _freq) {			\
-+	.band = NL80211_BAND_5GHZ,		\
-+	.center_freq = (_freq),			\
-+	.hw_value = (_idx),			\
-+	.max_power = 30,			\
-+}
-+
-+#define CHAN6G(_idx, _freq) {			\
-+	.band = NL80211_BAND_6GHZ,		\
-+	.center_freq = (_freq),			\
-+	.hw_value = (_idx),			\
-+	.max_power = 30,			\
-+}
-+
- #define MT_MCU_RING_SIZE	32
- #define MT_RX_BUF_SIZE		2048
- #define MT_SKB_HEAD_LEN		256
-@@ -698,6 +719,7 @@ struct mt76_testmode_ops {
- 	void (*reset_rx_stats)(struct mt76_phy *phy);
- 	void (*tx_stop)(struct mt76_phy *phy);
- 	int (*set_eeprom)(struct mt76_phy *phy, u32 offset, u8 *val, u8 action);
-+	int (*dump_precal)(struct mt76_phy *mphy, struct sk_buff *msg, int flag, int type);
- };
- 
- #define MT_TM_FW_RX_COUNT	BIT(0)
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 2e148011..54310413 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1042,8 +1042,10 @@ enum {
- 	MCU_UNI_EVENT_RDD_REPORT = 0x11,
- 	MCU_UNI_EVENT_ROC = 0x27,
- 	MCU_UNI_EVENT_TX_DONE = 0x2d,
-+	MCU_UNI_EVENT_BF = 0x33,
- 	MCU_UNI_EVENT_THERMAL = 0x35,
- 	MCU_UNI_EVENT_NIC_CAPAB = 0x43,
-+	MCU_UNI_EVENT_TESTMODE_CTRL = 0x46,
- 	MCU_UNI_EVENT_WED_RRO = 0x57,
- 	MCU_UNI_EVENT_PER_STA_INFO = 0x6d,
- 	MCU_UNI_EVENT_ALL_STA_INFO = 0x6e,
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 2299793d..3aeffdfb 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -12,6 +12,42 @@ static bool testmode_enable;
- module_param(testmode_enable, bool, 0644);
- MODULE_PARM_DESC(testmode_enable, "Enable testmode");
- 
-+const struct ieee80211_channel dpd_2g_ch_list_bw20[] = {
-+	CHAN2G(3, 2422),
-+	CHAN2G(7, 2442),
-+	CHAN2G(11, 2462)
-+};
-+
-+const struct ieee80211_channel dpd_5g_ch_list_bw160[] = {
-+	CHAN5G(50, 5250),
-+	CHAN5G(114, 5570),
-+	CHAN5G(163, 5815)
-+};
-+
-+const struct ieee80211_channel dpd_6g_ch_list_bw160[] = {
-+	CHAN6G(15, 6025),
-+	CHAN6G(47, 6185),
-+	CHAN6G(79, 6345),
-+	CHAN6G(111, 6505),
-+	CHAN6G(143, 6665),
-+	CHAN6G(175, 6825),
-+	CHAN6G(207, 6985)
-+};
-+
-+const struct ieee80211_channel dpd_6g_ch_list_bw320[] = {
-+	CHAN6G(31, 6105),
-+	CHAN6G(63, 6265),
-+	CHAN6G(95, 6425),
-+	CHAN6G(127, 6585),
-+	CHAN6G(159, 6745),
-+	CHAN6G(191, 6905)
-+};
-+
-+const u32 dpd_2g_bw20_ch_num = ARRAY_SIZE(dpd_2g_ch_list_bw20);
-+const u32 dpd_5g_bw160_ch_num = ARRAY_SIZE(dpd_5g_ch_list_bw160);
-+const u32 dpd_6g_bw160_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw160);
-+const u32 dpd_6g_bw320_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw320);
-+
- static int mt7996_check_eeprom(struct mt7996_dev *dev)
- {
- #define FEM_INT				0
-@@ -74,6 +110,36 @@ static char *mt7996_eeprom_name(struct mt7996_dev *dev)
- 	}
- }
- 
-+int
-+mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band)
-+{
-+	/* handle different sku */
-+	static const u8 band_to_idx[] = {
-+		[NL80211_BAND_2GHZ] = MT_BAND0,
-+		[NL80211_BAND_5GHZ] = MT_BAND1,
-+		[NL80211_BAND_6GHZ] = MT_BAND2,
-+	};
-+	struct mt7996_phy *phy = __mt7996_phy(dev, band_to_idx[band]);
-+	struct mt76_phy *mphy;
-+	int dpd_size;
-+
-+	if (!phy)
-+		return 0;
-+
-+	mphy = phy->mt76;
-+
-+	if (band == NL80211_BAND_2GHZ)
-+		dpd_size = dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
-+	else if (band == NL80211_BAND_5GHZ)
-+		dpd_size = mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
-+			   dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+	else
-+		dpd_size = mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
-+			   (dpd_6g_bw160_ch_num + dpd_6g_bw320_ch_num) * DPD_PER_CH_GT_BW20_SIZE;
-+
-+	return dpd_size;
-+}
-+
- static int
- mt7996_eeprom_load_default(struct mt7996_dev *dev)
- {
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index de3ff4e2..849b8bca 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -14,6 +14,7 @@ enum mt7996_eeprom_field {
- 	MT_EE_MAC_ADDR =	0x004,
- 	MT_EE_MAC_ADDR2 =	0x00a,
- 	MT_EE_WIFI_CONF =	0x190,
-+	MT_EE_DO_PRE_CAL =	0x1a5,
- 	MT_EE_TESTMODE_EN =	0x1af,
- 	MT_EE_MAC_ADDR3 =	0x2c0,
- 	MT_EE_RATE_DELTA_2G =	0x1400,
-@@ -32,6 +33,52 @@ enum mt7996_eeprom_field {
- #define MT_EE_WIFI_CONF2_BAND_SEL		GENMASK(2, 0)
- #define MT_EE_WIFI_PA_LNA_CONFIG		GENMASK(1, 0)
- 
-+#define MT_EE_WIFI_CAL_GROUP_2G			BIT(0)
-+#define MT_EE_WIFI_CAL_GROUP_5G			BIT(1)
-+#define MT_EE_WIFI_CAL_GROUP_6G			BIT(2)
-+#define MT_EE_WIFI_CAL_GROUP			GENMASK(2, 0)
-+#define MT_EE_WIFI_CAL_DPD_2G			BIT(3)
-+#define MT_EE_WIFI_CAL_DPD_5G			BIT(4)
-+#define MT_EE_WIFI_CAL_DPD_6G			BIT(5)
-+#define MT_EE_WIFI_CAL_DPD			GENMASK(5, 3)
-+
-+#define MT_EE_CAL_UNIT				1024
-+#define MT_EE_CAL_GROUP_SIZE_2G			(4 * MT_EE_CAL_UNIT)
-+#define MT_EE_CAL_GROUP_SIZE_5G			(45 * MT_EE_CAL_UNIT)
-+#define MT_EE_CAL_GROUP_SIZE_6G			(125 * MT_EE_CAL_UNIT)
-+#define MT_EE_CAL_ADCDCOC_SIZE_2G		(4 * 4)
-+#define MT_EE_CAL_ADCDCOC_SIZE_5G		(4 * 4)
-+#define MT_EE_CAL_ADCDCOC_SIZE_6G		(4 * 5)
-+#define MT_EE_CAL_GROUP_SIZE			(MT_EE_CAL_GROUP_SIZE_2G + \
-+						 MT_EE_CAL_GROUP_SIZE_5G + \
-+						 MT_EE_CAL_GROUP_SIZE_6G + \
-+						 MT_EE_CAL_ADCDCOC_SIZE_2G + \
-+						 MT_EE_CAL_ADCDCOC_SIZE_5G + \
-+						 MT_EE_CAL_ADCDCOC_SIZE_6G)
-+
-+#define DPD_PER_CH_LEGACY_SIZE			(4 * MT_EE_CAL_UNIT)
-+#define DPD_PER_CH_MEM_SIZE			(13 * MT_EE_CAL_UNIT)
-+#define DPD_PER_CH_OTFG0_SIZE			(2 * MT_EE_CAL_UNIT)
-+#define DPD_PER_CH_BW20_SIZE			(DPD_PER_CH_LEGACY_SIZE + DPD_PER_CH_OTFG0_SIZE)
-+#define DPD_PER_CH_GT_BW20_SIZE			(DPD_PER_CH_MEM_SIZE + DPD_PER_CH_OTFG0_SIZE)
-+#define MT_EE_CAL_DPD_SIZE			(780 * MT_EE_CAL_UNIT)
-+
-+extern const struct ieee80211_channel dpd_2g_ch_list_bw20[];
-+extern const u32 dpd_2g_bw20_ch_num;
-+extern const struct ieee80211_channel dpd_5g_ch_list_bw160[];
-+extern const u32 dpd_5g_bw160_ch_num;
-+extern const struct ieee80211_channel dpd_6g_ch_list_bw160[];
-+extern const u32 dpd_6g_bw160_ch_num;
-+extern const struct ieee80211_channel dpd_6g_ch_list_bw320[];
-+extern const u32 dpd_6g_bw320_ch_num;
-+
-+#define RF_DPD_FLAT_CAL				BIT(28)
-+#define RF_PRE_CAL				BIT(29)
-+#define RF_DPD_FLAT_5G_CAL			GENMASK(29, 28)
-+#define RF_DPD_FLAT_5G_MEM_CAL			(BIT(30) | BIT(28))
-+#define RF_DPD_FLAT_6G_CAL			GENMASK(30, 28)
-+#define RF_DPD_FLAT_6G_MEM_CAL			(BIT(31) | BIT(28))
-+
- #define MT_EE_WIFI_CONF1_TX_PATH_BAND0		GENMASK(5, 3)
- #define MT_EE_WIFI_CONF2_TX_PATH_BAND1		GENMASK(2, 0)
- #define MT_EE_WIFI_CONF2_TX_PATH_BAND2		GENMASK(5, 3)
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index d8795d30..0e2c1f1c 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -712,6 +712,11 @@ mt7996_mcu_uni_rx_unsolicited_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	case MCU_UNI_EVENT_WED_RRO:
- 		mt7996_mcu_wed_rro_event(dev, skb);
- 		break;
-+#ifdef CONFIG_NL80211_TESTMODE
-+	case MCU_UNI_EVENT_TESTMODE_CTRL:
-+		mt7996_tm_rf_test_event(dev, skb);
-+		break;
-+#endif
- 	default:
- 		break;
- 	}
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 5af55492..e7609c63 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -385,6 +385,9 @@ struct mt7996_dev {
- 	struct dentry *debugfs_dir;
- 	struct rchan *relay_fwlog;
- 
-+	void *cal;
-+	u32 cur_prek_offset;
-+
- 	struct {
- 		u16 table_mask;
- 		u8 n_agrt;
-@@ -505,6 +508,7 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
- int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
- 				   struct ieee80211_channel *chan);
- s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band);
-+int mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band);
- int mt7996_dma_init(struct mt7996_dev *dev);
- void mt7996_dma_reset(struct mt7996_dev *dev, bool force);
- void mt7996_dma_prefetch(struct mt7996_dev *dev);
-@@ -589,6 +593,9 @@ void mt7996_mcu_exit(struct mt7996_dev *dev);
- int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag);
- int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id);
- int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 data);
-+#ifdef CONFIG_NL80211_TESTMODE
-+void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
-+#endif
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-index 96079c22..36be0ff8 100644
---- a/mt7996/testmode.c
-+++ b/mt7996/testmode.c
-@@ -7,6 +7,8 @@
- #include "mac.h"
- #include "mcu.h"
- #include "testmode.h"
-+#include "eeprom.h"
-+#include "mtk_mcu.h"
- 
- enum {
- 	TM_CHANGED_TXPOWER,
-@@ -397,6 +399,436 @@ mt7996_tm_set_tx_cont(struct mt7996_phy *phy, bool en)
- 	}
- }
- 
-+static int
-+mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
-+{
-+	u8 *eeprom;
-+	u32 i, group_size, dpd_size, size, offs, *pre_cal;
-+	int ret = 0;
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_dev *mdev = &dev->mt76;
-+	struct mt7996_tm_req req = {
-+		.rf_test = {
-+			.tag = cpu_to_le16(UNI_RF_TEST_CTRL),
-+			.len = cpu_to_le16(sizeof(req.rf_test)),
-+			.action = RF_ACTION_IN_RF_TEST,
-+			.icap_len = RF_TEST_ICAP_LEN,
-+			.op.rf.func_idx = cpu_to_le32(RF_TEST_RE_CAL),
-+			.op.rf.param.cal_param.func_data = cpu_to_le32(RF_PRE_CAL),
-+			.op.rf.param.cal_param.band_idx = phy->mt76->band_idx,
-+		},
-+	};
-+
-+	if (!dev->flash_mode) {
-+		dev_err(dev->mt76.dev, "Currently not in FLASH or BIN FILE mode, return!\n");
-+		return -EOPNOTSUPP;
-+	}
-+
-+	eeprom = mdev->eeprom.data;
-+	dev->cur_prek_offset = 0;
-+	group_size = MT_EE_CAL_GROUP_SIZE;
-+	dpd_size = MT_EE_CAL_DPD_SIZE;
-+	size = group_size + dpd_size;
-+	offs = MT_EE_DO_PRE_CAL;
-+
-+	switch (state) {
-+	case MT76_TM_STATE_GROUP_PREK:
-+		if (!dev->cal) {
-+			dev->cal = devm_kzalloc(mdev->dev, size, GFP_KERNEL);
-+			if (!dev->cal)
-+				return -ENOMEM;
-+		}
-+
-+		ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_CTRL), &req,
-+					sizeof(req), false);
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == group_size,
-+				   30 * HZ);
-+
-+		if (ret) {
-+			dev_err(dev->mt76.dev, "Group Pre-cal: mcu send msg failed!\n");
-+			return ret;
-+		}
-+
-+		if (!ret)
-+			eeprom[offs] |= MT_EE_WIFI_CAL_GROUP;
-+		break;
-+	case MT76_TM_STATE_GROUP_PREK_DUMP:
-+		pre_cal = (u32 *)dev->cal;
-+		if (!pre_cal) {
-+			dev_info(dev->mt76.dev, "Not group pre-cal yet!\n");
-+			return ret;
-+		}
-+		dev_info(dev->mt76.dev, "Group Pre-Cal:\n");
-+		for (i = 0; i < (group_size / sizeof(u32)); i += 4) {
-+			dev_info(dev->mt76.dev, "[0x%08lx] 0x%8x 0x%8x 0x%8x 0x%8x\n",
-+				 i * sizeof(u32), pre_cal[i], pre_cal[i + 1],
-+				 pre_cal[i + 2], pre_cal[i + 3]);
-+		}
-+		break;
-+	case MT76_TM_STATE_GROUP_PREK_CLEAN:
-+		pre_cal = (u32 *)dev->cal;
-+		if (!pre_cal)
-+			return ret;
-+		memset(pre_cal, 0, group_size);
-+		eeprom[offs] &= ~MT_EE_WIFI_CAL_GROUP;
-+		break;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	return ret;
-+}
-+
-+static int
-+mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
-+			    const struct ieee80211_channel *chan_list, u32 channel_size,
-+			    enum nl80211_chan_width width, u32 func_data)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_phy *mphy = phy->mt76;
-+	struct cfg80211_chan_def chandef_backup, *chandef = &mphy->chandef;
-+	struct ieee80211_channel chan_backup;
-+	int i, ret;
-+
-+	if (!chan_list)
-+		return -EOPNOTSUPP;
-+
-+	req->rf_test.op.rf.param.cal_param.func_data = cpu_to_le32(func_data);
-+
-+	memcpy(&chan_backup, chandef->chan, sizeof(struct ieee80211_channel));
-+	memcpy(&chandef_backup, chandef, sizeof(struct cfg80211_chan_def));
-+
-+	for (i = 0; i < channel_size; i++) {
-+		memcpy(chandef->chan, &chan_list[i], sizeof(struct ieee80211_channel));
-+		chandef->width = width;
-+
-+		/* set channel switch reason */
-+		mphy->hw->conf.flags |= IEEE80211_CONF_OFFCHANNEL;
-+		mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_SWITCH);
-+
-+		ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_CTRL), req,
-+					sizeof(*req), false);
-+		if (ret) {
-+			dev_err(dev->mt76.dev, "DPD Pre-cal: mcu send msg failed!\n");
-+			goto out;
-+		}
-+	}
-+
-+out:
-+	mphy->hw->conf.flags &= ~IEEE80211_CONF_OFFCHANNEL;
-+	memcpy(chandef, &chandef_backup, sizeof(struct cfg80211_chan_def));
-+	memcpy(chandef->chan, &chan_backup, sizeof(struct ieee80211_channel));
-+	mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_SWITCH);
-+
-+	return ret;
-+}
-+
-+static int
-+mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_dev *mdev = &dev->mt76;
-+	struct mt76_phy *mphy = phy->mt76;
-+	struct mt7996_tm_req req = {
-+		.rf_test = {
-+			.tag = cpu_to_le16(UNI_RF_TEST_CTRL),
-+			.len = cpu_to_le16(sizeof(req.rf_test)),
-+			.action = RF_ACTION_IN_RF_TEST,
-+			.icap_len = RF_TEST_ICAP_LEN,
-+			.op.rf.func_idx = cpu_to_le32(RF_TEST_RE_CAL),
-+			.op.rf.param.cal_param.band_idx = phy->mt76->band_idx,
-+		},
-+	};
-+	u32 i, j, group_size, dpd_size, size, offs, *pre_cal;
-+	u32 wait_on_prek_offset = 0;
-+	u8 do_precal, *eeprom;
-+	int ret = 0;
-+
-+	if (!dev->flash_mode) {
-+		dev_err(dev->mt76.dev, "Currently not in FLASH or BIN FILE mode, return!\n");
-+		return -EOPNOTSUPP;
-+	}
-+
-+	eeprom = mdev->eeprom.data;
-+	dev->cur_prek_offset = 0;
-+	group_size = MT_EE_CAL_GROUP_SIZE;
-+	dpd_size = MT_EE_CAL_DPD_SIZE;
-+	size = group_size + dpd_size;
-+	offs = MT_EE_DO_PRE_CAL;
-+
-+	if (!dev->cal && state < MT76_TM_STATE_DPD_DUMP) {
-+		dev->cal = devm_kzalloc(mdev->dev, size, GFP_KERNEL);
-+		if (!dev->cal)
-+			return -ENOMEM;
-+	}
-+
-+	switch (state) {
-+	case MT76_TM_STATE_DPD_2G:
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_2g_ch_list_bw20,
-+						  dpd_2g_bw20_ch_num,
-+						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_CAL);
-+		wait_on_prek_offset += dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		do_precal = MT_EE_WIFI_CAL_DPD_2G;
-+		break;
-+	case MT76_TM_STATE_DPD_5G:
-+		/* 5g channel bw20 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, mphy->sband_5g.sband.channels,
-+						  mphy->sband_5g.sband.n_channels,
-+						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_5G_CAL);
-+		if (ret)
-+			return ret;
-+		wait_on_prek_offset += mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		/* 5g channel bw160 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_5g_ch_list_bw160,
-+						  dpd_5g_bw160_ch_num,
-+						  NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_5G_MEM_CAL);
-+		wait_on_prek_offset += dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		do_precal = MT_EE_WIFI_CAL_DPD_5G;
-+		break;
-+	case MT76_TM_STATE_DPD_6G:
-+		/* 6g channel bw20 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, mphy->sband_6g.sband.channels,
-+						  mphy->sband_6g.sband.n_channels,
-+						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_6G_CAL);
-+		if (ret)
-+			return ret;
-+		wait_on_prek_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		/* 6g channel bw160 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw160,
-+						  dpd_6g_bw160_ch_num,
-+						  NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_6G_MEM_CAL);
-+		if (ret)
-+			return ret;
-+		wait_on_prek_offset += dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		/* 6g channel bw320 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw320,
-+						  dpd_6g_bw320_ch_num,
-+						  NL80211_CHAN_WIDTH_320, RF_DPD_FLAT_6G_MEM_CAL);
-+		wait_on_prek_offset += dpd_6g_bw320_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait,
-+				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+
-+		do_precal = MT_EE_WIFI_CAL_DPD_6G;
-+		break;
-+	case MT76_TM_STATE_DPD_DUMP:
-+		if (!dev->cal) {
-+			dev_info(dev->mt76.dev, "Not DPD pre-cal yet!\n");
-+			return ret;
-+		}
-+		pre_cal = (u32 *)dev->cal;
-+		dev_info(dev->mt76.dev, "DPD Pre-Cal:\n");
-+		for (i = 0; i < dpd_size / sizeof(u32); i += 4) {
-+			j = i + (group_size / sizeof(u32));
-+			dev_info(dev->mt76.dev, "[0x%08lx] 0x%8x 0x%8x 0x%8x 0x%8x\n",
-+				 j * sizeof(u32), pre_cal[j], pre_cal[j + 1],
-+				 pre_cal[j + 2], pre_cal[j + 3]);
-+		}
-+		return 0;
-+	case MT76_TM_STATE_DPD_CLEAN:
-+		pre_cal = (u32 *)dev->cal;
-+		if (!pre_cal)
-+			return ret;
-+		memset(pre_cal + (group_size / sizeof(u32)), 0, dpd_size);
-+		do_precal = MT_EE_WIFI_CAL_DPD;
-+		eeprom[offs] &= ~do_precal;
-+		return 0;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	if (!ret)
-+		eeprom[offs] |= do_precal;
-+
-+	return ret;
-+}
-+
-+static int
-+mt7996_tm_dump_precal(struct mt76_phy *mphy, struct sk_buff *msg, int flag, int type)
-+{
-+#define DPD_PER_CHAN_SIZE_MASK		GENMASK(31, 30)
-+#define DPD_2G_RATIO_MASK		GENMASK(29, 20)
-+#define DPD_5G_RATIO_MASK		GENMASK(19, 10)
-+#define DPD_6G_RATIO_MASK		GENMASK(9, 0)
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt7996_dev *dev = phy->dev;
-+	u32 i, group_size, dpd_size, total_size, size, dpd_info = 0;
-+	u32 dpd_size_2g, dpd_size_5g, dpd_size_6g;
-+	u32 base, offs, transmit_size = 1000;
-+	u8 *pre_cal, *eeprom;
-+	void *precal;
-+	enum prek_ops {
-+		PREK_GET_INFO,
-+		PREK_SYNC_ALL,
-+		PREK_SYNC_GROUP,
-+		PREK_SYNC_DPD_2G,
-+		PREK_SYNC_DPD_5G,
-+		PREK_SYNC_DPD_6G,
-+		PREK_CLEAN_GROUP,
-+		PREK_CLEAN_DPD,
-+	};
-+
-+	if (!dev->cal) {
-+		dev_info(dev->mt76.dev, "Not pre-cal yet!\n");
-+		return 0;
-+	}
-+
-+	group_size = MT_EE_CAL_GROUP_SIZE;
-+	dpd_size = MT_EE_CAL_DPD_SIZE;
-+	total_size = group_size + dpd_size;
-+	pre_cal = dev->cal;
-+	eeprom = dev->mt76.eeprom.data;
-+	offs = MT_EE_DO_PRE_CAL;
-+
-+	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
-+	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
-+	dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
-+
-+	switch (type) {
-+	case PREK_SYNC_ALL:
-+		base = 0;
-+		size = total_size;
-+		break;
-+	case PREK_SYNC_GROUP:
-+		base = 0;
-+		size = group_size;
-+		break;
-+	case PREK_SYNC_DPD_2G:
-+		base = group_size;
-+		size = dpd_size_2g;
-+		break;
-+	case PREK_SYNC_DPD_5G:
-+		base = group_size + dpd_size_2g;
-+		size = dpd_size_5g;
-+		break;
-+	case PREK_SYNC_DPD_6G:
-+		base = group_size + dpd_size_2g + dpd_size_5g;
-+		size = dpd_size_6g;
-+		break;
-+	case PREK_GET_INFO:
-+		break;
-+	default:
-+		return 0;
-+	}
-+
-+	if (!flag) {
-+		if (eeprom[offs] & MT_EE_WIFI_CAL_DPD) {
-+			dpd_info |= u32_encode_bits(1, DPD_PER_CHAN_SIZE_MASK) |
-+				    u32_encode_bits(dpd_size_2g / MT_EE_CAL_UNIT,
-+						    DPD_2G_RATIO_MASK) |
-+				    u32_encode_bits(dpd_size_5g / MT_EE_CAL_UNIT,
-+						    DPD_5G_RATIO_MASK) |
-+				    u32_encode_bits(dpd_size_6g / MT_EE_CAL_UNIT,
-+						    DPD_6G_RATIO_MASK);
-+		}
-+		dev->cur_prek_offset = 0;
-+		precal = nla_nest_start(msg, MT76_TM_ATTR_PRECAL_INFO);
-+		if (!precal)
-+			return -ENOMEM;
-+		nla_put_u32(msg, 0, group_size);
-+		nla_put_u32(msg, 1, dpd_size);
-+		nla_put_u32(msg, 2, dpd_info);
-+		nla_put_u32(msg, 3, transmit_size);
-+		nla_put_u32(msg, 4, eeprom[offs]);
-+		nla_nest_end(msg, precal);
-+	} else {
-+		precal = nla_nest_start(msg, MT76_TM_ATTR_PRECAL);
-+		if (!precal)
-+			return -ENOMEM;
-+
-+		transmit_size = (dev->cur_prek_offset + transmit_size < size) ?
-+				transmit_size : (size - dev->cur_prek_offset);
-+		for (i = 0; i < transmit_size; i++) {
-+			if (nla_put_u8(msg, i, pre_cal[base + dev->cur_prek_offset + i]))
-+				return -ENOMEM;
-+		}
-+		dev->cur_prek_offset += transmit_size;
-+
-+		nla_nest_end(msg, precal);
-+	}
-+
-+	return 0;
-+}
-+
-+static void
-+mt7996_tm_re_cal_event(struct mt7996_dev *dev, struct mt7996_tm_rf_test_result *result,
-+		       struct mt7996_tm_rf_test_data *data)
-+{
-+	u32 base, dpd_size_2g, dpd_size_5g, dpd_size_6g, cal_idx, cal_type, len = 0;
-+	u8 *pre_cal;
-+
-+	pre_cal = dev->cal;
-+	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
-+	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
-+	dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
-+
-+	cal_idx = le32_to_cpu(data->cal_idx);
-+	cal_type = le32_to_cpu(data->cal_type);
-+	len = le32_to_cpu(result->payload_length);
-+	len = len - sizeof(struct mt7996_tm_rf_test_data);
-+
-+	switch (cal_type) {
-+	case RF_PRE_CAL:
-+		base = 0;
-+		break;
-+	case RF_DPD_FLAT_CAL:
-+		base = MT_EE_CAL_GROUP_SIZE;
-+		break;
-+	case RF_DPD_FLAT_5G_CAL:
-+	case RF_DPD_FLAT_5G_MEM_CAL:
-+		base = MT_EE_CAL_GROUP_SIZE + dpd_size_2g;
-+		break;
-+	case RF_DPD_FLAT_6G_CAL:
-+	case RF_DPD_FLAT_6G_MEM_CAL:
-+		base = MT_EE_CAL_GROUP_SIZE + dpd_size_2g + dpd_size_5g;
-+		break;
-+	default:
-+		dev_info(dev->mt76.dev, "Unknown calibration type!\n");
-+		return;
-+	}
-+	pre_cal += (base + dev->cur_prek_offset);
-+
-+	memcpy(pre_cal, data->cal_data, len);
-+	dev->cur_prek_offset += len;
-+}
-+
-+void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+	struct mt7996_tm_event *event;
-+	struct mt7996_tm_rf_test_result *result;
-+	struct mt7996_tm_rf_test_data *data;
-+	static u32 event_type;
-+
-+	skb_pull(skb, sizeof(struct mt7996_mcu_rxd));
-+	event = (struct mt7996_tm_event *)skb->data;
-+	result = (struct mt7996_tm_rf_test_result *)&event->result;
-+	data = (struct mt7996_tm_rf_test_data *)result->data;
-+
-+	event_type = le32_to_cpu(result->func_idx);
-+
-+	switch (event_type) {
-+	case RF_TEST_RE_CAL:
-+		mt7996_tm_re_cal_event(dev, result, data);
-+		break;
-+	default:
-+		break;
-+	}
-+}
-+
- static void
- mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
- {
-@@ -454,6 +886,10 @@ mt7996_tm_set_state(struct mt76_phy *mphy, enum mt76_testmode_state state)
- 	else if (prev_state == MT76_TM_STATE_OFF ||
- 		 state == MT76_TM_STATE_OFF)
- 		mt7996_tm_init(phy, !(state == MT76_TM_STATE_OFF));
-+	else if (state >= MT76_TM_STATE_GROUP_PREK && state <= MT76_TM_STATE_GROUP_PREK_CLEAN)
-+		return mt7996_tm_group_prek(phy, state);
-+	else if (state >= MT76_TM_STATE_DPD_2G && state <= MT76_TM_STATE_DPD_CLEAN)
-+		return mt7996_tm_dpd_prek(phy, state);
- 
- 	if ((state == MT76_TM_STATE_IDLE &&
- 	     prev_state == MT76_TM_STATE_OFF) ||
-@@ -737,4 +1173,5 @@ const struct mt76_testmode_ops mt7996_testmode_ops = {
- 	.reset_rx_stats = mt7996_tm_reset_trx_stats,
- 	.tx_stop = mt7996_tm_tx_stop,
- 	.set_eeprom = mt7996_tm_set_eeprom,
-+	.dump_precal = mt7996_tm_dump_precal,
- };
-diff --git a/mt7996/testmode.h b/mt7996/testmode.h
-index 319ef257..9bfb86f2 100644
---- a/mt7996/testmode.h
-+++ b/mt7996/testmode.h
-@@ -34,6 +34,12 @@ enum bw_mapping_method {
- 	NUM_BW_MAP,
- };
- 
-+struct tm_cal_param {
-+	__le32 func_data;
-+	u8 band_idx;
-+	u8 rsv[3];
-+};
-+
- struct mt7996_tm_rf_test {
- 	__le16 tag;
- 	__le16 len;
-@@ -50,7 +56,7 @@ struct mt7996_tm_rf_test {
- 			union {
- 				__le32 func_data;
- 				__le32 cal_dump;
--
-+				struct tm_cal_param cal_param;
- 				u8 _pad[80];
- 			} param;
- 		} rf;
-@@ -63,10 +69,16 @@ struct mt7996_tm_req {
- 	struct mt7996_tm_rf_test rf_test;
- } __packed;
- 
-+struct mt7996_tm_rf_test_data {
-+	__le32 cal_idx;
-+	__le32 cal_type;
-+	u8 cal_data[0];
-+} __packed;
-+
- struct mt7996_tm_rf_test_result {
- 	__le32 func_idx;
- 	__le32 payload_length;
--	u8 event[0];
-+	u8 data[0];
- };
- 
- struct mt7996_tm_event {
-@@ -77,6 +89,8 @@ struct mt7996_tm_event {
- 	struct mt7996_tm_rf_test_result result;
- } __packed;
- 
-+#define RF_TEST_RE_CAL		0x01
-+
- enum {
- 	RF_ACTION_SWITCH_TO_RF_TEST,
- 	RF_ACTION_IN_RF_TEST,
-@@ -84,6 +98,8 @@ enum {
- 	RF_ACTION_GET,
- };
- 
-+#define RF_TEST_ICAP_LEN	120
-+
- enum {
- 	RF_OPER_NORMAL,
- 	RF_OPER_RF_TEST,
-diff --git a/testmode.c b/testmode.c
-index 44f3a5bf..cd8cb655 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -674,6 +674,18 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- 
- 	mutex_lock(&dev->mutex);
- 
-+	if (tb[MT76_TM_ATTR_PRECAL] || tb[MT76_TM_ATTR_PRECAL_INFO]) {
-+		int flag, type;
-+
-+		err = -EINVAL;
-+		flag = tb[MT76_TM_ATTR_PRECAL] ? 1 : 0;
-+		type = flag ? nla_get_u8(tb[MT76_TM_ATTR_PRECAL_INFO]) : 0;
-+		if (dev->test_ops->dump_precal)
-+			err = dev->test_ops->dump_precal(phy, msg, flag, type);
-+
-+		goto out;
-+	}
-+
- 	if (tb[MT76_TM_ATTR_STATS]) {
- 		err = -EINVAL;
- 
-diff --git a/testmode.h b/testmode.h
-index 96872e8c..d6601cdc 100644
---- a/testmode.h
-+++ b/testmode.h
-@@ -220,6 +220,14 @@ enum mt76_testmode_state {
- 	MT76_TM_STATE_TX_FRAMES,
- 	MT76_TM_STATE_RX_FRAMES,
- 	MT76_TM_STATE_TX_CONT,
-+	MT76_TM_STATE_GROUP_PREK,
-+	MT76_TM_STATE_GROUP_PREK_DUMP,
-+	MT76_TM_STATE_GROUP_PREK_CLEAN,
-+	MT76_TM_STATE_DPD_2G,
-+	MT76_TM_STATE_DPD_5G,
-+	MT76_TM_STATE_DPD_6G,
-+	MT76_TM_STATE_DPD_DUMP,
-+	MT76_TM_STATE_DPD_CLEAN,
- 	MT76_TM_STATE_ON,
- 
- 	/* keep last */
-diff --git a/tools/fields.c b/tools/fields.c
-index 055f90f3..b0122763 100644
---- a/tools/fields.c
-+++ b/tools/fields.c
-@@ -11,6 +11,14 @@ static const char * const testmode_state[] = {
- 	[MT76_TM_STATE_TX_FRAMES] = "tx_frames",
- 	[MT76_TM_STATE_RX_FRAMES] = "rx_frames",
- 	[MT76_TM_STATE_TX_CONT] = "tx_cont",
-+	[MT76_TM_STATE_GROUP_PREK] = "group_prek",
-+	[MT76_TM_STATE_GROUP_PREK_DUMP] = "group_prek_dump",
-+	[MT76_TM_STATE_GROUP_PREK_CLEAN] = "group_prek_clean",
-+	[MT76_TM_STATE_DPD_2G] = "dpd_2g",
-+	[MT76_TM_STATE_DPD_5G] = "dpd_5g",
-+	[MT76_TM_STATE_DPD_6G] = "dpd_6g",
-+	[MT76_TM_STATE_DPD_DUMP] = "dpd_dump",
-+	[MT76_TM_STATE_DPD_CLEAN] = "dpd_clean",
- };
- 
- static const char * const testmode_tx_mode[] = {
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1006-mtk-wifi-mt76-mt7996-enable-SCS-feature-for-mt7996-d.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1006-mtk-wifi-mt76-mt7996-enable-SCS-feature-for-mt7996-d.patch
deleted file mode 100644
index df56fb5..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1006-mtk-wifi-mt76-mt7996-enable-SCS-feature-for-mt7996-d.patch
+++ /dev/null
@@ -1,304 +0,0 @@
-From 50d5f66613427d37f2f714ee4334e36eaa9039f7 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Mon, 8 May 2023 09:03:50 +0800
-Subject: [PATCH 1006/1044] mtk: wifi: mt76: mt7996: enable SCS feature for
- mt7996 driver
-
-Enable Smart Carrier Sense algorithn by default to improve performance
-in a noisy environment.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt76_connac_mcu.h    |   1 +
- mt7996/init.c        |   1 +
- mt7996/mac.c         |   2 +
- mt7996/main.c        |   7 +++
- mt7996/mcu.c         | 105 +++++++++++++++++++++++++++++++++++++++++++
- mt7996/mcu.h         |   6 +++
- mt7996/mt7996.h      |  15 +++++++
- mt7996/mtk_debugfs.c |  11 +++++
- 8 files changed, 148 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 54310413..4a3ea0b7 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1261,6 +1261,7 @@ enum {
- 	MCU_UNI_CMD_GET_STAT_INFO = 0x23,
- 	MCU_UNI_CMD_SNIFFER = 0x24,
- 	MCU_UNI_CMD_SR = 0x25,
-+	MCU_UNI_CMD_SCS = 0x26,
- 	MCU_UNI_CMD_ROC = 0x27,
- 	MCU_UNI_CMD_SET_DBDC_PARMS = 0x28,
- 	MCU_UNI_CMD_TXPOWER = 0x2b,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index d4d1a60b..23a9b88b 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -1374,6 +1374,7 @@ int mt7996_register_device(struct mt7996_dev *dev)
- 	dev->mt76.phy.priv = &dev->phy;
- 	INIT_WORK(&dev->rc_work, mt7996_mac_sta_rc_work);
- 	INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7996_mac_work);
-+	INIT_DELAYED_WORK(&dev->scs_work, mt7996_mcu_scs_sta_poll);
- 	INIT_LIST_HEAD(&dev->sta_rc_list);
- 	INIT_LIST_HEAD(&dev->twt_list);
- 
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 603f6c0d..c9f45abe 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1795,6 +1795,7 @@ mt7996_mac_full_reset(struct mt7996_dev *dev)
- 		cancel_delayed_work_sync(&phy2->mt76->mac_work);
- 	if (phy3)
- 		cancel_delayed_work_sync(&phy3->mt76->mac_work);
-+	cancel_delayed_work_sync(&dev->scs_work);
- 
- 	mutex_lock(&dev->mt76.mutex);
- 	for (i = 0; i < 10; i++) {
-@@ -1830,6 +1831,7 @@ mt7996_mac_full_reset(struct mt7996_dev *dev)
- 		ieee80211_queue_delayed_work(phy3->mt76->hw,
- 					     &phy3->mt76->mac_work,
- 					     MT7996_WATCHDOG_TIME);
-+	ieee80211_queue_delayed_work(mt76_hw(dev), &dev->scs_work, HZ);
- }
- 
- void mt7996_mac_reset_work(struct work_struct *work)
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 40b5cee3..ffb1f81b 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -73,11 +73,17 @@ int mt7996_run(struct ieee80211_hw *hw)
- 	if (ret)
- 		goto out;
- 
-+	ret = mt7996_mcu_set_scs(phy, SCS_ENABLE);
-+	if (ret)
-+		goto out;
-+
- 	set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
- 
- 	ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
- 				     MT7996_WATCHDOG_TIME);
- 
-+	ieee80211_queue_delayed_work(mt76_hw(dev), &dev->scs_work, HZ);
-+
- 	if (!running)
- 		mt7996_mac_reset_counters(phy);
- 
-@@ -105,6 +111,7 @@ static void mt7996_stop(struct ieee80211_hw *hw)
- 	struct mt7996_phy *phy = mt7996_hw_phy(hw);
- 
- 	cancel_delayed_work_sync(&phy->mt76->mac_work);
-+	cancel_delayed_work_sync(&dev->scs_work);
- 
- 	mutex_lock(&dev->mt76.mutex);
- 
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 0e2c1f1c..62452d6e 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -4615,3 +4615,108 @@ int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 da
- 	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TXPOWER),
- 				 &req, sizeof(req), false);
- }
-+
-+int mt7996_mcu_set_scs_stats(struct mt7996_phy *phy)
-+{
-+	struct mt7996_scs_ctrl ctrl = phy->scs_ctrl;
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 _rsv2[6];
-+		s8 min_rssi;
-+		u8 _rsv3;
-+	} __packed req = {
-+		.band_idx = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(UNI_CMD_SCS_SEND_DATA),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+
-+		.min_rssi = ctrl.sta_min_rssi,
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(SCS),
-+				 &req, sizeof(req), false);
-+}
-+
-+void mt7996_sta_rssi_work(void *data, struct ieee80211_sta *sta)
-+{
-+	struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
-+	struct mt7996_phy *poll_phy = (struct mt7996_phy *) data;
-+
-+	if (poll_phy->scs_ctrl.sta_min_rssi > msta->ack_signal)
-+		poll_phy->scs_ctrl.sta_min_rssi = msta->ack_signal;
-+}
-+
-+void mt7996_mcu_scs_sta_poll(struct work_struct *work)
-+{
-+	struct mt7996_dev *dev = container_of(work, struct mt7996_dev,
-+				 scs_work.work);
-+	bool scs_enable_flag = false;
-+	u8 i;
-+
-+	for (i = 0; i < __MT_MAX_BAND; i++) {
-+		struct mt7996_phy *phy;
-+
-+		switch (i) {
-+		case MT_BAND0:
-+			phy = dev->mphy.priv;
-+			break;
-+		case MT_BAND1:
-+			phy = mt7996_phy2(dev);
-+			break;
-+		case MT_BAND2:
-+			phy = mt7996_phy3(dev);
-+			break;
-+		default:
-+			phy = NULL;
-+			break;
-+		}
-+
-+		if (!phy || !test_bit(MT76_STATE_RUNNING, &phy->mt76->state) ||
-+		    !phy->scs_ctrl.scs_enable)
-+			continue;
-+
-+		ieee80211_iterate_stations_atomic(phy->mt76->hw,
-+						  mt7996_sta_rssi_work, phy);
-+
-+		scs_enable_flag = true;
-+		if (mt7996_mcu_set_scs_stats(phy))
-+			dev_err(dev->mt76.dev, "Failed to send scs mcu cmd\n");
-+		phy->scs_ctrl.sta_min_rssi = 0;
-+	}
-+
-+	if (scs_enable_flag)
-+		ieee80211_queue_delayed_work(mt76_hw(dev), &dev->scs_work, HZ);
-+}
-+
-+
-+int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 scs_enable;
-+		u8 _rsv2[3];
-+	} __packed req = {
-+		.band_idx = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(UNI_CMD_SCS_ENABLE),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.scs_enable = enable,
-+	};
-+
-+	phy->scs_ctrl.scs_enable = enable;
-+
-+	if (enable == SCS_ENABLE)
-+		ieee80211_queue_delayed_work(mt76_hw(dev), &dev->scs_work, HZ);
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(SCS),
-+				 &req, sizeof(req), false);
-+}
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 325c3c97..4f4994d8 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -960,6 +960,12 @@ enum {
- 	UNI_CMD_PP_EN_CTRL,
- };
- 
-+enum {
-+	UNI_CMD_SCS_SEND_DATA,
-+	UNI_CMD_SCS_SET_PD_THR_RANGE = 2,
-+	UNI_CMD_SCS_ENABLE,
-+};
-+
- #define MT7996_PATCH_SEC		GENMASK(31, 24)
- #define MT7996_PATCH_SCRAMBLE_KEY	GENMASK(15, 8)
- #define MT7996_PATCH_AES_KEY		GENMASK(7, 0)
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index e7609c63..384157c8 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -233,6 +233,16 @@ struct mt7996_hif {
- 	int irq;
- };
- 
-+struct mt7996_scs_ctrl {
-+	u8 scs_enable;
-+	s8 sta_min_rssi;
-+};
-+
-+enum {
-+	SCS_DISABLE = 0,
-+	SCS_ENABLE,
-+};
-+
- struct mt7996_wed_rro_addr {
- 	u32 head_low;
- 	u32 head_high : 4;
-@@ -280,6 +290,8 @@ struct mt7996_phy {
- 
- 	bool has_aux_rx;
- 
-+	struct mt7996_scs_ctrl scs_ctrl;
-+
- #ifdef CONFIG_NL80211_TESTMODE
- 	struct {
- 		u32 *reg_backup;
-@@ -326,6 +338,7 @@ struct mt7996_dev {
- 	struct work_struct rc_work;
- 	struct work_struct dump_work;
- 	struct work_struct reset_work;
-+	struct delayed_work scs_work;
- 	wait_queue_head_t reset_wait;
- 	struct {
- 		u32 state;
-@@ -596,6 +609,8 @@ int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 da
- #ifdef CONFIG_NL80211_TESTMODE
- void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
- #endif
-+int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable);
-+void mt7996_mcu_scs_sta_poll(struct work_struct *work);
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 678b009e..7e4ac77c 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2407,6 +2407,16 @@ static int mt7996_token_read(struct seq_file *s, void *data)
- 	return 0;
- }
- 
-+static int
-+mt7996_scs_enable_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	return mt7996_mcu_set_scs(phy, (u8) val);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_scs_enable, NULL,
-+			 mt7996_scs_enable_set, "%lld\n");
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2477,6 +2487,7 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "token", dir, mt7996_token_read);
- 
- 	debugfs_create_u8("sku_disable", 0600, dir, &dev->dbg.sku_disable);
-+	debugfs_create_file("scs_enable", 0200, dir, phy, &fops_scs_enable);
- 
- 	return 0;
- }
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1007-mtk-wifi-mt76-mt7996-add-txpower-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1007-mtk-wifi-mt76-mt7996-add-txpower-support.patch
deleted file mode 100644
index e96a9fb..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1007-mtk-wifi-mt76-mt7996-add-txpower-support.patch
+++ /dev/null
@@ -1,675 +0,0 @@
-From 668d96f2685432f602994676ff31f826fb98a99f Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 24 Mar 2023 23:35:30 +0800
-Subject: [PATCH 1007/1044] mtk: wifi: mt76: mt7996: add txpower support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/eeprom.c      |  34 +++++
- mt7996/eeprom.h      |  42 ++++++
- mt7996/mcu.h         |   2 +
- mt7996/mt7996.h      |   1 +
- mt7996/mtk_debugfs.c | 326 +++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.c     |  23 +++
- mt7996/mtk_mcu.h     |  92 ++++++++++++
- mt7996/regs.h        |  29 ++--
- 8 files changed, 538 insertions(+), 11 deletions(-)
-
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 3aeffdfb..acc33cfe 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -404,3 +404,37 @@ s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band)
- 
- 	return val & MT_EE_RATE_DELTA_SIGN ? delta : -delta;
- }
-+
-+const u8 mt7996_sku_group_len[] = {
-+	[SKU_CCK] = 4,
-+	[SKU_OFDM] = 8,
-+	[SKU_HT20] = 8,
-+	[SKU_HT40] = 9,
-+	[SKU_VHT20] = 12,
-+	[SKU_VHT40] = 12,
-+	[SKU_VHT80] = 12,
-+	[SKU_VHT160] = 12,
-+	[SKU_HE26] = 12,
-+	[SKU_HE52] = 12,
-+	[SKU_HE106] = 12,
-+	[SKU_HE242] = 12,
-+	[SKU_HE484] = 12,
-+	[SKU_HE996] = 12,
-+	[SKU_HE2x996] = 12,
-+	[SKU_EHT26] = 16,
-+	[SKU_EHT52] = 16,
-+	[SKU_EHT106] = 16,
-+	[SKU_EHT242] = 16,
-+	[SKU_EHT484] = 16,
-+	[SKU_EHT996] = 16,
-+	[SKU_EHT2x996] = 16,
-+	[SKU_EHT4x996] = 16,
-+	[SKU_EHT26_52] = 16,
-+	[SKU_EHT26_106] = 16,
-+	[SKU_EHT484_242] = 16,
-+	[SKU_EHT996_484] = 16,
-+	[SKU_EHT996_484_242] = 16,
-+	[SKU_EHT2x996_484] = 16,
-+	[SKU_EHT3x996] = 16,
-+	[SKU_EHT3x996_484] = 16,
-+};
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 849b8bca..23d4929d 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -123,4 +123,46 @@ mt7996_get_channel_group_6g(int channel)
- 	return DIV_ROUND_UP(channel - 29, 32);
- }
- 
-+enum mt7996_sku_rate_group {
-+	SKU_CCK,
-+	SKU_OFDM,
-+
-+	SKU_HT20,
-+	SKU_HT40,
-+
-+	SKU_VHT20,
-+	SKU_VHT40,
-+	SKU_VHT80,
-+	SKU_VHT160,
-+
-+	SKU_HE26,
-+	SKU_HE52,
-+	SKU_HE106,
-+	SKU_HE242,
-+	SKU_HE484,
-+	SKU_HE996,
-+	SKU_HE2x996,
-+
-+	SKU_EHT26,
-+	SKU_EHT52,
-+	SKU_EHT106,
-+	SKU_EHT242,
-+	SKU_EHT484,
-+	SKU_EHT996,
-+	SKU_EHT2x996,
-+	SKU_EHT4x996,
-+	SKU_EHT26_52,
-+	SKU_EHT26_106,
-+	SKU_EHT484_242,
-+	SKU_EHT996_484,
-+	SKU_EHT996_484_242,
-+	SKU_EHT2x996_484,
-+	SKU_EHT3x996,
-+	SKU_EHT3x996_484,
-+
-+	MAX_SKU_RATE_GROUP_NUM,
-+};
-+
-+extern const u8 mt7996_sku_group_len[MAX_SKU_RATE_GROUP_NUM];
-+
- #endif
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 4f4994d8..887d9b49 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -911,6 +911,7 @@ struct tx_power_ctrl {
- 		bool ate_mode_enable;
- 		bool percentage_ctrl_enable;
- 		bool bf_backoff_enable;
-+		u8 show_info_category;
- 		u8 power_drop_level;
- 	};
- 	u8 band_idx;
-@@ -924,6 +925,7 @@ enum {
- 	UNI_TXPOWER_BACKOFF_POWER_LIMIT_CTRL = 3,
- 	UNI_TXPOWER_POWER_LIMIT_TABLE_CTRL = 4,
- 	UNI_TXPOWER_ATE_MODE_CTRL = 6,
-+	UNI_TXPOWER_SHOW_INFO = 7,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 384157c8..18a6a46d 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -609,6 +609,7 @@ int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 da
- #ifdef CONFIG_NL80211_TESTMODE
- void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
- #endif
-+int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event);
- int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable);
- void mt7996_mcu_scs_sta_poll(struct work_struct *work);
- 
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 7e4ac77c..c47d65c9 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2417,6 +2417,328 @@ mt7996_scs_enable_set(void *data, u64 val)
- DEFINE_DEBUGFS_ATTRIBUTE(fops_scs_enable, NULL,
- 			 mt7996_scs_enable_set, "%lld\n");
- 
-+static int
-+mt7996_txpower_level_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+	int ret;
-+
-+	if (val > 100)
-+		return -EINVAL;
-+
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_PERCENTAGE_CTRL, !!val);
-+	if (ret)
-+		return ret;
-+
-+	return mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_PERCENTAGE_DROP_CTRL, val);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_txpower_level, NULL,
-+			 mt7996_txpower_level_set, "%lld\n");
-+
-+static ssize_t
-+mt7996_get_txpower_info(struct file *file, char __user *user_buf,
-+			size_t count, loff_t *ppos)
-+{
-+	struct mt7996_phy *phy = file->private_data;
-+	struct mt7996_mcu_txpower_event *event;
-+	struct txpower_basic_info *basic_info;
-+	static const size_t size = 2048;
-+	int len = 0;
-+	ssize_t ret;
-+	char *buf;
-+
-+	buf = kzalloc(size, GFP_KERNEL);
-+	event = kzalloc(sizeof(*event), GFP_KERNEL);
-+	if (!buf || !event) {
-+		ret = -ENOMEM;
-+		goto out;
-+	}
-+
-+	ret = mt7996_mcu_get_tx_power_info(phy, BASIC_INFO, event);
-+	if (ret ||
-+	    le32_to_cpu(event->basic_info.category) != UNI_TXPOWER_BASIC_INFO)
-+		goto out;
-+
-+	basic_info = &event->basic_info;
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "======================== BASIC INFO ========================\n");
-+	len += scnprintf(buf + len, size - len, "    Band Index: %d, Channel Band: %d\n",
-+			 basic_info->band_idx, basic_info->band);
-+	len += scnprintf(buf + len, size - len, "    PA Type: %s\n",
-+			 basic_info->is_epa ? "ePA" : "iPA");
-+	len += scnprintf(buf + len, size - len, "    LNA Type: %s\n",
-+			 basic_info->is_elna ? "eLNA" : "iLNA");
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "------------------------------------------------------------\n");
-+	len += scnprintf(buf + len, size - len, "    SKU: %s\n",
-+			 basic_info->sku_enable ? "enable" : "disable");
-+	len += scnprintf(buf + len, size - len, "    Percentage Control: %s\n",
-+			 basic_info->percentage_ctrl_enable ? "enable" : "disable");
-+	len += scnprintf(buf + len, size - len, "    Power Drop: %d [dBm]\n",
-+			 basic_info->power_drop_level >> 1);
-+	len += scnprintf(buf + len, size - len, "    Backoff: %s\n",
-+			 basic_info->bf_backoff_enable ? "enable" : "disable");
-+	len += scnprintf(buf + len, size - len, "    TX Front-end Loss:  %d, %d, %d, %d\n",
-+			 basic_info->front_end_loss_tx[0], basic_info->front_end_loss_tx[1],
-+			 basic_info->front_end_loss_tx[2], basic_info->front_end_loss_tx[3]);
-+	len += scnprintf(buf + len, size - len, "    RX Front-end Loss:  %d, %d, %d, %d\n",
-+			 basic_info->front_end_loss_rx[0], basic_info->front_end_loss_rx[1],
-+			 basic_info->front_end_loss_rx[2], basic_info->front_end_loss_rx[3]);
-+	len += scnprintf(buf + len, size - len,
-+			 "    MU TX Power Mode:  %s\n",
-+			 basic_info->mu_tx_power_manual_enable ? "manual" : "auto");
-+	len += scnprintf(buf + len, size - len,
-+			 "    MU TX Power (Auto / Manual): %d / %d [0.5 dBm]\n",
-+			 basic_info->mu_tx_power_auto, basic_info->mu_tx_power_manual);
-+	len += scnprintf(buf + len, size - len,
-+			 "    Thermal Compensation:  %s\n",
-+			 basic_info->thermal_compensate_enable ? "enable" : "disable");
-+	len += scnprintf(buf + len, size - len,
-+			 "    Theraml Compensation Value: %d\n",
-+			 basic_info->thermal_compensate_value);
-+
-+	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-+
-+out:
-+	kfree(buf);
-+	kfree(event);
-+	return ret;
-+}
-+
-+static const struct file_operations mt7996_txpower_info_fops = {
-+	.read = mt7996_get_txpower_info,
-+	.open = simple_open,
-+	.owner = THIS_MODULE,
-+	.llseek = default_llseek,
-+};
-+
-+#define mt7996_txpower_puts(rate)							\
-+({											\
-+	len += scnprintf(buf + len, size - len, "%-21s:", #rate " (TMAC)");		\
-+	for (i = 0; i < mt7996_sku_group_len[SKU_##rate]; i++, offs++)			\
-+		len += scnprintf(buf + len, size - len, " %6d",				\
-+				 event->phy_rate_info.frame_power[offs][band_idx]);	\
-+	len += scnprintf(buf + len, size - len, "\n");					\
-+})
-+
-+static ssize_t
-+mt7996_get_txpower_sku(struct file *file, char __user *user_buf,
-+		       size_t count, loff_t *ppos)
-+{
-+	struct mt7996_phy *phy = file->private_data;
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_mcu_txpower_event *event;
-+	u8 band_idx = phy->mt76->band_idx;
-+	static const size_t size = 5120;
-+	int i, offs = 0, len = 0;
-+	ssize_t ret;
-+	char *buf;
-+	u32 reg;
-+
-+	buf = kzalloc(size, GFP_KERNEL);
-+	event = kzalloc(sizeof(*event), GFP_KERNEL);
-+	if (!buf || !event) {
-+		ret = -ENOMEM;
-+		goto out;
-+	}
-+
-+	ret = mt7996_mcu_get_tx_power_info(phy, PHY_RATE_INFO, event);
-+	if (ret ||
-+	    le32_to_cpu(event->phy_rate_info.category) != UNI_TXPOWER_PHY_RATE_INFO)
-+		goto out;
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "\nPhy %d TX Power Table (Channel %d)\n",
-+			 band_idx, phy->mt76->chandef.chan->hw_value);
-+	len += scnprintf(buf + len, size - len, "%-21s  %6s %6s %6s %6s\n",
-+			 " ", "1m", "2m", "5m", "11m");
-+	mt7996_txpower_puts(CCK);
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s\n",
-+			 " ", "6m", "9m", "12m", "18m", "24m", "36m", "48m",
-+			 "54m");
-+	mt7996_txpower_puts(OFDM);
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s\n",
-+			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4",
-+			 "mcs5", "mcs6", "mcs7");
-+	mt7996_txpower_puts(HT20);
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
-+			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
-+			 "mcs6", "mcs7", "mcs32");
-+	mt7996_txpower_puts(HT40);
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
-+			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
-+			 "mcs6", "mcs7", "mcs8", "mcs9", "mcs10", "mcs11");
-+	mt7996_txpower_puts(VHT20);
-+	mt7996_txpower_puts(VHT40);
-+	mt7996_txpower_puts(VHT80);
-+	mt7996_txpower_puts(VHT160);
-+	mt7996_txpower_puts(HE26);
-+	mt7996_txpower_puts(HE52);
-+	mt7996_txpower_puts(HE106);
-+	mt7996_txpower_puts(HE242);
-+	mt7996_txpower_puts(HE484);
-+	mt7996_txpower_puts(HE996);
-+	mt7996_txpower_puts(HE2x996);
-+
-+	len += scnprintf(buf + len, size - len,
-+			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s ",
-+			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5", "mcs6", "mcs7");
-+	len += scnprintf(buf + len, size - len,
-+			 "%6s %6s %6s %6s %6s %6s %6s %6s\n",
-+			 "mcs8", "mcs9", "mcs10", "mcs11", "mcs12", "mcs13", "mcs14", "mcs15");
-+	mt7996_txpower_puts(EHT26);
-+	mt7996_txpower_puts(EHT52);
-+	mt7996_txpower_puts(EHT106);
-+	mt7996_txpower_puts(EHT242);
-+	mt7996_txpower_puts(EHT484);
-+	mt7996_txpower_puts(EHT996);
-+	mt7996_txpower_puts(EHT2x996);
-+	mt7996_txpower_puts(EHT4x996);
-+	mt7996_txpower_puts(EHT26_52);
-+	mt7996_txpower_puts(EHT26_106);
-+	mt7996_txpower_puts(EHT484_242);
-+	mt7996_txpower_puts(EHT996_484);
-+	mt7996_txpower_puts(EHT996_484_242);
-+	mt7996_txpower_puts(EHT2x996_484);
-+	mt7996_txpower_puts(EHT3x996);
-+	mt7996_txpower_puts(EHT3x996_484);
-+
-+	len += scnprintf(buf + len, size - len, "\nePA Gain: %d\n",
-+			 event->phy_rate_info.epa_gain);
-+	len += scnprintf(buf + len, size - len, "Max Power Bound: %d\n",
-+			 event->phy_rate_info.max_power_bound);
-+	len += scnprintf(buf + len, size - len, "Min Power Bound: %d\n",
-+			 event->phy_rate_info.min_power_bound);
-+
-+	reg = MT_WF_PHYDFE_BAND_TPC_CTRL_STAT0(band_idx);
-+	len += scnprintf(buf + len, size - len,
-+			 "BBP TX Power (target power from TMAC)  : %6ld [0.5 dBm]\n",
-+			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_TMAC));
-+	len += scnprintf(buf + len, size - len,
-+			 "BBP TX Power (target power from RMAC)  : %6ld [0.5 dBm]\n",
-+			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_RMAC));
-+	len += scnprintf(buf + len, size - len,
-+			 "BBP TX Power (TSSI module power input)  : %6ld [0.5 dBm]\n",
-+			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_TSSI));
-+
-+	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-+
-+out:
-+	kfree(buf);
-+	kfree(event);
-+	return ret;
-+}
-+
-+static const struct file_operations mt7996_txpower_sku_fops = {
-+	.read = mt7996_get_txpower_sku,
-+	.open = simple_open,
-+	.owner = THIS_MODULE,
-+	.llseek = default_llseek,
-+};
-+
-+#define mt7996_txpower_path_puts(rate, arr_length)					\
-+({											\
-+	len += scnprintf(buf + len, size - len, "%-23s:", #rate " (TMAC)");		\
-+	for (i = 0; i < arr_length; i++, offs++)					\
-+		len += scnprintf(buf + len, size - len, " %4d",				\
-+				 event->backoff_table_info.frame_power[offs]);		\
-+	len += scnprintf(buf + len, size - len, "\n");					\
-+})
-+
-+static ssize_t
-+mt7996_get_txpower_path(struct file *file, char __user *user_buf,
-+		       size_t count, loff_t *ppos)
-+{
-+	struct mt7996_phy *phy = file->private_data;
-+	struct mt7996_mcu_txpower_event *event;
-+	static const size_t size = 5120;
-+	int i, offs = 0, len = 0;
-+	ssize_t ret;
-+	char *buf;
-+
-+	buf = kzalloc(size, GFP_KERNEL);
-+	event = kzalloc(sizeof(*event), GFP_KERNEL);
-+	if (!buf || !event) {
-+		ret = -ENOMEM;
-+		goto out;
-+	}
-+
-+	ret = mt7996_mcu_get_tx_power_info(phy, BACKOFF_TABLE_INFO, event);
-+	if (ret ||
-+	    le32_to_cpu(event->phy_rate_info.category) != UNI_TXPOWER_BACKOFF_TABLE_SHOW_INFO)
-+		goto out;
-+
-+	len += scnprintf(buf + len, size - len, "\n%*c", 25, ' ');
-+	len += scnprintf(buf + len, size - len, "1T1S/2T1S/3T1S/4T1S/5T1S/2T2S/3T2S/4T2S/5T2S/"
-+			 "3T3S/4T3S/5T3S/4T4S/5T4S/5T5S\n");
-+
-+	mt7996_txpower_path_puts(CCK, 5);
-+	mt7996_txpower_path_puts(OFDM, 5);
-+	mt7996_txpower_path_puts(BF-OFDM, 4);
-+
-+	mt7996_txpower_path_puts(RU26, 15);
-+	mt7996_txpower_path_puts(BF-RU26, 15);
-+	mt7996_txpower_path_puts(RU52, 15);
-+	mt7996_txpower_path_puts(BF-RU52, 15);
-+	mt7996_txpower_path_puts(RU26_52, 15);
-+	mt7996_txpower_path_puts(BF-RU26_52, 15);
-+	mt7996_txpower_path_puts(RU106, 15);
-+	mt7996_txpower_path_puts(BF-RU106, 15);
-+	mt7996_txpower_path_puts(RU106_52, 15);
-+	mt7996_txpower_path_puts(BF-RU106_52, 15);
-+
-+	mt7996_txpower_path_puts(BW20/RU242, 15);
-+	mt7996_txpower_path_puts(BF-BW20/RU242, 15);
-+	mt7996_txpower_path_puts(BW40/RU484, 15);
-+	mt7996_txpower_path_puts(BF-BW40/RU484, 15);
-+	mt7996_txpower_path_puts(RU242_484, 15);
-+	mt7996_txpower_path_puts(BF-RU242_484, 15);
-+	mt7996_txpower_path_puts(BW80/RU996, 15);
-+	mt7996_txpower_path_puts(BF-BW80/RU996, 15);
-+	mt7996_txpower_path_puts(RU484_996, 15);
-+	mt7996_txpower_path_puts(BF-RU484_996, 15);
-+	mt7996_txpower_path_puts(RU242_484_996, 15);
-+	mt7996_txpower_path_puts(BF-RU242_484_996, 15);
-+	mt7996_txpower_path_puts(BW160/RU996x2, 15);
-+	mt7996_txpower_path_puts(BF-BW160/RU996x2, 15);
-+	mt7996_txpower_path_puts(RU484_996x2, 15);
-+	mt7996_txpower_path_puts(BF-RU484_996x2, 15);
-+	mt7996_txpower_path_puts(RU996x3, 15);
-+	mt7996_txpower_path_puts(BF-RU996x3, 15);
-+	mt7996_txpower_path_puts(RU484_996x3, 15);
-+	mt7996_txpower_path_puts(BF-RU484_996x3, 15);
-+	mt7996_txpower_path_puts(BW320/RU996x4, 15);
-+	mt7996_txpower_path_puts(BF-BW320/RU996x4, 15);
-+
-+	len += scnprintf(buf + len, size - len, "\nBackoff table: %s\n",
-+			 event->backoff_table_info.backoff_en ? "enable" : "disable");
-+
-+	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-+
-+out:
-+	kfree(buf);
-+	kfree(event);
-+	return ret;
-+}
-+
-+static const struct file_operations mt7996_txpower_path_fops = {
-+	.read = mt7996_get_txpower_path,
-+	.open = simple_open,
-+	.owner = THIS_MODULE,
-+	.llseek = default_llseek,
-+};
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2480,6 +2802,10 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "tr_info", dir,
- 				    mt7996_trinfo_read);
-+	debugfs_create_file("txpower_level", 0600, dir, phy, &fops_txpower_level);
-+	debugfs_create_file("txpower_info", 0600, dir, phy, &mt7996_txpower_info_fops);
-+	debugfs_create_file("txpower_sku", 0600, dir, phy, &mt7996_txpower_sku_fops);
-+	debugfs_create_file("txpower_path", 0600, dir, phy, &mt7996_txpower_path_fops);
- 
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "wtbl_info", dir,
- 				    mt7996_wtbl_read);
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index c16b25ab..e56ddd8f 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -12,8 +12,31 @@
- 
- #ifdef CONFIG_MTK_DEBUG
- 
-+int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct tx_power_ctrl req = {
-+		.tag = cpu_to_le16(UNI_TXPOWER_SHOW_INFO),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.power_ctrl_id = UNI_TXPOWER_SHOW_INFO,
-+		.show_info_category = category,
-+		.band_idx = phy->mt76->band_idx,
-+	};
-+	struct sk_buff *skb;
-+	int ret;
- 
-+	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
-+					MCU_WM_UNI_CMD_QUERY(TXPOWER),
-+					&req, sizeof(req), true, &skb);
-+	if (ret)
-+		return ret;
- 
-+	memcpy(event, skb->data, sizeof(struct mt7996_mcu_txpower_event));
-+
-+	dev_kfree_skb(skb);
-+
-+	return 0;
-+}
- 
- int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val)
- {
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 7f4d4e02..c30418ca 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -14,6 +14,98 @@ enum {
- 	UNI_CMD_MURU_DBG_INFO = 0x18,
- };
- 
-+struct txpower_basic_info {
-+	u8 category;
-+	u8 rsv1;
-+
-+	/* basic info */
-+	u8 band_idx;
-+	u8 band;
-+
-+	/* board type info */
-+	bool is_epa;
-+	bool is_elna;
-+
-+	/* power percentage info */
-+	bool percentage_ctrl_enable;
-+	s8 power_drop_level;
-+
-+	/* frond-end loss TX info */
-+	s8 front_end_loss_tx[4];
-+
-+	/* frond-end loss RX info */
-+	s8 front_end_loss_rx[4];
-+
-+	/* thermal info */
-+	bool thermal_compensate_enable;
-+	s8 thermal_compensate_value;
-+	u8 rsv2;
-+
-+	/* TX power max/min limit info */
-+	s8 max_power_bound;
-+	s8 min_power_bound;
-+
-+	/* power limit info */
-+	bool sku_enable;
-+	bool bf_backoff_enable;
-+
-+	/* MU TX power info */
-+	bool mu_tx_power_manual_enable;
-+	s8 mu_tx_power_auto;
-+	s8 mu_tx_power_manual;
-+	u8 rsv3;
-+};
-+
-+struct txpower_phy_rate_info {
-+	u8 category;
-+	u8 band_idx;
-+	u8 band;
-+	u8 epa_gain;
-+
-+	/* rate power info [dBm] */
-+	s8 frame_power[MT7996_SKU_RATE_NUM][__MT_MAX_BAND];
-+
-+	/* TX power max/min limit info */
-+	s8 max_power_bound;
-+	s8 min_power_bound;
-+	u8 rsv1;
-+};
-+
-+struct txpower_backoff_table_info {
-+	u8 category;
-+	u8 band_idx;
-+	u8 band;
-+	u8 backoff_en;
-+
-+	s8 frame_power[MT7996_SKU_PATH_NUM];
-+	u8 rsv[3];
-+};
-+
-+struct mt7996_mcu_txpower_event {
-+	u8 _rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+
-+	union {
-+		struct txpower_basic_info basic_info;
-+		struct txpower_phy_rate_info phy_rate_info;
-+		struct txpower_backoff_table_info backoff_table_info;
-+	};
-+};
-+
-+enum txpower_category {
-+	BASIC_INFO,
-+	BACKOFF_TABLE_INFO,
-+	PHY_RATE_INFO,
-+};
-+
-+enum txpower_event {
-+	UNI_TXPOWER_BASIC_INFO = 0,
-+	UNI_TXPOWER_BACKOFF_TABLE_SHOW_INFO = 3,
-+	UNI_TXPOWER_PHY_RATE_INFO = 5,
-+};
-+
- #endif
- 
- #endif
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 4c20a67d..e94f9a90 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -693,24 +693,31 @@ enum offs_rev {
- 						 ((_wf) << 16) + (ofs))
- #define MT_WF_PHYRX_CSD_IRPI(_band, _wf)	MT_WF_PHYRX_CSD(_band, _wf, 0x1000)
- 
--/* PHYRX CTRL */
--#define MT_WF_PHYRX_BAND_BASE			0x83080000
--#define MT_WF_PHYRX_BAND(_band, ofs)		(MT_WF_PHYRX_BAND_BASE + \
-+/* PHY CTRL */
-+#define MT_WF_PHY_BAND_BASE			0x83080000
-+#define MT_WF_PHY_BAND(_band, ofs)		(MT_WF_PHY_BAND_BASE + \
- 						 ((_band) << 20) + (ofs))
- 
--#define MT_WF_PHYRX_BAND_GID_TAB_VLD0(_band)	MT_WF_PHYRX_BAND(_band, 0x1054)
--#define MT_WF_PHYRX_BAND_GID_TAB_VLD1(_band)	MT_WF_PHYRX_BAND(_band, 0x1058)
--#define MT_WF_PHYRX_BAND_GID_TAB_POS0(_band)	MT_WF_PHYRX_BAND(_band, 0x105c)
--#define MT_WF_PHYRX_BAND_GID_TAB_POS1(_band)	MT_WF_PHYRX_BAND(_band, 0x1060)
--#define MT_WF_PHYRX_BAND_GID_TAB_POS2(_band)	MT_WF_PHYRX_BAND(_band, 0x1064)
--#define MT_WF_PHYRX_BAND_GID_TAB_POS3(_band)	MT_WF_PHYRX_BAND(_band, 0x1068)
-+#define MT_WF_PHYRX_BAND_GID_TAB_VLD0(_band)	MT_WF_PHY_BAND(_band, 0x1054)
-+#define MT_WF_PHYRX_BAND_GID_TAB_VLD1(_band)	MT_WF_PHY_BAND(_band, 0x1058)
-+#define MT_WF_PHYRX_BAND_GID_TAB_POS0(_band)	MT_WF_PHY_BAND(_band, 0x105c)
-+#define MT_WF_PHYRX_BAND_GID_TAB_POS1(_band)	MT_WF_PHY_BAND(_band, 0x1060)
-+#define MT_WF_PHYRX_BAND_GID_TAB_POS2(_band)	MT_WF_PHY_BAND(_band, 0x1064)
-+#define MT_WF_PHYRX_BAND_GID_TAB_POS3(_band)	MT_WF_PHY_BAND(_band, 0x1068)
- 
--#define MT_WF_PHYRX_BAND_RX_CTRL1(_band)	MT_WF_PHYRX_BAND(_band, 0x2004)
-+/* PHYRX CTRL */
-+#define MT_WF_PHYRX_BAND_RX_CTRL1(_band)	MT_WF_PHY_BAND(_band, 0x2004)
- #define MT_WF_PHYRX_BAND_RX_CTRL1_IPI_EN	GENMASK(2, 0)
- #define MT_WF_PHYRX_BAND_RX_CTRL1_STSCNT_EN	GENMASK(11, 9)
- 
-+/* PHYDFE CTRL */
-+#define MT_WF_PHYDFE_BAND_TPC_CTRL_STAT0(_phy)	MT_WF_PHY_BAND(_phy, 0xe7a0)
-+#define MT_WF_PHY_TPC_POWER_TMAC		GENMASK(15, 8)
-+#define MT_WF_PHY_TPC_POWER_RMAC		GENMASK(23, 16)
-+#define MT_WF_PHY_TPC_POWER_TSSI		GENMASK(31, 24)
-+
- /* PHYRX CSD BAND */
--#define MT_WF_PHYRX_CSD_BAND_RXTD12(_band)		MT_WF_PHYRX_BAND(_band, 0x8230)
-+#define MT_WF_PHYRX_CSD_BAND_RXTD12(_band)		MT_WF_PHY_BAND(_band, 0x8230)
- #define MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR_ONLY	BIT(18)
- #define MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR		BIT(29)
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1008-mtk-wifi-mt76-mt7996-add-single-sku.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1008-mtk-wifi-mt76-mt7996-add-single-sku.patch
deleted file mode 100644
index 9099d48..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1008-mtk-wifi-mt76-mt7996-add-single-sku.patch
+++ /dev/null
@@ -1,277 +0,0 @@
-From 28aa63ac8f3468494eb58e6dfb424dc3507a3396 Mon Sep 17 00:00:00 2001
-From: "Allen.Ye" <allen.ye@mediatek.com>
-Date: Mon, 10 Jul 2023 19:56:16 +0800
-Subject: [PATCH 1008/1044] mtk: wifi: mt76: mt7996: add single sku
-
-Add single sku and default enable sku.
-
-Signed-off-by: Allen.Ye <allen.ye@mediatek.com>
----
- eeprom.c          | 50 ++++++++++++++++++++++++++++++++++++++++++-----
- mt76.h            |  9 +++++++++
- mt76_connac_mcu.c |  2 +-
- mt7996/init.c     |  2 ++
- mt7996/main.c     |  9 +++++++++
- mt7996/mcu.c      | 41 ++++++++++++++++++++++++++++++++++----
- mt7996/mt7996.h   |  1 +
- 7 files changed, 104 insertions(+), 10 deletions(-)
-
-diff --git a/eeprom.c b/eeprom.c
-index 85bd2a29..c5be2843 100644
---- a/eeprom.c
-+++ b/eeprom.c
-@@ -341,6 +341,7 @@ mt76_apply_multi_array_limit(s8 *pwr, size_t pwr_len, s8 pwr_num,
- s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 			      struct ieee80211_channel *chan,
- 			      struct mt76_power_limits *dest,
-+			      struct mt76_power_path_limits *dest_path,
- 			      s8 target_power)
- {
- 	struct mt76_dev *dev = phy->dev;
-@@ -348,16 +349,20 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 	const __be32 *val;
- 	char name[16];
- 	u32 mcs_rates = dev->drv->mcs_rates;
--	u32 ru_rates = ARRAY_SIZE(dest->ru[0]);
- 	char band;
- 	size_t len;
--	s8 max_power = 0;
-+	s8 max_power = -127;
-+	s8 max_power_backoff = -127;
- 	s8 txs_delta;
-+	int n_chains = hweight16(phy->chainmask);
-+	s8 target_power_combine = target_power + mt76_tx_power_nss_delta(n_chains);
- 
- 	if (!mcs_rates)
--		mcs_rates = 10;
-+		mcs_rates = 12;
- 
- 	memset(dest, target_power, sizeof(*dest));
-+	if (dest_path != NULL)
-+		memset(dest_path, 0, sizeof(*dest_path));
- 
- 	if (!IS_ENABLED(CONFIG_OF))
- 		return target_power;
-@@ -405,12 +410,47 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 				     ARRAY_SIZE(dest->mcs), val, len,
- 				     target_power, txs_delta, &max_power);
- 
--	val = mt76_get_of_array(np, "rates-ru", &len, ru_rates + 1);
-+	val = mt76_get_of_array(np, "rates-ru", &len, ARRAY_SIZE(dest->ru[0]) + 1);
- 	mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]),
- 				     ARRAY_SIZE(dest->ru), val, len,
- 				     target_power, txs_delta, &max_power);
- 
--	return max_power;
-+	val = mt76_get_of_array(np, "rates-eht", &len, ARRAY_SIZE(dest->eht[0]) + 1);
-+	mt76_apply_multi_array_limit(dest->eht[0], ARRAY_SIZE(dest->eht[0]),
-+				     ARRAY_SIZE(dest->eht), val, len,
-+				     target_power, txs_delta, &max_power);
-+
-+	if (dest_path == NULL)
-+		return max_power;
-+
-+	max_power_backoff = max_power;
-+
-+	val = mt76_get_of_array(np, "paths-cck", &len, ARRAY_SIZE(dest_path->cck));
-+	mt76_apply_array_limit(dest_path->cck, ARRAY_SIZE(dest_path->cck), val,
-+			       target_power_combine, txs_delta, &max_power_backoff);
-+
-+	val = mt76_get_of_array(np, "paths-ofdm", &len, ARRAY_SIZE(dest_path->ofdm));
-+	mt76_apply_array_limit(dest_path->ofdm, ARRAY_SIZE(dest_path->ofdm), val,
-+			       target_power_combine, txs_delta, &max_power_backoff);
-+
-+	val = mt76_get_of_array(np, "paths-ofdm-bf", &len, ARRAY_SIZE(dest_path->ofdm_bf));
-+	mt76_apply_array_limit(dest_path->ofdm_bf, ARRAY_SIZE(dest_path->ofdm_bf), val,
-+			       target_power_combine, txs_delta, &max_power_backoff);
-+
-+	val = mt76_get_of_array(np, "paths-ru", &len, ARRAY_SIZE(dest_path->ru[0]) + 1);
-+	mt76_apply_multi_array_limit(dest_path->ru[0], ARRAY_SIZE(dest_path->ru[0]),
-+				     ARRAY_SIZE(dest_path->ru), val, len,
-+				     target_power_combine, txs_delta, &max_power_backoff);
-+
-+	val = mt76_get_of_array(np, "paths-ru-bf", &len, ARRAY_SIZE(dest_path->ru_bf[0]) + 1);
-+	mt76_apply_multi_array_limit(dest_path->ru_bf[0], ARRAY_SIZE(dest_path->ru_bf[0]),
-+				     ARRAY_SIZE(dest_path->ru_bf), val, len,
-+				     target_power_combine, txs_delta, &max_power_backoff);
-+
-+	if (max_power_backoff == target_power_combine)
-+		return max_power;
-+
-+	return max_power_backoff;
- }
- EXPORT_SYMBOL_GPL(mt76_get_rate_power_limits);
- 
-diff --git a/mt76.h b/mt76.h
-index 14c5fcb1..630b3903 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -1054,6 +1054,14 @@ struct mt76_power_limits {
- 	s8 eht[16][16];
- };
- 
-+struct mt76_power_path_limits {
-+	s8 cck[5];
-+	s8 ofdm[5];
-+	s8 ofdm_bf[4];
-+	s8 ru[16][15];
-+	s8 ru_bf[16][15];
-+};
-+
- struct mt76_ethtool_worker_info {
- 	u64 *data;
- 	int idx;
-@@ -1664,6 +1672,7 @@ mt76_find_channel_node(struct device_node *np, struct ieee80211_channel *chan);
- s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 			      struct ieee80211_channel *chan,
- 			      struct mt76_power_limits *dest,
-+			      struct mt76_power_path_limits *dest_path,
- 			      s8 target_power);
- 
- static inline bool mt76_queue_is_wed_tx_free(struct mt76_queue *q)
-diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
-index 42f12672..75bbb7cc 100644
---- a/mt76_connac_mcu.c
-+++ b/mt76_connac_mcu.c
-@@ -2150,7 +2150,7 @@ mt76_connac_mcu_rate_txpower_band(struct mt76_phy *phy,
- 			sar_power = mt76_get_sar_power(phy, &chan, reg_power);
- 
- 			mt76_get_rate_power_limits(phy, &chan, limits,
--						   sar_power);
-+						   NULL, sar_power);
- 
- 			tx_power_tlv.last_msg = ch_list[idx] == last_ch;
- 			sku_tlbv.channel = ch_list[idx];
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 23a9b88b..5f937b26 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -295,6 +295,7 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
- 	int nss_delta = mt76_tx_power_nss_delta(nss);
- 	int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band);
- 	struct mt76_power_limits limits;
-+	struct mt76_power_path_limits limits_path;
- 
- 	for (i = 0; i < sband->n_channels; i++) {
- 		struct ieee80211_channel *chan = &sband->channels[i];
-@@ -303,6 +304,7 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
- 		target_power += pwr_delta;
- 		target_power = mt76_get_rate_power_limits(phy->mt76, chan,
- 							  &limits,
-+							  &limits_path,
- 							  target_power);
- 		target_power += nss_delta;
- 		target_power = DIV_ROUND_UP(target_power, 2);
-diff --git a/mt7996/main.c b/mt7996/main.c
-index ffb1f81b..ecfc3dcf 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -77,6 +77,15 @@ int mt7996_run(struct ieee80211_hw *hw)
- 	if (ret)
- 		goto out;
- 
-+#ifdef CONFIG_MTK_DEBUG
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL,
-+					   !dev->dbg.sku_disable);
-+#else
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL, true);
-+#endif
-+	if (ret)
-+		goto out;
-+
- 	set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
- 
- 	ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 62452d6e..e103601f 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -4496,6 +4496,7 @@ int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id)
- int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- {
- #define TX_POWER_LIMIT_TABLE_RATE	0
-+#define TX_POWER_LIMIT_TABLE_PATH	1
- 	struct mt7996_dev *dev = phy->dev;
- 	struct mt76_phy *mphy = phy->mt76;
- 	struct ieee80211_hw *hw = mphy->hw;
-@@ -4509,22 +4510,23 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- 		u8 band_idx;
- 	} __packed req = {
- 		.tag = cpu_to_le16(UNI_TXPOWER_POWER_LIMIT_TABLE_CTRL),
--		.len = cpu_to_le16(sizeof(req) + MT7996_SKU_RATE_NUM - 4),
-+		.len = cpu_to_le16(sizeof(req) + MT7996_SKU_PATH_NUM - 4),
- 		.power_ctrl_id = UNI_TXPOWER_POWER_LIMIT_TABLE_CTRL,
- 		.power_limit_type = TX_POWER_LIMIT_TABLE_RATE,
- 		.band_idx = phy->mt76->band_idx,
- 	};
- 	struct mt76_power_limits la = {};
-+	struct mt76_power_path_limits la_path = {};
- 	struct sk_buff *skb;
--	int i, tx_power;
-+	int i, ret, tx_power;
- 
- 	tx_power = mt7996_get_power_bound(phy, hw->conf.power_level);
- 	tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
--					      &la, tx_power);
-+					      &la, &la_path, tx_power);
- 	mphy->txpower_cur = tx_power;
- 
- 	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
--				 sizeof(req) + MT7996_SKU_RATE_NUM);
-+				 sizeof(req) + MT7996_SKU_PATH_NUM);
- 	if (!skb)
- 		return -ENOMEM;
- 
-@@ -4548,6 +4550,37 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- 	/* eht */
- 	skb_put_data(skb, &la.eht[0], sizeof(la.eht));
- 
-+	/* padding */
-+	skb_put_zero(skb, MT7996_SKU_PATH_NUM - MT7996_SKU_RATE_NUM);
-+
-+	ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
-+				    MCU_WM_UNI_CMD(TXPOWER), true);
-+	if (ret)
-+		return ret;
-+
-+	/* only set per-path power table when it's configured */
-+	if (!la_path.ofdm[0])
-+		return 0;
-+
-+	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-+				 sizeof(req) + MT7996_SKU_PATH_NUM);
-+	if (!skb)
-+		return -ENOMEM;
-+	req.power_limit_type = TX_POWER_LIMIT_TABLE_PATH;
-+
-+	skb_put_data(skb, &req, sizeof(req));
-+	skb_put_data(skb, &la_path.cck, sizeof(la_path.cck));
-+	skb_put_data(skb, &la_path.ofdm, sizeof(la_path.ofdm));
-+	skb_put_data(skb, &la_path.ofdm_bf, sizeof(la_path.ofdm_bf));
-+
-+	for (i = 0; i < 32; i++) {
-+		bool bf = i % 2;
-+		u8 idx = i / 2;
-+		s8 *buf = bf ? la_path.ru_bf[idx] : la_path.ru[idx];
-+
-+		skb_put_data(skb, buf, sizeof(la_path.ru[0]));
-+	}
-+
- 	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
- 				     MCU_WM_UNI_CMD(TXPOWER), true);
- }
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 18a6a46d..7e3d381e 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -71,6 +71,7 @@
- #define MT7996_CFEND_RATE_11B		0x03	/* 11B LP, 11M */
- 
- #define MT7996_SKU_RATE_NUM		417
-+#define MT7996_SKU_PATH_NUM		494
- 
- #define MT7996_MAX_TWT_AGRT		16
- #define MT7996_MAX_STA_TWT_AGRT		8
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1009-mtk-wifi-mt76-mt7996-add-binfile-mode-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1009-mtk-wifi-mt76-mt7996-add-binfile-mode-support.patch
deleted file mode 100644
index 59222a4..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1009-mtk-wifi-mt76-mt7996-add-binfile-mode-support.patch
+++ /dev/null
@@ -1,366 +0,0 @@
-From c342da92eba77fea4b62298df80f6b3614c0635f Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 31 Mar 2023 11:36:34 +0800
-Subject: [PATCH 1009/1044] mtk: wifi: mt76: mt7996: add binfile mode support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Fix binfile cannot sync precal data to atenl
-Binfile is viewed as efuse mode in atenl, so atenl does not allocate
-precal memory for its eeprom file
-Use mtd offset == 0xFFFFFFFF to determine whether it is binfile or flash mode
-Add support for loading precal in binfile mode
-
-Align upstream
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- eeprom.c             |  25 +++++++++++
- mt76.h               |   3 ++
- mt7996/eeprom.c      | 103 ++++++++++++++++++++++++++++++++++++++++---
- mt7996/eeprom.h      |   7 +++
- mt7996/mt7996.h      |   4 ++
- mt7996/mtk_debugfs.c |  41 +++++++++++++++++
- testmode.h           |   2 +-
- 7 files changed, 179 insertions(+), 6 deletions(-)
-
-diff --git a/eeprom.c b/eeprom.c
-index c5be2843..adb87924 100644
---- a/eeprom.c
-+++ b/eeprom.c
-@@ -161,6 +161,31 @@ static int mt76_get_of_eeprom(struct mt76_dev *dev, void *eep, int len)
- 	return mt76_get_of_data_from_nvmem(dev, eep, "eeprom", len);
- }
- 
-+bool mt76_check_bin_file_mode(struct mt76_dev *dev)
-+{
-+	struct device_node *np = dev->dev->of_node;
-+	const char *bin_file_name = NULL;
-+
-+	if (!np)
-+		return false;
-+
-+	of_property_read_string(np, "bin_file_name", &bin_file_name);
-+
-+	dev->bin_file_name = bin_file_name;
-+	if (dev->bin_file_name) {
-+		dev_info(dev->dev, "Using bin file %s\n", dev->bin_file_name);
-+#ifdef CONFIG_NL80211_TESTMODE
-+		dev->test_mtd.name = devm_kstrdup(dev->dev, bin_file_name, GFP_KERNEL);
-+		dev->test_mtd.offset = -1;
-+#endif
-+	}
-+
-+	of_node_put(np);
-+
-+	return dev->bin_file_name ? true : false;
-+}
-+EXPORT_SYMBOL_GPL(mt76_check_bin_file_mode);
-+
- void
- mt76_eeprom_override(struct mt76_phy *phy)
- {
-diff --git a/mt76.h b/mt76.h
-index 630b3903..b2cc1085 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -949,6 +949,8 @@ struct mt76_dev {
- 		struct mt76_usb usb;
- 		struct mt76_sdio sdio;
- 	};
-+
-+	const char *bin_file_name;
- };
- 
- /* per-phy stats.  */
-@@ -1220,6 +1222,7 @@ void mt76_eeprom_override(struct mt76_phy *phy);
- int mt76_get_of_data_from_mtd(struct mt76_dev *dev, void *eep, int offset, int len);
- int mt76_get_of_data_from_nvmem(struct mt76_dev *dev, void *eep,
- 				const char *cell_name, int len);
-+bool mt76_check_bin_file_mode(struct mt76_dev *dev);
- 
- struct mt76_queue *
- mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index acc33cfe..c334f849 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -82,10 +82,17 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev)
- 	}
- }
- 
--static char *mt7996_eeprom_name(struct mt7996_dev *dev)
-+const char *mt7996_eeprom_name(struct mt7996_dev *dev)
- {
--	if (dev->testmode_enable)
--		return MT7996_EEPROM_DEFAULT_TM;
-+	if (dev->bin_file_mode)
-+		return dev->mt76.bin_file_name;
-+
-+	if (dev->testmode_enable) {
-+		if (is_mt7992(&dev->mt76))
-+			return MT7992_EEPROM_DEFAULT_TM;
-+		else
-+			return MT7996_EEPROM_DEFAULT_TM;
-+	}
- 
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
-@@ -152,7 +159,10 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
- 		return ret;
- 
- 	if (!fw || !fw->data) {
--		dev_err(dev->mt76.dev, "Invalid default bin\n");
-+		if (dev->bin_file_mode)
-+			dev_err(dev->mt76.dev, "Invalid bin (bin file mode)\n");
-+		else
-+			dev_err(dev->mt76.dev, "Invalid default bin\n");
- 		ret = -EINVAL;
- 		goto out;
- 	}
-@@ -166,18 +176,45 @@ out:
- 	return ret;
- }
- 
-+static int mt7996_eeprom_load_flash(struct mt7996_dev *dev)
-+{
-+	int ret = 1;
-+
-+	/* return > 0 for load success, return 0 for load failed, return < 0 for non memory */
-+	dev->bin_file_mode = mt76_check_bin_file_mode(&dev->mt76);
-+	if (dev->bin_file_mode) {
-+		dev->mt76.eeprom.size = MT7996_EEPROM_SIZE;
-+		dev->mt76.eeprom.data = devm_kzalloc(dev->mt76.dev, dev->mt76.eeprom.size,
-+						     GFP_KERNEL);
-+		if (!dev->mt76.eeprom.data)
-+			return -ENOMEM;
-+
-+		if (mt7996_eeprom_load_default(dev))
-+			return 0;
-+
-+		if (mt7996_check_eeprom(dev))
-+			return 0;
-+	} else {
-+		ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
-+	}
-+
-+	return ret;
-+}
-+
- int mt7996_eeprom_check_fw_mode(struct mt7996_dev *dev)
- {
- 	u8 *eeprom;
- 	int ret;
- 
- 	/* load eeprom in flash or bin file mode to determine fw mode */
--	ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
-+	ret = mt7996_eeprom_load_flash(dev);
-+
- 	if (ret < 0)
- 		return ret;
- 
- 	if (ret) {
- 		dev->flash_mode = true;
-+		dev->eeprom_mode = dev->bin_file_mode ? BIN_FILE_MODE : FLASH_MODE;
- 		eeprom = dev->mt76.eeprom.data;
- 		/* testmode enable priority: eeprom field > module parameter */
- 		dev->testmode_enable = !mt7996_check_eeprom(dev) ? eeprom[MT_EE_TESTMODE_EN] :
-@@ -211,6 +248,7 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
- 			if (ret < 0)
- 				return ret;
- 		}
-+		dev->eeprom_mode = EFUSE_MODE;
- 	}
- 
- 	return mt7996_check_eeprom(dev);
-@@ -337,6 +375,59 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
- 	return mt7996_eeprom_parse_band_config(phy);
- }
- 
-+static int
-+mt7996_eeprom_load_precal_binfile(struct mt7996_dev *dev, u32 offs, u32 size)
-+{
-+	const struct firmware *fw = NULL;
-+	int ret;
-+
-+	ret = request_firmware(&fw, dev->mt76.bin_file_name, dev->mt76.dev);
-+	if (ret)
-+		return ret;
-+
-+	if (!fw || !fw->data) {
-+		dev_err(dev->mt76.dev, "Invalid bin (bin file mode), load precal fail\n");
-+		ret = -EINVAL;
-+		goto out;
-+	}
-+
-+	memcpy(dev->cal, fw->data + offs, size);
-+
-+out:
-+	release_firmware(fw);
-+
-+	return ret;
-+}
-+
-+static int mt7996_eeprom_load_precal(struct mt7996_dev *dev)
-+{
-+	struct mt76_dev *mdev = &dev->mt76;
-+	u8 *eeprom = mdev->eeprom.data;
-+	u32 offs = MT_EE_DO_PRE_CAL;
-+	u32 size, val = eeprom[offs];
-+	int ret;
-+
-+	mt7996_eeprom_init_precal(dev);
-+
-+	if (!dev->flash_mode || !val)
-+		return 0;
-+
-+	size = MT_EE_CAL_GROUP_SIZE + MT_EE_CAL_DPD_SIZE;
-+
-+	dev->cal = devm_kzalloc(mdev->dev, size, GFP_KERNEL);
-+	if (!dev->cal)
-+		return -ENOMEM;
-+
-+	if (dev->bin_file_mode)
-+		return mt7996_eeprom_load_precal_binfile(dev, MT_EE_PRECAL, size);
-+
-+	ret = mt76_get_of_data_from_mtd(mdev, dev->cal, offs, size);
-+	if (!ret)
-+		return ret;
-+
-+	return mt76_get_of_data_from_nvmem(mdev, dev->cal, "precal", size);
-+}
-+
- int mt7996_eeprom_init(struct mt7996_dev *dev)
- {
- 	int ret;
-@@ -351,6 +442,8 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
- 			return ret;
- 
- 		dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n");
-+		dev->bin_file_mode = false;
-+		dev->eeprom_mode = DEFAULT_BIN_MODE;
- 		ret = mt7996_eeprom_load_default(dev);
- 		if (ret)
- 			return ret;
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 23d4929d..8b555aeb 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -100,6 +100,13 @@ enum mt7996_eeprom_band {
- 	MT_EE_BAND_SEL_6GHZ,
- };
- 
-+enum mt7915_eeprom_mode {
-+	DEFAULT_BIN_MODE,
-+	EFUSE_MODE,
-+	FLASH_MODE,
-+	BIN_FILE_MODE,
-+};
-+
- static inline int
- mt7996_get_channel_group_5g(int channel)
- {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 7e3d381e..2f067988 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -62,6 +62,7 @@
- #define MT7992_EEPROM_DEFAULT_24	"mediatek/mt7996/mt7992_eeprom_24_2i5i.bin"
- #define MT7992_EEPROM_DEFAULT_23	"mediatek/mt7996/mt7992_eeprom_23_2i5i.bin"
- #define MT7992_EEPROM_DEFAULT_23_EXT	"mediatek/mt7996/mt7992_eeprom_23_2e5e.bin"
-+#define MT7992_EEPROM_DEFAULT_TM	"mediatek/mt7996/mt7992_eeprom_tm.bin"
- #define MT7996_EEPROM_SIZE		7680
- #define MT7996_EEPROM_BLOCK_SIZE	16
- #define MT7996_TOKEN_SIZE		16384
-@@ -389,6 +390,8 @@ struct mt7996_dev {
- 	} wed_rro;
- 
- 	bool testmode_enable;
-+	bool bin_file_mode;
-+	u8 eeprom_mode;
- 
- 	bool ibf;
- 	u8 fw_debug_wm;
-@@ -516,6 +519,7 @@ irqreturn_t mt7996_irq_handler(int irq, void *dev_instance);
- u64 __mt7996_get_tsf(struct ieee80211_hw *hw, struct mt7996_vif *mvif);
- int mt7996_register_device(struct mt7996_dev *dev);
- void mt7996_unregister_device(struct mt7996_dev *dev);
-+const char *mt7996_eeprom_name(struct mt7996_dev *dev);
- int mt7996_eeprom_init(struct mt7996_dev *dev);
- int mt7996_eeprom_check_fw_mode(struct mt7996_dev *dev);
- int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index c47d65c9..09652ef5 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2739,6 +2739,44 @@ static const struct file_operations mt7996_txpower_path_fops = {
- 	.llseek = default_llseek,
- };
- 
-+static int mt7996_show_eeprom_mode(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	struct mt76_dev *mdev = &dev->mt76;
-+#ifdef CONFIG_NL80211_TESTMODE
-+	const char *mtd_name = mdev->test_mtd.name;
-+	u32 mtd_offset = mdev->test_mtd.offset;
-+#else
-+	const char *mtd_name = NULL;
-+	u32 mtd_offset;
-+#endif
-+
-+	seq_printf(s, "Current eeprom mode:\n");
-+
-+	switch (dev->eeprom_mode) {
-+	case DEFAULT_BIN_MODE:
-+		seq_printf(s, "   default bin mode\n   filename = %s\n", mt7996_eeprom_name(dev));
-+		break;
-+	case EFUSE_MODE:
-+		seq_printf(s, "   efuse mode\n");
-+		break;
-+	case FLASH_MODE:
-+		if (mtd_name)
-+			seq_printf(s, "   flash mode\n   mtd name = %s\n   flash offset = 0x%x\n",
-+				   mtd_name, mtd_offset);
-+		else
-+			seq_printf(s, "   flash mode\n");
-+		break;
-+	case BIN_FILE_MODE:
-+		seq_printf(s, "   bin file mode\n   filename = %s\n", mt7996_eeprom_name(dev));
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	return 0;
-+}
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2807,6 +2845,9 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	debugfs_create_file("txpower_sku", 0600, dir, phy, &mt7996_txpower_sku_fops);
- 	debugfs_create_file("txpower_path", 0600, dir, phy, &mt7996_txpower_path_fops);
- 
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "eeprom_mode", dir,
-+				    mt7996_show_eeprom_mode);
-+
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "wtbl_info", dir,
- 				    mt7996_wtbl_read);
- 
-diff --git a/testmode.h b/testmode.h
-index d6601cdc..5d677f8c 100644
---- a/testmode.h
-+++ b/testmode.h
-@@ -16,7 +16,7 @@
-  * @MT76_TM_ATTR_RESET: reset parameters to default (flag)
-  * @MT76_TM_ATTR_STATE: test state (u32), see &enum mt76_testmode_state
-  *
-- * @MT76_TM_ATTR_MTD_PART: mtd partition used for eeprom data (string)
-+ * @MT76_TM_ATTR_MTD_PART: mtd partition or binfile used for eeprom data (string)
-  * @MT76_TM_ATTR_MTD_OFFSET: offset of eeprom data within the partition (u32)
-  * @MT76_TM_ATTR_BAND_IDX: band idx of the chip (u8)
-  *
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1010-mtk-wifi-mt76-mt7996-add-normal-mode-pre-calibration.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1010-mtk-wifi-mt76-mt7996-add-normal-mode-pre-calibration.patch
deleted file mode 100644
index 1ca02bf..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1010-mtk-wifi-mt76-mt7996-add-normal-mode-pre-calibration.patch
+++ /dev/null
@@ -1,285 +0,0 @@
-From e72fe68d4a6356a2fae17c21971c1fd5a5d9384d Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Wed, 1 Mar 2023 12:12:51 +0800
-Subject: [PATCH 1010/1044] mtk: wifi: mt76: mt7996: add normal mode
- pre-calibration support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt76_connac_mcu.h |   1 +
- mt7996/eeprom.c   |   4 ++
- mt7996/eeprom.h   |   2 +
- mt7996/init.c     |   6 ++
- mt7996/main.c     |   6 ++
- mt7996/mcu.c      | 166 ++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mt7996.h   |   3 +
- 7 files changed, 188 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 4a3ea0b7..3c82c05d 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1277,6 +1277,7 @@ enum {
- 	MCU_UNI_CMD_PP = 0x38,
- 	MCU_UNI_CMD_FIXED_RATE_TABLE = 0x40,
- 	MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
-+	MCU_UNI_CMD_PRECAL_RESULT = 0x47,
- 	MCU_UNI_CMD_RRO = 0x57,
- 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
- 	MCU_UNI_CMD_PER_STA_INFO = 0x6d,
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index c334f849..d93b1558 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -449,6 +449,10 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
- 			return ret;
- 	}
- 
-+	ret = mt7996_eeprom_load_precal(dev);
-+	if (ret)
-+		return ret;
-+
- 	ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy);
- 	if (ret < 0)
- 		return ret;
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 8b555aeb..8f0f87b6 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -25,6 +25,8 @@ enum mt7996_eeprom_field {
- 	MT_EE_TX0_POWER_6G =	0x1310,
- 
- 	__MT_EE_MAX =	0x1dff,
-+	/* 0x1e10 ~ 0x2d644 used to save group cal data */
-+	MT_EE_PRECAL =		0x1e10,
- };
- 
- #define MT_EE_WIFI_CONF0_TX_PATH		GENMASK(2, 0)
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 5f937b26..c135da9c 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -984,6 +984,12 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
- 	if (ret < 0)
- 		return ret;
- 
-+	if (dev->flash_mode) {
-+		ret = mt7996_mcu_apply_group_cal(dev);
-+		if (ret)
-+			return ret;
-+	}
-+
- 	/* Beacon and mgmt frames should occupy wcid 0 */
- 	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA);
- 	if (idx)
-diff --git a/mt7996/main.c b/mt7996/main.c
-index ecfc3dcf..07a14917 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -321,6 +321,12 @@ int mt7996_set_channel(struct mt7996_phy *phy)
- 
- 	mt76_set_channel(phy->mt76);
- 
-+	if (dev->flash_mode) {
-+		ret = mt7996_mcu_apply_tx_dpd(phy);
-+		if (ret)
-+			goto out;
-+	}
-+
- 	if (mt76_testmode_enabled(phy->mt76) || phy->mt76->test.bf_en) {
- 		mt7996_tm_update_channel(phy);
- 		goto out;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index e103601f..0ee17ff9 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3629,6 +3629,172 @@ int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num)
- 	return 0;
- }
- 
-+static int mt7996_mcu_set_pre_cal(struct mt7996_dev *dev, u32 idx,
-+				  u8 *cal, u32 len, u32 cal_id)
-+{
-+#define PRECAL_CMD_PRE_CAL_RESULT	0x0
-+	struct {
-+		/* fixed field */
-+		u8 action;
-+		u8 dest;
-+		u8 attribute;
-+		u8 tag_num;
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le32 cal_id;
-+		s8 precal;
-+		u8 band;
-+		u8 rsv[2];
-+		__le32 idx;
-+		__le32 cal_len;
-+	} req = {
-+		.tag = cpu_to_le16(PRECAL_CMD_PRE_CAL_RESULT),
-+		.len = cpu_to_le16(sizeof(req) - 4 + len),
-+		.cal_id = cpu_to_le32(cal_id),
-+		.idx = cpu_to_le32(idx),
-+		.cal_len = cpu_to_le32(len),
-+	};
-+	struct sk_buff *skb;
-+
-+	if (!len)
-+		return 0;
-+
-+	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
-+	if (!skb)
-+		return -ENOMEM;
-+
-+	skb_put_data(skb, &req, sizeof(req));
-+	skb_put_data(skb, cal, len);
-+
-+	return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_WM_UNI_CMD(PRECAL_RESULT), false);
-+}
-+
-+int mt7996_mcu_apply_group_cal(struct mt7996_dev *dev)
-+{
-+	u8 *cal = dev->cal, *eeprom = dev->mt76.eeprom.data;
-+	u32 idx = 0, total_idx = MT_EE_CAL_GROUP_SIZE / MT_EE_CAL_UNIT;
-+	u32 offs = MT_EE_DO_PRE_CAL;
-+	int ret = 0;
-+
-+	if (!(eeprom[offs] & MT_EE_WIFI_CAL_GROUP))
-+		return 0;
-+
-+	for (idx = 0; idx < total_idx; idx++, cal += MT_EE_CAL_UNIT) {
-+		ret = mt7996_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT, RF_PRE_CAL);
-+		if (ret)
-+			goto out;
-+	}
-+
-+	ret = mt7996_mcu_set_pre_cal(dev, total_idx, cal,
-+				     MT_EE_CAL_GROUP_SIZE % MT_EE_CAL_UNIT, RF_PRE_CAL);
-+
-+out:
-+	return ret;
-+}
-+
-+int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_phy *mphy = phy->mt76;
-+	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
-+	enum nl80211_band band = chandef->chan->band;
-+	enum nl80211_chan_width bw = chandef->width;
-+	const struct ieee80211_channel *chan_list;
-+	u32 cal_id, chan_list_size, base_offset = 0, offs = MT_EE_DO_PRE_CAL;
-+	u32 dpd_size_2g, dpd_size_5g, per_chan_size = DPD_PER_CH_BW20_SIZE;
-+	u16 channel = ieee80211_frequency_to_channel(chandef->center_freq1);
-+	u8 dpd_mask, *cal = dev->cal, *eeprom = dev->mt76.eeprom.data;
-+	int idx, i, ret;
-+
-+	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
-+	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
-+
-+	switch (band) {
-+	case NL80211_BAND_2GHZ:
-+		dpd_mask = MT_EE_WIFI_CAL_DPD_2G;
-+		/* channel 14 don't need DPD cal */
-+		if (channel >= 1 && channel <= 4)
-+			channel = 3;
-+		else if (channel >= 5 && channel <= 9)
-+			channel = 7;
-+		else if (channel >= 10 && channel <= 13)
-+			channel = 11;
-+		else
-+			return 0;
-+		cal_id = RF_DPD_FLAT_CAL;
-+		chan_list = dpd_2g_ch_list_bw20;
-+		chan_list_size = dpd_2g_bw20_ch_num;
-+		break;
-+	case NL80211_BAND_5GHZ:
-+		dpd_mask = MT_EE_WIFI_CAL_DPD_5G;
-+		cal_id = RF_DPD_FLAT_5G_CAL;
-+		chan_list = mphy->sband_5g.sband.channels;
-+		chan_list_size = mphy->sband_5g.sband.n_channels;
-+		base_offset += dpd_size_2g;
-+		if (bw == NL80211_CHAN_WIDTH_160) {
-+			base_offset += mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
-+			cal_id = RF_DPD_FLAT_5G_MEM_CAL;
-+			chan_list = dpd_5g_ch_list_bw160;
-+			chan_list_size = dpd_5g_bw160_ch_num;
-+		} else if (bw > NL80211_CHAN_WIDTH_20) {
-+			/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
-+			channel -= 2;
-+		}
-+		break;
-+	case NL80211_BAND_6GHZ:
-+		dpd_mask = MT_EE_WIFI_CAL_DPD_6G;
-+		cal_id = RF_DPD_FLAT_6G_CAL;
-+		chan_list = mphy->sband_6g.sband.channels;
-+		chan_list_size = mphy->sband_6g.sband.n_channels;
-+		base_offset += dpd_size_2g + dpd_size_5g;
-+		if (bw == NL80211_CHAN_WIDTH_160) {
-+			base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
-+			cal_id = RF_DPD_FLAT_6G_MEM_CAL;
-+			chan_list = dpd_6g_ch_list_bw160;
-+			chan_list_size = dpd_6g_bw160_ch_num;
-+		} else if (bw == NL80211_CHAN_WIDTH_320) {
-+			base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
-+				       dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
-+			cal_id = RF_DPD_FLAT_6G_MEM_CAL;
-+			chan_list = dpd_6g_ch_list_bw320;
-+			chan_list_size = dpd_6g_bw320_ch_num;
-+		} else if (bw > NL80211_CHAN_WIDTH_20) {
-+			/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
-+			channel -= 2;
-+		}
-+		break;
-+	default:
-+		dpd_mask = 0;
-+		break;
-+	}
-+
-+	if (!(eeprom[offs] & dpd_mask))
-+		return 0;
-+
-+	for (idx = 0; idx < chan_list_size; idx++)
-+		if (channel == chan_list[idx].hw_value)
-+			break;
-+	if (idx == chan_list_size)
-+		return -EINVAL;
-+
-+	cal += MT_EE_CAL_GROUP_SIZE + base_offset + idx * per_chan_size;
-+
-+	for (i = 0; i < per_chan_size / MT_EE_CAL_UNIT; i++) {
-+		ret = mt7996_mcu_set_pre_cal(dev, i, cal, MT_EE_CAL_UNIT, cal_id);
-+		if (ret)
-+			return ret;
-+
-+		cal += MT_EE_CAL_UNIT;
-+	}
-+
-+	return ret;
-+}
-+
- int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap)
- {
- #define NIC_CAP	3
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 2f067988..69db055d 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -611,6 +611,9 @@ void mt7996_mcu_exit(struct mt7996_dev *dev);
- int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag);
- int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id);
- int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 data);
-+int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event);
-+int mt7996_mcu_apply_group_cal(struct mt7996_dev *dev);
-+int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy);
- #ifdef CONFIG_NL80211_TESTMODE
- void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1011-mtk-wifi-mt76-testmode-add-testmode-ZWDFS-verificati.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1011-mtk-wifi-mt76-testmode-add-testmode-ZWDFS-verificati.patch
deleted file mode 100644
index 20f17b5..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1011-mtk-wifi-mt76-testmode-add-testmode-ZWDFS-verificati.patch
+++ /dev/null
@@ -1,490 +0,0 @@
-From ca5e57a566fb60705ae7d6b0767542b32ee42afc Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Wed, 22 Mar 2023 11:19:52 +0800
-Subject: [PATCH 1011/1044] mtk: wifi: mt76: testmode: add testmode ZWDFS
- verification support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt76.h            |   8 ++
- mt7996/mt7996.h   |   1 +
- mt7996/testmode.c | 248 ++++++++++++++++++++++++++++++++++++++++++++--
- mt7996/testmode.h |  44 ++++++++
- testmode.c        |  22 +++-
- tools/fields.c    |  15 +++
- 6 files changed, 326 insertions(+), 12 deletions(-)
-
-diff --git a/mt76.h b/mt76.h
-index b2cc1085..a75277fe 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -778,6 +778,14 @@ struct mt76_testmode_data {
- 	} cfg;
- 
- 	u8 aid;
-+
-+	u8 offchan_ch;
-+	u8 offchan_center_ch;
-+	u8 offchan_bw;
-+
-+	u8 ipi_threshold;
-+	u32 ipi_period;
-+	u8 ipi_reset;
- };
- 
- struct mt76_vif {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 69db055d..2daca449 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -289,6 +289,7 @@ struct mt7996_phy {
- 
- 	struct mt76_mib_stats mib;
- 	struct mt76_channel_state state_ts;
-+	struct delayed_work ipi_work;
- 
- 	bool has_aux_rx;
- 
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-index 36be0ff8..26ae5827 100644
---- a/mt7996/testmode.c
-+++ b/mt7996/testmode.c
-@@ -17,6 +17,12 @@ enum {
- 	TM_CHANGED_TX_LENGTH,
- 	TM_CHANGED_TX_TIME,
- 	TM_CHANGED_CFG,
-+	TM_CHANGED_OFF_CHAN_CH,
-+	TM_CHANGED_OFF_CHAN_CENTER_CH,
-+	TM_CHANGED_OFF_CHAN_BW,
-+	TM_CHANGED_IPI_THRESHOLD,
-+	TM_CHANGED_IPI_PERIOD,
-+	TM_CHANGED_IPI_RESET,
- 
- 	/* must be last */
- 	NUM_TM_CHANGED
-@@ -29,20 +35,31 @@ static const u8 tm_change_map[] = {
- 	[TM_CHANGED_TX_LENGTH] = MT76_TM_ATTR_TX_LENGTH,
- 	[TM_CHANGED_TX_TIME] = MT76_TM_ATTR_TX_TIME,
- 	[TM_CHANGED_CFG] = MT76_TM_ATTR_CFG,
-+	[TM_CHANGED_OFF_CHAN_CH] = MT76_TM_ATTR_OFF_CH_SCAN_CH,
-+	[TM_CHANGED_OFF_CHAN_CENTER_CH] = MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH,
-+	[TM_CHANGED_OFF_CHAN_BW] = MT76_TM_ATTR_OFF_CH_SCAN_BW,
-+	[TM_CHANGED_IPI_THRESHOLD] = MT76_TM_ATTR_IPI_THRESHOLD,
-+	[TM_CHANGED_IPI_PERIOD] = MT76_TM_ATTR_IPI_PERIOD,
-+	[TM_CHANGED_IPI_RESET] = MT76_TM_ATTR_IPI_RESET,
- };
- 
--static u8 mt7996_tm_bw_mapping(enum nl80211_chan_width width, enum bw_mapping_method method)
-+static void mt7996_tm_ipi_work(struct work_struct *work);
-+
-+static u32 mt7996_tm_bw_mapping(enum nl80211_chan_width width, enum bw_mapping_method method)
- {
--	static const u8 width_to_bw[][NUM_BW_MAP] = {
--		[NL80211_CHAN_WIDTH_40] = {FW_CDBW_40MHZ, TM_CBW_40MHZ},
--		[NL80211_CHAN_WIDTH_80] = {FW_CDBW_80MHZ, TM_CBW_80MHZ},
--		[NL80211_CHAN_WIDTH_80P80] = {FW_CDBW_8080MHZ, TM_CBW_8080MHZ},
--		[NL80211_CHAN_WIDTH_160] = {FW_CDBW_160MHZ, TM_CBW_160MHZ},
--		[NL80211_CHAN_WIDTH_5] = {FW_CDBW_5MHZ, TM_CBW_5MHZ},
--		[NL80211_CHAN_WIDTH_10] = {FW_CDBW_10MHZ, TM_CBW_10MHZ},
--		[NL80211_CHAN_WIDTH_20] = {FW_CDBW_20MHZ, TM_CBW_20MHZ},
--		[NL80211_CHAN_WIDTH_20_NOHT] = {FW_CDBW_20MHZ, TM_CBW_20MHZ},
--		[NL80211_CHAN_WIDTH_320] = {FW_CDBW_320MHZ, TM_CBW_320MHZ},
-+	static const u32 width_to_bw[][NUM_BW_MAP] = {
-+		[NL80211_CHAN_WIDTH_40] = {FW_CDBW_40MHZ, TM_CBW_40MHZ, 40,
-+					   FIRST_CONTROL_CHAN_BITMAP_BW40},
-+		[NL80211_CHAN_WIDTH_80] = {FW_CDBW_80MHZ, TM_CBW_80MHZ, 80,
-+					   FIRST_CONTROL_CHAN_BITMAP_BW80},
-+		[NL80211_CHAN_WIDTH_80P80] = {FW_CDBW_8080MHZ, TM_CBW_8080MHZ, 80, 0x0},
-+		[NL80211_CHAN_WIDTH_160] = {FW_CDBW_160MHZ, TM_CBW_160MHZ, 160,
-+					    FIRST_CONTROL_CHAN_BITMAP_BW160},
-+		[NL80211_CHAN_WIDTH_5] = {FW_CDBW_5MHZ, TM_CBW_5MHZ, 5, 0x0},
-+		[NL80211_CHAN_WIDTH_10] = {FW_CDBW_10MHZ, TM_CBW_10MHZ, 10, 0x0},
-+		[NL80211_CHAN_WIDTH_20] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, 20, 0x0},
-+		[NL80211_CHAN_WIDTH_20_NOHT] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, 20, 0x0},
-+		[NL80211_CHAN_WIDTH_320] = {FW_CDBW_320MHZ, TM_CBW_320MHZ, 320, 0x0},
- 	};
- 
- 	if (width >= ARRAY_SIZE(width_to_bw))
-@@ -217,6 +234,9 @@ mt7996_tm_init(struct mt7996_phy *phy, bool en)
- 
- 	/* use firmware counter for RX stats */
- 	phy->mt76->test.flag |= MT_TM_FW_RX_COUNT;
-+
-+	if (en)
-+		INIT_DELAYED_WORK(&phy->ipi_work, mt7996_tm_ipi_work);
- }
- 
- static void
-@@ -829,6 +849,204 @@ void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	}
- }
- 
-+static u8
-+mt7996_tm_get_center_chan(struct mt7996_phy *phy, struct cfg80211_chan_def *chandef)
-+{
-+	struct mt76_phy *mphy = phy->mt76;
-+	const struct ieee80211_channel *chan = mphy->sband_5g.sband.channels;
-+	u32 bitmap, i, offset, width_mhz, size = mphy->sband_5g.sband.n_channels;
-+	u16 first_control = 0, control_chan = chandef->chan->hw_value;
-+
-+	bitmap = mt7996_tm_bw_mapping(chandef->width, BW_MAP_NL_TO_CONTROL_BITMAP_5G);
-+	if (!bitmap)
-+		return control_chan;
-+
-+	width_mhz = mt7996_tm_bw_mapping(chandef->width, BW_MAP_NL_TO_MHZ);
-+	offset = width_mhz / 10 - 2;
-+
-+	for (i = 0; i < size; i++) {
-+		if (!((1 << i) & bitmap))
-+			continue;
-+
-+		if (control_chan >= chan[i].hw_value)
-+			first_control = chan[i].hw_value;
-+		else
-+			break;
-+	}
-+
-+	if (i == size || first_control == 0)
-+		return control_chan;
-+
-+	return first_control + offset;
-+}
-+
-+static int
-+mt7996_tm_set_offchan(struct mt7996_phy *phy, bool no_center)
-+{
-+	struct mt76_phy *mphy = phy->mt76;
-+	struct mt7996_dev *dev = phy->dev;
-+	struct ieee80211_hw *hw = mphy->hw;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct cfg80211_chan_def chandef = {};
-+	struct ieee80211_channel *chan;
-+	int ret, freq = ieee80211_channel_to_frequency(td->offchan_ch, NL80211_BAND_5GHZ);
-+
-+	if (!mphy->cap.has_5ghz || !freq) {
-+		ret = -EINVAL;
-+		dev_info(dev->mt76.dev, "Failed to set offchan (invalid band or channel)!\n");
-+		goto out;
-+	}
-+
-+	chandef.width = td->offchan_bw;
-+	chan = ieee80211_get_channel(hw->wiphy, freq);
-+	chandef.chan = chan;
-+	if (no_center)
-+		td->offchan_center_ch = mt7996_tm_get_center_chan(phy, &chandef);
-+	chandef.center_freq1 = ieee80211_channel_to_frequency(td->offchan_center_ch,
-+							      NL80211_BAND_5GHZ);
-+	if (!cfg80211_chandef_valid(&chandef)) {
-+		ret = -EINVAL;
-+		dev_info(dev->mt76.dev, "Failed to set offchan, chandef is invalid!\n");
-+		goto out;
-+	}
-+
-+	memset(&dev->rdd2_chandef, 0, sizeof(struct cfg80211_chan_def));
-+
-+	ret = mt7996_mcu_rdd_background_enable(phy, &chandef);
-+
-+	if (ret)
-+		goto out;
-+
-+	dev->rdd2_phy = phy;
-+	dev->rdd2_chandef = chandef;
-+
-+	return 0;
-+
-+out:
-+	td->offchan_ch = 0;
-+	td->offchan_center_ch = 0;
-+	td->offchan_bw = 0;
-+
-+	return ret;
-+}
-+
-+static void
-+mt7996_tm_ipi_hist_ctrl(struct mt7996_phy *phy, struct mt7996_tm_rdd_ipi_ctrl *data, u8 cmd)
-+{
-+#define MT_IPI_RESET		0x830a5dfc
-+#define MT_IPI_RESET_MASK	BIT(28)
-+#define MT_IPI_COUNTER_BASE	0x83041000
-+#define MT_IPI_COUNTER(idx)	(MT_IPI_COUNTER_BASE + ((idx) * 4))
-+	struct mt7996_dev *dev = phy->dev;
-+	bool val;
-+	int i;
-+
-+	if (cmd == RDD_SET_IPI_HIST_RESET) {
-+		val = mt76_rr(dev, MT_IPI_RESET) & MT_IPI_RESET_MASK;
-+		mt76_rmw_field(dev, MT_IPI_RESET, MT_IPI_RESET_MASK, !val);
-+		return;
-+	}
-+
-+	for (i = 0; i < POWER_INDICATE_HIST_MAX; i++)
-+		data->ipi_hist_val[i] = mt76_rr(dev, MT_IPI_COUNTER(i));
-+}
-+
-+static void
-+mt7996_tm_ipi_work(struct work_struct *work)
-+{
-+#define PRECISION	100
-+	struct mt7996_phy *phy = container_of(work, struct mt7996_phy, ipi_work.work);
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_tm_rdd_ipi_ctrl data;
-+	u32 ipi_idx, ipi_free_count, ipi_percentage;
-+	u32 ipi_hist_count_th = 0, ipi_hist_total_count = 0;
-+	u32 self_idle_ratio, ipi_idle_ratio, channel_load;
-+	u32 *ipi_hist_data;
-+	const char *power_lower_bound, *power_upper_bound;
-+	static const char * const ipi_idx_to_power_bound[] = {
-+		[RDD_IPI_HIST_0] = "-92",
-+		[RDD_IPI_HIST_1] = "-89",
-+		[RDD_IPI_HIST_2] = "-86",
-+		[RDD_IPI_HIST_3] = "-83",
-+		[RDD_IPI_HIST_4] = "-80",
-+		[RDD_IPI_HIST_5] = "-75",
-+		[RDD_IPI_HIST_6] = "-70",
-+		[RDD_IPI_HIST_7] = "-65",
-+		[RDD_IPI_HIST_8] = "-60",
-+		[RDD_IPI_HIST_9] = "-55",
-+		[RDD_IPI_HIST_10] = "inf",
-+	};
-+
-+	memset(&data, 0, sizeof(data));
-+	mt7996_tm_ipi_hist_ctrl(phy, &data, RDD_IPI_HIST_ALL_CNT);
-+
-+	ipi_hist_data = data.ipi_hist_val;
-+	for (ipi_idx = 0; ipi_idx < POWER_INDICATE_HIST_MAX; ipi_idx++) {
-+		power_lower_bound = ipi_idx ? ipi_idx_to_power_bound[ipi_idx - 1] : "-inf";
-+		power_upper_bound = ipi_idx_to_power_bound[ipi_idx];
-+
-+		dev_info(dev->mt76.dev, "IPI %d (power range: (%s, %s] dBm): ipi count = %d\n",
-+			 ipi_idx, power_lower_bound, power_upper_bound, ipi_hist_data[ipi_idx]);
-+
-+		if (td->ipi_threshold <= ipi_idx && ipi_idx <= RDD_IPI_HIST_10)
-+			ipi_hist_count_th += ipi_hist_data[ipi_idx];
-+
-+		ipi_hist_total_count += ipi_hist_data[ipi_idx];
-+	}
-+
-+	ipi_free_count = ipi_hist_data[RDD_IPI_FREE_RUN_CNT];
-+
-+	dev_info(dev->mt76.dev, "IPI threshold %d: ipi_hist_count_th = %d, ipi_free_count = %d\n",
-+		 td->ipi_threshold, ipi_hist_count_th, ipi_free_count);
-+	dev_info(dev->mt76.dev, "TX assert time =  %d [ms]\n", data.tx_assert_time / 1000);
-+
-+	/* calculate channel load = (self idle ratio - idle ratio) / self idle ratio */
-+	if (ipi_hist_count_th >= UINT_MAX / (100 * PRECISION))
-+		ipi_percentage = 100 * PRECISION *
-+				 (ipi_hist_count_th / (100 * PRECISION)) /
-+				 (ipi_free_count / (100 * PRECISION));
-+	else
-+		ipi_percentage = PRECISION * 100 * ipi_hist_count_th / ipi_free_count;
-+
-+	ipi_idle_ratio = ((100 * PRECISION) - ipi_percentage) / PRECISION;
-+
-+	self_idle_ratio = PRECISION * 100 *
-+			  (td->ipi_period - (data.tx_assert_time / 1000)) /
-+			  td->ipi_period / PRECISION;
-+
-+	if (self_idle_ratio < ipi_idle_ratio)
-+		channel_load = 0;
-+	else
-+		channel_load = self_idle_ratio - ipi_idle_ratio;
-+
-+	if (self_idle_ratio <= td->ipi_threshold) {
-+		dev_info(dev->mt76.dev, "band[%d]: self idle ratio = %d%%, idle ratio = %d%%\n",
-+			 phy->mt76->band_idx, self_idle_ratio, ipi_idle_ratio);
-+		return;
-+	}
-+
-+	channel_load = (100 * channel_load) / self_idle_ratio;
-+	dev_info(dev->mt76.dev,
-+		 "band[%d]: chan load = %d%%, self idle ratio = %d%%, idle ratio = %d%%\n",
-+		 phy->mt76->band_idx, channel_load, self_idle_ratio, ipi_idle_ratio);
-+}
-+
-+static int
-+mt7996_tm_set_ipi(struct mt7996_phy *phy)
-+{
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+
-+	/* reset IPI CR */
-+	mt7996_tm_ipi_hist_ctrl(phy, NULL, RDD_SET_IPI_HIST_RESET);
-+
-+	cancel_delayed_work(&phy->ipi_work);
-+	ieee80211_queue_delayed_work(phy->mt76->hw, &phy->ipi_work,
-+				     msecs_to_jiffies(td->ipi_period));
-+
-+	return 0;
-+}
-+
- static void
- mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
- {
-@@ -860,6 +1078,14 @@ mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
- 
- 		mt7996_tm_set(dev, func_idx, td->cfg.type);
- 	}
-+	if ((changed & BIT(TM_CHANGED_OFF_CHAN_CH)) &&
-+	    (changed & BIT(TM_CHANGED_OFF_CHAN_BW)))
-+		mt7996_tm_set_offchan(phy, !(changed & BIT(TM_CHANGED_OFF_CHAN_CENTER_CH)));
-+	if ((changed & BIT(TM_CHANGED_IPI_THRESHOLD)) &&
-+	    (changed & BIT(TM_CHANGED_IPI_PERIOD)))
-+		mt7996_tm_set_ipi(phy);
-+	if (changed & BIT(TM_CHANGED_IPI_RESET))
-+		mt7996_tm_ipi_hist_ctrl(phy, NULL, RDD_SET_IPI_HIST_RESET);
- }
- 
- static int
-diff --git a/mt7996/testmode.h b/mt7996/testmode.h
-index 9bfb86f2..78662b2e 100644
---- a/mt7996/testmode.h
-+++ b/mt7996/testmode.h
-@@ -27,9 +27,15 @@ enum {
- 	FW_CDBW_8080MHZ,
- };
- 
-+#define FIRST_CONTROL_CHAN_BITMAP_BW40		0x5555555
-+#define FIRST_CONTROL_CHAN_BITMAP_BW80		0x111111
-+#define FIRST_CONTROL_CHAN_BITMAP_BW160		0x100101
-+
- enum bw_mapping_method {
- 	BW_MAP_NL_TO_FW,
- 	BW_MAP_NL_TO_TM,
-+	BW_MAP_NL_TO_MHZ,
-+	BW_MAP_NL_TO_CONTROL_BITMAP_5G,
- 
- 	NUM_BW_MAP,
- };
-@@ -312,4 +318,42 @@ struct mt7996_tm_rx_event {
- 	};
- } __packed;
- 
-+enum {
-+	RDD_SET_IPI_CR_INIT,		/* CR initialization */
-+	RDD_SET_IPI_HIST_RESET,		/* Reset IPI histogram counter */
-+	RDD_SET_IDLE_POWER,		/* Idle power info */
-+	RDD_SET_IPI_HIST_NUM
-+};
-+
-+enum {
-+	RDD_IPI_HIST_0,			/* IPI count for power <= -92 (dBm) */
-+	RDD_IPI_HIST_1,			/* IPI count for -92 < power <= -89 (dBm) */
-+	RDD_IPI_HIST_2,			/* IPI count for -89 < power <= -86 (dBm) */
-+	RDD_IPI_HIST_3,			/* IPI count for -86 < power <= -83 (dBm) */
-+	RDD_IPI_HIST_4,			/* IPI count for -83 < power <= -80 (dBm) */
-+	RDD_IPI_HIST_5,			/* IPI count for -80 < power <= -75 (dBm) */
-+	RDD_IPI_HIST_6,			/* IPI count for -75 < power <= -70 (dBm) */
-+	RDD_IPI_HIST_7,			/* IPI count for -70 < power <= -65 (dBm) */
-+	RDD_IPI_HIST_8,			/* IPI count for -65 < power <= -60 (dBm) */
-+	RDD_IPI_HIST_9,			/* IPI count for -60 < power <= -55 (dBm) */
-+	RDD_IPI_HIST_10,		/* IPI count for -55 < power        (dBm) */
-+	RDD_IPI_FREE_RUN_CNT,		/* IPI count for counter++ per 8 us */
-+	RDD_IPI_HIST_ALL_CNT,		/* Get all IPI */
-+	RDD_IPI_HIST_0_TO_10_CNT,	/* Get IPI histogram 0 to 10 */
-+	RDD_IPI_HIST_2_TO_10_CNT,	/* Get IPI histogram 2 to 10 */
-+	RDD_TX_ASSERT_TIME,		/* Get band 1 TX assert time */
-+	RDD_IPI_HIST_NUM
-+};
-+
-+#define POWER_INDICATE_HIST_MAX		RDD_IPI_FREE_RUN_CNT
-+#define IPI_HIST_TYPE_NUM		(POWER_INDICATE_HIST_MAX + 1)
-+
-+struct mt7996_tm_rdd_ipi_ctrl {
-+	u8 ipi_hist_idx;
-+	u8 band_idx;
-+	u8 rsv[2];
-+	__le32 ipi_hist_val[IPI_HIST_TYPE_NUM];
-+	__le32 tx_assert_time;		/* unit: us */
-+} __packed;
-+
- #endif
-diff --git a/testmode.c b/testmode.c
-index cd8cb655..69147f86 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -27,6 +27,13 @@ const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
- 	[MT76_TM_ATTR_TX_TIME] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_FREQ_OFFSET] = { .type = NLA_U32 },
- 	[MT76_TM_ATTR_DRV_DATA] = { .type = NLA_NESTED },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_CH] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_BW] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_OFF_CH_SCAN_PATH] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_IPI_THRESHOLD] = { .type = NLA_U8 },
-+	[MT76_TM_ATTR_IPI_PERIOD] = { .type = NLA_U32 },
-+	[MT76_TM_ATTR_IPI_RESET] = { .type = NLA_U8 },
- };
- EXPORT_SYMBOL_GPL(mt76_tm_policy);
- 
-@@ -499,6 +506,9 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 	if (tb[MT76_TM_ATTR_TX_RATE_IDX])
- 		td->tx_rate_idx = nla_get_u8(tb[MT76_TM_ATTR_TX_RATE_IDX]);
- 
-+	if (tb[MT76_TM_ATTR_IPI_PERIOD])
-+		td->ipi_period = nla_get_u32(tb[MT76_TM_ATTR_IPI_PERIOD]);
-+
- 	if (mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_RATE_MODE], &td->tx_rate_mode,
- 			   0, MT76_TM_TX_MODE_MAX) ||
- 	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_RATE_NSS], &td->tx_rate_nss,
-@@ -514,7 +524,14 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 			   &td->tx_duty_cycle, 0, 99) ||
- 	    mt76_tm_get_u8(tb[MT76_TM_ATTR_TX_POWER_CONTROL],
- 			   &td->tx_power_control, 0, 1) ||
--	    mt76_tm_get_u8(tb[MT76_TM_ATTR_AID], &td->aid, 0, 16))
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_AID], &td->aid, 0, 16) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_OFF_CH_SCAN_CH], &td->offchan_ch, 36, 196) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH], &td->offchan_center_ch,
-+			   36, 196) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_OFF_CH_SCAN_BW],
-+			   &td->offchan_bw, NL80211_CHAN_WIDTH_20_NOHT, NL80211_CHAN_WIDTH_160) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_IPI_THRESHOLD], &td->ipi_threshold, 0, 10) ||
-+	    mt76_tm_get_u8(tb[MT76_TM_ATTR_IPI_RESET], &td->ipi_reset, 0, 1))
- 		goto out;
- 
- 	if (tb[MT76_TM_ATTR_TX_LENGTH]) {
-@@ -720,6 +737,9 @@ int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,
- 	    nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_STBC, td->tx_rate_stbc) ||
- 	    nla_put_u8(msg, MT76_TM_ATTR_SKU_EN, td->sku_en) ||
- 	    nla_put_u8(msg, MT76_TM_ATTR_AID, td->aid) ||
-+	    nla_put_u8(msg, MT76_TM_ATTR_OFF_CH_SCAN_CH, td->offchan_ch) ||
-+	    nla_put_u8(msg, MT76_TM_ATTR_OFF_CH_SCAN_CENTER_CH, td->offchan_center_ch) ||
-+	    nla_put_u8(msg, MT76_TM_ATTR_OFF_CH_SCAN_BW, td->offchan_bw) ||
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_LTF) &&
- 	     nla_put_u8(msg, MT76_TM_ATTR_TX_LTF, td->tx_ltf)) ||
- 	    (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_ANTENNA) &&
-diff --git a/tools/fields.c b/tools/fields.c
-index b0122763..77696ce7 100644
---- a/tools/fields.c
-+++ b/tools/fields.c
-@@ -35,6 +35,15 @@ static const char * const testmode_tx_mode[] = {
- 	[MT76_TM_TX_MODE_EHT_MU] = "eht_mu",
- };
- 
-+static const char * const testmode_offchan_bw[] = {
-+	[NL80211_CHAN_WIDTH_20_NOHT] = "NOHT",
-+	[NL80211_CHAN_WIDTH_20] = "20",
-+	[NL80211_CHAN_WIDTH_40] = "40",
-+	[NL80211_CHAN_WIDTH_80] = "80",
-+	[NL80211_CHAN_WIDTH_80P80] = "80p80",
-+	[NL80211_CHAN_WIDTH_160] = "160",
-+};
-+
- static void print_enum(const struct tm_field *field, struct nlattr *attr)
- {
- 	unsigned int i = nla_get_u8(attr);
-@@ -390,6 +399,12 @@ static const struct tm_field testdata_fields[NUM_MT76_TM_ATTRS] = {
- 	FIELD(u8, AID, "aid"),
- 	FIELD(u8, RU_ALLOC, "ru_alloc"),
- 	FIELD(u8, RU_IDX, "ru_idx"),
-+	FIELD(u8, OFF_CH_SCAN_CH, "offchan_ch"),
-+	FIELD(u8, OFF_CH_SCAN_CENTER_CH, "offchan_center_ch"),
-+	FIELD_ENUM(OFF_CH_SCAN_BW, "offchan_bw", testmode_offchan_bw),
-+	FIELD(u8, IPI_THRESHOLD, "ipi_threshold"),
-+	FIELD(u32, IPI_PERIOD, "ipi_period"),
-+	FIELD(u8, IPI_RESET, "ipi_reset"),
- 	FIELD_MAC(MAC_ADDRS, "mac_addrs"),
- 	FIELD_NESTED_RO(STATS, stats, "",
- 			.print_extra = print_extra_stats),
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1012-mtk-wifi-mt76-mt7996-add-mu-vendor-command-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1012-mtk-wifi-mt76-mt7996-add-mu-vendor-command-support.patch
deleted file mode 100644
index 8867fe8..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1012-mtk-wifi-mt76-mt7996-add-mu-vendor-command-support.patch
+++ /dev/null
@@ -1,308 +0,0 @@
-From 940f89e5dd90f5554354036614dce057ade743e1 Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Tue, 13 Dec 2022 15:17:43 +0800
-Subject: [PATCH 1012/1044] mtk: wifi: mt76: mt7996: add mu vendor command
- support
-
-mtk: wifi: mt76: fix muru_onoff as all enabled by default
-
-Fix muru_onoff default value as 0xF, which means all MU & RU are
-enabled. The purpose of this commit is to align muru_onoff value with
-hostapd and mt76 driver
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/Makefile |  3 +-
- mt7996/init.c   |  9 ++++++
- mt7996/mcu.c    | 37 ++++++++++++++++++---
- mt7996/mcu.h    | 12 +++++++
- mt7996/mt7996.h |  7 ++++
- mt7996/vendor.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 22 +++++++++++++
- 7 files changed, 169 insertions(+), 6 deletions(-)
- create mode 100644 mt7996/vendor.c
- create mode 100644 mt7996/vendor.h
-
-diff --git a/mt7996/Makefile b/mt7996/Makefile
-index 7bb17f44..6643c7a3 100644
---- a/mt7996/Makefile
-+++ b/mt7996/Makefile
-@@ -1,11 +1,12 @@
- # SPDX-License-Identifier: ISC
- EXTRA_CFLAGS += -DCONFIG_MT76_LEDS
- EXTRA_CFLAGS += -DCONFIG_MTK_DEBUG
-+EXTRA_CFLAGS += -DCONFIG_MTK_VENDOR
- 
- obj-$(CONFIG_MT7996E) += mt7996e.o
- 
- mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \
--	     debugfs.o mmio.o
-+	     debugfs.o mmio.o vendor.o
- 
- mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o
- mt7996e-$(CONFIG_NL80211_TESTMODE) += testmode.o
-diff --git a/mt7996/init.c b/mt7996/init.c
-index c135da9c..fba61c01 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -368,6 +368,7 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
- 
- 	phy->slottime = 9;
- 	phy->beacon_rate = -1;
-+	phy->muru_onoff = OFDMA_UL | OFDMA_DL | MUMIMO_DL | MUMIMO_UL;
- 
- 	hw->sta_data_size = sizeof(struct mt7996_sta);
- 	hw->vif_data_size = sizeof(struct mt7996_vif);
-@@ -616,6 +617,10 @@ static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy,
- 	if (ret)
- 		goto error;
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	mt7996_vendor_register(phy);
-+#endif
-+
- 	ret = mt76_register_phy(mphy, true, mt76_rates,
- 				ARRAY_SIZE(mt76_rates));
- 	if (ret)
-@@ -1401,6 +1406,10 @@ int mt7996_register_device(struct mt7996_dev *dev)
- 	dev->mt76.test_ops = &mt7996_testmode_ops;
- #endif
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	mt7996_vendor_register(&dev->phy);
-+#endif
-+
- 	ret = mt76_register_device(&dev->mt76, true, mt76_rates,
- 				   ARRAY_SIZE(mt76_rates));
- 	if (ret)
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 0ee17ff9..8348d22a 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1373,6 +1373,8 @@ static void
- mt7996_mcu_sta_muru_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
- 			struct ieee80211_vif *vif, struct ieee80211_sta *sta)
- {
-+	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
-+	struct mt7996_phy *phy = mvif->phy;
- 	struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
- 	struct sta_rec_muru *muru;
- 	struct tlv *tlv;
-@@ -1384,11 +1386,14 @@ mt7996_mcu_sta_muru_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
- 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
- 
- 	muru = (struct sta_rec_muru *)tlv;
--	muru->cfg.mimo_dl_en = vif->bss_conf.eht_mu_beamformer ||
--			       vif->bss_conf.he_mu_beamformer ||
--			       vif->bss_conf.vht_mu_beamformer ||
--			       vif->bss_conf.vht_mu_beamformee;
--	muru->cfg.ofdma_dl_en = true;
-+	muru->cfg.mimo_dl_en = (vif->bss_conf.eht_mu_beamformer ||
-+				vif->bss_conf.he_mu_beamformer ||
-+				vif->bss_conf.vht_mu_beamformer ||
-+				vif->bss_conf.vht_mu_beamformee) &&
-+			       !!(phy->muru_onoff & MUMIMO_DL);
-+	muru->cfg.mimo_ul_en = !!(phy->muru_onoff & MUMIMO_UL);
-+	muru->cfg.ofdma_dl_en = !!(phy->muru_onoff & OFDMA_DL);
-+	muru->cfg.ofdma_ul_en = !!(phy->muru_onoff & OFDMA_UL);
- 
- 	if (sta->deflink.vht_cap.vht_supported)
- 		muru->mimo_dl.vht_mu_bfee =
-@@ -4919,3 +4924,25 @@ int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable)
- 	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(SCS),
- 				 &req, sizeof(req), false);
- }
-+
-+#ifdef CONFIG_MTK_VENDOR
-+void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
-+{
-+	u8 mode, val;
-+	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
-+	struct mt7996_phy *phy =  mvif->phy;
-+
-+	mode = FIELD_GET(RATE_CFG_MODE, *((u32 *)data));
-+	val = FIELD_GET(RATE_CFG_VAL, *((u32 *)data));
-+
-+	switch (mode) {
-+	case RATE_PARAM_AUTO_MU:
-+		if (val < 0 || val > 15) {
-+			printk("Wrong value! The value is between 0-15.\n");
-+			break;
-+		}
-+		phy->muru_onoff = val;
-+		break;
-+	}
-+}
-+#endif
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 887d9b49..68bf82fc 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -754,8 +754,20 @@ enum {
- 	RATE_PARAM_FIXED_MCS,
- 	RATE_PARAM_FIXED_GI = 11,
- 	RATE_PARAM_AUTO = 20,
-+#ifdef CONFIG_MTK_VENDOR
-+	RATE_PARAM_AUTO_MU = 32,
-+#endif
- };
- 
-+#define RATE_CFG_MODE	GENMASK(15, 8)
-+#define RATE_CFG_VAL	GENMASK(7, 0)
-+
-+/* MURU */
-+#define OFDMA_DL                       BIT(0)
-+#define OFDMA_UL                       BIT(1)
-+#define MUMIMO_DL                      BIT(2)
-+#define MUMIMO_UL                      BIT(3)
-+
- enum {
- 	BF_SOUNDING_ON = 1,
- 	BF_HW_EN_UPDATE = 17,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 2daca449..d0b425da 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -295,6 +295,8 @@ struct mt7996_phy {
- 
- 	struct mt7996_scs_ctrl scs_ctrl;
- 
-+	u8 muru_onoff;
-+
- #ifdef CONFIG_NL80211_TESTMODE
- 	struct {
- 		u32 *reg_backup;
-@@ -733,6 +735,11 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 			 bool hif2, int *irq);
- u32 mt7996_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
- 
-+#ifdef CONFIG_MTK_VENDOR
-+void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif);
-+void mt7996_vendor_register(struct mt7996_phy *phy);
-+#endif
-+
- #ifdef CONFIG_MTK_DEBUG
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
- int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-new file mode 100644
-index 00000000..b5ecbdf1
---- /dev/null
-+++ b/mt7996/vendor.c
-@@ -0,0 +1,85 @@
-+// SPDX-License-Identifier: ISC
-+/*
-+ * Copyright (C) 2020, MediaTek Inc. All rights reserved.
-+ */
-+
-+#include <net/netlink.h>
-+
-+#include "mt7996.h"
-+#include "mcu.h"
-+#include "vendor.h"
-+#include "mtk_mcu.h"
-+
-+static const struct nla_policy
-+mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
-+	[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
-+};
-+
-+static int mt7996_vendor_mu_ctrl(struct wiphy *wiphy,
-+				 struct wireless_dev *wdev,
-+				 const void *data,
-+				 int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_MU_CTRL];
-+	int err;
-+	u8 val8;
-+	u32 val32 = 0;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_MU_CTRL_MAX, data, data_len,
-+			mu_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (tb[MTK_VENDOR_ATTR_MU_CTRL_ONOFF]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_MU_CTRL_ONOFF]);
-+		val32 |= FIELD_PREP(RATE_CFG_MODE, RATE_PARAM_AUTO_MU) |
-+			 FIELD_PREP(RATE_CFG_VAL, val8);
-+		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
-+							   mt7996_set_wireless_vif, &val32);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_vendor_mu_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			   struct sk_buff *skb, const void *data, int data_len,
-+			   unsigned long *storage)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	int len = 0;
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	if (nla_put_u8(skb, MTK_VENDOR_ATTR_MU_CTRL_DUMP, phy->muru_onoff))
-+		return -ENOMEM;
-+	len += 1;
-+
-+	return len;
-+}
-+
-+static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_MU_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_mu_ctrl,
-+		.dumpit = mt7996_vendor_mu_ctrl_dump,
-+		.policy = mu_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
-+	},
-+};
-+
-+void mt7996_vendor_register(struct mt7996_phy *phy)
-+{
-+	phy->mt76->hw->wiphy->vendor_commands = mt7996_vendor_commands;
-+	phy->mt76->hw->wiphy->n_vendor_commands = ARRAY_SIZE(mt7996_vendor_commands);
-+}
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-new file mode 100644
-index 00000000..8ac3ba8e
---- /dev/null
-+++ b/mt7996/vendor.h
-@@ -0,0 +1,22 @@
-+#ifndef __MT7996_VENDOR_H
-+#define __MT7996_VENDOR_H
-+
-+#define MTK_NL80211_VENDOR_ID	0x0ce7
-+
-+enum mtk_nl80211_vendor_subcmds {
-+	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
-+};
-+
-+enum mtk_vendor_attr_mu_ctrl {
-+	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
-+	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
-+	MTK_VENDOR_ATTR_MU_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
-+};
-+
-+#endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1013-mtk-wifi-mt76-mt7996-Add-air-monitor-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1013-mtk-wifi-mt76-mt7996-Add-air-monitor-support.patch
deleted file mode 100644
index 8f43d6c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1013-mtk-wifi-mt76-mt7996-Add-air-monitor-support.patch
+++ /dev/null
@@ -1,565 +0,0 @@
-From aaf10c9fa1670faa83c7fade6f970c92239c0853 Mon Sep 17 00:00:00 2001
-From: Evelyn Tsai <evelyn.tsai@mediatek.com>
-Date: Wed, 26 Apr 2023 04:40:05 +0800
-Subject: [PATCH 1013/1044] mtk: wifi: mt76: mt7996: Add air monitor support
-
----
- mt76_connac_mcu.h |   1 +
- mt7996/mac.c      |   4 +
- mt7996/main.c     |   4 +
- mt7996/mt7996.h   |  35 +++++
- mt7996/vendor.c   | 362 ++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h   |  39 +++++
- 6 files changed, 445 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 3c82c05d..062268d6 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1251,6 +1251,7 @@ enum {
- 	MCU_UNI_CMD_REG_ACCESS = 0x0d,
- 	MCU_UNI_CMD_CHIP_CONFIG = 0x0e,
- 	MCU_UNI_CMD_POWER_CTRL = 0x0f,
-+	MCU_UNI_CMD_CFG_SMESH = 0x10,
- 	MCU_UNI_CMD_RX_HDR_TRANS = 0x12,
- 	MCU_UNI_CMD_SER = 0x13,
- 	MCU_UNI_CMD_TWT = 0x14,
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index c9f45abe..d55e5a76 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -679,6 +679,10 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
- 			if (ieee80211_has_a4(fc) && is_mesh && status->amsdu)
- 				*qos &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
- 		}
-+#ifdef CONFIG_MTK_VENDOR
-+		if (phy->amnt_ctrl.enable && !ieee80211_is_beacon(fc))
-+			mt7996_vendor_amnt_fill_rx(phy, skb);
-+#endif
- 	} else {
- 		status->flag |= RX_FLAG_8023;
- 		mt7996_wed_check_ppe(dev, &dev->mt76.q_rx[q], msta, skb,
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 07a14917..478ca7ce 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -737,6 +737,10 @@ int mt7996_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- 	mt7996_mac_wtbl_update(dev, idx,
- 			       MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	mt7996_vendor_amnt_sta_remove(mvif->phy, sta);
-+#endif
-+
- 	ret = mt7996_mcu_add_sta(dev, vif, sta, true);
- 	if (ret)
- 		return ret;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index d0b425da..09ce3c35 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -259,6 +259,34 @@ struct mt7996_wed_rro_session_id {
- 	u16 id;
- };
- 
-+#ifdef CONFIG_MTK_VENDOR
-+#define MT7996_AIR_MONITOR_MAX_ENTRY	16
-+#define MT7996_AIR_MONITOR_MAX_GROUP	(MT7996_AIR_MONITOR_MAX_ENTRY >> 1)
-+
-+struct mt7996_air_monitor_group {
-+	bool enable;
-+	bool used[2];
-+};
-+
-+struct mt7996_air_monitor_entry {
-+	bool enable;
-+
-+	u8 group_idx;
-+	u8 group_used_idx;
-+	u8 muar_idx;
-+	u8 addr[ETH_ALEN];
-+	u32 last_seen;
-+	s8 rssi[4];
-+	struct ieee80211_sta *sta;
-+};
-+
-+struct mt7996_air_monitor_ctrl {
-+	u8 enable;
-+	struct mt7996_air_monitor_group group[MT7996_AIR_MONITOR_MAX_GROUP];
-+	struct mt7996_air_monitor_entry entry[MT7996_AIR_MONITOR_MAX_ENTRY];
-+};
-+#endif
-+
- struct mt7996_phy {
- 	struct mt76_phy *mt76;
- 	struct mt7996_dev *dev;
-@@ -311,6 +339,10 @@ struct mt7996_phy {
- 		u8 spe_idx;
- 	} test;
- #endif
-+#ifdef CONFIG_MTK_VENDOR
-+	spinlock_t amnt_lock;
-+	struct mt7996_air_monitor_ctrl amnt_ctrl;
-+#endif
- };
- 
- struct mt7996_dev {
-@@ -738,6 +770,9 @@ u32 mt7996_wed_init_buf(void *ptr, dma_addr_t phys, int token_id);
- #ifdef CONFIG_MTK_VENDOR
- void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif);
- void mt7996_vendor_register(struct mt7996_phy *phy);
-+void mt7996_vendor_amnt_fill_rx(struct mt7996_phy *phy, struct sk_buff *skb);
-+int mt7996_vendor_amnt_sta_remove(struct mt7996_phy *phy,
-+				  struct ieee80211_sta *sta);
- #endif
- 
- #ifdef CONFIG_MTK_DEBUG
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index b5ecbdf1..f3b089d7 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -16,6 +16,32 @@ mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
- 	[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+amnt_ctrl_policy[NUM_MTK_VENDOR_ATTRS_AMNT_CTRL] = {
-+	[MTK_VENDOR_ATTR_AMNT_CTRL_SET] = {.type = NLA_NESTED },
-+	[MTK_VENDOR_ATTR_AMNT_CTRL_DUMP] = { .type = NLA_NESTED },
-+};
-+
-+static const struct nla_policy
-+amnt_set_policy[NUM_MTK_VENDOR_ATTRS_AMNT_SET] = {
-+	[MTK_VENDOR_ATTR_AMNT_SET_INDEX] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_AMNT_SET_MACADDR] = NLA_POLICY_EXACT_LEN_WARN(ETH_ALEN),
-+};
-+
-+static const struct nla_policy
-+amnt_dump_policy[NUM_MTK_VENDOR_ATTRS_AMNT_DUMP] = {
-+	[MTK_VENDOR_ATTR_AMNT_DUMP_INDEX] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_AMNT_DUMP_LEN] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_AMNT_DUMP_RESULT] = { .type = NLA_NESTED },
-+};
-+
-+struct mt7996_amnt_data {
-+	u8 idx;
-+	u8 addr[ETH_ALEN];
-+	s8 rssi[4];
-+	u32 last_seen;
-+};
-+
- static int mt7996_vendor_mu_ctrl(struct wiphy *wiphy,
- 				 struct wireless_dev *wdev,
- 				 const void *data,
-@@ -63,6 +89,328 @@ mt7996_vendor_mu_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return len;
- }
- 
-+void mt7996_vendor_amnt_fill_rx(struct mt7996_phy *phy, struct sk_buff *skb)
-+{
-+	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-+	struct mt7996_air_monitor_ctrl *ctrl = &phy->amnt_ctrl;
-+	struct ieee80211_hdr *hdr = mt76_skb_get_hdr(skb);
-+	__le16 fc = hdr->frame_control;
-+	u8 addr[ETH_ALEN];
-+	int i;
-+
-+	if (!ieee80211_has_fromds(fc))
-+		ether_addr_copy(addr, hdr->addr2);
-+	else if (ieee80211_has_tods(fc))
-+		ether_addr_copy(addr, hdr->addr4);
-+	else
-+		ether_addr_copy(addr, hdr->addr3);
-+
-+	spin_lock_bh(&phy->amnt_lock);
-+	for (i = 0; i < MT7996_AIR_MONITOR_MAX_ENTRY; i++) {
-+		struct mt7996_air_monitor_entry *entry;
-+
-+		if (ether_addr_equal(addr, ctrl->entry[i].addr)) {
-+			entry = &ctrl->entry[i];
-+			entry->rssi[0] = status->chain_signal[0];
-+			entry->rssi[1] = status->chain_signal[1];
-+			entry->rssi[2] = status->chain_signal[2];
-+			entry->rssi[3] = status->chain_signal[3];
-+			entry->last_seen = jiffies;
-+			break;
-+		}
-+	}
-+	spin_unlock_bh(&phy->amnt_lock);
-+}
-+
-+static int
-+mt7996_vendor_smesh_ctrl(struct mt7996_phy *phy, u8 write,
-+			 u8 enable, u8 *value)
-+{
-+#define UNI_CMD_SMESH_PARAM  0
-+	struct mt7996_dev *dev = phy->dev;
-+	struct smesh_param {
-+		__le16 tag;
-+		__le16 length;
-+
-+		u8 enable;
-+		bool a2;
-+		bool a1;
-+		bool data;
-+		bool mgnt;
-+		bool ctrl;
-+		u8 padding[2];
-+	} req = {
-+		.tag = cpu_to_le16(UNI_CMD_SMESH_PARAM),
-+		.length = cpu_to_le16(sizeof(req) - 4),
-+
-+		.enable = enable,
-+		.a2 = true,
-+		.a1 = true,
-+		.data = true,
-+		.mgnt = false,
-+		.ctrl = false,
-+	};
-+	struct smesh_param *res;
-+	struct sk_buff *skb;
-+	int ret = 0;
-+
-+	if (!value)
-+		return -EINVAL;
-+
-+	ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD(CFG_SMESH),
-+					&req, sizeof(req), !write, &skb);
-+
-+	if (ret || write)
-+		return ret;
-+
-+	res = (struct smesh_param *) skb->data;
-+
-+	*value = res->enable;
-+
-+	dev_kfree_skb(skb);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_vendor_amnt_muar(struct mt7996_phy *phy, u8 muar_idx, u8 *addr)
-+{
-+#define UNI_CMD_MUAR_ENTRY  2
-+	struct mt7996_dev *dev = phy->dev;
-+	struct muar_entry {
-+		__le16 tag;
-+		__le16 length;
-+
-+		bool smesh;
-+		u8 hw_bss_index;
-+		u8 muar_idx;
-+		u8 entry_add;
-+		u8 mac_addr[6];
-+		u8 padding[2];
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_MUAR_ENTRY),
-+		.length = cpu_to_le16(sizeof(req) - 4),
-+
-+		.smesh = true,
-+		.hw_bss_index = phy != &dev->phy,
-+		.muar_idx = muar_idx,
-+		.entry_add = 1,
-+	};
-+
-+	ether_addr_copy(req.mac_addr, addr);
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(REPT_MUAR), &req,
-+				 sizeof(req), true);
-+}
-+
-+static int
-+mt7996_vendor_amnt_set_en(struct mt7996_phy *phy, u8 enable)
-+{
-+	u8 status;
-+	int ret;
-+
-+	ret = mt7996_vendor_smesh_ctrl(phy, 0, enable, &status);
-+	if (ret)
-+		return ret;
-+
-+	if (status == enable)
-+		return 0;
-+
-+	ret = mt7996_vendor_smesh_ctrl(phy, 1, enable, &status);
-+	if (ret)
-+		return ret;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_vendor_amnt_set_addr(struct mt7996_phy *phy, u8 index, u8 *addr)
-+{
-+	struct mt7996_air_monitor_ctrl *amnt_ctrl = &phy->amnt_ctrl;
-+	struct mt7996_air_monitor_group *group;
-+	struct mt7996_air_monitor_entry *entry;
-+	int ret, i, j;
-+
-+	if (index >= MT7996_AIR_MONITOR_MAX_ENTRY)
-+		return -1;
-+
-+	spin_lock_bh(&phy->amnt_lock);
-+	entry = &amnt_ctrl->entry[index];
-+	if (!is_zero_ether_addr(addr)) {
-+		if (entry->enable == false) {
-+			for (i = 0; i < MT7996_AIR_MONITOR_MAX_GROUP; i++) {
-+				group = &(amnt_ctrl->group[i]);
-+				if (group->used[0] == false)
-+					j = 0;
-+				else if (group->used[1] == false)
-+					j = 1;
-+				else
-+					continue;
-+
-+				group->enable = true;
-+				group->used[j] = true;
-+				entry->enable = true;
-+				entry->group_idx = i;
-+				entry->group_used_idx = j;
-+				entry->muar_idx = 32 + 4 * i + 2 * j;
-+				break;
-+			}
-+		}
-+	} else {
-+		group = &(amnt_ctrl->group[entry->group_idx]);
-+
-+		group->used[entry->group_used_idx] = false;
-+		if (group->used[0] == false && group->used[1] == false)
-+			group->enable = false;
-+
-+		entry->enable = false;
-+	}
-+	ether_addr_copy(entry->addr, addr);
-+	amnt_ctrl->enable &= ~(1 << entry->group_idx);
-+	amnt_ctrl->enable |= entry->enable << entry->group_idx;
-+	spin_unlock_bh(&phy->amnt_lock);
-+
-+	ret = mt7996_vendor_amnt_muar(phy, entry->muar_idx, addr);
-+	if (ret)
-+		return ret;
-+
-+	return mt7996_vendor_amnt_set_en(phy, amnt_ctrl->enable);
-+}
-+
-+static int
-+mt7966_vendor_amnt_ctrl(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			const void *data, int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb1[NUM_MTK_VENDOR_ATTRS_AMNT_CTRL];
-+	struct nlattr *tb2[NUM_MTK_VENDOR_ATTRS_AMNT_SET];
-+	u8 index = 0;
-+	u8 mac_addr[ETH_ALEN];
-+	int err;
-+
-+	err = nla_parse(tb1, MTK_VENDOR_ATTR_AMNT_CTRL_MAX, data, data_len,
-+			amnt_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb1[MTK_VENDOR_ATTR_AMNT_CTRL_SET])
-+		return -EINVAL;
-+
-+	err = nla_parse_nested(tb2, MTK_VENDOR_ATTR_AMNT_SET_MAX,
-+		tb1[MTK_VENDOR_ATTR_AMNT_CTRL_SET], amnt_set_policy, NULL);
-+
-+	if (!tb2[MTK_VENDOR_ATTR_AMNT_SET_INDEX] ||
-+		!tb2[MTK_VENDOR_ATTR_AMNT_SET_MACADDR])
-+		return -EINVAL;
-+
-+	index = nla_get_u8(tb2[MTK_VENDOR_ATTR_AMNT_SET_INDEX]);
-+	memcpy(mac_addr, nla_data(tb2[MTK_VENDOR_ATTR_AMNT_SET_MACADDR]), ETH_ALEN);
-+
-+	return mt7996_vendor_amnt_set_addr(phy, index, mac_addr);
-+}
-+
-+int mt7996_vendor_amnt_sta_remove(struct mt7996_phy *phy,
-+				  struct ieee80211_sta *sta)
-+{
-+	u8 zero[ETH_ALEN] = {};
-+	int i;
-+
-+	if (!phy->amnt_ctrl.enable)
-+		return 0;
-+
-+	for (i = 0; i < MT7996_AIR_MONITOR_MAX_ENTRY; i++)
-+		if (ether_addr_equal(sta->addr, phy->amnt_ctrl.entry[i].addr))
-+			return mt7996_vendor_amnt_set_addr(phy, i, zero);
-+	return 0;
-+}
-+
-+static int
-+mt7996_amnt_dump(struct mt7996_phy *phy, struct sk_buff *skb,
-+		 u8 amnt_idx, int *attrtype)
-+{
-+	struct mt7996_air_monitor_entry *entry;
-+	struct mt7996_amnt_data data;
-+	u32 last_seen = 0;
-+
-+	spin_lock_bh(&phy->amnt_lock);
-+	entry = &phy->amnt_ctrl.entry[amnt_idx];
-+	if (entry->enable == 0) {
-+		spin_unlock_bh(&phy->amnt_lock);
-+		return 0;
-+	}
-+
-+	last_seen = jiffies_to_msecs(jiffies - entry->last_seen);
-+	ether_addr_copy(data.addr, entry->addr);
-+	data.rssi[0] = entry->rssi[0];
-+	data.rssi[1] = entry->rssi[1];
-+	data.rssi[2] = entry->rssi[2];
-+	data.rssi[3] = entry->rssi[3];
-+	spin_unlock_bh(&phy->amnt_lock);
-+
-+	data.idx = amnt_idx;
-+	data.last_seen = last_seen;
-+
-+	nla_put(skb, (*attrtype)++, sizeof(struct mt7996_amnt_data), &data);
-+
-+	return 1;
-+}
-+
-+static int
-+mt7966_vendor_amnt_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			     struct sk_buff *skb, const void *data, int data_len,
-+			     unsigned long *storage)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb1[NUM_MTK_VENDOR_ATTRS_AMNT_CTRL];
-+	struct nlattr *tb2[NUM_MTK_VENDOR_ATTRS_AMNT_DUMP];
-+	void *a, *b;
-+	int err = 0, attrtype = 0, i, len = 0;
-+	u8 amnt_idx;
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	err = nla_parse(tb1, MTK_VENDOR_ATTR_AMNT_CTRL_MAX, data, data_len,
-+			amnt_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb1[MTK_VENDOR_ATTR_AMNT_CTRL_DUMP])
-+		return -EINVAL;
-+
-+	err = nla_parse_nested(tb2, MTK_VENDOR_ATTR_AMNT_DUMP_MAX,
-+			       tb1[MTK_VENDOR_ATTR_AMNT_CTRL_DUMP],
-+			       amnt_dump_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb2[MTK_VENDOR_ATTR_AMNT_DUMP_INDEX])
-+		return -EINVAL;
-+
-+	amnt_idx = nla_get_u8(tb2[MTK_VENDOR_ATTR_AMNT_DUMP_INDEX]);
-+
-+	a = nla_nest_start(skb, MTK_VENDOR_ATTR_AMNT_CTRL_DUMP);
-+	b = nla_nest_start(skb, MTK_VENDOR_ATTR_AMNT_DUMP_RESULT);
-+
-+	if (amnt_idx != 0xff) {
-+		len += mt7996_amnt_dump(phy, skb, amnt_idx, &attrtype);
-+	} else {
-+		for (i = 0; i < MT7996_AIR_MONITOR_MAX_ENTRY; i++)
-+			len += mt7996_amnt_dump(phy, skb, i, &attrtype);
-+	}
-+
-+	nla_nest_end(skb, b);
-+
-+	nla_put_u8(skb, MTK_VENDOR_ATTR_AMNT_DUMP_LEN, len);
-+
-+	nla_nest_end(skb, a);
-+
-+	return len + 1;
-+}
-+
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -76,10 +424,24 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = mu_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7966_vendor_amnt_ctrl,
-+		.dumpit = mt7966_vendor_amnt_ctrl_dump,
-+		.policy = amnt_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_AMNT_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
- {
- 	phy->mt76->hw->wiphy->vendor_commands = mt7996_vendor_commands;
- 	phy->mt76->hw->wiphy->n_vendor_commands = ARRAY_SIZE(mt7996_vendor_commands);
-+
-+	spin_lock_init(&phy->amnt_lock);
- }
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 8ac3ba8e..2078cafa 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -4,6 +4,7 @@
- #define MTK_NL80211_VENDOR_ID	0x0ce7
- 
- enum mtk_nl80211_vendor_subcmds {
-+	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
- };
- 
-@@ -19,4 +20,42 @@ enum mtk_vendor_attr_mu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
- };
- 
-+enum mtk_vendor_attr_mnt_ctrl {
-+	MTK_VENDOR_ATTR_AMNT_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_AMNT_CTRL_SET,
-+	MTK_VENDOR_ATTR_AMNT_CTRL_DUMP,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_AMNT_CTRL,
-+	MTK_VENDOR_ATTR_AMNT_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_AMNT_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_mnt_set {
-+	MTK_VENDOR_ATTR_AMNT_SET_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_AMNT_SET_INDEX,
-+	MTK_VENDOR_ATTR_AMNT_SET_MACADDR,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_AMNT_SET,
-+	MTK_VENDOR_ATTR_AMNT_SET_MAX =
-+		NUM_MTK_VENDOR_ATTRS_AMNT_SET - 1
-+};
-+
-+enum mtk_vendor_attr_mnt_dump {
-+	MTK_VENDOR_ATTR_AMNT_DUMP_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_AMNT_DUMP_INDEX,
-+	MTK_VENDOR_ATTR_AMNT_DUMP_LEN,
-+	MTK_VENDOR_ATTR_AMNT_DUMP_RESULT,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_AMNT_DUMP,
-+	MTK_VENDOR_ATTR_AMNT_DUMP_MAX =
-+		NUM_MTK_VENDOR_ATTRS_AMNT_DUMP - 1
-+};
-+
-+
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1014-mtk-wifi-mt76-mt7996-add-driver-support-for-wpa3-ocv.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1014-mtk-wifi-mt76-mt7996-add-driver-support-for-wpa3-ocv.patch
deleted file mode 100644
index ad4b610..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1014-mtk-wifi-mt76-mt7996-add-driver-support-for-wpa3-ocv.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From c8dbaeeaff01c35c7e27ef0958d812338e50c054 Mon Sep 17 00:00:00 2001
-From: mtk23510 <rudra.shahi@mediatek.com>
-Date: Fri, 24 Mar 2023 19:18:53 +0800
-Subject: [PATCH 1014/1044] mtk: wifi: mt76: mt7996: add driver support for
- wpa3 ocv and bp mt76
-
-Signed-off-by: mtk23510 <rudra.shahi@mediatek.com>
----
- mt7996/init.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/mt7996/init.c b/mt7996/init.c
-index fba61c01..1498787f 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -391,6 +391,8 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
- 
-+	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION);
-+	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
- 	if (!mdev->dev->of_node ||
- 	    !of_property_read_bool(mdev->dev->of_node,
- 				   "mediatek,disable-radar-background"))
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1015-mtk-wifi-mt76-mt7996-add-vendor-cmd-to-get-available.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1015-mtk-wifi-mt76-mt7996-add-vendor-cmd-to-get-available.patch
deleted file mode 100644
index dc1df69..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1015-mtk-wifi-mt76-mt7996-add-vendor-cmd-to-get-available.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From 109e8c6a16d948bb2b0b685a8d102e91bb89e4ed Mon Sep 17 00:00:00 2001
-From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
-Date: Wed, 3 May 2023 05:08:07 +0800
-Subject: [PATCH 1015/1044] mtk: wifi: mt76: mt7996: add vendor cmd to get
- available color bitmap
-
-Add a vendor cmd to notify user space available color bitmap.
-The OBSS BSS color bitmap is maintained in mac80211, so mt76 will make use of that.
-
-Signed-off-by: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
----
- mt7996/vendor.c | 36 ++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 11 +++++++++++
- 2 files changed, 47 insertions(+)
-
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index f3b089d7..39101577 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -35,6 +35,11 @@ amnt_dump_policy[NUM_MTK_VENDOR_ATTRS_AMNT_DUMP] = {
- 	[MTK_VENDOR_ATTR_AMNT_DUMP_RESULT] = { .type = NLA_NESTED },
- };
- 
-+static struct nla_policy
-+bss_color_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL] = {
-+	[MTK_VENDOR_ATTR_AVAL_BSS_COLOR_BMP] = { .type = NLA_U64 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -410,6 +415,26 @@ mt7966_vendor_amnt_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return len + 1;
- }
- 
-+static int
-+mt7996_vendor_bss_color_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+				  struct sk_buff *skb, const void *data, int data_len,
-+				  unsigned long *storage)
-+{
-+	struct ieee80211_vif *vif = wdev_to_ieee80211_vif(wdev);
-+	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
-+	int len = 0;
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	if (nla_put_u64_64bit(skb, MTK_VENDOR_ATTR_AVAL_BSS_COLOR_BMP,
-+			      ~bss_conf->used_color_bitmap, NL80211_ATTR_PAD))
-+		return -ENOMEM;
-+	len += 1;
-+
-+	return len;
-+}
- 
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
-@@ -436,6 +461,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = amnt_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_AMNT_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.dumpit = mt7996_vendor_bss_color_ctrl_dump,
-+		.policy = bss_color_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_BSS_COLOR_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 2078cafa..eec9e74a 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -6,6 +6,7 @@
- enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
-+	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- };
- 
- enum mtk_vendor_attr_mu_ctrl {
-@@ -57,5 +58,15 @@ enum mtk_vendor_attr_mnt_dump {
- 		NUM_MTK_VENDOR_ATTRS_AMNT_DUMP - 1
- };
- 
-+enum mtk_vendor_attr_bss_color_ctrl {
-+	MTK_VENDOR_ATTR_BSS_COLOR_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_AVAL_BSS_COLOR_BMP,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL,
-+	MTK_VENDOR_ATTR_BSS_COLOR_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL - 1
-+};
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1016-mtk-wifi-mt76-mt7996-add-debugfs-for-fw-coredump.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1016-mtk-wifi-mt76-mt7996-add-debugfs-for-fw-coredump.patch
deleted file mode 100644
index edd7ca9..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1016-mtk-wifi-mt76-mt7996-add-debugfs-for-fw-coredump.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From 69f8be02d97e911e0a844ac5a1a239a848d41930 Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Fri, 19 May 2023 14:56:07 +0800
-Subject: [PATCH 1016/1044] mtk: wifi: mt76: mt7996: add debugfs for fw
- coredump.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- mt7996/debugfs.c | 19 +++++++++++++++++--
- mt7996/mac.c     | 28 +++++++++++++++++++++++++---
- mt7996/mcu.h     |  4 ++++
- mt7996/mt7996.h  | 10 ++++++++++
- 4 files changed, 56 insertions(+), 5 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index ea78166b..7a03de12 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -84,6 +84,8 @@ mt7996_sys_recovery_set(struct file *file, const char __user *user_buf,
- 	 * 7: trigger & enable system error L4 mdp recovery.
- 	 * 8: trigger & enable system error full recovery.
- 	 * 9: trigger firmware crash.
-+	 * 10: trigger grab wa firmware coredump.
-+	 * 11: trigger grab wm firmware coredump.
- 	 */
- 	case UNI_CMD_SER_QUERY:
- 		ret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_QUERY, 0, band);
-@@ -105,15 +107,25 @@ mt7996_sys_recovery_set(struct file *file, const char __user *user_buf,
- 	/* enable full chip reset */
- 	case UNI_CMD_SER_SET_RECOVER_FULL:
- 		mt76_set(dev, MT_WFDMA0_MCU_HOST_INT_ENA, MT_MCU_CMD_WDT_MASK);
--		dev->recovery.state |= MT_MCU_CMD_WDT_MASK;
-+		dev->recovery.state |= MT_MCU_CMD_WM_WDT;
- 		mt7996_reset(dev);
- 		break;
- 
- 	/* WARNING: trigger firmware crash */
- 	case UNI_CMD_SER_SET_SYSTEM_ASSERT:
-+		// trigger wm assert exception
- 		ret = mt7996_mcu_trigger_assert(dev);
- 		if (ret)
- 			return ret;
-+		// trigger wa assert exception
-+		mt76_wr(dev, 0x89098108, 0x20);
-+		mt76_wr(dev, 0x89098118, 0x20);
-+		break;
-+	case UNI_CMD_SER_FW_COREDUMP_WA:
-+		mt7996_coredump(dev, MT7996_COREDUMP_MANUAL_WA);
-+		break;
-+	case UNI_CMD_SER_FW_COREDUMP_WM:
-+		mt7996_coredump(dev, MT7996_COREDUMP_MANUAL_WM);
- 		break;
- 	default:
- 		break;
-@@ -160,7 +172,10 @@ mt7996_sys_recovery_get(struct file *file, char __user *user_buf,
- 			  "8: trigger system error full recovery\n");
- 	desc += scnprintf(buff + desc, bufsz - desc,
- 			  "9: trigger firmware crash\n");
--
-+	desc += scnprintf(buff + desc, bufsz - desc,
-+			  "10: trigger grab wa firmware coredump\n");
-+	desc += scnprintf(buff + desc, bufsz - desc,
-+			  "11: trigger grab wm firmware coredump\n");
- 	/* SER statistics */
- 	desc += scnprintf(buff + desc, bufsz - desc,
- 			  "\nlet's dump firmware SER statistics...\n");
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index d55e5a76..1c1b3eb5 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -2080,15 +2080,36 @@ void mt7996_mac_dump_work(struct work_struct *work)
- 	struct mt7996_dev *dev;
- 
- 	dev = container_of(work, struct mt7996_dev, dump_work);
--	if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
-+	if (dev->dump_state == MT7996_COREDUMP_MANUAL_WA ||
-+	    READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WA_WDT)
- 		mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WA);
- 
--	if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WM_WDT)
-+	if (dev->dump_state == MT7996_COREDUMP_MANUAL_WM ||
-+	    READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WM_WDT)
- 		mt7996_mac_fw_coredump(dev, MT7996_RAM_TYPE_WM);
- 
--	queue_work(dev->mt76.wq, &dev->reset_work);
-+	if (READ_ONCE(dev->recovery.state) & MT_MCU_CMD_WDT_MASK)
-+		queue_work(dev->mt76.wq, &dev->reset_work);
-+
-+	dev->dump_state = MT7996_COREDUMP_IDLE;
- }
- 
-+void mt7996_coredump(struct mt7996_dev *dev, u8 state)
-+{
-+	if (state == MT7996_COREDUMP_IDLE ||
-+	    state >= __MT7996_COREDUMP_TYPE_MAX)
-+		return;
-+
-+	if (dev->dump_state != MT7996_COREDUMP_IDLE)
-+		return;
-+
-+	dev->dump_state = state;
-+	dev_info(dev->mt76.dev, "%s attempting grab coredump\n",
-+		 wiphy_name(dev->mt76.hw->wiphy));
-+
-+	queue_work(dev->mt76.wq, &dev->dump_work);
-+ }
-+
- void mt7996_reset(struct mt7996_dev *dev)
- {
- 	if (!dev->recovery.hw_init_done)
-@@ -2106,6 +2127,7 @@ void mt7996_reset(struct mt7996_dev *dev)
- 
- 		mt7996_irq_disable(dev, MT_INT_MCU_CMD);
- 		queue_work(dev->mt76.wq, &dev->dump_work);
-+		mt7996_coredump(dev, MT7996_COREDUMP_AUTO);
- 		return;
- 	}
- 
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 68bf82fc..35f757dc 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -956,7 +956,11 @@ enum {
- 	UNI_CMD_SER_SET_RECOVER_L3_BF,
- 	UNI_CMD_SER_SET_RECOVER_L4_MDP,
- 	UNI_CMD_SER_SET_RECOVER_FULL,
-+	/* fw assert */
- 	UNI_CMD_SER_SET_SYSTEM_ASSERT,
-+	/* coredump */
-+	UNI_CMD_SER_FW_COREDUMP_WA,
-+	UNI_CMD_SER_FW_COREDUMP_WM,
- 	/* action */
- 	UNI_CMD_SER_ENABLE = 1,
- 	UNI_CMD_SER_SET,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 09ce3c35..dd9aa9e2 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -139,6 +139,14 @@ enum mt7996_ram_type {
- 	__MT7996_RAM_TYPE_MAX,
- };
- 
-+enum mt7996_coredump_state {
-+	MT7996_COREDUMP_IDLE = 0,
-+	MT7996_COREDUMP_MANUAL_WA,
-+	MT7996_COREDUMP_MANUAL_WM,
-+	MT7996_COREDUMP_AUTO,
-+	__MT7996_COREDUMP_TYPE_MAX,
-+};
-+
- enum mt7996_txq_id {
- 	MT7996_TXQ_FWDL = 16,
- 	MT7996_TXQ_MCU_WM,
-@@ -388,6 +396,7 @@ struct mt7996_dev {
- 
- 	/* protects coredump data */
- 	struct mutex dump_mutex;
-+	u8 dump_state;
- #ifdef CONFIG_DEV_COREDUMP
- 	struct {
- 		struct mt7996_crash_data *crash_data[__MT7996_RAM_TYPE_MAX];
-@@ -573,6 +582,7 @@ void mt7996_init_txpower(struct mt7996_phy *phy);
- int mt7996_txbf_init(struct mt7996_dev *dev);
- int mt7996_get_chip_sku(struct mt7996_dev *dev);
- void mt7996_reset(struct mt7996_dev *dev);
-+void mt7996_coredump(struct mt7996_dev *dev, u8 state);
- int mt7996_run(struct ieee80211_hw *hw);
- int mt7996_mcu_init(struct mt7996_dev *dev);
- int mt7996_mcu_init_firmware(struct mt7996_dev *dev);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1017-mtk-wifi-mt76-mt7996-Add-mt7992-coredump-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1017-mtk-wifi-mt76-mt7996-Add-mt7992-coredump-support.patch
deleted file mode 100644
index f9e72ad..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1017-mtk-wifi-mt76-mt7996-Add-mt7992-coredump-support.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From 1be676a268fc923a68d8b0338b104f1ac76e0838 Mon Sep 17 00:00:00 2001
-From: Rex Lu <rex.lu@mediatek.com>
-Date: Mon, 25 Dec 2023 15:17:49 +0800
-Subject: [PATCH 1017/1044] mtk: wifi: mt76: mt7996: Add mt7992 coredump
- support
-
-1. Add mt7992 coredump support
-2. fixed if new ic have not support coredump, it may cause crash when remove module
-
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
----
- mt7996/coredump.c | 80 ++++++++++++++++++++++++++++++++++++++---------
- mt7996/mt7996.h   |  1 +
- 2 files changed, 67 insertions(+), 14 deletions(-)
-
-diff --git a/mt7996/coredump.c b/mt7996/coredump.c
-index a7f91b56..d09bcd4b 100644
---- a/mt7996/coredump.c
-+++ b/mt7996/coredump.c
-@@ -67,6 +67,44 @@ static const struct mt7996_mem_region mt7996_wa_mem_regions[] = {
- 	},
- };
- 
-+static const struct mt7996_mem_region mt7992_wm_mem_regions[] = {
-+	{
-+		.start = 0x00800000,
-+		.len = 0x0004bfff,
-+		.name = "ULM0",
-+	},
-+	{
-+		.start = 0x00900000,
-+		.len = 0x00035fff,
-+		.name = "ULM1",
-+	},
-+	{
-+		.start = 0x02200000,
-+		.len = 0x0003ffff,
-+		.name = "ULM2",
-+	},
-+	{
-+		.start = 0x00400000,
-+		.len = 0x00027fff,
-+		.name = "SRAM",
-+	},
-+	{
-+		.start = 0xe0000000,
-+		.len = 0x0015ffff,
-+		.name = "CRAM0",
-+	},
-+	{
-+		.start = 0xe0160000,
-+		.len = 0x00c7fff,
-+		.name = "CRAM1",
-+	},
-+	{
-+		.start = 0x7c050000,
-+		.len = 0x00007fff,
-+		.name = "CONN_INFRA",
-+	},
-+};
-+
- const struct mt7996_mem_region*
- mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
- {
-@@ -80,6 +118,14 @@ mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u8 type, u32 *num)
- 
- 		*num = ARRAY_SIZE(mt7996_wm_mem_regions);
- 		return &mt7996_wm_mem_regions[0];
-+	case 0x7992:
-+		if (type == MT7996_RAM_TYPE_WA) {
-+			/* mt7992 wa memory regions is the same as mt7996 */
-+			*num = ARRAY_SIZE(mt7996_wa_mem_regions);
-+			return &mt7996_wa_mem_regions[0];
-+		}
-+		*num = ARRAY_SIZE(mt7992_wm_mem_regions);
-+		return &mt7992_wm_mem_regions[0];
- 	default:
- 		return NULL;
- 	}
-@@ -115,7 +161,7 @@ struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev, u8 type)
- 
- 	lockdep_assert_held(&dev->dump_mutex);
- 
--	if (!coredump_memdump)
-+	if (!coredump_memdump || !crash_data->supported)
- 		return NULL;
- 
- 	guid_gen(&crash_data->guid);
-@@ -289,40 +335,46 @@ int mt7996_coredump_register(struct mt7996_dev *dev)
- 	for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
- 		crash_data = vzalloc(sizeof(*dev->coredump.crash_data[i]));
- 		if (!crash_data)
--			return -ENOMEM;
-+			goto nomem;
- 
- 		dev->coredump.crash_data[i] = crash_data;
-+		crash_data->supported = false;
- 
- 		if (coredump_memdump) {
- 			crash_data->memdump_buf_len = mt7996_coredump_get_mem_size(dev, i);
- 			if (!crash_data->memdump_buf_len)
- 				/* no memory content */
--				return 0;
-+				continue;
- 
- 			crash_data->memdump_buf = vzalloc(crash_data->memdump_buf_len);
--			if (!crash_data->memdump_buf) {
--				vfree(crash_data);
--				return -ENOMEM;
--			}
-+			if (!crash_data->memdump_buf)
-+				goto nomem;
-+
-+			crash_data->supported = true;
- 		}
- 	}
- 
- 	return 0;
-+nomem:
-+	mt7996_coredump_unregister(dev);
-+	return -ENOMEM;
- }
- 
- void mt7996_coredump_unregister(struct mt7996_dev *dev)
- {
- 	int i;
-+	struct mt7996_crash_data *crash_data;
- 
- 	for (i = 0; i < MT7996_COREDUMP_MAX; i++) {
--		if (dev->coredump.crash_data[i]->memdump_buf) {
--			vfree(dev->coredump.crash_data[i]->memdump_buf);
--			dev->coredump.crash_data[i]->memdump_buf = NULL;
--			dev->coredump.crash_data[i]->memdump_buf_len = 0;
--		}
-+		crash_data = dev->coredump.crash_data[i];
-+
-+		if (!crash_data)
-+			continue;
-+
-+		if (crash_data->memdump_buf)
-+			vfree(crash_data->memdump_buf);
- 
--		vfree(dev->coredump.crash_data[i]);
--		dev->coredump.crash_data[i] = NULL;
-+		vfree(crash_data);
- 	}
- }
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index dd9aa9e2..7ca9d57e 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -230,6 +230,7 @@ struct mt7996_vif {
- struct mt7996_crash_data {
- 	guid_t guid;
- 	struct timespec64 timestamp;
-+	bool supported;
- 
- 	u8 *memdump_buf;
- 	size_t memdump_buf_len;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1018-mtk-wifi-mt76-mt7996-add-support-for-runtime-set-in-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1018-mtk-wifi-mt76-mt7996-add-support-for-runtime-set-in-.patch
deleted file mode 100644
index b7304e5..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1018-mtk-wifi-mt76-mt7996-add-support-for-runtime-set-in-.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 839e8ed5ee7eb48dd885a1f8f26a8ea9b27517ca Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Tue, 6 Jun 2023 16:57:10 +0800
-Subject: [PATCH 1018/1044] mtk: wifi: mt76: mt7996: add support for runtime
- set in-band discovery
-
-with this patch, AP can runtime set inband discovery via hostapd_cli
-
-Usage:
-Enable FILS: hostapd_cli -i [interface] inband_discovery 2 20
-Enable UBPR: hostapd_cli -i [interface] inband_discovery 1 20
-Disable inband discovery: hostapd_cli -i [interface] inband_discovery 0 0
-
-Signed-off-by: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
----
- mt7996/mcu.c | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 8348d22a..cd7f58c3 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -2605,8 +2605,7 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev,
- 	if (IS_ERR(rskb))
- 		return PTR_ERR(rskb);
- 
--	if (changed & BSS_CHANGED_FILS_DISCOVERY &&
--	    vif->bss_conf.fils_discovery.max_interval) {
-+	if (changed & BSS_CHANGED_FILS_DISCOVERY) {
- 		interval = vif->bss_conf.fils_discovery.max_interval;
- 		skb = ieee80211_get_fils_discovery_tmpl(hw, vif);
- 	} else if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP &&
-@@ -2641,7 +2640,7 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev,
- 	discov->tx_type = !!(changed & BSS_CHANGED_FILS_DISCOVERY);
- 	discov->tx_interval = interval;
- 	discov->prob_rsp_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
--	discov->enable = true;
-+	discov->enable = !!(interval);
- 	discov->wcid = cpu_to_le16(MT7996_WTBL_RESERVED);
- 
- 	buf = (u8 *)tlv + sizeof(*discov);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1019-mtk-wifi-mt76-mt7996-add-vendor-subcmd-EDCCA-ctrl-en.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1019-mtk-wifi-mt76-mt7996-add-vendor-subcmd-EDCCA-ctrl-en.patch
deleted file mode 100644
index fb38f6a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1019-mtk-wifi-mt76-mt7996-add-vendor-subcmd-EDCCA-ctrl-en.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-From 2caf106ced738d65640e21d284e3fee9cb04c611 Mon Sep 17 00:00:00 2001
-From: mtk27745 <rex.lu@mediatek.com>
-Date: Thu, 8 Jun 2023 20:21:04 +0800
-Subject: [PATCH 1019/1044] mtk: wifi: mt76: mt7996: add vendor subcmd EDCCA
- ctrl enable
-
----
- mt7996/mcu.h     |   2 +
- mt7996/mt7996.h  |  11 ++++
- mt7996/mtk_mcu.c |  87 +++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.h |  15 ++++++
- mt7996/vendor.c  | 132 +++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h  |  33 ++++++++++++
- 6 files changed, 280 insertions(+)
-
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 35f757dc..34fdfb26 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -845,6 +845,8 @@ mt7996_get_power_bound(struct mt7996_phy *phy, s8 txpower)
- 
- enum {
- 	UNI_BAND_CONFIG_RADIO_ENABLE,
-+	UNI_BAND_CONFIG_EDCCA_ENABLE = 0x05,
-+	UNI_BAND_CONFIG_EDCCA_THRESHOLD = 0x06,
- 	UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08,
- };
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 7ca9d57e..cfa50bfe 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -786,6 +786,17 @@ int mt7996_vendor_amnt_sta_remove(struct mt7996_phy *phy,
- 				  struct ieee80211_sta *sta);
- #endif
- 
-+int mt7996_mcu_edcca_enable(struct mt7996_phy *phy, bool enable);
-+int mt7996_mcu_edcca_threshold_ctrl(struct mt7996_phy *phy, u8 *value, bool set);
-+
-+enum edcca_bw_id {
-+	EDCCA_BW_20 = 0,
-+	EDCCA_BW_40,
-+	EDCCA_BW_80,
-+	EDCCA_BW_160,
-+	EDCCA_MAX_BW_NUM,
-+};
-+
- #ifdef CONFIG_MTK_DEBUG
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
- int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index e56ddd8f..5c54d02c 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -59,4 +59,91 @@ int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val)
- 	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &req,
- 				 sizeof(req), true);
- }
-+
-+int mt7996_mcu_edcca_enable(struct mt7996_phy *phy, bool enable)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
-+	enum nl80211_band band = chandef->chan->band;
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 enable;
-+		u8 std;
-+		u8 _rsv2[2];
-+	} __packed req = {
-+		.band_idx = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(UNI_BAND_CONFIG_EDCCA_ENABLE),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.enable = enable,
-+		.std = EDCCA_DEFAULT,
-+	};
-+
-+	switch (dev->mt76.region) {
-+	case NL80211_DFS_JP:
-+		req.std = EDCCA_JAPAN;
-+		break;
-+	case NL80211_DFS_FCC:
-+		if (band == NL80211_BAND_6GHZ)
-+			req.std = EDCCA_FCC;
-+		break;
-+	case NL80211_DFS_ETSI:
-+		if (band == NL80211_BAND_6GHZ)
-+			req.std = EDCCA_ETSI;
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(BAND_CONFIG),
-+				 &req, sizeof(req), true);
-+}
-+
-+int mt7996_mcu_edcca_threshold_ctrl(struct mt7996_phy *phy, u8 *value, bool set)
-+{
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 threshold[4];
-+		bool init;
-+	} __packed *res, req = {
-+		.band_idx = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(UNI_BAND_CONFIG_EDCCA_THRESHOLD),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.init = false,
-+	};
-+	struct sk_buff *skb;
-+	int ret;
-+	int i;
-+
-+	for (i = 0; i < EDCCA_MAX_BW_NUM; i++)
-+		req.threshold[i] = value[i];
-+
-+	if (set)
-+		return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(BAND_CONFIG),
-+					 &req, sizeof(req), true);
-+
-+	ret = mt76_mcu_send_and_get_msg(&phy->dev->mt76,
-+					MCU_WM_UNI_CMD_QUERY(BAND_CONFIG),
-+					&req, sizeof(req), true, &skb);
-+
-+	if (ret)
-+		return ret;
-+
-+	res = (void *)skb->data;
-+
-+	for (i = 0; i < EDCCA_MAX_BW_NUM; i++)
-+		value[i] = res->threshold[i];
-+
-+	dev_kfree_skb(skb);
-+
-+	return 0;
-+}
-+
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index c30418ca..36a58ad6 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -106,6 +106,21 @@ enum txpower_event {
- 	UNI_TXPOWER_PHY_RATE_INFO = 5,
- };
- 
-+enum {
-+	EDCCA_CTRL_SET_EN = 0,
-+	EDCCA_CTRL_SET_THRES,
-+	EDCCA_CTRL_GET_EN,
-+	EDCCA_CTRL_GET_THRES,
-+	EDCCA_CTRL_NUM,
-+};
-+
-+enum {
-+	EDCCA_DEFAULT = 0,
-+	EDCCA_FCC = 1,
-+	EDCCA_ETSI = 2,
-+	EDCCA_JAPAN = 3
-+};
-+
- #endif
- 
- #endif
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index 39101577..9f333d0e 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -40,6 +40,26 @@ bss_color_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL] = {
- 	[MTK_VENDOR_ATTR_AVAL_BSS_COLOR_BMP] = { .type = NLA_U64 },
- };
- 
-+static const struct nla_policy
-+edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_MODE] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_S8 },
-+	[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL] = { .type = NLA_U8 },
-+};
-+
-+static const struct nla_policy
-+edcca_dump_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP] = {
-+	[MTK_VENDOR_ATTR_EDCCA_DUMP_MODE] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_DUMP_PRI20_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_DUMP_SEC40_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_DUMP_SEC80_VAL] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_EDCCA_DUMP_SEC160_VAL] = { .type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -436,6 +456,106 @@ mt7996_vendor_bss_color_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev
- 	return len;
- }
- 
-+static int mt7996_vendor_edcca_ctrl(struct wiphy *wiphy, struct wireless_dev *wdev,
-+				    const void *data, int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL];
-+	int err;
-+	u8 edcca_mode;
-+	u8 edcca_value[EDCCA_MAX_BW_NUM];
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_EDCCA_CTRL_MAX, data, data_len,
-+			edcca_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb[MTK_VENDOR_ATTR_EDCCA_CTRL_MODE])
-+		return -EINVAL;
-+
-+	edcca_mode = nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_MODE]);
-+	if (edcca_mode == EDCCA_CTRL_SET_EN) {
-+		if (!tb[MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL])
-+			return -EINVAL;
-+
-+		edcca_value[0] =
-+			nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL]);
-+
-+		err = mt7996_mcu_edcca_enable(phy, !!edcca_value[0]);
-+		if (err)
-+			return err;
-+	} else if (edcca_mode == EDCCA_CTRL_SET_THRES) {
-+		if (!tb[MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL] ||
-+		    !tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL] ||
-+		    !tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL] ||
-+		    !tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL]) {
-+			return -EINVAL;
-+		}
-+		edcca_value[EDCCA_BW_20] =
-+			nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL]);
-+		edcca_value[EDCCA_BW_40] =
-+			nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL]);
-+		edcca_value[EDCCA_BW_80] =
-+			nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL]);
-+		edcca_value[EDCCA_BW_160] =
-+			nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL]);
-+
-+		err = mt7996_mcu_edcca_threshold_ctrl(phy, edcca_value, true);
-+
-+		if (err)
-+			return err;
-+	} else {
-+		return -EINVAL;
-+	}
-+
-+	return 0;
-+}
-+
-+
-+static int
-+mt7996_vendor_edcca_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			     struct sk_buff *skb, const void *data, int data_len,
-+			     unsigned long *storage)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL];
-+	int err;
-+	u8 edcca_mode;
-+	u8 value[EDCCA_MAX_BW_NUM];
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_EDCCA_CTRL_MAX, data, data_len,
-+			edcca_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb[MTK_VENDOR_ATTR_EDCCA_CTRL_MODE])
-+		return -EINVAL;
-+
-+	edcca_mode = nla_get_u8(tb[MTK_VENDOR_ATTR_EDCCA_CTRL_MODE]);
-+
-+	if (edcca_mode != EDCCA_CTRL_GET_THRES)
-+		return -EINVAL;
-+
-+	err = mt7996_mcu_edcca_threshold_ctrl(phy, value, false);
-+
-+	if (err)
-+		return err;
-+
-+	if (nla_put_u8(skb, MTK_VENDOR_ATTR_EDCCA_DUMP_PRI20_VAL, value[EDCCA_BW_20]) ||
-+	    nla_put_u8(skb, MTK_VENDOR_ATTR_EDCCA_DUMP_SEC40_VAL, value[EDCCA_BW_40]) ||
-+	    nla_put_u8(skb, MTK_VENDOR_ATTR_EDCCA_DUMP_SEC80_VAL, value[EDCCA_BW_80]) ||
-+	    nla_put_u8(skb, MTK_VENDOR_ATTR_EDCCA_DUMP_SEC160_VAL, value[EDCCA_BW_160]))
-+		return -ENOMEM;
-+
-+	return EDCCA_MAX_BW_NUM;
-+}
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -472,6 +592,18 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = bss_color_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_BSS_COLOR_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_edcca_ctrl,
-+		.dumpit = mt7996_vendor_edcca_ctrl_dump,
-+		.policy = edcca_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_EDCCA_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index eec9e74a..4465bc9d 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -6,9 +6,42 @@
- enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
-+	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- };
- 
-+enum mtk_vendor_attr_edcca_ctrl {
-+	MTK_VENDOR_ATTR_EDCCA_THRESHOLD_INVALID = 0,
-+
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_MODE,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_PRI20_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_SEC20_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_SEC40_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_SEC80_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_SEC160_VAL,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL,
-+	MTK_VENDOR_ATTR_EDCCA_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_edcca_dump {
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_UNSPEC = 0,
-+
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_MODE,
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_PRI20_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_SEC40_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_SEC80_VAL,
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_SEC160_VAL,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP,
-+	MTK_VENDOR_ATTR_EDCCA_DUMP_MAX =
-+		NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP - 1
-+};
-+
- enum mtk_vendor_attr_mu_ctrl {
- 	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1020-mtk-wifi-mt76-mt7996-add-support-spatial-reuse-debug.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1020-mtk-wifi-mt76-mt7996-add-support-spatial-reuse-debug.patch
deleted file mode 100644
index 0ae3fc9..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1020-mtk-wifi-mt76-mt7996-add-support-spatial-reuse-debug.patch
+++ /dev/null
@@ -1,397 +0,0 @@
-From 090298f97be235c284e47dc8302a39da2f1fa855 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Mon, 10 Jul 2023 11:47:29 +0800
-Subject: [PATCH 1020/1044] mtk: wifi: mt76: mt7996: add support spatial reuse
- debug commands
-
-This commit adds the following debug commands in debugfs:
-1. sr_enable: enable/disable spatial reuse feature. Default is on.
-2. sr_enhanced_enable: enable/disable enhanced spatial reuse feature.
-Default is on. This feature is mtk proprietary feature.
-3. sr_stats: Check the Spatial reuse tx statistics.
-4. sr_scene_cond: Check the result of mtk scene detection algorithm. Mtk
-scene detection algorithm in firmware may decide whether current
-environment can SR Tx or not.
-
-To learn more details of these commands, please check:
-https://wiki.mediatek.inc/display/APKB/mt76+Phy+feature+debug+Cheetsheet#mt76PhyfeaturedebugCheetsheet-SpatialReuse
-
----
- mt76_connac_mcu.h    |   1 +
- mt7996/main.c        |   6 +++
- mt7996/mcu.c         |   8 ++++
- mt7996/mt7996.h      |   6 +++
- mt7996/mtk_debugfs.c |  82 ++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.c     | 111 +++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.h     |  56 ++++++++++++++++++++++
- 7 files changed, 270 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 062268d6..9edb580c 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1040,6 +1040,7 @@ enum {
- 	MCU_UNI_EVENT_BSS_BEACON_LOSS = 0x0c,
- 	MCU_UNI_EVENT_SCAN_DONE = 0x0e,
- 	MCU_UNI_EVENT_RDD_REPORT = 0x11,
-+	MCU_UNI_EVENT_SR = 0x25,
- 	MCU_UNI_EVENT_ROC = 0x27,
- 	MCU_UNI_EVENT_TX_DONE = 0x2d,
- 	MCU_UNI_EVENT_BF = 0x33,
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 478ca7ce..9ca37e1e 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -6,6 +6,9 @@
- #include "mt7996.h"
- #include "mcu.h"
- #include "mac.h"
-+#ifdef CONFIG_MTK_DEBUG
-+#include "mtk_mcu.h"
-+#endif
- 
- static bool mt7996_dev_running(struct mt7996_dev *dev)
- {
-@@ -78,6 +81,9 @@ int mt7996_run(struct ieee80211_hw *hw)
- 		goto out;
- 
- #ifdef CONFIG_MTK_DEBUG
-+	phy->sr_enable = true;
-+	phy->enhanced_sr_enable = true;
-+
- 	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL,
- 					   !dev->dbg.sku_disable);
- #else
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index cd7f58c3..16341a41 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -712,6 +712,14 @@ mt7996_mcu_uni_rx_unsolicited_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	case MCU_UNI_EVENT_WED_RRO:
- 		mt7996_mcu_wed_rro_event(dev, skb);
- 		break;
-+#ifdef CONFIG_MTK_DEBUG
-+	case MCU_UNI_EVENT_SR:
-+		mt7996_mcu_rx_sr_event(dev, skb);
-+		break;
-+#endif
-+	case MCU_UNI_EVENT_THERMAL:
-+		mt7996_mcu_rx_thermal_notify(dev, skb);
-+		break;
- #ifdef CONFIG_NL80211_TESTMODE
- 	case MCU_UNI_EVENT_TESTMODE_CTRL:
- 		mt7996_tm_rf_test_event(dev, skb);
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index cfa50bfe..adb0cdd1 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -352,6 +352,10 @@ struct mt7996_phy {
- 	spinlock_t amnt_lock;
- 	struct mt7996_air_monitor_ctrl amnt_ctrl;
- #endif
-+#ifdef CONFIG_MTK_DEBUG
-+	bool sr_enable:1;
-+	bool enhanced_sr_enable:1;
-+#endif
- };
- 
- struct mt7996_dev {
-@@ -800,6 +804,8 @@ enum edcca_bw_id {
- #ifdef CONFIG_MTK_DEBUG
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
- int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
-+int mt7996_mcu_set_sr_enable(struct mt7996_phy *phy, u8 action, u64 val, bool set);
-+void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 09652ef5..ed01c089 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2777,6 +2777,83 @@ static int mt7996_show_eeprom_mode(struct seq_file *s, void *data)
- 	return 0;
- }
- 
-+static int
-+mt7996_sr_enable_get(void *data, u64 *val)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	*val = phy->sr_enable;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_sr_enable_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+	int ret;
-+
-+	if (!!val == phy->sr_enable)
-+		return 0;
-+
-+	ret = mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_CFG_SR_ENABLE, val, true);
-+	if (ret)
-+		return ret;
-+
-+	return mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_CFG_SR_ENABLE, 0, false);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_sr_enable, mt7996_sr_enable_get,
-+			 mt7996_sr_enable_set, "%lld\n");
-+static int
-+mt7996_sr_enhanced_enable_get(void *data, u64 *val)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	*val = phy->enhanced_sr_enable;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_sr_enhanced_enable_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+	int ret;
-+
-+	if (!!val == phy->enhanced_sr_enable)
-+		return 0;
-+
-+	ret = mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_HW_ENHANCE_SR_ENABLE, val, true);
-+	if (ret)
-+		return ret;
-+
-+	return mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_HW_ENHANCE_SR_ENABLE, 0, false);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_sr_enhanced_enable, mt7996_sr_enhanced_enable_get,
-+			 mt7996_sr_enhanced_enable_set, "%lld\n");
-+
-+static int
-+mt7996_sr_stats_show(struct seq_file *file, void *data)
-+{
-+	struct mt7996_phy *phy = file->private;
-+
-+	mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_HW_IND, 0, false);
-+
-+	return 0;
-+}
-+DEFINE_SHOW_ATTRIBUTE(mt7996_sr_stats);
-+
-+static int
-+mt7996_sr_scene_cond_show(struct seq_file *file, void *data)
-+{
-+	struct mt7996_phy *phy = file->private;
-+
-+	mt7996_mcu_set_sr_enable(phy, UNI_CMD_SR_SW_SD, 0, false);
-+
-+	return 0;
-+}
-+DEFINE_SHOW_ATTRIBUTE(mt7996_sr_scene_cond);
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2856,6 +2933,11 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	debugfs_create_u8("sku_disable", 0600, dir, &dev->dbg.sku_disable);
- 	debugfs_create_file("scs_enable", 0200, dir, phy, &fops_scs_enable);
- 
-+	debugfs_create_file("sr_enable", 0600, dir, phy, &fops_sr_enable);
-+	debugfs_create_file("sr_enhanced_enable", 0600, dir, phy, &fops_sr_enhanced_enable);
-+	debugfs_create_file("sr_stats", 0400, dir, phy, &mt7996_sr_stats_fops);
-+	debugfs_create_file("sr_scene_cond", 0400, dir, phy, &mt7996_sr_scene_cond_fops);
-+
- 	return 0;
- }
- 
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index 5c54d02c..dbdf8d80 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -146,4 +146,115 @@ int mt7996_mcu_edcca_threshold_ctrl(struct mt7996_phy *phy, u8 *value, bool set)
- 	return 0;
- }
- 
-+int mt7996_mcu_set_sr_enable(struct mt7996_phy *phy, u8 action, u64 val, bool set)
-+{
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le32 val;
-+
-+	} __packed req = {
-+		.band_idx = phy->mt76->band_idx,
-+
-+		.tag = cpu_to_le16(action),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+
-+		.val = cpu_to_le32((u32) val),
-+	};
-+
-+	if (set)
-+		return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(SR), &req,
-+					 sizeof(req), false);
-+	else
-+		return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD_QUERY(SR), &req,
-+					 sizeof(req), false);
-+}
-+
-+void mt7996_mcu_rx_sr_swsd(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+#define SR_SCENE_DETECTION_TIMER_PERIOD_MS 500
-+	struct mt7996_mcu_sr_swsd_event *event;
-+	static const char * const rules[] = {"1 - NO CONNECTED", "2 - NO CONGESTION",
-+					     "3 - NO INTERFERENCE", "4 - SR ON"};
-+	u8 idx;
-+
-+	event = (struct mt7996_mcu_sr_swsd_event *)skb->data;
-+	idx = event->basic.band_idx;
-+
-+	dev_info(dev->mt76.dev, "Band index = %u\n", le16_to_cpu(event->basic.band_idx));
-+	dev_info(dev->mt76.dev, "Hit Rule = %s\n", rules[event->tlv[idx].rule]);
-+	dev_info(dev->mt76.dev, "Timer Period = %d(us)\n"
-+		 "Congestion Ratio  = %d.%1d%%\n",
-+		 SR_SCENE_DETECTION_TIMER_PERIOD_MS * 1000,
-+		 le32_to_cpu(event->tlv[idx].total_airtime_ratio) / 10,
-+		 le32_to_cpu(event->tlv[idx].total_airtime_ratio) % 10);
-+	dev_info(dev->mt76.dev,
-+		 "Total Airtime = %d(us)\n"
-+		 "ChBusy = %d\n"
-+		 "SrTx = %d\n"
-+		 "OBSS = %d\n"
-+		 "MyTx = %d\n"
-+		 "MyRx = %d\n"
-+		 "Interference Ratio = %d.%1d%%\n",
-+		 le32_to_cpu(event->tlv[idx].total_airtime),
-+		 le32_to_cpu(event->tlv[idx].channel_busy_time),
-+		 le32_to_cpu(event->tlv[idx].sr_tx_airtime),
-+		 le32_to_cpu(event->tlv[idx].obss_airtime),
-+		 le32_to_cpu(event->tlv[idx].my_tx_airtime),
-+		 le32_to_cpu(event->tlv[idx].my_rx_airtime),
-+		 le32_to_cpu(event->tlv[idx].obss_airtime_ratio) / 10,
-+		 le32_to_cpu(event->tlv[idx].obss_airtime_ratio) % 10);
-+}
-+
-+void mt7996_mcu_rx_sr_hw_indicator(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+	struct mt7996_mcu_sr_hw_ind_event *event;
-+
-+	event = (struct mt7996_mcu_sr_hw_ind_event *)skb->data;
-+
-+	dev_info(dev->mt76.dev, "Inter PPDU Count = %u\n",
-+		 le16_to_cpu(event->inter_bss_ppdu_cnt));
-+	dev_info(dev->mt76.dev, "SR Valid Count = %u\n",
-+		 le16_to_cpu(event->non_srg_valid_cnt));
-+	dev_info(dev->mt76.dev, "SR Tx Count = %u\n",
-+		 le32_to_cpu(event->sr_ampdu_mpdu_cnt));
-+	dev_info(dev->mt76.dev, "SR Tx Acked Count = %u\n",
-+		 le32_to_cpu(event->sr_ampdu_mpdu_acked_cnt));
-+}
-+
-+void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+	struct mt76_phy *mphy = &dev->mt76.phy;
-+	struct mt7996_phy *phy;
-+	struct mt7996_mcu_sr_common_event *event;
-+
-+	event = (struct mt7996_mcu_sr_common_event *)skb->data;
-+	mphy = dev->mt76.phys[event->basic.band_idx];
-+	if (!mphy)
-+		return;
-+
-+	phy = (struct mt7996_phy *)mphy->priv;
-+
-+	switch (le16_to_cpu(event->basic.tag)) {
-+	case UNI_EVENT_SR_CFG_SR_ENABLE:
-+		phy->sr_enable = le32_to_cpu(event->value) ? true : false;
-+		break;
-+	case UNI_EVENT_SR_HW_ESR_ENABLE:
-+		phy->enhanced_sr_enable = le32_to_cpu(event->value) ? true : false;
-+		break;
-+	case UNI_EVENT_SR_SW_SD:
-+		mt7996_mcu_rx_sr_swsd(dev, skb);
-+		break;
-+	case UNI_EVENT_SR_HW_IND:
-+		mt7996_mcu_rx_sr_hw_indicator(dev, skb);
-+		break;
-+	default:
-+		dev_info(dev->mt76.dev, "Unknown SR event tag %d\n",
-+			 le16_to_cpu(event->basic.tag));
-+	}
-+}
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 36a58ad6..098e63ae 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -121,6 +121,62 @@ enum {
- 	EDCCA_JAPAN = 3
- };
- 
-+enum {
-+	UNI_EVENT_SR_CFG_SR_ENABLE = 0x1,
-+	UNI_EVENT_SR_SW_SD = 0x83,
-+	UNI_EVENT_SR_HW_IND = 0xC9,
-+	UNI_EVENT_SR_HW_ESR_ENABLE = 0xD8,
-+};
-+enum {
-+	UNI_CMD_SR_CFG_SR_ENABLE = 0x1,
-+	UNI_CMD_SR_SW_SD = 0x84,
-+	UNI_CMD_SR_HW_IND = 0xCB,
-+	UNI_CMD_SR_HW_ENHANCE_SR_ENABLE = 0xDA,
-+};
-+
-+struct mt7996_mcu_sr_basic_event {
-+	struct mt7996_mcu_rxd rxd;
-+
-+	u8 band_idx;
-+	u8 _rsv[3];
-+
-+	__le16 tag;
-+	__le16 len;
-+};
-+
-+struct sr_sd_tlv {
-+	u8 _rsv[16];
-+	__le32 sr_tx_airtime;
-+	__le32 obss_airtime;
-+	__le32 my_tx_airtime;
-+	__le32 my_rx_airtime;
-+	__le32 channel_busy_time;
-+	__le32 total_airtime;
-+	__le32 total_airtime_ratio;
-+	__le32 obss_airtime_ratio;
-+	u8 rule;
-+	u8 _rsv2[59];
-+} __packed;
-+
-+struct mt7996_mcu_sr_swsd_event {
-+	struct mt7996_mcu_sr_basic_event basic;
-+	struct sr_sd_tlv tlv[3];
-+} __packed;
-+
-+struct mt7996_mcu_sr_common_event {
-+	struct mt7996_mcu_sr_basic_event basic;
-+	__le32 value;
-+};
-+
-+struct mt7996_mcu_sr_hw_ind_event {
-+	struct mt7996_mcu_sr_basic_event basic;
-+	__le16 non_srg_valid_cnt;
-+	u8 _rsv[4];
-+	__le16 inter_bss_ppdu_cnt;
-+	u8 _rsv2[4];
-+	__le32 sr_ampdu_mpdu_cnt;
-+	__le32 sr_ampdu_mpdu_acked_cnt;
-+};
- #endif
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1021-mtk-wifi-mt76-mt7996-Establish-BA-in-VO-queue.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1021-mtk-wifi-mt76-mt7996-Establish-BA-in-VO-queue.patch
deleted file mode 100644
index bb58282..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1021-mtk-wifi-mt76-mt7996-Establish-BA-in-VO-queue.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 424dc1cf297e6bf20ed5c430d215f64517178270 Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Tue, 1 Aug 2023 16:02:28 +0800
-Subject: [PATCH 1021/1044] mtk: wifi: mt76: mt7996: Establish BA in VO queue
-
----
- mt7996/mac.c | 2 --
- 1 file changed, 2 deletions(-)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 1c1b3eb5..4e52aa1b 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1032,8 +1032,6 @@ mt7996_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb)
- 		return;
- 
- 	tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
--	if (tid >= 6) /* skip VO queue */
--		return;
- 
- 	if (is_8023) {
- 		fc = IEEE80211_FTYPE_DATA |
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1022-mtk-wifi-mt76-mt7996-add-eagle-iFEM-HWITS-ZWDFS-SW-w.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1022-mtk-wifi-mt76-mt7996-add-eagle-iFEM-HWITS-ZWDFS-SW-w.patch
deleted file mode 100644
index ebd565c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1022-mtk-wifi-mt76-mt7996-add-eagle-iFEM-HWITS-ZWDFS-SW-w.patch
+++ /dev/null
@@ -1,155 +0,0 @@
-From b0a949cc4ac49a2a276949ebbd0cbecc859c8576 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Wed, 5 Jul 2023 10:00:17 +0800
-Subject: [PATCH 1022/1044] mtk: wifi: mt76: mt7996: add eagle iFEM HWITS ZWDFS
- SW workaround
-
-Fix the case that control channel is not first chan during first
-interface setup.
-Refactor ifem adie logic (if/else to switch, use sku_type & fem_type)
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/main.c   | 65 ++++++++++++++++++++++++++++++++++++++++++++++---
- mt7996/mcu.c    |  6 +++--
- mt7996/mt7996.h |  1 +
- 3 files changed, 67 insertions(+), 5 deletions(-)
-
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 9ca37e1e..dbe3d33f 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -1431,6 +1431,61 @@ mt7996_twt_teardown_request(struct ieee80211_hw *hw,
- 	mutex_unlock(&dev->mt76.mutex);
- }
- 
-+static void
-+mt7996_background_radar_handle_7975_ifem(struct ieee80211_hw *hw,
-+					 struct cfg80211_chan_def *user_chandef,
-+					 struct cfg80211_chan_def *fw_chandef)
-+{
-+	struct mt7996_dev *dev = mt7996_hw_dev(hw);
-+	struct cfg80211_chan_def *c = user_chandef;
-+	struct ieee80211_channel *first_chan;
-+	bool is_ifem_adie, expand = false;
-+
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		is_ifem_adie = dev->fem_type == MT7996_FEM_INT &&
-+			       dev->chip_sku != MT7996_SKU_233;
-+		break;
-+	case 0x7992:
-+		is_ifem_adie = dev->chip_sku == MT7992_SKU_44 &&
-+			       dev->fem_type != MT7996_FEM_EXT;
-+		break;
-+	default:
-+		return;
-+	}
-+
-+	if (!user_chandef || !is_ifem_adie)
-+		goto out;
-+
-+	if (user_chandef->width == NL80211_CHAN_WIDTH_160) {
-+		first_chan = ieee80211_get_channel(hw->wiphy, user_chandef->center_freq1 - 70);
-+		if (dev->bg_nxt_freq)
-+			goto out;
-+
-+		if (first_chan->flags & IEEE80211_CHAN_RADAR)
-+			dev->bg_nxt_freq = first_chan->center_freq;
-+		else
-+			c = fw_chandef;
-+
-+		c->chan = ieee80211_get_channel(hw->wiphy, first_chan->center_freq + 80);
-+	} else {
-+		if (!dev->bg_nxt_freq)
-+			goto out;
-+
-+		c->chan = ieee80211_get_channel(hw->wiphy, dev->bg_nxt_freq);
-+		dev->bg_nxt_freq = 0;
-+		expand = true;
-+	}
-+	c->width = NL80211_CHAN_WIDTH_80;
-+	c->center_freq1 = c->chan->center_freq + 30;
-+
-+	if (c == user_chandef)
-+		cfg80211_background_radar_update_channel(hw->wiphy, c, expand);
-+	return;
-+out:
-+	dev->bg_nxt_freq = 0;
-+}
-+
- static int
- mt7996_set_radar_background(struct ieee80211_hw *hw,
- 			    struct cfg80211_chan_def *chandef)
-@@ -1439,6 +1494,7 @@ mt7996_set_radar_background(struct ieee80211_hw *hw,
- 	struct mt7996_dev *dev = phy->dev;
- 	int ret = -EINVAL;
- 	bool running;
-+	struct cfg80211_chan_def ifem_chandef = {};
- 
- 	mutex_lock(&dev->mt76.mutex);
- 
-@@ -1451,13 +1507,14 @@ mt7996_set_radar_background(struct ieee80211_hw *hw,
- 		goto out;
- 	}
- 
-+	mt7996_background_radar_handle_7975_ifem(hw, chandef, &ifem_chandef);
-+
- 	/* rdd2 already configured on a radar channel */
- 	running = dev->rdd2_phy &&
- 		  cfg80211_chandef_valid(&dev->rdd2_chandef) &&
- 		  !!(dev->rdd2_chandef.chan->flags & IEEE80211_CHAN_RADAR);
- 
--	if (!chandef || running ||
--	    !(chandef->chan->flags & IEEE80211_CHAN_RADAR)) {
-+	if (!chandef || running) {
- 		ret = mt7996_mcu_rdd_background_enable(phy, NULL);
- 		if (ret)
- 			goto out;
-@@ -1466,7 +1523,9 @@ mt7996_set_radar_background(struct ieee80211_hw *hw,
- 			goto update_phy;
- 	}
- 
--	ret = mt7996_mcu_rdd_background_enable(phy, chandef);
-+	ret = mt7996_mcu_rdd_background_enable(phy,
-+					       ifem_chandef.chan ?
-+					       &ifem_chandef : chandef);
- 	if (ret)
- 		goto out;
- 
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 16341a41..bc4c3a94 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -369,12 +369,14 @@ mt7996_mcu_rx_radar_detected(struct mt7996_dev *dev, struct sk_buff *skb)
- 	if (!mphy)
- 		return;
- 
--	if (r->band_idx == MT_RX_SEL2)
-+	if (r->band_idx == MT_RX_SEL2) {
-+		dev->bg_nxt_freq = 0;
- 		cfg80211_background_radar_event(mphy->hw->wiphy,
- 						&dev->rdd2_chandef,
- 						GFP_ATOMIC);
--	else
-+	} else {
- 		ieee80211_radar_detected(mphy->hw);
-+	}
- 	dev->hw_pattern++;
- }
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index adb0cdd1..b2fb68c3 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -441,6 +441,7 @@ struct mt7996_dev {
- 	bool testmode_enable;
- 	bool bin_file_mode;
- 	u8 eeprom_mode;
-+	u32 bg_nxt_freq;
- 
- 	bool ibf;
- 	u8 fw_debug_wm;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1023-mtk-wifi-mt76-mt7996-report-tx-and-rx-byte-to-tpt_le.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1023-mtk-wifi-mt76-mt7996-report-tx-and-rx-byte-to-tpt_le.patch
deleted file mode 100644
index aa995e4..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1023-mtk-wifi-mt76-mt7996-report-tx-and-rx-byte-to-tpt_le.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 6bca319efea2666854a49851f7e85aa01e2046ed Mon Sep 17 00:00:00 2001
-From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
-Date: Sat, 12 Aug 2023 04:17:22 +0800
-Subject: [PATCH 1023/1044] mtk: wifi: mt76: mt7996: report tx and rx byte to
- tpt_led
-
----
- mt7996/mcu.c | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index bc4c3a94..03a2402d 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -522,6 +522,8 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 		u8 ac;
- 		u16 wlan_idx;
- 		struct mt76_wcid *wcid;
-+		struct mt76_phy *mphy;
-+		u32 tx_bytes, rx_bytes;
- 
- 		switch (le16_to_cpu(res->tag)) {
- 		case UNI_ALL_STA_TXRX_RATE:
-@@ -541,11 +543,16 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 			if (!wcid)
- 				break;
- 
-+			mphy = mt76_dev_phy(&dev->mt76, wcid->phy_idx);
- 			for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
--				wcid->stats.tx_bytes +=
--					le32_to_cpu(res->adm_stat[i].tx_bytes[ac]);
--				wcid->stats.rx_bytes +=
--					le32_to_cpu(res->adm_stat[i].rx_bytes[ac]);
-+				tx_bytes = le32_to_cpu(res->adm_stat[i].tx_bytes[ac]);
-+				rx_bytes = le32_to_cpu(res->adm_stat[i].rx_bytes[ac]);
-+
-+				wcid->stats.tx_bytes += tx_bytes;
-+				wcid->stats.rx_bytes += rx_bytes;
-+
-+				ieee80211_tpt_led_trig_tx(mphy->hw, tx_bytes);
-+				ieee80211_tpt_led_trig_rx(mphy->hw, rx_bytes);
- 			}
- 			break;
- 		case UNI_ALL_STA_TXRX_MSDU_COUNT:
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1024-mtk-wifi-mt76-mt7996-support-dup-wtbl.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1024-mtk-wifi-mt76-mt7996-support-dup-wtbl.patch
deleted file mode 100644
index de8c46e..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1024-mtk-wifi-mt76-mt7996-support-dup-wtbl.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From ab4e26243d8bbccfe1e8ba69c1af4e3457909f32 Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Thu, 21 Sep 2023 00:52:46 +0800
-Subject: [PATCH 1024/1044] mtk: wifi: mt76: mt7996: support dup wtbl
-
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
----
- mt7996/init.c    |  1 +
- mt7996/mt7996.h  |  1 +
- mt7996/mtk_mcu.c | 23 +++++++++++++++++++++++
- 3 files changed, 25 insertions(+)
-
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 1498787f..30879ec3 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -675,6 +675,7 @@ static void mt7996_init_work(struct work_struct *work)
- 	mt7996_mcu_set_eeprom(dev);
- 	mt7996_mac_init(dev);
- 	mt7996_txbf_init(dev);
-+	mt7996_mcu_set_dup_wtbl(dev);
- }
- 
- void mt7996_wfsys_reset(struct mt7996_dev *dev)
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b2fb68c3..23497b46 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -807,6 +807,7 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir);
- int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
- int mt7996_mcu_set_sr_enable(struct mt7996_phy *phy, u8 action, u64 val, bool set);
- void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb);
-+int mt7996_mcu_set_dup_wtbl(struct mt7996_dev *dev);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index dbdf8d80..ea4e5bf2 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -257,4 +257,27 @@ void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 			 le16_to_cpu(event->basic.tag));
- 	}
- }
-+
-+int mt7996_mcu_set_dup_wtbl(struct mt7996_dev *dev)
-+{
-+#define CHIP_CONFIG_DUP_WTBL	4
-+#define DUP_WTBL_NUM	80
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		__le16 base;
-+		__le16 num;
-+		u8 _rsv2[4];
-+	} __packed req = {
-+		.tag = cpu_to_le16(CHIP_CONFIG_DUP_WTBL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.base = cpu_to_le16(MT7996_WTBL_STA - DUP_WTBL_NUM + 1),
-+		.num = cpu_to_le16(DUP_WTBL_NUM),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(CHIP_CONFIG), &req,
-+				 sizeof(req), true);
-+}
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1025-mtk-wifi-mt76-mt7996-add-ibf-control-vendor-cmd.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1025-mtk-wifi-mt76-mt7996-add-ibf-control-vendor-cmd.patch
deleted file mode 100644
index 5fc86f1..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1025-mtk-wifi-mt76-mt7996-add-ibf-control-vendor-cmd.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-From 4c1c8c14c01399c1851eefde7e56d6dcd7f9f2d3 Mon Sep 17 00:00:00 2001
-From: "Allen.Ye" <allen.ye@mediatek.com>
-Date: Fri, 22 Sep 2023 09:54:49 +0800
-Subject: [PATCH 1025/1044] mtk: wifi: mt76: mt7996: add ibf control vendor cmd
-
-Signed-off-by: Allen.Ye <allen.ye@mediatek.com>
----
- mt7996/vendor.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 23 +++++++++++++++++
- 2 files changed, 88 insertions(+)
-
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index 9f333d0e..dae3260a 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -60,6 +60,11 @@ edcca_dump_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP] = {
- 	[MTK_VENDOR_ATTR_EDCCA_DUMP_SEC160_VAL] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
-+	[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -556,6 +561,54 @@ mt7996_vendor_edcca_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return EDCCA_MAX_BW_NUM;
- }
- 
-+static int mt7996_vendor_ibf_ctrl(struct wiphy *wiphy,
-+				  struct wireless_dev *wdev,
-+				  const void *data,
-+				  int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct mt7996_dev *dev = phy->dev;
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_IBF_CTRL];
-+	int err;
-+	u8 val;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_IBF_CTRL_MAX, data, data_len,
-+			ibf_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (tb[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE]) {
-+		val = nla_get_u8(tb[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE]);
-+
-+		dev->ibf = !!val;
-+
-+		err = mt7996_mcu_set_txbf(dev, BF_HW_EN_UPDATE);
-+		if (err)
-+			return err;
-+	}
-+	return 0;
-+}
-+
-+static int
-+mt7996_vendor_ibf_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			    struct sk_buff *skb, const void *data, int data_len,
-+			    unsigned long *storage)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct mt7996_dev *dev = phy->dev;
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	if (nla_put_u8(skb, MTK_VENDOR_ATTR_IBF_DUMP_ENABLE, dev->ibf))
-+		return -ENOMEM;
-+
-+	return 1;
-+}
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -604,6 +657,18 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = edcca_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_EDCCA_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_ibf_ctrl,
-+		.dumpit = mt7996_vendor_ibf_ctrl_dump,
-+		.policy = ibf_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_IBF_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 4465bc9d..49f46f25 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -7,6 +7,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
- 	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
-+	MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- };
- 
-@@ -102,4 +103,26 @@ enum mtk_vendor_attr_bss_color_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_BSS_COLOR_CTRL - 1
- };
- 
-+enum mtk_vendor_attr_ibf_ctrl {
-+	MTK_VENDOR_ATTR_IBF_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_IBF_CTRL_ENABLE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_IBF_CTRL,
-+	MTK_VENDOR_ATTR_IBF_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_IBF_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_ibf_dump {
-+	MTK_VENDOR_ATTR_IBF_DUMP_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_IBF_DUMP_ENABLE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_IBF_DUMP,
-+	MTK_VENDOR_ATTR_IBF_DUMP_MAX =
-+		NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
-+};
-+
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1026-mtk-wifi-mt76-try-more-times-when-send-message-timeo.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1026-mtk-wifi-mt76-try-more-times-when-send-message-timeo.patch
deleted file mode 100644
index 27628ed..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1026-mtk-wifi-mt76-try-more-times-when-send-message-timeo.patch
+++ /dev/null
@@ -1,229 +0,0 @@
-From e41cd653fb95b60acd3f7c0ee1690ffa4ba995db Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Mon, 6 Nov 2023 11:10:10 +0800
-Subject: [PATCH 1026/1044] mtk: wifi: mt76: try more times when send message
- timeout.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- dma.c        |  7 ++++--
- mcu.c        | 65 ++++++++++++++++++++++++++++++++++++----------------
- mt7996/mac.c | 45 +++++++++++++++---------------------
- 3 files changed, 68 insertions(+), 49 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index 56044639..66c000ef 100644
---- a/dma.c
-+++ b/dma.c
-@@ -504,9 +504,12 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
- {
- 	struct mt76_queue_buf buf = {};
- 	dma_addr_t addr;
-+	int ret = -ENOMEM;
- 
--	if (test_bit(MT76_MCU_RESET, &dev->phy.state))
-+	if (test_bit(MT76_MCU_RESET, &dev->phy.state)) {
-+		ret = -EAGAIN;
- 		goto error;
-+	}
- 
- 	if (q->queued + 1 >= q->ndesc - 1)
- 		goto error;
-@@ -528,7 +531,7 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
- 
- error:
- 	dev_kfree_skb(skb);
--	return -ENOMEM;
-+	return ret;
- }
- 
- static int
-diff --git a/mcu.c b/mcu.c
-index fa4b0544..2926f715 100644
---- a/mcu.c
-+++ b/mcu.c
-@@ -4,6 +4,7 @@
-  */
- 
- #include "mt76.h"
-+#include "mt76_connac.h"
- #include <linux/moduleparam.h>
- 
- struct sk_buff *
-@@ -74,35 +75,59 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
- 				  int cmd, bool wait_resp,
- 				  struct sk_buff **ret_skb)
- {
-+#define MT76_MSG_MAX_RETRY_CNT 3
- 	unsigned long expires;
--	int ret, seq;
-+	int ret, seq, retry_cnt;
-+	struct sk_buff *skb_tmp;
-+	bool retry = wait_resp && is_mt7996(dev);
- 
- 	if (ret_skb)
- 		*ret_skb = NULL;
- 
- 	mutex_lock(&dev->mcu.mutex);
--
--	ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
--	if (ret < 0)
--		goto out;
--
--	if (!wait_resp) {
--		ret = 0;
--		goto out;
-+	retry_cnt = retry ? MT76_MSG_MAX_RETRY_CNT : 1;
-+	while (retry_cnt) {
-+		skb_tmp = mt76_mcu_msg_alloc(dev, skb->data, skb->len);
-+		if (!skb_tmp)
-+			goto out;
-+
-+		if (retry && retry_cnt < MT76_MSG_MAX_RETRY_CNT) {
-+			if (test_bit(MT76_MCU_RESET, &dev->phy.state))
-+				usleep_range(200000, 500000);
-+			dev_err(dev->dev, "send message %08x timeout, try again.\n", cmd);
-+		}
-+
-+		ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb_tmp, cmd, &seq);
-+		if (ret < 0 && ret != -EAGAIN)
-+			goto out;
-+
-+		if (!wait_resp) {
-+			ret = 0;
-+			goto out;
-+		}
-+
-+		expires = jiffies + dev->mcu.timeout;
-+
-+		do {
-+			skb_tmp = mt76_mcu_get_response(dev, expires);
-+			ret = dev->mcu_ops->mcu_parse_response(dev, cmd, skb_tmp, seq);
-+			if (ret == -ETIMEDOUT)
-+				break;
-+
-+			if (!ret && ret_skb)
-+				*ret_skb = skb_tmp;
-+			else
-+				dev_kfree_skb(skb_tmp);
-+
-+			if (ret != -EAGAIN)
-+				goto out;
-+		} while (ret == -EAGAIN);
-+
-+		retry_cnt--;
- 	}
- 
--	expires = jiffies + dev->mcu.timeout;
--
--	do {
--		skb = mt76_mcu_get_response(dev, expires);
--		ret = dev->mcu_ops->mcu_parse_response(dev, cmd, skb, seq);
--		if (!ret && ret_skb)
--			*ret_skb = skb;
--		else
--			dev_kfree_skb(skb);
--	} while (ret == -EAGAIN);
--
- out:
-+	dev_kfree_skb(skb);
- 	mutex_unlock(&dev->mcu.mutex);
- 
- 	return ret;
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 4e52aa1b..c6d79989 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1666,10 +1666,14 @@ mt7996_mac_restart(struct mt7996_dev *dev)
- 	set_bit(MT76_RESET, &dev->mphy.state);
- 	set_bit(MT76_MCU_RESET, &dev->mphy.state);
- 	wake_up(&dev->mt76.mcu.wait);
--	if (phy2)
-+	if (phy2) {
- 		set_bit(MT76_RESET, &phy2->mt76->state);
--	if (phy3)
-+		set_bit(MT76_MCU_RESET, &phy2->mt76->state);
-+	}
-+	if (phy3) {
- 		set_bit(MT76_RESET, &phy3->mt76->state);
-+		set_bit(MT76_MCU_RESET, &phy3->mt76->state);
-+	}
- 
- 	/* lock/unlock all queues to ensure that no tx is pending */
- 	mt76_txq_schedule_all(&dev->mphy);
-@@ -1784,13 +1788,24 @@ mt7996_mac_full_reset(struct mt7996_dev *dev)
- 	phy3 = mt7996_phy3(dev);
- 	dev->recovery.hw_full_reset = true;
- 
--	wake_up(&dev->mt76.mcu.wait);
- 	ieee80211_stop_queues(mt76_hw(dev));
- 	if (phy2)
- 		ieee80211_stop_queues(phy2->mt76->hw);
- 	if (phy3)
- 		ieee80211_stop_queues(phy3->mt76->hw);
- 
-+	set_bit(MT76_RESET, &dev->mphy.state);
-+	set_bit(MT76_MCU_RESET, &dev->mphy.state);
-+	wake_up(&dev->mt76.mcu.wait);
-+	if (phy2) {
-+		set_bit(MT76_RESET, &phy2->mt76->state);
-+		set_bit(MT76_MCU_RESET, &phy2->mt76->state);
-+	}
-+	if (phy3) {
-+		set_bit(MT76_RESET, &phy3->mt76->state);
-+		set_bit(MT76_MCU_RESET, &phy3->mt76->state);
-+	}
-+
- 	cancel_work_sync(&dev->wed_rro.work);
- 	cancel_delayed_work_sync(&dev->mphy.mac_work);
- 	if (phy2)
-@@ -1893,16 +1908,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 	set_bit(MT76_MCU_RESET, &dev->mphy.state);
- 	wake_up(&dev->mt76.mcu.wait);
- 
--	cancel_work_sync(&dev->wed_rro.work);
--	cancel_delayed_work_sync(&dev->mphy.mac_work);
--	if (phy2) {
--		set_bit(MT76_RESET, &phy2->mt76->state);
--		cancel_delayed_work_sync(&phy2->mt76->mac_work);
--	}
--	if (phy3) {
--		set_bit(MT76_RESET, &phy3->mt76->state);
--		cancel_delayed_work_sync(&phy3->mt76->mac_work);
--	}
- 	mt76_worker_disable(&dev->mt76.tx_worker);
- 	mt76_for_each_q_rx(&dev->mt76, i) {
- 		if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
-@@ -1913,8 +1918,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 	}
- 	napi_disable(&dev->mt76.tx_napi);
- 
--	mutex_lock(&dev->mt76.mutex);
--
- 	mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
- 
- 	if (mt7996_wait_reset_state(dev, MT_MCU_CMD_RESET_DONE)) {
-@@ -1987,20 +1990,8 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 	if (phy3)
- 		ieee80211_wake_queues(phy3->mt76->hw);
- 
--	mutex_unlock(&dev->mt76.mutex);
--
- 	mt7996_update_beacons(dev);
- 
--	ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mphy.mac_work,
--				     MT7996_WATCHDOG_TIME);
--	if (phy2)
--		ieee80211_queue_delayed_work(phy2->mt76->hw,
--					     &phy2->mt76->mac_work,
--					     MT7996_WATCHDOG_TIME);
--	if (phy3)
--		ieee80211_queue_delayed_work(phy3->mt76->hw,
--					     &phy3->mt76->mac_work,
--					     MT7996_WATCHDOG_TIME);
- 	dev_info(dev->mt76.dev,"\n%s L1 SER recovery completed.",
- 		 wiphy_name(dev->mt76.hw->wiphy));
- }
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1027-mtk-wifi-mt76-mt7996-add-SER-overlap-handle.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1027-mtk-wifi-mt76-mt7996-add-SER-overlap-handle.patch
deleted file mode 100644
index 54ee436..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1027-mtk-wifi-mt76-mt7996-add-SER-overlap-handle.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From a86c3c6d2be2e115540d0a6ce5166943fd6657ba Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Tue, 21 Nov 2023 09:55:46 +0800
-Subject: [PATCH 1027/1044] mtk: wifi: mt76: mt7996: add SER overlap handle
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- mcu.c           | 3 ++-
- mt7996/mac.c    | 8 ++++++++
- mt7996/mcu.c    | 8 ++++++++
- mt7996/mt7996.h | 2 ++
- 4 files changed, 20 insertions(+), 1 deletion(-)
-
-diff --git a/mcu.c b/mcu.c
-index 2926f715..a7afa2d7 100644
---- a/mcu.c
-+++ b/mcu.c
-@@ -94,7 +94,8 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
- 		if (retry && retry_cnt < MT76_MSG_MAX_RETRY_CNT) {
- 			if (test_bit(MT76_MCU_RESET, &dev->phy.state))
- 				usleep_range(200000, 500000);
--			dev_err(dev->dev, "send message %08x timeout, try again.\n", cmd);
-+			dev_err(dev->dev, "send message %08x timeout, try again(%d).\n",
-+				cmd, (MT76_MSG_MAX_RETRY_CNT - retry_cnt));
- 		}
- 
- 		ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb_tmp, cmd, &seq);
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index c6d79989..2e0fb5d9 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1889,6 +1889,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 	if (!(READ_ONCE(dev->recovery.state) & MT_MCU_CMD_STOP_DMA))
- 		return;
- 
-+	dev->recovery.l1_reset_last = dev->recovery.l1_reset;
- 	dev_info(dev->mt76.dev,"\n%s L1 SER recovery start.",
- 		 wiphy_name(dev->mt76.hw->wiphy));
- 
-@@ -1906,6 +1907,10 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 
- 	set_bit(MT76_RESET, &dev->mphy.state);
- 	set_bit(MT76_MCU_RESET, &dev->mphy.state);
-+	if (phy2)
-+		set_bit(MT76_RESET, &phy2->mt76->state);
-+	if (phy3)
-+		set_bit(MT76_RESET, &phy3->mt76->state);
- 	wake_up(&dev->mt76.mcu.wait);
- 
- 	mt76_worker_disable(&dev->mt76.tx_worker);
-@@ -2120,6 +2125,9 @@ void mt7996_reset(struct mt7996_dev *dev)
- 		return;
- 	}
- 
-+	if ((READ_ONCE(dev->recovery.state) & MT_MCU_CMD_STOP_DMA))
-+		dev->recovery.l1_reset++;
-+
- 	queue_work(dev->mt76.wq, &dev->reset_work);
- 	wake_up(&dev->reset_wait);
- }
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 03a2402d..c427ea20 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -246,6 +246,14 @@ mt7996_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
- 	u32 val;
- 	u8 seq;
- 
-+	if (dev->recovery.l1_reset_last != dev->recovery.l1_reset) {
-+		dev_info(dev->mt76.dev,"\n%s L1 SER recovery overlap, drop message %08x.",
-+			 wiphy_name(dev->mt76.hw->wiphy), cmd);
-+
-+		dev_kfree_skb(skb);
-+		return -EPERM;
-+	}
-+
- 	mdev->mcu.timeout = 20 * HZ;
- 
- 	seq = ++dev->mt76.mcu.msg_seq & 0xf;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 23497b46..c590a8b8 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -392,6 +392,8 @@ struct mt7996_dev {
- 	wait_queue_head_t reset_wait;
- 	struct {
- 		u32 state;
-+		u32 l1_reset;
-+		u32 l1_reset_last;
- 		u32 wa_reset_count;
- 		u32 wm_reset_count;
- 		bool hw_full_reset:1;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1028-mtk-wifi-mt76-mt7996-kite-default-1-pcie-setting.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1028-mtk-wifi-mt76-mt7996-kite-default-1-pcie-setting.patch
deleted file mode 100644
index 578e073..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1028-mtk-wifi-mt76-mt7996-kite-default-1-pcie-setting.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From b1e9d2e1fd1b0b788bcb42c468b72d7e0fe1d583 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Thu, 13 Jul 2023 16:36:36 +0800
-Subject: [PATCH 1028/1044] mtk: wifi: mt76: mt7996: kite default 1-pcie
- setting
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/pci.c | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
-diff --git a/mt7996/pci.c b/mt7996/pci.c
-index 04056181..05830c01 100644
---- a/mt7996/pci.c
-+++ b/mt7996/pci.c
-@@ -11,6 +11,9 @@
- #include "mac.h"
- #include "../trace.h"
- 
-+static bool hif2_enable = false;
-+module_param(hif2_enable, bool, 0644);
-+
- static LIST_HEAD(hif_list);
- static DEFINE_SPINLOCK(hif_lock);
- static u32 hif_idx;
-@@ -63,6 +66,9 @@ static struct mt7996_hif *mt7996_pci_init_hif2(struct pci_dev *pdev)
- {
- 	hif_idx++;
- 
-+	if (!hif2_enable)
-+		return NULL;
-+
- 	if (!pci_get_device(PCI_VENDOR_ID_MEDIATEK, 0x7991, NULL) &&
- 	    !pci_get_device(PCI_VENDOR_ID_MEDIATEK, 0x799a, NULL))
- 		return NULL;
-@@ -77,6 +83,9 @@ static int mt7996_pci_hif2_probe(struct pci_dev *pdev)
- {
- 	struct mt7996_hif *hif;
- 
-+	if (!hif2_enable)
-+		return 0;
-+
- 	hif = devm_kzalloc(&pdev->dev, sizeof(*hif), GFP_KERNEL);
- 	if (!hif)
- 		return -ENOMEM;
-@@ -101,6 +110,8 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 	int irq, hif2_irq, ret;
- 	struct mt76_dev *mdev;
- 
-+	hif2_enable |= (id->device == 0x7990 || id->device == 0x7991);
-+
- 	ret = pcim_enable_device(pdev);
- 	if (ret)
- 		return ret;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1029-mtk-wifi-mt76-mt7996-add-debugfs-knob-for-rx_counter.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1029-mtk-wifi-mt76-mt7996-add-debugfs-knob-for-rx_counter.patch
deleted file mode 100644
index 665f489..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1029-mtk-wifi-mt76-mt7996-add-debugfs-knob-for-rx_counter.patch
+++ /dev/null
@@ -1,291 +0,0 @@
-From 649e775c56c37b314cf69767bbf845237a2674cc Mon Sep 17 00:00:00 2001
-From: Peter Chiu <chui-hao.chiu@mediatek.com>
-Date: Fri, 28 Apr 2023 10:39:58 +0800
-Subject: [PATCH 1029/1044] mtk: wifi: mt76: mt7996: add debugfs knob for
- rx_counters
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
----
- agg-rx.c             |  8 ++++++++
- mac80211.c           | 16 ++++++++++++++--
- mt76.h               | 15 +++++++++++++++
- mt7996/mac.c         | 18 +++++++++++++++---
- mt7996/mtk_debugfs.c | 42 ++++++++++++++++++++++++++++++++++++++++++
- 5 files changed, 94 insertions(+), 5 deletions(-)
-
-diff --git a/agg-rx.c b/agg-rx.c
-index 07c386c7..37588ac2 100644
---- a/agg-rx.c
-+++ b/agg-rx.c
-@@ -33,10 +33,13 @@ mt76_rx_aggr_release_frames(struct mt76_rx_tid *tid,
- 			    struct sk_buff_head *frames,
- 			    u16 head)
- {
-+	struct mt76_phy *phy = mt76_dev_phy(tid->dev, tid->band_idx);
- 	int idx;
- 
- 	while (ieee80211_sn_less(tid->head, head)) {
- 		idx = tid->head % tid->size;
-+		if (!tid->reorder_buf[idx])
-+			phy->rx_stats.rx_agg_miss++;
- 		mt76_aggr_release(tid, frames, idx);
- 	}
- }
-@@ -151,6 +154,7 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)
- 	struct mt76_wcid *wcid = status->wcid;
- 	struct ieee80211_sta *sta;
- 	struct mt76_rx_tid *tid;
-+	struct mt76_phy *phy;
- 	bool sn_less;
- 	u16 seqno, head, size, idx;
- 	u8 tidno = status->qos_ctl & IEEE80211_QOS_CTL_TID_MASK;
-@@ -186,6 +190,7 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)
- 	head = tid->head;
- 	seqno = status->seqno;
- 	size = tid->size;
-+	phy = mt76_dev_phy(tid->dev, tid->band_idx);
- 	sn_less = ieee80211_sn_less(seqno, head);
- 
- 	if (!tid->started) {
-@@ -197,6 +202,7 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)
- 
- 	if (sn_less) {
- 		__skb_unlink(skb, frames);
-+		phy->rx_stats.rx_dup_drop++;
- 		dev_kfree_skb(skb);
- 		goto out;
- 	}
-@@ -223,6 +229,7 @@ void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames)
- 
- 	/* Discard if the current slot is already in use */
- 	if (tid->reorder_buf[idx]) {
-+		phy->rx_stats.rx_dup_drop++;
- 		dev_kfree_skb(skb);
- 		goto out;
- 	}
-@@ -254,6 +261,7 @@ int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tidno,
- 	tid->head = ssn;
- 	tid->size = size;
- 	tid->num = tidno;
-+	tid->band_idx = wcid->phy_idx;
- 	INIT_DELAYED_WORK(&tid->reorder_work, mt76_rx_aggr_reorder_work);
- 	spin_lock_init(&tid->lock);
- 
-diff --git a/mac80211.c b/mac80211.c
-index e7d02d15..ae040ec4 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -784,6 +784,7 @@ static void mt76_rx_release_amsdu(struct mt76_phy *phy, enum mt76_rxq_id q)
- 		}
- 
- 		if (ether_addr_equal(skb->data + offset, rfc1042_header)) {
-+			phy->rx_stats.rx_drop++;
- 			dev_kfree_skb(skb);
- 			return;
- 		}
-@@ -1100,10 +1101,16 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
- 
- 	*sta = wcid_to_sta(mstat.wcid);
- 	*hw = mt76_phy_hw(dev, mstat.phy_idx);
-+
-+	if ((mstat.flag & RX_FLAG_8023) || ieee80211_is_data_qos(hdr->frame_control)) {
-+		struct mt76_phy *phy = mt76_dev_phy(dev, mstat.phy_idx);
-+
-+		phy->rx_stats.rx_mac80211++;
-+	}
- }
- 
- static void
--mt76_check_ccmp_pn(struct sk_buff *skb)
-+mt76_check_ccmp_pn(struct mt76_dev *dev, struct sk_buff *skb)
- {
- 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
- 	struct mt76_wcid *wcid = status->wcid;
-@@ -1150,7 +1157,11 @@ skip_hdr_check:
- 	ret = memcmp(status->iv, wcid->rx_key_pn[security_idx],
- 		     sizeof(status->iv));
- 	if (ret <= 0) {
-+		struct mt76_phy *phy = mt76_dev_phy(dev, status->phy_idx);
-+
-+		phy->rx_stats.rx_pn_iv_error++;
- 		status->flag |= RX_FLAG_ONLY_MONITOR;
-+
- 		return;
- 	}
- 
-@@ -1331,7 +1342,7 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
- 	while ((skb = __skb_dequeue(frames)) != NULL) {
- 		struct sk_buff *nskb = skb_shinfo(skb)->frag_list;
- 
--		mt76_check_ccmp_pn(skb);
-+		mt76_check_ccmp_pn(dev, skb);
- 		skb_shinfo(skb)->frag_list = NULL;
- 		mt76_rx_convert(dev, skb, &hw, &sta);
- 		ieee80211_rx_list(hw, sta, skb, &list);
-@@ -1354,6 +1365,7 @@ void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
- 	}
- 
- 	list_for_each_entry_safe(skb, tmp, &list, list) {
-+		dev->rx_kernel++;
- 		skb_list_del_init(skb);
- 		napi_gro_receive(napi, skb);
- 	}
-diff --git a/mt76.h b/mt76.h
-index a75277fe..58fd55b1 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -423,6 +423,7 @@ struct mt76_rx_tid {
- 	struct rcu_head rcu_head;
- 
- 	struct mt76_dev *dev;
-+	u8 band_idx;
- 
- 	spinlock_t lock;
- 	struct delayed_work reorder_work;
-@@ -854,6 +855,19 @@ struct mt76_phy {
- 		bool al;
- 		u8 pin;
- 	} leds;
-+
-+	struct {
-+		u32 rx_mac80211;
-+
-+		u32 rx_drop;
-+		u32 rx_rxd_drop;
-+		u32 rx_dup_drop;
-+		u32 rx_agg_miss;
-+		u32 rx_icv_error;
-+		u32 rx_fcs_error;
-+		u32 rx_tkip_mic_error;
-+		u32 rx_pn_iv_error;
-+	} rx_stats;
- };
- 
- struct mt76_dev {
-@@ -959,6 +973,7 @@ struct mt76_dev {
- 	};
- 
- 	const char *bin_file_name;
-+	u32 rx_kernel;
- };
- 
- /* per-phy stats.  */
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 2e0fb5d9..7885bc4c 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -469,8 +469,10 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
- 		return -EINVAL;
- 
- 	/* ICV error or CCMP/BIP/WPI MIC error */
--	if (rxd1 & MT_RXD1_NORMAL_ICV_ERR)
-+	if (rxd1 & MT_RXD1_NORMAL_ICV_ERR) {
-+		mphy->rx_stats.rx_icv_error++;
- 		status->flag |= RX_FLAG_ONLY_MONITOR;
-+	}
- 
- 	unicast = FIELD_GET(MT_RXD3_NORMAL_ADDR_TYPE, rxd3) == MT_RXD3_NORMAL_U2M;
- 	idx = FIELD_GET(MT_RXD1_NORMAL_WLAN_IDX, rxd1);
-@@ -501,11 +503,15 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, enum mt76_rxq_id q,
- 	    !(csum_status & (BIT(0) | BIT(2) | BIT(3))))
- 		skb->ip_summed = CHECKSUM_UNNECESSARY;
- 
--	if (rxd1 & MT_RXD3_NORMAL_FCS_ERR)
-+	if (rxd1 & MT_RXD3_NORMAL_FCS_ERR) {
-+		mphy->rx_stats.rx_fcs_error++;
- 		status->flag |= RX_FLAG_FAILED_FCS_CRC;
-+	}
- 
--	if (rxd1 & MT_RXD1_NORMAL_TKIP_MIC_ERR)
-+	if (rxd1 & MT_RXD1_NORMAL_TKIP_MIC_ERR) {
-+		mphy->rx_stats.rx_tkip_mic_error++;
- 		status->flag |= RX_FLAG_MMIC_ERROR;
-+	}
- 
- 	if (FIELD_GET(MT_RXD2_NORMAL_SEC_MODE, rxd2) != 0 &&
- 	    !(rxd1 & (MT_RXD1_NORMAL_CLM | MT_RXD1_NORMAL_CM))) {
-@@ -1415,8 +1421,10 @@ void mt7996_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
- 			 struct sk_buff *skb, u32 *info)
- {
- 	struct mt7996_dev *dev = container_of(mdev, struct mt7996_dev, mt76);
-+	struct mt76_phy *phy;
- 	__le32 *rxd = (__le32 *)skb->data;
- 	__le32 *end = (__le32 *)&skb->data[skb->len];
-+	u8 band_idx;
- 	enum rx_pkt_type type;
- 
- 	type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
-@@ -1458,6 +1466,10 @@ void mt7996_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
- 		}
- 		fallthrough;
- 	default:
-+		band_idx = le32_get_bits(rxd[1], MT_RXD1_NORMAL_BAND_IDX);
-+		phy = mt76_dev_phy(mdev, band_idx);
-+		if (likely(phy))
-+			phy->rx_stats.rx_rxd_drop++;
- 		dev_kfree_skb(skb);
- 		break;
- 	}
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index ed01c089..d290ad4d 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2854,6 +2854,46 @@ mt7996_sr_scene_cond_show(struct seq_file *file, void *data)
- }
- DEFINE_SHOW_ATTRIBUTE(mt7996_sr_scene_cond);
- 
-+static int mt7996_rx_counters(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u32 rx_mac80211 = 0;
-+	int i = 0;
-+
-+	for (i = 0; i < __MT_MAX_BAND; i++) {
-+		struct mt76_phy *phy = mt76_dev_phy(&dev->mt76, i);
-+
-+		if (!phy)
-+			continue;
-+
-+		seq_printf(s, "\n==========PHY%d==========\n", i);
-+
-+#define SEQ_PRINT(_str, _rx_param) do {					\
-+		seq_printf(s, _str"\n", phy->rx_stats._rx_param);	\
-+	} while (0)
-+
-+		SEQ_PRINT("Rx to mac80211: %u", rx_mac80211);
-+		SEQ_PRINT("Rx drop: %u", rx_drop);
-+		SEQ_PRINT("Rx drop due to RXD type error: %u", rx_rxd_drop);
-+		SEQ_PRINT("Rx duplicated drop: %u", rx_dup_drop);
-+		SEQ_PRINT("Rx agg miss: %u", rx_agg_miss);
-+		SEQ_PRINT("Rx ICV error: %u", rx_icv_error);
-+		SEQ_PRINT("Rx FCS error: %u", rx_fcs_error);
-+		SEQ_PRINT("Rx TKIP MIC error: %u", rx_tkip_mic_error);
-+		SEQ_PRINT("Rx PN/IV error: %u", rx_pn_iv_error);
-+#undef SEQ_PRINT
-+
-+		rx_mac80211 += phy->rx_stats.rx_mac80211;
-+	}
-+
-+	seq_printf(s, "\n==========SUM==========\n");
-+	seq_printf(s, "Rx to kernel: %u\n", dev->mt76.rx_kernel);
-+	seq_printf(s, "Rx to mac80211: %u\n", rx_mac80211);
-+
-+
-+	return 0;
-+}
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2917,6 +2957,8 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "tr_info", dir,
- 				    mt7996_trinfo_read);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "rx_counters", dir,
-+				    mt7996_rx_counters);
- 	debugfs_create_file("txpower_level", 0600, dir, phy, &fops_txpower_level);
- 	debugfs_create_file("txpower_info", 0600, dir, phy, &mt7996_txpower_info_fops);
- 	debugfs_create_file("txpower_sku", 0600, dir, phy, &mt7996_txpower_sku_fops);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1030-mtk-wifi-mt76-mt7996-add-three-wire-pta-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1030-mtk-wifi-mt76-mt7996-add-three-wire-pta-support.patch
deleted file mode 100644
index 53f6642..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1030-mtk-wifi-mt76-mt7996-add-three-wire-pta-support.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-From 311174c13b07be59176f82594b6704a64acae40c Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Tue, 24 Oct 2023 15:59:18 +0800
-Subject: [PATCH 1030/1044] mtk: wifi: mt76: mt7996: add three wire pta support
-
-three wire enable bit 0 & 1 for EXT0 & EXT1, respectively
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt76_connac_mcu.h |  1 +
- mt7996/vendor.c   | 49 +++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h   | 12 ++++++++++++
- 3 files changed, 62 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 9edb580c..a59e5a0b 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1285,6 +1285,7 @@ enum {
- 	MCU_UNI_CMD_PER_STA_INFO = 0x6d,
- 	MCU_UNI_CMD_ALL_STA_INFO = 0x6e,
- 	MCU_UNI_CMD_ASSERT_DUMP = 0x6f,
-+	MCU_UNI_CMD_PTA_3WIRE_CTRL = 0x78,
- };
- 
- enum {
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index dae3260a..9ba6f00a 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -60,6 +60,11 @@ edcca_dump_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP] = {
- 	[MTK_VENDOR_ATTR_EDCCA_DUMP_SEC160_VAL] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+three_wire_ctrl_policy[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL] = {
-+	[MTK_VENDOR_ATTR_3WIRE_CTRL_MODE] = {.type = NLA_U8 },
-+};
-+
- static const struct nla_policy
- ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
- 	[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
-@@ -561,6 +566,39 @@ mt7996_vendor_edcca_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return EDCCA_MAX_BW_NUM;
- }
- 
-+static int mt7996_vendor_3wire_ctrl(struct wiphy *wiphy, struct wireless_dev *wdev,
-+				    const void *data, int data_len)
-+{
-+#define UNI_3WIRE_EXT_EN	0
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_dev *dev = mt7996_hw_dev(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL];
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 three_wire_mode;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_3WIRE_EXT_EN),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+	};
-+	int err;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_3WIRE_CTRL_MAX, data, data_len,
-+			three_wire_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (!tb[MTK_VENDOR_ATTR_3WIRE_CTRL_MODE])
-+		return -EINVAL;
-+
-+	req.three_wire_mode = nla_get_u8(tb[MTK_VENDOR_ATTR_3WIRE_CTRL_MODE]);
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(PTA_3WIRE_CTRL), &req,
-+				 sizeof(req), false);
-+}
-+
- static int mt7996_vendor_ibf_ctrl(struct wiphy *wiphy,
- 				  struct wireless_dev *wdev,
- 				  const void *data,
-@@ -657,6 +695,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = edcca_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_EDCCA_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_3wire_ctrl,
-+		.policy = three_wire_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_3WIRE_CTRL_MAX,
-+	},
- 	{
- 		.info = {
- 			.vendor_id = MTK_NL80211_VENDOR_ID,
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 49f46f25..29ccc050 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -7,6 +7,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
- 	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
-+	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8,
- 	MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- };
-@@ -43,6 +44,17 @@ enum mtk_vendor_attr_edcca_dump {
- 		NUM_MTK_VENDOR_ATTRS_EDCCA_DUMP - 1
- };
- 
-+enum mtk_vendor_attr_3wire_ctrl {
-+	MTK_VENDOR_ATTR_3WIRE_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_3WIRE_CTRL_MODE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL,
-+	MTK_VENDOR_ATTR_3WIRE_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_3WIRE_CTRL - 1
-+};
-+
- enum mtk_vendor_attr_mu_ctrl {
- 	MTK_VENDOR_ATTR_MU_CTRL_UNSPEC,
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1031-mtk-wifi-mt76-mt7996-support-BF-MIMO-debug-commands.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1031-mtk-wifi-mt76-mt7996-support-BF-MIMO-debug-commands.patch
deleted file mode 100644
index af11090..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1031-mtk-wifi-mt76-mt7996-support-BF-MIMO-debug-commands.patch
+++ /dev/null
@@ -1,1204 +0,0 @@
-From 3eac9c285c13a00891a81064bb346b0da307a9e8 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Tue, 3 Jan 2023 09:42:07 +0800
-Subject: [PATCH 1031/1044] mtk: wifi: mt76: mt7996: support BF/MIMO debug
- commands
-
-This commit includes the following commands:
-1. starec_bf_read
-2. txbf_snd_info: start/stop sounding and set sounding period
-3. fbkRptInfo
-4. fix muru rate
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-fix the wrong wlan_idx for user3
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/mcu.c         |   5 +
- mt7996/mcu.h         |   4 +
- mt7996/mt7996.h      |   5 +
- mt7996/mtk_debugfs.c | 120 +++++++++
- mt7996/mtk_mcu.c     | 626 +++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.h     | 342 +++++++++++++++++++++++
- 6 files changed, 1102 insertions(+)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index c427ea20..d4cd83c6 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -741,6 +741,11 @@ mt7996_mcu_uni_rx_unsolicited_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	case MCU_UNI_EVENT_TESTMODE_CTRL:
- 		mt7996_tm_rf_test_event(dev, skb);
- 		break;
-+#endif
-+#if defined CONFIG_NL80211_TESTMODE || defined CONFIG_MTK_DEBUG
-+	case MCU_UNI_EVENT_BF:
-+		mt7996_mcu_rx_bf_event(dev, skb);
-+		break;
- #endif
- 	default:
- 		break;
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 34fdfb26..347893c8 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -770,8 +770,12 @@ enum {
- 
- enum {
- 	BF_SOUNDING_ON = 1,
-+	BF_PFMU_TAG_READ = 5,
-+	BF_STA_REC_READ = 11,
- 	BF_HW_EN_UPDATE = 17,
- 	BF_MOD_EN_CTRL = 20,
-+	BF_FBRPT_DBG_INFO_READ = 23,
-+	BF_TXSND_INFO = 24,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index c590a8b8..33936f90 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -810,6 +810,11 @@ int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
- int mt7996_mcu_set_sr_enable(struct mt7996_phy *phy, u8 action, u64 val, bool set);
- void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb);
- int mt7996_mcu_set_dup_wtbl(struct mt7996_dev *dev);
-+int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx);
-+void mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb);
-+int mt7996_mcu_set_muru_fixed_rate_enable(struct mt7996_dev *dev, u8 action, int val);
-+int mt7996_mcu_set_muru_fixed_rate_parameter(struct mt7996_dev *dev, u8 action, void *para);
-+int mt7996_mcu_set_txbf_snd_info(struct mt7996_phy *phy, void *para);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index d290ad4d..2104c889 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2894,6 +2894,117 @@ static int mt7996_rx_counters(struct seq_file *s, void *data)
- 	return 0;
- }
- 
-+static int
-+mt7996_starec_bf_read_set(void *data, u64 wlan_idx)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	return mt7996_mcu_set_txbf_internal(phy, BF_STA_REC_READ, wlan_idx);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_starec_bf_read, NULL,
-+			 mt7996_starec_bf_read_set, "%lld\n");
-+
-+static ssize_t
-+mt7996_bf_txsnd_info_set(struct file *file,
-+			 const char __user *user_buf,
-+			 size_t count, loff_t *ppos)
-+{
-+	struct mt7996_phy *phy = file->private_data;
-+	char buf[40];
-+	int ret;
-+
-+	if (count >= sizeof(buf))
-+		return -EINVAL;
-+
-+	if (copy_from_user(buf, user_buf, count))
-+		return -EFAULT;
-+
-+	if (count && buf[count - 1] == '\n')
-+		buf[count - 1] = '\0';
-+	else
-+		buf[count] = '\0';
-+
-+	ret = mt7996_mcu_set_txbf_snd_info(phy, buf);
-+
-+	if (ret) return -EFAULT;
-+
-+	return count;
-+}
-+
-+static const struct file_operations fops_bf_txsnd_info = {
-+	.write = mt7996_bf_txsnd_info_set,
-+	.read = NULL,
-+	.open = simple_open,
-+	.llseek = default_llseek,
-+};
-+
-+static int
-+mt7996_bf_fbk_rpt_set(void *data, u64 wlan_idx)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	return mt7996_mcu_set_txbf_internal(phy, BF_FBRPT_DBG_INFO_READ, wlan_idx);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_bf_fbk_rpt, NULL,
-+			 mt7996_bf_fbk_rpt_set, "%lld\n");
-+
-+static int
-+mt7996_bf_pfmu_tag_read_set(void *data, u64 wlan_idx)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	return mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, wlan_idx);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_bf_pfmu_tag_read, NULL,
-+			 mt7996_bf_pfmu_tag_read_set, "%lld\n");
-+
-+static int
-+mt7996_muru_fixed_rate_set(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	return mt7996_mcu_set_muru_fixed_rate_enable(dev, UNI_CMD_MURU_FIXED_RATE_CTRL,
-+						     val);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_muru_fixed_rate_enable, NULL,
-+			 mt7996_muru_fixed_rate_set, "%lld\n");
-+
-+static ssize_t
-+mt7996_muru_fixed_rate_parameter_set(struct file *file,
-+				     const char __user *user_buf,
-+				     size_t count, loff_t *ppos)
-+{
-+	struct mt7996_dev *dev = file->private_data;
-+	char buf[40];
-+	int ret;
-+
-+	if (count >= sizeof(buf))
-+		return -EINVAL;
-+
-+	if (copy_from_user(buf, user_buf, count))
-+		return -EFAULT;
-+
-+	if (count && buf[count - 1] == '\n')
-+		buf[count - 1] = '\0';
-+	else
-+		buf[count] = '\0';
-+
-+
-+	ret = mt7996_mcu_set_muru_fixed_rate_parameter(dev, UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL,
-+						       buf);
-+
-+	if (ret) return -EFAULT;
-+
-+	return count;
-+}
-+
-+static const struct file_operations fops_muru_fixed_group_rate = {
-+	.write = mt7996_muru_fixed_rate_parameter_set,
-+	.read = NULL,
-+	.open = simple_open,
-+	.llseek = default_llseek,
-+};
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -2980,6 +3091,15 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	debugfs_create_file("sr_stats", 0400, dir, phy, &mt7996_sr_stats_fops);
- 	debugfs_create_file("sr_scene_cond", 0400, dir, phy, &mt7996_sr_scene_cond_fops);
- 
-+	debugfs_create_file("muru_fixed_rate_enable", 0600, dir, dev,
-+			    &fops_muru_fixed_rate_enable);
-+	debugfs_create_file("muru_fixed_group_rate", 0600, dir, dev,
-+			    &fops_muru_fixed_group_rate);
-+	debugfs_create_file("bf_txsnd_info", 0600, dir, phy, &fops_bf_txsnd_info);
-+	debugfs_create_file("bf_starec_read", 0600, dir, phy, &fops_starec_bf_read);
-+	debugfs_create_file("bf_fbk_rpt", 0600, dir, phy, &fops_bf_fbk_rpt);
-+	debugfs_create_file("pfmu_tag_read", 0600, dir, phy, &fops_bf_pfmu_tag_read);
-+
- 	return 0;
- }
- 
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index ea4e5bf2..67419cd9 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -280,4 +280,630 @@ int mt7996_mcu_set_dup_wtbl(struct mt7996_dev *dev)
- 	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(CHIP_CONFIG), &req,
- 				 sizeof(req), true);
- }
-+
-+static struct tlv *
-+__mt7996_mcu_add_uni_tlv(struct sk_buff *skb, u16 tag, u16 len)
-+{
-+	struct tlv *ptlv, tlv = {
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(len),
-+	};
-+
-+	ptlv = skb_put(skb, len);
-+	memcpy(ptlv, &tlv, sizeof(tlv));
-+
-+	return ptlv;
-+}
-+
-+int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+#define MT7996_MTK_BF_MAX_SIZE	sizeof(struct bf_starec_read)
-+	struct uni_header hdr;
-+	struct sk_buff *skb;
-+	struct tlv *tlv;
-+	int len = sizeof(hdr) + MT7996_MTK_BF_MAX_SIZE;
-+
-+	memset(&hdr, 0, sizeof(hdr));
-+
-+	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
-+	if (!skb)
-+		return -ENOMEM;
-+
-+	skb_put_data(skb, &hdr, sizeof(hdr));
-+
-+	switch (action) {
-+	case BF_PFMU_TAG_READ: {
-+		struct bf_pfmu_tag *req;
-+
-+		tlv = __mt7996_mcu_add_uni_tlv(skb, action, sizeof(*req));
-+		req = (struct bf_pfmu_tag *)tlv;
-+#define BFER 1
-+		req->pfmu_id = idx;
-+		req->bfer = BFER;
-+		req->band_idx = phy->mt76->band_idx;
-+		break;
-+	}
-+	case BF_STA_REC_READ: {
-+		struct bf_starec_read *req;
-+
-+		tlv = __mt7996_mcu_add_uni_tlv(skb, action, sizeof(*req));
-+		req = (struct bf_starec_read *)tlv;
-+		req->wlan_idx = idx;
-+		break;
-+	}
-+	case BF_FBRPT_DBG_INFO_READ: {
-+		struct bf_fbk_rpt_info *req;
-+
-+		if (idx != 0) {
-+			dev_info(dev->mt76.dev, "Invalid input");
-+			return 0;
-+		}
-+
-+		tlv = __mt7996_mcu_add_uni_tlv(skb, action, sizeof(*req));
-+		req = (struct bf_fbk_rpt_info *)tlv;
-+		req->action = idx;
-+		req->band_idx = phy->mt76->band_idx;
-+		break;
-+	}
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb, MCU_WM_UNI_CMD(BF), false);
-+}
-+
-+int mt7996_mcu_set_txbf_snd_info(struct mt7996_phy *phy, void *para)
-+{
-+	char *buf = (char *)para;
-+	__le16 input[5] = {0};
-+	u8 recv_arg = 0;
-+	struct bf_txsnd_info *req;
-+	struct uni_header hdr;
-+	struct sk_buff *skb;
-+	struct tlv *tlv;
-+	int len = sizeof(hdr) + MT7996_MTK_BF_MAX_SIZE;
-+
-+	memset(&hdr, 0, sizeof(hdr));
-+
-+	skb = mt76_mcu_msg_alloc(&phy->dev->mt76, NULL, len);
-+	if (!skb)
-+		return -ENOMEM;
-+
-+	skb_put_data(skb, &hdr, sizeof(hdr));
-+
-+	recv_arg = sscanf(buf, "%hx:%hx:%hx:%hx:%hx", &input[0], &input[1], &input[2],
-+						      &input[3], &input[4]);
-+
-+	if (!recv_arg)
-+		return -EINVAL;
-+
-+	tlv = __mt7996_mcu_add_uni_tlv(skb, BF_TXSND_INFO, sizeof(*req));
-+	req = (struct bf_txsnd_info *)tlv;
-+	req->action = input[0];
-+
-+	switch (req->action) {
-+	case BF_SND_READ_INFO: {
-+		req->read_clr = input[1];
-+		break;
-+	}
-+	case BF_SND_CFG_OPT: {
-+		req->vht_opt = input[1];
-+		req->he_opt = input[2];
-+		req->glo_opt = input[3];
-+		break;
-+	}
-+	case BF_SND_CFG_INTV: {
-+		req->wlan_idx = input[1];
-+		req->snd_intv = input[2];
-+		break;
-+	}
-+	case BF_SND_STA_STOP: {
-+		req->wlan_idx = input[1];
-+		req->snd_stop = input[2];
-+		break;
-+	}
-+	case BF_SND_CFG_MAX_STA: {
-+		req->max_snd_stas = input[1];
-+		break;
-+	}
-+	case BF_SND_CFG_BFRP: {
-+		req->man = input[1];
-+		req->tx_time = input[2];
-+		req->mcs = input[3];
-+		req->ldpc = input[4];
-+		break;
-+	}
-+	case BF_SND_CFG_INF: {
-+		req->inf = input[1];
-+		break;
-+	}
-+	case BF_SND_CFG_TXOP_SND: {
-+		req->man = input[1];
-+		req->ac_queue = input[2];
-+		req->sxn_protect = input[3];
-+		req->direct_fbk = input[4];
-+		break;
-+	}
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb, MCU_WM_UNI_CMD(BF), false);
-+}
-+
-+void
-+mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+#define HE_MODE 3
-+	struct mt7996_mcu_bf_basic_event *event;
-+
-+	event = (struct mt7996_mcu_bf_basic_event *)skb->data;
-+
-+	dev_info(dev->mt76.dev, " bf_event tag = %d\n", event->tag);
-+
-+	switch (event->tag) {
-+	case UNI_EVENT_BF_PFMU_TAG: {
-+
-+		struct mt7996_pfmu_tag_event *tag;
-+		u32 *raw_t1, *raw_t2;
-+
-+		tag = (struct mt7996_pfmu_tag_event *) skb->data;
-+
-+		raw_t1 = (u32 *)&tag->t1;
-+		raw_t2 = (u32 *)&tag->t2;
-+
-+		dev_info(dev->mt76.dev, "=================== TXBf Profile Tag1 Info ==================\n");
-+		dev_info(dev->mt76.dev,
-+			 "DW0 = 0x%08x, DW1 = 0x%08x, DW2 = 0x%08x\n",
-+			 raw_t1[0], raw_t1[1], raw_t1[2]);
-+		dev_info(dev->mt76.dev,
-+			 "DW4 = 0x%08x, DW5 = 0x%08x, DW6 = 0x%08x\n\n",
-+			 raw_t1[3], raw_t1[4], raw_t1[5]);
-+		dev_info(dev->mt76.dev, "PFMU ID = %d              Invalid status = %d\n",
-+			 tag->t1.pfmu_idx, tag->t1.invalid_prof);
-+		dev_info(dev->mt76.dev, "iBf/eBf = %d\n\n", tag->t1.ebf);
-+		dev_info(dev->mt76.dev, "DBW   = %d\n", tag->t1.data_bw);
-+		dev_info(dev->mt76.dev, "SU/MU = %d\n", tag->t1.is_mu);
-+		dev_info(dev->mt76.dev,
-+			 "nrow = %d, ncol = %d, ng = %d, LM = %d, CodeBook = %d MobCalEn = %d\n",
-+			 tag->t1.nr, tag->t1.nc, tag->t1.ngroup, tag->t1.lm, tag->t1.codebook,
-+			 tag->t1.mob_cal_en);
-+
-+		if (tag->t1.lm <= HE_MODE) {
-+			dev_info(dev->mt76.dev, "RU start = %d, RU end = %d\n",
-+				 tag->t1.field.ru_start_id, tag->t1.field.ru_end_id);
-+		} else {
-+			dev_info(dev->mt76.dev, "PartialBW = %d\n",
-+				 tag->t1.bw_info.partial_bw_info);
-+		}
-+
-+		dev_info(dev->mt76.dev, "Mem Col1 = %d, Mem Row1 = %d, Mem Col2 = %d, Mem Row2 = %d\n",
-+			 tag->t1.col_id1, tag->t1.row_id1, tag->t1.col_id2, tag->t1.row_id2);
-+		dev_info(dev->mt76.dev, "Mem Col3 = %d, Mem Row3 = %d, Mem Col4 = %d, Mem Row4 = %d\n\n",
-+			 tag->t1.col_id3, tag->t1.row_id3, tag->t1.col_id4, tag->t1.row_id4);
-+		dev_info(dev->mt76.dev,
-+			 "STS0_SNR = 0x%02x, STS1_SNR = 0x%02x, STS2_SNR = 0x%02x, STS3_SNR = 0x%02x\n",
-+			 tag->t1.snr_sts0, tag->t1.snr_sts1, tag->t1.snr_sts2, tag->t1.snr_sts3);
-+		dev_info(dev->mt76.dev,
-+			 "STS4_SNR = 0x%02x, STS5_SNR = 0x%02x, STS6_SNR = 0x%02x, STS7_SNR = 0x%02x\n",
-+			 tag->t1.snr_sts4, tag->t1.snr_sts5, tag->t1.snr_sts6, tag->t1.snr_sts7);
-+		dev_info(dev->mt76.dev, "=============================================================\n");
-+
-+		dev_info(dev->mt76.dev, "=================== TXBf Profile Tag2 Info ==================\n");
-+		dev_info(dev->mt76.dev,
-+			 "DW0 = 0x%08x, DW1 = 0x%08x, DW2 = 0x%08x\n",
-+			 raw_t2[0], raw_t2[1], raw_t2[2]);
-+		dev_info(dev->mt76.dev,
-+			 "DW3 = 0x%08x, DW4 = 0x%08x, DW5 = 0x%08x\n\n",
-+			 raw_t2[3], raw_t2[4], raw_t2[5]);
-+		dev_info(dev->mt76.dev, "Smart antenna ID = 0x%x,  SE index = %d\n",
-+			 tag->t2.smart_ant, tag->t2.se_idx);
-+		dev_info(dev->mt76.dev, "Timeout = 0x%x\n", tag->t2.ibf_timeout);
-+		dev_info(dev->mt76.dev, "Desired BW = %d, Desired Ncol = %d, Desired Nrow = %d\n",
-+			 tag->t2.ibf_data_bw, tag->t2.ibf_nc, tag->t2.ibf_nr);
-+		dev_info(dev->mt76.dev, "Desired RU Allocation = %d\n", tag->t2.ibf_ru);
-+		dev_info(dev->mt76.dev, "Mobility DeltaT = %d, Mobility LQ = %d\n",
-+			 tag->t2.mob_delta_t, tag->t2.mob_lq_result);
-+		dev_info(dev->mt76.dev, "=============================================================\n");
-+		break;
-+	}
-+	case UNI_EVENT_BF_STAREC: {
-+
-+		struct mt7996_mcu_bf_starec_read *r;
-+
-+		r = (struct mt7996_mcu_bf_starec_read *)skb->data;
-+		dev_info(dev->mt76.dev, "=================== BF StaRec ===================\n"
-+					"rStaRecBf.u2PfmuId      = %d\n"
-+					"rStaRecBf.fgSU_MU       = %d\n"
-+					"rStaRecBf.u1TxBfCap     = %d\n"
-+					"rStaRecBf.ucSoundingPhy = %d\n"
-+					"rStaRecBf.ucNdpaRate    = %d\n"
-+					"rStaRecBf.ucNdpRate     = %d\n"
-+					"rStaRecBf.ucReptPollRate= %d\n"
-+					"rStaRecBf.ucTxMode      = %d\n"
-+					"rStaRecBf.ucNc          = %d\n"
-+					"rStaRecBf.ucNr          = %d\n"
-+					"rStaRecBf.ucCBW         = %d\n"
-+					"rStaRecBf.ucMemRequire20M = %d\n"
-+					"rStaRecBf.ucMemRow0     = %d\n"
-+					"rStaRecBf.ucMemCol0     = %d\n"
-+					"rStaRecBf.ucMemRow1     = %d\n"
-+					"rStaRecBf.ucMemCol1     = %d\n"
-+					"rStaRecBf.ucMemRow2     = %d\n"
-+					"rStaRecBf.ucMemCol2     = %d\n"
-+					"rStaRecBf.ucMemRow3     = %d\n"
-+					"rStaRecBf.ucMemCol3     = %d\n",
-+					r->pfmu_id,
-+					r->is_su_mu,
-+					r->txbf_cap,
-+					r->sounding_phy,
-+					r->ndpa_rate,
-+					r->ndp_rate,
-+					r->rpt_poll_rate,
-+					r->tx_mode,
-+					r->nc,
-+					r->nr,
-+					r->bw,
-+					r->mem_require_20m,
-+					r->mem_row0,
-+					r->mem_col0,
-+					r->mem_row1,
-+					r->mem_col1,
-+					r->mem_row2,
-+					r->mem_col2,
-+					r->mem_row3,
-+					r->mem_col3);
-+
-+		dev_info(dev->mt76.dev, "rStaRecBf.u2SmartAnt    = 0x%x\n"
-+					"rStaRecBf.ucSEIdx       = %d\n"
-+					"rStaRecBf.uciBfTimeOut  = 0x%x\n"
-+					"rStaRecBf.uciBfDBW      = %d\n"
-+					"rStaRecBf.uciBfNcol     = %d\n"
-+					"rStaRecBf.uciBfNrow     = %d\n"
-+					"rStaRecBf.nr_bw160      = %d\n"
-+					"rStaRecBf.nc_bw160 	  = %d\n"
-+					"rStaRecBf.ru_start_idx  = %d\n"
-+					"rStaRecBf.ru_end_idx 	  = %d\n"
-+					"rStaRecBf.trigger_su 	  = %d\n"
-+					"rStaRecBf.trigger_mu 	  = %d\n"
-+					"rStaRecBf.ng16_su 	  = %d\n"
-+					"rStaRecBf.ng16_mu 	  = %d\n"
-+					"rStaRecBf.codebook42_su = %d\n"
-+					"rStaRecBf.codebook75_mu = %d\n"
-+					"rStaRecBf.he_ltf 	      = %d\n"
-+					"rStaRecBf.pp_fd_val 	  = %d\n"
-+					"======================================\n",
-+					r->smart_ant,
-+					r->se_idx,
-+					r->bf_timeout,
-+					r->bf_dbw,
-+					r->bf_ncol,
-+					r->bf_nrow,
-+					r->nr_lt_bw80,
-+					r->nc_lt_bw80,
-+					r->ru_start_idx,
-+					r->ru_end_idx,
-+					r->trigger_su,
-+					r->trigger_mu,
-+					r->ng16_su,
-+					r->ng16_mu,
-+					r->codebook42_su,
-+					r->codebook75_mu,
-+					r->he_ltf,
-+					r->pp_fd_val);
-+		break;
-+	}
-+	case UNI_EVENT_BF_FBK_INFO: {
-+		struct mt7996_mcu_txbf_fbk_info *info;
-+		__le32 total, i;
-+
-+		info = (struct mt7996_mcu_txbf_fbk_info *)skb->data;
-+
-+		total = info->u4PFMUWRDoneCnt + info->u4PFMUWRFailCnt;
-+		total += info->u4PFMUWRTimeoutFreeCnt + info->u4FbRptPktDropCnt;
-+
-+		dev_info(dev->mt76.dev, "\n");
-+		dev_info(dev->mt76.dev, "\x1b[32m =================================\x1b[m\n");
-+		dev_info(dev->mt76.dev, "\x1b[32m PFMUWRDoneCnt              = %u\x1b[m\n",
-+			info->u4PFMUWRDoneCnt);
-+		dev_info(dev->mt76.dev, "\x1b[32m PFMUWRFailCnt              = %u\x1b[m\n",
-+			info->u4PFMUWRFailCnt);
-+		dev_info(dev->mt76.dev, "\x1b[32m PFMUWRTimeOutCnt           = %u\x1b[m\n",
-+			info->u4PFMUWRTimeOutCnt);
-+		dev_info(dev->mt76.dev, "\x1b[32m PFMUWRTimeoutFreeCnt       = %u\x1b[m\n",
-+			info->u4PFMUWRTimeoutFreeCnt);
-+		dev_info(dev->mt76.dev, "\x1b[32m FbRptPktDropCnt            = %u\x1b[m\n",
-+			info->u4FbRptPktDropCnt);
-+		dev_info(dev->mt76.dev, "\x1b[32m TotalFbRptPkt              = %u\x1b[m\n", total);
-+		dev_info(dev->mt76.dev, "\x1b[32m PollPFMUIntrStatTimeOut    = %u(micro-sec)\x1b[m\n",
-+			info->u4PollPFMUIntrStatTimeOut);
-+		dev_info(dev->mt76.dev, "\x1b[32m FbRptDeQInterval           = %u(milli-sec)\x1b[m\n",
-+			info->u4DeQInterval);
-+		dev_info(dev->mt76.dev, "\x1b[32m PktCntInFbRptTimeOutQ      = %u\x1b[m\n",
-+			info->u4RptPktTimeOutListNum);
-+		dev_info(dev->mt76.dev, "\x1b[32m PktCntInFbRptQ             = %u\x1b[m\n",
-+			info->u4RptPktListNum);
-+
-+		// [ToDo] Check if it is valid entry
-+		for (i = 0; ((i < 5) && (i < CFG_BF_STA_REC_NUM)); i++) {
-+
-+			// [ToDo] AID needs to be refined
-+			dev_info(dev->mt76.dev,"\x1b[32m AID%u  RxFbRptCnt           = %u\x1b[m\n"
-+				, i, info->au4RxPerStaFbRptCnt[i]);
-+		}
-+
-+		break;
-+	}
-+	case UNI_EVENT_BF_TXSND_INFO: {
-+		struct mt7996_mcu_tx_snd_info *info;
-+		struct uni_event_bf_txsnd_sta_info *snd_sta_info;
-+		int Idx;
-+		int max_wtbl_size = mt7996_wtbl_size(dev);
-+
-+		info = (struct mt7996_mcu_tx_snd_info *)skb->data;
-+		dev_info(dev->mt76.dev, "=================== Global Setting ===================\n");
-+
-+		dev_info(dev->mt76.dev, "VhtOpt = 0x%02X, HeOpt = 0x%02X, GloOpt = 0x%02X\n",
-+			info->vht_opt, info->he_opt, info->glo_opt);
-+
-+		for (Idx = 0; Idx < BF_SND_CTRL_STA_DWORD_CNT; Idx++) {
-+			dev_info(dev->mt76.dev, "SuSta[%d] = 0x%08X,", Idx,
-+				 info->snd_rec_su_sta[Idx]);
-+			if ((Idx & 0x03) == 0x03)
-+				dev_info(dev->mt76.dev, "\n");
-+		}
-+
-+		if ((Idx & 0x03) != 0x03)
-+			dev_info(dev->mt76.dev, "\n");
-+
-+
-+		for (Idx = 0; Idx < BF_SND_CTRL_STA_DWORD_CNT; Idx++) {
-+			dev_info(dev->mt76.dev, "VhtMuSta[%d] = 0x%08X,", Idx, info->snd_rec_vht_mu_sta[Idx]);
-+			if ((Idx & 0x03) == 0x03)
-+				dev_info(dev->mt76.dev, "\n");
-+		}
-+
-+		if ((Idx & 0x03) != 0x03)
-+			dev_info(dev->mt76.dev, "\n");
-+
-+		for (Idx = 0; Idx < BF_SND_CTRL_STA_DWORD_CNT; Idx++) {
-+			dev_info(dev->mt76.dev, "HeTBSta[%d] = 0x%08X,", Idx, info->snd_rec_he_tb_sta[Idx]);
-+			if ((Idx & 0x03) == 0x03)
-+				dev_info(dev->mt76.dev, "\n");
-+		}
-+
-+		if ((Idx & 0x03) != 0x03)
-+			dev_info(dev->mt76.dev, "\n");
-+
-+		for (Idx = 0; Idx < BF_SND_CTRL_STA_DWORD_CNT; Idx++) {
-+			dev_info(dev->mt76.dev, "EhtTBSta[%d] = 0x%08X,", Idx, info->snd_rec_eht_tb_sta[Idx]);
-+			if ((Idx & 0x03) == 0x03)
-+				dev_info(dev->mt76.dev, "\n");
-+		}
-+
-+		if ((Idx & 0x03) != 0x03)
-+			dev_info(dev->mt76.dev, "\n");
-+
-+		for (Idx = 0; Idx < CFG_WIFI_RAM_BAND_NUM; Idx++) {
-+			dev_info(dev->mt76.dev, "Band%u:\n", Idx);
-+			dev_info(dev->mt76.dev, "	 Wlan Idx For VHT MC Sounding = %u\n", info->wlan_idx_for_mc_snd[Idx]);
-+			dev_info(dev->mt76.dev, "	 Wlan Idx For HE TB Sounding = %u\n", info->wlan_idx_for_he_tb_snd[Idx]);
-+			dev_info(dev->mt76.dev, "	 Wlan Idx For EHT TB Sounding = %u\n", info->wlan_idx_for_eht_tb_snd[Idx]);
-+		}
-+
-+		dev_info(dev->mt76.dev, "ULLen = %d, ULMcs = %d, ULLDCP = %d\n",
-+			info->ul_length, info->mcs, info->ldpc);
-+
-+		dev_info(dev->mt76.dev, "=================== STA Info ===================\n");
-+
-+		for (Idx = 1; (Idx < 5 && (Idx < CFG_BF_STA_REC_NUM)); Idx++) {
-+			snd_sta_info = &info->snd_sta_info[Idx];
-+			dev_info(dev->mt76.dev, "Idx%2u Interval = %d, interval counter = %d, TxCnt = %d, StopReason = 0x%02X\n",
-+				Idx,
-+				snd_sta_info->snd_intv,
-+				snd_sta_info->snd_intv_cnt,
-+				snd_sta_info->snd_tx_cnt,
-+				snd_sta_info->snd_stop_reason);
-+		}
-+
-+		dev_info(dev->mt76.dev, "=================== STA Info Connected ===================\n");
-+		// [ToDo] How to iterate and get AID info of station
-+		// Check UniEventBFCtrlTxSndHandle() on Logan
-+
-+		//hardcode max_wtbl_size as 5
-+		max_wtbl_size = 5;
-+		for (Idx = 1; ((Idx < max_wtbl_size) && (Idx < CFG_BF_STA_REC_NUM)); Idx++) {
-+
-+			// [ToDo] We do not show AID info here
-+			snd_sta_info = &info->snd_sta_info[Idx];
-+			dev_info(dev->mt76.dev, " Interval = %d (%u ms), interval counter = %d (%u ms), TxCnt = %d, StopReason = 0x%02X\n",
-+				snd_sta_info->snd_intv,
-+				snd_sta_info->snd_intv * 10,
-+				snd_sta_info->snd_intv_cnt,
-+				snd_sta_info->snd_intv_cnt * 10,
-+				snd_sta_info->snd_tx_cnt,
-+				snd_sta_info->snd_stop_reason);
-+		}
-+
-+		dev_info(dev->mt76.dev, "======================================\n");
-+
-+		break;
-+	}
-+	default:
-+		dev_info(dev->mt76.dev, "%s: unknown bf event tag %d\n",
-+			 __func__, event->tag);
-+	}
-+
-+}
-+
-+
-+int mt7996_mcu_set_muru_fixed_rate_enable(struct mt7996_dev *dev, u8 action, int val)
-+{
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le16 value;
-+		__le16 rsv;
-+	} __packed data = {
-+		.tag = cpu_to_le16(action),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+		.value = cpu_to_le16(!!val),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &data, sizeof(data),
-+				 false);
-+}
-+
-+int mt7996_mcu_set_muru_fixed_rate_parameter(struct mt7996_dev *dev, u8 action, void *para)
-+{
-+	char *buf = (char *)para;
-+	u8 num_user = 0, recv_arg = 0, max_mcs = 0, usr_mcs[4] = {0};
-+	__le16 bw;
-+	int i;
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 cmd_version;
-+		u8 cmd_revision;
-+		__le16 rsv;
-+
-+		struct uni_muru_mum_set_group_tbl_entry entry;
-+	} __packed data = {
-+		.tag = cpu_to_le16(action),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+	};
-+
-+#define __RUALLOC_TYPE_CHECK_HE(BW) ((BW == RUALLOC_BW20) || (BW == RUALLOC_BW40) || (BW == RUALLOC_BW80) || (BW == RUALLOC_BW160))
-+#define __RUALLOC_TYPE_CHECK_EHT(BW) (__RUALLOC_TYPE_CHECK_HE(BW) || (BW == RUALLOC_BW320))
-+	/* [Num of user] - 1~4
-+	 * [RUAlloc] - BW320: 395, BW160: 137, BW80: 134, BW40: 130, BW20: 122
-+	 * [LTF/GI] - For VHT, short GI: 0, Long GI: 1; 	 *
-+	 * For HE/EHT, 4xLTF+3.2us: 0, 4xLTF+0.8us: 1, 2xLTF+0.8us:2
-+	 * [Phy/FullBW] - VHT: 0 / HEFullBw: 1 / HEPartialBw: 2 / EHTFullBW: 3, EHTPartialBW: 4
-+	 * [DL/UL] DL: 0, UL: 1, DL_UL: 2
-+	 * [Wcid User0] - WCID 0
-+	 * [MCS of WCID0] - For HE/VHT, 0-11: 1ss MCS0-MCS11, 12-23: 2SS MCS0-MCS11
-+	 * For EHT, 0-13: 1ss MCS0-MCS13, 14-27: 2SS MCS0-MCS13
-+	 * [WCID 1]
-+	 * [MCS of WCID1]
-+	 * [WCID 2]
-+	 * [MCS of WCID2]
-+	 * [WCID 3]
-+	 * [MCS of WCID3]
-+	 */
-+
-+	recv_arg = sscanf(buf, "%hhu %hu %hhu %hhu %hhu %hu %hhu %hu %hhu %hu %hhu %hu %hhu",
-+			  &num_user, &bw, &data.entry.gi, &data.entry.capa, &data.entry.dl_ul,
-+			  &data.entry.wlan_idx0, &usr_mcs[0],
-+			  &data.entry.wlan_idx1, &usr_mcs[1],
-+			  &data.entry.wlan_idx2, &usr_mcs[2],
-+			  &data.entry.wlan_idx3, &usr_mcs[3]);
-+
-+	if (recv_arg != (5 + (2 * num_user))) {
-+		dev_err(dev->mt76.dev, "The number of argument is invalid\n");
-+		goto error;
-+	}
-+
-+	if (num_user > 0 && num_user < 5)
-+		data.entry.num_user = num_user - 1;
-+	else {
-+		dev_err(dev->mt76.dev, "The number of user count is invalid\n");
-+		goto error;
-+	}
-+
-+	/**
-+	 * Older chip shall be set as HE. Refer to getHWSupportByChip() in Logan
-+	 * driver to know the value for differnt chips
-+	 */
-+	data.cmd_version = UNI_CMD_MURU_VER_EHT;
-+
-+	if (data.cmd_version == UNI_CMD_MURU_VER_EHT)
-+		max_mcs = UNI_MAX_MCS_SUPPORT_EHT;
-+	else
-+		max_mcs = UNI_MAX_MCS_SUPPORT_HE;
-+
-+
-+	// Parameter Check
-+	if (data.cmd_version != UNI_CMD_MURU_VER_EHT) {
-+		if ((data.entry.capa > MAX_MODBF_HE) || (bw == RUALLOC_BW320))
-+			goto error;
-+	} else {
-+		if ((data.entry.capa <= MAX_MODBF_HE) && (bw == RUALLOC_BW320))
-+			goto error;
-+	}
-+
-+	if (data.entry.capa <= MAX_MODBF_HE)
-+		max_mcs = UNI_MAX_MCS_SUPPORT_HE;
-+
-+	if (__RUALLOC_TYPE_CHECK_EHT(bw)) {
-+		data.entry.ru_alloc = (u8)(bw & 0xFF);
-+		if (bw == RUALLOC_BW320)
-+			data.entry.ru_alloc_ext = (u8)(bw >> 8);
-+	} else {
-+		dev_err(dev->mt76.dev, "RU_ALLOC argument is invalid\n");
-+		goto error;
-+	}
-+
-+	if ((data.entry.gi > 2) ||
-+	    ((data.entry.gi > 1) && (data.entry.capa == MAX_MODBF_VHT))) {
-+		dev_err(dev->mt76.dev, "GI argument is invalid\n");
-+		goto error;
-+	}
-+
-+	if (data.entry.dl_ul > 2) {
-+		dev_err(dev->mt76.dev, "DL_UL argument is invalid\n");
-+		goto error;
-+	}
-+
-+#define __mcs_handler(_n)							\
-+	do {									\
-+		if (usr_mcs[_n] > max_mcs) {					\
-+			usr_mcs[_n] -= (max_mcs + 1);				\
-+			data.entry.nss##_n = 1;					\
-+			if (usr_mcs[_n] > max_mcs)				\
-+				usr_mcs[_n] = max_mcs;				\
-+		}								\
-+		if ((data.entry.dl_ul & 0x1) == 0)				\
-+			data.entry.dl_mcs_user##_n = usr_mcs[_n];		\
-+		if ((data.entry.dl_ul & 0x3) > 0)				\
-+			data.entry.ul_mcs_user##_n = usr_mcs[_n];		\
-+	}									\
-+	while (0)
-+
-+	for (i=0; i<= data.entry.num_user; i++) {
-+		switch (i) {
-+			case 0:
-+				__mcs_handler(0);
-+				break;
-+			case 1:
-+				__mcs_handler(1);
-+				break;
-+			case 2:
-+				__mcs_handler(2);
-+				break;
-+			case 3:
-+				__mcs_handler(3);
-+				break;
-+			default:
-+				break;
-+		}
-+	}
-+#undef __mcs_handler
-+
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &data,
-+				 sizeof(data), false);
-+
-+error:
-+	dev_err(dev->mt76.dev, "Command failed!\n");
-+	return -EINVAL;
-+}
-+
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 098e63ae..71c6684a 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -119,6 +119,348 @@ enum {
- 	EDCCA_FCC = 1,
- 	EDCCA_ETSI = 2,
- 	EDCCA_JAPAN = 3
-+
-+struct bf_pfmu_tag {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 pfmu_id;
-+	bool bfer;
-+	u8 band_idx;
-+	u8 __rsv[5];
-+	u8 buf[56];
-+} __packed;
-+
-+struct bf_starec_read {
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 wlan_idx;
-+	u8 __rsv[2];
-+} __packed;
-+
-+struct bf_fbk_rpt_info {
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 wlan_idx; // Only need for dynamic_pfmu_update 0x4
-+	u8 action;
-+	u8 band_idx;
-+	u8 __rsv[4];
-+
-+} __packed;
-+
-+struct bf_txsnd_info {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 action;
-+	u8 read_clr;
-+	u8 vht_opt;
-+	u8 he_opt;
-+	__le16 wlan_idx;
-+	u8 glo_opt;
-+	u8 snd_intv;
-+	u8 snd_stop;
-+	u8 max_snd_stas;
-+	u8 tx_time;
-+	u8 mcs;
-+	u8 ldpc;
-+	u8 inf;
-+	u8 man;
-+	u8 ac_queue;
-+	u8 sxn_protect;
-+	u8 direct_fbk;
-+	u8 __rsv[2];
-+} __packed;
-+
-+struct mt7996_mcu_bf_basic_event {
-+	struct mt7996_mcu_rxd rxd;
-+
-+	u8 __rsv1[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+};
-+
-+struct mt7996_mcu_bf_starec_read {
-+
-+	struct mt7996_mcu_bf_basic_event event;
-+
-+	__le16 pfmu_id;
-+	bool is_su_mu;
-+	u8 txbf_cap;
-+	u8 sounding_phy;
-+	u8 ndpa_rate;
-+	u8 ndp_rate;
-+	u8 rpt_poll_rate;
-+	u8 tx_mode;
-+	u8 nc;
-+	u8 nr;
-+	u8 bw;
-+	u8 total_mem_require;
-+	u8 mem_require_20m;
-+	u8 mem_row0;
-+	u8 mem_col0:6;
-+	u8 mem_row0_msb:2;
-+	u8 mem_row1;
-+	u8 mem_col1:6;
-+	u8 mem_row1_msb:2;
-+	u8 mem_row2;
-+	u8 mem_col2:6;
-+	u8 mem_row2_msb:2;
-+	u8 mem_row3;
-+	u8 mem_col3:6;
-+	u8 mem_row3_msb:2;
-+
-+	__le16 smart_ant;
-+	u8 se_idx;
-+	u8 auto_sounding_ctrl;
-+
-+	u8 bf_timeout;
-+	u8 bf_dbw;
-+	u8 bf_ncol;
-+	u8 bf_nrow;
-+
-+	u8 nr_lt_bw80;
-+	u8 nc_lt_bw80;
-+	u8 ru_start_idx;
-+	u8 ru_end_idx;
-+
-+	bool trigger_su;
-+	bool trigger_mu;
-+
-+	bool ng16_su;
-+	bool ng16_mu;
-+
-+	bool codebook42_su;
-+	bool codebook75_mu;
-+
-+	u8 he_ltf;
-+	u8 pp_fd_val;
-+};
-+
-+#define TXBF_PFMU_ID_NUM_MAX 48
-+
-+#define TXBF_PFMU_ID_NUM_MAX_TBTC_BAND0 TXBF_PFMU_ID_NUM_MAX
-+#define TXBF_PFMU_ID_NUM_MAX_TBTC_BAND1 TXBF_PFMU_ID_NUM_MAX
-+#define TXBF_PFMU_ID_NUM_MAX_TBTC_BAND2 TXBF_PFMU_ID_NUM_MAX
-+
-+/* CFG_BF_STA_REC shall be varied based on BAND Num */
-+#define CFG_BF_STA_REC_NUM (TXBF_PFMU_ID_NUM_MAX_TBTC_BAND0 + TXBF_PFMU_ID_NUM_MAX_TBTC_BAND1 + TXBF_PFMU_ID_NUM_MAX_TBTC_BAND2)
-+
-+#define BF_SND_CTRL_STA_DWORD_CNT   ((CFG_BF_STA_REC_NUM + 0x1F) >> 5)
-+
-+#ifndef ALIGN_4
-+	#define ALIGN_4(_value)             (((_value) + 3) & ~3u)
-+#endif /* ALIGN_4 */
-+
-+#define CFG_WIFI_RAM_BAND_NUM 3
-+
-+struct uni_event_bf_txsnd_sta_info {
-+	u8 snd_intv;       /* Sounding interval upper bound, unit:15ms */
-+	u8 snd_intv_cnt;   /* Sounding interval counter */
-+	u8 snd_tx_cnt;     /* Tx sounding count for debug */
-+	u8 snd_stop_reason;  /* Bitwise reason to put in Stop Queue */
-+};
-+
-+struct mt7996_mcu_tx_snd_info {
-+
-+	struct mt7996_mcu_bf_basic_event event;
-+
-+	u8 vht_opt;
-+	u8 he_opt;
-+	u8 glo_opt;
-+	u8 __rsv;
-+	__le32 snd_rec_su_sta[BF_SND_CTRL_STA_DWORD_CNT];
-+	__le32 snd_rec_vht_mu_sta[BF_SND_CTRL_STA_DWORD_CNT];
-+	__le32 snd_rec_he_tb_sta[BF_SND_CTRL_STA_DWORD_CNT];
-+	__le32 snd_rec_eht_tb_sta[BF_SND_CTRL_STA_DWORD_CNT];
-+	__le16 wlan_idx_for_mc_snd[ALIGN_4(CFG_WIFI_RAM_BAND_NUM)];
-+	__le16 wlan_idx_for_he_tb_snd[ALIGN_4(CFG_WIFI_RAM_BAND_NUM)];
-+	__le16 wlan_idx_for_eht_tb_snd[ALIGN_4(CFG_WIFI_RAM_BAND_NUM)];
-+	__le16 ul_length;
-+	u8 mcs;
-+	u8 ldpc;
-+	struct uni_event_bf_txsnd_sta_info snd_sta_info[CFG_BF_STA_REC_NUM];
-+};
-+
-+struct mt7996_mcu_txbf_fbk_info {
-+
-+	struct mt7996_mcu_bf_basic_event event;
-+
-+	__le32 u4DeQInterval;     /* By ms */
-+	__le32 u4PollPFMUIntrStatTimeOut; /* micro-sec */
-+	__le32 u4RptPktTimeOutListNum;
-+	__le32 u4RptPktListNum;
-+	__le32 u4PFMUWRTimeOutCnt;
-+	__le32 u4PFMUWRFailCnt;
-+	__le32 u4PFMUWRDoneCnt;
-+	__le32 u4PFMUWRTimeoutFreeCnt;
-+	__le32 u4FbRptPktDropCnt;
-+	__le32 au4RxPerStaFbRptCnt[CFG_BF_STA_REC_NUM];
-+};
-+
-+struct pfmu_ru_field {
-+	__le32 ru_start_id:7;
-+	__le32 _rsv1:1;
-+	__le32 ru_end_id:7;
-+	__le32 _rsv2:1;
-+} __packed;
-+
-+struct pfmu_partial_bw_info {
-+	__le32 partial_bw_info:9;
-+	__le32 _rsv1:7;
-+} __packed;
-+
-+struct mt7996_pfmu_tag1 {
-+	__le32 pfmu_idx:10;
-+	__le32 ebf:1;
-+	__le32 data_bw:3;
-+	__le32 lm:3;
-+	__le32 is_mu:1;
-+	__le32 nr:3;
-+	__le32 nc:3;
-+	__le32 codebook:2;
-+	__le32 ngroup:2;
-+	__le32 invalid_prof:1;
-+	__le32 _rsv:3;
-+
-+	__le32 col_id1:7, row_id1:9;
-+	__le32 col_id2:7, row_id2:9;
-+	__le32 col_id3:7, row_id3:9;
-+	__le32 col_id4:7, row_id4:9;
-+
-+	union {
-+		struct pfmu_ru_field field;
-+		struct pfmu_partial_bw_info bw_info;
-+	};
-+	__le32 mob_cal_en:1;
-+	__le32 _rsv2:3;
-+	__le32 mob_ru_alloc:9;	/* EHT profile uses full 9 bit */
-+	__le32 _rsv3:3;
-+
-+	__le32 snr_sts0:8, snr_sts1:8, snr_sts2:8, snr_sts3:8;
-+	__le32 snr_sts4:8, snr_sts5:8, snr_sts6:8, snr_sts7:8;
-+
-+	__le32 _rsv4;
-+} __packed;
-+
-+struct mt7996_pfmu_tag2 {
-+	__le32 smart_ant:24;
-+	__le32 se_idx:5;
-+	__le32 _rsv:3;
-+
-+	__le32 _rsv1:16;
-+	__le32 ibf_timeout:8;
-+	__le32 _rsv2:8;
-+
-+	__le32 ibf_data_bw:3;
-+	__le32 ibf_nc:3;
-+	__le32 ibf_nr:3;
-+	__le32 ibf_ru:9;
-+	__le32 _rsv3:14;
-+
-+	__le32 mob_delta_t:8;
-+	__le32 mob_lq_result:7;
-+	__le32 _rsv5:1;
-+	__le32 _rsv6:16;
-+
-+	__le32 _rsv7;
-+} __packed;
-+
-+struct mt7996_pfmu_tag_event {
-+	struct mt7996_mcu_bf_basic_event event;
-+
-+	u8 bfer;
-+	u8 __rsv[3];
-+
-+	struct mt7996_pfmu_tag1 t1;
-+	struct mt7996_pfmu_tag2 t2;
-+};
-+
-+enum {
-+	UNI_EVENT_BF_PFMU_TAG = 0x5,
-+	UNI_EVENT_BF_PFMU_DATA = 0x7,
-+	UNI_EVENT_BF_STAREC = 0xB,
-+	UNI_EVENT_BF_CAL_PHASE = 0xC,
-+	UNI_EVENT_BF_FBK_INFO = 0x17,
-+	UNI_EVENT_BF_TXSND_INFO = 0x18,
-+	UNI_EVENT_BF_PLY_INFO = 0x19,
-+	UNI_EVENT_BF_METRIC_INFO = 0x1A,
-+	UNI_EVENT_BF_TXCMD_CFG_INFO = 0x1B,
-+	UNI_EVENT_BF_SND_CNT_INFO = 0x1D,
-+	UNI_EVENT_BF_MAX_NUM
-+};
-+
-+enum {
-+	UNI_CMD_MURU_FIXED_RATE_CTRL = 0x11,
-+	UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL,
-+};
-+
-+struct uni_muru_mum_set_group_tbl_entry {
-+	__le16 wlan_idx0;
-+	__le16 wlan_idx1;
-+	__le16 wlan_idx2;
-+	__le16 wlan_idx3;
-+
-+	u8 dl_mcs_user0:4;
-+	u8 dl_mcs_user1:4;
-+	u8 dl_mcs_user2:4;
-+	u8 dl_mcs_user3:4;
-+	u8 ul_mcs_user0:4;
-+	u8 ul_mcs_user1:4;
-+	u8 ul_mcs_user2:4;
-+	u8 ul_mcs_user3:4;
-+
-+	u8 num_user:2;
-+	u8 rsv:6;
-+	u8 nss0:2;
-+	u8 nss1:2;
-+	u8 nss2:2;
-+	u8 nss3:2;
-+	u8 ru_alloc;
-+	u8 ru_alloc_ext;
-+
-+	u8 capa;
-+	u8 gi;
-+	u8 dl_ul;
-+	u8 _rsv2;
-+};
-+
-+enum UNI_CMD_MURU_VER_T {
-+	UNI_CMD_MURU_VER_LEG = 0,
-+	UNI_CMD_MURU_VER_HE,
-+	UNI_CMD_MURU_VER_EHT,
-+	UNI_CMD_MURU_VER_MAX
-+};
-+
-+#define UNI_MAX_MCS_SUPPORT_HE 11
-+#define UNI_MAX_MCS_SUPPORT_EHT 13
-+
-+enum {
-+	RUALLOC_BW20 = 122,
-+	RUALLOC_BW40 = 130,
-+	RUALLOC_BW80 = 134,
-+	RUALLOC_BW160 = 137,
-+	RUALLOC_BW320 = 395,
-+};
-+
-+enum {
-+	MAX_MODBF_VHT = 0,
-+	MAX_MODBF_HE = 2,
-+	MAX_MODBF_EHT = 4,
-+};
-+
-+enum {
-+	BF_SND_READ_INFO = 0,
-+	BF_SND_CFG_OPT,
-+	BF_SND_CFG_INTV,
-+	BF_SND_STA_STOP,
-+	BF_SND_CFG_MAX_STA,
-+	BF_SND_CFG_BFRP,
-+	BF_SND_CFG_INF,
-+	BF_SND_CFG_TXOP_SND
- };
- 
- enum {
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1032-mtk-wifi-mt76-mt7996-add-build-the-following-MURU-mc.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1032-mtk-wifi-mt76-mt7996-add-build-the-following-MURU-mc.patch
deleted file mode 100644
index f6e1f07..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1032-mtk-wifi-mt76-mt7996-add-build-the-following-MURU-mc.patch
+++ /dev/null
@@ -1,189 +0,0 @@
-From e6ce0b945f7cfe7b181223b5e5db4a213c3c4433 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Tue, 13 Jun 2023 14:49:02 +0800
-Subject: [PATCH 1032/1044] mtk: wifi: mt76: mt7996: add build the following
- MURU mcu command tlvs
-
-It includes the following tlvs:
-1. MURU tlv id 0x10, 0x33, 0xC8, 0xC9, 0xCA, 0xCC, 0xCD
-2. BF tlv id 0x1c
-
----
- mt7996/mcu.h         |  1 +
- mt7996/mt7996.h      |  3 ++
- mt7996/mtk_debugfs.c | 12 +++++++
- mt7996/mtk_mcu.c     | 78 ++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.h     | 14 ++++++++
- 5 files changed, 108 insertions(+)
-
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 347893c8..527c9c79 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -776,6 +776,7 @@ enum {
- 	BF_MOD_EN_CTRL = 20,
- 	BF_FBRPT_DBG_INFO_READ = 23,
- 	BF_TXSND_INFO = 24,
-+	BF_CFG_PHY = 28,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 33936f90..4a268a4e 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -815,6 +815,9 @@ void mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb);
- int mt7996_mcu_set_muru_fixed_rate_enable(struct mt7996_dev *dev, u8 action, int val);
- int mt7996_mcu_set_muru_fixed_rate_parameter(struct mt7996_dev *dev, u8 action, void *para);
- int mt7996_mcu_set_txbf_snd_info(struct mt7996_phy *phy, void *para);
-+int mt7996_mcu_set_muru_cmd(struct mt7996_dev *dev, u16 action, int val);
-+int mt7996_mcu_muru_set_prot_frame_thr(struct mt7996_dev *dev, u32 val);
-+int mt7996_mcu_set_bypass_smthint(struct mt7996_phy *phy, u8 val);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 2104c889..9e7acd4b 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -3005,6 +3005,16 @@ static const struct file_operations fops_muru_fixed_group_rate = {
- 	.llseek = default_llseek,
- };
- 
-+static int mt7996_muru_prot_thr_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	return mt7996_mcu_muru_set_prot_frame_thr(phy->dev, (u32)val);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_muru_prot_thr, NULL,
-+			 mt7996_muru_prot_thr_set, "%lld\n");
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -3100,6 +3110,8 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	debugfs_create_file("bf_fbk_rpt", 0600, dir, phy, &fops_bf_fbk_rpt);
- 	debugfs_create_file("pfmu_tag_read", 0600, dir, phy, &fops_bf_pfmu_tag_read);
- 
-+	debugfs_create_file("muru_prot_thr", 0200, dir, phy, &fops_muru_prot_thr);
-+
- 	return 0;
- }
- 
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index 67419cd9..b7d86384 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -906,4 +906,82 @@ error:
- 	return -EINVAL;
- }
- 
-+/**
-+ * This function can be used to build the following commands
-+ * MURU_SUTX_CTRL (0x10)
-+ * SET_FORCE_MU (0x33)
-+ * SET_MUDL_ACK_POLICY (0xC8)
-+ * SET_TRIG_TYPE (0xC9)
-+ * SET_20M_DYN_ALGO (0xCA)
-+ * SET_CERT_MU_EDCA_OVERRIDE (0xCD)
-+ */
-+int mt7996_mcu_set_muru_cmd(struct mt7996_dev *dev, u16 action, int val)
-+{
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 config;
-+		u8 rsv[3];
-+	} __packed data = {
-+		.tag = cpu_to_le16(action),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+		.config = (u8) val,
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &data, sizeof(data),
-+				 false);
-+}
-+
-+int mt7996_mcu_muru_set_prot_frame_thr(struct mt7996_dev *dev, u32 val)
-+{
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le32 prot_frame_thr;
-+	} __packed data = {
-+		.tag = cpu_to_le16(UNI_CMD_MURU_PROT_FRAME_THR),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+		.prot_frame_thr = cpu_to_le32(val),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &data, sizeof(data),
-+				 false);
-+}
-+
-+int mt7996_mcu_set_bypass_smthint(struct mt7996_phy *phy, u8 val)
-+{
-+#define BF_PHY_SMTH_INT_BYPASS 0
-+#define BYPASS_VAL 1
-+	struct mt7996_dev *dev = phy->dev;
-+	struct {
-+		u8 _rsv[4];
-+
-+		u16 tag;
-+		u16 len;
-+
-+		u8 action;
-+		u8 band_idx;
-+		u8 smthintbypass;
-+		u8 __rsv2[5];
-+	} __packed data = {
-+		.tag = cpu_to_le16(BF_CFG_PHY),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+		.action = BF_PHY_SMTH_INT_BYPASS,
-+		.band_idx = phy->mt76->band_idx,
-+		.smthintbypass = val,
-+	};
-+
-+	if (val != BYPASS_VAL)
-+		return -EINVAL;
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &data, sizeof(data),
-+				 true);
-+}
-+
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 71c6684a..b061950c 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -119,6 +119,20 @@ enum {
- 	EDCCA_FCC = 1,
- 	EDCCA_ETSI = 2,
- 	EDCCA_JAPAN = 3
-+};
-+
-+enum {
-+	UNI_CMD_MURU_SUTX_CTRL = 0x10,
-+	UNI_CMD_MURU_FIXED_RATE_CTRL,
-+	UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL,
-+	UNI_CMD_MURU_SET_FORCE_MU = 0x33,
-+	UNI_CMD_MURU_MUNUAL_CONFIG = 0x64,
-+	UNI_CMD_MURU_SET_MUDL_ACK_POLICY = 0xC9,
-+	UNI_CMD_MURU_SET_TRIG_TYPE,
-+	UNI_CMD_MURU_SET_20M_DYN_ALGO,
-+	UNI_CMD_MURU_PROT_FRAME_THR = 0xCC,
-+	UNI_CMD_MURU_SET_CERT_MU_EDCA_OVERRIDE,
-+};
- 
- struct bf_pfmu_tag {
- 	__le16 tag;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1033-mtk-wifi-mt76-mt7996-add-cert-patch.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1033-mtk-wifi-mt76-mt7996-add-cert-patch.patch
deleted file mode 100644
index 951e868..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1033-mtk-wifi-mt76-mt7996-add-cert-patch.patch
+++ /dev/null
@@ -1,1094 +0,0 @@
-From 775ed42df549473e6e9e966ac2d9abcfed74a73b Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Mon, 14 Aug 2023 13:36:58 +0800
-Subject: [PATCH 1033/1044] mtk: wifi: mt76: mt7996: add cert patch
-
-This patch includes TGac and TGax
-
-Commit histroy:
-
-Add vendor cmd set ap wireless rts_sigta support
-
-Signed-off-by: ye he <ye.he@mediatek.com>
----
- mt7996/mac.c     |   9 ++
- mt7996/main.c    |  31 ++++++-
- mt7996/mcu.c     |  40 +++++++++
- mt7996/mcu.h     |   6 ++
- mt7996/mt7996.h  |  13 +++
- mt7996/mtk_mcu.c | 205 ++++++++++++++++++++++++++++++++++++++++++
- mt7996/mtk_mcu.h | 184 +++++++++++++++++++++++++++++++++++--
- mt7996/vendor.c  | 230 ++++++++++++++++++++++++++++++++++++++++++++++-
- mt7996/vendor.h  |  67 ++++++++++++++
- 9 files changed, 778 insertions(+), 7 deletions(-)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 7885bc4c..bf42ae07 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -10,6 +10,7 @@
- #include "../dma.h"
- #include "mac.h"
- #include "mcu.h"
-+#include "vendor.h"
- 
- #define to_rssi(field, rcpi)	((FIELD_GET(field, rcpi) - 220) / 2)
- 
-@@ -2285,6 +2286,14 @@ void mt7996_mac_update_stats(struct mt7996_phy *phy)
- 	}
- }
- 
-+void mt7996_set_wireless_amsdu(struct ieee80211_hw *hw, u8 en)
-+{
-+	if (en)
-+		ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
-+	else
-+		ieee80211_hw_clear(hw, SUPPORTS_AMSDU_IN_AMPDU);
-+}
-+
- void mt7996_mac_sta_rc_work(struct work_struct *work)
- {
- 	struct mt7996_dev *dev = container_of(work, struct mt7996_dev, rc_work);
-diff --git a/mt7996/main.c b/mt7996/main.c
-index dbe3d33f..d314d9fb 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -588,6 +588,7 @@ mt7996_get_rates_table(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		       bool beacon, bool mcast)
- {
- 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
-+	struct mt7996_dev *dev = mt7996_hw_dev(hw);
- 	struct mt76_phy *mphy = hw->priv;
- 	u16 rate;
- 	u8 i, idx;
-@@ -597,6 +598,9 @@ mt7996_get_rates_table(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 	if (beacon) {
- 		struct mt7996_phy *phy = mphy->priv;
- 
-+		if (dev->cert_mode && phy->mt76->band_idx == MT_BAND2)
-+			rate = 0x0200;
-+
- 		/* odd index for driver, even index for firmware */
- 		idx = MT7996_BEACON_RATES_TBL + 2 * phy->mt76->band_idx;
- 		if (phy->beacon_rate != rate)
-@@ -726,6 +730,10 @@ int mt7996_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- 	u8 band_idx = mvif->phy->mt76->band_idx;
- 	int ret, idx;
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	struct mt7996_phy *phy = &dev->phy;
-+#endif
-+
- 	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA);
- 	if (idx < 0)
- 		return -ENOSPC;
-@@ -751,7 +759,28 @@ int mt7996_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- 	if (ret)
- 		return ret;
- 
--	return mt7996_mcu_add_rate_ctrl(dev, vif, sta, false);
-+	ret = mt7996_mcu_add_rate_ctrl(dev, vif, sta, false);
-+	if (ret)
-+		return ret;
-+
-+#ifdef CONFIG_MTK_VENDOR
-+	switch (band_idx) {
-+	case MT_BAND1:
-+		phy = mt7996_phy2(dev);
-+		break;
-+	case MT_BAND2:
-+		phy = mt7996_phy3(dev);
-+		break;
-+	case MT_BAND0:
-+	default:
-+		break;
-+	}
-+
-+	if (phy && phy->muru_onoff & MUMIMO_DL_CERT)
-+		mt7996_mcu_set_mimo(phy);
-+#endif
-+
-+	return 0;
- }
- 
- void mt7996_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index d4cd83c6..3a34afd9 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1349,6 +1349,10 @@ mt7996_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- {
- 	struct sta_rec_vht *vht;
- 	struct tlv *tlv;
-+#ifdef CONFIG_MTK_VENDOR
-+	struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
-+	struct mt7996_phy *phy = (struct mt7996_phy *)msta->vif->phy;
-+#endif
- 
- 	/* For 6G band, this tlv is necessary to let hw work normally */
- 	if (!sta->deflink.he_6ghz_capa.capa && !sta->deflink.vht_cap.vht_supported)
-@@ -1360,6 +1364,9 @@ mt7996_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
- 	vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
- 	vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
- 	vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
-+#ifdef CONFIG_MTK_VENDOR
-+	vht->rts_bw_sig = phy->rts_bw_sig;
-+#endif
- }
- 
- static void
-@@ -4450,6 +4457,27 @@ int mt7996_mcu_set_rts_thresh(struct mt7996_phy *phy, u32 val)
- 				 &req, sizeof(req), true);
- }
- 
-+int mt7996_mcu_set_band_confg(struct mt7996_phy *phy, u16 option, bool enable)
-+{
-+	struct {
-+		u8 band_idx;
-+		u8 _rsv[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		bool enable;
-+		u8 _rsv2[3];
-+	} __packed req = {
-+		.band_idx = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(option),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.enable = enable,
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(BAND_CONFIG),
-+				 &req, sizeof(req), true);
-+}
-+
- int mt7996_mcu_set_radio_en(struct mt7996_phy *phy, bool enable)
- {
- 	struct {
-@@ -4965,6 +4993,18 @@ void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
- 	val = FIELD_GET(RATE_CFG_VAL, *((u32 *)data));
- 
- 	switch (mode) {
-+	case RATE_PARAM_FIXED_OFDMA:
-+		if (val == 3)
-+			phy->muru_onoff = OFDMA_DL;
-+		else
-+			phy->muru_onoff = val;
-+		break;
-+	case RATE_PARAM_FIXED_MIMO:
-+		if (val == 0)
-+			phy->muru_onoff = MUMIMO_DL_CERT | MUMIMO_DL;
-+		else
-+			phy->muru_onoff = MUMIMO_UL;
-+		break;
- 	case RATE_PARAM_AUTO_MU:
- 		if (val < 0 || val > 15) {
- 			printk("Wrong value! The value is between 0-15.\n");
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 527c9c79..af078edd 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -755,6 +755,8 @@ enum {
- 	RATE_PARAM_FIXED_GI = 11,
- 	RATE_PARAM_AUTO = 20,
- #ifdef CONFIG_MTK_VENDOR
-+	RATE_PARAM_FIXED_MIMO = 30,
-+	RATE_PARAM_FIXED_OFDMA = 31,
- 	RATE_PARAM_AUTO_MU = 32,
- #endif
- };
-@@ -767,6 +769,7 @@ enum {
- #define OFDMA_UL                       BIT(1)
- #define MUMIMO_DL                      BIT(2)
- #define MUMIMO_UL                      BIT(3)
-+#define MUMIMO_DL_CERT                 BIT(4)
- 
- enum {
- 	BF_SOUNDING_ON = 1,
-@@ -853,11 +856,14 @@ enum {
- 	UNI_BAND_CONFIG_EDCCA_ENABLE = 0x05,
- 	UNI_BAND_CONFIG_EDCCA_THRESHOLD = 0x06,
- 	UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08,
-+	UNI_BAND_CONFIG_RTS_SIGTA_EN = 0x09,
-+	UNI_BAND_CONFIG_DIS_SECCH_CCA_DET = 0x0a,
- };
- 
- enum {
- 	UNI_WSYS_CONFIG_FW_LOG_CTRL,
- 	UNI_WSYS_CONFIG_FW_DBG_CTRL,
-+	UNI_CMD_CERT_CFG = 6,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 4a268a4e..b9c37612 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -349,6 +349,7 @@ struct mt7996_phy {
- 	} test;
- #endif
- #ifdef CONFIG_MTK_VENDOR
-+	u8 rts_bw_sig;
- 	spinlock_t amnt_lock;
- 	struct mt7996_air_monitor_ctrl amnt_ctrl;
- #endif
-@@ -476,6 +477,9 @@ struct mt7996_dev {
- 	} dbg;
- 	const struct mt7996_dbg_reg_desc *dbg_reg;
- #endif
-+#ifdef CONFIG_MTK_VENDOR
-+	bool cert_mode;
-+#endif
- };
- 
- enum {
-@@ -673,6 +677,7 @@ void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
- int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event);
- int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable);
- void mt7996_mcu_scs_sta_poll(struct work_struct *work);
-+int mt7996_mcu_set_band_confg(struct mt7996_phy *phy, u16 option, bool enable);
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
-@@ -791,6 +796,10 @@ void mt7996_vendor_register(struct mt7996_phy *phy);
- void mt7996_vendor_amnt_fill_rx(struct mt7996_phy *phy, struct sk_buff *skb);
- int mt7996_vendor_amnt_sta_remove(struct mt7996_phy *phy,
- 				  struct ieee80211_sta *sta);
-+void mt7996_set_wireless_amsdu(struct ieee80211_hw *hw, u8 en);
-+void mt7996_mcu_set_mimo(struct mt7996_phy *phy);
-+int mt7996_set_muru_cfg(struct mt7996_phy *phy, u8 action, u8 val);
-+int mt7996_mcu_set_muru_cfg(struct mt7996_phy *phy, void *data);
- #endif
- 
- int mt7996_mcu_edcca_enable(struct mt7996_phy *phy, bool enable);
-@@ -818,6 +827,10 @@ int mt7996_mcu_set_txbf_snd_info(struct mt7996_phy *phy, void *para);
- int mt7996_mcu_set_muru_cmd(struct mt7996_dev *dev, u16 action, int val);
- int mt7996_mcu_muru_set_prot_frame_thr(struct mt7996_dev *dev, u32 val);
- int mt7996_mcu_set_bypass_smthint(struct mt7996_phy *phy, u8 val);
-+int mt7996_mcu_set_rfeature_trig_type(struct mt7996_phy *phy, u8 enable, u8 trig_type);
-+void mt7996_mcu_set_ppdu_tx_type(struct mt7996_phy *phy, u8 ppdu_type);
-+void mt7996_mcu_set_nusers_ofdma(struct mt7996_phy *phy, u8 type, u8 ofdma_user_cnt);
-+void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index b7d86384..cacca449 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -984,4 +984,209 @@ int mt7996_mcu_set_bypass_smthint(struct mt7996_phy *phy, u8 val)
- 				 true);
- }
- 
-+int mt7996_mcu_set_bsrp_ctrl(struct mt7996_phy *phy, u16 interval,
-+			     u16 ru_alloc, u32 trig_type, u8 trig_flow, u8 ext_cmd)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		__le16 interval;
-+		__le16 ru_alloc;
-+		__le32 trigger_type;
-+		u8 trigger_flow;
-+		u8 ext_cmd_bsrp;
-+		u8 band_bitmap;
-+		u8 _rsv2;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_MURU_BSRP_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.interval = cpu_to_le16(interval),
-+		.ru_alloc = cpu_to_le16(ru_alloc),
-+		.trigger_type = cpu_to_le32(trig_type),
-+		.trigger_flow = trig_flow,
-+		.ext_cmd_bsrp = ext_cmd,
-+		.band_bitmap = BIT(phy->mt76->band_idx),
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &req,
-+				 sizeof(req), false);
-+}
-+
-+int mt7996_mcu_set_rfeature_trig_type(struct mt7996_phy *phy, u8 enable, u8 trig_type)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	int ret = 0;
-+	char buf[] = "01:00:00:1B";
-+
-+	if (enable) {
-+		ret = mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_TRIG_TYPE, trig_type);
-+		if (ret)
-+			return ret;
-+	}
-+
-+	switch (trig_type) {
-+	case CAPI_BASIC:
-+		return mt7996_mcu_set_bsrp_ctrl(phy, 5, 67, 0, 0, enable);
-+	case CAPI_BRP:
-+		return mt7996_mcu_set_txbf_snd_info(phy, buf);
-+	case CAPI_MU_BAR:
-+		return mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_MUDL_ACK_POLICY,
-+					       MU_DL_ACK_POLICY_MU_BAR);
-+	case CAPI_BSRP:
-+		return mt7996_mcu_set_bsrp_ctrl(phy, 5, 67, 4, 0, enable);
-+	default:
-+		return 0;
-+	}
-+}
-+
-+int mt7996_mcu_set_muru_cfg(struct mt7996_phy *phy, void *data)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_muru *muru;
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 version;
-+		u8 revision;
-+		u8 _rsv2[2];
-+
-+		struct mt7996_muru muru;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_MURU_MUNUAL_CONFIG),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.version = UNI_CMD_MURU_VER_EHT,
-+	};
-+
-+	muru = (struct mt7996_muru *) data;
-+	memcpy(&req.muru, muru, sizeof(struct mt7996_muru));
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(MURU), &req,
-+				 sizeof(req), false);
-+}
-+
-+int mt7996_set_muru_cfg(struct mt7996_phy *phy, u8 action, u8 val)
-+{
-+	struct mt7996_muru *muru;
-+	struct mt7996_muru_dl *dl;
-+	struct mt7996_muru_ul *ul;
-+	struct mt7996_muru_comm *comm;
-+	int ret = 0;
-+
-+	muru = kzalloc(sizeof(struct mt7996_muru), GFP_KERNEL);
-+	dl = &muru->dl;
-+	ul = &muru->ul;
-+	comm = &muru->comm;
-+
-+	switch (action) {
-+	case MU_CTRL_DL_USER_CNT:
-+		dl->user_num = val;
-+		comm->ppdu_format = MURU_PPDU_HE_MU;
-+		comm->sch_type = MURU_OFDMA_SCH_TYPE_DL;
-+		muru->cfg_comm = cpu_to_le32(MURU_COMM_SET);
-+		muru->cfg_dl = cpu_to_le32(MURU_FIXED_DL_TOTAL_USER_CNT);
-+		ret = mt7996_mcu_set_muru_cfg(phy, muru);
-+		break;
-+	case MU_CTRL_UL_USER_CNT:
-+		ul->user_num = val;
-+		comm->ppdu_format = MURU_PPDU_HE_TRIG;
-+		comm->sch_type = MURU_OFDMA_SCH_TYPE_UL;
-+		muru->cfg_comm = cpu_to_le32(MURU_COMM_SET);
-+		muru->cfg_ul = cpu_to_le32(MURU_FIXED_UL_TOTAL_USER_CNT);
-+		ret = mt7996_mcu_set_muru_cfg(phy, muru);
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	kfree(muru);
-+	return ret;
-+}
-+
-+void mt7996_mcu_set_ppdu_tx_type(struct mt7996_phy *phy, u8 ppdu_type)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	int enable_su;
-+
-+	switch (ppdu_type) {
-+	case CAPI_SU:
-+		enable_su = 1;
-+		mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SUTX_CTRL, enable_su);
-+		mt7996_set_muru_cfg(phy, MU_CTRL_DL_USER_CNT, 0);
-+		break;
-+	case CAPI_MU:
-+		enable_su = 0;
-+		mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SUTX_CTRL, enable_su);
-+		break;
-+	default:
-+		break;
-+	}
-+}
-+
-+void mt7996_mcu_set_nusers_ofdma(struct mt7996_phy *phy, u8 type, u8 user_cnt)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	int enable_su = 0;
-+
-+	mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SUTX_CTRL, enable_su);
-+	mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_MUDL_ACK_POLICY, MU_DL_ACK_POLICY_SU_BAR);
-+	mt7996_mcu_muru_set_prot_frame_thr(dev, 9999);
-+
-+	mt7996_set_muru_cfg(phy, type, user_cnt);
-+}
-+
-+void mt7996_mcu_set_mimo(struct mt7996_phy *phy)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
-+	int disable_ra = 1;
-+	char buf[] = "2 134 0 1 0 1 2 2 2";
-+	int force_mu = 1;
-+
-+	switch (chandef->width) {
-+	case NL80211_CHAN_WIDTH_20_NOHT:
-+	case NL80211_CHAN_WIDTH_20:
-+		strscpy(buf, "2 122 0 1 0 1 2 2 2", sizeof(buf));
-+		break;
-+	case NL80211_CHAN_WIDTH_80:
-+		break;
-+	case NL80211_CHAN_WIDTH_160:
-+		strscpy(buf, "2 137 0 1 0 1 2 2 2", sizeof(buf));
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_MUDL_ACK_POLICY, MU_DL_ACK_POLICY_SU_BAR);
-+	mt7996_mcu_set_muru_fixed_rate_enable(dev, UNI_CMD_MURU_FIXED_RATE_CTRL, disable_ra);
-+	mt7996_mcu_set_muru_fixed_rate_parameter(dev, UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL, buf);
-+	mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_FORCE_MU, force_mu);
-+}
-+
-+void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 action;
-+		u8 _rsv2[3];
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_CMD_CERT_CFG),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.action = type, /* 1: CAPI Enable */
-+	};
-+
-+	mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(WSYS_CONFIG), &req,
-+			  sizeof(req), false);
-+}
-+
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index b061950c..98c9660a 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -122,14 +122,15 @@ enum {
- };
- 
- enum {
-+	UNI_CMD_MURU_BSRP_CTRL = 0x01,
- 	UNI_CMD_MURU_SUTX_CTRL = 0x10,
--	UNI_CMD_MURU_FIXED_RATE_CTRL,
--	UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL,
-+	UNI_CMD_MURU_FIXED_RATE_CTRL = 0x11,
-+	UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL = 0x12,
- 	UNI_CMD_MURU_SET_FORCE_MU = 0x33,
- 	UNI_CMD_MURU_MUNUAL_CONFIG = 0x64,
--	UNI_CMD_MURU_SET_MUDL_ACK_POLICY = 0xC9,
--	UNI_CMD_MURU_SET_TRIG_TYPE,
--	UNI_CMD_MURU_SET_20M_DYN_ALGO,
-+	UNI_CMD_MURU_SET_MUDL_ACK_POLICY = 0xC8,
-+	UNI_CMD_MURU_SET_TRIG_TYPE = 0xC9,
-+	UNI_CMD_MURU_SET_20M_DYN_ALGO = 0xCA,
- 	UNI_CMD_MURU_PROT_FRAME_THR = 0xCC,
- 	UNI_CMD_MURU_SET_CERT_MU_EDCA_OVERRIDE,
- };
-@@ -533,6 +534,179 @@ struct mt7996_mcu_sr_hw_ind_event {
- 	__le32 sr_ampdu_mpdu_cnt;
- 	__le32 sr_ampdu_mpdu_acked_cnt;
- };
-+
-+struct mt7996_muru_comm {
-+	u8 pda_pol;
-+	u8 band;
-+	u8 spe_idx;
-+	u8 proc_type;
-+
-+	__le16 mlo_ctrl;
-+	u8 sch_type;
-+	u8 ppdu_format;
-+	u8 ac;
-+	u8 _rsv[3];
-+};
-+
-+struct mt7996_muru_dl {
-+	u8 user_num;
-+	u8 tx_mode;
-+	u8 bw;
-+	u8 gi;
-+
-+	u8 ltf;
-+	u8 mcs;
-+	u8 dcm;
-+	u8 cmprs;
-+
-+	__le16 ru[16];
-+
-+	u8 c26[2];
-+	u8 ack_policy;
-+	u8 tx_power;
-+
-+	__le16 mu_ppdu_duration;
-+	u8 agc_disp_order;
-+	u8 _rsv1;
-+
-+	u8 agc_disp_pol;
-+	u8 agc_disp_ratio;
-+	__le16 agc_disp_linkMFG;
-+
-+	__le16 prmbl_punc_bmp;
-+	u8 _rsv2[2];
-+
-+	struct {
-+		__le16 wlan_idx;
-+		u8 ru_alloc_seg;
-+		u8 ru_idx;
-+		u8 ldpc;
-+		u8 nss;
-+		u8 mcs;
-+		u8 mu_group_idx;
-+		u8 vht_groud_id;
-+		u8 vht_up;
-+		u8 he_start_stream;
-+		u8 he_mu_spatial;
-+		__le16 tx_power_alpha;
-+		u8 ack_policy;
-+		u8 ru_allo_ps160;
-+	} usr[16];
-+};
-+
-+struct mt7996_muru_ul {
-+	u8 user_num;
-+	u8 tx_mode;
-+
-+	u8 ba_type;
-+	u8 _rsv;
-+
-+	u8 bw;
-+	u8 gi_ltf;
-+	__le16 ul_len;
-+
-+	__le16 trig_cnt;
-+	u8 pad;
-+	u8 trig_type;
-+
-+	__le16 trig_intv;
-+	u8 trig_ta[ETH_ALEN];
-+	__le16 ul_ru[16];
-+
-+	u8 c26[2];
-+	__le16 agc_disp_linkMFG;
-+
-+	u8 agc_disp_mu_len;
-+	u8 agc_disp_pol;
-+	u8 agc_disp_ratio;
-+	u8 agc_disp_pu_idx;
-+
-+	struct {
-+		__le16 wlan_idx;
-+		u8 ru_alloc_seg;
-+		u8 ru_idx;
-+		u8 ldpc;
-+		u8 nss;
-+		u8 mcs;
-+		u8 target_rssi;
-+		__le32 trig_pkt_size;
-+		u8 ru_allo_ps160;
-+		u8 _rsv2[3];
-+	} usr[16];
-+};
-+
-+struct mt7996_muru_dbg {
-+	/* HE TB RX Debug */
-+	__le32 rx_hetb_nonsf_en_bitmap;
-+	__le32 rx_hetb_cfg[2];
-+};
-+
-+struct mt7996_muru {
-+	__le32 cfg_comm;
-+	__le32 cfg_dl;
-+	__le32 cfg_ul;
-+	__le32 cfg_dbg;
-+
-+	struct mt7996_muru_comm comm;
-+	struct mt7996_muru_dl dl;
-+	struct mt7996_muru_ul ul;
-+	struct mt7996_muru_dbg dbg;
-+};
-+
-+
-+#define MURU_PPDU_HE_TRIG	BIT(2)
-+#define MURU_PPDU_HE_MU		BIT(3)
-+
-+#define MURU_OFDMA_SCH_TYPE_DL	BIT(0)
-+#define MURU_OFDMA_SCH_TYPE_UL	BIT(1)
-+
-+/* Common Config */
-+#define MURU_COMM_PPDU_FMT	BIT(0)
-+#define MURU_COMM_SCH_TYPE	BIT(1)
-+#define MURU_COMM_BAND		BIT(2)
-+#define MURU_COMM_WMM		BIT(3)
-+#define MURU_COMM_SPE_IDX	BIT(4)
-+#define MURU_COMM_PROC_TYPE	BIT(5)
-+#define MURU_COMM_SET		(MURU_COMM_PPDU_FMT | MURU_COMM_SCH_TYPE)
-+#define MURU_COMM_SET_TM	(MURU_COMM_PPDU_FMT | MURU_COMM_BAND | \
-+				 MURU_COMM_WMM | MURU_COMM_SPE_IDX)
-+
-+/* DL Common config */
-+#define MURU_FIXED_DL_TOTAL_USER_CNT	BIT(4)
-+
-+/* UL Common Config */
-+#define MURU_FIXED_UL_TOTAL_USER_CNT	BIT(4)
-+
-+enum {
-+	CAPI_SU,
-+	CAPI_MU,
-+	CAPI_ER_SU,
-+	CAPI_TB,
-+	CAPI_LEGACY
-+};
-+
-+enum {
-+	CAPI_BASIC,
-+	CAPI_BRP,
-+	CAPI_MU_BAR,
-+	CAPI_MU_RTS,
-+	CAPI_BSRP,
-+	CAPI_GCR_MU_BAR,
-+	CAPI_BQRP,
-+	CAPI_NDP_FRP,
-+};
-+
-+enum {
-+	MU_DL_ACK_POLICY_MU_BAR = 3,
-+	MU_DL_ACK_POLICY_TF_FOR_ACK = 4,
-+	MU_DL_ACK_POLICY_SU_BAR = 5,
-+};
-+
-+enum muru_vendor_ctrl {
-+	MU_CTRL_UPDATE,
-+	MU_CTRL_DL_USER_CNT,
-+	MU_CTRL_UL_USER_CNT,
-+};
- #endif
- 
- #endif
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index 9ba6f00a..477c5c42 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -10,10 +10,31 @@
- #include "vendor.h"
- #include "mtk_mcu.h"
- 
-+#ifdef CONFIG_MTK_VENDOR
- static const struct nla_policy
- mu_ctrl_policy[NUM_MTK_VENDOR_ATTRS_MU_CTRL] = {
- 	[MTK_VENDOR_ATTR_MU_CTRL_ONOFF] = {.type = NLA_U8 },
- 	[MTK_VENDOR_ATTR_MU_CTRL_DUMP] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_MU_CTRL_STRUCT] = {.type = NLA_BINARY },
-+};
-+
-+static const struct nla_policy
-+wireless_ctrl_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL] = {
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_AMPDU] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_OFDMA] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE] = {.type = NLA_U16 },
-+};
-+
-+static const struct nla_policy
-+wireless_dump_policy[NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP] = {
-+	[MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU] = { .type = NLA_U8 },
- };
- 
- static const struct nla_policy
-@@ -70,6 +91,17 @@ ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
- 	[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+rfeature_ctrl_policy[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL] = {
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI] = {.type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG] = { .type = NLA_NESTED },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF] = { .type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -84,6 +116,8 @@ static int mt7996_vendor_mu_ctrl(struct wiphy *wiphy,
- {
- 	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
- 	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_MU_CTRL];
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct mt7996_muru *muru;
- 	int err;
- 	u8 val8;
- 	u32 val32 = 0;
-@@ -99,9 +133,17 @@ static int mt7996_vendor_mu_ctrl(struct wiphy *wiphy,
- 			 FIELD_PREP(RATE_CFG_VAL, val8);
- 		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
- 							   mt7996_set_wireless_vif, &val32);
-+	} else if (tb[MTK_VENDOR_ATTR_MU_CTRL_STRUCT]) {
-+		muru = kzalloc(sizeof(struct mt7996_muru), GFP_KERNEL);
-+
-+		nla_memcpy(muru, tb[MTK_VENDOR_ATTR_MU_CTRL_STRUCT],
-+			   sizeof(struct mt7996_muru));
-+
-+		err = mt7996_mcu_set_muru_cfg(phy, muru);
-+		kfree(muru);
- 	}
- 
--	return 0;
-+	return err;
- }
- 
- static int
-@@ -124,6 +166,48 @@ mt7996_vendor_mu_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return len;
- }
- 
-+void mt7996_set_wireless_rts_sigta(struct ieee80211_hw *hw, u8 value) {
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+
-+	switch (value) {
-+	case BW_SIGNALING_STATIC:
-+	case BW_SIGNALING_DYNAMIC:
-+		mt7996_mcu_set_band_confg(phy, UNI_BAND_CONFIG_RTS_SIGTA_EN, true);
-+		mt7996_mcu_set_band_confg(phy, UNI_BAND_CONFIG_DIS_SECCH_CCA_DET, false);
-+		break;
-+	default:
-+		value = BW_SIGNALING_DISABLE;
-+		mt7996_mcu_set_band_confg(phy, UNI_BAND_CONFIG_RTS_SIGTA_EN, false);
-+		mt7996_mcu_set_band_confg(phy, UNI_BAND_CONFIG_DIS_SECCH_CCA_DET, true);
-+		break;
-+      }
-+
-+	phy->rts_bw_sig = value;
-+
-+	/* Set RTS Threshold to a lower Value */
-+	mt7996_mcu_set_rts_thresh(phy, 500);
-+}
-+
-+static int
-+mt7996_vendor_wireless_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+				 struct sk_buff *skb, const void *data, int data_len,
-+				 unsigned long *storage)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	int len = 0;
-+
-+	if (*storage == 1)
-+		return -ENOENT;
-+	*storage = 1;
-+
-+	if (nla_put_u8(skb, MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU,
-+		       ieee80211_hw_check(hw, SUPPORTS_AMSDU_IN_AMPDU)))
-+	return -ENOMEM;
-+	len += 1;
-+
-+	return len;
-+ }
-+
- void mt7996_vendor_amnt_fill_rx(struct mt7996_phy *phy, struct sk_buff *skb)
- {
- 	struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
-@@ -647,6 +731,126 @@ mt7996_vendor_ibf_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return 1;
- }
- 
-+static int mt7996_vendor_rfeature_ctrl(struct wiphy *wiphy,
-+				       struct wireless_dev *wdev,
-+				       const void *data,
-+				       int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct mt7996_dev *dev = phy->dev;
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL];
-+	int err;
-+	u32 val;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_RFEATURE_CTRL_MAX, data, data_len,
-+			rfeature_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	val = CAPI_RFEATURE_CHANGED;
-+
-+	if (tb[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG]) {
-+		u8 enable, trig_type;
-+		int rem;
-+		struct nlattr *cur;
-+
-+		nla_for_each_nested(cur, tb[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG], rem) {
-+			switch (nla_type(cur)) {
-+			case MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN:
-+				enable = nla_get_u8(cur);
-+				break;
-+			case MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE:
-+				trig_type = nla_get_u8(cur);
-+				break;
-+			default:
-+				return -EINVAL;
-+			};
-+		}
-+
-+		err = mt7996_mcu_set_rfeature_trig_type(phy, enable, trig_type);
-+		if (err)
-+			return err;
-+	} else if (tb[MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY]) {
-+		u8 ack_policy;
-+
-+		ack_policy = nla_get_u8(tb[MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY]);
-+		switch (ack_policy) {
-+		case MU_DL_ACK_POLICY_TF_FOR_ACK:
-+			return mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_MUDL_ACK_POLICY,
-+						       ack_policy);
-+		default:
-+			return 0;
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+static int mt7996_vendor_wireless_ctrl(struct wiphy *wiphy,
-+				       struct wireless_dev *wdev,
-+				       const void *data,
-+				       int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct mt7996_dev *dev = phy->dev;
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL];
-+	int err;
-+	u8 val8;
-+	u16 val16;
-+	u32 val32;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_WIRELESS_CTRL_MAX, data, data_len,
-+			wireless_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	val32 = CAPI_WIRELESS_CHANGED;
-+
-+	if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_OFDMA]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_OFDMA]);
-+		val32 |= FIELD_PREP(RATE_CFG_MODE, RATE_PARAM_FIXED_OFDMA) |
-+			 FIELD_PREP(RATE_CFG_VAL, val8);
-+		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
-+			mt7996_set_wireless_vif, &val32);
-+		if (val8 == 3) /* DL20and80 */
-+			mt7996_mcu_set_muru_cmd(dev, UNI_CMD_MURU_SET_20M_DYN_ALGO, 1);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE]) {
-+		val16 = nla_get_u16(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE]);
-+		hw->max_tx_aggregation_subframes = val16;
-+		hw->max_rx_aggregation_subframes = val16;
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE]);
-+		mt7996_mcu_set_ppdu_tx_type(phy, val8);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA]);
-+		if (phy->muru_onoff & OFDMA_UL)
-+			mt7996_mcu_set_nusers_ofdma(phy, MU_CTRL_UL_USER_CNT, val8);
-+		else
-+			mt7996_mcu_set_nusers_ofdma(phy, MU_CTRL_DL_USER_CNT, val8);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO]);
-+		val32 |= FIELD_PREP(RATE_CFG_MODE, RATE_PARAM_FIXED_MIMO) |
-+			 FIELD_PREP(RATE_CFG_VAL, val8);
-+		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
-+			mt7996_set_wireless_vif, &val32);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT]);
-+		dev->cert_mode = val8;
-+		mt7996_mcu_set_cert(phy, val8);
-+		mt7996_mcu_set_bypass_smthint(phy, val8);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU]);
-+		mt7996_set_wireless_amsdu(hw, val8);
-+	} else if (tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA]);
-+		mt7996_set_wireless_rts_sigta(hw, val8);
-+	}
-+
-+	return 0;
-+}
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -660,6 +864,18 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = mu_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_MU_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+		        .vendor_id = MTK_NL80211_VENDOR_ID,
-+		        .subcmd = MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+		        WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_wireless_ctrl,
-+		.dumpit = mt7996_vendor_wireless_ctrl_dump,
-+		.policy = wireless_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_WIRELESS_CTRL_MAX,
-+	},
- 	{
- 		.info = {
- 			.vendor_id = MTK_NL80211_VENDOR_ID,
-@@ -718,6 +934,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = ibf_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_IBF_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_rfeature_ctrl,
-+		.policy = rfeature_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_RFEATURE_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-@@ -727,3 +954,4 @@ void mt7996_vendor_register(struct mt7996_phy *phy)
- 
- 	spin_lock_init(&phy->amnt_lock);
- }
-+#endif
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 29ccc050..7011914b 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -3,8 +3,12 @@
- 
- #define MTK_NL80211_VENDOR_ID	0x0ce7
- 
-+#ifdef CONFIG_MTK_VENDOR
-+
- enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
-+	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
-+	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
- 	MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
- 	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8,
-@@ -60,6 +64,7 @@ enum mtk_vendor_attr_mu_ctrl {
- 
- 	MTK_VENDOR_ATTR_MU_CTRL_ONOFF,
- 	MTK_VENDOR_ATTR_MU_CTRL_DUMP,
-+	MTK_VENDOR_ATTR_MU_CTRL_STRUCT,
- 
- 	/* keep last */
- 	NUM_MTK_VENDOR_ATTRS_MU_CTRL,
-@@ -67,6 +72,66 @@ enum mtk_vendor_attr_mu_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_MU_CTRL - 1
- };
- 
-+enum mtk_capi_control_changed {
-+	CAPI_RFEATURE_CHANGED = BIT(16),
-+	CAPI_WIRELESS_CHANGED = BIT(17),
-+};
-+
-+enum mtk_vendor_attr_rfeature_ctrl {
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL,
-+	MTK_VENDOR_ATTR_RFEATURE_CTRL_MAX =
-+	NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_wireless_ctrl {
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_OFDMA,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_AMPDU,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT = 9,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_RTS_SIGTA,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_MU_EDCA, /* reserve */
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL,
-+	MTK_VENDOR_ATTR_WIRELESS_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_WIRELESS_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_wireless_dump {
-+	MTK_VENDOR_ATTR_WIRELESS_DUMP_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_WIRELESS_DUMP_AMSDU,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP,
-+	MTK_VENDOR_ATTR_WIRELESS_DUMP_MAX =
-+		NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
-+};
-+
-+enum bw_sig {
-+	BW_SIGNALING_DISABLE,
-+	BW_SIGNALING_STATIC,
-+	BW_SIGNALING_DYNAMIC
-+};
-+
- enum mtk_vendor_attr_mnt_ctrl {
- 	MTK_VENDOR_ATTR_AMNT_CTRL_UNSPEC,
- 
-@@ -138,3 +203,5 @@ enum mtk_vendor_attr_ibf_dump {
- };
- 
- #endif
-+
-+#endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1034-mtk-wifi-mt76-testmode-add-testmode-bf-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1034-mtk-wifi-mt76-testmode-add-testmode-bf-support.patch
deleted file mode 100644
index c0cf121..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1034-mtk-wifi-mt76-testmode-add-testmode-bf-support.patch
+++ /dev/null
@@ -1,1833 +0,0 @@
-From e5de8b93a62c62b5c44b10022e53d410f93c70d6 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Thu, 6 Apr 2023 16:40:28 +0800
-Subject: [PATCH 1034/1044] mtk: wifi: mt76: testmode: add testmode bf support
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Add iTest additional bf command
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-fw return Gx (5g band) ibf cal struct for both 2G and 5G ibf.
-Therefore, memcpy cannot be used for 2G ibf cal.
-https://gerrit.mediatek.inc/c/neptune/wlan_driver/logan/+/8206056
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt76.h               |   5 +
- mt76_connac_mcu.h    |   4 +-
- mt7996/mcu.c         |   8 +-
- mt7996/mcu.h         |  45 ++-
- mt7996/mt7996.h      |  12 +-
- mt7996/mtk_debugfs.c |   6 +-
- mt7996/mtk_mcu.c     |  79 ++++-
- mt7996/mtk_mcu.h     | 338 +++++++++++++++++++-
- mt7996/regs.h        |   3 +
- mt7996/testmode.c    | 744 +++++++++++++++++++++++++++++++++++++++++--
- mt7996/testmode.h    |  19 ++
- testmode.c           |  60 ++++
- testmode.h           |  53 +++
- tools/fields.c       |  37 +++
- 14 files changed, 1354 insertions(+), 59 deletions(-)
-
-diff --git a/mt76.h b/mt76.h
-index 58fd55b1..543d9de5 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -752,6 +752,11 @@ struct mt76_testmode_data {
- 	u32 tx_time;
- 	u32 tx_ipg;
- 
-+	u8 txbf_act;
-+	u16 txbf_param[8];
-+	bool is_txbf_dut;
-+	bool bf_en;
-+	bool bf_ever_en;
- 	bool ibf;
- 	bool ebf;
- 
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index a59e5a0b..266ee711 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -488,7 +488,8 @@ struct sta_rec_bf {
- 	bool codebook75_mu;
- 
- 	u8 he_ltf;
--	u8 rsv[3];
-+	u8 pp_fd_val;
-+	u8 rsv[2];
- } __packed;
- 
- struct sta_rec_bfee {
-@@ -1278,6 +1279,7 @@ enum {
- 	MCU_UNI_CMD_VOW = 0x37,
- 	MCU_UNI_CMD_PP = 0x38,
- 	MCU_UNI_CMD_FIXED_RATE_TABLE = 0x40,
-+	MCU_UNI_CMD_TESTMODE_TRX_PARAM = 0x42,
- 	MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
- 	MCU_UNI_CMD_PRECAL_RESULT = 0x47,
- 	MCU_UNI_CMD_RRO = 0x57,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 3a34afd9..6e3047ba 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -1070,7 +1070,12 @@ mt7996_mcu_bss_basic_tlv(struct sk_buff *skb,
- 	bss->hw_bss_idx = idx;
- 
- 	if (vif->type == NL80211_IFTYPE_MONITOR) {
--		memcpy(bss->bssid, phy->macaddr, ETH_ALEN);
-+		struct mt76_testmode_data *td = &phy->test;
-+
-+		if (!td->bf_en)
-+			memcpy(bss->bssid, phy->macaddr, ETH_ALEN);
-+		else
-+			memcpy(bss->bssid, td->addr[2], ETH_ALEN);
- 		return 0;
- 	}
- 
-@@ -4108,7 +4113,6 @@ int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 val, u8 band)
- int mt7996_mcu_set_txbf(struct mt7996_dev *dev, u8 action)
- {
- #define MT7996_BF_MAX_SIZE	sizeof(union bf_tag_tlv)
--#define BF_PROCESSING	4
- 	struct uni_header hdr;
- 	struct sk_buff *skb;
- 	struct tlv *tlv;
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index af078edd..054a616b 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -685,6 +685,22 @@ struct bf_sounding_on {
- 	__le32 snd_period;
- } __packed;
- 
-+enum sounding_mode {
-+	SU_SOUNDING,
-+	MU_SOUNDING,
-+	SU_PERIODIC_SOUNDING,
-+	MU_PERIODIC_SOUNDING,
-+	BF_PROCESSING,
-+	TXCMD_NONTB_SU_SOUNDING,
-+	TXCMD_VHT_MU_SOUNDING,
-+	TXCMD_TB_PER_BRP_SOUNDING,
-+	TXCMD_TB_SOUNDING,
-+
-+	/* keep last */
-+	NUM_SOUNDING_MODE,
-+	SOUNDING_MODE_MAX = NUM_SOUNDING_MODE - 1,
-+};
-+
- struct bf_hw_en_status_update {
- 	__le16 tag;
- 	__le16 len;
-@@ -710,6 +726,24 @@ union bf_tag_tlv {
- 	struct bf_mod_en_ctrl bf_mod_en;
- };
- 
-+enum {
-+	BF_SOUNDING_OFF = 0,
-+	BF_SOUNDING_ON = 1,
-+	BF_DATA_PACKET_APPLY = 2,
-+	BF_PFMU_TAG_READ = 5,
-+	BF_PFMU_TAG_WRITE = 6,
-+	BF_STA_REC_READ = 11,
-+	BF_PHASE_CALIBRATION = 12,
-+	BF_IBF_PHASE_COMP = 13,
-+	BF_PROFILE_WRITE_20M_ALL = 15,
-+	BF_HW_EN_UPDATE = 17,
-+	BF_MOD_EN_CTRL = 20,
-+	BF_FBRPT_DBG_INFO_READ = 23,
-+	BF_TXSND_INFO = 24,
-+	BF_CMD_TXCMD = 27,
-+	BF_CFG_PHY = 28,
-+};
-+
- struct ra_rate {
- 	__le16 wlan_idx;
- 	u8 mode;
-@@ -771,17 +805,6 @@ enum {
- #define MUMIMO_UL                      BIT(3)
- #define MUMIMO_DL_CERT                 BIT(4)
- 
--enum {
--	BF_SOUNDING_ON = 1,
--	BF_PFMU_TAG_READ = 5,
--	BF_STA_REC_READ = 11,
--	BF_HW_EN_UPDATE = 17,
--	BF_MOD_EN_CTRL = 20,
--	BF_FBRPT_DBG_INFO_READ = 23,
--	BF_TXSND_INFO = 24,
--	BF_CFG_PHY = 28,
--};
--
- enum {
- 	CMD_BAND_NONE,
- 	CMD_BAND_24G,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b9c37612..2f76a0af 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -480,6 +480,14 @@ struct mt7996_dev {
- #ifdef CONFIG_MTK_VENDOR
- 	bool cert_mode;
- #endif
-+
-+#if defined CONFIG_NL80211_TESTMODE || defined CONFIG_MTK_DEBUG
-+	struct {
-+		void *txbf_phase_cal;
-+		void *txbf_pfmu_data;
-+		void *txbf_pfmu_tag;
-+	} test;
-+#endif
- };
- 
- enum {
-@@ -819,7 +827,7 @@ int mt7996_mcu_muru_dbg_info(struct mt7996_dev *dev, u16 item, u8 val);
- int mt7996_mcu_set_sr_enable(struct mt7996_phy *phy, u8 action, u64 val, bool set);
- void mt7996_mcu_rx_sr_event(struct mt7996_dev *dev, struct sk_buff *skb);
- int mt7996_mcu_set_dup_wtbl(struct mt7996_dev *dev);
--int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx);
-+int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx, bool bfer);
- void mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb);
- int mt7996_mcu_set_muru_fixed_rate_enable(struct mt7996_dev *dev, u8 action, int val);
- int mt7996_mcu_set_muru_fixed_rate_parameter(struct mt7996_dev *dev, u8 action, void *para);
-@@ -831,10 +839,12 @@ int mt7996_mcu_set_rfeature_trig_type(struct mt7996_phy *phy, u8 enable, u8 trig
- void mt7996_mcu_set_ppdu_tx_type(struct mt7996_phy *phy, u8 ppdu_type);
- void mt7996_mcu_set_nusers_ofdma(struct mt7996_phy *phy, u8 type, u8 ofdma_user_cnt);
- void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type);
-+void mt7996_tm_update_channel(struct mt7996_phy *phy);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
- int mt7996_dma_rro_init(struct mt7996_dev *dev);
- #endif /* CONFIG_NET_MEDIATEK_SOC_WED */
- 
-+
- #endif
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 9e7acd4b..c4cdbcdc 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2899,7 +2899,7 @@ mt7996_starec_bf_read_set(void *data, u64 wlan_idx)
- {
- 	struct mt7996_phy *phy = data;
- 
--	return mt7996_mcu_set_txbf_internal(phy, BF_STA_REC_READ, wlan_idx);
-+	return mt7996_mcu_set_txbf_internal(phy, BF_STA_REC_READ, wlan_idx, 0);
- }
- DEFINE_DEBUGFS_ATTRIBUTE(fops_starec_bf_read, NULL,
- 			 mt7996_starec_bf_read_set, "%lld\n");
-@@ -2943,7 +2943,7 @@ mt7996_bf_fbk_rpt_set(void *data, u64 wlan_idx)
- {
- 	struct mt7996_phy *phy = data;
- 
--	return mt7996_mcu_set_txbf_internal(phy, BF_FBRPT_DBG_INFO_READ, wlan_idx);
-+	return mt7996_mcu_set_txbf_internal(phy, BF_FBRPT_DBG_INFO_READ, wlan_idx, 0);
- }
- DEFINE_DEBUGFS_ATTRIBUTE(fops_bf_fbk_rpt, NULL,
- 			 mt7996_bf_fbk_rpt_set, "%lld\n");
-@@ -2953,7 +2953,7 @@ mt7996_bf_pfmu_tag_read_set(void *data, u64 wlan_idx)
- {
- 	struct mt7996_phy *phy = data;
- 
--	return mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, wlan_idx);
-+	return mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, wlan_idx, 1);
- }
- DEFINE_DEBUGFS_ATTRIBUTE(fops_bf_pfmu_tag_read, NULL,
- 			 mt7996_bf_pfmu_tag_read_set, "%lld\n");
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index cacca449..f70bd0be 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -295,7 +295,7 @@ __mt7996_mcu_add_uni_tlv(struct sk_buff *skb, u16 tag, u16 len)
- 	return ptlv;
- }
- 
--int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx)
-+int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx, bool bfer)
- {
- 	struct mt7996_dev *dev = phy->dev;
- #define MT7996_MTK_BF_MAX_SIZE	sizeof(struct bf_starec_read)
-@@ -318,9 +318,8 @@ int mt7996_mcu_set_txbf_internal(struct mt7996_phy *phy, u8 action, int idx)
- 
- 		tlv = __mt7996_mcu_add_uni_tlv(skb, action, sizeof(*req));
- 		req = (struct bf_pfmu_tag *)tlv;
--#define BFER 1
- 		req->pfmu_id = idx;
--		req->bfer = BFER;
-+		req->bfer = bfer;
- 		req->band_idx = phy->mt76->band_idx;
- 		break;
- 	}
-@@ -432,10 +431,36 @@ int mt7996_mcu_set_txbf_snd_info(struct mt7996_phy *phy, void *para)
- 	return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb, MCU_WM_UNI_CMD(BF), false);
- }
- 
-+static inline void
-+mt7996_ibf_phase_assign(struct mt7996_dev *dev,
-+			struct mt7996_ibf_cal_info *cal,
-+			struct mt7996_txbf_phase *phase)
-+{
-+	/* fw return ibf calibrated data with
-+	 * the mt7996_txbf_phase_info_5g struct for both 2G and 5G.
-+	 * Therefore, memcpy cannot be used here.
-+	 */
-+	phase_assign(cal->group, m_t0_h, true);
-+	phase_assign(cal->group, m_t1_h, true);
-+	phase_assign(cal->group, m_t2_h, true);
-+	phase_assign(cal->group, m_t2_h_sx2, false);
-+	phase_assign_rx(cal->group, r0);
-+	phase_assign_rx(cal->group, r1);
-+	phase_assign_rx(cal->group, r2);
-+	phase_assign_rx(cal->group, r3);
-+	phase_assign_rx_g0(cal->group, r2_sx2);
-+	phase_assign_rx_g0(cal->group, r3_sx2);
-+	phase_assign(cal->group, r0_reserved, false);
-+	phase_assign(cal->group, r1_reserved, false);
-+	phase_assign(cal->group, r2_reserved, false);
-+	phase_assign(cal->group, r3_reserved, false);
-+	phase_assign(cal->group, r2_sx2_reserved, false);
-+	phase_assign(cal->group, r3_sx2_reserved, false);
-+}
-+
- void
- mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb)
- {
--#define HE_MODE 3
- 	struct mt7996_mcu_bf_basic_event *event;
- 
- 	event = (struct mt7996_mcu_bf_basic_event *)skb->data;
-@@ -470,13 +495,12 @@ mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 			 tag->t1.nr, tag->t1.nc, tag->t1.ngroup, tag->t1.lm, tag->t1.codebook,
- 			 tag->t1.mob_cal_en);
- 
--		if (tag->t1.lm <= HE_MODE) {
-+		if (tag->t1.lm <= BF_LM_HE)
- 			dev_info(dev->mt76.dev, "RU start = %d, RU end = %d\n",
- 				 tag->t1.field.ru_start_id, tag->t1.field.ru_end_id);
--		} else {
-+		else
- 			dev_info(dev->mt76.dev, "PartialBW = %d\n",
- 				 tag->t1.bw_info.partial_bw_info);
--		}
- 
- 		dev_info(dev->mt76.dev, "Mem Col1 = %d, Mem Row1 = %d, Mem Col2 = %d, Mem Row2 = %d\n",
- 			 tag->t1.col_id1, tag->t1.row_id1, tag->t1.col_id2, tag->t1.row_id2);
-@@ -730,6 +754,47 @@ mt7996_mcu_rx_bf_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 
- 		break;
- 	}
-+	case UNI_EVENT_BF_CAL_PHASE: {
-+		struct mt7996_ibf_cal_info *cal;
-+		struct mt7996_txbf_phase_out phase_out;
-+		struct mt7996_txbf_phase *phase;
-+
-+		cal = (struct mt7996_ibf_cal_info *)skb->data;
-+		phase = (struct mt7996_txbf_phase *)dev->test.txbf_phase_cal;
-+		memcpy(&phase_out, &cal->phase_out, sizeof(phase_out));
-+		switch (cal->cal_type) {
-+		case IBF_PHASE_CAL_NORMAL:
-+		case IBF_PHASE_CAL_NORMAL_INSTRUMENT:
-+			/* Only calibrate group M */
-+			if (cal->group_l_m_n != GROUP_M)
-+				break;
-+			phase = &phase[cal->group];
-+			phase->status = cal->status;
-+			dev_info(dev->mt76.dev, "Calibrated result = %d\n", phase->status);
-+			dev_info(dev->mt76.dev, "Group %d and Group M\n", cal->group);
-+			mt7996_ibf_phase_assign(dev, cal, phase);
-+			break;
-+		case IBF_PHASE_CAL_VERIFY:
-+		case IBF_PHASE_CAL_VERIFY_INSTRUMENT:
-+			dev_info(dev->mt76.dev, "Verification result = %d\n", cal->status);
-+			break;
-+		default:
-+			break;
-+		}
-+
-+		dev_info(dev->mt76.dev, "c0_uh = %d, c1_uh = %d, c2_uh = %d, c3_uh = %d\n",
-+			 phase_out.c0_uh, phase_out.c1_uh, phase_out.c2_uh, phase_out.c3_uh);
-+		dev_info(dev->mt76.dev, "c0_h = %d, c1_h = %d, c2_h = %d, c3_h = %d\n",
-+			 phase_out.c0_h, phase_out.c1_h, phase_out.c2_h, phase_out.c3_h);
-+		dev_info(dev->mt76.dev, "c0_mh = %d, c1_mh = %d, c2_mh = %d, c3_mh = %d\n",
-+			 phase_out.c0_mh, phase_out.c1_mh, phase_out.c2_mh, phase_out.c3_mh);
-+		dev_info(dev->mt76.dev, "c0_m = %d, c1_m = %d, c2_m = %d, c3_m = %d\n",
-+			 phase_out.c0_m, phase_out.c1_m, phase_out.c2_m, phase_out.c3_m);
-+		dev_info(dev->mt76.dev, "c0_l = %d, c1_l = %d, c2_l = %d, c3_l = %d\n",
-+			 phase_out.c0_l, phase_out.c1_l, phase_out.c2_l, phase_out.c3_l);
-+
-+		break;
-+	}
- 	default:
- 		dev_info(dev->mt76.dev, "%s: unknown bf event tag %d\n",
- 			 __func__, event->tag);
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 98c9660a..252ae98e 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -189,6 +189,164 @@ struct bf_txsnd_info {
- 	u8 __rsv[2];
- } __packed;
- 
-+#define MAX_PHASE_GROUP_NUM	9
-+
-+struct bf_phase_comp {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 bw;
-+	u8 jp_band;
-+	u8 band_idx;
-+	bool read_from_e2p;
-+	bool disable;
-+	u8 group;
-+	u8 rsv[2];
-+	u8 buf[44];
-+} __packed;
-+
-+struct bf_tx_apply {
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 wlan_idx;
-+	bool ebf;
-+	bool ibf;
-+	bool mu_txbf;
-+	bool phase_cal;
-+	u8 rsv[2];
-+} __packed;
-+
-+struct bf_phase_cal {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 group_l_m_n;
-+	u8 group;
-+	u8 sx2;
-+	u8 cal_type;
-+	u8 lna_gain_level;
-+	u8 band_idx;
-+	u8 rsv[2];
-+} __packed;
-+
-+struct bf_txcmd {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 action;
-+	u8 bf_manual;
-+	u8 bf_bit;
-+	u8 rsv[5];
-+} __packed;
-+
-+struct bf_pfmu_data_all {
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 pfmu_id;
-+	u8 band_idx;
-+	u8 rsv[2];
-+
-+	u8 buf[512];
-+} __packed;
-+
-+#define TXBF_DUT_MAC_SUBADDR		0x22
-+#define TXBF_GOLDEN_MAC_SUBADDR		0x11
-+
-+struct mt7996_tm_bf_req {
-+	u8 _rsv[4];
-+
-+	union {
-+		struct bf_sounding_on sounding;
-+		struct bf_tx_apply tx_apply;
-+		struct bf_pfmu_tag pfmu_tag;
-+		struct bf_pfmu_data_all pfmu_data_all;
-+		struct bf_phase_cal phase_cal;
-+		struct bf_phase_comp phase_comp;
-+		struct bf_txcmd txcmd;
-+	};
-+} __packed;
-+
-+enum tm_trx_mac_type {
-+	TM_TRX_MAC_TX = 1,
-+	TM_TRX_MAC_RX,
-+	TM_TRX_MAC_TXRX,
-+	TM_TRX_MAC_TXRX_RXV,
-+	TM_TRX_MAC_RXV,
-+	TM_TRX_MAC_RX_RXV,
-+};
-+
-+enum tm_trx_param_idx {
-+	TM_TRX_PARAM_RSV,
-+	/* MAC */
-+	TM_TRX_PARAM_SET_TRX,
-+	TM_TRX_PARAM_RX_FILTER,
-+	TM_TRX_PARAM_RX_FILTER_PKT_LEN,
-+	TM_TRX_PARAM_SLOT_TIME,
-+	TM_TRX_PARAM_CLEAN_PERSTA_TXQUEUE,
-+	TM_TRX_PARAM_AMPDU_WTBL,
-+	TM_TRX_PARAM_MU_RX_AID,
-+	TM_TRX_PARAM_PHY_MANUAL_TX,
-+
-+	/* PHY */
-+	TM_TRX_PARAM_RX_PATH,
-+	TM_TRX_PARAM_TX_STREAM,
-+	TM_TRX_PARAM_TSSI_STATUS,
-+	TM_TRX_PARAM_DPD_STATUS,
-+	TM_TRX_PARAM_RATE_POWER_OFFSET_ON_OFF,
-+	TM_TRX_PARAM_THERMO_COMP_STATUS,
-+	TM_TRX_PARAM_FREQ_OFFSET,
-+	TM_TRX_PARAM_FAGC_RSSI_PATH,
-+	TM_TRX_PARAM_PHY_STATUS_COUNT,
-+	TM_TRX_PARAM_RXV_INDEX,
-+
-+	TM_TRX_PARAM_ANTENNA_PORT,
-+	TM_TRX_PARAM_THERMAL_ONOFF,
-+	TM_TRX_PARAM_TX_POWER_CONTROL_ALL_RF,
-+	TM_TRX_PARAM_RATE_POWER_OFFSET,
-+	TM_TRX_PARAM_SLT_CMD_TEST,
-+	TM_TRX_PARAM_SKU,
-+	TM_TRX_PARAM_POWER_PERCENTAGE_ON_OFF,
-+	TM_TRX_PARAM_BF_BACKOFF_ON_OFF,
-+	TM_TRX_PARAM_POWER_PERCENTAGE_LEVEL,
-+	TM_TRX_PARAM_FRTBL_CFG,
-+	TM_TRX_PARAM_PREAMBLE_PUNC_ON_OFF,
-+
-+	TM_TRX_PARAM_MAX_NUM,
-+};
-+
-+enum trx_action {
-+	TM_TRX_ACTION_SET,
-+	TM_TRX_ACTION_GET,
-+};
-+
-+struct tm_trx_set {
-+	u8 type;
-+	u8 enable;
-+	u8 band_idx;
-+	u8 rsv;
-+} __packed;
-+
-+struct mt7996_tm_trx_req {
-+	u8 param_num;
-+	u8 _rsv[3];
-+
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 param_idx;
-+	u8 band_idx;
-+	u8 testmode_en;
-+	u8 action;
-+	u8 rsv[3];
-+
-+	u32 data;
-+	struct tm_trx_set set_trx;
-+
-+	u8 buf[220];
-+} __packed;
-+
- struct mt7996_mcu_bf_basic_event {
- 	struct mt7996_mcu_rxd rxd;
- 
-@@ -394,6 +552,181 @@ struct mt7996_pfmu_tag_event {
- 	struct mt7996_pfmu_tag2 t2;
- };
- 
-+struct mt7996_pfmu_tag {
-+	struct mt7996_pfmu_tag1 t1;
-+	struct mt7996_pfmu_tag2 t2;
-+};
-+
-+enum bf_lm_type {
-+	BF_LM_LEGACY,
-+	BF_LM_HT,
-+	BF_LM_VHT,
-+	BF_LM_HE,
-+	BF_LM_EHT,
-+};
-+
-+struct mt7996_txbf_phase_out {
-+	u8 c0_l;
-+	u8 c1_l;
-+	u8 c2_l;
-+	u8 c3_l;
-+	u8 c0_m;
-+	u8 c1_m;
-+	u8 c2_m;
-+	u8 c3_m;
-+	u8 c0_mh;
-+	u8 c1_mh;
-+	u8 c2_mh;
-+	u8 c3_mh;
-+	u8 c0_h;
-+	u8 c1_h;
-+	u8 c2_h;
-+	u8 c3_h;
-+	u8 c0_uh;
-+	u8 c1_uh;
-+	u8 c2_uh;
-+	u8 c3_uh;
-+};
-+
-+struct mt7996_txbf_rx_phase_2g {
-+	u8 rx_uh;
-+	u8 rx_h;
-+	u8 rx_m;
-+	u8 rx_l;
-+	u8 rx_ul;
-+};
-+
-+struct mt7996_txbf_rx_phase_5g {
-+	u8 rx_uh;
-+	u8 rx_h;
-+	u8 rx_mh;
-+	u8 rx_m;
-+	u8 rx_l;
-+	u8 rx_ul;
-+};
-+
-+struct mt7996_txbf_phase_info_2g {
-+	struct mt7996_txbf_rx_phase_2g r0;
-+	struct mt7996_txbf_rx_phase_2g r1;
-+	struct mt7996_txbf_rx_phase_2g r2;
-+	struct mt7996_txbf_rx_phase_2g r3;
-+	struct mt7996_txbf_rx_phase_2g r2_sx2;
-+	struct mt7996_txbf_rx_phase_2g r3_sx2;
-+	u8 m_t0_h;
-+	u8 m_t1_h;
-+	u8 m_t2_h;
-+	u8 m_t2_h_sx2;
-+	u8 r0_reserved;
-+	u8 r1_reserved;
-+	u8 r2_reserved;
-+	u8 r3_reserved;
-+	u8 r2_sx2_reserved;
-+	u8 r3_sx2_reserved;
-+};
-+
-+struct mt7996_txbf_phase_info_5g {
-+	struct mt7996_txbf_rx_phase_5g r0;
-+	struct mt7996_txbf_rx_phase_5g r1;
-+	struct mt7996_txbf_rx_phase_5g r2;
-+	struct mt7996_txbf_rx_phase_5g r3;
-+	struct mt7996_txbf_rx_phase_2g r2_sx2;	/* no middle-high in r2_sx2 */
-+	struct mt7996_txbf_rx_phase_2g r3_sx2;	/* no middle-high in r3_sx2 */
-+	u8 m_t0_h;
-+	u8 m_t1_h;
-+	u8 m_t2_h;
-+	u8 m_t2_h_sx2;
-+	u8 r0_reserved;
-+	u8 r1_reserved;
-+	u8 r2_reserved;
-+	u8 r3_reserved;
-+	u8 r2_sx2_reserved;
-+	u8 r3_sx2_reserved;
-+};
-+
-+struct mt7996_txbf_phase {
-+	u8 status;
-+	union {
-+		struct mt7996_txbf_phase_info_2g phase_2g;
-+		struct mt7996_txbf_phase_info_5g phase_5g;
-+	};
-+};
-+
-+#define phase_assign(group, field, dump, ...)	({						\
-+	if (group) {										\
-+		phase->phase_5g.field = cal->phase_5g.field;					\
-+		if (dump)									\
-+			dev_info(dev->mt76.dev, "%s = %d\n", #field, phase->phase_5g.field);	\
-+	} else {										\
-+		phase->phase_2g.field = cal->phase_5g.field;					\
-+		if (dump)									\
-+			dev_info(dev->mt76.dev, "%s = %d\n", #field, phase->phase_2g.field);	\
-+	}											\
-+})
-+
-+#define phase_assign_rx_g0(group, rx, ...)	({						\
-+	phase_assign(group, rx.rx_uh, false);							\
-+	phase_assign(group, rx.rx_h, false);							\
-+	phase_assign(group, rx.rx_m, false);							\
-+	phase_assign(group, rx.rx_l, false);							\
-+	phase_assign(group, rx.rx_ul, false);							\
-+})
-+
-+#define phase_assign_rx(group, rx, ...)	({							\
-+	if (group) {										\
-+		phase_assign(group, rx.rx_uh, true);						\
-+		phase_assign(group, rx.rx_h, true);						\
-+		phase->phase_5g.rx.rx_mh = cal->phase_5g.rx.rx_mh;				\
-+		dev_info(dev->mt76.dev, "%s.rx_mh = %d\n", #rx, phase->phase_5g.rx.rx_mh);	\
-+		phase_assign(group, rx.rx_m, true);						\
-+		phase_assign(group, rx.rx_l, true);						\
-+		phase_assign(group, rx.rx_ul, true);						\
-+	} else {										\
-+		phase_assign(group, rx.rx_uh, true);						\
-+		phase_assign(group, rx.rx_h, true);						\
-+		phase_assign(group, rx.rx_m, true);						\
-+		phase_assign(group, rx.rx_l, true);						\
-+		phase_assign(group, rx.rx_ul, true);						\
-+	}											\
-+})
-+
-+#define GROUP_L		0
-+#define GROUP_M		1
-+#define GROUP_H		2
-+
-+struct mt7996_pfmu_data {
-+	__le16 subc_idx;
-+	__le16 phi11;
-+	__le16 phi21;
-+	__le16 phi31;
-+};
-+
-+struct mt7996_ibf_cal_info {
-+	struct mt7996_mcu_bf_basic_event event;
-+
-+	u8 category_id;
-+	u8 group_l_m_n;
-+	u8 group;
-+	bool sx2;
-+	u8 status;
-+	u8 cal_type;
-+	u8 _rsv[2];
-+	struct mt7996_txbf_phase_out phase_out;
-+	union {
-+		struct mt7996_txbf_phase_info_2g phase_2g;
-+		struct mt7996_txbf_phase_info_5g phase_5g;
-+	};
-+} __packed;
-+
-+enum {
-+	IBF_PHASE_CAL_UNSPEC,
-+	IBF_PHASE_CAL_NORMAL,
-+	IBF_PHASE_CAL_VERIFY,
-+	IBF_PHASE_CAL_NORMAL_INSTRUMENT,
-+	IBF_PHASE_CAL_VERIFY_INSTRUMENT,
-+};
-+
-+#define MT7996_TXBF_SUBCAR_NUM	64
-+
- enum {
- 	UNI_EVENT_BF_PFMU_TAG = 0x5,
- 	UNI_EVENT_BF_PFMU_DATA = 0x7,
-@@ -408,11 +741,6 @@ enum {
- 	UNI_EVENT_BF_MAX_NUM
- };
- 
--enum {
--	UNI_CMD_MURU_FIXED_RATE_CTRL = 0x11,
--	UNI_CMD_MURU_FIXED_GROUP_RATE_CTRL,
--};
--
- struct uni_muru_mum_set_group_tbl_entry {
- 	__le16 wlan_idx0;
- 	__le16 wlan_idx1;
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index e94f9a90..aa04d8d2 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -326,6 +326,9 @@ enum offs_rev {
- #define MT_ARB_SCR_TX_DISABLE			BIT(8)
- #define MT_ARB_SCR_RX_DISABLE			BIT(9)
- 
-+#define MT_ARB_TQSAXM0(_band)			MT_WF_ARB(_band, 0x180)
-+#define MT_ARB_TQSAXM_ALTX_START_MASK		GENMASK(12, 8)
-+
- /* RMAC: band 0(0x820e5000), band 1(0x820f5000), band 2(0x830e5000), */
- #define MT_WF_RMAC_BASE(_band)			__BASE(WF_RMAC_BASE, (_band))
- #define MT_WF_RMAC(_band, ofs)			(MT_WF_RMAC_BASE(_band) + (ofs))
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-index 26ae5827..2fb36a97 100644
---- a/mt7996/testmode.c
-+++ b/mt7996/testmode.c
-@@ -23,6 +23,7 @@ enum {
- 	TM_CHANGED_IPI_THRESHOLD,
- 	TM_CHANGED_IPI_PERIOD,
- 	TM_CHANGED_IPI_RESET,
-+	TM_CHANGED_TXBF_ACT,
- 
- 	/* must be last */
- 	NUM_TM_CHANGED
-@@ -41,25 +42,31 @@ static const u8 tm_change_map[] = {
- 	[TM_CHANGED_IPI_THRESHOLD] = MT76_TM_ATTR_IPI_THRESHOLD,
- 	[TM_CHANGED_IPI_PERIOD] = MT76_TM_ATTR_IPI_PERIOD,
- 	[TM_CHANGED_IPI_RESET] = MT76_TM_ATTR_IPI_RESET,
-+	[TM_CHANGED_TXBF_ACT] = MT76_TM_ATTR_TXBF_ACT,
- };
- 
- static void mt7996_tm_ipi_work(struct work_struct *work);
-+static int mt7996_tm_txbf_apply_tx(struct mt7996_phy *phy, u16 wlan_idx,
-+				   bool ebf, bool ibf, bool phase_cal);
- 
- static u32 mt7996_tm_bw_mapping(enum nl80211_chan_width width, enum bw_mapping_method method)
- {
- 	static const u32 width_to_bw[][NUM_BW_MAP] = {
--		[NL80211_CHAN_WIDTH_40] = {FW_CDBW_40MHZ, TM_CBW_40MHZ, 40,
-+		[NL80211_CHAN_WIDTH_40] = {FW_CDBW_40MHZ, TM_CBW_40MHZ, BF_CDBW_40MHZ, 40,
- 					   FIRST_CONTROL_CHAN_BITMAP_BW40},
--		[NL80211_CHAN_WIDTH_80] = {FW_CDBW_80MHZ, TM_CBW_80MHZ, 80,
-+		[NL80211_CHAN_WIDTH_80] = {FW_CDBW_80MHZ, TM_CBW_80MHZ, BF_CDBW_80MHZ, 80,
- 					   FIRST_CONTROL_CHAN_BITMAP_BW80},
--		[NL80211_CHAN_WIDTH_80P80] = {FW_CDBW_8080MHZ, TM_CBW_8080MHZ, 80, 0x0},
--		[NL80211_CHAN_WIDTH_160] = {FW_CDBW_160MHZ, TM_CBW_160MHZ, 160,
-+		[NL80211_CHAN_WIDTH_80P80] = {FW_CDBW_8080MHZ, TM_CBW_8080MHZ, BF_CDBW_8080MHZ,
-+					      80, 0x0},
-+		[NL80211_CHAN_WIDTH_160] = {FW_CDBW_160MHZ, TM_CBW_160MHZ, BF_CDBW_160MHZ, 160,
- 					    FIRST_CONTROL_CHAN_BITMAP_BW160},
--		[NL80211_CHAN_WIDTH_5] = {FW_CDBW_5MHZ, TM_CBW_5MHZ, 5, 0x0},
--		[NL80211_CHAN_WIDTH_10] = {FW_CDBW_10MHZ, TM_CBW_10MHZ, 10, 0x0},
--		[NL80211_CHAN_WIDTH_20] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, 20, 0x0},
--		[NL80211_CHAN_WIDTH_20_NOHT] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, 20, 0x0},
--		[NL80211_CHAN_WIDTH_320] = {FW_CDBW_320MHZ, TM_CBW_320MHZ, 320, 0x0},
-+		[NL80211_CHAN_WIDTH_5] = {FW_CDBW_5MHZ, TM_CBW_5MHZ, BF_CDBW_5MHZ, 5, 0x0},
-+		[NL80211_CHAN_WIDTH_10] = {FW_CDBW_10MHZ, TM_CBW_10MHZ, BF_CDBW_10MHZ, 10, 0x0},
-+		[NL80211_CHAN_WIDTH_20] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, BF_CDBW_20MHZ, 20, 0x0},
-+		[NL80211_CHAN_WIDTH_20_NOHT] = {FW_CDBW_20MHZ, TM_CBW_20MHZ, BF_CDBW_20MHZ,
-+						20, 0x0},
-+		[NL80211_CHAN_WIDTH_320] = {FW_CDBW_320MHZ, TM_CBW_320MHZ, BF_CDBW_320MHZ,
-+					    320, 0x0},
- 	};
- 
- 	if (width >= ARRAY_SIZE(width_to_bw))
-@@ -68,26 +75,26 @@ static u32 mt7996_tm_bw_mapping(enum nl80211_chan_width width, enum bw_mapping_m
- 	return width_to_bw[width][method];
- }
- 
--static u8 mt7996_tm_rate_to_phy(u8 tx_rate_mode)
-+static u8 mt7996_tm_rate_mapping(u8 tx_rate_mode, enum rate_mapping_type type)
- {
--	static const u8 rate_to_phy[] = {
--		[MT76_TM_TX_MODE_CCK] = MT_PHY_TYPE_CCK,
--		[MT76_TM_TX_MODE_OFDM] = MT_PHY_TYPE_OFDM,
--		[MT76_TM_TX_MODE_HT] = MT_PHY_TYPE_HT,
--		[MT76_TM_TX_MODE_VHT] = MT_PHY_TYPE_VHT,
--		[MT76_TM_TX_MODE_HE_SU] = MT_PHY_TYPE_HE_SU,
--		[MT76_TM_TX_MODE_HE_EXT_SU] = MT_PHY_TYPE_HE_EXT_SU,
--		[MT76_TM_TX_MODE_HE_TB] = MT_PHY_TYPE_HE_TB,
--		[MT76_TM_TX_MODE_HE_MU] = MT_PHY_TYPE_HE_MU,
--		[MT76_TM_TX_MODE_EHT_SU] = MT_PHY_TYPE_EHT_SU,
--		[MT76_TM_TX_MODE_EHT_TRIG] = MT_PHY_TYPE_EHT_TRIG,
--		[MT76_TM_TX_MODE_EHT_MU] = MT_PHY_TYPE_EHT_MU,
-+	static const u8 rate_to_phy[][NUM_RATE_MAP] = {
-+		[MT76_TM_TX_MODE_CCK] = {MT_PHY_TYPE_CCK, BF_LM_LEGACY},
-+		[MT76_TM_TX_MODE_OFDM] = {MT_PHY_TYPE_OFDM, BF_LM_LEGACY},
-+		[MT76_TM_TX_MODE_HT] = {MT_PHY_TYPE_HT, BF_LM_HT},
-+		[MT76_TM_TX_MODE_VHT] = {MT_PHY_TYPE_VHT, BF_LM_VHT},
-+		[MT76_TM_TX_MODE_HE_SU] = {MT_PHY_TYPE_HE_SU, BF_LM_HE},
-+		[MT76_TM_TX_MODE_HE_EXT_SU] = {MT_PHY_TYPE_HE_EXT_SU, BF_LM_HE},
-+		[MT76_TM_TX_MODE_HE_TB] = {MT_PHY_TYPE_HE_TB, BF_LM_HE},
-+		[MT76_TM_TX_MODE_HE_MU] = {MT_PHY_TYPE_HE_MU, BF_LM_HE},
-+		[MT76_TM_TX_MODE_EHT_SU] = {MT_PHY_TYPE_EHT_SU, BF_LM_EHT},
-+		[MT76_TM_TX_MODE_EHT_TRIG] = {MT_PHY_TYPE_EHT_TRIG, BF_LM_EHT},
-+		[MT76_TM_TX_MODE_EHT_MU] = {MT_PHY_TYPE_EHT_MU, BF_LM_EHT},
- 	};
- 
- 	if (tx_rate_mode > MT76_TM_TX_MODE_MAX)
- 		return -EINVAL;
- 
--	return rate_to_phy[tx_rate_mode];
-+	return rate_to_phy[tx_rate_mode][type];
- }
- 
- static int
-@@ -239,7 +246,7 @@ mt7996_tm_init(struct mt7996_phy *phy, bool en)
- 		INIT_DELAYED_WORK(&phy->ipi_work, mt7996_tm_ipi_work);
- }
- 
--static void
-+void
- mt7996_tm_update_channel(struct mt7996_phy *phy)
- {
- #define CHAN_FREQ_BW_80P80_TAG		(SET_ID(CHAN_FREQ) | BIT(16))
-@@ -303,7 +310,8 @@ mt7996_tm_set_tx_frames(struct mt7996_phy *phy, bool en)
- 		mt7996_tm_set(dev, SET_ID(MAC_HEADER), FRAME_CONTROL);
- 		mt7996_tm_set(dev, SET_ID(SEQ_CTRL), 0);
- 		mt7996_tm_set(dev, SET_ID(TX_COUNT), td->tx_count);
--		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(TX_MODE),
-+			      mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_PHY));
- 		mt7996_tm_set(dev, SET_ID(TX_RATE), td->tx_rate_idx);
- 
- 		if (mt76_testmode_param_present(td, MT76_TM_ATTR_TX_POWER))
-@@ -331,7 +339,8 @@ mt7996_tm_set_tx_frames(struct mt7996_phy *phy, bool en)
- 
- 		mt7996_tm_set(dev, SET_ID(MAX_PE), 2);
- 		mt7996_tm_set(dev, SET_ID(HW_TX_MODE), 0);
--		mt7996_tm_update_channel(phy);
-+		if (!td->bf_en)
-+			mt7996_tm_update_channel(phy);
- 
- 		/* trigger firmware to start TX */
- 		mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(START_TX));
-@@ -373,7 +382,8 @@ mt7996_tm_set_rx_frames(struct mt7996_phy *phy, bool en)
- 			return;
- 		}
- 
--		mt7996_tm_update_channel(phy);
-+		if (!td->bf_en)
-+			mt7996_tm_update_channel(phy);
- 
- 		if (td->tx_rate_mode >= MT76_TM_TX_MODE_HE_MU) {
- 			if (td->aid)
-@@ -381,7 +391,8 @@ mt7996_tm_set_rx_frames(struct mt7996_phy *phy, bool en)
- 			else
- 				ret = mt7996_tm_set(dev, SET_ID(RX_MU_AID), RX_MU_DISABLE);
- 		}
--		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(TX_MODE),
-+			      mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_PHY));
- 		mt7996_tm_set(dev, SET_ID(GI), td->tx_rate_sgi);
- 		mt7996_tm_set_antenna(phy, SET_ID(RX_PATH));
- 		mt7996_tm_set(dev, SET_ID(MAX_PE), 2);
-@@ -405,7 +416,8 @@ mt7996_tm_set_tx_cont(struct mt7996_phy *phy, bool en)
- 
- 	if (en) {
- 		mt7996_tm_update_channel(phy);
--		mt7996_tm_set(dev, SET_ID(TX_MODE), mt7996_tm_rate_to_phy(td->tx_rate_mode));
-+		mt7996_tm_set(dev, SET_ID(TX_MODE),
-+			      mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_PHY));
- 		mt7996_tm_set(dev, SET_ID(TX_RATE), td->tx_rate_idx);
- 		/* fix payload is OFDM */
- 		mt7996_tm_set(dev, SET_ID(CONT_WAVE_MODE), CONT_WAVE_MODE_OFDM);
-@@ -1047,6 +1059,678 @@ mt7996_tm_set_ipi(struct mt7996_phy *phy)
- 	return 0;
- }
- 
-+static int
-+mt7996_tm_set_trx_mac(struct mt7996_phy *phy, u8 type, bool en)
-+{
-+#define UNI_TM_TRX_CTRL 0
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_trx_req req = {
-+		.param_num = 1,
-+		.tag = cpu_to_le16(UNI_TM_TRX_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.param_idx = cpu_to_le16(TM_TRX_PARAM_SET_TRX),
-+		.band_idx = phy->mt76->band_idx,
-+		.testmode_en = 1,
-+		.action = TM_TRX_ACTION_SET,
-+		.set_trx = {
-+			.type = type,
-+			.enable = en,
-+			.band_idx = phy->mt76->band_idx,
-+		}
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(TESTMODE_TRX_PARAM),
-+				 &req, sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_txbf_init(struct mt7996_phy *phy, u16 *val)
-+{
-+#define EBF_BBP_RX_OFFSET	0x10280
-+#define EBF_BBP_RX_ENABLE	(BIT(0) | BIT(15))
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	bool enable = val[0];
-+	void *phase_cal, *pfmu_data, *pfmu_tag;
-+	u8 nss, band_idx = phy->mt76->band_idx;
-+	enum nl80211_chan_width width = NL80211_CHAN_WIDTH_20;
-+	u8 sub_addr = td->is_txbf_dut ? TXBF_DUT_MAC_SUBADDR : TXBF_GOLDEN_MAC_SUBADDR;
-+	u8 peer_addr = td->is_txbf_dut ? TXBF_GOLDEN_MAC_SUBADDR : TXBF_DUT_MAC_SUBADDR;
-+	u8 bss_addr = TXBF_DUT_MAC_SUBADDR;
-+	u8 addr[ETH_ALEN] = {0x00, sub_addr, sub_addr, sub_addr, sub_addr, sub_addr};
-+	u8 bssid[ETH_ALEN] = {0x00, bss_addr, bss_addr, bss_addr, bss_addr, bss_addr};
-+	u8 peer_addrs[ETH_ALEN] = {0x00, peer_addr, peer_addr, peer_addr, peer_addr, peer_addr};
-+	struct mt7996_vif *mvif = (struct mt7996_vif *)phy->monitor_vif->drv_priv;
-+
-+	if (!enable) {
-+		td->bf_en = false;
-+		return 0;
-+	}
-+
-+	if (!dev->test.txbf_phase_cal) {
-+		phase_cal = devm_kzalloc(dev->mt76.dev,
-+					 sizeof(struct mt7996_txbf_phase) *
-+					 MAX_PHASE_GROUP_NUM,
-+					 GFP_KERNEL);
-+		if (!phase_cal)
-+			return -ENOMEM;
-+
-+		dev->test.txbf_phase_cal = phase_cal;
-+	}
-+
-+	if (!dev->test.txbf_pfmu_data) {
-+		pfmu_data = devm_kzalloc(dev->mt76.dev,
-+					 sizeof(struct mt7996_pfmu_data) *
-+					 MT7996_TXBF_SUBCAR_NUM,
-+					 GFP_KERNEL);
-+		if (!pfmu_data)
-+			return -ENOMEM;
-+
-+		dev->test.txbf_pfmu_data = pfmu_data;
-+	}
-+
-+	if (!dev->test.txbf_pfmu_tag) {
-+		pfmu_tag = devm_kzalloc(dev->mt76.dev,
-+					sizeof(struct mt7996_pfmu_tag), GFP_KERNEL);
-+		if (!pfmu_tag)
-+			return -ENOMEM;
-+
-+		dev->test.txbf_pfmu_tag = pfmu_tag;
-+	}
-+
-+	td->bf_en = true;
-+	dev->ibf = td->ibf;
-+	memcpy(td->addr[0], peer_addrs, ETH_ALEN);
-+	memcpy(td->addr[1], addr, ETH_ALEN);
-+	memcpy(td->addr[2], bssid, ETH_ALEN);
-+	memcpy(phy->monitor_vif->addr, addr, ETH_ALEN);
-+	mt7996_tm_set_mac_addr(dev, td->addr[0], SET_ID(DA));
-+	mt7996_tm_set_mac_addr(dev, td->addr[1], SET_ID(SA));
-+	mt7996_tm_set_mac_addr(dev, td->addr[2], SET_ID(BSSID));
-+
-+	/* bss idx & omac idx should be set to band idx for ibf cal */
-+	mvif->mt76.idx = band_idx;
-+	dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx);
-+	mvif->mt76.omac_idx = band_idx;
-+	phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
-+
-+	mt7996_mcu_add_dev_info(phy, phy->monitor_vif, true);
-+	mt7996_mcu_add_bss_info(phy, phy->monitor_vif, true);
-+
-+	if (td->ibf) {
-+		if (td->is_txbf_dut) {
-+			/* Enable ITxBF Capability */
-+			mt7996_mcu_set_txbf(dev, BF_HW_EN_UPDATE);
-+			mt7996_tm_set_trx_mac(phy, TM_TRX_MAC_TX, true);
-+
-+			td->tx_ipg = 999;
-+			td->tx_mpdu_len = 1024;
-+			td->tx_antenna_mask = phy->mt76->chainmask >> dev->chainshift[band_idx];
-+			nss = hweight8(td->tx_antenna_mask);
-+			if (nss > 1 && nss <= 4)
-+				td->tx_rate_idx = 15 + 8 * (nss - 2);
-+			else
-+				td->tx_rate_idx = 31;
-+		} else {
-+			td->tx_antenna_mask = 1;
-+			td->tx_mpdu_len = 1024;
-+			td->tx_rate_idx = 0;
-+			mt76_set(dev, EBF_BBP_RX_OFFSET, EBF_BBP_RX_ENABLE);
-+			dev_info(dev->mt76.dev, "Set BBP RX CR = %x\n",
-+				 mt76_rr(dev, EBF_BBP_RX_OFFSET));
-+		}
-+
-+		td->tx_rate_mode = MT76_TM_TX_MODE_HT;
-+		td->tx_rate_sgi = 0;
-+	} else {
-+		if (td->is_txbf_dut) {
-+			/* Enable ETxBF Capability */
-+			mt7996_mcu_set_txbf(dev, BF_HW_EN_UPDATE);
-+			td->tx_antenna_mask = phy->mt76->chainmask >> dev->chainshift[band_idx];
-+			td->tx_spe_idx = 24 + phy->mt76->band_idx;
-+			if (td->tx_rate_mode == MT76_TM_TX_MODE_VHT ||
-+			    td->tx_rate_mode == MT76_TM_TX_MODE_HE_SU)
-+				mt7996_tm_set(dev, SET_ID(NSS), td->tx_rate_nss);
-+
-+			mt7996_tm_set(dev, SET_ID(ENCODE_MODE), td->tx_rate_ldpc);
-+			mt7996_tm_set(dev, SET_ID(TX_COUNT), td->tx_count);
-+		} else {
-+			/* Turn On BBP CR for RX */
-+			mt76_set(dev, EBF_BBP_RX_OFFSET, EBF_BBP_RX_ENABLE);
-+			dev_info(dev->mt76.dev, "Set BBP RX CR = %x\n",
-+				 mt76_rr(dev, EBF_BBP_RX_OFFSET));
-+
-+			td->tx_antenna_mask = 1;
-+		}
-+		width = phy->mt76->chandef.width;
-+
-+		if (td->tx_rate_mode == MT76_TM_TX_MODE_EHT_MU)
-+			td->tx_rate_mode = MT76_TM_TX_MODE_EHT_SU;
-+	}
-+	mt76_testmode_param_set(td, MT76_TM_ATTR_TX_ANTENNA);
-+
-+	mt7996_tm_set(dev, SET_ID(TX_MODE),
-+		      mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_PHY));
-+	mt7996_tm_set(dev, SET_ID(TX_RATE), td->tx_rate_idx);
-+	mt7996_tm_set(dev, SET_ID(GI), td->tx_rate_sgi);
-+	mt7996_tm_set(dev, SET_ID(CBW),
-+		      mt7996_tm_bw_mapping(width, BW_MAP_NL_TO_FW));
-+	mt7996_tm_set(dev, SET_ID(DBW),
-+		      mt7996_tm_bw_mapping(width, BW_MAP_NL_TO_FW));
-+	mt7996_tm_set_antenna(phy, SET_ID(TX_PATH));
-+	mt7996_tm_set_antenna(phy, SET_ID(RX_PATH));
-+	mt7996_tm_set(dev, SET_ID(IPG), td->tx_ipg);
-+	mt7996_tm_set(dev, SET_ID(TX_LEN), td->tx_mpdu_len);
-+	mt7996_tm_set(dev, SET_ID(TX_TIME), 0);
-+	mt7996_tm_set(dev, SET_ID(COMMAND), RF_CMD(TX_COMMIT));
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_txbf_phase_comp(struct mt7996_phy *phy, u16 *val)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_bf_req req = {
-+		.phase_comp = {
-+			.tag = cpu_to_le16(BF_IBF_PHASE_COMP),
-+			.len = cpu_to_le16(sizeof(req.phase_comp)),
-+			.bw = val[0],
-+			.jp_band = (val[2] == 1) ? 1 : 0,
-+			.band_idx = phy->mt76->band_idx,
-+			.read_from_e2p = val[3],
-+			.disable = val[4],
-+			.group = val[2],
-+		}
-+	};
-+	struct mt7996_txbf_phase *phase = (struct mt7996_txbf_phase *)dev->test.txbf_phase_cal;
-+
-+	wait_event_timeout(dev->mt76.tx_wait, phase[val[2]].status != 0, HZ);
-+	if (val[2])
-+		memcpy(req.phase_comp.buf, &phase[val[2]].phase_5g, sizeof(req.phase_comp.buf));
-+	else
-+		memcpy(req.phase_comp.buf, &phase[val[2]].phase_2g, sizeof(req.phase_comp.buf));
-+
-+	pr_info("ibf cal process: phase comp info\n");
-+	print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
-+		       &req, sizeof(req), 0);
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &req,
-+				 sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_txbf_profile_tag_write(struct mt7996_phy *phy, u8 pfmu_idx, struct mt7996_pfmu_tag *tag)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_bf_req req = {
-+		.pfmu_tag = {
-+			.tag = cpu_to_le16(BF_PFMU_TAG_WRITE),
-+			.len = cpu_to_le16(sizeof(req.pfmu_tag)),
-+			.pfmu_id = pfmu_idx,
-+			.bfer = true,
-+			.band_idx = phy->mt76->band_idx,
-+		}
-+	};
-+
-+	memcpy(req.pfmu_tag.buf, tag, sizeof(*tag));
-+	wait_event_timeout(dev->mt76.tx_wait, tag->t1.pfmu_idx != 0, HZ);
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &req,
-+				 sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_add_txbf_sta(struct mt7996_phy *phy, u8 pfmu_idx, u8 nr, u8 nc, bool ebf)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct {
-+		struct sta_req_hdr hdr;
-+		struct sta_rec_bf bf;
-+	} __packed req = {
-+		.hdr = {
-+			.bss_idx = phy->mt76->band_idx,
-+			.wlan_idx_lo = to_wcid_lo(phy->mt76->band_idx + 1),
-+			.tlv_num = 1,
-+			.is_tlv_append = 1,
-+			.muar_idx = 0,
-+			.wlan_idx_hi = to_wcid_hi(phy->mt76->band_idx + 1),
-+		},
-+		.bf = {
-+			.tag = cpu_to_le16(STA_REC_BF),
-+			.len = cpu_to_le16(sizeof(req.bf)),
-+			.pfmu = cpu_to_le16(pfmu_idx),
-+			.sounding_phy = 1,
-+			.bf_cap = ebf,
-+			.ncol = nc,
-+			.nrow = nr,
-+			.ibf_timeout = 0xff,
-+			.tx_mode = mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_PHY),
-+		},
-+	};
-+	u8 ndp_rate, ndpa_rate, rept_poll_rate, bf_bw;
-+
-+	if (td->tx_rate_mode == MT76_TM_TX_MODE_HE_SU ||
-+	    td->tx_rate_mode == MT76_TM_TX_MODE_EHT_SU) {
-+		rept_poll_rate = 0x49;
-+		ndpa_rate = 0x49;
-+		ndp_rate = 0;
-+	} else if (td->tx_rate_mode == MT76_TM_TX_MODE_VHT) {
-+		rept_poll_rate = 0x9;
-+		ndpa_rate = 0x9;
-+		ndp_rate = 0;
-+	} else {
-+		rept_poll_rate = 0;
-+		ndpa_rate = 0;
-+		if (nr == 1)
-+			ndp_rate = 8;
-+		else if (nr == 2)
-+			ndp_rate = 16;
-+		else
-+			ndp_rate = 24;
-+	}
-+
-+	bf_bw = mt7996_tm_bw_mapping(phy->mt76->chandef.width, BW_MAP_NL_TO_BF);
-+	req.bf.ndp_rate = ndp_rate;
-+	req.bf.ndpa_rate = ndpa_rate;
-+	req.bf.rept_poll_rate = rept_poll_rate;
-+	req.bf.bw = bf_bw;
-+	req.bf.tx_mode = (td->tx_rate_mode == MT76_TM_TX_MODE_EHT_SU) ? 0xf : req.bf.tx_mode;
-+
-+	if (ebf) {
-+		req.bf.mem[0].row = 0;
-+		req.bf.mem[1].row = 1;
-+		req.bf.mem[2].row = 2;
-+		req.bf.mem[3].row = 3;
-+	} else {
-+		req.bf.mem[0].row = 4;
-+		req.bf.mem[1].row = 5;
-+		req.bf.mem[2].row = 6;
-+		req.bf.mem[3].row = 7;
-+	}
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WMWA_UNI_CMD(STA_REC_UPDATE), &req,
-+				 sizeof(req), true);
-+}
-+
-+static int
-+mt7996_tm_txbf_profile_update(struct mt7996_phy *phy, u16 *val, bool ebf)
-+{
-+#define MT_ARB_IBF_ENABLE			(BIT(0) | GENMASK(9, 8))
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_pfmu_tag *tag = dev->test.txbf_pfmu_tag;
-+	u8 pfmu_idx = val[0], nc = val[2], nr;
-+	int ret;
-+	bool is_atenl = val[5];
-+
-+	if (td->tx_antenna_mask == 3)
-+		nr = 1;
-+	else if (td->tx_antenna_mask == 7)
-+		nr = 2;
-+	else
-+		nr = 3;
-+
-+	memset(tag, 0, sizeof(*tag));
-+	tag->t1.pfmu_idx = pfmu_idx;
-+	tag->t1.ebf = ebf;
-+	tag->t1.nr = nr;
-+	tag->t1.nc = nc;
-+	tag->t1.invalid_prof = true;
-+	tag->t1.data_bw = mt7996_tm_bw_mapping(phy->mt76->chandef.width, BW_MAP_NL_TO_BF);
-+	tag->t2.se_idx = td->tx_spe_idx;
-+
-+	if (ebf) {
-+		tag->t1.row_id1 = 0;
-+		tag->t1.row_id2 = 1;
-+		tag->t1.row_id3 = 2;
-+		tag->t1.row_id4 = 3;
-+		tag->t1.lm = mt7996_tm_rate_mapping(td->tx_rate_mode, RATE_MODE_TO_LM);
-+	} else {
-+		tag->t1.row_id1 = 4;
-+		tag->t1.row_id2 = 5;
-+		tag->t1.row_id3 = 6;
-+		tag->t1.row_id4 = 7;
-+		tag->t1.lm = mt7996_tm_rate_mapping(MT76_TM_TX_MODE_OFDM, RATE_MODE_TO_LM);
-+
-+		tag->t2.ibf_timeout = 0xff;
-+		tag->t2.ibf_nr = nr;
-+		tag->t2.ibf_nc = nc;
-+	}
-+
-+	ret = mt7996_tm_txbf_profile_tag_write(phy, pfmu_idx, tag);
-+	if (ret)
-+		return ret;
-+
-+	ret = mt7996_tm_add_txbf_sta(phy, pfmu_idx, nr, nc, ebf);
-+	if (ret)
-+		return ret;
-+
-+	if (!is_atenl && !td->ibf) {
-+		mt76_set(dev, MT_ARB_TQSAXM0(phy->mt76->band_idx), MT_ARB_TQSAXM_ALTX_START_MASK);
-+		dev_info(dev->mt76.dev, "Set TX queue start CR for AX management (0x%x) = 0x%x\n",
-+			 MT_ARB_TQSAXM0(phy->mt76->band_idx),
-+			 mt76_rr(dev, MT_ARB_TQSAXM0(phy->mt76->band_idx)));
-+	} else if (!is_atenl && td->ibf && ebf) {
-+		/* iBF's ebf profile update */
-+		mt76_set(dev, MT_ARB_TQSAXM0(phy->mt76->band_idx), MT_ARB_IBF_ENABLE);
-+		dev_info(dev->mt76.dev, "Set TX queue start CR for AX management (0x%x) = 0x%x\n",
-+			 MT_ARB_TQSAXM0(phy->mt76->band_idx),
-+			 mt76_rr(dev, MT_ARB_TQSAXM0(phy->mt76->band_idx)));
-+	}
-+
-+	if (!ebf && is_atenl)
-+		return mt7996_tm_txbf_apply_tx(phy, 1, false, true, true);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_txbf_phase_cal(struct mt7996_phy *phy, u16 *val)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_bf_req req = {
-+		.phase_cal = {
-+			.tag = cpu_to_le16(BF_PHASE_CALIBRATION),
-+			.len = cpu_to_le16(sizeof(req.phase_cal)),
-+			.group = val[0],
-+			.group_l_m_n = val[1],
-+			.sx2 = val[2],
-+			.cal_type = val[3],
-+			.lna_gain_level = val[4],
-+			.band_idx = phy->mt76->band_idx,
-+		},
-+	};
-+	struct mt7996_txbf_phase *phase = (struct mt7996_txbf_phase *)dev->test.txbf_phase_cal;
-+
-+	/* reset phase status before update phase cal data */
-+	phase[req.phase_cal.group].status = 0;
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &req,
-+				 sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_txbf_profile_update_all(struct mt7996_phy *phy, u16 *val)
-+{
-+#define MT7996_TXBF_PFMU_DATA_LEN	(MT7996_TXBF_SUBCAR_NUM * sizeof(struct mt7996_pfmu_data))
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	u8 nss = hweight8(td->tx_antenna_mask);
-+	u16 pfmu_idx = val[0];
-+	u16 subc_id = val[1];
-+	u16 angle11 = val[2];
-+	u16 angle21 = val[3];
-+	u16 angle31 = val[4];
-+	u16 angle41 = val[5];
-+	s16 phi11 = 0, phi21 = 0, phi31 = 0;
-+	struct mt7996_pfmu_data *pfmu_data;
-+
-+	if (subc_id > MT7996_TXBF_SUBCAR_NUM - 1)
-+		return -EINVAL;
-+
-+	if (nss == 2) {
-+		phi11 = (s16)(angle21 - angle11);
-+	} else if (nss == 3) {
-+		phi11 = (s16)(angle31 - angle11);
-+		phi21 = (s16)(angle31 - angle21);
-+	} else {
-+		phi11 = (s16)(angle41 - angle11);
-+		phi21 = (s16)(angle41 - angle21);
-+		phi31 = (s16)(angle41 - angle31);
-+	}
-+
-+	pfmu_data = (struct mt7996_pfmu_data *)phy->dev->test.txbf_pfmu_data;
-+	pfmu_data = &pfmu_data[subc_id];
-+
-+	if (subc_id < 32)
-+		pfmu_data->subc_idx = cpu_to_le16(subc_id + 224);
-+	else
-+		pfmu_data->subc_idx = cpu_to_le16(subc_id - 32);
-+
-+	pfmu_data->phi11 = cpu_to_le16(phi11);
-+	pfmu_data->phi21 = cpu_to_le16(phi21);
-+	pfmu_data->phi31 = cpu_to_le16(phi31);
-+	if (subc_id == MT7996_TXBF_SUBCAR_NUM - 1) {
-+		struct mt7996_dev *dev = phy->dev;
-+		struct mt7996_tm_bf_req req = {
-+			.pfmu_data_all = {
-+				.tag = cpu_to_le16(BF_PROFILE_WRITE_20M_ALL),
-+				.len = cpu_to_le16(sizeof(req.pfmu_data_all)),
-+				.pfmu_id = pfmu_idx,
-+				.band_idx = phy->mt76->band_idx,
-+			},
-+		};
-+
-+		memcpy(req.pfmu_data_all.buf, dev->test.txbf_pfmu_data, MT7996_TXBF_PFMU_DATA_LEN);
-+
-+		return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF),
-+					 &req, sizeof(req), true);
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_txbf_e2p_update(struct mt7996_phy *phy)
-+{
-+#define TXBF_PHASE_EEPROM_START_OFFSET		0xc00
-+#define TXBF_PHASE_GROUP_EEPROM_OFFSET		0x2e
-+	struct mt7996_txbf_phase *phase, *p;
-+	struct mt7996_dev *dev = phy->dev;
-+	u8 *eeprom = dev->mt76.eeprom.data;
-+	u16 offset;
-+	int i;
-+
-+	offset = TXBF_PHASE_EEPROM_START_OFFSET;
-+	phase = (struct mt7996_txbf_phase *)dev->test.txbf_phase_cal;
-+	for (i = 0; i < MAX_PHASE_GROUP_NUM; i++) {
-+		p = &phase[i];
-+
-+		if (!p->status)
-+			continue;
-+
-+		/* copy phase cal data to eeprom */
-+		if (i)
-+			memcpy(eeprom + offset, &p->phase_5g, sizeof(p->phase_5g));
-+		else
-+			memcpy(eeprom + offset, &p->phase_2g, sizeof(p->phase_2g));
-+		offset += TXBF_PHASE_GROUP_EEPROM_OFFSET;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_txbf_apply_tx(struct mt7996_phy *phy, u16 wlan_idx, bool ebf,
-+			bool ibf, bool phase_cal)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_bf_req req = {
-+		.tx_apply = {
-+			.tag = cpu_to_le16(BF_DATA_PACKET_APPLY),
-+			.len = cpu_to_le16(sizeof(req.tx_apply)),
-+			.wlan_idx = cpu_to_le16(wlan_idx),
-+			.ebf = ebf,
-+			.ibf = ibf,
-+			.phase_cal = phase_cal,
-+		},
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &req, sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_txbf_set_tx(struct mt7996_phy *phy, u16 *val)
-+{
-+	bool bf_on = val[0], update = val[3];
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_pfmu_tag *tag = dev->test.txbf_pfmu_tag;
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+
-+	if (bf_on) {
-+		mt7996_tm_set_rx_frames(phy, false);
-+		mt7996_tm_set_tx_frames(phy, false);
-+		mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, 2, true);
-+		tag->t1.invalid_prof = false;
-+		mt7996_tm_txbf_profile_tag_write(phy, 2, tag);
-+		td->bf_ever_en = true;
-+
-+		if (update)
-+			mt7996_tm_txbf_apply_tx(phy, 1, 0, 1, 1);
-+	} else {
-+		if (!td->bf_ever_en) {
-+			mt7996_tm_set_rx_frames(phy, false);
-+			mt7996_tm_set_tx_frames(phy, false);
-+			td->ibf = false;
-+			td->ebf = false;
-+
-+			if (update)
-+				mt7996_tm_txbf_apply_tx(phy, 1, 0, 0, 0);
-+		} else {
-+			td->bf_ever_en = false;
-+
-+			mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, 2, true);
-+			tag->t1.invalid_prof = true;
-+			mt7996_tm_txbf_profile_tag_write(phy, 2, tag);
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_tm_trigger_sounding(struct mt7996_phy *phy, u16 *val, bool en)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	u8 sounding_mode = val[0];
-+	u8 sta_num = val[1];
-+	u32 sounding_interval = (u32)val[2] << 2;	/* input unit: 4ms */
-+	u16 tag = en ? BF_SOUNDING_ON : BF_SOUNDING_OFF;
-+	struct mt7996_tm_bf_req req = {
-+		.sounding = {
-+			.tag = cpu_to_le16(tag),
-+			.len = cpu_to_le16(sizeof(req.sounding)),
-+			.snd_mode = sounding_mode,
-+			.sta_num = sta_num,
-+			.wlan_id = {
-+				cpu_to_le16(val[3]),
-+				cpu_to_le16(val[4]),
-+				cpu_to_le16(val[5]),
-+				cpu_to_le16(val[6])
-+			},
-+			.snd_period = cpu_to_le32(sounding_interval),
-+		},
-+	};
-+
-+	if (sounding_mode > SOUNDING_MODE_MAX)
-+		return -EINVAL;
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF),
-+				 &req, sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_txbf_txcmd(struct mt7996_phy *phy, u16 *val)
-+{
-+	struct mt7996_dev *dev = phy->dev;
-+	struct mt7996_tm_bf_req req = {
-+		.txcmd = {
-+			.tag = cpu_to_le16(BF_CMD_TXCMD),
-+			.len = cpu_to_le16(sizeof(req.txcmd)),
-+			.action = val[0],
-+			.bf_manual = val[1],
-+			.bf_bit = val[2],
-+		},
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(BF), &req, sizeof(req), false);
-+}
-+
-+static int
-+mt7996_tm_set_txbf(struct mt7996_phy *phy)
-+{
-+#define TXBF_IS_DUT_MASK	BIT(0)
-+#define TXBF_IBF_MASK		BIT(1)
-+	struct mt76_testmode_data *td = &phy->mt76->test;
-+	u16 *val = td->txbf_param;
-+
-+	dev_info(phy->dev->mt76.dev,
-+		 "ibf cal process: act = %u, val = %u, %u, %u, %u, %u, %u, %u, %u\n",
-+		 td->txbf_act, val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]);
-+
-+	switch (td->txbf_act) {
-+	case MT76_TM_TXBF_ACT_GOLDEN_INIT:
-+	case MT76_TM_TXBF_ACT_INIT:
-+	case MT76_TM_TX_EBF_ACT_GOLDEN_INIT:
-+	case MT76_TM_TX_EBF_ACT_INIT:
-+		td->ibf = !u32_get_bits(td->txbf_act, TXBF_IBF_MASK);
-+		td->ebf = true;
-+		td->is_txbf_dut = !!u32_get_bits(td->txbf_act, TXBF_IS_DUT_MASK);
-+		return mt7996_tm_txbf_init(phy, val);
-+	case MT76_TM_TXBF_ACT_UPDATE_CH:
-+		mt7996_tm_update_channel(phy);
-+		break;
-+	case MT76_TM_TXBF_ACT_PHASE_COMP:
-+		return mt7996_tm_txbf_phase_comp(phy, val);
-+	case MT76_TM_TXBF_ACT_TX_PREP:
-+		return mt7996_tm_txbf_set_tx(phy, val);
-+	case MT76_TM_TXBF_ACT_IBF_PROF_UPDATE:
-+		return mt7996_tm_txbf_profile_update(phy, val, false);
-+	case MT76_TM_TXBF_ACT_EBF_PROF_UPDATE:
-+		return mt7996_tm_txbf_profile_update(phy, val, true);
-+	case MT76_TM_TXBF_ACT_PHASE_CAL:
-+		return mt7996_tm_txbf_phase_cal(phy, val);
-+	case MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD:
-+	case MT76_TM_TXBF_ACT_PROF_UPDATE_ALL:
-+		return mt7996_tm_txbf_profile_update_all(phy, val);
-+	case MT76_TM_TXBF_ACT_E2P_UPDATE:
-+		return mt7996_tm_txbf_e2p_update(phy);
-+	case MT76_TM_TXBF_ACT_APPLY_TX: {
-+		u16 wlan_idx = val[0];
-+		bool ebf = !!val[1], ibf = !!val[2], phase_cal = !!val[4];
-+
-+		return mt7996_tm_txbf_apply_tx(phy, wlan_idx, ebf, ibf, phase_cal);
-+	}
-+	case MT76_TM_TXBF_ACT_TRIGGER_SOUNDING:
-+		return mt7996_tm_trigger_sounding(phy, val, true);
-+	case MT76_TM_TXBF_ACT_STOP_SOUNDING:
-+		memset(val, 0, sizeof(td->txbf_param));
-+		return mt7996_tm_trigger_sounding(phy, val, false);
-+	case MT76_TM_TXBF_ACT_PROFILE_TAG_READ:
-+	case MT76_TM_TXBF_ACT_PROFILE_TAG_WRITE:
-+	case MT76_TM_TXBF_ACT_PROFILE_TAG_INVALID: {
-+		u8 pfmu_idx = val[0];
-+		bool bfer = !!val[1];
-+		struct mt7996_dev *dev = phy->dev;
-+		struct mt7996_pfmu_tag *tag = dev->test.txbf_pfmu_tag;
-+
-+		if (!tag) {
-+			dev_err(dev->mt76.dev,
-+				"pfmu tag is not initialized!\n");
-+			return 0;
-+		}
-+
-+		if (td->txbf_act == MT76_TM_TXBF_ACT_PROFILE_TAG_WRITE)
-+			return mt7996_tm_txbf_profile_tag_write(phy, pfmu_idx, tag);
-+		else if (td->txbf_act == MT76_TM_TXBF_ACT_PROFILE_TAG_READ)
-+			return mt7996_mcu_set_txbf_internal(phy, BF_PFMU_TAG_READ, pfmu_idx, bfer);
-+
-+		tag->t1.invalid_prof = !!val[0];
-+
-+		return 0;
-+	}
-+	case MT76_TM_TXBF_ACT_STA_REC_READ:
-+		return mt7996_mcu_set_txbf_internal(phy, BF_STA_REC_READ, val[0], 0);
-+	case MT76_TM_TXBF_ACT_TXCMD:
-+		return mt7996_tm_txbf_txcmd(phy, val);
-+	default:
-+		break;
-+	};
-+
-+	return 0;
-+}
-+
- static void
- mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
- {
-@@ -1086,6 +1770,8 @@ mt7996_tm_update_params(struct mt7996_phy *phy, u32 changed)
- 		mt7996_tm_set_ipi(phy);
- 	if (changed & BIT(TM_CHANGED_IPI_RESET))
- 		mt7996_tm_ipi_hist_ctrl(phy, NULL, RDD_SET_IPI_HIST_RESET);
-+	if (changed & BIT(TM_CHANGED_TXBF_ACT))
-+		mt7996_tm_set_txbf(phy);
- }
- 
- static int
-diff --git a/mt7996/testmode.h b/mt7996/testmode.h
-index 78662b2e..f97ccb26 100644
---- a/mt7996/testmode.h
-+++ b/mt7996/testmode.h
-@@ -27,6 +27,17 @@ enum {
- 	FW_CDBW_8080MHZ,
- };
- 
-+enum {
-+	BF_CDBW_20MHZ,
-+	BF_CDBW_40MHZ,
-+	BF_CDBW_80MHZ,
-+	BF_CDBW_160MHZ,
-+	BF_CDBW_320MHZ,
-+	BF_CDBW_10MHZ = BF_CDBW_320MHZ,
-+	BF_CDBW_5MHZ,
-+	BF_CDBW_8080MHZ,
-+};
-+
- #define FIRST_CONTROL_CHAN_BITMAP_BW40		0x5555555
- #define FIRST_CONTROL_CHAN_BITMAP_BW80		0x111111
- #define FIRST_CONTROL_CHAN_BITMAP_BW160		0x100101
-@@ -34,12 +45,20 @@ enum {
- enum bw_mapping_method {
- 	BW_MAP_NL_TO_FW,
- 	BW_MAP_NL_TO_TM,
-+	BW_MAP_NL_TO_BF,
- 	BW_MAP_NL_TO_MHZ,
- 	BW_MAP_NL_TO_CONTROL_BITMAP_5G,
- 
- 	NUM_BW_MAP,
- };
- 
-+enum rate_mapping_type {
-+	RATE_MODE_TO_PHY,
-+	RATE_MODE_TO_LM,
-+
-+	NUM_RATE_MAP,
-+};
-+
- struct tm_cal_param {
- 	__le32 func_data;
- 	u8 band_idx;
-diff --git a/testmode.c b/testmode.c
-index 69147f86..a5c07f8d 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -462,6 +462,42 @@ out:
- 	return err;
- }
- 
-+static int
-+mt76_testmode_txbf_profile_update_all_cmd(struct mt76_phy *phy, struct nlattr **tb, u32 state)
-+{
-+#define PARAM_UNIT	5
-+	static u8 pfmu_idx;
-+	struct mt76_testmode_data *td = &phy->test;
-+	struct mt76_dev *dev = phy->dev;
-+	struct nlattr *cur;
-+	u16 tmp_val[PARAM_UNIT], *val = td->txbf_param;
-+	int idx, rem, ret, i = 0;
-+
-+	memset(td->txbf_param, 0, sizeof(td->txbf_param));
-+	nla_for_each_nested(cur, tb[MT76_TM_ATTR_TXBF_PARAM], rem) {
-+		if (nla_len(cur) != 2)
-+			return -EINVAL;
-+		idx = i % PARAM_UNIT;
-+		tmp_val[idx] = nla_get_u16(cur);
-+		if (idx == 1 && (tmp_val[idx] == 0xf0 || tmp_val[idx] == 0xff)) {
-+			pfmu_idx = tmp_val[0];
-+			return 0;
-+		}
-+		if (idx == PARAM_UNIT - 1) {
-+			val[0] = pfmu_idx;
-+			memcpy(val + 1, tmp_val, sizeof(tmp_val));
-+			if (dev->test_ops->set_params) {
-+				ret = dev->test_ops->set_params(phy, tb, state);
-+				if (ret)
-+					return ret;
-+			}
-+		}
-+		i++;
-+	}
-+
-+	return 0;
-+}
-+
- int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		      void *data, int len)
- {
-@@ -607,6 +643,30 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- 		}
- 	}
- 
-+	if (tb[MT76_TM_ATTR_TXBF_ACT]) {
-+		struct nlattr *cur;
-+		int rem, idx = 0;
-+
-+		if (!tb[MT76_TM_ATTR_TXBF_PARAM] ||
-+		    mt76_tm_get_u8(tb[MT76_TM_ATTR_TXBF_ACT], &td->txbf_act,
-+				   0, MT76_TM_TXBF_ACT_MAX))
-+			goto out;
-+
-+		if (td->txbf_act == MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD) {
-+			err = mt76_testmode_txbf_profile_update_all_cmd(phy, tb, state);
-+			goto out;
-+		}
-+
-+		memset(td->txbf_param, 0, sizeof(td->txbf_param));
-+		nla_for_each_nested(cur, tb[MT76_TM_ATTR_TXBF_PARAM], rem) {
-+			if (nla_len(cur) != 2 ||
-+			    idx >= ARRAY_SIZE(td->txbf_param))
-+				goto out;
-+
-+			td->txbf_param[idx++] = nla_get_u16(cur);
-+		}
-+	}
-+
- 	if (dev->test_ops->set_params) {
- 		err = dev->test_ops->set_params(phy, tb, state);
- 		if (err)
-diff --git a/testmode.h b/testmode.h
-index 5d677f8c..bda7624a 100644
---- a/testmode.h
-+++ b/testmode.h
-@@ -286,6 +286,59 @@ enum mt76_testmode_eeprom_action {
- 	MT76_TM_EEPROM_ACTION_MAX = NUM_MT76_TM_EEPROM_ACTION - 1,
- };
- 
-+/**
-+ * enum mt76_testmode_txbf_act - txbf action
-+ *
-+ * @MT76_TM_TXBF_ACT_GOLDEN_INIT: init ibf setting for golden device
-+ * @MT76_TM_TXBF_ACT_INIT: init ibf setting for DUT
-+ * @MT76_TM_TX_EBF_ACT_GOLDEN_INIT: init ebf setting for golden device
-+ * @MT76_TM_TX_EBF_ACT_INIT: init ebf setting for DUT
-+ * @MT76_TM_TXBF_ACT_UPDATE_CH: update channel info
-+ * @MT76_TM_TXBF_ACT_PHASE_COMP: txbf phase compensation
-+ * @MT76_TM_TXBF_ACT_TX_PREP: TX preparation for txbf
-+ * @MT76_TM_TXBF_ACT_IBF_PROF_UPDATE: update ibf profile (pfmu tag, bf sta record)
-+ * @MT76_TM_TXBF_ACT_EBF_PROF_UPDATE: update ebf profile
-+ * @MT76_TM_TXBF_ACT_APPLY_TX: apply TX setting for txbf
-+ * @MT76_TM_TXBF_ACT_PHASE_CAL: perform txbf phase calibration
-+ * @MT76_TM_TXBF_ACT_PROF_UPDATE_ALL: update bf profile via instrument
-+ * @MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD: update bf profile via instrument
-+ * @MT76_TM_TXBF_ACT_E2P_UPDATE: write back txbf calibration result to eeprom
-+ * @MT76_TM_TXBF_ACT_TRIGGER_SOUNDING: trigger beamformer to send sounding packet
-+ * @MT76_TM_TXBF_ACT_STOP_SOUNDING: stop sending sounding packet
-+ * @MT76_TM_TXBF_ACT_PROFILE_TAG_READ: read pfmu tag
-+ * @MT76_TM_TXBF_ACT_PROFILE_TAG_WRITE: update pfmu tag
-+ * @MT76_TM_TXBF_ACT_PROFILE_TAG_INVALID: invalidate pfmu tag
-+ * @MT76_TM_TXBF_ACT_STA_REC_READ: read bf sta record
-+ * @MT76_TM_TXBF_ACT_TXCMD: configure txcmd bf bit manually
-+ */
-+enum mt76_testmode_txbf_act {
-+	MT76_TM_TXBF_ACT_GOLDEN_INIT,
-+	MT76_TM_TXBF_ACT_INIT,
-+	MT76_TM_TX_EBF_ACT_GOLDEN_INIT,
-+	MT76_TM_TX_EBF_ACT_INIT,
-+	MT76_TM_TXBF_ACT_UPDATE_CH,
-+	MT76_TM_TXBF_ACT_PHASE_COMP,
-+	MT76_TM_TXBF_ACT_TX_PREP,
-+	MT76_TM_TXBF_ACT_IBF_PROF_UPDATE,
-+	MT76_TM_TXBF_ACT_EBF_PROF_UPDATE,
-+	MT76_TM_TXBF_ACT_APPLY_TX,
-+	MT76_TM_TXBF_ACT_PHASE_CAL,
-+	MT76_TM_TXBF_ACT_PROF_UPDATE_ALL,
-+	MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD,
-+	MT76_TM_TXBF_ACT_E2P_UPDATE,
-+	MT76_TM_TXBF_ACT_TRIGGER_SOUNDING,
-+	MT76_TM_TXBF_ACT_STOP_SOUNDING,
-+	MT76_TM_TXBF_ACT_PROFILE_TAG_READ,
-+	MT76_TM_TXBF_ACT_PROFILE_TAG_WRITE,
-+	MT76_TM_TXBF_ACT_PROFILE_TAG_INVALID,
-+	MT76_TM_TXBF_ACT_STA_REC_READ,
-+	MT76_TM_TXBF_ACT_TXCMD,
-+
-+	/* keep last */
-+	NUM_MT76_TM_TXBF_ACT,
-+	MT76_TM_TXBF_ACT_MAX = NUM_MT76_TM_TXBF_ACT - 1,
-+};
-+
- extern const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS];
- 
- #endif
-diff --git a/tools/fields.c b/tools/fields.c
-index 77696ce7..f793d1a5 100644
---- a/tools/fields.c
-+++ b/tools/fields.c
-@@ -44,6 +44,30 @@ static const char * const testmode_offchan_bw[] = {
- 	[NL80211_CHAN_WIDTH_160] = "160",
- };
- 
-+static const char * const testmode_txbf_act[] = {
-+	[MT76_TM_TXBF_ACT_GOLDEN_INIT] = "golden_init",
-+	[MT76_TM_TXBF_ACT_INIT] = "init",
-+	[MT76_TM_TX_EBF_ACT_GOLDEN_INIT] = "ebf_golden_init",
-+	[MT76_TM_TX_EBF_ACT_INIT] = "ebf_init",
-+	[MT76_TM_TXBF_ACT_UPDATE_CH] = "update_ch",
-+	[MT76_TM_TXBF_ACT_PHASE_COMP] = "phase_comp",
-+	[MT76_TM_TXBF_ACT_TX_PREP] = "tx_prep",
-+	[MT76_TM_TXBF_ACT_IBF_PROF_UPDATE] = "ibf_prof_update",
-+	[MT76_TM_TXBF_ACT_EBF_PROF_UPDATE] = "ebf_prof_update",
-+	[MT76_TM_TXBF_ACT_APPLY_TX] = "apply_tx",
-+	[MT76_TM_TXBF_ACT_PHASE_CAL] = "phase_cal",
-+	[MT76_TM_TXBF_ACT_PROF_UPDATE_ALL] = "prof_update",
-+	[MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD] = "prof_update_all",
-+	[MT76_TM_TXBF_ACT_E2P_UPDATE] = "e2p_update",
-+	[MT76_TM_TXBF_ACT_TRIGGER_SOUNDING] = "trigger_sounding",
-+	[MT76_TM_TXBF_ACT_STOP_SOUNDING] = "stop_sounding",
-+	[MT76_TM_TXBF_ACT_PROFILE_TAG_READ] = "pfmu_tag_read",
-+	[MT76_TM_TXBF_ACT_PROFILE_TAG_WRITE] = "pfmu_tag_write",
-+	[MT76_TM_TXBF_ACT_PROFILE_TAG_INVALID] = "set_invalid_prof",
-+	[MT76_TM_TXBF_ACT_STA_REC_READ] = "sta_rec_read",
-+	[MT76_TM_TXBF_ACT_TXCMD] = "txcmd",
-+};
-+
- static void print_enum(const struct tm_field *field, struct nlattr *attr)
- {
- 	unsigned int i = nla_get_u8(attr);
-@@ -94,6 +118,17 @@ static void print_s8(const struct tm_field *field, struct nlattr *attr)
- 	printf("%d", (int8_t)nla_get_u8(attr));
- }
- 
-+static bool parse_u16_hex(const struct tm_field *field, int idx,
-+			  struct nl_msg *msg, const char *val)
-+{
-+	return !nla_put_u16(msg, idx, strtoul(val, NULL, 16));
-+}
-+
-+static void print_u16_hex(const struct tm_field *field, struct nlattr *attr)
-+{
-+	printf("%d", nla_get_u16(attr));
-+}
-+
- static bool parse_u32(const struct tm_field *field, int idx,
- 		      struct nl_msg *msg, const char *val)
- {
-@@ -399,6 +434,8 @@ static const struct tm_field testdata_fields[NUM_MT76_TM_ATTRS] = {
- 	FIELD(u8, AID, "aid"),
- 	FIELD(u8, RU_ALLOC, "ru_alloc"),
- 	FIELD(u8, RU_IDX, "ru_idx"),
-+	FIELD_ENUM(TXBF_ACT, "txbf_act", testmode_txbf_act),
-+	FIELD_ARRAY(u16_hex, TXBF_PARAM, "txbf_param"),
- 	FIELD(u8, OFF_CH_SCAN_CH, "offchan_ch"),
- 	FIELD(u8, OFF_CH_SCAN_CENTER_CH, "offchan_center_ch"),
- 	FIELD_ENUM(OFF_CH_SCAN_BW, "offchan_bw", testmode_offchan_bw),
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1035-mtk-wifi-mt76-mt7996-add-zwdfs-cert-mode.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1035-mtk-wifi-mt76-mt7996-add-zwdfs-cert-mode.patch
deleted file mode 100644
index 326198c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1035-mtk-wifi-mt76-mt7996-add-zwdfs-cert-mode.patch
+++ /dev/null
@@ -1,221 +0,0 @@
-From 68abdcf3519187da5d7fe324b8aa5cbb64ea13a3 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 22 Sep 2023 12:33:06 +0800
-Subject: [PATCH 1035/1044] mtk: wifi: mt76: mt7996: add zwdfs cert mode
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/mcu.c    | 44 ++++++++++++++++++++++++++++++++------------
- mt7996/mcu.h    | 14 ++++++++++++++
- mt7996/mt7996.h |  5 +++++
- mt7996/vendor.c | 37 +++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 12 ++++++++++++
- 5 files changed, 100 insertions(+), 12 deletions(-)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 6e3047ba..ded28e9a 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -4506,18 +4506,7 @@ int mt7996_mcu_set_radio_en(struct mt7996_phy *phy, bool enable)
- int mt7996_mcu_rdd_cmd(struct mt7996_dev *dev, int cmd, u8 index,
- 		       u8 rx_sel, u8 val)
- {
--	struct {
--		u8 _rsv[4];
--
--		__le16 tag;
--		__le16 len;
--
--		u8 ctrl;
--		u8 rdd_idx;
--		u8 rdd_rx_sel;
--		u8 val;
--		u8 rsv[4];
--	} __packed req = {
-+	struct mt7996_rdd_ctrl req = {
- 		.tag = cpu_to_le16(UNI_RDD_CTRL_PARM),
- 		.len = cpu_to_le16(sizeof(req) - 4),
- 		.ctrl = cmd,
-@@ -4530,6 +4519,37 @@ int mt7996_mcu_rdd_cmd(struct mt7996_dev *dev, int cmd, u8 index,
- 				 &req, sizeof(req), true);
- }
- 
-+int mt7996_mcu_rdd_background_disable_timer(struct mt7996_dev *dev, bool disable_timer)
-+{
-+	struct mt7996_rdd_ctrl req = {
-+		.tag = cpu_to_le16(UNI_RDD_CTRL_PARM),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.ctrl = RDD_DISABLE_ZW_TIMER,
-+		.rdd_idx = MT_RX_SEL2,
-+		.disable_timer = disable_timer,
-+	};
-+
-+	if (!is_mt7996(&dev->mt76) ||
-+	    (mt76_get_field(dev, MT_PAD_GPIO, MT_PAD_GPIO_ADIE_COMB) % 2))
-+		return 0;
-+
-+	switch (dev->mt76.region) {
-+	case NL80211_DFS_ETSI:
-+		req.val = 0;
-+		break;
-+	case NL80211_DFS_JP:
-+		req.val = 2;
-+		break;
-+	case NL80211_DFS_FCC:
-+	default:
-+		req.val = 1;
-+		break;
-+	}
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(RDD_CTRL),
-+				 &req, sizeof(req), true);
-+}
-+
- int mt7996_mcu_wtbl_update_hdr_trans(struct mt7996_dev *dev,
- 				     struct ieee80211_vif *vif,
- 				     struct ieee80211_sta *sta)
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 054a616b..398bf3d2 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -119,6 +119,20 @@ struct mt7996_mcu_rdd_report {
- 	} hw_pulse[32];
- } __packed;
- 
-+struct mt7996_rdd_ctrl {
-+	u8 _rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+
-+	u8 ctrl;
-+	u8 rdd_idx;
-+	u8 rdd_rx_sel;
-+	u8 val;
-+	u8 disable_timer;
-+	u8 rsv[3];
-+} __packed;
-+
- struct mt7996_mcu_background_chain_ctrl {
- 	u8 _rsv[4];
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 2f76a0af..f937008f 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -517,8 +517,11 @@ enum mt7996_rdd_cmd {
- 	RDD_READ_PULSE,
- 	RDD_RESUME_BF,
- 	RDD_IRQ_OFF,
-+	RDD_DISABLE_ZW_TIMER,
- };
- 
-+#define RDD_ZW_TIMER_OFF	BIT(31)
-+
- static inline struct mt7996_phy *
- mt7996_hw_phy(struct ieee80211_hw *hw)
- {
-@@ -660,6 +663,8 @@ int mt7996_mcu_set_thermal_protect(struct mt7996_phy *phy, bool enable);
- int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy);
- int mt7996_mcu_rdd_cmd(struct mt7996_dev *dev, int cmd, u8 index,
- 		       u8 rx_sel, u8 val);
-+int mt7996_mcu_rdd_background_disable_timer(struct mt7996_dev *dev,
-+					    bool disable_timer);
- int mt7996_mcu_rdd_background_enable(struct mt7996_phy *phy,
- 				     struct cfg80211_chan_def *chandef);
- int mt7996_mcu_set_fixed_rate_table(struct mt7996_phy *phy, u8 table_idx,
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index 477c5c42..c7fd3278 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -102,6 +102,11 @@ rfeature_ctrl_policy[NUM_MTK_VENDOR_ATTRS_RFEATURE_CTRL] = {
- 	[MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TXBF] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+background_radar_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BACKGROUND_RADAR_CTRL] = {
-+	[MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MODE] = {.type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -851,6 +856,27 @@ static int mt7996_vendor_wireless_ctrl(struct wiphy *wiphy,
- 	return 0;
- }
- 
-+static int mt7996_vendor_background_radar_mode_ctrl(struct wiphy *wiphy,
-+						    struct wireless_dev *wdev,
-+						    const void *data,
-+						    int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_dev *dev = mt7996_hw_dev(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_BACKGROUND_RADAR_CTRL];
-+	int err;
-+	u8 background_radar_mode;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MAX, data, data_len,
-+			background_radar_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	background_radar_mode = nla_get_u8(tb[MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MODE]);
-+
-+	return mt7996_mcu_rdd_background_disable_timer(dev, !!background_radar_mode);
-+}
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -945,6 +971,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = rfeature_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_RFEATURE_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_BACKGROUND_RADAR_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_background_radar_mode_ctrl,
-+		.policy = background_radar_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 7011914b..920b6e6a 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -14,6 +14,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_3WIRE_CTRL = 0xc8,
- 	MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
-+	MTK_NL80211_VENDOR_SUBCMD_BACKGROUND_RADAR_CTRL = 0xcb,
- };
- 
- enum mtk_vendor_attr_edcca_ctrl {
-@@ -126,6 +127,17 @@ enum mtk_vendor_attr_wireless_dump {
- 		NUM_MTK_VENDOR_ATTRS_WIRELESS_DUMP - 1
- };
- 
-+enum mtk_vendor_attr_background_radar_ctrl {
-+	MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MODE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_BACKGROUND_RADAR_CTRL,
-+	MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_BACKGROUND_RADAR_CTRL - 1
-+};
-+
- enum bw_sig {
- 	BW_SIGNALING_DISABLE,
- 	BW_SIGNALING_STATIC,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1036-mtk-wifi-mt76-testmode-add-channel-68-96.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1036-mtk-wifi-mt76-testmode-add-channel-68-96.patch
deleted file mode 100644
index e3e2aa7..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1036-mtk-wifi-mt76-testmode-add-channel-68-96.patch
+++ /dev/null
@@ -1,248 +0,0 @@
-From b159ab04d85f593ca0785404469f2ea23eababef Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Mon, 11 Sep 2023 14:43:07 +0800
-Subject: [PATCH 1036/1044] mtk: wifi: mt76: testmode: add channel 68 & 96
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Add all the channel between 68 & 96 since ibf 5g channel group 3 will use channel 84.
-Also, "mtk: wifi: mt76: testmode: add channel 68 & 96" can be
-merged into to "mtk: wifi: mt76: testmode: add basic testmode support"
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Fix 5g channel list size
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mac80211.c        |  9 +++++++++
- mt7996/eeprom.c   | 49 +++++++++++++++++++++++++++++++++++++++++++++--
- mt7996/eeprom.h   |  2 ++
- mt7996/mcu.c      | 10 +++++++++-
- mt7996/testmode.c | 15 ++++++++++++---
- mt7996/testmode.h |  6 +++---
- 6 files changed, 82 insertions(+), 9 deletions(-)
-
-diff --git a/mac80211.c b/mac80211.c
-index ae040ec4..f7cd47f9 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -35,6 +35,15 @@ static const struct ieee80211_channel mt76_channels_5ghz[] = {
- 	CHAN5G(60, 5300),
- 	CHAN5G(64, 5320),
- 
-+	CHAN5G(68, 5340),
-+	CHAN5G(72, 5360),
-+	CHAN5G(76, 5380),
-+	CHAN5G(80, 5400),
-+	CHAN5G(84, 5420),
-+	CHAN5G(88, 5440),
-+	CHAN5G(92, 5460),
-+	CHAN5G(96, 5480),
-+
- 	CHAN5G(100, 5500),
- 	CHAN5G(104, 5520),
- 	CHAN5G(108, 5540),
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index d93b1558..1eb292c0 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -18,6 +18,17 @@ const struct ieee80211_channel dpd_2g_ch_list_bw20[] = {
- 	CHAN2G(11, 2462)
- };
- 
-+const struct ieee80211_channel dpd_5g_skip_ch_list[] = {
-+	CHAN5G(68, 5340),
-+	CHAN5G(72, 5360),
-+	CHAN5G(76, 5380),
-+	CHAN5G(80, 5400),
-+	CHAN5G(84, 5420),
-+	CHAN5G(88, 5440),
-+	CHAN5G(92, 5460),
-+	CHAN5G(96, 5480)
-+};
-+
- const struct ieee80211_channel dpd_5g_ch_list_bw160[] = {
- 	CHAN5G(50, 5250),
- 	CHAN5G(114, 5570),
-@@ -44,6 +55,7 @@ const struct ieee80211_channel dpd_6g_ch_list_bw320[] = {
- };
- 
- const u32 dpd_2g_bw20_ch_num = ARRAY_SIZE(dpd_2g_ch_list_bw20);
-+const u32 dpd_5g_skip_ch_num = ARRAY_SIZE(dpd_5g_skip_ch_list);
- const u32 dpd_5g_bw160_ch_num = ARRAY_SIZE(dpd_5g_ch_list_bw160);
- const u32 dpd_6g_bw160_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw160);
- const u32 dpd_6g_bw320_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw320);
-@@ -138,8 +150,8 @@ mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band)
- 	if (band == NL80211_BAND_2GHZ)
- 		dpd_size = dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
- 	else if (band == NL80211_BAND_5GHZ)
--		dpd_size = mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
--			   dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+		dpd_size = (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
-+			   DPD_PER_CH_BW20_SIZE + dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
- 	else
- 		dpd_size = mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
- 			   (dpd_6g_bw160_ch_num + dpd_6g_bw320_ch_num) * DPD_PER_CH_GT_BW20_SIZE;
-@@ -399,6 +411,39 @@ out:
- 	return ret;
- }
- 
-+static void mt7996_eeprom_init_precal(struct mt7996_dev *dev)
-+{
-+#define MT76_CHANNELS_5GHZ_SIZE		36	/* ARRAY_SIZE(mt76_channels_5ghz) */
-+#define MT76_CHANNELS_6GHZ_SIZE		59	/* ARRAY_SIZE(mt76_channels_6ghz) */
-+
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW20_2G] = ARRAY_SIZE(dpd_2g_ch_list_bw20);
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW20_5G_SKIP] = ARRAY_SIZE(dpd_5g_skip_ch_list);
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW20_5G] = MT76_CHANNELS_5GHZ_SIZE -
-+						   DPD_CH_NUM(BW20_5G_SKIP);
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW160_5G] = ARRAY_SIZE(dpd_5g_ch_list_bw160);
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW20_6G] = MT76_CHANNELS_6GHZ_SIZE;
-+	dev->prek.dpd_ch_num[DPD_CH_NUM_BW160_6G] = ARRAY_SIZE(dpd_6g_ch_list_bw160);
-+
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		dev->prek.rev = mt7996_prek_rev;
-+		/* 5g & 6g bw 80 dpd channel list is not used */
-+		dev->prek.dpd_ch_num[DPD_CH_NUM_BW320_6G] = ARRAY_SIZE(dpd_6g_ch_list_bw320);
-+		break;
-+	case 0x7992:
-+		dev->prek.rev  = mt7992_prek_rev;
-+		dev->prek.dpd_ch_num[DPD_CH_NUM_BW80_5G] = ARRAY_SIZE(dpd_5g_ch_list_bw80);
-+		/* 6g is not used in current sku */
-+		dev->prek.dpd_ch_num[DPD_CH_NUM_BW20_6G] = 0;
-+		dev->prek.dpd_ch_num[DPD_CH_NUM_BW80_6G] = 0;
-+		dev->prek.dpd_ch_num[DPD_CH_NUM_BW160_6G] = 0;
-+		break;
-+	default:
-+		dev->prek.rev  = mt7996_prek_rev;
-+		break;
-+	}
-+}
-+
- static int mt7996_eeprom_load_precal(struct mt7996_dev *dev)
- {
- 	struct mt76_dev *mdev = &dev->mt76;
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 8f0f87b6..3e9992a3 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -67,6 +67,8 @@ enum mt7996_eeprom_field {
- 
- extern const struct ieee80211_channel dpd_2g_ch_list_bw20[];
- extern const u32 dpd_2g_bw20_ch_num;
-+extern const struct ieee80211_channel dpd_5g_skip_ch_list[];
-+extern const u32 dpd_5g_skip_ch_num;
- extern const struct ieee80211_channel dpd_5g_ch_list_bw160[];
- extern const u32 dpd_5g_bw160_ch_num;
- extern const struct ieee80211_channel dpd_6g_ch_list_bw160[];
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index ded28e9a..cf46fee4 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3780,7 +3780,8 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 		chan_list_size = mphy->sband_5g.sband.n_channels;
- 		base_offset += dpd_size_2g;
- 		if (bw == NL80211_CHAN_WIDTH_160) {
--			base_offset += mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+			base_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
-+				       DPD_PER_CH_BW20_SIZE;
- 			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
- 			cal_id = RF_DPD_FLAT_5G_MEM_CAL;
- 			chan_list = dpd_5g_ch_list_bw160;
-@@ -3789,6 +3790,9 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 			/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
- 			channel -= 2;
- 		}
-+		if (channel >= dpd_5g_skip_ch_list[0].hw_value &&
-+		    channel <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
-+			return 0;
- 		break;
- 	case NL80211_BAND_6GHZ:
- 		dpd_mask = MT_EE_WIFI_CAL_DPD_6G;
-@@ -3828,6 +3832,10 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 	if (idx == chan_list_size)
- 		return -EINVAL;
- 
-+	if (band == NL80211_BAND_5GHZ && bw != NL80211_CHAN_WIDTH_160 &&
-+	    channel > dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
-+		idx -= dpd_5g_skip_ch_num;
-+
- 	cal += MT_EE_CAL_GROUP_SIZE + base_offset + idx * per_chan_size;
- 
- 	for (i = 0; i < per_chan_size / MT_EE_CAL_UNIT; i++) {
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-index 2fb36a97..0dc6629d 100644
---- a/mt7996/testmode.c
-+++ b/mt7996/testmode.c
-@@ -531,6 +531,11 @@ mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
- 	memcpy(&chandef_backup, chandef, sizeof(struct cfg80211_chan_def));
- 
- 	for (i = 0; i < channel_size; i++) {
-+		if (chan_list[i].band == NL80211_BAND_5GHZ &&
-+		    chan_list[i].hw_value >= dpd_5g_skip_ch_list[0].hw_value &&
-+		    chan_list[i].hw_value <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
-+			continue;
-+
- 		memcpy(chandef->chan, &chan_list[i], sizeof(struct ieee80211_channel));
- 		chandef->width = width;
- 
-@@ -612,7 +617,8 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_5G_CAL);
- 		if (ret)
- 			return ret;
--		wait_on_prek_offset += mphy->sband_5g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+		wait_on_prek_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
-+				       DPD_PER_CH_BW20_SIZE;
- 		wait_event_timeout(mdev->mcu.wait,
- 				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
- 
-@@ -868,6 +874,7 @@ mt7996_tm_get_center_chan(struct mt7996_phy *phy, struct cfg80211_chan_def *chan
- 	const struct ieee80211_channel *chan = mphy->sband_5g.sband.channels;
- 	u32 bitmap, i, offset, width_mhz, size = mphy->sband_5g.sband.n_channels;
- 	u16 first_control = 0, control_chan = chandef->chan->hw_value;
-+	bool not_first;
- 
- 	bitmap = mt7996_tm_bw_mapping(chandef->width, BW_MAP_NL_TO_CONTROL_BITMAP_5G);
- 	if (!bitmap)
-@@ -877,7 +884,9 @@ mt7996_tm_get_center_chan(struct mt7996_phy *phy, struct cfg80211_chan_def *chan
- 	offset = width_mhz / 10 - 2;
- 
- 	for (i = 0; i < size; i++) {
--		if (!((1 << i) & bitmap))
-+		not_first = (chandef->width != NL80211_CHAN_WIDTH_160) ?
-+			    (i % bitmap) : (i >= 32) || !((1 << i) & bitmap);
-+		if (not_first)
- 			continue;
- 
- 		if (control_chan >= chan[i].hw_value)
-@@ -886,7 +895,7 @@ mt7996_tm_get_center_chan(struct mt7996_phy *phy, struct cfg80211_chan_def *chan
- 			break;
- 	}
- 
--	if (i == size || first_control == 0)
-+	if (first_control == 0)
- 		return control_chan;
- 
- 	return first_control + offset;
-diff --git a/mt7996/testmode.h b/mt7996/testmode.h
-index f97ccb26..ba1767ae 100644
---- a/mt7996/testmode.h
-+++ b/mt7996/testmode.h
-@@ -38,9 +38,9 @@ enum {
- 	BF_CDBW_8080MHZ,
- };
- 
--#define FIRST_CONTROL_CHAN_BITMAP_BW40		0x5555555
--#define FIRST_CONTROL_CHAN_BITMAP_BW80		0x111111
--#define FIRST_CONTROL_CHAN_BITMAP_BW160		0x100101
-+#define FIRST_CONTROL_CHAN_BITMAP_BW40		2
-+#define FIRST_CONTROL_CHAN_BITMAP_BW80		4
-+#define FIRST_CONTROL_CHAN_BITMAP_BW160		0x10010101
- 
- enum bw_mapping_method {
- 	BW_MAP_NL_TO_FW,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1037-mtk-wifi-mt76-mt7996-support-enable-disable-pp-featu.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1037-mtk-wifi-mt76-mt7996-support-enable-disable-pp-featu.patch
deleted file mode 100644
index a914829..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1037-mtk-wifi-mt76-mt7996-support-enable-disable-pp-featu.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 8548624e0e3323cf0e14ce21ab988cd5ed5167cf Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Mon, 25 Sep 2023 19:20:49 +0800
-Subject: [PATCH 1037/1044] mtk: wifi: mt76: mt7996: support enable/disable pp
- feature by nl80211 vendor commands
-
-User can enable/disable preamble puncture feature through hostapd
-configuration and hostapd_cli. Driver can receive the nl80211 vendor
-message and convert it to mcu commands.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/vendor.c | 38 ++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 12 ++++++++++++
- 2 files changed, 50 insertions(+)
-
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index c7fd3278..9732ed28 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -107,6 +107,11 @@ background_radar_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BACKGROUND_RADAR_CTRL] = {
- 	[MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MODE] = {.type = NLA_U8 },
- };
- 
-+static struct nla_policy
-+pp_ctrl_policy[NUM_MTK_VENDOR_ATTRS_PP_CTRL] = {
-+	[MTK_VENDOR_ATTR_PP_MODE] = { .type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -877,6 +882,28 @@ static int mt7996_vendor_background_radar_mode_ctrl(struct wiphy *wiphy,
- 	return mt7996_mcu_rdd_background_disable_timer(dev, !!background_radar_mode);
- }
- 
-+static int mt7996_vendor_pp_ctrl(struct wiphy *wiphy, struct wireless_dev *wdev,
-+				 const void *data, int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_PP_CTRL];
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	int err;
-+	u8 val8;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_PP_CTRL_MAX, data, data_len,
-+			pp_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (tb[MTK_VENDOR_ATTR_PP_MODE]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_PP_MODE]);
-+		err = mt7996_mcu_set_pp_en(phy, !!val8, 0, 0);
-+	}
-+
-+	return err;
-+}
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -982,6 +1009,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = background_radar_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_BACKGROUND_RADAR_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_PP_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_pp_ctrl,
-+		.policy = pp_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_PP_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 920b6e6a..98128965 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -15,6 +15,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc9,
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- 	MTK_NL80211_VENDOR_SUBCMD_BACKGROUND_RADAR_CTRL = 0xcb,
-+	MTK_NL80211_VENDOR_SUBCMD_PP_CTRL = 0xcc,
- };
- 
- enum mtk_vendor_attr_edcca_ctrl {
-@@ -214,6 +215,17 @@ enum mtk_vendor_attr_ibf_dump {
- 		NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
- };
- 
-+enum mtk_vendor_attr_pp_ctrl {
-+	MTK_VENDOR_ATTR_PP_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_PP_MODE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_PP_CTRL,
-+	MTK_VENDOR_ATTR_PP_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_PP_CTRL - 1
-+};
-+
- #endif
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1038-mtk-wifi-mt76-testmode-add-kite-testmode-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1038-mtk-wifi-mt76-testmode-add-kite-testmode-support.patch
deleted file mode 100644
index b005bee..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1038-mtk-wifi-mt76-testmode-add-kite-testmode-support.patch
+++ /dev/null
@@ -1,598 +0,0 @@
-From 911e50206b1155bb240eaa7670fa6715ac6cb500 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Thu, 12 Oct 2023 16:17:33 +0800
-Subject: [PATCH 1038/1044] mtk: wifi: mt76: testmode: add kite testmode
- support
-
-Add Kite testmode support
-1. avoid entering connac 2 testmode flow in kite
-2. refactor prek implementation for handling chip difference
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/eeprom.c   | 63 +++++++++++++-----------------
- mt7996/eeprom.h   | 81 +++++++++++++++++++++++++++------------
- mt7996/mcu.c      | 48 ++++++++++++++---------
- mt7996/mt7996.h   | 18 ++++++++-
- mt7996/testmode.c | 97 ++++++++++++++++++++++++++++-------------------
- testmode.c        | 11 ++++--
- 6 files changed, 198 insertions(+), 120 deletions(-)
-
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 1eb292c0..39e65010 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -29,12 +29,39 @@ const struct ieee80211_channel dpd_5g_skip_ch_list[] = {
- 	CHAN5G(96, 5480)
- };
- 
-+const struct ieee80211_channel dpd_5g_ch_list_bw80[] = {
-+	CHAN5G(42, 5210),
-+	CHAN5G(58, 5290),
-+	CHAN5G(106, 5530),
-+	CHAN5G(122, 5610),
-+	CHAN5G(138, 5690),
-+	CHAN5G(155, 5775),
-+	CHAN5G(171, 5855)
-+};
-+
- const struct ieee80211_channel dpd_5g_ch_list_bw160[] = {
- 	CHAN5G(50, 5250),
- 	CHAN5G(114, 5570),
- 	CHAN5G(163, 5815)
- };
- 
-+const struct ieee80211_channel dpd_6g_ch_list_bw80[] = {
-+	CHAN6G(7, 5985),
-+	CHAN6G(23, 6065),
-+	CHAN6G(39, 6145),
-+	CHAN6G(55, 6225),
-+	CHAN6G(71, 6305),
-+	CHAN6G(87, 6385),
-+	CHAN6G(103, 6465),
-+	CHAN6G(119, 6545),
-+	CHAN6G(135, 6625),
-+	CHAN6G(151, 6705),
-+	CHAN6G(167, 6785),
-+	CHAN6G(183, 6865),
-+	CHAN6G(199, 6945),
-+	CHAN6G(215, 7025)
-+};
-+
- const struct ieee80211_channel dpd_6g_ch_list_bw160[] = {
- 	CHAN6G(15, 6025),
- 	CHAN6G(47, 6185),
-@@ -54,12 +81,6 @@ const struct ieee80211_channel dpd_6g_ch_list_bw320[] = {
- 	CHAN6G(191, 6905)
- };
- 
--const u32 dpd_2g_bw20_ch_num = ARRAY_SIZE(dpd_2g_ch_list_bw20);
--const u32 dpd_5g_skip_ch_num = ARRAY_SIZE(dpd_5g_skip_ch_list);
--const u32 dpd_5g_bw160_ch_num = ARRAY_SIZE(dpd_5g_ch_list_bw160);
--const u32 dpd_6g_bw160_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw160);
--const u32 dpd_6g_bw320_ch_num = ARRAY_SIZE(dpd_6g_ch_list_bw320);
--
- static int mt7996_check_eeprom(struct mt7996_dev *dev)
- {
- #define FEM_INT				0
-@@ -129,36 +150,6 @@ const char *mt7996_eeprom_name(struct mt7996_dev *dev)
- 	}
- }
- 
--int
--mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band)
--{
--	/* handle different sku */
--	static const u8 band_to_idx[] = {
--		[NL80211_BAND_2GHZ] = MT_BAND0,
--		[NL80211_BAND_5GHZ] = MT_BAND1,
--		[NL80211_BAND_6GHZ] = MT_BAND2,
--	};
--	struct mt7996_phy *phy = __mt7996_phy(dev, band_to_idx[band]);
--	struct mt76_phy *mphy;
--	int dpd_size;
--
--	if (!phy)
--		return 0;
--
--	mphy = phy->mt76;
--
--	if (band == NL80211_BAND_2GHZ)
--		dpd_size = dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
--	else if (band == NL80211_BAND_5GHZ)
--		dpd_size = (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
--			   DPD_PER_CH_BW20_SIZE + dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
--	else
--		dpd_size = mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
--			   (dpd_6g_bw160_ch_num + dpd_6g_bw320_ch_num) * DPD_PER_CH_GT_BW20_SIZE;
--
--	return dpd_size;
--}
--
- static int
- mt7996_eeprom_load_default(struct mt7996_dev *dev)
- {
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 3e9992a3..0d05e75e 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -45,36 +45,69 @@ enum mt7996_eeprom_field {
- #define MT_EE_WIFI_CAL_DPD			GENMASK(5, 3)
- 
- #define MT_EE_CAL_UNIT				1024
--#define MT_EE_CAL_GROUP_SIZE_2G			(4 * MT_EE_CAL_UNIT)
--#define MT_EE_CAL_GROUP_SIZE_5G			(45 * MT_EE_CAL_UNIT)
--#define MT_EE_CAL_GROUP_SIZE_6G			(125 * MT_EE_CAL_UNIT)
--#define MT_EE_CAL_ADCDCOC_SIZE_2G		(4 * 4)
--#define MT_EE_CAL_ADCDCOC_SIZE_5G		(4 * 4)
--#define MT_EE_CAL_ADCDCOC_SIZE_6G		(4 * 5)
--#define MT_EE_CAL_GROUP_SIZE			(MT_EE_CAL_GROUP_SIZE_2G + \
--						 MT_EE_CAL_GROUP_SIZE_5G + \
--						 MT_EE_CAL_GROUP_SIZE_6G + \
--						 MT_EE_CAL_ADCDCOC_SIZE_2G + \
--						 MT_EE_CAL_ADCDCOC_SIZE_5G + \
--						 MT_EE_CAL_ADCDCOC_SIZE_6G)
--
--#define DPD_PER_CH_LEGACY_SIZE			(4 * MT_EE_CAL_UNIT)
--#define DPD_PER_CH_MEM_SIZE			(13 * MT_EE_CAL_UNIT)
--#define DPD_PER_CH_OTFG0_SIZE			(2 * MT_EE_CAL_UNIT)
--#define DPD_PER_CH_BW20_SIZE			(DPD_PER_CH_LEGACY_SIZE + DPD_PER_CH_OTFG0_SIZE)
--#define DPD_PER_CH_GT_BW20_SIZE			(DPD_PER_CH_MEM_SIZE + DPD_PER_CH_OTFG0_SIZE)
--#define MT_EE_CAL_DPD_SIZE			(780 * MT_EE_CAL_UNIT)
-+
-+enum mt7996_prek_rev {
-+	GROUP_SIZE_2G,
-+	GROUP_SIZE_5G,
-+	GROUP_SIZE_6G,
-+	ADCDCOC_SIZE_2G,
-+	ADCDCOC_SIZE_5G,
-+	ADCDCOC_SIZE_6G,
-+	DPD_LEGACY_SIZE,
-+	DPD_MEM_SIZE,
-+	DPD_OTFG0_SIZE,
-+};
-+
-+static const u32 mt7996_prek_rev[] = {
-+	[GROUP_SIZE_2G] =			4 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_5G] =			45 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_6G] =			125 * MT_EE_CAL_UNIT,
-+	[ADCDCOC_SIZE_2G] =			4 * 4,
-+	[ADCDCOC_SIZE_5G] =			4 * 4,
-+	[ADCDCOC_SIZE_6G] =			4 * 5,
-+	[DPD_LEGACY_SIZE] =			4 * MT_EE_CAL_UNIT,
-+	[DPD_MEM_SIZE] =			13 * MT_EE_CAL_UNIT,
-+	[DPD_OTFG0_SIZE] =			2 * MT_EE_CAL_UNIT,
-+};
-+
-+/* kite 2/5g config */
-+static const u32 mt7992_prek_rev[] = {
-+	[GROUP_SIZE_2G] =			4 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_5G] =			110 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_6G] =			0,
-+	[ADCDCOC_SIZE_2G] =			4 * 4,
-+	[ADCDCOC_SIZE_5G] =			4 * 5,
-+	[ADCDCOC_SIZE_6G] =			0,
-+	[DPD_LEGACY_SIZE] =			5 * MT_EE_CAL_UNIT,
-+	[DPD_MEM_SIZE] =			16 * MT_EE_CAL_UNIT,
-+	[DPD_OTFG0_SIZE] =			2 * MT_EE_CAL_UNIT,
-+};
- 
- extern const struct ieee80211_channel dpd_2g_ch_list_bw20[];
--extern const u32 dpd_2g_bw20_ch_num;
- extern const struct ieee80211_channel dpd_5g_skip_ch_list[];
--extern const u32 dpd_5g_skip_ch_num;
-+extern const struct ieee80211_channel dpd_5g_ch_list_bw80[];
- extern const struct ieee80211_channel dpd_5g_ch_list_bw160[];
--extern const u32 dpd_5g_bw160_ch_num;
-+extern const struct ieee80211_channel dpd_6g_ch_list_bw80[];
- extern const struct ieee80211_channel dpd_6g_ch_list_bw160[];
--extern const u32 dpd_6g_bw160_ch_num;
- extern const struct ieee80211_channel dpd_6g_ch_list_bw320[];
--extern const u32 dpd_6g_bw320_ch_num;
-+
-+#define PREK(id)				(dev->prek.rev[(id)])
-+#define DPD_CH_NUM(_type)			(dev->prek.dpd_ch_num[DPD_CH_NUM_##_type])
-+#define MT_EE_CAL_GROUP_SIZE			(PREK(GROUP_SIZE_2G) + PREK(GROUP_SIZE_5G) + \
-+						 PREK(GROUP_SIZE_6G) + PREK(ADCDCOC_SIZE_2G) + \
-+						 PREK(ADCDCOC_SIZE_5G) + PREK(ADCDCOC_SIZE_6G))
-+#define DPD_PER_CH_BW20_SIZE			(PREK(DPD_LEGACY_SIZE) + PREK(DPD_OTFG0_SIZE))
-+#define DPD_PER_CH_GT_BW20_SIZE			(PREK(DPD_MEM_SIZE) + PREK(DPD_OTFG0_SIZE))
-+#define MT_EE_CAL_DPD_SIZE_2G			(DPD_CH_NUM(BW20_2G) * DPD_PER_CH_BW20_SIZE)
-+#define MT_EE_CAL_DPD_SIZE_5G			(DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE + \
-+						 DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE + \
-+						 DPD_CH_NUM(BW160_5G) * DPD_PER_CH_GT_BW20_SIZE)
-+#define MT_EE_CAL_DPD_SIZE_6G			(DPD_CH_NUM(BW20_6G) * DPD_PER_CH_BW20_SIZE + \
-+						 DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE + \
-+						 DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE + \
-+						 DPD_CH_NUM(BW320_6G) * DPD_PER_CH_GT_BW20_SIZE)
-+#define MT_EE_CAL_DPD_SIZE			(MT_EE_CAL_DPD_SIZE_2G + MT_EE_CAL_DPD_SIZE_5G + \
-+						 MT_EE_CAL_DPD_SIZE_6G)
- 
- #define RF_DPD_FLAT_CAL				BIT(28)
- #define RF_PRE_CAL				BIT(29)
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index cf46fee4..a39b8bab 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3749,13 +3749,11 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 	enum nl80211_chan_width bw = chandef->width;
- 	const struct ieee80211_channel *chan_list;
- 	u32 cal_id, chan_list_size, base_offset = 0, offs = MT_EE_DO_PRE_CAL;
--	u32 dpd_size_2g, dpd_size_5g, per_chan_size = DPD_PER_CH_BW20_SIZE;
-+	u32 per_chan_size = DPD_PER_CH_BW20_SIZE;
- 	u16 channel = ieee80211_frequency_to_channel(chandef->center_freq1);
- 	u8 dpd_mask, *cal = dev->cal, *eeprom = dev->mt76.eeprom.data;
- 	int idx, i, ret;
--
--	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
--	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
-+	bool has_skip_ch = (band == NL80211_BAND_5GHZ);
- 
- 	switch (band) {
- 	case NL80211_BAND_2GHZ:
-@@ -3771,27 +3769,35 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 			return 0;
- 		cal_id = RF_DPD_FLAT_CAL;
- 		chan_list = dpd_2g_ch_list_bw20;
--		chan_list_size = dpd_2g_bw20_ch_num;
-+		chan_list_size = DPD_CH_NUM(BW20_2G);
- 		break;
- 	case NL80211_BAND_5GHZ:
- 		dpd_mask = MT_EE_WIFI_CAL_DPD_5G;
- 		cal_id = RF_DPD_FLAT_5G_CAL;
- 		chan_list = mphy->sband_5g.sband.channels;
- 		chan_list_size = mphy->sband_5g.sband.n_channels;
--		base_offset += dpd_size_2g;
-+		base_offset += MT_EE_CAL_DPD_SIZE_2G;
- 		if (bw == NL80211_CHAN_WIDTH_160) {
--			base_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
--				       DPD_PER_CH_BW20_SIZE;
-+			base_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE +
-+				       DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE;
- 			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
- 			cal_id = RF_DPD_FLAT_5G_MEM_CAL;
- 			chan_list = dpd_5g_ch_list_bw160;
--			chan_list_size = dpd_5g_bw160_ch_num;
-+			chan_list_size = DPD_CH_NUM(BW160_5G);
-+			has_skip_ch = false;
-+		} else if (is_mt7992(&dev->mt76) && bw == NL80211_CHAN_WIDTH_80) {
-+			base_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE;
-+			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
-+			cal_id = RF_DPD_FLAT_5G_MEM_CAL;
-+			chan_list = dpd_5g_ch_list_bw80;
-+			chan_list_size = DPD_CH_NUM(BW80_5G);
-+			has_skip_ch = false;
- 		} else if (bw > NL80211_CHAN_WIDTH_20) {
- 			/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
- 			channel -= 2;
- 		}
- 		if (channel >= dpd_5g_skip_ch_list[0].hw_value &&
--		    channel <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
-+		    channel <= dpd_5g_skip_ch_list[DPD_CH_NUM(BW20_5G_SKIP) - 1].hw_value)
- 			return 0;
- 		break;
- 	case NL80211_BAND_6GHZ:
-@@ -3799,20 +3805,27 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 		cal_id = RF_DPD_FLAT_6G_CAL;
- 		chan_list = mphy->sband_6g.sband.channels;
- 		chan_list_size = mphy->sband_6g.sband.n_channels;
--		base_offset += dpd_size_2g + dpd_size_5g;
-+		base_offset += MT_EE_CAL_DPD_SIZE_2G + MT_EE_CAL_DPD_SIZE_5G;
- 		if (bw == NL80211_CHAN_WIDTH_160) {
- 			base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
- 			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
- 			cal_id = RF_DPD_FLAT_6G_MEM_CAL;
- 			chan_list = dpd_6g_ch_list_bw160;
--			chan_list_size = dpd_6g_bw160_ch_num;
--		} else if (bw == NL80211_CHAN_WIDTH_320) {
-+			chan_list_size = DPD_CH_NUM(BW160_6G);
-+		} else if (is_mt7996(&dev->mt76) && bw == NL80211_CHAN_WIDTH_320) {
- 			base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE +
--				       dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
-+				       DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE +
-+				       DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE;
- 			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
- 			cal_id = RF_DPD_FLAT_6G_MEM_CAL;
- 			chan_list = dpd_6g_ch_list_bw320;
--			chan_list_size = dpd_6g_bw320_ch_num;
-+			chan_list_size = DPD_CH_NUM(BW320_6G);
-+		} else if (is_mt7992(&dev->mt76) && bw == NL80211_CHAN_WIDTH_80) {
-+			base_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
-+			per_chan_size = DPD_PER_CH_GT_BW20_SIZE;
-+			cal_id = RF_DPD_FLAT_6G_MEM_CAL;
-+			chan_list = dpd_6g_ch_list_bw80;
-+			chan_list_size = DPD_CH_NUM(BW80_6G);
- 		} else if (bw > NL80211_CHAN_WIDTH_20) {
- 			/* apply (center channel - 2)'s dpd cal data for bw 40/80 channels */
- 			channel -= 2;
-@@ -3832,9 +3845,8 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy)
- 	if (idx == chan_list_size)
- 		return -EINVAL;
- 
--	if (band == NL80211_BAND_5GHZ && bw != NL80211_CHAN_WIDTH_160 &&
--	    channel > dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
--		idx -= dpd_5g_skip_ch_num;
-+	if (has_skip_ch && channel > dpd_5g_skip_ch_list[DPD_CH_NUM(BW20_5G_SKIP) - 1].hw_value)
-+		idx -= DPD_CH_NUM(BW20_5G_SKIP);
- 
- 	cal += MT_EE_CAL_GROUP_SIZE + base_offset + idx * per_chan_size;
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index f937008f..881328be 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -195,6 +195,19 @@ struct mt7996_twt_flow {
- 
- DECLARE_EWMA(avg_signal, 10, 8)
- 
-+enum mt7996_dpd_ch_num {
-+	DPD_CH_NUM_BW20_2G,
-+	DPD_CH_NUM_BW20_5G,
-+	DPD_CH_NUM_BW20_5G_SKIP,
-+	DPD_CH_NUM_BW80_5G,
-+	DPD_CH_NUM_BW160_5G,
-+	DPD_CH_NUM_BW20_6G,
-+	DPD_CH_NUM_BW80_6G,
-+	DPD_CH_NUM_BW160_6G,
-+	DPD_CH_NUM_BW320_6G,
-+	DPD_CH_NUM_TYPE_MAX,
-+};
-+
- struct mt7996_sta {
- 	struct mt76_wcid wcid; /* must be first */
- 
-@@ -457,6 +470,10 @@ struct mt7996_dev {
- 
- 	void *cal;
- 	u32 cur_prek_offset;
-+	struct {
-+		const u32 *rev;
-+		u8 dpd_ch_num[DPD_CH_NUM_TYPE_MAX];
-+	} prek;
- 
- 	struct {
- 		u16 table_mask;
-@@ -593,7 +610,6 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy);
- int mt7996_eeprom_get_target_power(struct mt7996_dev *dev,
- 				   struct ieee80211_channel *chan);
- s8 mt7996_eeprom_get_power_delta(struct mt7996_dev *dev, int band);
--int mt7996_get_dpd_per_band_size(struct mt7996_dev *dev, enum nl80211_band band);
- int mt7996_dma_init(struct mt7996_dev *dev);
- void mt7996_dma_reset(struct mt7996_dev *dev, bool force);
- void mt7996_dma_prefetch(struct mt7996_dev *dev);
-diff --git a/mt7996/testmode.c b/mt7996/testmode.c
-index 0dc6629d..44ec84cc 100644
---- a/mt7996/testmode.c
-+++ b/mt7996/testmode.c
-@@ -434,7 +434,7 @@ mt7996_tm_set_tx_cont(struct mt7996_phy *phy, bool en)
- static int
- mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- {
--	u8 *eeprom;
-+	u8 *eeprom, do_precal;
- 	u32 i, group_size, dpd_size, size, offs, *pre_cal;
- 	int ret = 0;
- 	struct mt7996_dev *dev = phy->dev;
-@@ -462,6 +462,9 @@ mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 	dpd_size = MT_EE_CAL_DPD_SIZE;
- 	size = group_size + dpd_size;
- 	offs = MT_EE_DO_PRE_CAL;
-+	do_precal = (MT_EE_WIFI_CAL_GROUP_2G * !!PREK(GROUP_SIZE_2G)) |
-+		    (MT_EE_WIFI_CAL_GROUP_5G * !!PREK(GROUP_SIZE_5G)) |
-+		    (MT_EE_WIFI_CAL_GROUP_6G * !!PREK(GROUP_SIZE_6G));
- 
- 	switch (state) {
- 	case MT76_TM_STATE_GROUP_PREK:
-@@ -476,13 +479,10 @@ mt7996_tm_group_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == group_size,
- 				   30 * HZ);
- 
--		if (ret) {
-+		if (ret)
- 			dev_err(dev->mt76.dev, "Group Pre-cal: mcu send msg failed!\n");
--			return ret;
--		}
--
--		if (!ret)
--			eeprom[offs] |= MT_EE_WIFI_CAL_GROUP;
-+		else
-+			eeprom[offs] |= do_precal;
- 		break;
- 	case MT76_TM_STATE_GROUP_PREK_DUMP:
- 		pre_cal = (u32 *)dev->cal;
-@@ -520,10 +520,12 @@ mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
- 	struct mt76_phy *mphy = phy->mt76;
- 	struct cfg80211_chan_def chandef_backup, *chandef = &mphy->chandef;
- 	struct ieee80211_channel chan_backup;
--	int i, ret;
-+	int i, ret, skip_ch_num = DPD_CH_NUM(BW20_5G_SKIP);
- 
- 	if (!chan_list)
- 		return -EOPNOTSUPP;
-+	if (!channel_size)
-+		return 0;
- 
- 	req->rf_test.op.rf.param.cal_param.func_data = cpu_to_le32(func_data);
- 
-@@ -533,7 +535,7 @@ mt7996_tm_dpd_prek_send_req(struct mt7996_phy *phy, struct mt7996_tm_req *req,
- 	for (i = 0; i < channel_size; i++) {
- 		if (chan_list[i].band == NL80211_BAND_5GHZ &&
- 		    chan_list[i].hw_value >= dpd_5g_skip_ch_list[0].hw_value &&
--		    chan_list[i].hw_value <= dpd_5g_skip_ch_list[dpd_5g_skip_ch_num - 1].hw_value)
-+		    chan_list[i].hw_value <= dpd_5g_skip_ch_list[skip_ch_num - 1].hw_value)
- 			continue;
- 
- 		memcpy(chandef->chan, &chan_list[i], sizeof(struct ieee80211_channel));
-@@ -602,11 +604,11 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 	switch (state) {
- 	case MT76_TM_STATE_DPD_2G:
- 		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_2g_ch_list_bw20,
--						  dpd_2g_bw20_ch_num,
-+						  DPD_CH_NUM(BW20_2G),
- 						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_CAL);
--		wait_on_prek_offset += dpd_2g_bw20_ch_num * DPD_PER_CH_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW20_2G) * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		do_precal = MT_EE_WIFI_CAL_DPD_2G;
- 		break;
-@@ -617,18 +619,27 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_5G_CAL);
- 		if (ret)
- 			return ret;
--		wait_on_prek_offset += (mphy->sband_5g.sband.n_channels - dpd_5g_skip_ch_num) *
--				       DPD_PER_CH_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW20_5G) * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
-+
-+		/* 5g channel bw80 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_5g_ch_list_bw80,
-+						  DPD_CH_NUM(BW80_5G),
-+						  NL80211_CHAN_WIDTH_80, RF_DPD_FLAT_5G_MEM_CAL);
-+		if (ret)
-+			return ret;
-+		wait_on_prek_offset += DPD_CH_NUM(BW80_5G) * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		/* 5g channel bw160 calibration */
- 		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_5g_ch_list_bw160,
--						  dpd_5g_bw160_ch_num,
-+						  DPD_CH_NUM(BW160_5G),
- 						  NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_5G_MEM_CAL);
--		wait_on_prek_offset += dpd_5g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW160_5G) * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		do_precal = MT_EE_WIFI_CAL_DPD_5G;
- 		break;
-@@ -639,27 +650,37 @@ mt7996_tm_dpd_prek(struct mt7996_phy *phy, enum mt76_testmode_state state)
- 						  NL80211_CHAN_WIDTH_20, RF_DPD_FLAT_6G_CAL);
- 		if (ret)
- 			return ret;
--		wait_on_prek_offset += mphy->sband_6g.sband.n_channels * DPD_PER_CH_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW20_6G) * DPD_PER_CH_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
-+
-+		/* 6g channel bw80 calibration */
-+		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw80,
-+						  DPD_CH_NUM(BW80_6G),
-+						  NL80211_CHAN_WIDTH_80, RF_DPD_FLAT_6G_MEM_CAL);
-+		if (ret)
-+			return ret;
-+		wait_on_prek_offset += DPD_CH_NUM(BW80_6G) * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		/* 6g channel bw160 calibration */
- 		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw160,
--						  dpd_6g_bw160_ch_num,
-+						  DPD_CH_NUM(BW160_6G),
- 						  NL80211_CHAN_WIDTH_160, RF_DPD_FLAT_6G_MEM_CAL);
- 		if (ret)
- 			return ret;
--		wait_on_prek_offset += dpd_6g_bw160_ch_num * DPD_PER_CH_GT_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW160_6G) * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		/* 6g channel bw320 calibration */
- 		ret = mt7996_tm_dpd_prek_send_req(phy, &req, dpd_6g_ch_list_bw320,
--						  dpd_6g_bw320_ch_num,
-+						  DPD_CH_NUM(BW320_6G),
- 						  NL80211_CHAN_WIDTH_320, RF_DPD_FLAT_6G_MEM_CAL);
--		wait_on_prek_offset += dpd_6g_bw320_ch_num * DPD_PER_CH_GT_BW20_SIZE;
--		wait_event_timeout(mdev->mcu.wait,
--				   dev->cur_prek_offset == wait_on_prek_offset, 30 * HZ);
-+		wait_on_prek_offset += DPD_CH_NUM(BW320_6G) * DPD_PER_CH_GT_BW20_SIZE;
-+		wait_event_timeout(mdev->mcu.wait, dev->cur_prek_offset == wait_on_prek_offset,
-+				   30 * HZ);
- 
- 		do_precal = MT_EE_WIFI_CAL_DPD_6G;
- 		break;
-@@ -732,9 +753,9 @@ mt7996_tm_dump_precal(struct mt76_phy *mphy, struct sk_buff *msg, int flag, int
- 	eeprom = dev->mt76.eeprom.data;
- 	offs = MT_EE_DO_PRE_CAL;
- 
--	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
--	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
--	dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
-+	dpd_size_2g = MT_EE_CAL_DPD_SIZE_2G;
-+	dpd_size_5g = MT_EE_CAL_DPD_SIZE_5G;
-+	dpd_size_6g = MT_EE_CAL_DPD_SIZE_6G;
- 
- 	switch (type) {
- 	case PREK_SYNC_ALL:
-@@ -810,9 +831,9 @@ mt7996_tm_re_cal_event(struct mt7996_dev *dev, struct mt7996_tm_rf_test_result *
- 	u8 *pre_cal;
- 
- 	pre_cal = dev->cal;
--	dpd_size_2g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_2GHZ);
--	dpd_size_5g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_5GHZ);
--	dpd_size_6g = mt7996_get_dpd_per_band_size(dev, NL80211_BAND_6GHZ);
-+	dpd_size_2g = MT_EE_CAL_DPD_SIZE_2G;
-+	dpd_size_5g = MT_EE_CAL_DPD_SIZE_5G;
-+	dpd_size_6g = MT_EE_CAL_DPD_SIZE_6G;
- 
- 	cal_idx = le32_to_cpu(data->cal_idx);
- 	cal_type = le32_to_cpu(data->cal_type);
-diff --git a/testmode.c b/testmode.c
-index a5c07f8d..09ab68ce 100644
---- a/testmode.c
-+++ b/testmode.c
-@@ -37,6 +37,11 @@ const struct nla_policy mt76_tm_policy[NUM_MT76_TM_ATTRS] = {
- };
- EXPORT_SYMBOL_GPL(mt76_tm_policy);
- 
-+static inline bool mt76_testmode_offload(struct mt76_dev *dev)
-+{
-+	return is_mt7996(dev) || is_mt7992(dev);
-+}
-+
- void mt76_testmode_tx_pending(struct mt76_phy *phy)
- {
- 	struct mt76_testmode_data *td = &phy->test;
-@@ -197,7 +202,7 @@ mt76_testmode_tx_init(struct mt76_phy *phy)
- 	u8 max_nss = hweight8(phy->antenna_mask);
- 	int ret;
- 
--	if (is_mt7996(phy->dev))
-+	if (mt76_testmode_offload(phy->dev))
- 		return 0;
- 
- 	ret = mt76_testmode_alloc_skb(phy, td->tx_mpdu_len);
-@@ -293,7 +298,7 @@ mt76_testmode_tx_start(struct mt76_phy *phy)
- 	td->tx_done = 0;
- 	td->tx_pending = td->tx_count;
- 
--	if (!is_mt7996(dev))
-+	if (!mt76_testmode_offload(dev))
- 		mt76_worker_schedule(&dev->tx_worker);
- }
- 
-@@ -303,7 +308,7 @@ mt76_testmode_tx_stop(struct mt76_phy *phy)
- 	struct mt76_testmode_data *td = &phy->test;
- 	struct mt76_dev *dev = phy->dev;
- 
--	if (is_mt7996(dev) && dev->test_ops->tx_stop) {
-+	if (mt76_testmode_offload(dev) && dev->test_ops->tx_stop) {
- 		dev->test_ops->tx_stop(phy);
- 		return;
- 	}
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1039-mtk-wifi-mt76-mt7996-assign-DEAUTH-to-ALTX-queue-for.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1039-mtk-wifi-mt76-mt7996-assign-DEAUTH-to-ALTX-queue-for.patch
deleted file mode 100644
index 744e679..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1039-mtk-wifi-mt76-mt7996-assign-DEAUTH-to-ALTX-queue-for.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 9c7e1159e0daa47df31d51c73b26a12b7c3c0a42 Mon Sep 17 00:00:00 2001
-From: Michael-CY Lee <michael-cy.lee@mediatek.com>
-Date: Tue, 14 Nov 2023 11:27:06 +0800
-Subject: [PATCH 1039/1044] mtk: wifi: mt76: mt7996: assign DEAUTH to ALTX
- queue for CERT
-
-Signed-off-by: Michael-CY Lee <michael-cy.lee@mediatek.com>
----
- mt7996/mac.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index bf42ae07..6fa46e46 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -753,6 +753,8 @@ static void
- mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
- 			    struct sk_buff *skb, struct ieee80211_key_conf *key)
- {
-+	struct mt76_phy *mphy =
-+		mt76_dev_phy(&dev->mt76, le32_get_bits(txwi[1], MT_TXD1_TGID));
- 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
- 	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
- 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-@@ -762,6 +764,14 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
- 	u8 fc_type, fc_stype;
- 	u32 val;
- 
-+	if (ieee80211_is_cert_mode(mphy->hw) && ieee80211_is_deauth(fc)) {
-+		/* In WPA3 cert TC-4.8.1, the deauth must be transmitted without
-+		 * considering PSM bit
-+		 */
-+		txwi[0] &= ~cpu_to_le32(MT_TXD0_Q_IDX);
-+		txwi[0] |= cpu_to_le32(FIELD_PREP(MT_TXD0_Q_IDX, MT_LMAC_ALTX0));
-+	}
-+
- 	if (ieee80211_is_action(fc) &&
- 	    mgmt->u.action.category == WLAN_CATEGORY_BACK &&
- 	    mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1040-mtk-wifi-mt76-mt7996-add-no_beacon-vendor-command-fo.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1040-mtk-wifi-mt76-mt7996-add-no_beacon-vendor-command-fo.patch
deleted file mode 100644
index b1cd4c6..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1040-mtk-wifi-mt76-mt7996-add-no_beacon-vendor-command-fo.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From ba07e0c01317f0d39fb56aceef557c04c0f770c2 Mon Sep 17 00:00:00 2001
-From: MeiChia Chiu <meichia.chiu@mediatek.com>
-Date: Wed, 22 Nov 2023 22:42:09 +0800
-Subject: [PATCH 1040/1044] mtk: wifi: mt76: mt7996: add no_beacon vendor
- command for cert
-
-Add the vendor command to disable/enable beacon
-
-[Usage]
-hostapd_cli -i <interface> no_beacon <value>
-<value>
-0: enable beacon
-1: disable beacon
-
-Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com>
----
- mt7996/mcu.c    | 11 +++++++++++
- mt7996/mt7996.h |  1 +
- mt7996/vendor.c | 41 +++++++++++++++++++++++++++++++++++++++++
- mt7996/vendor.h | 12 ++++++++++++
- 4 files changed, 65 insertions(+)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index a39b8bab..c97a3204 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -5058,4 +5058,15 @@ void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
- 		break;
- 	}
- }
-+
-+void mt7996_set_beacon_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
-+{
-+	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
-+	struct ieee80211_hw *hw = mvif->phy->mt76->hw;
-+	u8 val = *((u8 *)data);
-+
-+	vif->bss_conf.enable_beacon = val;
-+
-+	mt7996_mcu_add_beacon(hw, vif, val);
-+}
- #endif
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 881328be..bb2cee92 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -829,6 +829,7 @@ void mt7996_set_wireless_amsdu(struct ieee80211_hw *hw, u8 en);
- void mt7996_mcu_set_mimo(struct mt7996_phy *phy);
- int mt7996_set_muru_cfg(struct mt7996_phy *phy, u8 action, u8 val);
- int mt7996_mcu_set_muru_cfg(struct mt7996_phy *phy, void *data);
-+void mt7996_set_beacon_vif(void *data, u8 *mac, struct ieee80211_vif *vif);
- #endif
- 
- int mt7996_mcu_edcca_enable(struct mt7996_phy *phy, bool enable);
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index 9732ed28..c87cc5c1 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -112,6 +112,11 @@ pp_ctrl_policy[NUM_MTK_VENDOR_ATTRS_PP_CTRL] = {
- 	[MTK_VENDOR_ATTR_PP_MODE] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+beacon_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BEACON_CTRL] = {
-+	[MTK_VENDOR_ATTR_BEACON_CTRL_MODE] = { .type = NLA_U8 },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -904,6 +909,31 @@ static int mt7996_vendor_pp_ctrl(struct wiphy *wiphy, struct wireless_dev *wdev,
- 	return err;
- }
- 
-+static int mt7996_vendor_beacon_ctrl(struct wiphy *wiphy,
-+				     struct wireless_dev *wdev,
-+				     const void *data,
-+				     int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_BEACON_CTRL];
-+	int err;
-+	u8 val8;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_BEACON_CTRL_MAX, data, data_len,
-+			beacon_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (tb[MTK_VENDOR_ATTR_BEACON_CTRL_MODE]) {
-+		val8 = nla_get_u8(tb[MTK_VENDOR_ATTR_BEACON_CTRL_MODE]);
-+		ieee80211_iterate_active_interfaces_atomic(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
-+				mt7996_set_beacon_vif, &val8);
-+	}
-+
-+	return 0;
-+}
-+
-+
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
- 		.info = {
-@@ -1020,6 +1050,17 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = pp_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_PP_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_beacon_ctrl,
-+		.policy = beacon_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_BEACON_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index 98128965..e7d88828 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -16,6 +16,7 @@ enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_BSS_COLOR_CTRL = 0xca,
- 	MTK_NL80211_VENDOR_SUBCMD_BACKGROUND_RADAR_CTRL = 0xcb,
- 	MTK_NL80211_VENDOR_SUBCMD_PP_CTRL = 0xcc,
-+	MTK_NL80211_VENDOR_SUBCMD_BEACON_CTRL = 0xcd,
- };
- 
- enum mtk_vendor_attr_edcca_ctrl {
-@@ -226,6 +227,17 @@ enum mtk_vendor_attr_pp_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_PP_CTRL - 1
- };
- 
-+enum mtk_vendor_attr_beacon_ctrl {
-+	MTK_VENDOR_ATTR_BEACON_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_BEACON_CTRL_MODE,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_BEACON_CTRL,
-+	MTK_VENDOR_ATTR_BEACON_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_BEACON_CTRL - 1
-+};
-+
- #endif
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1041-mtk-wifi-mt76-mt7996-add-adie-efuse-merge-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1041-mtk-wifi-mt76-mt7996-add-adie-efuse-merge-support.patch
deleted file mode 100644
index e104a02..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1041-mtk-wifi-mt76-mt7996-add-adie-efuse-merge-support.patch
+++ /dev/null
@@ -1,270 +0,0 @@
-From 5e847c789f6a3b7e234067e33171207fb32f46ea Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 24 Nov 2023 09:49:08 +0800
-Subject: [PATCH 1041/1044] mtk: wifi: mt76: mt7996: add adie efuse merge
- support
-
-Merge adie-dependent parameters in efuse into eeprom after FT.
-Note that Eagle BE14000 is not considered yet.
-Add efuse dump command.
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/debugfs.c |  41 ++++++++++++++
- mt7996/eeprom.c  | 145 +++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mcu.c     |   6 +-
- 3 files changed, 190 insertions(+), 2 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 7a03de12..50ac6d4d 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -862,6 +862,46 @@ mt7996_rf_regval_set(void *data, u64 val)
- DEFINE_DEBUGFS_ATTRIBUTE(fops_rf_regval, mt7996_rf_regval_get,
- 			 mt7996_rf_regval_set, "0x%08llx\n");
- 
-+static ssize_t
-+mt7996_efuse_get(struct file *file, char __user *user_buf,
-+		 size_t count, loff_t *ppos)
-+{
-+	struct mt7996_dev *dev = file->private_data;
-+	struct mt76_dev *mdev = &dev->mt76;
-+	u8 *buff = mdev->otp.data;
-+	int i;
-+	ssize_t ret;
-+	u32 block_num;
-+
-+	mdev->otp.size = MT7996_EEPROM_SIZE;
-+	if (is_mt7996(&dev->mt76) && dev->chip_sku == MT7996_SKU_444)
-+		mdev->otp.size += 3 * MT_EE_CAL_UNIT;
-+
-+	if (!mdev->otp.data) {
-+		mdev->otp.data = devm_kzalloc(mdev->dev, mdev->otp.size, GFP_KERNEL);
-+		if (!mdev->otp.data)
-+			return -ENOMEM;
-+
-+		block_num = DIV_ROUND_UP(mdev->otp.size, MT7996_EEPROM_BLOCK_SIZE);
-+		for (i = 0; i < block_num; i++) {
-+			buff = mdev->otp.data + i * MT7996_EEPROM_BLOCK_SIZE;
-+			ret = mt7996_mcu_get_eeprom(dev, i * MT7996_EEPROM_BLOCK_SIZE, buff);
-+			if (ret)
-+				continue;
-+		}
-+	}
-+
-+	ret = simple_read_from_buffer(user_buf, count, ppos, mdev->otp.data, mdev->otp.size);
-+
-+	return ret;
-+}
-+
-+static const struct file_operations mt7996_efuse_ops = {
-+	.read = mt7996_efuse_get,
-+	.open = simple_open,
-+	.llseek = default_llseek,
-+};
-+
- int mt7996_init_debugfs(struct mt7996_phy *phy)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -888,6 +928,7 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "twt_stats", dir,
- 				    mt7996_twt_stats);
- 	debugfs_create_file("rf_regval", 0600, dir, dev, &fops_rf_regval);
-+	debugfs_create_file("otp", 0400, dir, dev, &mt7996_efuse_ops);
- 
- 	if (phy->mt76->cap.has_5ghz) {
- 		debugfs_create_u32("dfs_hw_pattern", 0400, dir,
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 39e65010..45cbd03d 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -464,6 +464,147 @@ static int mt7996_eeprom_load_precal(struct mt7996_dev *dev)
- 	return mt76_get_of_data_from_nvmem(mdev, dev->cal, "precal", size);
- }
- 
-+static int mt7996_apply_cal_free_data(struct mt7996_dev *dev)
-+{
-+#define MT_EE_CAL_FREE_MAX_SIZE		30
-+#define MT_EE_7977BN_OFFSET		(0x1200 - 0x500)
-+#define MT_EE_END_OFFSET		0xffff
-+	enum adie_type {
-+		ADIE_7975,
-+		ADIE_7976,
-+		ADIE_7977,
-+		ADIE_7978,
-+		ADIE_7979,
-+	};
-+	static const u16 adie_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
-+		[ADIE_7975] = {0x5cd, 0x5cf, 0x5d1, 0x5d3, 0x6c0, 0x6c1, 0x6c2, 0x6c3,
-+			       0x7a1, 0x7a6, 0x7a8, 0x7aa, -1},
-+		[ADIE_7976] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
-+			       0x70, 0x71, 0x790, 0x791, 0x794, 0x795, 0x7a6, 0x7a8, 0x7aa, -1},
-+		[ADIE_7977] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
-+			       0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, -1},
-+		[ADIE_7978] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
-+			       0x90, 0x91, 0x94, 0x95, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
-+			       0x100, 0x101, 0x102, 0x103, 0x104, 0x105, -1},
-+		[ADIE_7979] = {0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x53, 0x55, 0x57, 0x59,
-+			       0x69, 0x6a, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, -1},
-+	};
-+	static const u16 eep_offs_list[][MT_EE_CAL_FREE_MAX_SIZE] = {
-+		[ADIE_7975] = {0x451, 0x453, 0x455, 0x457, 0x44c, 0x44d, 0x44e, 0x44f,
-+			       0xba1, 0xba6, 0xba8, 0xbaa, -1},
-+		[ADIE_7976] = {0x44c, 0x44d, 0x44e, 0x44f, 0x450,
-+			       0x451, 0x453, 0x455, 0x457, 0x459,
-+			       0x470, 0x471, 0xb90, 0xb91, 0xb94, 0xb95,
-+			       0xba6, 0xba8, 0xbaa, -1},
-+		[ADIE_7977] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250,
-+			       0x1251, 0x1253, 0x1255, 0x1257, 0x1259,
-+			       0x1269, 0x126a, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, -1},
-+		[ADIE_7978] = {0x44c, 0x44d, 0x44e, 0x44f, 0x450,
-+			       0x451, 0x453, 0x455, 0x457, 0x459,
-+			       0xb90, 0xb91, 0xb94, 0xb95,
-+			       0xba6, 0xba7, 0xba8, 0xba9, 0xbaa,
-+			       0x480, 0x481, 0x482, 0x483, 0x484, 0x485, -1},
-+		[ADIE_7979] = {0x124c, 0x124d, 0x124e, 0x124f, 0x1250,
-+			       0x1251, 0x1253, 0x1255, 0x1257, 0x1259,
-+			       0x1269, 0x126a, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, -1},
-+	};
-+	static const u16 adie_base_7996[] = {
-+		0x400, 0x1e00, 0x1200
-+	};
-+	static const u16 adie_base_7992[] = {
-+		0x400, 0x1200, 0x0
-+	};
-+	static const u16 *adie_offs[__MT_MAX_BAND];
-+	static const u16 *eep_offs[__MT_MAX_BAND];
-+	static const u16 *adie_base;
-+	u8 *eeprom = dev->mt76.eeprom.data;
-+	u8 buf[MT7996_EEPROM_BLOCK_SIZE];
-+	int adie_id, band, i, ret;
-+
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		adie_base = adie_base_7996;
-+		/* adie 0 */
-+		if (dev->fem_type == MT7996_FEM_INT)
-+			adie_id = ADIE_7975;
-+		else
-+			adie_id = ADIE_7976;
-+		adie_offs[0] = adie_offs_list[adie_id];
-+		eep_offs[0] = eep_offs_list[adie_id];
-+
-+		/* adie 1 */
-+		if (dev->chip_sku != MT7996_SKU_404) {
-+			adie_offs[1] = adie_offs_list[ADIE_7977];
-+			eep_offs[1] = eep_offs_list[ADIE_7977];
-+		}
-+
-+		/* adie 2 */
-+		adie_offs[2] = adie_offs_list[ADIE_7977];
-+		eep_offs[2] = eep_offs_list[ADIE_7977];
-+		break;
-+	case 0x7992:
-+		adie_base = adie_base_7992;
-+		/* adie 0 */
-+		if (dev->chip_sku == MT7992_SKU_44 &&
-+		    dev->fem_type != MT7996_FEM_EXT)
-+			adie_id = ADIE_7975;
-+		else if (dev->chip_sku == MT7992_SKU_24)
-+			adie_id = ADIE_7978;
-+		else
-+			adie_id = ADIE_7976;
-+		adie_offs[0] = adie_offs_list[adie_id];
-+		eep_offs[0] = eep_offs_list[adie_id];
-+
-+		/* adie 1 */
-+		if (dev->chip_sku == MT7992_SKU_44 &&
-+		    dev->fem_type != MT7996_FEM_INT)
-+			adie_id = ADIE_7977;
-+		else if (dev->chip_sku != MT7992_SKU_23)
-+			adie_id = ADIE_7979;
-+		else
-+			break;
-+		adie_offs[1] = adie_offs_list[adie_id];
-+		eep_offs[1] = eep_offs_list[adie_id];
-+		break;
-+	default:
-+		return -EINVAL;
-+	}
-+
-+	for (band = 0; band < __MT_MAX_BAND; band++) {
-+		u16 adie_offset, eep_offset;
-+		u32 block_num, prev_block_num = -1;
-+
-+		if (!adie_offs[band])
-+			continue;
-+
-+		for (i = 0; i < MT_EE_CAL_FREE_MAX_SIZE; i++) {
-+			adie_offset = adie_offs[band][i] + adie_base[band];
-+			eep_offset = eep_offs[band][i];
-+			block_num = adie_offset / MT7996_EEPROM_BLOCK_SIZE;
-+
-+			if (adie_offs[band][i] == MT_EE_END_OFFSET)
-+				break;
-+
-+			if (is_mt7996(&dev->mt76) && dev->chip_sku == MT7996_SKU_444 &&
-+			    band == MT_BAND1)
-+				eep_offset -= MT_EE_7977BN_OFFSET;
-+
-+			if (prev_block_num != block_num) {
-+				ret = mt7996_mcu_get_eeprom(dev, adie_offset, buf);
-+				if (ret) {
-+					prev_block_num = -1;
-+					continue;
-+				}
-+			}
-+
-+			eeprom[eep_offset] = buf[adie_offset % MT7996_EEPROM_BLOCK_SIZE];
-+			prev_block_num = block_num;
-+		}
-+	}
-+
-+	return 0;
-+}
-+
- int mt7996_eeprom_init(struct mt7996_dev *dev)
- {
- 	int ret;
-@@ -489,6 +630,10 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
- 	if (ret)
- 		return ret;
- 
-+	ret = mt7996_apply_cal_free_data(dev);
-+	if (ret)
-+		return ret;
-+
- 	ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy);
- 	if (ret < 0)
- 		return ret;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index c97a3204..26d0a1c1 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3620,7 +3620,7 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *read_buf)
- 	};
- 	struct sk_buff *skb;
- 	bool valid;
--	int ret;
-+	int ret = 0;
- 	u8 *buf = read_buf;
- 
- 	ret = mt76_mcu_send_and_get_msg(&dev->mt76,
-@@ -3638,11 +3638,13 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *read_buf)
- 
- 		skb_pull(skb, 48);
- 		memcpy(buf, skb->data, MT7996_EEPROM_BLOCK_SIZE);
-+	} else {
-+		ret = -EINVAL;
- 	}
- 
- 	dev_kfree_skb(skb);
- 
--	return 0;
-+	return ret;
- }
- 
- int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1042-mtk-wifi-mt7996-add-Eagle-2adie-TBTC-BE14000-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1042-mtk-wifi-mt7996-add-Eagle-2adie-TBTC-BE14000-support.patch
deleted file mode 100644
index f515e7f..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1042-mtk-wifi-mt7996-add-Eagle-2adie-TBTC-BE14000-support.patch
+++ /dev/null
@@ -1,167 +0,0 @@
-From cbc1ac7f49105b788c535d71885fecd5c64cffee Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Tue, 5 Dec 2023 16:48:33 +0800
-Subject: [PATCH 1042/1044] mtk: wifi: mt7996: add Eagle 2adie TBTC (BE14000)
- support
-
-Add fwdl/default eeprom load support for Eagle 2 adie TBTC
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-
-Add Eagle 2adie TBTC efuse merge
-Add Eagle 2adie TBTC group prek size
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/eeprom.c |  8 ++++++--
- mt7996/eeprom.h | 12 ++++++++++++
- mt7996/init.c   |  6 ++++++
- mt7996/mcu.c    |  5 +++++
- mt7996/mt7996.h |  8 ++++++++
- mt7996/regs.h   |  1 +
- 6 files changed, 38 insertions(+), 2 deletions(-)
-
-diff --git a/mt7996/eeprom.c b/mt7996/eeprom.c
-index 45cbd03d..3d422b0b 100644
---- a/mt7996/eeprom.c
-+++ b/mt7996/eeprom.c
-@@ -131,6 +131,8 @@ const char *mt7996_eeprom_name(struct mt7996_dev *dev)
- 	case 0x7990:
- 		if (dev->chip_sku == MT7996_SKU_404)
- 			return MT7996_EEPROM_DEFAULT_404;
-+		else if (dev->chip_sku == MT7996_SKU_233)
-+			return MT7996_EEPROM_DEFAULT_233;
- 		return MT7996_EEPROM_DEFAULT;
- 	case 0x7992:
- 		if (dev->chip_sku == MT7992_SKU_23) {
-@@ -418,6 +420,8 @@ static void mt7996_eeprom_init_precal(struct mt7996_dev *dev)
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
- 		dev->prek.rev = mt7996_prek_rev;
-+		if (dev->chip_sku == MT7996_SKU_233)
-+			dev->prek.rev = mt7996_prek_rev_233;
- 		/* 5g & 6g bw 80 dpd channel list is not used */
- 		dev->prek.dpd_ch_num[DPD_CH_NUM_BW320_6G] = ARRAY_SIZE(dpd_6g_ch_list_bw320);
- 		break;
-@@ -525,7 +529,7 @@ static int mt7996_apply_cal_free_data(struct mt7996_dev *dev)
- 	case 0x7990:
- 		adie_base = adie_base_7996;
- 		/* adie 0 */
--		if (dev->fem_type == MT7996_FEM_INT)
-+		if (dev->fem_type == MT7996_FEM_INT && dev->chip_sku != MT7996_SKU_233)
- 			adie_id = ADIE_7975;
- 		else
- 			adie_id = ADIE_7976;
-@@ -533,7 +537,7 @@ static int mt7996_apply_cal_free_data(struct mt7996_dev *dev)
- 		eep_offs[0] = eep_offs_list[adie_id];
- 
- 		/* adie 1 */
--		if (dev->chip_sku != MT7996_SKU_404) {
-+		if (dev->chip_sku == MT7996_SKU_444) {
- 			adie_offs[1] = adie_offs_list[ADIE_7977];
- 			eep_offs[1] = eep_offs_list[ADIE_7977];
- 		}
-diff --git a/mt7996/eeprom.h b/mt7996/eeprom.h
-index 0d05e75e..cd866123 100644
---- a/mt7996/eeprom.h
-+++ b/mt7996/eeprom.h
-@@ -70,6 +70,18 @@ static const u32 mt7996_prek_rev[] = {
- 	[DPD_OTFG0_SIZE] =			2 * MT_EE_CAL_UNIT,
- };
- 
-+static const u32 mt7996_prek_rev_233[] = {
-+	[GROUP_SIZE_2G] =			4 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_5G] =			44 * MT_EE_CAL_UNIT,
-+	[GROUP_SIZE_6G] =			100 * MT_EE_CAL_UNIT,
-+	[ADCDCOC_SIZE_2G] =			4 * 4,
-+	[ADCDCOC_SIZE_5G] =			4 * 4,
-+	[ADCDCOC_SIZE_6G] =			4 * 5,
-+	[DPD_LEGACY_SIZE] =			4 * MT_EE_CAL_UNIT,
-+	[DPD_MEM_SIZE] =			13 * MT_EE_CAL_UNIT,
-+	[DPD_OTFG0_SIZE] =			2 * MT_EE_CAL_UNIT,
-+};
-+
- /* kite 2/5g config */
- static const u32 mt7992_prek_rev[] = {
- 	[GROUP_SIZE_2G] =			4 * MT_EE_CAL_UNIT,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 30879ec3..ec90cdc7 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -905,6 +905,12 @@ int mt7996_get_chip_sku(struct mt7996_dev *dev)
- 
- 	switch (mt76_chip(&dev->mt76)) {
- 	case 0x7990:
-+		if (FIELD_GET(MT_PAD_GPIO_2ADIE_TBTC, val)) {
-+			dev->chip_sku = MT7996_SKU_233;
-+			dev->fem_type = MT7996_FEM_INT;
-+			return 0;
-+		}
-+
- 		adie_comb = FIELD_GET(MT_PAD_GPIO_ADIE_COMB, val);
- 		if (adie_comb <= 1)
- 			dev->chip_sku = MT7996_SKU_444;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 26d0a1c1..2cdaf845 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -23,6 +23,11 @@
- 			_fw = MT7992_##name;			\
- 		break;						\
- 	case 0x7990:						\
-+		if ((_dev)->chip_sku == MT7996_SKU_233)		\
-+			_fw = MT7996_##name##_233;		\
-+		else						\
-+			_fw = MT7996_##name;			\
-+		break;						\
- 	default:						\
- 		_fw = MT7996_##name;				\
- 		break;						\
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index bb2cee92..bde0c086 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -35,6 +35,12 @@
- #define MT7996_FIRMWARE_WM_TM		"mediatek/mt7996/mt7996_wm_tm.bin"
- #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
- 
-+#define MT7996_FIRMWARE_WA_233		"mediatek/mt7996/mt7996_wa_233.bin"
-+#define MT7996_FIRMWARE_WM_233		"mediatek/mt7996/mt7996_wm_233.bin"
-+#define MT7996_FIRMWARE_DSP_233		MT7996_FIRMWARE_DSP
-+#define MT7996_FIRMWARE_WM_TM_233	"mediatek/mt7996/mt7996_wm_tm_233.bin"
-+#define MT7996_ROM_PATCH_233		"mediatek/mt7996/mt7996_rom_patch_233.bin"
-+
- #define MT7992_FIRMWARE_WA		"mediatek/mt7996/mt7992_wa.bin"
- #define MT7992_FIRMWARE_WM		"mediatek/mt7996/mt7992_wm.bin"
- #define MT7992_FIRMWARE_DSP		"mediatek/mt7996/mt7992_dsp.bin"
-@@ -54,6 +60,7 @@
- #define MT7992_ROM_PATCH_23		"mediatek/mt7996/mt7992_rom_patch_23.bin"
- 
- #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
-+#define MT7996_EEPROM_DEFAULT_233	"mediatek/mt7996/mt7996_eeprom_233.bin"
- #define MT7996_EEPROM_DEFAULT_404	"mediatek/mt7996/mt7996_eeprom_dual_404.bin"
- #define MT7996_EEPROM_DEFAULT_TM	"mediatek/mt7996/mt7996_eeprom_tm.bin"
- #define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom_2i5i.bin"
-@@ -123,6 +130,7 @@ enum mt7996_fem_type {
- enum mt7996_sku_type {
- 	MT7996_SKU_404,
- 	MT7996_SKU_444,
-+	MT7996_SKU_233,
- };
- 
- enum mt7992_sku_type {
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index aa04d8d2..8d1462a7 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -666,6 +666,7 @@ enum offs_rev {
- 
- #define MT_PAD_GPIO				0x700056f0
- #define MT_PAD_GPIO_ADIE_COMB			GENMASK(16, 15)
-+#define MT_PAD_GPIO_2ADIE_TBTC			BIT(19)
- #define MT_PAD_GPIO_ADIE_COMB_7992		GENMASK(17, 16)
- #define MT_PAD_GPIO_ADIE_NUM_7992		BIT(15)
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1043-mtk-wifi-mt76-mt7996-add-background-radar-hw-cap-che.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1043-mtk-wifi-mt76-mt7996-add-background-radar-hw-cap-che.patch
deleted file mode 100644
index 5aefd99..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1043-mtk-wifi-mt76-mt7996-add-background-radar-hw-cap-che.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From e38dd3530b0bce868b754b9fb02648974a036ab6 Mon Sep 17 00:00:00 2001
-From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
-Date: Fri, 22 Dec 2023 17:27:10 +0800
-Subject: [PATCH 1043/1044] mtk: wifi: mt76: mt7996: add background radar hw
- cap check
-
-Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
----
- mt7996/debugfs.c |  5 +++++
- mt7996/init.c    |  7 ++++---
- mt7996/mt7996.h  | 20 ++++++++++++++++++++
- 3 files changed, 29 insertions(+), 3 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 50ac6d4d..2a5f82da 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -257,6 +257,11 @@ mt7996_rdd_monitor(struct seq_file *s, void *data)
- 
- 	mutex_lock(&dev->mt76.mutex);
- 
-+	if (!mt7996_get_background_radar_cap(dev)) {
-+		seq_puts(s, "no background radar capability\n");
-+		goto out;
-+	}
-+
- 	if (!cfg80211_chandef_valid(chandef)) {
- 		ret = -EINVAL;
- 		goto out;
-diff --git a/mt7996/init.c b/mt7996/init.c
-index ec90cdc7..20415e3c 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -393,9 +393,10 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
- 
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
--	if (!mdev->dev->of_node ||
--	    !of_property_read_bool(mdev->dev->of_node,
--				   "mediatek,disable-radar-background"))
-+	if (mt7996_get_background_radar_cap(phy->dev) &&
-+	    (!mdev->dev->of_node ||
-+	     !of_property_read_bool(mdev->dev->of_node,
-+				    "mediatek,disable-radar-background")))
- 		wiphy_ext_feature_set(wiphy,
- 				      NL80211_EXT_FEATURE_RADAR_BACKGROUND);
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index bde0c086..95db69ca 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -599,6 +599,26 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
- 	return band == MT_BAND0 || band == MT_BAND2;
- }
- 
-+static inline bool
-+mt7996_get_background_radar_cap(struct mt7996_dev *dev)
-+{
-+	switch (mt76_chip(&dev->mt76)) {
-+	case 0x7990:
-+		if (dev->chip_sku == MT7996_SKU_233)
-+			return 0;
-+		break;
-+	case 0x7992:
-+		if (dev->chip_sku == MT7992_SKU_23 ||
-+		    dev->chip_sku == MT7992_SKU_24)
-+			return 0;
-+		break;
-+	default:
-+		break;
-+	}
-+
-+	return 1;
-+}
-+
- extern const struct ieee80211_ops mt7996_ops;
- extern struct pci_driver mt7996_pci_driver;
- extern struct pci_driver mt7996_hif_driver;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1044-mtk-wifi-mt76-mt7996-support-disable-muru-debug-info.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1044-mtk-wifi-mt76-mt7996-support-disable-muru-debug-info.patch
deleted file mode 100644
index 1d601d3..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/1044-mtk-wifi-mt76-mt7996-support-disable-muru-debug-info.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From f3eec1dbbbf7cb3096017f968e616d3311172c1e Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Fri, 22 Dec 2023 10:53:00 +0800
-Subject: [PATCH 1044/1044] mtk: wifi: mt76: mt7996: support disable muru debug
- info when recording fwlog
-
-When we record fwlog, we will also enable recording muru debug info log by
-default. However, in certain test scenarios, this can result in
-recording too many logs, causing inconvenience during issue analysis.
-Therefore, this commit adds an debug option, fw_debug_muru_disable, in
-debugfs. User can modify this option to enable/disable recording muru
-debug info log.
-
-[Usage]
-Set:
-$ echo val > debugfs/fw_debug_muru_disable
-Get:
-$ cat debugfs/fw_debug_muru_disable
-
-val can be the following values:
-0 = enable recording muru debug info (Default value)
-1 = disable recording muru debug info
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/debugfs.c | 29 +++++++++++++++++++++++++++++
- mt7996/mt7996.h  |  1 +
- 2 files changed, 30 insertions(+)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 2a5f82da..dff9e467 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -463,6 +463,9 @@ mt7996_fw_debug_muru_set(void *data)
- 	} debug;
- 	int ret;
- 
-+	if (dev->fw_debug_muru_disable)
-+		return 0;
-+
- 	for (debug = DEBUG_BSRP_STATUS; debug <= DEBUG_MEC_UPDATE_AMSDU; debug++) {
- 		ret = mt7996_mcu_muru_dbg_info(dev, debug,
- 					       dev->fw_debug_bin & BIT(0));
-@@ -907,6 +910,30 @@ static const struct file_operations mt7996_efuse_ops = {
- 	.llseek = default_llseek,
- };
- 
-+static int
-+mt7996_fw_debug_muru_disable_set(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	dev->fw_debug_muru_disable = !!val;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_fw_debug_muru_disable_get(void *data, u64 *val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	*val = dev->fw_debug_muru_disable;
-+
-+	return 0;
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_muru_disable,
-+			 mt7996_fw_debug_muru_disable_get,
-+			 mt7996_fw_debug_muru_disable_set, "%lld\n");
-+
- int mt7996_init_debugfs(struct mt7996_phy *phy)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -943,6 +970,8 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
- 		debugfs_create_devm_seqfile(dev->mt76.dev, "rdd_monitor", dir,
- 					    mt7996_rdd_monitor);
- 	}
-+	debugfs_create_file("fw_debug_muru_disable", 0600, dir, dev,
-+			    &fops_fw_debug_muru_disable);
- 
- 	if (phy == &dev->phy)
- 		dev->debugfs_dir = dir;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 95db69ca..2227c08a 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -472,6 +472,7 @@ struct mt7996_dev {
- 	u8 fw_debug_wa;
- 	u8 fw_debug_bin;
- 	u16 fw_debug_seq;
-+	bool fw_debug_muru_disable;
- 
- 	struct dentry *debugfs_dir;
- 	struct rchan *relay_fwlog;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2000-mtk-wifi-mt76-revert-page_poll-for-kernel-5.4.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2000-mtk-wifi-mt76-revert-page_poll-for-kernel-5.4.patch
deleted file mode 100644
index f17bdc5..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2000-mtk-wifi-mt76-revert-page_poll-for-kernel-5.4.patch
+++ /dev/null
@@ -1,626 +0,0 @@
-From 531fa0a7bd4865ee9e631c6cd1d5655c8e8995a6 Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Mon, 6 Feb 2023 19:49:22 +0800
-Subject: [PATCH 2000/2032] mtk: wifi: mt76: revert page_poll for kernel 5.4
-
-This reverts commit e8c10835cf062c577ddf426913788c39d30b4bd7.
-
----
- dma.c         | 75 ++++++++++++++++++++++++++-------------------------
- mac80211.c    | 57 ---------------------------------------
- mt76.h        | 22 +--------------
- mt7915/main.c | 26 +++++++-----------
- usb.c         | 43 ++++++++++++++---------------
- wed.c         | 50 ++++++++++++++++++++++------------
- 6 files changed, 104 insertions(+), 169 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index 66c000ef..33a84f5f 100644
---- a/dma.c
-+++ b/dma.c
-@@ -178,7 +178,7 @@ mt76_free_pending_rxwi(struct mt76_dev *dev)
- 	local_bh_disable();
- 	while ((t = __mt76_get_rxwi(dev)) != NULL) {
- 		if (t->ptr)
--			mt76_put_page_pool_buf(t->ptr, false);
-+			skb_free_frag(t->ptr);
- 		kfree(t);
- 	}
- 	local_bh_enable();
-@@ -450,9 +450,9 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
- 		if (!t)
- 			return NULL;
- 
--		dma_sync_single_for_cpu(dev->dma_dev, t->dma_addr,
--				SKB_WITH_OVERHEAD(q->buf_size),
--				page_pool_get_dma_dir(q->page_pool));
-+		dma_unmap_single(dev->dma_dev, t->dma_addr,
-+				 SKB_WITH_OVERHEAD(q->buf_size),
-+				 DMA_FROM_DEVICE);
- 
- 		buf = t->ptr;
- 		t->dma_addr = 0;
-@@ -462,9 +462,9 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
- 		if (drop)
- 			*drop |= !!(buf1 & MT_DMA_CTL_WO_DROP);
- 	} else {
--		dma_sync_single_for_cpu(dev->dma_dev, e->dma_addr[0],
--				SKB_WITH_OVERHEAD(q->buf_size),
--				page_pool_get_dma_dir(q->page_pool));
-+		dma_unmap_single(dev->dma_dev, e->dma_addr[0],
-+				 SKB_WITH_OVERHEAD(q->buf_size),
-+				 DMA_FROM_DEVICE);
- 	}
- 
- done:
-@@ -638,7 +638,8 @@ int mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q,
- 		     bool allow_direct)
- {
- 	int len = SKB_WITH_OVERHEAD(q->buf_size);
--	int frames = 0;
-+	int frames = 0, offset = q->buf_offset;
-+	dma_addr_t addr;
- 
- 	if (!q->ndesc)
- 		return 0;
-@@ -647,28 +648,29 @@ int mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q,
- 
- 	while (q->queued < q->ndesc - 1) {
- 		struct mt76_queue_buf qbuf = {};
--		enum dma_data_direction dir;
--		dma_addr_t addr;
--		int offset;
- 		void *buf = NULL;
- 
- 		if (mt76_queue_is_wed_rro_ind(q))
- 			goto done;
- 
--		buf = mt76_get_page_pool_buf(q, &offset, q->buf_size);
-+		buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC);
- 		if (!buf)
- 			break;
- 
--		addr = page_pool_get_dma_addr(virt_to_head_page(buf)) + offset;
--		dir = page_pool_get_dma_dir(q->page_pool);
--		dma_sync_single_for_device(dev->dma_dev, addr, len, dir);
-+		addr = dma_map_single(dev->dma_dev, buf, len, DMA_FROM_DEVICE);
-+		if (unlikely(dma_mapping_error(dev->dma_dev, addr))) {
-+			skb_free_frag(buf);
-+			break;
-+		}
- 
--		qbuf.addr = addr + q->buf_offset;
-+		qbuf.addr = addr + offset;
- done:
--		qbuf.len = len - q->buf_offset;
-+		qbuf.len = len - offset;
- 		qbuf.skip_unmap = false;
- 		if (mt76_dma_add_rx_buf(dev, q, &qbuf, buf) < 0) {
--			mt76_put_page_pool_buf(buf, allow_direct);
-+			dma_unmap_single(dev->dma_dev, addr, len,
-+					 DMA_FROM_DEVICE);
-+			skb_free_frag(buf);
- 			break;
- 		}
- 		frames++;
-@@ -722,10 +724,6 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
- 	if (!q->entry)
- 		return -ENOMEM;
- 
--	ret = mt76_create_page_pool(dev, q);
--	if (ret)
--		return ret;
--
- 	ret = mt76_wed_dma_setup(dev, q, false);
- 	if (ret)
- 		return ret;
-@@ -744,6 +742,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
- static void
- mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
- {
-+	struct page *page;
- 	void *buf;
- 	bool more;
- 
-@@ -759,7 +758,7 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
- 			break;
- 
- 		if (!mt76_queue_is_wed_rro(q))
--			mt76_put_page_pool_buf(buf, false);
-+			skb_free_frag(buf);
- 	} while (1);
- 
- 	spin_lock_bh(&q->lock);
-@@ -769,6 +768,16 @@ mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
- 	}
- 
- 	spin_unlock_bh(&q->lock);
-+
-+	if (mt76_queue_is_wed_rx(q))
-+		return;
-+
-+	if (!q->rx_page.va)
-+		return;
-+
-+	page = virt_to_page(q->rx_page.va);
-+	__page_frag_cache_drain(page, q->rx_page.pagecnt_bias);
-+	memset(&q->rx_page, 0, sizeof(q->rx_page));
- }
- 
- static void
-@@ -791,15 +800,10 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
- 	/* reset WED rx queues */
- 	mt76_wed_dma_setup(dev, q, true);
- 
--	if (mt76_queue_is_wed_tx_free(q))
--		return;
--
--	if (mtk_wed_device_active(&dev->mmio.wed) &&
--	    mt76_queue_is_wed_rro(q))
--		return;
--
--	mt76_dma_sync_idx(dev, q);
--	mt76_dma_rx_fill(dev, q, false);
-+	if (!mt76_queue_is_wed_tx_free(q)) {
-+		mt76_dma_sync_idx(dev, q);
-+		mt76_dma_rx_fill(dev, q, false);
-+	}
- }
- 
- static void
-@@ -816,7 +820,7 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
- 
- 		skb_add_rx_frag(skb, nr_frags, page, offset, len, q->buf_size);
- 	} else {
--		mt76_put_page_pool_buf(data, allow_direct);
-+		skb_free_frag(data);
- 	}
- 
- 	if (more)
-@@ -891,7 +895,6 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- 			goto free_frag;
- 
- 		skb_reserve(skb, q->buf_offset);
--		skb_mark_for_recycle(skb);
- 
- 		*(u32 *)skb->cb = info;
- 
-@@ -907,7 +910,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- 		continue;
- 
- free_frag:
--		mt76_put_page_pool_buf(data, allow_direct);
-+		skb_free_frag(data);
- 	}
- 
- 	mt76_dma_rx_fill(dev, q, true);
-@@ -1010,8 +1013,6 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
- 
- 		netif_napi_del(&dev->napi[i]);
- 		mt76_dma_rx_cleanup(dev, q);
--
--		page_pool_destroy(q->page_pool);
- 	}
- 
- 	if (mtk_wed_device_active(&dev->mmio.wed))
-diff --git a/mac80211.c b/mac80211.c
-index f7cd47f9..380a74e4 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -4,7 +4,6 @@
-  */
- #include <linux/sched.h>
- #include <linux/of.h>
--#include <net/page_pool.h>
- #include "mt76.h"
- 
- static const struct ieee80211_channel mt76_channels_2ghz[] = {
-@@ -566,47 +565,6 @@ void mt76_unregister_phy(struct mt76_phy *phy)
- }
- EXPORT_SYMBOL_GPL(mt76_unregister_phy);
- 
--int mt76_create_page_pool(struct mt76_dev *dev, struct mt76_queue *q)
--{
--	struct page_pool_params pp_params = {
--		.order = 0,
--		.flags = PP_FLAG_PAGE_FRAG,
--		.nid = NUMA_NO_NODE,
--		.dev = dev->dma_dev,
--	};
--	int idx = q - dev->q_rx;
--
--	switch (idx) {
--	case MT_RXQ_MAIN:
--	case MT_RXQ_BAND1:
--	case MT_RXQ_BAND2:
--		pp_params.pool_size = 256;
--		break;
--	default:
--		pp_params.pool_size = 16;
--		break;
--	}
--
--	if (mt76_is_mmio(dev)) {
--		/* rely on page_pool for DMA mapping */
--		pp_params.flags |= PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
--		pp_params.dma_dir = DMA_FROM_DEVICE;
--		pp_params.max_len = PAGE_SIZE;
--		pp_params.offset = 0;
--	}
--
--	q->page_pool = page_pool_create(&pp_params);
--	if (IS_ERR(q->page_pool)) {
--		int err = PTR_ERR(q->page_pool);
--
--		q->page_pool = NULL;
--		return err;
--	}
--
--	return 0;
--}
--EXPORT_SYMBOL_GPL(mt76_create_page_pool);
--
- struct mt76_dev *
- mt76_alloc_device(struct device *pdev, unsigned int size,
- 		  const struct ieee80211_ops *ops,
-@@ -1819,21 +1777,6 @@ void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
- }
- EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
- 
--void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index)
--{
--#ifdef CONFIG_PAGE_POOL_STATS
--	struct page_pool_stats stats = {};
--	int i;
--
--	mt76_for_each_q_rx(dev, i)
--		page_pool_get_stats(dev->q_rx[i].page_pool, &stats);
--
--	page_pool_ethtool_stats_get(data, &stats);
--	*index += page_pool_ethtool_stats_get_count();
--#endif
--}
--EXPORT_SYMBOL_GPL(mt76_ethtool_page_pool_stats);
--
- enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy)
- {
- 	struct ieee80211_hw *hw = phy->hw;
-diff --git a/mt76.h b/mt76.h
-index 543d9de5..540814f1 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -246,7 +246,7 @@ struct mt76_queue {
- 
- 	dma_addr_t desc_dma;
- 	struct sk_buff *rx_head;
--	struct page_pool *page_pool;
-+	struct page_frag_cache rx_page;
- };
- 
- struct mt76_mcu_ops {
-@@ -1601,7 +1601,6 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,
- 	return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout);
- }
- 
--void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index);
- void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
- 			 struct mt76_sta_stats *stats, bool eht);
- int mt76_skb_adjust_pad(struct sk_buff *skb, int pad);
-@@ -1747,25 +1746,6 @@ void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked);
- struct mt76_txwi_cache *mt76_rx_token_release(struct mt76_dev *dev, int token);
- int mt76_rx_token_consume(struct mt76_dev *dev, void *ptr,
- 			  struct mt76_txwi_cache *r, dma_addr_t phys);
--int mt76_create_page_pool(struct mt76_dev *dev, struct mt76_queue *q);
--static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
--{
--	struct page *page = virt_to_head_page(buf);
--
--	page_pool_put_full_page(page->pp, page, allow_direct);
--}
--
--static inline void *
--mt76_get_page_pool_buf(struct mt76_queue *q, u32 *offset, u32 size)
--{
--	struct page *page;
--
--	page = page_pool_dev_alloc_frag(q->page_pool, offset, size);
--	if (!page)
--		return NULL;
--
--	return page_address(page) + *offset;
--}
- 
- static inline void mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked)
- {
-diff --git a/mt7915/main.c b/mt7915/main.c
-index 49d5b459..103a0709 100644
---- a/mt7915/main.c
-+++ b/mt7915/main.c
-@@ -1402,22 +1402,19 @@ void mt7915_get_et_strings(struct ieee80211_hw *hw,
- 			   struct ieee80211_vif *vif,
- 			   u32 sset, u8 *data)
- {
--	if (sset != ETH_SS_STATS)
--		return;
--
--	memcpy(data, mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
--	data += sizeof(mt7915_gstrings_stats);
--	page_pool_ethtool_stats_get_strings(data);
-+	if (sset == ETH_SS_STATS)
-+		memcpy(data, mt7915_gstrings_stats,
-+		       sizeof(mt7915_gstrings_stats));
- }
- 
- static
- int mt7915_get_et_sset_count(struct ieee80211_hw *hw,
- 			     struct ieee80211_vif *vif, int sset)
- {
--	if (sset != ETH_SS_STATS)
--		return 0;
-+	if (sset == ETH_SS_STATS)
-+		return MT7915_SSTATS_LEN;
- 
--	return MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
-+	return 0;
- }
- 
- static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
-@@ -1445,7 +1442,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
- 		.idx = mvif->mt76.idx,
- 	};
- 	/* See mt7915_ampdu_stat_read_phy, etc */
--	int i, ei = 0, stats_size;
-+	int i, ei = 0;
- 
- 	mutex_lock(&dev->mt76.mutex);
- 
-@@ -1557,12 +1554,9 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
- 		return;
- 
- 	ei += wi.worker_stat_count;
--
--	mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
--
--	stats_size = MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
--	if (ei != stats_size)
--		dev_err(dev->mt76.dev, "ei: %d size: %d", ei, stats_size);
-+	if (ei != MT7915_SSTATS_LEN)
-+		dev_err(dev->mt76.dev, "ei: %d  MT7915_SSTATS_LEN: %d",
-+			ei, (int)MT7915_SSTATS_LEN);
- }
- 
- static void
-diff --git a/usb.c b/usb.c
-index dc690d1c..058f2d12 100644
---- a/usb.c
-+++ b/usb.c
-@@ -319,27 +319,29 @@ mt76u_set_endpoints(struct usb_interface *intf,
- 
- static int
- mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76_queue *q, struct urb *urb,
--		 int nsgs)
-+		 int nsgs, gfp_t gfp)
- {
- 	int i;
- 
- 	for (i = 0; i < nsgs; i++) {
-+		struct page *page;
- 		void *data;
- 		int offset;
- 
--		data = mt76_get_page_pool_buf(q, &offset, q->buf_size);
-+		data = page_frag_alloc(&q->rx_page, q->buf_size, gfp);
- 		if (!data)
- 			break;
- 
--		sg_set_page(&urb->sg[i], virt_to_head_page(data), q->buf_size,
--			    offset);
-+		page = virt_to_head_page(data);
-+		offset = data - page_address(page);
-+		sg_set_page(&urb->sg[i], page, q->buf_size, offset);
- 	}
- 
- 	if (i < nsgs) {
- 		int j;
- 
- 		for (j = nsgs; j < urb->num_sgs; j++)
--			mt76_put_page_pool_buf(sg_virt(&urb->sg[j]), false);
-+			skb_free_frag(sg_virt(&urb->sg[j]));
- 		urb->num_sgs = i;
- 	}
- 
-@@ -352,16 +354,15 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76_queue *q, struct urb *urb,
- 
- static int
- mt76u_refill_rx(struct mt76_dev *dev, struct mt76_queue *q,
--		struct urb *urb, int nsgs)
-+		struct urb *urb, int nsgs, gfp_t gfp)
- {
- 	enum mt76_rxq_id qid = q - &dev->q_rx[MT_RXQ_MAIN];
--	int offset;
- 
- 	if (qid == MT_RXQ_MAIN && dev->usb.sg_en)
--		return mt76u_fill_rx_sg(dev, q, urb, nsgs);
-+		return mt76u_fill_rx_sg(dev, q, urb, nsgs, gfp);
- 
- 	urb->transfer_buffer_length = q->buf_size;
--	urb->transfer_buffer = mt76_get_page_pool_buf(q, &offset, q->buf_size);
-+	urb->transfer_buffer = page_frag_alloc(&q->rx_page, q->buf_size, gfp);
- 
- 	return urb->transfer_buffer ? 0 : -ENOMEM;
- }
-@@ -399,7 +400,7 @@ mt76u_rx_urb_alloc(struct mt76_dev *dev, struct mt76_queue *q,
- 	if (err)
- 		return err;
- 
--	return mt76u_refill_rx(dev, q, e->urb, sg_size);
-+	return mt76u_refill_rx(dev, q, e->urb, sg_size, GFP_KERNEL);
- }
- 
- static void mt76u_urb_free(struct urb *urb)
-@@ -407,10 +408,10 @@ static void mt76u_urb_free(struct urb *urb)
- 	int i;
- 
- 	for (i = 0; i < urb->num_sgs; i++)
--		mt76_put_page_pool_buf(sg_virt(&urb->sg[i]), false);
-+		skb_free_frag(sg_virt(&urb->sg[i]));
- 
- 	if (urb->transfer_buffer)
--		mt76_put_page_pool_buf(urb->transfer_buffer, false);
-+		skb_free_frag(urb->transfer_buffer);
- 
- 	usb_free_urb(urb);
- }
-@@ -546,8 +547,6 @@ mt76u_process_rx_entry(struct mt76_dev *dev, struct urb *urb,
- 		len -= data_len;
- 		nsgs++;
- 	}
--
--	skb_mark_for_recycle(skb);
- 	dev->drv->rx_skb(dev, MT_RXQ_MAIN, skb, NULL);
- 
- 	return nsgs;
-@@ -613,7 +612,7 @@ mt76u_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
- 
- 		count = mt76u_process_rx_entry(dev, urb, q->buf_size);
- 		if (count > 0) {
--			err = mt76u_refill_rx(dev, q, urb, count);
-+			err = mt76u_refill_rx(dev, q, urb, count, GFP_ATOMIC);
- 			if (err < 0)
- 				break;
- 		}
-@@ -664,10 +663,6 @@ mt76u_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid)
- 	struct mt76_queue *q = &dev->q_rx[qid];
- 	int i, err;
- 
--	err = mt76_create_page_pool(dev, q);
--	if (err)
--		return err;
--
- 	spin_lock_init(&q->lock);
- 	q->entry = devm_kcalloc(dev->dev,
- 				MT_NUM_RX_ENTRIES, sizeof(*q->entry),
-@@ -696,6 +691,7 @@ EXPORT_SYMBOL_GPL(mt76u_alloc_mcu_queue);
- static void
- mt76u_free_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
- {
-+	struct page *page;
- 	int i;
- 
- 	for (i = 0; i < q->ndesc; i++) {
-@@ -705,8 +701,13 @@ mt76u_free_rx_queue(struct mt76_dev *dev, struct mt76_queue *q)
- 		mt76u_urb_free(q->entry[i].urb);
- 		q->entry[i].urb = NULL;
- 	}
--	page_pool_destroy(q->page_pool);
--	q->page_pool = NULL;
-+
-+	if (!q->rx_page.va)
-+		return;
-+
-+	page = virt_to_page(q->rx_page.va);
-+	__page_frag_cache_drain(page, q->rx_page.pagecnt_bias);
-+	memset(&q->rx_page, 0, sizeof(q->rx_page));
- }
- 
- static void mt76u_free_rx(struct mt76_dev *dev)
-diff --git a/wed.c b/wed.c
-index f89e4537..8eca4d81 100644
---- a/wed.c
-+++ b/wed.c
-@@ -9,8 +9,12 @@
- void mt76_wed_release_rx_buf(struct mtk_wed_device *wed)
- {
- 	struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
-+	u32 length;
- 	int i;
- 
-+	length = SKB_DATA_ALIGN(NET_SKB_PAD + wed->wlan.rx_size +
-+				sizeof(struct skb_shared_info));
-+
- 	for (i = 0; i < dev->rx_token_size; i++) {
- 		struct mt76_txwi_cache *t;
- 
-@@ -18,7 +22,9 @@ void mt76_wed_release_rx_buf(struct mtk_wed_device *wed)
- 		if (!t || !t->ptr)
- 			continue;
- 
--		mt76_put_page_pool_buf(t->ptr, false);
-+		dma_unmap_single(dev->dma_dev, t->dma_addr,
-+				 wed->wlan.rx_size, DMA_FROM_DEVICE);
-+		__free_pages(virt_to_page(t->ptr), get_order(length));
- 		t->ptr = NULL;
- 
- 		mt76_put_rxwi(dev, t);
-@@ -33,33 +39,45 @@ u32 mt76_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
- {
- 	struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
- 	struct mtk_wed_bm_desc *desc = wed->rx_buf_ring.desc;
--	struct mt76_queue *q = &dev->q_rx[MT_RXQ_MAIN];
--	int i, len = SKB_WITH_OVERHEAD(q->buf_size);
--	struct mt76_txwi_cache *t = NULL;
-+	u32 length;
-+	int i;
-+
-+	length = SKB_DATA_ALIGN(NET_SKB_PAD + wed->wlan.rx_size +
-+				sizeof(struct skb_shared_info));
- 
- 	for (i = 0; i < size; i++) {
--		enum dma_data_direction dir;
-+		struct mt76_txwi_cache *t = mt76_get_rxwi(dev);
- 		dma_addr_t addr;
--		u32 offset;
-+		struct page *page;
- 		int token;
--		void *buf;
-+		void *ptr;
- 
--		t = mt76_get_rxwi(dev);
- 		if (!t)
- 			goto unmap;
- 
--		buf = mt76_get_page_pool_buf(q, &offset, q->buf_size);
--		if (!buf)
-+		page = __dev_alloc_pages(GFP_KERNEL, get_order(length));
-+		if (!page) {
-+			mt76_put_rxwi(dev, t);
- 			goto unmap;
-+		}
- 
--		addr = page_pool_get_dma_addr(virt_to_head_page(buf)) + offset;
--		dir = page_pool_get_dma_dir(q->page_pool);
--		dma_sync_single_for_device(dev->dma_dev, addr, len, dir);
-+		addr = dma_map_single(dev->dma_dev, ptr,
-+					  wed->wlan.rx_size,
-+					  DMA_TO_DEVICE);
-+
-+		if (unlikely(dma_mapping_error(dev->dev, addr))) {
-+			skb_free_frag(ptr);
-+			mt76_put_rxwi(dev, t);
-+			goto unmap;
-+		}
- 
- 		desc->buf0 = cpu_to_le32(addr);
--		token = mt76_rx_token_consume(dev, buf, t, addr);
-+		token = mt76_rx_token_consume(dev, ptr, t, addr);
- 		if (token < 0) {
--			mt76_put_page_pool_buf(buf, false);
-+			dma_unmap_single(dev->dma_dev, addr,
-+					 wed->wlan.rx_size, DMA_TO_DEVICE);
-+			__free_pages(page, get_order(length));
-+			mt76_put_rxwi(dev, t);
- 			goto unmap;
- 		}
- 
-@@ -74,8 +92,6 @@ u32 mt76_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
- 	return 0;
- 
- unmap:
--	if (t)
--		mt76_put_rxwi(dev, t);
- 	mt76_wed_release_rx_buf(wed);
- 
- 	return -ENOMEM;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2001-mtk-wifi-mt76-rework-wed-rx-flow.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2001-mtk-wifi-mt76-rework-wed-rx-flow.patch
deleted file mode 100644
index 1259a33..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2001-mtk-wifi-mt76-rework-wed-rx-flow.patch
+++ /dev/null
@@ -1,541 +0,0 @@
-From c6914b48e41c17245715400f8733ed9a38a4d5da Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Mon, 6 Feb 2023 13:37:23 +0800
-Subject: [PATCH 2001/2032] mtk: wifi: mt76: rework wed rx flow
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- dma.c           | 125 +++++++++++++++++++++++++++++++-----------------
- mac80211.c      |   2 +-
- mt76.h          |  25 ++++++----
- mt7915/mmio.c   |   3 +-
- mt7915/mt7915.h |   1 +
- tx.c            |  16 +++----
- wed.c           |  57 ++++++++++++++--------
- 7 files changed, 144 insertions(+), 85 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index 33a84f5f..c54187bd 100644
---- a/dma.c
-+++ b/dma.c
-@@ -64,17 +64,17 @@ mt76_alloc_txwi(struct mt76_dev *dev)
- 	return t;
- }
- 
--static struct mt76_txwi_cache *
-+static struct mt76_rxwi_cache *
- mt76_alloc_rxwi(struct mt76_dev *dev)
- {
--	struct mt76_txwi_cache *t;
-+	struct mt76_rxwi_cache *r;
- 
--	t = kzalloc(L1_CACHE_ALIGN(sizeof(*t)), GFP_ATOMIC);
--	if (!t)
-+	r = kzalloc(L1_CACHE_ALIGN(sizeof(*r)), GFP_ATOMIC);
-+	if (!r)
- 		return NULL;
- 
--	t->ptr = NULL;
--	return t;
-+	r->ptr = NULL;
-+	return r;
- }
- 
- static struct mt76_txwi_cache *
-@@ -93,20 +93,20 @@ __mt76_get_txwi(struct mt76_dev *dev)
- 	return t;
- }
- 
--static struct mt76_txwi_cache *
-+static struct mt76_rxwi_cache *
- __mt76_get_rxwi(struct mt76_dev *dev)
- {
--	struct mt76_txwi_cache *t = NULL;
-+	struct mt76_rxwi_cache *r = NULL;
- 
--	spin_lock_bh(&dev->wed_lock);
-+	spin_lock_bh(&dev->lock);
- 	if (!list_empty(&dev->rxwi_cache)) {
--		t = list_first_entry(&dev->rxwi_cache, struct mt76_txwi_cache,
-+		r = list_first_entry(&dev->rxwi_cache, struct mt76_rxwi_cache,
- 				     list);
--		list_del(&t->list);
-+		list_del(&r->list);
- 	}
--	spin_unlock_bh(&dev->wed_lock);
-+	spin_unlock_bh(&dev->lock);
- 
--	return t;
-+	return r;
- }
- 
- static struct mt76_txwi_cache *
-@@ -120,13 +120,13 @@ mt76_get_txwi(struct mt76_dev *dev)
- 	return mt76_alloc_txwi(dev);
- }
- 
--struct mt76_txwi_cache *
-+struct mt76_rxwi_cache *
- mt76_get_rxwi(struct mt76_dev *dev)
- {
--	struct mt76_txwi_cache *t = __mt76_get_rxwi(dev);
-+	struct mt76_rxwi_cache *r = __mt76_get_rxwi(dev);
- 
--	if (t)
--		return t;
-+	if (r)
-+		return r;
- 
- 	return mt76_alloc_rxwi(dev);
- }
-@@ -145,14 +145,14 @@ mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
- EXPORT_SYMBOL_GPL(mt76_put_txwi);
- 
- void
--mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t)
-+mt76_put_rxwi(struct mt76_dev *dev, struct mt76_rxwi_cache *r)
- {
--	if (!t)
-+	if (!r)
- 		return;
- 
--	spin_lock_bh(&dev->wed_lock);
--	list_add(&t->list, &dev->rxwi_cache);
--	spin_unlock_bh(&dev->wed_lock);
-+	spin_lock_bh(&dev->lock);
-+	list_add(&r->list, &dev->rxwi_cache);
-+	spin_unlock_bh(&dev->lock);
- }
- EXPORT_SYMBOL_GPL(mt76_put_rxwi);
- 
-@@ -173,13 +173,13 @@ mt76_free_pending_txwi(struct mt76_dev *dev)
- void
- mt76_free_pending_rxwi(struct mt76_dev *dev)
- {
--	struct mt76_txwi_cache *t;
-+	struct mt76_rxwi_cache *r;
- 
- 	local_bh_disable();
--	while ((t = __mt76_get_rxwi(dev)) != NULL) {
--		if (t->ptr)
--			skb_free_frag(t->ptr);
--		kfree(t);
-+	while ((r = __mt76_get_rxwi(dev)) != NULL) {
-+		if (r->ptr)
-+			skb_free_frag(r->ptr);
-+		kfree(r);
- 	}
- 	local_bh_enable();
- }
-@@ -225,10 +225,10 @@ void mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q)
- 
- static int
- mt76_dma_add_rx_buf(struct mt76_dev *dev, struct mt76_queue *q,
--		    struct mt76_queue_buf *buf, void *data)
-+		    struct mt76_queue_buf *buf, void *data,
-+		    struct mt76_rxwi_cache *rxwi)
- {
- 	struct mt76_queue_entry *entry = &q->entry[q->head];
--	struct mt76_txwi_cache *txwi = NULL;
- 	struct mt76_desc *desc;
- 	int idx = q->head;
- 	u32 buf1 = 0, ctrl;
-@@ -249,13 +249,15 @@ mt76_dma_add_rx_buf(struct mt76_dev *dev, struct mt76_queue *q,
- #endif
- 
- 	if (mt76_queue_is_wed_rx(q)) {
--		txwi = mt76_get_rxwi(dev);
--		if (!txwi)
--			return -ENOMEM;
-+		if (!rxwi) {
-+			rxwi = mt76_get_rxwi(dev);
-+			if (!rxwi)
-+				return -ENOMEM;
-+		}
- 
--		rx_token = mt76_rx_token_consume(dev, data, txwi, buf->addr);
-+		rx_token = mt76_rx_token_consume(dev, data, rxwi, buf->addr);
- 		if (rx_token < 0) {
--			mt76_put_rxwi(dev, txwi);
-+			mt76_put_rxwi(dev, rxwi);
- 			return -ENOMEM;
- 		}
- 
-@@ -271,7 +273,7 @@ mt76_dma_add_rx_buf(struct mt76_dev *dev, struct mt76_queue *q,
- done:
- 	entry->dma_addr[0] = buf->addr;
- 	entry->dma_len[0] = buf->len;
--	entry->txwi = txwi;
-+	entry->rxwi = rxwi;
- 	entry->buf = data;
- 	entry->wcid = 0xffff;
- 	entry->skip_buf1 = true;
-@@ -420,7 +422,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush)
- 
- static void *
- mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
--		 int *len, u32 *info, bool *more, bool *drop)
-+		 int *len, u32 *info, bool *more, bool *drop, bool flush)
- {
- 	struct mt76_queue_entry *e = &q->entry[idx];
- 	struct mt76_desc *desc = &q->desc[idx];
-@@ -445,20 +447,53 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
- 
- 	if (mt76_queue_is_wed_rx(q)) {
- 		u32 token = FIELD_GET(MT_DMA_CTL_TOKEN, buf1);
--		struct mt76_txwi_cache *t = mt76_rx_token_release(dev, token);
-+		struct mt76_rxwi_cache *r = mt76_rx_token_release(dev, token);
- 
--		if (!t)
-+		if (!r)
- 			return NULL;
- 
--		dma_unmap_single(dev->dma_dev, t->dma_addr,
-+		dma_unmap_single(dev->dma_dev, r->dma_addr,
- 				 SKB_WITH_OVERHEAD(q->buf_size),
- 				 DMA_FROM_DEVICE);
- 
--		buf = t->ptr;
--		t->dma_addr = 0;
--		t->ptr = NULL;
-+		if (flush) {
-+			buf = r->ptr;
-+			r->dma_addr = 0;
-+			r->ptr = NULL;
-+
-+			mt76_put_rxwi(dev, r);
-+		} else {
-+			struct mt76_queue_buf qbuf;
-+
-+			buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC);
-+			if (!buf)
-+				return NULL;
-+
-+			memcpy(buf, r->ptr, SKB_WITH_OVERHEAD(q->buf_size));
-+
-+			r->dma_addr = dma_map_single(dev->dma_dev, r->ptr,
-+						     SKB_WITH_OVERHEAD(q->buf_size),
-+						     DMA_FROM_DEVICE);
-+			if (unlikely(dma_mapping_error(dev->dma_dev, r->dma_addr))) {
-+				skb_free_frag(r->ptr);
-+				mt76_put_rxwi(dev, r);
-+				return NULL;
-+			}
-+
-+			qbuf.addr = r->dma_addr;
-+			qbuf.len = SKB_WITH_OVERHEAD(q->buf_size);
-+			qbuf.skip_unmap = false;
-+
-+			if (mt76_dma_add_rx_buf(dev, q, &qbuf, r->ptr, r) < 0) {
-+				dma_unmap_single(dev->dma_dev, r->dma_addr,
-+						 SKB_WITH_OVERHEAD(q->buf_size),
-+						 DMA_FROM_DEVICE);
-+				skb_free_frag(r->ptr);
-+				mt76_put_rxwi(dev, r);
-+				return NULL;
-+			}
-+		}
- 
--		mt76_put_rxwi(dev, t);
- 		if (drop)
- 			*drop |= !!(buf1 & MT_DMA_CTL_WO_DROP);
- 	} else {
-@@ -495,7 +530,7 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
- 	q->tail = (q->tail + 1) % q->ndesc;
- 	q->queued--;
- 
--	return mt76_dma_get_buf(dev, q, idx, len, info, more, drop);
-+	return mt76_dma_get_buf(dev, q, idx, len, info, more, drop, flush);
- }
- 
- static int
-@@ -667,7 +702,7 @@ int mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q,
- done:
- 		qbuf.len = len - offset;
- 		qbuf.skip_unmap = false;
--		if (mt76_dma_add_rx_buf(dev, q, &qbuf, buf) < 0) {
-+		if (mt76_dma_add_rx_buf(dev, q, &qbuf, buf, NULL) < 0) {
- 			dma_unmap_single(dev->dma_dev, addr, len,
- 					 DMA_FROM_DEVICE);
- 			skb_free_frag(buf);
-diff --git a/mac80211.c b/mac80211.c
-index 380a74e4..91e771d3 100644
---- a/mac80211.c
-+++ b/mac80211.c
-@@ -595,7 +595,6 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
- 	spin_lock_init(&dev->lock);
- 	spin_lock_init(&dev->cc_lock);
- 	spin_lock_init(&dev->status_lock);
--	spin_lock_init(&dev->wed_lock);
- 	mutex_init(&dev->mutex);
- 	init_waitqueue_head(&dev->tx_wait);
- 
-@@ -628,6 +627,7 @@ mt76_alloc_device(struct device *pdev, unsigned int size,
- 	INIT_LIST_HEAD(&dev->txwi_cache);
- 	INIT_LIST_HEAD(&dev->rxwi_cache);
- 	dev->token_size = dev->drv->token_size;
-+	dev->rx_token_size = dev->drv->rx_token_size;
- 
- 	for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++)
- 		skb_queue_head_init(&dev->rx_skb[i]);
-diff --git a/mt76.h b/mt76.h
-index 540814f1..878553a2 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -200,6 +200,7 @@ struct mt76_queue_entry {
- 	};
- 	union {
- 		struct mt76_txwi_cache *txwi;
-+		struct mt76_rxwi_cache *rxwi;
- 		struct urb *urb;
- 		int buf_sz;
- 	};
-@@ -411,12 +412,16 @@ struct mt76_txwi_cache {
- 	struct list_head list;
- 	dma_addr_t dma_addr;
- 
--	union {
--		struct sk_buff *skb;
--		void *ptr;
--	};
--
- 	unsigned long jiffies;
-+
-+	struct sk_buff *skb;
-+};
-+
-+struct mt76_rxwi_cache {
-+	struct list_head list;
-+	dma_addr_t dma_addr;
-+
-+	void *ptr;
- };
- 
- struct mt76_rx_tid {
-@@ -504,6 +509,7 @@ struct mt76_driver_ops {
- 	u16 txwi_size;
- 	u16 token_size;
- 	u8 mcs_rates;
-+	u16 rx_token_size;
- 
- 	void (*update_survey)(struct mt76_phy *phy);
- 
-@@ -881,7 +887,6 @@ struct mt76_dev {
- 
- 	struct ieee80211_hw *hw;
- 
--	spinlock_t wed_lock;
- 	spinlock_t lock;
- 	spinlock_t cc_lock;
- 
-@@ -1563,8 +1568,8 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
- }
- 
- void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
--void mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t);
--struct mt76_txwi_cache *mt76_get_rxwi(struct mt76_dev *dev);
-+void mt76_put_rxwi(struct mt76_dev *dev, struct mt76_rxwi_cache *r);
-+struct mt76_rxwi_cache *mt76_get_rxwi(struct mt76_dev *dev);
- void mt76_free_pending_rxwi(struct mt76_dev *dev);
- void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames,
- 		      struct napi_struct *napi);
-@@ -1743,9 +1748,9 @@ struct mt76_txwi_cache *
- mt76_token_release(struct mt76_dev *dev, int token, bool *wake);
- int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi);
- void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked);
--struct mt76_txwi_cache *mt76_rx_token_release(struct mt76_dev *dev, int token);
-+struct mt76_rxwi_cache *mt76_rx_token_release(struct mt76_dev *dev, int token);
- int mt76_rx_token_consume(struct mt76_dev *dev, void *ptr,
--			  struct mt76_txwi_cache *r, dma_addr_t phys);
-+			  struct mt76_rxwi_cache *r, dma_addr_t phys);
- 
- static inline void mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked)
- {
-diff --git a/mt7915/mmio.c b/mt7915/mmio.c
-index 6004d64f..5938bd9f 100644
---- a/mt7915/mmio.c
-+++ b/mt7915/mmio.c
-@@ -714,7 +714,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
- 	wed->wlan.reset = mt7915_mmio_wed_reset;
- 	wed->wlan.reset_complete = mt76_wed_reset_complete;
- 
--	dev->mt76.rx_token_size = wed->wlan.rx_npkt;
-+	dev->mt76.rx_token_size += wed->wlan.rx_npkt;
- 
- 	if (mtk_wed_device_attach(wed))
- 		return 0;
-@@ -921,6 +921,7 @@ struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
- 				SURVEY_INFO_TIME_RX |
- 				SURVEY_INFO_TIME_BSS_RX,
- 		.token_size = MT7915_TOKEN_SIZE,
-+		.rx_token_size = MT7915_RX_TOKEN_SIZE;
- 		.tx_prepare_skb = mt7915_tx_prepare_skb,
- 		.tx_complete_skb = mt76_connac_tx_complete_skb,
- 		.rx_skb = mt7915_queue_rx_skb,
-diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
-index a30d08eb..f1e2c93a 100644
---- a/mt7915/mt7915.h
-+++ b/mt7915/mt7915.h
-@@ -62,6 +62,7 @@
- #define MT7915_EEPROM_BLOCK_SIZE	16
- #define MT7915_HW_TOKEN_SIZE		4096
- #define MT7915_TOKEN_SIZE		8192
-+#define MT7915_RX_TOKEN_SIZE		4096
- 
- #define MT7915_CFEND_RATE_DEFAULT	0x49	/* OFDM 24M */
- #define MT7915_CFEND_RATE_11B		0x03	/* 11B LP, 11M */
-diff --git a/tx.c b/tx.c
-index ab42f69b..46dae6e0 100644
---- a/tx.c
-+++ b/tx.c
-@@ -851,16 +851,16 @@ int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
- EXPORT_SYMBOL_GPL(mt76_token_consume);
- 
- int mt76_rx_token_consume(struct mt76_dev *dev, void *ptr,
--			  struct mt76_txwi_cache *t, dma_addr_t phys)
-+			  struct mt76_rxwi_cache *r, dma_addr_t phys)
- {
- 	int token;
- 
- 	spin_lock_bh(&dev->rx_token_lock);
--	token = idr_alloc(&dev->rx_token, t, 0, dev->rx_token_size,
-+	token = idr_alloc(&dev->rx_token, r, 0, dev->rx_token_size,
- 			  GFP_ATOMIC);
- 	if (token >= 0) {
--		t->ptr = ptr;
--		t->dma_addr = phys;
-+		r->ptr = ptr;
-+		r->dma_addr = phys;
- 	}
- 	spin_unlock_bh(&dev->rx_token_lock);
- 
-@@ -897,15 +897,15 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
- }
- EXPORT_SYMBOL_GPL(mt76_token_release);
- 
--struct mt76_txwi_cache *
-+struct mt76_rxwi_cache *
- mt76_rx_token_release(struct mt76_dev *dev, int token)
- {
--	struct mt76_txwi_cache *t;
-+	struct mt76_rxwi_cache *r;
- 
- 	spin_lock_bh(&dev->rx_token_lock);
--	t = idr_remove(&dev->rx_token, token);
-+	r = idr_remove(&dev->rx_token, token);
- 	spin_unlock_bh(&dev->rx_token_lock);
- 
--	return t;
-+	return r;
- }
- EXPORT_SYMBOL_GPL(mt76_rx_token_release);
-diff --git a/wed.c b/wed.c
-index 8eca4d81..0a0b5c05 100644
---- a/wed.c
-+++ b/wed.c
-@@ -9,28 +9,45 @@
- void mt76_wed_release_rx_buf(struct mtk_wed_device *wed)
- {
- 	struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
--	u32 length;
-+	struct page *page;
- 	int i;
- 
--	length = SKB_DATA_ALIGN(NET_SKB_PAD + wed->wlan.rx_size +
--				sizeof(struct skb_shared_info));
--
- 	for (i = 0; i < dev->rx_token_size; i++) {
--		struct mt76_txwi_cache *t;
-+		struct mt76_rxwi_cache *r;
- 
--		t = mt76_rx_token_release(dev, i);
--		if (!t || !t->ptr)
-+		r = mt76_rx_token_release(dev, i);
-+		if (!r || !r->ptr)
- 			continue;
- 
--		dma_unmap_single(dev->dma_dev, t->dma_addr,
-+		dma_unmap_single(dev->dma_dev, r->dma_addr,
- 				 wed->wlan.rx_size, DMA_FROM_DEVICE);
--		__free_pages(virt_to_page(t->ptr), get_order(length));
--		t->ptr = NULL;
-+		skb_free_frag(r->ptr);
-+		r->ptr = NULL;
- 
--		mt76_put_rxwi(dev, t);
-+		mt76_put_rxwi(dev, r);
- 	}
- 
- 	mt76_free_pending_rxwi(dev);
-+
-+	mt76_for_each_q_rx(dev, i) {
-+		struct mt76_queue *q = &dev->q_rx[i];
-+
-+		if (mt76_queue_is_wed_rx(q)) {
-+			if (!q->rx_page.va)
-+				continue;
-+
-+			page = virt_to_page(q->rx_page.va);
-+			__page_frag_cache_drain(page, q->rx_page.pagecnt_bias);
-+			memset(&q->rx_page, 0, sizeof(q->rx_page));
-+		}
-+	}
-+
-+	if (!wed->rx_buf_ring.rx_page.va)
-+		return;
-+
-+	page = virt_to_page(wed->rx_buf_ring.rx_page.va);
-+	__page_frag_cache_drain(page, wed->rx_buf_ring.rx_page.pagecnt_bias);
-+	memset(&wed->rx_buf_ring.rx_page, 0, sizeof(wed->rx_buf_ring.rx_page));
- }
- EXPORT_SYMBOL_GPL(mt76_wed_release_rx_buf);
- 
-@@ -46,18 +63,18 @@ u32 mt76_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
- 				sizeof(struct skb_shared_info));
- 
- 	for (i = 0; i < size; i++) {
--		struct mt76_txwi_cache *t = mt76_get_rxwi(dev);
-+		struct mt76_rxwi_cache *r = mt76_get_rxwi(dev);
- 		dma_addr_t addr;
- 		struct page *page;
- 		int token;
- 		void *ptr;
- 
--		if (!t)
-+		if (!r)
- 			goto unmap;
- 
--		page = __dev_alloc_pages(GFP_KERNEL, get_order(length));
--		if (!page) {
--			mt76_put_rxwi(dev, t);
-+		ptr = page_frag_alloc(&wed->rx_buf_ring.rx_page, length, GFP_ATOMIC);
-+		if (!ptr) {
-+			mt76_put_rxwi(dev, r);
- 			goto unmap;
- 		}
- 
-@@ -67,17 +84,17 @@ u32 mt76_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
- 
- 		if (unlikely(dma_mapping_error(dev->dev, addr))) {
- 			skb_free_frag(ptr);
--			mt76_put_rxwi(dev, t);
-+			mt76_put_rxwi(dev, r);
- 			goto unmap;
- 		}
- 
- 		desc->buf0 = cpu_to_le32(addr);
--		token = mt76_rx_token_consume(dev, ptr, t, addr);
-+		token = mt76_rx_token_consume(dev, ptr, r, addr);
- 		if (token < 0) {
- 			dma_unmap_single(dev->dma_dev, addr,
- 					 wed->wlan.rx_size, DMA_TO_DEVICE);
--			__free_pages(page, get_order(length));
--			mt76_put_rxwi(dev, t);
-+			skb_free_frag(ptr);
-+			mt76_put_rxwi(dev, r);
- 			goto unmap;
- 		}
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2002-mtk-wifi-mt76-wed-change-wed-token-init-size-to-adap.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2002-mtk-wifi-mt76-wed-change-wed-token-init-size-to-adap.patch
deleted file mode 100644
index c1d7f8f..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2002-mtk-wifi-mt76-wed-change-wed-token-init-size-to-adap.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 397754d5ae1770a66b1a1cb05ba93360f3b3b533 Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Wed, 19 Apr 2023 17:13:41 +0800
-Subject: [PATCH 2002/2032] mtk: wifi: mt76: wed: change wed token init size to
- adapt wed3.0
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
----
- tx.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
-diff --git a/tx.c b/tx.c
-index 46dae6e0..e2795067 100644
---- a/tx.c
-+++ b/tx.c
-@@ -827,12 +827,16 @@ EXPORT_SYMBOL_GPL(__mt76_set_tx_blocked);
- 
- int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
- {
--	int token;
-+	int token, start = 0;
-+
-+	if (mtk_wed_device_active(&dev->mmio.wed))
-+		start = dev->mmio.wed.wlan.nbuf;
- 
- 	spin_lock_bh(&dev->token_lock);
- 
--	token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
--	if (token >= 0)
-+	token = idr_alloc(&dev->token, *ptxwi, start, start + dev->token_size,
-+			  GFP_ATOMIC);
-+	if (token >= start)
- 		dev->token_count++;
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2003-mtk-wifi-mt76-add-random-early-drop-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2003-mtk-wifi-mt76-add-random-early-drop-support.patch
deleted file mode 100644
index 547c268..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2003-mtk-wifi-mt76-add-random-early-drop-support.patch
+++ /dev/null
@@ -1,316 +0,0 @@
-From 5a8454a960379567f438f55eda39635a54a7bfbf Mon Sep 17 00:00:00 2001
-From: Peter Chiu <chui-hao.chiu@mediatek.com>
-Date: Wed, 19 Apr 2023 18:32:41 +0800
-Subject: [PATCH 2003/2032] mtk: wifi: mt76: add random early drop support
-
----
- mt7996/debugfs.c     |  1 +
- mt7996/mac.c         |  7 ++++
- mt7996/mcu.c         | 81 ++++++++++++++++++++++++++++++++++++++++++--
- mt7996/mcu.h         |  4 ++-
- mt7996/mt7996.h      |  5 ++-
- mt7996/mtk_debugfs.c | 23 +++++++++++++
- mt7996/mtk_mcu.c     | 26 ++++++++++++++
- mt7996/mtk_mcu.h     | 24 +++++++++++++
- 8 files changed, 167 insertions(+), 4 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index dff9e467..01f98b2e 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -629,6 +629,7 @@ mt7996_tx_stats_show(struct seq_file *file, void *data)
- 	seq_printf(file, "Tx attempts: %8u (MPDUs)\n", attempts);
- 	seq_printf(file, "Tx success: %8u (MPDUs)\n", success);
- 	seq_printf(file, "Tx PER: %u%%\n", per);
-+	seq_printf(file, "Tx RED drop: %8u\n", phy->red_drop);
- 
- 	mt7996_txbf_stat_read_phy(phy, file);
- 
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 6fa46e46..64cec164 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1176,6 +1176,13 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
- 
- 			wcid->stats.tx_retries += tx_retries;
- 			wcid->stats.tx_failed += tx_failed;
-+
-+			if (FIELD_GET(MT_TXFREE_INFO_STAT, info) == 2) {
-+				struct mt7996_phy *mphy =
-+					__mt7996_phy(dev, wcid->phy_idx);
-+
-+				mphy->red_drop++;
-+			}
- 			continue;
- 		}
- 
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 2cdaf845..be21dd62 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3145,8 +3145,8 @@ int mt7996_mcu_init_firmware(struct mt7996_dev *dev)
- 	if (ret)
- 		return ret;
- 
--	return mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
--				 MCU_WA_PARAM_RED, 0, 0);
-+	return mt7996_mcu_red_config(dev,
-+			mtk_wed_device_active(&dev->mt76.mmio.wed));
- }
- 
- int mt7996_mcu_init(struct mt7996_dev *dev)
-@@ -3178,6 +3178,83 @@ out:
- 	skb_queue_purge(&dev->mt76.mcu.res_q);
- }
- 
-+static int mt7996_mcu_wa_red_config(struct mt7996_dev *dev)
-+{
-+#define RED_TOKEN_SRC_CNT	4
-+#define RED_TOKEN_CONFIG	2
-+	struct {
-+		__le32 arg0;
-+		__le32 arg1;
-+		__le32 arg2;
-+
-+		u8 mode;
-+		u8 version;
-+		u8 _rsv[4];
-+		__le16 len;
-+
-+		__le16 tcp_offset;
-+		__le16 priority_offset;
-+		__le16 token_per_src[RED_TOKEN_SRC_CNT];
-+		__le16 token_thr_per_src[RED_TOKEN_SRC_CNT];
-+
-+		u8 _rsv2[604];
-+	} __packed req = {
-+		.arg0 = cpu_to_le32(MCU_WA_PARAM_RED_CONFIG),
-+
-+		.mode = RED_TOKEN_CONFIG,
-+		.len = cpu_to_le16(sizeof(req) - sizeof(__le32) * 3),
-+
-+		.tcp_offset = cpu_to_le16(200),
-+		.priority_offset = cpu_to_le16(255),
-+	};
-+	u8 i;
-+
-+	for (i = 0; i < RED_TOKEN_SRC_CNT; i++) {
-+		req.token_per_src[i] = cpu_to_le16(MT7996_TOKEN_SIZE);
-+		req.token_thr_per_src[i] = cpu_to_le16(MT7996_TOKEN_SIZE);
-+	}
-+
-+	if (!mtk_wed_device_active(&dev->mt76.mmio.wed))
-+		req.token_per_src[RED_TOKEN_SRC_CNT - 1] =
-+			cpu_to_le16(MT7996_TOKEN_SIZE - MT7996_HW_TOKEN_SIZE);
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET),
-+				 &req, sizeof(req), false);
-+}
-+
-+int mt7996_mcu_red_config(struct mt7996_dev *dev, bool enable)
-+{
-+#define RED_DISABLE		0
-+#define RED_BY_WA_ENABLE	2
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 enable;
-+		u8 __rsv2[3];
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_VOW_RED_ENABLE),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.enable = enable ? RED_BY_WA_ENABLE : RED_DISABLE,
-+	};
-+	int ret;
-+
-+	ret = mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(VOW), &req,
-+				 sizeof(req), true);
-+
-+	if (ret)
-+		return ret;
-+
-+	ret = mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
-+				MCU_WA_PARAM_RED_EN, enable, 0);
-+
-+	if (ret || !enable)
-+		return ret;
-+
-+	return mt7996_mcu_wa_red_config(dev);
-+}
-+
- int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans)
- {
- 	struct {
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 398bf3d2..4fa399bc 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -346,8 +346,9 @@ enum {
- enum {
- 	MCU_WA_PARAM_PDMA_RX = 0x04,
- 	MCU_WA_PARAM_CPU_UTIL = 0x0b,
--	MCU_WA_PARAM_RED = 0x0e,
-+	MCU_WA_PARAM_RED_EN = 0x0e,
- 	MCU_WA_PARAM_HW_PATH_HIF_VER = 0x2f,
-+	MCU_WA_PARAM_RED_CONFIG = 0x40,
- };
- 
- enum mcu_mmps_mode {
-@@ -919,6 +920,7 @@ enum {
- 	UNI_VOW_DRR_CTRL,
- 	UNI_VOW_RX_AT_AIRTIME_EN = 0x0b,
- 	UNI_VOW_RX_AT_AIRTIME_CLR_EN = 0x0e,
-+	UNI_VOW_RED_ENABLE = 0x18,
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 2227c08a..b0eb5d91 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -352,6 +352,7 @@ struct mt7996_phy {
- 	bool has_aux_rx;
- 
- 	struct mt7996_scs_ctrl scs_ctrl;
-+	u32 red_drop;
- 
- 	u8 muru_onoff;
- 
-@@ -718,6 +719,7 @@ int mt7996_mcu_rf_regval(struct mt7996_dev *dev, u32 regidx, u32 *val, bool set)
- int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans);
- int mt7996_mcu_set_rro(struct mt7996_dev *dev, u16 tag, u16 val);
- int mt7996_mcu_wa_cmd(struct mt7996_dev *dev, int cmd, u32 a1, u32 a2, u32 a3);
-+int mt7996_mcu_red_config(struct mt7996_dev *dev, bool enable);
- int mt7996_mcu_fw_log_2_host(struct mt7996_dev *dev, u8 type, u8 ctrl);
- int mt7996_mcu_fw_dbg_ctrl(struct mt7996_dev *dev, u32 module, u8 level);
- int mt7996_mcu_trigger_assert(struct mt7996_dev *dev);
-@@ -891,11 +893,12 @@ void mt7996_mcu_set_ppdu_tx_type(struct mt7996_phy *phy, u8 ppdu_type);
- void mt7996_mcu_set_nusers_ofdma(struct mt7996_phy *phy, u8 type, u8 ofdma_user_cnt);
- void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type);
- void mt7996_tm_update_channel(struct mt7996_phy *phy);
-+
-+int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
- int mt7996_dma_rro_init(struct mt7996_dev *dev);
- #endif /* CONFIG_NET_MEDIATEK_SOC_WED */
- 
--
- #endif
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index c4cdbcdc..03f88780 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -3015,6 +3015,27 @@ static int mt7996_muru_prot_thr_set(void *data, u64 val)
- DEFINE_DEBUGFS_ATTRIBUTE(fops_muru_prot_thr, NULL,
- 			 mt7996_muru_prot_thr_set, "%lld\n");
- 
-+static int
-+mt7996_red_config_set(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	return mt7996_mcu_red_config(dev, !!val);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_red_config, NULL,
-+			 mt7996_red_config_set, "%lld\n");
-+
-+static int
-+mt7996_vow_drr_dbg(void *data, u64 val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	return mt7996_mcu_set_vow_drr_dbg(dev, (u32)val);
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_vow_drr_dbg, NULL,
-+			 mt7996_vow_drr_dbg, "%lld\n");
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -3092,6 +3113,8 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 				    mt7996_wtbl_read);
- 
- 	debugfs_create_devm_seqfile(dev->mt76.dev, "token", dir, mt7996_token_read);
-+	debugfs_create_file("red", 0200, dir, dev, &fops_red_config);
-+	debugfs_create_file("vow_drr_dbg", 0200, dir, dev, &fops_vow_drr_dbg);
- 
- 	debugfs_create_u8("sku_disable", 0600, dir, &dev->dbg.sku_disable);
- 	debugfs_create_file("scs_enable", 0200, dir, phy, &fops_scs_enable);
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index f70bd0be..9a6636fd 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -1254,4 +1254,30 @@ void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type)
- 			  sizeof(req), false);
- }
- 
-+int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val)
-+{
-+#define MT7996_VOW_DEBUG_MODE	0xe
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 __rsv2[4];
-+		__le32 action;
-+		__le32 val;
-+		u8 __rsv3[8];
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_VOW_DRR_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.action = cpu_to_le32(MT7996_VOW_DEBUG_MODE),
-+		.val = cpu_to_le32(val),
-+	};
-+
-+	if (val & ~VOW_DRR_DBG_FLAGS)
-+		return -EINVAL;
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(VOW), &req,
-+				 sizeof(req), true);
-+}
-+
- #endif
-diff --git a/mt7996/mtk_mcu.h b/mt7996/mtk_mcu.h
-index 252ae98e..1568f10e 100644
---- a/mt7996/mtk_mcu.h
-+++ b/mt7996/mtk_mcu.h
-@@ -1035,6 +1035,30 @@ enum muru_vendor_ctrl {
- 	MU_CTRL_DL_USER_CNT,
- 	MU_CTRL_UL_USER_CNT,
- };
-+
-+enum {
-+	VOW_DRR_DBG_DUMP_BMP = BIT(0),
-+	VOW_DRR_DBG_EST_AT_PRINT = BIT(1),
-+	VOW_DRR_DBG_ADJ_GLOBAL_THLD = BIT(21),
-+	VOW_DRR_DBG_PRN_LOUD = BIT(22),
-+	VOW_DRR_DBG_PRN_ADJ_STA = BIT(23),
-+	VOW_DRR_DBG_FIX_CR = GENMASK(27, 24),
-+	VOW_DRR_DBG_CLR_FIX_CR = BIT(28),
-+	VOW_DRR_DBG_DISABLE = BIT(29),
-+	VOW_DRR_DBG_DUMP_CR = BIT(30),
-+	VOW_DRR_DBG_PRN = BIT(31)
-+};
-+
-+#define VOW_DRR_DBG_FLAGS (VOW_DRR_DBG_DUMP_BMP |	\
-+			  VOW_DRR_DBG_EST_AT_PRINT |	\
-+			  VOW_DRR_DBG_ADJ_GLOBAL_THLD |	\
-+			  VOW_DRR_DBG_PRN_LOUD |	\
-+			  VOW_DRR_DBG_PRN_ADJ_STA |	\
-+			  VOW_DRR_DBG_FIX_CR |		\
-+			  VOW_DRR_DBG_CLR_FIX_CR |	\
-+			  VOW_DRR_DBG_DISABLE |		\
-+			  VOW_DRR_DBG_DUMP_CR |		\
-+			  VOW_DRR_DBG_PRN)
- #endif
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2004-mtk-wifi-mt76-mt7996-reset-addr_elem-when-delete-ba.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2004-mtk-wifi-mt76-mt7996-reset-addr_elem-when-delete-ba.patch
deleted file mode 100644
index 4f0a133..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2004-mtk-wifi-mt76-mt7996-reset-addr_elem-when-delete-ba.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 240627635f05c66751095e95a1265feb99be8224 Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Thu, 18 May 2023 15:01:47 +0800
-Subject: [PATCH 2004/2032] mtk: wifi: mt76: mt7996: reset addr_elem when
- delete ba
-
-The old addr element info may be used when the signature is not equel to
-0xff, and sta will find error SDP cause the SDP/SDL=0 issue.
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
-
-1. without this patch will delete wrong session id when delete ba.
-Due to fw change the cmd format.
-https://gerrit.mediatek.inc/c/neptune/firmware/bora/wifi/custom/+/7969193
-
-Signed-off-by: mtk27745 <rex.lu@mediatek.com>
----
- mt76.h       |  1 +
- mt7996/mcu.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 47 insertions(+)
-
-diff --git a/mt76.h b/mt76.h
-index 878553a2..17418e86 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -439,6 +439,7 @@ struct mt76_rx_tid {
- 	u16 nframes;
- 
- 	u8 num;
-+	u16 session_id;
- 
- 	u8 started:1, stopped:1, timer_pending:1;
- 
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 4fa399bc..a2604192 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -298,6 +298,52 @@ struct mt7996_mcu_thermal_notify {
- 	u8 __rsv2[4];
- } __packed;
- 
-+struct mt7996_mcu_rro_event {
-+	struct mt7996_mcu_rxd rxd;
-+
-+	u8 __rsv1[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+} __packed;
-+
-+struct mt7996_mcu_rro_ba {
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 wlan_id;
-+	u8 tid;
-+	u8 __rsv1;
-+	__le32 status;
-+	__le16 session_id;
-+	u8 __rsv2[2];
-+} __packed;
-+
-+struct mt7996_mcu_rro_ba_del_chk_done {
-+	__le16 tag;
-+	__le16 len;
-+
-+	__le16 session_id;
-+	__le16 mld_id;
-+	u8 tid;
-+	u8 __rsv[3];
-+} __packed;
-+
-+enum  {
-+	UNI_RRO_BA_SESSION_STATUS = 0,
-+	UNI_RRO_BA_SESSION_TBL	= 1,
-+	UNI_RRO_BA_SESSION_DEL_CHK_DONE = 2,
-+	UNI_RRO_BA_SESSION_MAX_NUM
-+};
-+
-+struct mt7996_mcu_rro_del_ba {
-+	struct mt7996_mcu_rro_event event;
-+
-+	u8  wlan_idx;
-+	u8  tid;
-+	u8 __rsv2[2];
-+};
-+
- enum mt7996_chan_mib_offs {
- 	UNI_MIB_OBSS_AIRTIME = 26,
- 	UNI_MIB_NON_WIFI_TIME = 27,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2005-mtk-wifi-mt76-wed-change-pcie0-R5-to-pcie1-to-get-6G.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2005-mtk-wifi-mt76-wed-change-pcie0-R5-to-pcie1-to-get-6G.patch
deleted file mode 100644
index 14c8084..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2005-mtk-wifi-mt76-wed-change-pcie0-R5-to-pcie1-to-get-6G.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 57ec71ee33dacaf5050f535fc83ce0497c141b33 Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Fri, 6 Oct 2023 14:01:41 +0800
-Subject: [PATCH 2005/2032] mtk: wifi: mt76: wed: change pcie0 R5 to pcie1 to
- get 6G ICS
-
----
- mt7996/dma.c  | 4 ++++
- mt7996/init.c | 6 ++----
- mt7996/mmio.c | 5 ++++-
- 3 files changed, 10 insertions(+), 5 deletions(-)
-
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index 759a58e8..5d85e9ea 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -538,6 +538,10 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 	if (mt7996_band_valid(dev, MT_BAND2)) {
- 		/* rx data queue for mt7996 band2 */
- 		rx_base = MT_RXQ_RING_BASE(MT_RXQ_BAND2) + hif1_ofs;
-+		if (mtk_wed_device_active(wed_hif2) && mtk_wed_get_rx_capa(wed_hif2)) {
-+			dev->mt76.q_rx[MT_RXQ_BAND2].flags = MT_WED_Q_RX(0);
-+			dev->mt76.q_rx[MT_RXQ_BAND2].wed = wed_hif2;
-+		}
- 		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND2],
- 				       MT_RXQ_ID(MT_RXQ_BAND2),
- 				       MT7996_RX_RING_SIZE,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 20415e3c..aedf4edc 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -638,10 +638,8 @@ static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy,
- 		goto error;
- 
- 	if (wed == &dev->mt76.mmio.wed_hif2 && mtk_wed_device_active(wed)) {
--		u32 irq_mask = dev->mt76.mmio.irqmask | MT_INT_TX_DONE_BAND2;
--
--		mt76_wr(dev, MT_INT1_MASK_CSR, irq_mask);
--		mtk_wed_device_start(&dev->mt76.mmio.wed_hif2, irq_mask);
-+		mt76_wr(dev, MT_INT_PCIE1_MASK_CSR, MT_INT_TX_RX_DONE_EXT);
-+		mtk_wed_device_start(&dev->mt76.mmio.wed_hif2, MT_INT_TX_RX_DONE_EXT);
- 	}
- 
- 	return 0;
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index 367a204d..44e64f86 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -527,12 +527,15 @@ static void mt7996_irq_tasklet(struct tasklet_struct *t)
- 					       dev->mt76.mmio.irqmask);
- 		if (intr1 & MT_INT_RX_TXFREE_EXT)
- 			napi_schedule(&dev->mt76.napi[MT_RXQ_TXFREE_BAND2]);
-+
-+		if (intr1 & MT_INT_RX_DONE_BAND2_EXT)
-+			napi_schedule(&dev->mt76.napi[MT_RXQ_BAND2]);
- 	}
- 
- 	if (mtk_wed_device_active(wed)) {
- 		mtk_wed_device_irq_set_mask(wed, 0);
- 		intr = mtk_wed_device_irq_get(wed, dev->mt76.mmio.irqmask);
--		intr |= (intr1 & ~MT_INT_RX_TXFREE_EXT);
-+		intr |= (intr1 & ~MT_INT_TX_RX_DONE_EXT);
- 	} else {
- 		mt76_wr(dev, MT_INT_MASK_CSR, 0);
- 		if (dev->hif2)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2006-mtk-wifi-mt76-add-SER-support-for-wed3.0.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2006-mtk-wifi-mt76-add-SER-support-for-wed3.0.patch
deleted file mode 100644
index 99ac2f6..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2006-mtk-wifi-mt76-add-SER-support-for-wed3.0.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 6cf957f7acc9124acdb7b231b54e98d305b968f3 Mon Sep 17 00:00:00 2001
-From: mtk27745 <rex.lu@mediatek.com>
-Date: Tue, 23 May 2023 12:06:29 +0800
-Subject: [PATCH 2006/2032] mtk: wifi: mt76: add SER support for wed3.0
-
----
- dma.c         | 5 +++--
- mt7996/mmio.c | 1 +
- 2 files changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index c54187bd..e5be891c 100644
---- a/dma.c
-+++ b/dma.c
-@@ -834,8 +834,9 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
- 
- 	/* reset WED rx queues */
- 	mt76_wed_dma_setup(dev, q, true);
--
--	if (!mt76_queue_is_wed_tx_free(q)) {
-+	if (!mt76_queue_is_wed_tx_free(q) &&
-+	    !(mt76_queue_is_wed_rro(q) &&
-+	    mtk_wed_device_active(&dev->mmio.wed))) {
- 		mt76_dma_sync_idx(dev, q);
- 		mt76_dma_rx_fill(dev, q, false);
- 	}
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index 44e64f86..92ae5138 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -297,6 +297,7 @@ out:
- 
- 	return ret;
- }
-+
- #endif
- 
- int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2007-mtk-wifi-mt76-mt7915-wed-find-rx-token-by-physical-a.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2007-mtk-wifi-mt76-mt7915-wed-find-rx-token-by-physical-a.patch
deleted file mode 100644
index daaace2..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2007-mtk-wifi-mt76-mt7915-wed-find-rx-token-by-physical-a.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From cbe204fc70c0aebce3a42cfc314ef0c5bd8a16cf Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Wed, 19 Jul 2023 10:55:09 +0800
-Subject: [PATCH 2007/2032] mtk: wifi: mt76: mt7915: wed: find rx token by
- physical address
-
-The token id in RxDMAD may be incorrect when it is not the last frame due to
-WED HW bug. Lookup correct token id by physical address in sdp0.
-Add len == 0 check to drop garbage frames
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
----
- dma.c | 27 +++++++++++++++++++++++++--
- 1 file changed, 25 insertions(+), 2 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index e5be891c..1021b3e5 100644
---- a/dma.c
-+++ b/dma.c
-@@ -446,9 +446,32 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
- 	mt76_dma_should_drop_buf(drop, ctrl, buf1, desc_info);
- 
- 	if (mt76_queue_is_wed_rx(q)) {
-+		u32 id, find = 0;
- 		u32 token = FIELD_GET(MT_DMA_CTL_TOKEN, buf1);
--		struct mt76_rxwi_cache *r = mt76_rx_token_release(dev, token);
-+		struct mt76_rxwi_cache *r;
-+
-+		if (*more) {
-+			spin_lock_bh(&dev->rx_token_lock);
-+
-+			idr_for_each_entry(&dev->rx_token, r, id) {
-+				if (r->dma_addr == le32_to_cpu(desc->buf0)) {
-+					find = 1;
-+					token = id;
-+
-+					/* Write correct id back to DMA*/
-+					u32p_replace_bits(&buf1, id,
-+							  MT_DMA_CTL_TOKEN);
-+					WRITE_ONCE(desc->buf1, cpu_to_le32(buf1));
-+					break;
-+				}
-+			}
- 
-+			spin_unlock_bh(&dev->rx_token_lock);
-+			if (!find)
-+				return NULL;
-+		}
-+
-+		r = mt76_rx_token_release(dev, token);
- 		if (!r)
- 			return NULL;
- 
-@@ -902,7 +925,7 @@ mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
- 		if (!data)
- 			break;
- 
--		if (drop)
-+		if (drop || (len == 0))
- 			goto free_frag;
- 
- 		if (q->rx_head)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2008-mtk-wifi-mt76-mt7996-add-dma-mask-limitation.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2008-mtk-wifi-mt76-mt7996-add-dma-mask-limitation.patch
deleted file mode 100644
index 8075e12..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2008-mtk-wifi-mt76-mt7996-add-dma-mask-limitation.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 51238985cbb77e8955cc727e6f3853b53c9c088d Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Thu, 20 Jul 2023 10:25:50 +0800
-Subject: [PATCH 2008/2032] mtk: wifi: mt76: mt7996: add dma mask limitation
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
----
- dma.c | 4 ++--
- wed.c | 4 ++--
- 2 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index 1021b3e5..da21f641 100644
---- a/dma.c
-+++ b/dma.c
-@@ -488,7 +488,7 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
- 		} else {
- 			struct mt76_queue_buf qbuf;
- 
--			buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC);
-+			buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC | GFP_DMA32);
- 			if (!buf)
- 				return NULL;
- 
-@@ -711,7 +711,7 @@ int mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q,
- 		if (mt76_queue_is_wed_rro_ind(q))
- 			goto done;
- 
--		buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC);
-+		buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC | GFP_DMA32);
- 		if (!buf)
- 			break;
- 
-diff --git a/wed.c b/wed.c
-index 0a0b5c05..1c6d53c8 100644
---- a/wed.c
-+++ b/wed.c
-@@ -65,14 +65,14 @@ u32 mt76_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
- 	for (i = 0; i < size; i++) {
- 		struct mt76_rxwi_cache *r = mt76_get_rxwi(dev);
- 		dma_addr_t addr;
--		struct page *page;
- 		int token;
- 		void *ptr;
- 
- 		if (!r)
- 			goto unmap;
- 
--		ptr = page_frag_alloc(&wed->rx_buf_ring.rx_page, length, GFP_ATOMIC);
-+		ptr = page_frag_alloc(&wed->rx_buf_ring.rx_page, length,
-+				      GFP_ATOMIC | GFP_DMA32);
- 		if (!ptr) {
- 			mt76_put_rxwi(dev, r);
- 			goto unmap;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2009-mtk-wifi-mt76-mt7996-add-per-bss-statistic-info.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2009-mtk-wifi-mt76-mt7996-add-per-bss-statistic-info.patch
deleted file mode 100644
index d38058c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2009-mtk-wifi-mt76-mt7996-add-per-bss-statistic-info.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From f2dfba0451106438a4cb312552b95da9a0857c68 Mon Sep 17 00:00:00 2001
-From: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
-Date: Fri, 18 Aug 2023 10:17:08 +0800
-Subject: [PATCH 2009/2032] mtk: wifi: mt76: mt7996: add per bss statistic info
-
-Whenever WED is enabled, unicast traffic might run through HW path.
-As a result, we need to count them using WM event.
-Broadcast and multicast traffic on the other hand, will be counted in mac80211
-as they always go through SW path and thus mac80211 can always see and count them.
-
-|         | Tx                             | Rx                        |
-|---------|--------------------------------|---------------------------|
-| Unicast | mt76                           | mt76                      |
-|         | __mt7996_stat_to_netdev()      | __mt7996_stat_to_netdev() |
-|---------|--------------------------------|---------------------------|
-| BMCast  | mac80211                       | mac80211                  |
-|         | __ieee80211_subif_start_xmit() | ieee80211_deliver_skb()   |
----
- mt7996/init.c |  1 +
- mt7996/main.c |  1 +
- mt7996/mcu.c  | 40 +++++++++++++++++++++++++++++++++++-----
- 3 files changed, 37 insertions(+), 5 deletions(-)
-
-diff --git a/mt7996/init.c b/mt7996/init.c
-index aedf4edc..518f70e4 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -390,6 +390,7 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
-+	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_STAS_COUNT);
- 
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION);
- 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
-diff --git a/mt7996/main.c b/mt7996/main.c
-index d314d9fb..e1c107fb 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -251,6 +251,7 @@ static int mt7996_add_interface(struct ieee80211_hw *hw,
- 	mvif->sta.wcid.phy_idx = band_idx;
- 	mvif->sta.wcid.hw_key_idx = -1;
- 	mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
-+	mvif->sta.vif = mvif;
- 	mt76_wcid_init(&mvif->sta.wcid);
- 
- 	mt7996_mac_wtbl_update(dev, idx,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index be21dd62..479eee0e 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -521,6 +521,27 @@ mt7996_mcu_update_tx_gi(struct rate_info *rate, struct all_sta_trx_rate *mcu_rat
- 	return 0;
- }
- 
-+static inline void __mt7996_stat_to_netdev(struct mt76_phy *mphy,
-+					   struct mt76_wcid *wcid,
-+					   u32 tx_bytes, u32 rx_bytes,
-+					   u32 tx_packets, u32 rx_packets)
-+{
-+	struct mt7996_sta *msta;
-+	struct ieee80211_vif *vif;
-+	struct wireless_dev *wdev;
-+
-+	if (wiphy_ext_feature_isset(mphy->hw->wiphy,
-+				    NL80211_EXT_FEATURE_STAS_COUNT)) {
-+		msta = container_of(wcid, struct mt7996_sta, wcid);
-+		vif = container_of((void *)msta->vif, struct ieee80211_vif,
-+				   drv_priv);
-+		wdev = ieee80211_vif_to_wdev(vif);
-+
-+		dev_sw_netstats_tx_add(wdev->netdev, tx_packets, tx_bytes);
-+		dev_sw_netstats_rx_add(wdev->netdev, rx_packets, rx_bytes);
-+	}
-+}
-+
- static void
- mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- {
-@@ -536,7 +557,7 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 		u16 wlan_idx;
- 		struct mt76_wcid *wcid;
- 		struct mt76_phy *mphy;
--		u32 tx_bytes, rx_bytes;
-+		u32 tx_bytes, rx_bytes, tx_packets, rx_packets;
- 
- 		switch (le16_to_cpu(res->tag)) {
- 		case UNI_ALL_STA_TXRX_RATE:
-@@ -564,6 +585,9 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 				wcid->stats.tx_bytes += tx_bytes;
- 				wcid->stats.rx_bytes += rx_bytes;
- 
-+				__mt7996_stat_to_netdev(mphy, wcid,
-+							tx_bytes, rx_bytes, 0, 0);
-+
- 				ieee80211_tpt_led_trig_tx(mphy->hw, tx_bytes);
- 				ieee80211_tpt_led_trig_rx(mphy->hw, rx_bytes);
- 			}
-@@ -575,10 +599,16 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 			if (!wcid)
- 				break;
- 
--			wcid->stats.tx_packets +=
--				le32_to_cpu(res->msdu_cnt[i].tx_msdu_cnt);
--			wcid->stats.rx_packets +=
--				le32_to_cpu(res->msdu_cnt[i].rx_msdu_cnt);
-+			mphy = mt76_dev_phy(&dev->mt76, wcid->phy_idx);
-+
-+			tx_packets = le32_to_cpu(res->msdu_cnt[i].tx_msdu_cnt);
-+			rx_packets = le32_to_cpu(res->msdu_cnt[i].rx_msdu_cnt);
-+
-+			wcid->stats.tx_packets += tx_packets;
-+			wcid->stats.rx_packets += rx_packets;
-+
-+			__mt7996_stat_to_netdev(mphy, wcid, 0, 0,
-+						tx_packets, rx_packets);
- 			break;
- 		default:
- 			break;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2010-mtk-wifi-mt76-mt7996-do-not-report-netdev-stats-on-m.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2010-mtk-wifi-mt76-mt7996-do-not-report-netdev-stats-on-m.patch
deleted file mode 100644
index 26dc702..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2010-mtk-wifi-mt76-mt7996-do-not-report-netdev-stats-on-m.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 1b648b7fe779a9862e966a27d274ac42c24e4bcd Mon Sep 17 00:00:00 2001
-From: Shayne Chen <shayne.chen@mediatek.com>
-Date: Thu, 26 Oct 2023 17:27:43 +0800
-Subject: [PATCH 2010/2032] mtk: wifi: mt76: mt7996: do not report netdev stats
- on monitor vif
-
-This fixes the following NULL pointer crash when enabling monitor mode:
-[  205.593158] Call trace:
-[  205.595597]  mt7996_mcu_rx_event+0x4a0/0x6e8 [mt7996e]
-[  205.600725]  mt7996_queue_rx_skb+0x6e4/0xfa0 [mt7996e]
-[  205.605851]  mt76_dma_rx_poll+0x384/0x420 [mt76]
-[  205.610459]  __napi_poll+0x38/0x1c0
-[  205.613935]  napi_threaded_poll+0x80/0xe8
-[  205.617934]  kthread+0x124/0x128
-
-Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
----
- mt7996/mcu.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 479eee0e..15644029 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -537,6 +537,9 @@ static inline void __mt7996_stat_to_netdev(struct mt76_phy *mphy,
- 				   drv_priv);
- 		wdev = ieee80211_vif_to_wdev(vif);
- 
-+		if (vif->type == NL80211_IFTYPE_MONITOR)
-+			return;
-+
- 		dev_sw_netstats_tx_add(wdev->netdev, tx_packets, tx_bytes);
- 		dev_sw_netstats_rx_add(wdev->netdev, rx_packets, rx_bytes);
- 	}
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2011-mtk-wifi-mt76-mt7996-add-support-for-HW-ATF.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2011-mtk-wifi-mt76-mt7996-add-support-for-HW-ATF.patch
deleted file mode 100644
index 2db4015..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2011-mtk-wifi-mt76-mt7996-add-support-for-HW-ATF.patch
+++ /dev/null
@@ -1,675 +0,0 @@
-From 655711c39cac51c4b63ec8e32dd79ec362081293 Mon Sep 17 00:00:00 2001
-From: Benjamin Lin <benjamin-jw.lin@mediatek.com>
-Date: Mon, 11 Sep 2023 16:35:15 +0800
-Subject: [PATCH 2011/2032] mtk: wifi: mt76: mt7996: add support for HW-ATF
-
----
- mt7996/debugfs.c |  90 ++++++++++++++++
- mt7996/init.c    |  43 ++++++++
- mt7996/mac.c     |   6 ++
- mt7996/mcu.c     | 265 ++++++++++++++++++++++++++++++++++++++++++-----
- mt7996/mcu.h     |   1 +
- mt7996/mt7996.h  |  96 ++++++++++++++++-
- 6 files changed, 475 insertions(+), 26 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 01f98b2e..8e4ceeeb 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -935,6 +935,91 @@ DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_muru_disable,
- 			 mt7996_fw_debug_muru_disable_get,
- 			 mt7996_fw_debug_muru_disable_set, "%lld\n");
- 
-+static int
-+mt7996_vow_info_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	struct mt7996_vow_ctrl *vow = &dev->vow;
-+	int i;
-+
-+	seq_printf(s, "VoW ATF Configuration:\n");
-+	seq_printf(s, "ATF: %s\n", vow->atf_enable ? "enabled" : "disabled");
-+	seq_printf(s, "WATF: %s\n", vow->watf_enable ? "enabled" : "disabled");
-+	seq_printf(s, "Airtime Quantums (unit: 256 us)\n");
-+	for (i = 0; i < VOW_DRR_QUANTUM_NUM; ++i)
-+		seq_printf(s, "\tL%d: %hhu\n", i, vow->drr_quantum[i]);
-+	seq_printf(s, "Max Airtime Deficit: %hhu (unit: 256 us)\n", vow->max_deficit);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_atf_enable_get(void *data, u64 *val)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	*val = phy->dev->vow.atf_enable;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_atf_enable_set(void *data, u64 val)
-+{
-+	struct mt7996_phy *phy = data;
-+	struct mt7996_vow_ctrl *vow = &phy->dev->vow;
-+	int ret;
-+
-+	vow->max_deficit = val ? 64 : 1;
-+	ret = mt7996_mcu_set_vow_drr_ctrl(phy, NULL, VOW_DRR_CTRL_AIRTIME_DEFICIT_BOUND);
-+	if (ret)
-+		return ret;
-+
-+	vow->atf_enable = !!val;
-+	return mt7996_mcu_set_vow_feature_ctrl(phy);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_atf_enable, mt7996_atf_enable_get,
-+	                 mt7996_atf_enable_set, "%llu\n");
-+
-+static int
-+mt7996_airtime_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	struct mt76_dev *mdev = &dev->mt76;
-+	struct mt7996_vow_sta_ctrl *vow;
-+	struct ieee80211_sta *sta;
-+	struct mt7996_sta *msta;
-+	struct mt76_wcid *wcid;
-+	struct mt76_vif *vif;
-+	u64 airtime;
-+	u16 i;
-+
-+	seq_printf(s, "VoW Airtime Information:\n");
-+	rcu_read_lock();
-+	for (i = 1; i < MT7996_WTBL_STA; ++i) {
-+		wcid = rcu_dereference(mdev->wcid[i]);
-+		if (!wcid || !wcid->sta)
-+			continue;
-+
-+		msta = container_of(wcid, struct mt7996_sta, wcid);
-+		sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
-+		vow = &msta->vow;
-+		vif = &msta->vif->mt76;
-+
-+		spin_lock_bh(&vow->lock);
-+		airtime = vow->tx_airtime;
-+		vow->tx_airtime = 0;
-+		spin_unlock_bh(&vow->lock);
-+
-+		seq_printf(s, "%pM WCID: %hu BandIdx: %hhu OmacIdx: 0x%hhx\tTxAirtime: %llu\n",
-+		           sta->addr, i, vif->band_idx, vif->omac_idx, airtime);
-+	}
-+	rcu_read_unlock();
-+
-+	return 0;
-+}
-+
- int mt7996_init_debugfs(struct mt7996_phy *phy)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -962,6 +1047,11 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
- 				    mt7996_twt_stats);
- 	debugfs_create_file("rf_regval", 0600, dir, dev, &fops_rf_regval);
- 	debugfs_create_file("otp", 0400, dir, dev, &mt7996_efuse_ops);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "vow_info", dir,
-+	                            mt7996_vow_info_read);
-+	debugfs_create_file("atf_enable", 0600, dir, phy, &fops_atf_enable);
-+	debugfs_create_devm_seqfile(dev->mt76.dev, "airtime", dir,
-+	                            mt7996_airtime_read);
- 
- 	if (phy->mt76->cap.has_5ghz) {
- 		debugfs_create_u32("dfs_hw_pattern", 0400, dir,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 518f70e4..b902bcc5 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -562,6 +562,37 @@ int mt7996_txbf_init(struct mt7996_dev *dev)
- 	return mt7996_mcu_set_txbf(dev, BF_HW_EN_UPDATE);
- }
- 
-+static int mt7996_vow_init(struct mt7996_phy *phy)
-+{
-+	struct mt7996_vow_ctrl *vow = &phy->dev->vow;
-+	int ret;
-+
-+	vow->atf_enable = true;
-+	vow->watf_enable = false;
-+	vow->max_deficit = 64;
-+	vow->sch_type = VOW_SCH_TYPE_FOLLOW_POLICY;
-+	vow->sch_policy = VOW_SCH_POLICY_SRR;
-+
-+	vow->drr_quantum[0] = VOW_DRR_QUANTUM_L0;
-+	vow->drr_quantum[1] = VOW_DRR_QUANTUM_L1;
-+	vow->drr_quantum[2] = VOW_DRR_QUANTUM_L2;
-+	vow->drr_quantum[3] = VOW_DRR_QUANTUM_L3;
-+	vow->drr_quantum[4] = VOW_DRR_QUANTUM_L4;
-+	vow->drr_quantum[5] = VOW_DRR_QUANTUM_L5;
-+	vow->drr_quantum[6] = VOW_DRR_QUANTUM_L6;
-+	vow->drr_quantum[7] = VOW_DRR_QUANTUM_L7;
-+
-+	ret = mt7996_mcu_set_vow_drr_ctrl(phy, NULL, VOW_DRR_CTRL_AIRTIME_DEFICIT_BOUND);
-+	if (ret)
-+		return ret;
-+
-+	ret = mt7996_mcu_set_vow_drr_ctrl(phy, NULL, VOW_DRR_CTRL_AIRTIME_QUANTUM_ALL);
-+	if (ret)
-+		return ret;
-+
-+	return mt7996_mcu_set_vow_feature_ctrl(phy);
-+}
-+
- static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy,
- 			       enum mt76_band_id band)
- {
-@@ -634,6 +665,12 @@ static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy,
- 	if (ret)
- 		goto error;
- 
-+	if (mt7996_vow_should_enable(dev)) {
-+		ret = mt7996_vow_init(phy);
-+		if (ret)
-+			goto error;
-+	}
-+
- 	ret = mt7996_init_debugfs(phy);
- 	if (ret)
- 		goto error;
-@@ -1440,6 +1477,12 @@ int mt7996_register_device(struct mt7996_dev *dev)
- 
- 	dev->recovery.hw_init_done = true;
- 
-+	if (mt7996_vow_should_enable(dev)) {
-+		ret = mt7996_vow_init(&dev->phy);
-+		if (ret)
-+			goto error;
-+	}
-+
- 	ret = mt7996_init_debugfs(&dev->phy);
- 	if (ret)
- 		goto error;
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 64cec164..8de4ab9a 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -103,6 +103,7 @@ static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
- 	};
- 	struct ieee80211_sta *sta;
- 	struct mt7996_sta *msta;
-+	struct mt7996_vow_sta_ctrl *vow;
- 	u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
- 	LIST_HEAD(sta_poll_list);
- 	int i;
-@@ -161,6 +162,7 @@ static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
- 
- 		sta = container_of((void *)msta, struct ieee80211_sta,
- 				   drv_priv);
-+		vow = &msta->vow;
- 		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
- 			u8 q = mt76_connac_lmac_mapping(i);
- 			u32 tx_cur = tx_time[q];
-@@ -171,6 +173,10 @@ static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
- 				continue;
- 
- 			ieee80211_sta_register_airtime(sta, tid, tx_cur, rx_cur);
-+
-+			spin_lock_bh(&vow->lock);
-+			vow->tx_airtime += tx_cur;
-+			spin_unlock_bh(&vow->lock);
- 		}
- 
- 		/* get signal strength of resp frames (CTS/BA/ACK) */
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 15644029..a907e667 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -2223,34 +2223,37 @@ int mt7996_mcu_add_rate_ctrl(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- }
- 
- static int
--mt7996_mcu_add_group(struct mt7996_dev *dev, struct ieee80211_vif *vif,
--		     struct ieee80211_sta *sta)
-+mt7996_mcu_sta_init_vow(struct mt7996_phy *phy, struct mt7996_sta *msta)
- {
--#define MT_STA_BSS_GROUP		1
--	struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
--	struct mt7996_sta *msta;
--	struct {
--		u8 __rsv1[4];
-+	struct mt7996_vow_sta_ctrl *vow = &msta->vow;
-+	u8 omac_idx = msta->vif->mt76.omac_idx;
-+	int ret;
- 
--		__le16 tag;
--		__le16 len;
--		__le16 wlan_idx;
--		u8 __rsv2[2];
--		__le32 action;
--		__le32 val;
--		u8 __rsv3[8];
--	} __packed req = {
--		.tag = cpu_to_le16(UNI_VOW_DRR_CTRL),
--		.len = cpu_to_le16(sizeof(req) - 4),
--		.action = cpu_to_le32(MT_STA_BSS_GROUP),
--		.val = cpu_to_le32(mvif->mt76.idx % 16),
--	};
-+	/* Assignment of STA BSS group index aligns FW.
-+	 * Each band has its own BSS group bitmap space.
-+	 * 0: BSS 0
-+	 * 4..18: BSS 0x11..0x1f
-+	 */
-+	vow->bss_grp_idx = (omac_idx <= HW_BSSID_MAX)
-+	                   ? omac_idx
-+	                   : HW_BSSID_MAX + omac_idx - EXT_BSSID_START;
-+	vow->paused = false;
-+	vow->drr_quantum[IEEE80211_AC_VO] = VOW_DRR_QUANTUM_IDX0;
-+	vow->drr_quantum[IEEE80211_AC_VI] = VOW_DRR_QUANTUM_IDX1;
-+	vow->drr_quantum[IEEE80211_AC_BE] = VOW_DRR_QUANTUM_IDX2;
-+	vow->drr_quantum[IEEE80211_AC_BK] = VOW_DRR_QUANTUM_IDX2;
-+	vow->tx_airtime = 0;
-+	spin_lock_init(&vow->lock);
-+
-+	ret = mt7996_mcu_set_vow_drr_ctrl(phy, msta, VOW_DRR_CTRL_STA_BSS_GROUP);
-+	if (ret)
-+		return ret;
- 
--	msta = sta ? (struct mt7996_sta *)sta->drv_priv : &mvif->sta;
--	req.wlan_idx = cpu_to_le16(msta->wcid.idx);
-+	ret = mt7996_mcu_set_vow_drr_ctrl(phy, msta, VOW_DRR_CTRL_STA_PAUSE);
-+	if (ret)
-+		return ret;
- 
--	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(VOW), &req,
--				 sizeof(req), true);
-+	return mt7996_mcu_set_vow_drr_ctrl(phy, msta, VOW_DRR_CTRL_STA_ALL);
- }
- 
- int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
-@@ -2306,7 +2309,7 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
- 		mt7996_mcu_sta_bfee_tlv(dev, skb, vif, sta);
- 	}
- 
--	ret = mt7996_mcu_add_group(dev, vif, sta);
-+	ret = mt7996_mcu_sta_init_vow(mvif->phy, msta);
- 	if (ret) {
- 		dev_kfree_skb(skb);
- 		return ret;
-@@ -5143,6 +5146,218 @@ int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable)
- 				 &req, sizeof(req), false);
- }
- 
-+int mt7996_mcu_set_vow_drr_ctrl(struct mt7996_phy *phy, struct mt7996_sta *msta,
-+	                        enum vow_drr_ctrl_id id)
-+{
-+	struct mt7996_vow_sta_ctrl *vow = msta ? &msta->vow : NULL;
-+	u32 val = 0;
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		__le16 wlan_idx;
-+		u8 band_idx;
-+		u8 wmm_idx;
-+		__le32 ctrl_id;
-+
-+		union {
-+			__le32 val;
-+			u8 drr_quantum[VOW_DRR_QUANTUM_NUM];
-+		};
-+
-+		u8 __rsv2[3];
-+		u8 omac_idx;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_VOW_DRR_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.wlan_idx = cpu_to_le16(msta ? msta->wcid.idx : 0),
-+		.band_idx = phy->mt76->band_idx,
-+		.wmm_idx = msta ? msta->vif->mt76.wmm_idx : 0,
-+		.ctrl_id = cpu_to_le32(id),
-+		.omac_idx = msta ? msta->vif->mt76.omac_idx : 0
-+	};
-+
-+	switch (id) {
-+	case VOW_DRR_CTRL_STA_ALL:
-+		val |= FIELD_PREP(MT7996_DRR_STA_BSS_GRP_MASK, vow->bss_grp_idx);
-+		val |= FIELD_PREP(MT7996_DRR_STA_AC0_QNTM_MASK, vow->drr_quantum[IEEE80211_AC_BK]);
-+		val |= FIELD_PREP(MT7996_DRR_STA_AC1_QNTM_MASK, vow->drr_quantum[IEEE80211_AC_BE]);
-+		val |= FIELD_PREP(MT7996_DRR_STA_AC2_QNTM_MASK, vow->drr_quantum[IEEE80211_AC_VI]);
-+		val |= FIELD_PREP(MT7996_DRR_STA_AC3_QNTM_MASK, vow->drr_quantum[IEEE80211_AC_VO]);
-+		req.val = cpu_to_le32(val);
-+		break;
-+	case VOW_DRR_CTRL_STA_BSS_GROUP:
-+		req.val = cpu_to_le32(vow->bss_grp_idx);
-+		break;
-+	case VOW_DRR_CTRL_AIRTIME_DEFICIT_BOUND:
-+		req.val = cpu_to_le32(phy->dev->vow.max_deficit);
-+		break;
-+	case VOW_DRR_CTRL_AIRTIME_QUANTUM_ALL:
-+		memcpy(req.drr_quantum, phy->dev->vow.drr_quantum, VOW_DRR_QUANTUM_NUM);
-+		break;
-+	case VOW_DRR_CTRL_STA_PAUSE:
-+		req.val = cpu_to_le32(vow->paused);
-+		break;
-+	default:
-+		dev_err(phy->dev->mt76.dev, "Unknown VoW DRR Control ID: %u\n", id);
-+		return -EINVAL;
-+	}
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(VOW),
-+	                         &req, sizeof(req), true);
-+}
-+
-+int mt7996_mcu_set_vow_feature_ctrl(struct mt7996_phy *phy)
-+{
-+	struct mt7996_vow_ctrl *vow = &phy->dev->vow;
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		/* DW0 */
-+		__le16 apply_bwc_enable_per_grp;
-+		__le16 apply_bwc_refill_period		: 1;
-+		__le16 __rsv2				: 3;
-+		__le16 apply_band1_search_rule		: 1;
-+		__le16 apply_band0_search_rule		: 1;
-+		__le16 __rsv3				: 3;
-+		__le16 apply_watf_enable		: 1;
-+		__le16 __rsv4				: 2;
-+		__le16 apply_grp_no_change_in_txop	: 1;
-+		__le16 apply_atf_enable			: 1;
-+		__le16 apply_bwc_token_refill_enable	: 1;
-+		__le16 apply_bwc_enable			: 1;
-+
-+		/* DW1 */
-+		__le16 apply_bwc_check_time_token_per_grp;
-+		__le16 __rsv5;
-+
-+		/* DW2 */
-+		__le16 apply_bwc_check_len_token_per_grp;
-+		__le16 __rsv6;
-+
-+		/* DW3 */
-+		u8 band_idx;
-+		u8 __rsv7[3];
-+
-+		/* DW4 */
-+		__le32 __rsv8;
-+
-+		/* DW5 */
-+		__le16 bwc_enable_per_grp;
-+		__le16 bwc_refill_period	: 3;
-+		__le16 __rsv9			: 1;
-+		__le16 band1_search_rule	: 1;
-+		__le16 band0_search_rule	: 1;
-+		__le16 __rsv10			: 3;
-+		__le16 watf_enable		: 1;
-+		__le16 __rsv11			: 2;
-+		__le16 grp_no_change_in_txop	: 1;
-+		__le16 atf_enable		: 1;
-+		__le16 bwc_token_refill_enable	: 1;
-+		__le16 bwc_enable		: 1;
-+
-+		/* DW6 */
-+		__le16 bwc_check_time_token_per_grp;
-+		__le16 __rsv12;
-+
-+		/* DW7 */
-+		__le16 bwc_check_len_token_per_grp;
-+		__le16 __rsv13;
-+
-+		/* DW8 */
-+		__le32 apply_atf_rts_sta_lock		: 1;
-+		__le32 atf_rts_sta_lock			: 1;
-+		__le32 apply_atf_keep_quantum		: 1;
-+		__le32 atf_keep_quantum			: 1;
-+		__le32 apply_tx_cnt_mode_ctrl		: 1;
-+		__le32 tx_cnt_mode_ctrl			: 4;
-+		__le32 apply_tx_measure_mode_enable	: 1;
-+		__le32 tx_measure_mode_enable		: 1;
-+		__le32 apply_backoff_ctrl		: 1;
-+		__le32 backoff_bound_enable		: 1;
-+		__le32 backoff_bound			: 5;
-+		__le32 apply_atf_rts_fail_charge	: 1;
-+		__le32 atf_rts_fail_charge		: 1;
-+		__le32 apply_zero_eifs			: 1;
-+		__le32 zero_eifs			: 1;
-+		__le32 apply_rx_rifs_enable		: 1;
-+		__le32 rx_rifs_enable			: 1;
-+		__le32 apply_vow_ctrl			: 1;
-+		__le32 vow_ctrl_val			: 1;
-+		__le32 vow_ctrl_bit			: 5;
-+		__le32 __rsv14				: 1;
-+
-+		/* DW9 */
-+		__le32 apply_spl_sta_num	: 1;
-+		__le32 spl_sta_num		: 3;
-+		__le32 dbg_lvl			: 2;
-+		__le32 apply_atf_sch_ctrl	: 1;
-+		__le32 atf_sch_type		: 2;
-+		__le32 atf_sch_policy		: 2;
-+		__le32 __rsv15			: 21;
-+	} __packed req = {
-+		.tag = cpu_to_le16(UNI_VOW_FEATURE_CTRL),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		/* DW0 */
-+		.apply_bwc_enable_per_grp = cpu_to_le16(0xffff),
-+		.apply_bwc_refill_period = true,
-+		.apply_band1_search_rule = true,
-+		.apply_band0_search_rule = true,
-+		.apply_watf_enable = true,
-+		.apply_grp_no_change_in_txop = true,
-+		.apply_atf_enable = true,
-+		.apply_bwc_token_refill_enable = true,
-+		.apply_bwc_enable = true,
-+		/* DW1 */
-+		.apply_bwc_check_time_token_per_grp = cpu_to_le16(0xffff),
-+		/* DW2 */
-+		.apply_bwc_check_len_token_per_grp = cpu_to_le16(0xffff),
-+		/* DW3 */
-+		.band_idx = phy->mt76->band_idx,
-+		/* DW5 */
-+		.bwc_enable_per_grp = cpu_to_le16(0xffff),
-+		.bwc_refill_period = VOW_REFILL_PERIOD_32US,
-+		.band1_search_rule = VOW_SEARCH_WMM_FIRST,
-+		.band0_search_rule = VOW_SEARCH_WMM_FIRST,
-+		.watf_enable = vow->watf_enable,
-+		.grp_no_change_in_txop = true,
-+		.atf_enable = vow->atf_enable,
-+		.bwc_token_refill_enable = true,
-+		.bwc_enable = false,
-+		/* DW6 */
-+		.bwc_check_time_token_per_grp = cpu_to_le16(0x0),
-+		/* DW7 */
-+		.bwc_check_len_token_per_grp = cpu_to_le16(0x0),
-+		/* DW8 */
-+		.apply_atf_rts_sta_lock = false,
-+		.apply_atf_keep_quantum = true,
-+		.atf_keep_quantum = true,
-+		.apply_tx_cnt_mode_ctrl = false,
-+		.apply_tx_measure_mode_enable = false,
-+		.apply_backoff_ctrl = false,
-+		.apply_atf_rts_fail_charge = false,
-+		.apply_zero_eifs = false,
-+		.apply_rx_rifs_enable = false,
-+		.apply_vow_ctrl = true,
-+		.vow_ctrl_val = true,
-+		/* Reset DRR table when SER occurs. */
-+		.vow_ctrl_bit = 26,
-+		/* DW9 */
-+		.apply_spl_sta_num = false,
-+		.dbg_lvl = 0,
-+		.apply_atf_sch_ctrl = true,
-+		.atf_sch_type = vow->sch_type,
-+		.atf_sch_policy = vow->sch_policy
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(VOW),
-+	                         &req, sizeof(req), true);
-+}
-+
- #ifdef CONFIG_MTK_VENDOR
- void mt7996_set_wireless_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
- {
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index a2604192..7b8540f6 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -964,6 +964,7 @@ enum {
- 
- enum {
- 	UNI_VOW_DRR_CTRL,
-+	UNI_VOW_FEATURE_CTRL,
- 	UNI_VOW_RX_AT_AIRTIME_EN = 0x0b,
- 	UNI_VOW_RX_AT_AIRTIME_CLR_EN = 0x0e,
- 	UNI_VOW_RED_ENABLE = 0x18,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b0eb5d91..b1abe42b 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -115,6 +115,12 @@
- #define MT7996_RX_MSDU_PAGE_SIZE	(128 + \
- 					 SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
- 
-+#define MT7996_DRR_STA_BSS_GRP_MASK	GENMASK(5, 0)
-+#define MT7996_DRR_STA_AC0_QNTM_MASK	GENMASK(10, 8)
-+#define MT7996_DRR_STA_AC1_QNTM_MASK	GENMASK(14, 12)
-+#define MT7996_DRR_STA_AC2_QNTM_MASK	GENMASK(18, 16)
-+#define MT7996_DRR_STA_AC3_QNTM_MASK	GENMASK(22, 20)
-+
- struct mt7996_vif;
- struct mt7996_sta;
- struct mt7996_dfs_pulse;
-@@ -216,6 +222,81 @@ enum mt7996_dpd_ch_num {
- 	DPD_CH_NUM_TYPE_MAX,
- };
- 
-+enum {
-+	VOW_SEARCH_AC_FIRST,
-+	VOW_SEARCH_WMM_FIRST
-+};
-+
-+enum {
-+	VOW_REFILL_PERIOD_1US,
-+	VOW_REFILL_PERIOD_2US,
-+	VOW_REFILL_PERIOD_4US,
-+	VOW_REFILL_PERIOD_8US,
-+	VOW_REFILL_PERIOD_16US,
-+	VOW_REFILL_PERIOD_32US,
-+	VOW_REFILL_PERIOD_64US,
-+	VOW_REFILL_PERIOD_128US
-+};
-+
-+/* Default DRR airtime quantum of each level */
-+enum {
-+	VOW_DRR_QUANTUM_L0 = 6,
-+	VOW_DRR_QUANTUM_L1 = 12,
-+	VOW_DRR_QUANTUM_L2 = 16,
-+	VOW_DRR_QUANTUM_L3 = 20,
-+	VOW_DRR_QUANTUM_L4 = 24,
-+	VOW_DRR_QUANTUM_L5 = 28,
-+	VOW_DRR_QUANTUM_L6 = 32,
-+	VOW_DRR_QUANTUM_L7 = 36
-+};
-+
-+enum {
-+	VOW_DRR_QUANTUM_IDX0,
-+	VOW_DRR_QUANTUM_IDX1,
-+	VOW_DRR_QUANTUM_IDX2,
-+	VOW_DRR_QUANTUM_IDX3,
-+	VOW_DRR_QUANTUM_IDX4,
-+	VOW_DRR_QUANTUM_IDX5,
-+	VOW_DRR_QUANTUM_IDX6,
-+	VOW_DRR_QUANTUM_IDX7,
-+	VOW_DRR_QUANTUM_NUM
-+};
-+
-+enum {
-+	VOW_SCH_TYPE_FOLLOW_POLICY,
-+	VOW_SCH_TYPE_FOLLOW_HW
-+};
-+
-+enum {
-+	VOW_SCH_POLICY_SRR, /* Shared Round-Robin */
-+	VOW_SCH_POLICY_WRR /* Weighted Round-Robin */
-+};
-+
-+enum vow_drr_ctrl_id {
-+	VOW_DRR_CTRL_STA_ALL,
-+	VOW_DRR_CTRL_STA_BSS_GROUP,
-+	VOW_DRR_CTRL_AIRTIME_DEFICIT_BOUND = 0x10,
-+	VOW_DRR_CTRL_AIRTIME_QUANTUM_ALL = 0x28,
-+	VOW_DRR_CTRL_STA_PAUSE = 0x30
-+};
-+
-+struct mt7996_vow_ctrl {
-+	bool atf_enable;
-+	bool watf_enable;
-+	u8 drr_quantum[VOW_DRR_QUANTUM_NUM];
-+	u8 max_deficit;
-+	u8 sch_type;
-+	u8 sch_policy;
-+};
-+
-+struct mt7996_vow_sta_ctrl {
-+	bool paused;
-+	u8 bss_grp_idx;
-+	u8 drr_quantum[IEEE80211_NUM_ACS];
-+	u64 tx_airtime;
-+	spinlock_t lock;
-+};
-+
- struct mt7996_sta {
- 	struct mt76_wcid wcid; /* must be first */
- 
-@@ -235,6 +316,8 @@ struct mt7996_sta {
- 		u8 flowid_mask;
- 		struct mt7996_twt_flow flow[MT7996_MAX_STA_TWT_AGRT];
- 	} twt;
-+
-+	struct mt7996_vow_sta_ctrl vow;
- };
- 
- struct mt7996_vif {
-@@ -494,6 +577,7 @@ struct mt7996_dev {
- 
- 	u8 wtbl_size_group;
- 
-+	struct mt7996_vow_ctrl vow;
- #ifdef CONFIG_MTK_DEBUG
- 	u16 wlan_idx;
- 	struct {
-@@ -734,10 +818,12 @@ int mt7996_mcu_apply_tx_dpd(struct mt7996_phy *phy);
- #ifdef CONFIG_NL80211_TESTMODE
- void mt7996_tm_rf_test_event(struct mt7996_dev *dev, struct sk_buff *skb);
- #endif
--int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event);
- int mt7996_mcu_set_scs(struct mt7996_phy *phy, u8 enable);
- void mt7996_mcu_scs_sta_poll(struct work_struct *work);
- int mt7996_mcu_set_band_confg(struct mt7996_phy *phy, u16 option, bool enable);
-+int mt7996_mcu_set_vow_drr_ctrl(struct mt7996_phy *phy, struct mt7996_sta *msta,
-+	                        enum vow_drr_ctrl_id id);
-+int mt7996_mcu_set_vow_feature_ctrl(struct mt7996_phy *phy);
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
-@@ -787,6 +873,14 @@ static inline u16 mt7996_rx_chainmask(struct mt7996_phy *phy)
- 	return tx_chainmask | (BIT(fls(tx_chainmask)) * phy->has_aux_rx);
- }
- 
-+static inline bool
-+mt7996_vow_should_enable(struct mt7996_dev *dev)
-+{
-+	return !wiphy_ext_feature_isset(mt76_hw(dev)->wiphy,
-+	                                NL80211_EXT_FEATURE_AIRTIME_FAIRNESS) ||
-+	       mtk_wed_device_active(&dev->mt76.mmio.wed);
-+}
-+
- void mt7996_mac_init(struct mt7996_dev *dev);
- u32 mt7996_mac_wtbl_lmac_addr(struct mt7996_dev *dev, u16 wcid, u8 dw);
- bool mt7996_mac_wtbl_update(struct mt7996_dev *dev, int idx, u32 mask);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2012-mtk-wifi-mt76-mt7996-wed-add-SER0.5-support-w-wed3.0.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2012-mtk-wifi-mt76-mt7996-wed-add-SER0.5-support-w-wed3.0.patch
deleted file mode 100644
index 7b3e94a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2012-mtk-wifi-mt76-mt7996-wed-add-SER0.5-support-w-wed3.0.patch
+++ /dev/null
@@ -1,397 +0,0 @@
-From 12a52d5e5a8643d0fe1448469d228aeeb85df362 Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Thu, 12 Oct 2023 10:04:54 +0800
-Subject: [PATCH 2012/2032] mtk: wifi: mt76: mt7996: wed: add SER0.5 support w/
- wed3.0
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
----
- dma.c           |   9 ++--
- dma.h           |   4 +-
- mt76.h          |  14 ++++--
- mt792x_dma.c    |   6 +--
- mt7996/dma.c    |  20 ++++++--
- mt7996/init.c   | 127 +++++++++++++++++++++++++++++++-----------------
- mt7996/mac.c    |  25 ++++++++++
- mt7996/mt7996.h |   1 +
- wed.c           |   4 +-
- 9 files changed, 146 insertions(+), 64 deletions(-)
-
-diff --git a/dma.c b/dma.c
-index da21f641..e23b744b 100644
---- a/dma.c
-+++ b/dma.c
-@@ -218,9 +218,9 @@ void __mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q,
- 	mt76_dma_sync_idx(dev, q);
- }
- 
--void mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q)
-+void mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q, bool reset)
- {
--	__mt76_dma_queue_reset(dev, q, true);
-+	__mt76_dma_queue_reset(dev, q, reset);
- }
- 
- static int
-@@ -540,7 +540,8 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
- 	if (!q->queued)
- 		return NULL;
- 
--	if (mt76_queue_is_wed_rro_data(q))
-+	if (mt76_queue_is_wed_rro_data(q) ||
-+	    mt76_queue_is_wed_rro_msdu_pg(q))
- 		return NULL;
- 
- 	if (!mt76_queue_is_wed_rro_ind(q)) {
-@@ -792,7 +793,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
- 			return 0;
- 	}
- 
--	mt76_dma_queue_reset(dev, q);
-+	mt76_dma_queue_reset(dev, q, true);
- 
- 	return 0;
- }
-diff --git a/dma.h b/dma.h
-index 1de5a2b2..3a8c2e55 100644
---- a/dma.h
-+++ b/dma.h
-@@ -83,12 +83,12 @@ int mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q,
- 		     bool allow_direct);
- void __mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q,
- 			    bool reset_idx);
--void mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q);
-+void mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q, bool reset);
- 
- static inline void
- mt76_dma_reset_tx_queue(struct mt76_dev *dev, struct mt76_queue *q)
- {
--	dev->queue_ops->reset_q(dev, q);
-+	dev->queue_ops->reset_q(dev, q, true);
- 	if (mtk_wed_device_active(&dev->mmio.wed))
- 		mt76_wed_dma_setup(dev, q, true);
- }
-diff --git a/mt76.h b/mt76.h
-index 17418e86..6ac8a279 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -296,7 +296,7 @@ struct mt76_queue_ops {
- 
- 	void (*kick)(struct mt76_dev *dev, struct mt76_queue *q);
- 
--	void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q);
-+	void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q, bool reset);
- };
- 
- enum mt76_phy_type {
-@@ -1731,8 +1731,13 @@ static inline bool mt76_queue_is_wed_rro_ind(struct mt76_queue *q)
- static inline bool mt76_queue_is_wed_rro_data(struct mt76_queue *q)
- {
- 	return mt76_queue_is_wed_rro(q) &&
--	       (FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_DATA ||
--		FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_MSDU_PG);
-+	       (FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_DATA);
-+}
-+
-+static inline bool mt76_queue_is_wed_rro_msdu_pg(struct mt76_queue *q)
-+{
-+	return mt76_queue_is_wed_rro(q) &&
-+	       (FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_RRO_Q_MSDU_PG);
- }
- 
- static inline bool mt76_queue_is_wed_rx(struct mt76_queue *q)
-@@ -1741,7 +1746,8 @@ static inline bool mt76_queue_is_wed_rx(struct mt76_queue *q)
- 		return false;
- 
- 	return FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_Q_RX ||
--	       mt76_queue_is_wed_rro_ind(q) || mt76_queue_is_wed_rro_data(q);
-+	       mt76_queue_is_wed_rro_ind(q) || mt76_queue_is_wed_rro_data(q) ||
-+	       mt76_queue_is_wed_rro_msdu_pg(q);
- 
- }
- 
-diff --git a/mt792x_dma.c b/mt792x_dma.c
-index 5cc2d59b..c224bcc8 100644
---- a/mt792x_dma.c
-+++ b/mt792x_dma.c
-@@ -181,13 +181,13 @@ mt792x_dma_reset(struct mt792x_dev *dev, bool force)
- 
- 	/* reset hw queues */
- 	for (i = 0; i < __MT_TXQ_MAX; i++)
--		mt76_queue_reset(dev, dev->mphy.q_tx[i]);
-+		mt76_queue_reset(dev, dev->mphy.q_tx[i], true);
- 
- 	for (i = 0; i < __MT_MCUQ_MAX; i++)
--		mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
-+		mt76_queue_reset(dev, dev->mt76.q_mcu[i], true);
- 
- 	mt76_for_each_q_rx(&dev->mt76, i)
--		mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
-+		mt76_queue_reset(dev, &dev->mt76.q_rx[i], true);
- 
- 	mt76_tx_status_check(&dev->mt76, true);
- 
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index 5d85e9ea..d9e1b17f 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -711,21 +711,31 @@ void mt7996_dma_reset(struct mt7996_dev *dev, bool force)
- 	}
- 
- 	for (i = 0; i < __MT_MCUQ_MAX; i++)
--		mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
-+		mt76_queue_reset(dev, dev->mt76.q_mcu[i], true);
- 
- 	mt76_for_each_q_rx(&dev->mt76, i) {
--		if (mtk_wed_device_active(&dev->mt76.mmio.wed))
-+		if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {
- 			if (mt76_queue_is_wed_rro(&dev->mt76.q_rx[i]) ||
--			    mt76_queue_is_wed_tx_free(&dev->mt76.q_rx[i]))
-+			    mt76_queue_is_wed_tx_free(&dev->mt76.q_rx[i])) {
-+				if (force && mt76_queue_is_wed_rro_data(&dev->mt76.q_rx[i]))
-+					mt76_queue_reset(dev, &dev->mt76.q_rx[i], false);
- 				continue;
-+			}
-+		}
- 
--		mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
-+		mt76_queue_reset(dev, &dev->mt76.q_rx[i], true);
- 	}
- 
- 	mt76_tx_status_check(&dev->mt76, true);
- 
--	mt76_for_each_q_rx(&dev->mt76, i)
-+	mt76_for_each_q_rx(&dev->mt76, i) {
-+		if (mtk_wed_device_active(&dev->mt76.mmio.wed) && force &&
-+		    (mt76_queue_is_wed_rro_ind(&dev->mt76.q_rx[i]) ||
-+		     mt76_queue_is_wed_rro_msdu_pg(&dev->mt76.q_rx[i])))
-+			continue;
-+
- 		mt76_queue_rx_reset(dev, i);
-+	}
- 
- 	mt7996_dma_enable(dev, !force);
- }
-diff --git a/mt7996/init.c b/mt7996/init.c
-index b902bcc5..a9720120 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -724,11 +724,91 @@ void mt7996_wfsys_reset(struct mt7996_dev *dev)
- 	msleep(20);
- }
- 
--static int mt7996_wed_rro_init(struct mt7996_dev *dev)
-+void mt7996_rro_hw_init(struct mt7996_dev *dev)
- {
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
- 	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
- 	u32 reg = MT_RRO_ADDR_ELEM_SEG_ADDR0;
-+	int i;
-+
-+	if (!dev->has_rro)
-+		return;
-+
-+	if (is_mt7992(&dev->mt76)) {
-+		/* set emul 3.0 function */
-+		mt76_wr(dev, MT_RRO_3_0_EMU_CONF,
-+			MT_RRO_3_0_EMU_CONF_EN_MASK);
-+
-+		mt76_wr(dev, MT_RRO_ADDR_ARRAY_BASE0,
-+			dev->wed_rro.addr_elem[0].phy_addr);
-+	} else {
-+		/* TODO: remove line after WM has set */
-+		mt76_clear(dev, WF_RRO_AXI_MST_CFG, WF_RRO_AXI_MST_CFG_DIDX_OK);
-+
-+		/* setup BA bitmap cache address */
-+		mt76_wr(dev, MT_RRO_BA_BITMAP_BASE0,
-+			dev->wed_rro.ba_bitmap[0].phy_addr);
-+		mt76_wr(dev, MT_RRO_BA_BITMAP_BASE1, 0);
-+		mt76_wr(dev, MT_RRO_BA_BITMAP_BASE_EXT0,
-+			dev->wed_rro.ba_bitmap[1].phy_addr);
-+		mt76_wr(dev, MT_RRO_BA_BITMAP_BASE_EXT1, 0);
-+
-+		/* setup Address element address */
-+		for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) {
-+			mt76_wr(dev, reg, dev->wed_rro.addr_elem[i].phy_addr >> 4);
-+			reg += 4;
-+		}
-+
-+		/* setup Address element address - separate address segment mode */
-+		mt76_wr(dev, MT_RRO_ADDR_ARRAY_BASE1,
-+			MT_RRO_ADDR_ARRAY_ELEM_ADDR_SEG_MODE);
-+	}
-+	wed->wlan.ind_cmd.win_size = ffs(MT7996_RRO_WINDOW_MAX_LEN) - 6;
-+	if (is_mt7996(&dev->mt76))
-+		wed->wlan.ind_cmd.particular_sid = MT7996_RRO_MAX_SESSION;
-+	else
-+		wed->wlan.ind_cmd.particular_sid = 1;
-+	wed->wlan.ind_cmd.particular_se_phys = dev->wed_rro.session.phy_addr;
-+	wed->wlan.ind_cmd.se_group_nums = MT7996_RRO_ADDR_ELEM_LEN;
-+	wed->wlan.ind_cmd.ack_sn_addr = MT_RRO_ACK_SN_CTRL;
-+
-+	mt76_wr(dev, MT_RRO_IND_CMD_SIGNATURE_BASE0, 0x15010e00);
-+	mt76_set(dev, MT_RRO_IND_CMD_SIGNATURE_BASE1,
-+		 MT_RRO_IND_CMD_SIGNATURE_BASE1_EN);
-+
-+	/* particular session configure */
-+	/* use max session idx + 1 as particular session id */
-+	mt76_wr(dev, MT_RRO_PARTICULAR_CFG0, dev->wed_rro.session.phy_addr);
-+
-+	if (is_mt7992(&dev->mt76)) {
-+		reg = MT_RRO_MSDU_PG_SEG_ADDR0;
-+
-+		mt76_set(dev, MT_RRO_3_1_GLOBAL_CONFIG,
-+			 MT_RRO_3_1_GLOBAL_CONFIG_INTERLEAVE_EN);
-+
-+		/* setup Msdu page address */
-+		for (i = 0; i < MT7996_RRO_MSDU_PG_CR_CNT; i++) {
-+			mt76_wr(dev, reg, dev->wed_rro.msdu_pg[i].phy_addr >> 4);
-+			reg += 4;
-+		}
-+		mt76_wr(dev, MT_RRO_PARTICULAR_CFG1,
-+			MT_RRO_PARTICULAR_CONFG_EN |
-+			FIELD_PREP(MT_RRO_PARTICULAR_SID, 1));
-+	} else {
-+		mt76_wr(dev, MT_RRO_PARTICULAR_CFG1,
-+			MT_RRO_PARTICULAR_CONFG_EN |
-+			FIELD_PREP(MT_RRO_PARTICULAR_SID, MT7996_RRO_MAX_SESSION));
-+	}
-+	/* interrupt enable */
-+	mt76_wr(dev, MT_RRO_HOST_INT_ENA,
-+		MT_RRO_HOST_INT_ENA_HOST_RRO_DONE_ENA);
-+#endif
-+}
-+
-+static int mt7996_wed_rro_init(struct mt7996_dev *dev)
-+{
-+#ifdef CONFIG_NET_MEDIATEK_SOC_WED
-+	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
- 	struct mt7996_wed_rro_addr *addr;
- 	void *ptr;
- 	int i;
-@@ -788,50 +868,9 @@ static int mt7996_wed_rro_init(struct mt7996_dev *dev)
- 		addr++;
- 	}
- 
--	/* rro hw init */
--	/* TODO: remove line after WM has set */
--	mt76_clear(dev, WF_RRO_AXI_MST_CFG, WF_RRO_AXI_MST_CFG_DIDX_OK);
--
--	/* setup BA bitmap cache address */
--	mt76_wr(dev, MT_RRO_BA_BITMAP_BASE0,
--		dev->wed_rro.ba_bitmap[0].phy_addr);
--	mt76_wr(dev, MT_RRO_BA_BITMAP_BASE1, 0);
--	mt76_wr(dev, MT_RRO_BA_BITMAP_BASE_EXT0,
--		dev->wed_rro.ba_bitmap[1].phy_addr);
--	mt76_wr(dev, MT_RRO_BA_BITMAP_BASE_EXT1, 0);
--
--	/* setup Address element address */
--	for (i = 0; i < ARRAY_SIZE(dev->wed_rro.addr_elem); i++) {
--		mt76_wr(dev, reg, dev->wed_rro.addr_elem[i].phy_addr >> 4);
--		reg += 4;
--	}
--
--	/* setup Address element address - separate address segment mode */
--	mt76_wr(dev, MT_RRO_ADDR_ARRAY_BASE1,
--		MT_RRO_ADDR_ARRAY_ELEM_ADDR_SEG_MODE);
--
--	wed->wlan.ind_cmd.win_size = ffs(MT7996_RRO_WINDOW_MAX_LEN) - 6;
--	wed->wlan.ind_cmd.particular_sid = MT7996_RRO_MAX_SESSION;
--	wed->wlan.ind_cmd.particular_se_phys = dev->wed_rro.session.phy_addr;
--	wed->wlan.ind_cmd.se_group_nums = MT7996_RRO_ADDR_ELEM_LEN;
--	wed->wlan.ind_cmd.ack_sn_addr = MT_RRO_ACK_SN_CTRL;
--
--	mt76_wr(dev, MT_RRO_IND_CMD_SIGNATURE_BASE0, 0x15010e00);
--	mt76_set(dev, MT_RRO_IND_CMD_SIGNATURE_BASE1,
--		 MT_RRO_IND_CMD_SIGNATURE_BASE1_EN);
--
--	/* particular session configure */
--	/* use max session idx + 1 as particular session id */
--	mt76_wr(dev, MT_RRO_PARTICULAR_CFG0, dev->wed_rro.session.phy_addr);
--	mt76_wr(dev, MT_RRO_PARTICULAR_CFG1,
--		MT_RRO_PARTICULAR_CONFG_EN |
--		FIELD_PREP(MT_RRO_PARTICULAR_SID, MT7996_RRO_MAX_SESSION));
--
--	/* interrupt enable */
--	mt76_wr(dev, MT_RRO_HOST_INT_ENA,
--		MT_RRO_HOST_INT_ENA_HOST_RRO_DONE_ENA);
--
- 	/* rro ind cmd queue init */
-+	mt7996_rro_hw_init(dev);
-+
- 	return mt7996_dma_rro_init(dev);
- #else
- 	return 0;
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 8de4ab9a..48e4ce90 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1768,6 +1768,31 @@ mt7996_mac_restart(struct mt7996_dev *dev)
- 	if (ret)
- 		goto out;
- 
-+	if (mtk_wed_device_active(&dev->mt76.mmio.wed) && dev->has_rro) {
-+		u32 wed_irq_mask = dev->mt76.mmio.irqmask |
-+				   MT_INT_RRO_RX_DONE |
-+				   MT_INT_TX_DONE_BAND2;
-+
-+		mt7996_rro_hw_init(dev);
-+		mt76_for_each_q_rx(&dev->mt76, i) {
-+			if (mt76_queue_is_wed_rro_ind(&dev->mt76.q_rx[i]) ||
-+			    mt76_queue_is_wed_rro_msdu_pg(&dev->mt76.q_rx[i]))
-+				mt76_queue_rx_reset(dev, i);
-+		}
-+
-+		mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
-+		mtk_wed_device_start_hwrro(&dev->mt76.mmio.wed, wed_irq_mask, false);
-+		mt7996_irq_enable(dev, wed_irq_mask);
-+		mt7996_irq_disable(dev, 0);
-+	}
-+
-+	if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2)) {
-+		mt76_wr(dev, MT_INT_PCIE1_MASK_CSR,
-+			MT_INT_TX_RX_DONE_EXT);
-+		mtk_wed_device_start(&dev->mt76.mmio.wed_hif2,
-+				     MT_INT_TX_RX_DONE_EXT);
-+	}
-+
- 	/* set the necessary init items */
- 	ret = mt7996_mcu_set_eeprom(dev);
- 	if (ret)
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b1abe42b..84b34ea9 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -713,6 +713,7 @@ extern const struct mt76_testmode_ops mt7996_testmode_ops;
- struct mt7996_dev *mt7996_mmio_probe(struct device *pdev,
- 				     void __iomem *mem_base, u32 device_id);
- void mt7996_wfsys_reset(struct mt7996_dev *dev);
-+void mt7996_rro_hw_init(struct mt7996_dev *dev);
- irqreturn_t mt7996_irq_handler(int irq, void *dev_instance);
- u64 __mt7996_get_tsf(struct ieee80211_hw *hw, struct mt7996_vif *mvif);
- int mt7996_register_device(struct mt7996_dev *dev);
-diff --git a/wed.c b/wed.c
-index 1c6d53c8..61a6badf 100644
---- a/wed.c
-+++ b/wed.c
-@@ -155,7 +155,7 @@ int mt76_wed_dma_setup(struct mt76_dev *dev, struct mt76_queue *q, bool reset)
- 	case MT76_WED_Q_TXFREE:
- 		/* WED txfree queue needs ring to be initialized before setup */
- 		q->flags = 0;
--		mt76_dma_queue_reset(dev, q);
-+		mt76_dma_queue_reset(dev, q, true);
- 		mt76_dma_rx_fill(dev, q, false);
- 
- 		ret = mtk_wed_device_txfree_ring_setup(q->wed, q->regs);
-@@ -184,7 +184,7 @@ int mt76_wed_dma_setup(struct mt76_dev *dev, struct mt76_queue *q, bool reset)
- 		break;
- 	case MT76_WED_RRO_Q_IND:
- 		q->flags &= ~MT_QFLAG_WED;
--		mt76_dma_queue_reset(dev, q);
-+		mt76_dma_queue_reset(dev, q, true);
- 		mt76_dma_rx_fill(dev, q, false);
- 		mtk_wed_device_ind_rx_ring_setup(q->wed, q->regs);
- 		break;
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2013-mtk-wifi-mt76-mt7996-support-backaward-compatiable.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2013-mtk-wifi-mt76-mt7996-support-backaward-compatiable.patch
deleted file mode 100644
index 7bb9eea..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2013-mtk-wifi-mt76-mt7996-support-backaward-compatiable.patch
+++ /dev/null
@@ -1,208 +0,0 @@
-From b4130d60aec743429b0bf9156a79b99776bbdc06 Mon Sep 17 00:00:00 2001
-From: mtk27745 <rex.lu@mediatek.com>
-Date: Fri, 6 Oct 2023 20:59:42 +0800
-Subject: [PATCH 2013/2032] mtk: wifi: mt76: mt7996: support backaward
- compatiable
-
-revert upstream wed trigger mode to polling mode
-
-Signed-off-by: mtk27745 <rex.lu@mediatek.com>
-
-[Description]
-Change the SW token size from 1024 to 15360 according to HW capability.
-
-[Release-log]
-N/A
-
-Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
----
- mt76.h          |  2 ++
- mt7996/mac.c    |  3 ++-
- mt7996/mcu.c    |  2 +-
- mt7996/mmio.c   | 12 +++++++-----
- mt7996/mt7996.h |  1 +
- mt7996/pci.c    | 17 +++++++++--------
- wed.c           |  4 ++--
- 7 files changed, 24 insertions(+), 17 deletions(-)
-
-diff --git a/mt76.h b/mt76.h
-index 6ac8a279..49b66ff2 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -48,6 +48,8 @@
- 
- #define MT76_TOKEN_FREE_THR	64
- 
-+#define MT76_WED_SW_TOKEN_SIZE	15360
-+
- #define MT_QFLAG_WED_RING	GENMASK(1, 0)
- #define MT_QFLAG_WED_TYPE	GENMASK(4, 2)
- #define MT_QFLAG_WED		BIT(5)
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 48e4ce90..ed22d94e 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1781,7 +1781,7 @@ mt7996_mac_restart(struct mt7996_dev *dev)
- 		}
- 
- 		mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
--		mtk_wed_device_start_hwrro(&dev->mt76.mmio.wed, wed_irq_mask, false);
-+		mtk_wed_device_start_hw_rro(&dev->mt76.mmio.wed, wed_irq_mask, false);
- 		mt7996_irq_enable(dev, wed_irq_mask);
- 		mt7996_irq_disable(dev, 0);
- 	}
-@@ -2013,6 +2013,7 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 
- 		mtk_wed_device_start_hw_rro(&dev->mt76.mmio.wed, wed_irq_mask,
- 					    true);
-+
- 		mt7996_irq_enable(dev, wed_irq_mask);
- 		mt7996_irq_disable(dev, 0);
- 	}
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index a907e667..08979465 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -3252,7 +3252,7 @@ static int mt7996_mcu_wa_red_config(struct mt7996_dev *dev)
- 
- 	if (!mtk_wed_device_active(&dev->mt76.mmio.wed))
- 		req.token_per_src[RED_TOKEN_SRC_CNT - 1] =
--			cpu_to_le16(MT7996_TOKEN_SIZE - MT7996_HW_TOKEN_SIZE);
-+			cpu_to_le16(MT7996_SW_TOKEN_SIZE);
- 
- 	return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET),
- 				 &req, sizeof(req), false);
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index 92ae5138..eef70faf 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -14,7 +14,7 @@
- #include "../trace.h"
- #include "../dma.h"
- 
--static bool wed_enable;
-+static bool wed_enable = true;
- module_param(wed_enable, bool, 0644);
- 
- static const struct __base mt7996_reg_base[] = {
-@@ -347,7 +347,7 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 		}
- 
- 		wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + hif1_ofs + MT_WFDMA0_GLO_CFG;
--		wed->wlan.wpdma_rx = wed->wlan.phy_base + hif1_ofs +
-+		wed->wlan.wpdma_rx[0] = wed->wlan.phy_base + hif1_ofs +
- 				     MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
- 				     MT7996_RXQ_BAND0 * MT_RING_SIZE;
- 
-@@ -362,7 +362,7 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 
- 		wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + MT_WFDMA0_GLO_CFG;
- 
--		wed->wlan.wpdma_rx = wed->wlan.phy_base +
-+		wed->wlan.wpdma_rx[0] = wed->wlan.phy_base +
- 				     MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
- 				     MT7996_RXQ_BAND0 * MT_RING_SIZE;
- 
-@@ -404,8 +404,8 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 		dev->mt76.rx_token_size = MT7996_TOKEN_SIZE + wed->wlan.rx_npkt;
- 	}
- 
--	wed->wlan.nbuf = MT7996_HW_TOKEN_SIZE;
--	wed->wlan.token_start = MT7996_TOKEN_SIZE - wed->wlan.nbuf;
-+	wed->wlan.nbuf = MT7996_TOKEN_SIZE;
-+	wed->wlan.token_start = 0;
- 
- 	wed->wlan.amsdu_max_subframes = 8;
- 	wed->wlan.amsdu_max_len = 1536;
-@@ -426,6 +426,8 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 	*irq = wed->irq;
- 	dev->mt76.dma_dev = wed->dev;
- 
-+	dev->mt76.token_size = MT7996_SW_TOKEN_SIZE;
-+
- 	return 1;
- #else
- 	return 0;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 84b34ea9..3ba40c3a 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -74,6 +74,7 @@
- #define MT7996_EEPROM_BLOCK_SIZE	16
- #define MT7996_TOKEN_SIZE		16384
- #define MT7996_HW_TOKEN_SIZE		8192
-+#define MT7996_SW_TOKEN_SIZE		15360
- 
- #define MT7996_CFEND_RATE_DEFAULT	0x49	/* OFDM 24M */
- #define MT7996_CFEND_RATE_11B		0x03	/* 11B LP, 11M */
-diff --git a/mt7996/pci.c b/mt7996/pci.c
-index 05830c01..4e957771 100644
---- a/mt7996/pci.c
-+++ b/mt7996/pci.c
-@@ -171,7 +171,7 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 
- 		ret = mt7996_mmio_wed_init(dev, hif2_dev, true, &hif2_irq);
- 		if (ret < 0)
--			goto free_hif2_wed_irq_vector;
-+			goto free_wed_or_irq_vector;
- 
- 		if (!ret) {
- 			ret = pci_alloc_irq_vectors(hif2_dev, 1, 1,
-@@ -180,14 +180,15 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 				goto free_hif2;
- 
- 			dev->hif2->irq = hif2_dev->irq;
--			hif2_irq = dev->hif2->irq;
-+		} else {
-+			dev->hif2->irq = irq;
- 		}
- 
--		ret = devm_request_irq(mdev->dev, hif2_irq, mt7996_irq_handler,
--				       IRQF_SHARED, KBUILD_MODNAME "-hif",
--				       dev);
-+		ret = devm_request_irq(mdev->dev, dev->hif2->irq,
-+				       mt7996_irq_handler, IRQF_SHARED,
-+				       KBUILD_MODNAME "-hif", dev);
- 		if (ret)
--			goto free_hif2_wed_irq_vector;
-+			goto free_hif2_irq_vector;
- 
- 		mt76_wr(dev, MT_INT1_MASK_CSR, 0);
- 		/* master switch of PCIe tnterrupt enable */
-@@ -202,8 +203,8 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 
- free_hif2_irq:
- 	if (dev->hif2)
--		devm_free_irq(mdev->dev, hif2_irq, dev);
--free_hif2_wed_irq_vector:
-+		devm_free_irq(mdev->dev, dev->hif2->irq, dev);
-+free_hif2_irq_vector:
- 	if (dev->hif2) {
- 		if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2))
- 			mtk_wed_device_detach(&dev->mt76.mmio.wed_hif2);
-diff --git a/wed.c b/wed.c
-index 61a6badf..634c95cf 100644
---- a/wed.c
-+++ b/wed.c
-@@ -120,7 +120,7 @@ int mt76_wed_offload_enable(struct mtk_wed_device *wed)
- 	struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
- 
- 	spin_lock_bh(&dev->token_lock);
--	dev->token_size = wed->wlan.token_start;
-+	dev->token_size = MT76_WED_SW_TOKEN_SIZE;
- 	spin_unlock_bh(&dev->token_lock);
- 
- 	return !wait_event_timeout(dev->tx_wait, !dev->wed_token_count, HZ);
-@@ -204,7 +204,7 @@ void mt76_wed_offload_disable(struct mtk_wed_device *wed)
- 	struct mt76_dev *dev = container_of(wed, struct mt76_dev, mmio.wed);
- 
- 	spin_lock_bh(&dev->token_lock);
--	dev->token_size = dev->drv->token_size;
-+	dev->token_size = MT76_WED_SW_TOKEN_SIZE;
- 	spin_unlock_bh(&dev->token_lock);
- }
- EXPORT_SYMBOL_GPL(mt76_wed_offload_disable);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2014-mtk-wifi-mt76-mt7996-wed-add-wed-support-for-mt7992.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2014-mtk-wifi-mt76-mt7996-wed-add-wed-support-for-mt7992.patch
deleted file mode 100644
index e7a590a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2014-mtk-wifi-mt76-mt7996-wed-add-wed-support-for-mt7992.patch
+++ /dev/null
@@ -1,432 +0,0 @@
-From 2fd58d785c6aaf330211787b8fcbc3662a6f69d8 Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Fri, 8 Sep 2023 11:57:39 +0800
-Subject: [PATCH 2014/2032] mtk: wifi: mt76: mt7996: wed: add wed support for
- mt7992
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
-
-Fix incomplete WED initialization for Kite band-1 RX ring.
-
-Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
----
- mt7996/dma.c    | 91 +++++++++++++++++++++++++++++++++----------------
- mt7996/init.c   | 12 +++++++
- mt7996/mac.c    |  4 +++
- mt7996/mmio.c   | 49 ++++++++++++++++++--------
- mt7996/mt7996.h | 10 +++++-
- mt7996/pci.c    | 10 ++++--
- mt7996/regs.h   | 14 +++++++-
- 7 files changed, 142 insertions(+), 48 deletions(-)
-
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index d9e1b17f..d62dc8ba 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -77,18 +77,23 @@ static void mt7996_dma_config(struct mt7996_dev *dev)
- 			   MT7996_RXQ_RRO_BAND0);
- 		RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND0, WFDMA0, MT_INT_RX_DONE_MSDU_PG_BAND0,
- 			   MT7996_RXQ_MSDU_PG_BAND0);
--		RXQ_CONFIG(MT_RXQ_TXFREE_BAND0, WFDMA0, MT_INT_RX_TXFREE_MAIN,
--			   MT7996_RXQ_TXFREE0);
--		/* band1 */
--		RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND1, WFDMA0, MT_INT_RX_DONE_MSDU_PG_BAND1,
--			   MT7996_RXQ_MSDU_PG_BAND1);
--		/* band2 */
--		RXQ_CONFIG(MT_RXQ_RRO_BAND2, WFDMA0, MT_INT_RX_DONE_RRO_BAND2,
--			   MT7996_RXQ_RRO_BAND2);
--		RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND2, WFDMA0, MT_INT_RX_DONE_MSDU_PG_BAND2,
--			   MT7996_RXQ_MSDU_PG_BAND2);
--		RXQ_CONFIG(MT_RXQ_TXFREE_BAND2, WFDMA0, MT_INT_RX_TXFREE_TRI,
--			   MT7996_RXQ_TXFREE2);
-+		if (is_mt7996(&dev->mt76)) {
-+			RXQ_CONFIG(MT_RXQ_TXFREE_BAND0, WFDMA0, MT_INT_RX_TXFREE_MAIN,
-+				   MT7996_RXQ_TXFREE0);
-+			/* band1 */
-+			RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND1, WFDMA0, MT_INT_RX_DONE_MSDU_PG_BAND1,
-+				   MT7996_RXQ_MSDU_PG_BAND1);
-+			/* band2 */
-+			RXQ_CONFIG(MT_RXQ_RRO_BAND2, WFDMA0, MT_INT_RX_DONE_RRO_BAND2,
-+				   MT7996_RXQ_RRO_BAND2);
-+			RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND2, WFDMA0, MT_INT_RX_DONE_MSDU_PG_BAND2,
-+				   MT7996_RXQ_MSDU_PG_BAND2);
-+			RXQ_CONFIG(MT_RXQ_TXFREE_BAND2, WFDMA0, MT_INT_RX_TXFREE_TRI,
-+				   MT7996_RXQ_TXFREE2);
-+		} else {
-+			RXQ_CONFIG(MT_RXQ_RRO_BAND1, WFDMA0, MT_INT_RX_DONE_RRO_BAND1,
-+				   MT7996_RXQ_RRO_BAND1);
-+		}
- 
- 		RXQ_CONFIG(MT_RXQ_RRO_IND, WFDMA0, MT_INT_RX_DONE_RRO_IND,
- 			   MT7996_RXQ_RRO_IND);
-@@ -146,8 +151,13 @@ static void __mt7996_dma_prefetch(struct mt7996_dev *dev, u32 ofs)
- 	if (dev->has_rro) {
- 		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_RRO_BAND0) + ofs,
- 			PREFETCH(0x10));
--		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_RRO_BAND2) + ofs,
--			PREFETCH(0x10));
-+		if (is_mt7996(&dev->mt76))
-+			mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_RRO_BAND2) + ofs,
-+				PREFETCH(0x10));
-+		else
-+			mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_RRO_BAND1) + ofs,
-+				PREFETCH(0x10));
-+
- 		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MSDU_PAGE_BAND0) + ofs,
- 			PREFETCH(0x4));
- 		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MSDU_PAGE_BAND1) + ofs,
-@@ -361,12 +371,16 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
- 		 * so, redirect pcie0 rx ring3 interrupt to pcie1
- 		 */
- 		if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
--		    dev->has_rro)
-+		    dev->has_rro) {
-+			u32 intr = is_mt7996(&dev->mt76) ?
-+				   MT_WFDMA0_RX_INT_SEL_RING6 :
-+				   MT_WFDMA0_RX_INT_SEL_RING9;
- 			mt76_set(dev, MT_WFDMA0_RX_INT_PCIE_SEL + hif1_ofs,
--				 MT_WFDMA0_RX_INT_SEL_RING6);
--		else
-+				 intr);
-+		} else {
- 			mt76_set(dev, MT_WFDMA0_RX_INT_PCIE_SEL,
- 				 MT_WFDMA0_RX_INT_SEL_RING3);
-+		}
- 	}
- 
- 	mt7996_dma_start(dev, reset, true);
-@@ -401,7 +415,7 @@ int mt7996_dma_rro_init(struct mt7996_dev *dev)
- 	if (ret)
- 		return ret;
- 
--	if (mt7996_band_valid(dev, MT_BAND1)) {
-+	if (mt7996_band_valid(dev, MT_BAND1) && is_mt7996(&dev->mt76)) {
- 		/* rx msdu page queue for band1 */
- 		mdev->q_rx[MT_RXQ_MSDU_PAGE_BAND1].flags =
- 			MT_WED_RRO_Q_MSDU_PG(1) | MT_QFLAG_WED_RRO_EN;
-@@ -522,7 +536,9 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 		return ret;
- 
- 	/* tx free notify event from WA for band0 */
--	if (mtk_wed_device_active(wed) && !dev->has_rro) {
-+	if (mtk_wed_device_active(wed) &&
-+	    ((is_mt7996(&dev->mt76) && !dev->has_rro) ||
-+	     (is_mt7992(&dev->mt76)))) {
- 		dev->mt76.q_rx[MT_RXQ_MAIN_WA].flags = MT_WED_Q_TXFREE;
- 		dev->mt76.q_rx[MT_RXQ_MAIN_WA].wed = wed;
- 	}
-@@ -568,6 +584,11 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 	} else if (mt7996_band_valid(dev, MT_BAND1)) {
- 		/* rx data queue for mt7992 band1 */
- 		rx_base = MT_RXQ_RING_BASE(MT_RXQ_BAND1) + hif1_ofs;
-+		if (mtk_wed_device_active(wed) && mtk_wed_get_rx_capa(wed)) {
-+			dev->mt76.q_rx[MT_RXQ_BAND1].flags = MT_WED_Q_RX(1);
-+			dev->mt76.q_rx[MT_RXQ_BAND1].wed = wed;
-+		}
-+
- 		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1],
- 				       MT_RXQ_ID(MT_RXQ_BAND1),
- 				       MT7996_RX_RING_SIZE,
-@@ -601,17 +622,29 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 		if (ret)
- 			return ret;
- 
--		/* tx free notify event from WA for band0 */
--		dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].flags = MT_WED_Q_TXFREE;
--		dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].wed = wed;
-+		if (is_mt7992(&dev->mt76)) {
-+			dev->mt76.q_rx[MT_RXQ_RRO_BAND1].flags =
-+				MT_WED_RRO_Q_DATA(1) | MT_QFLAG_WED_RRO_EN;
-+			dev->mt76.q_rx[MT_RXQ_RRO_BAND1].wed = wed;
-+			ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_RRO_BAND1],
-+					       MT_RXQ_ID(MT_RXQ_RRO_BAND1),
-+					       MT7996_RX_RING_SIZE,
-+					       MT7996_RX_BUF_SIZE,
-+					       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND1));
-+			if (ret)
-+				return ret;
-+		} else {
-+			dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].flags = MT_WED_Q_TXFREE;
-+			dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].wed = wed;
- 
--		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0],
--				       MT_RXQ_ID(MT_RXQ_TXFREE_BAND0),
--				       MT7996_RX_MCU_RING_SIZE,
--				       MT7996_RX_BUF_SIZE,
--				       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND0));
--		if (ret)
--			return ret;
-+			ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0],
-+					       MT_RXQ_ID(MT_RXQ_TXFREE_BAND0),
-+					       MT7996_RX_MCU_RING_SIZE,
-+					       MT7996_RX_BUF_SIZE,
-+					       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND0));
-+			if (ret)
-+				return ret;
-+		}
- 
- 		if (mt7996_band_valid(dev, MT_BAND2)) {
- 			/* rx rro data queue for band2 */
-diff --git a/mt7996/init.c b/mt7996/init.c
-index a9720120..7a9b9749 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -802,6 +802,7 @@ void mt7996_rro_hw_init(struct mt7996_dev *dev)
- 	/* interrupt enable */
- 	mt76_wr(dev, MT_RRO_HOST_INT_ENA,
- 		MT_RRO_HOST_INT_ENA_HOST_RRO_DONE_ENA);
-+
- #endif
- }
- 
-@@ -854,6 +855,17 @@ static int mt7996_wed_rro_init(struct mt7996_dev *dev)
- 			dev->wed_rro.addr_elem[i].phy_addr;
- 	}
- 
-+	for (i = 0; i < MT7996_RRO_MSDU_PG_CR_CNT; i++) {
-+		ptr = dmam_alloc_coherent(dev->mt76.dma_dev, MT7996_RRO_MSDU_PG_SIZE_PER_CR,
-+					  &dev->wed_rro.msdu_pg[i].phy_addr,
-+					  GFP_KERNEL);
-+		if (!ptr)
-+			return -ENOMEM;
-+		dev->wed_rro.msdu_pg[i].ptr = ptr;
-+
-+		memset(dev->wed_rro.msdu_pg[i].ptr, 0, MT7996_RRO_MSDU_PG_SIZE_PER_CR);
-+	}
-+
- 	ptr = dmam_alloc_coherent(dev->mt76.dma_dev,
- 				  MT7996_RRO_WINDOW_MAX_LEN * sizeof(*addr),
- 				  &dev->wed_rro.session.phy_addr,
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index ed22d94e..48cb2ac0 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -2011,6 +2011,10 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 
- 		mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
- 
-+		if (is_mt7992(&dev->mt76) && dev->has_rro)
-+			mt76_wr(dev, MT_RRO_3_0_EMU_CONF,
-+				MT_RRO_3_0_EMU_CONF_EN_MASK);
-+
- 		mtk_wed_device_start_hw_rro(&dev->mt76.mmio.wed, wed_irq_mask,
- 					    true);
- 
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index eef70faf..e23c79fc 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -313,7 +313,8 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 
- 	dev->has_rro = true;
- 
--	hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
-+	if (dev->hif2)
-+		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
- 
- 	if (hif2)
- 		wed = &dev->mt76.mmio.wed_hif2;
-@@ -348,8 +349,8 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 
- 		wed->wlan.wpdma_rx_glo = wed->wlan.phy_base + hif1_ofs + MT_WFDMA0_GLO_CFG;
- 		wed->wlan.wpdma_rx[0] = wed->wlan.phy_base + hif1_ofs +
--				     MT_RXQ_RING_BASE(MT7996_RXQ_BAND0) +
--				     MT7996_RXQ_BAND0 * MT_RING_SIZE;
-+				     MT_RXQ_RING_BASE(MT7996_RXQ_BAND2) +
-+				     MT7996_RXQ_BAND2 * MT_RING_SIZE;
- 
- 		wed->wlan.id = 0x7991;
- 		wed->wlan.tx_tbit[0] = ffs(MT_INT_TX_DONE_BAND2) - 1;
-@@ -369,9 +370,19 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 		wed->wlan.wpdma_rx_rro[0] = wed->wlan.phy_base +
- 					    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND0) +
- 					    MT7996_RXQ_RRO_BAND0 * MT_RING_SIZE;
--		wed->wlan.wpdma_rx_rro[1] = wed->wlan.phy_base + hif1_ofs +
--					    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND2) +
--					    MT7996_RXQ_RRO_BAND2 * MT_RING_SIZE;
-+		if (is_mt7996(&dev->mt76)) {
-+			wed->wlan.wpdma_rx_rro[1] = wed->wlan.phy_base + hif1_ofs +
-+						    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND2) +
-+						    MT7996_RXQ_RRO_BAND2 * MT_RING_SIZE;
-+		} else {
-+			wed->wlan.wpdma_rx_rro[1] = wed->wlan.phy_base +
-+						    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND1) +
-+						    MT7996_RXQ_RRO_BAND1 * MT_RING_SIZE;
-+			wed->wlan.wpdma_rx[1] = wed->wlan.phy_base +
-+						MT_RXQ_RING_BASE(MT7996_RXQ_BAND1) +
-+						MT7996_RXQ_BAND1 * MT_RING_SIZE;
-+		}
-+
- 		wed->wlan.wpdma_rx_pg = wed->wlan.phy_base +
- 					MT_RXQ_RING_BASE(MT7996_RXQ_MSDU_PG_BAND0) +
- 					MT7996_RXQ_MSDU_PG_BAND0 * MT_RING_SIZE;
-@@ -381,10 +392,14 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 		wed->wlan.rx_size = SKB_WITH_OVERHEAD(MT_RX_BUF_SIZE);
- 
- 		wed->wlan.rx_tbit[0] = ffs(MT_INT_RX_DONE_BAND0) - 1;
--		wed->wlan.rx_tbit[1] = ffs(MT_INT_RX_DONE_BAND2) - 1;
--
- 		wed->wlan.rro_rx_tbit[0] = ffs(MT_INT_RX_DONE_RRO_BAND0) - 1;
--		wed->wlan.rro_rx_tbit[1] = ffs(MT_INT_RX_DONE_RRO_BAND2) - 1;
-+		if (is_mt7996(&dev->mt76)) {
-+			wed->wlan.rx_tbit[1] = ffs(MT_INT_RX_DONE_BAND2) - 1;
-+			wed->wlan.rro_rx_tbit[1] = ffs(MT_INT_RX_DONE_RRO_BAND2) - 1;
-+		} else {
-+			wed->wlan.rx_tbit[1] = ffs(MT_INT_RX_DONE_BAND1) - 1;
-+			wed->wlan.rro_rx_tbit[1] = ffs(MT_INT_RX_DONE_RRO_BAND1) - 1;
-+		}
- 
- 		wed->wlan.rx_pg_tbit[0] = ffs(MT_INT_RX_DONE_MSDU_PG_BAND0) - 1;
- 		wed->wlan.rx_pg_tbit[1] = ffs(MT_INT_RX_DONE_MSDU_PG_BAND1) - 1;
-@@ -392,14 +407,20 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 
- 		wed->wlan.tx_tbit[0] = ffs(MT_INT_TX_DONE_BAND0) - 1;
- 		wed->wlan.tx_tbit[1] = ffs(MT_INT_TX_DONE_BAND1) - 1;
--		if (dev->has_rro) {
--			wed->wlan.wpdma_txfree = wed->wlan.phy_base + MT_RXQ_RING_BASE(0) +
--						 MT7996_RXQ_TXFREE0 * MT_RING_SIZE;
--			wed->wlan.txfree_tbit = ffs(MT_INT_RX_TXFREE_MAIN) - 1;
-+		if (is_mt7996(&dev->mt76)) {
-+			if (dev->has_rro) {
-+				wed->wlan.wpdma_txfree = wed->wlan.phy_base + MT_RXQ_RING_BASE(0) +
-+							 MT7996_RXQ_TXFREE0 * MT_RING_SIZE;
-+				wed->wlan.txfree_tbit = ffs(MT_INT_RX_TXFREE_MAIN) - 1;
-+			} else {
-+				wed->wlan.txfree_tbit = ffs(MT_INT_RX_DONE_WA_MAIN) - 1;
-+				wed->wlan.wpdma_txfree = wed->wlan.phy_base + MT_RXQ_RING_BASE(0) +
-+							 MT7996_RXQ_MCU_WA_MAIN * MT_RING_SIZE;
-+			}
- 		} else {
- 			wed->wlan.txfree_tbit = ffs(MT_INT_RX_DONE_WA_MAIN) - 1;
- 			wed->wlan.wpdma_txfree = wed->wlan.phy_base + MT_RXQ_RING_BASE(0) +
--						  MT7996_RXQ_MCU_WA_MAIN * MT_RING_SIZE;
-+						 MT7996_RXQ_MCU_WA_MAIN * MT_RING_SIZE;
- 		}
- 		dev->mt76.rx_token_size = MT7996_TOKEN_SIZE + wed->wlan.rx_npkt;
- 	}
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 3ba40c3a..d1d35e56 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -122,6 +122,10 @@
- #define MT7996_DRR_STA_AC2_QNTM_MASK	GENMASK(18, 16)
- #define MT7996_DRR_STA_AC3_QNTM_MASK	GENMASK(22, 20)
- 
-+/* RRO 3.1 */
-+#define MT7996_RRO_MSDU_PG_CR_CNT 8
-+#define MT7996_RRO_MSDU_PG_SIZE_PER_CR 0x10000
-+
- struct mt7996_vif;
- struct mt7996_sta;
- struct mt7996_dfs_pulse;
-@@ -181,7 +185,7 @@ enum mt7996_rxq_id {
- 	MT7996_RXQ_BAND1 = 5, /* for mt7992 */
- 	MT7996_RXQ_BAND2 = 5,
- 	MT7996_RXQ_RRO_BAND0 = 8,
--	MT7996_RXQ_RRO_BAND1 = 8,/* unused */
-+	MT7996_RXQ_RRO_BAND1 = 9,
- 	MT7996_RXQ_RRO_BAND2 = 6,
- 	MT7996_RXQ_MSDU_PG_BAND0 = 10,
- 	MT7996_RXQ_MSDU_PG_BAND1 = 11,
-@@ -541,6 +545,10 @@ struct mt7996_dev {
- 			void *ptr;
- 			dma_addr_t phy_addr;
- 		} session;
-+		struct {
-+			void *ptr;
-+			dma_addr_t phy_addr;
-+		} msdu_pg[MT7996_RRO_MSDU_PG_CR_CNT];
- 
- 		struct work_struct work;
- 		struct list_head poll_list;
-diff --git a/mt7996/pci.c b/mt7996/pci.c
-index 4e957771..f0d3f199 100644
---- a/mt7996/pci.c
-+++ b/mt7996/pci.c
-@@ -107,7 +107,7 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 	struct pci_dev *hif2_dev;
- 	struct mt7996_hif *hif2;
- 	struct mt7996_dev *dev;
--	int irq, hif2_irq, ret;
-+	int irq, ret;
- 	struct mt76_dev *mdev;
- 
- 	hif2_enable |= (id->device == 0x7990 || id->device == 0x7991);
-@@ -143,6 +143,8 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 	mdev = &dev->mt76;
- 	mt7996_wfsys_reset(dev);
- 	hif2 = mt7996_pci_init_hif2(pdev);
-+	if (hif2)
-+		dev->hif2 = hif2;
- 
- 	ret = mt7996_mmio_wed_init(dev, pdev, false, &irq);
- 	if (ret < 0)
-@@ -167,9 +169,11 @@ static int mt7996_pci_probe(struct pci_dev *pdev,
- 
- 	if (hif2) {
- 		hif2_dev = container_of(hif2->dev, struct pci_dev, dev);
--		dev->hif2 = hif2;
-+		ret = 0;
-+
-+		if (is_mt7996(&dev->mt76))
-+			ret = mt7996_mmio_wed_init(dev, hif2_dev, true, &irq);
- 
--		ret = mt7996_mmio_wed_init(dev, hif2_dev, true, &hif2_irq);
- 		if (ret < 0)
- 			goto free_wed_or_irq_vector;
- 
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 8d1462a7..352d1b29 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -77,6 +77,8 @@ enum offs_rev {
- #define MT_RRO_BA_BITMAP_BASE1			MT_RRO_TOP(0xC)
- #define WF_RRO_AXI_MST_CFG			MT_RRO_TOP(0xB8)
- #define WF_RRO_AXI_MST_CFG_DIDX_OK		BIT(12)
-+
-+#define MT_RRO_ADDR_ARRAY_BASE0			MT_RRO_TOP(0x30)
- #define MT_RRO_ADDR_ARRAY_BASE1			MT_RRO_TOP(0x34)
- #define MT_RRO_ADDR_ARRAY_ELEM_ADDR_SEG_MODE	BIT(31)
- 
-@@ -97,6 +99,14 @@ enum offs_rev {
- 
- #define MT_RRO_ADDR_ELEM_SEG_ADDR0		MT_RRO_TOP(0x400)
- 
-+#define MT_RRO_3_0_EMU_CONF			MT_RRO_TOP(0x600)
-+#define MT_RRO_3_0_EMU_CONF_EN_MASK		BIT(11)
-+
-+#define MT_RRO_3_1_GLOBAL_CONFIG		MT_RRO_TOP(0x604)
-+#define MT_RRO_3_1_GLOBAL_CONFIG_INTERLEAVE_EN	BIT(0)
-+
-+#define MT_RRO_MSDU_PG_SEG_ADDR0		MT_RRO_TOP(0x620)
-+
- #define MT_RRO_ACK_SN_CTRL			MT_RRO_TOP(0x50)
- #define MT_RRO_ACK_SN_CTRL_SN_MASK		GENMASK(27, 16)
- #define MT_RRO_ACK_SN_CTRL_SESSION_MASK		GENMASK(11, 0)
-@@ -402,6 +412,7 @@ enum offs_rev {
- #define MT_WFDMA0_RX_INT_PCIE_SEL		MT_WFDMA0(0x154)
- #define MT_WFDMA0_RX_INT_SEL_RING3		BIT(3)
- #define MT_WFDMA0_RX_INT_SEL_RING6		BIT(6)
-+#define MT_WFDMA0_RX_INT_SEL_RING9		BIT(9)
- 
- #define MT_WFDMA0_MCU_HOST_INT_ENA		MT_WFDMA0(0x1f4)
- 
-@@ -503,13 +514,14 @@ enum offs_rev {
- #define MT_INT_RX_DONE_WA_EXT			BIT(3) /* for mt7992 */
- #define MT_INT_RX_DONE_WA_TRI			BIT(3)
- #define MT_INT_RX_TXFREE_MAIN			BIT(17)
-+#define MT_INT_RX_TXFREE_BAND1			BIT(15)
- #define MT_INT_RX_TXFREE_TRI			BIT(15)
- #define MT_INT_RX_DONE_BAND2_EXT		BIT(23)
- #define MT_INT_RX_TXFREE_EXT			BIT(26)
- #define MT_INT_MCU_CMD				BIT(29)
- 
- #define MT_INT_RX_DONE_RRO_BAND0		BIT(16)
--#define MT_INT_RX_DONE_RRO_BAND1		BIT(16)
-+#define MT_INT_RX_DONE_RRO_BAND1		BIT(17)
- #define MT_INT_RX_DONE_RRO_BAND2		BIT(14)
- #define MT_INT_RX_DONE_RRO_IND			BIT(11)
- #define MT_INT_RX_DONE_MSDU_PG_BAND0		BIT(18)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2015-mtk-wifi-mt76-mt7992-wed-add-2pcie-one-wed-support.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2015-mtk-wifi-mt76-mt7992-wed-add-2pcie-one-wed-support.patch
deleted file mode 100644
index a0a1b01..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2015-mtk-wifi-mt76-mt7992-wed-add-2pcie-one-wed-support.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From 5fa40f1780c96c66b3c7a01ac43c8bdebe8b746e Mon Sep 17 00:00:00 2001
-From: "sujuan.chen" <sujuan.chen@mediatek.com>
-Date: Wed, 13 Sep 2023 17:35:43 +0800
-Subject: [PATCH 2015/2032] mtk: wifi: mt76: mt7992: wed: add 2pcie one wed
- support
-
-Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
----
- mt7996/dma.c         | 13 +++++++++++--
- mt7996/mmio.c        |  7 +++----
- mt7996/mtk_debug.h   |  5 +++++
- mt7996/mtk_debugfs.c | 25 ++++++++++++++++++-------
- mt7996/regs.h        |  2 ++
- 5 files changed, 39 insertions(+), 13 deletions(-)
-
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index d62dc8ba..c23b0d65 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -355,6 +355,13 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
- 			 MT_WFDMA_HOST_CONFIG_PDMA_BAND |
- 			 MT_WFDMA_HOST_CONFIG_BAND2_PCIE1);
- 
-+		if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
-+		    is_mt7992(&dev->mt76)) {
-+			mt76_set(dev, MT_WFDMA_HOST_CONFIG,
-+				 MT_WFDMA_HOST_CONFIG_PDMA_BAND |
-+				 MT_WFDMA_HOST_CONFIG_BAND1_PCIE1);
-+		}
-+
- 		/* AXI read outstanding number */
- 		mt76_rmw(dev, MT_WFDMA_AXI_R2A_CTRL,
- 			 MT_WFDMA_AXI_R2A_CTRL_OUTSTAND_MASK, 0x14);
-@@ -374,7 +381,8 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
- 		    dev->has_rro) {
- 			u32 intr = is_mt7996(&dev->mt76) ?
- 				   MT_WFDMA0_RX_INT_SEL_RING6 :
--				   MT_WFDMA0_RX_INT_SEL_RING9;
-+				   MT_WFDMA0_RX_INT_SEL_RING9 |
-+				   MT_WFDMA0_RX_INT_SEL_RING5;
- 			mt76_set(dev, MT_WFDMA0_RX_INT_PCIE_SEL + hif1_ofs,
- 				 intr);
- 		} else {
-@@ -630,10 +638,11 @@ int mt7996_dma_init(struct mt7996_dev *dev)
- 					       MT_RXQ_ID(MT_RXQ_RRO_BAND1),
- 					       MT7996_RX_RING_SIZE,
- 					       MT7996_RX_BUF_SIZE,
--					       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND1));
-+					       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND1) + hif1_ofs);
- 			if (ret)
- 				return ret;
- 		} else {
-+			/* tx free notify event from WA for band0 */
- 			dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].flags = MT_WED_Q_TXFREE;
- 			dev->mt76.q_rx[MT_RXQ_TXFREE_BAND0].wed = wed;
- 
-diff --git a/mt7996/mmio.c b/mt7996/mmio.c
-index e23c79fc..764c1244 100644
---- a/mt7996/mmio.c
-+++ b/mt7996/mmio.c
-@@ -375,10 +375,10 @@ int mt7996_mmio_wed_init(struct mt7996_dev *dev, void *pdev_ptr,
- 						    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND2) +
- 						    MT7996_RXQ_RRO_BAND2 * MT_RING_SIZE;
- 		} else {
--			wed->wlan.wpdma_rx_rro[1] = wed->wlan.phy_base +
-+			wed->wlan.wpdma_rx_rro[1] = wed->wlan.phy_base + hif1_ofs +
- 						    MT_RXQ_RING_BASE(MT7996_RXQ_RRO_BAND1) +
- 						    MT7996_RXQ_RRO_BAND1 * MT_RING_SIZE;
--			wed->wlan.wpdma_rx[1] = wed->wlan.phy_base +
-+			wed->wlan.wpdma_rx[1] = wed->wlan.phy_base + hif1_ofs +
- 						MT_RXQ_RING_BASE(MT7996_RXQ_BAND1) +
- 						MT7996_RXQ_BAND1 * MT_RING_SIZE;
- 		}
-@@ -516,10 +516,9 @@ void mt7996_dual_hif_set_irq_mask(struct mt7996_dev *dev, bool write_reg,
- 		if (mtk_wed_device_active(&mdev->mmio.wed)) {
- 			mtk_wed_device_irq_set_mask(&mdev->mmio.wed,
- 						    mdev->mmio.irqmask);
--			if (mtk_wed_device_active(&mdev->mmio.wed_hif2)) {
-+			if (mtk_wed_device_active(&mdev->mmio.wed_hif2))
- 				mtk_wed_device_irq_set_mask(&mdev->mmio.wed_hif2,
- 							    mdev->mmio.irqmask);
--			}
- 		} else {
- 			mt76_wr(dev, MT_INT_MASK_CSR, mdev->mmio.irqmask);
- 			mt76_wr(dev, MT_INT1_MASK_CSR, mdev->mmio.irqmask);
-diff --git a/mt7996/mtk_debug.h b/mt7996/mtk_debug.h
-index 27d8f1cb..da2a6072 100644
---- a/mt7996/mtk_debug.h
-+++ b/mt7996/mtk_debug.h
-@@ -561,6 +561,11 @@ struct queue_desc {
- #define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x574) // 8574
- #define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x578) // 8578
- #define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x57c) // 857C
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING9_CTRL0_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x590) // 8590
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING9_CTRL1_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x594) // 8594
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING9_CTRL2_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x598) // 8598
-+#define WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING9_CTRL3_ADDR     (WF_WFDMA_HOST_DMA0_PCIE1_BASE + 0x59c) // 859C
-+
- //MCU DMA
- //#define WF_WFDMA_MCU_DMA0_BASE                                 0x02000
- #define WF_WFDMA_MCU_DMA0_BASE                                 0x54000000
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 03f88780..6eea2c3c 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -536,14 +536,22 @@ mt7996_show_dma_info(struct seq_file *s, struct mt7996_dev *dev)
- 		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING4_CTRL0_ADDR);
- 	dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
- 		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING5_CTRL0_ADDR);
--	dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
--		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
-+	if (is_mt7996(&dev->mt76))
-+		dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
-+	else
-+		dump_dma_rx_ring_info(s, dev, "R6:TxDone0(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_WPDMA_RX_RING6_CTRL0_ADDR);
- 	dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
- 		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING7_CTRL0_ADDR);
- 	dump_dma_rx_ring_info(s, dev, "R8:BUF0(MAC2H)", "Both",
- 		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING8_CTRL0_ADDR);
--	dump_dma_rx_ring_info(s, dev, "R9:TxDone0(MAC2H)", "Both",
--		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
-+	if (is_mt7996(&dev->mt76))
-+		dump_dma_rx_ring_info(s, dev, "R9:TxDone0(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
-+	else
-+		dump_dma_rx_ring_info(s, dev, "R9:BUF0(MAC2H)", "Both",
-+			WF_WFDMA_HOST_DMA0_WPDMA_RX_RING9_CTRL0_ADDR);
- 	dump_dma_rx_ring_info(s, dev, "R10:MSDU_PG0(MAC2H)", "Both",
- 		WF_WFDMA_HOST_DMA0_WPDMA_RX_RING10_CTRL0_ADDR);
- 	dump_dma_rx_ring_info(s, dev, "R11:MSDU_PG1(MAC2H)", "Both",
-@@ -561,15 +569,18 @@ mt7996_show_dma_info(struct seq_file *s, struct mt7996_dev *dev)
- 			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING21_CTRL0_ADDR);
- 		dump_dma_tx_ring_info(s, dev, "T22:TXD?(H2WA)", "AP",
- 			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_TX_RING22_CTRL0_ADDR);
--
- 		dump_dma_rx_ring_info(s, dev, "R3:TxDone1(WA2H)", "AP",
- 			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING3_CTRL0_ADDR);
- 		dump_dma_rx_ring_info(s, dev, "R5:Data1(MAC2H)", "Both",
- 			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING5_CTRL0_ADDR);
--		dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
--			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR);
-+		if (is_mt7996(&dev->mt76))
-+			dump_dma_rx_ring_info(s, dev, "R6:BUF1(MAC2H)", "Both",
-+				WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING6_CTRL0_ADDR);
- 		dump_dma_rx_ring_info(s, dev, "R7:TxDone1(MAC2H)", "Both",
- 			WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING7_CTRL0_ADDR);
-+		if (is_mt7992(&dev->mt76))
-+			dump_dma_rx_ring_info(s, dev, "R9:BUF1(MAC2H)", "Both",
-+				WF_WFDMA_HOST_DMA0_PCIE1_WPDMA_RX_RING9_CTRL0_ADDR);
- 	}
- 
- 	/* MCU DMA information */
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 352d1b29..a3b62339 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -411,6 +411,7 @@ enum offs_rev {
- 
- #define MT_WFDMA0_RX_INT_PCIE_SEL		MT_WFDMA0(0x154)
- #define MT_WFDMA0_RX_INT_SEL_RING3		BIT(3)
-+#define MT_WFDMA0_RX_INT_SEL_RING5		BIT(5)
- #define MT_WFDMA0_RX_INT_SEL_RING6		BIT(6)
- #define MT_WFDMA0_RX_INT_SEL_RING9		BIT(9)
- 
-@@ -451,6 +452,7 @@ enum offs_rev {
- 
- #define MT_WFDMA_HOST_CONFIG			MT_WFDMA_EXT_CSR(0x30)
- #define MT_WFDMA_HOST_CONFIG_PDMA_BAND		BIT(0)
-+#define MT_WFDMA_HOST_CONFIG_BAND1_PCIE1	BIT(21)
- #define MT_WFDMA_HOST_CONFIG_BAND2_PCIE1	BIT(22)
- 
- #define MT_WFDMA_EXT_CSR_HIF_MISC		MT_WFDMA_EXT_CSR(0x44)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2016-mtk-wifi-mt76-mt7996-add-SER-state-log-for-debug.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2016-mtk-wifi-mt76-mt7996-add-SER-state-log-for-debug.patch
deleted file mode 100644
index 62ae0f3..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2016-mtk-wifi-mt76-mt7996-add-SER-state-log-for-debug.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 720514e0de2e86d79e4423b824734014c6040e1b Mon Sep 17 00:00:00 2001
-From: Bo Jiao <Bo.Jiao@mediatek.com>
-Date: Mon, 6 Nov 2023 16:37:23 +0800
-Subject: [PATCH 2016/2032] mtk: wifi: mt76: mt7996: add SER state log for
- debug.
-
-Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
----
- mt7996/mac.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 48cb2ac0..912ae650 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -2172,6 +2172,9 @@ void mt7996_coredump(struct mt7996_dev *dev, u8 state)
- 
- void mt7996_reset(struct mt7996_dev *dev)
- {
-+	dev_info(dev->mt76.dev, "%s SER recovery state: 0x%08x\n",
-+		 wiphy_name(dev->mt76.hw->wiphy), READ_ONCE(dev->recovery.state));
-+
- 	if (!dev->recovery.hw_init_done)
- 		return;
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2017-mtk-wifi-mt76-mt7996-Remove-wed-rro-ring-add-napi-at.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2017-mtk-wifi-mt76-mt7996-Remove-wed-rro-ring-add-napi-at.patch
deleted file mode 100644
index 5958fe2..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2017-mtk-wifi-mt76-mt7996-Remove-wed-rro-ring-add-napi-at.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 253dc25979390b559324187a5a2d1e35552a93c8 Mon Sep 17 00:00:00 2001
-From: mtk27745 <rex.lu@mediatek.com>
-Date: Mon, 6 Nov 2023 10:16:34 +0800
-Subject: [PATCH 2017/2032] mtk: wifi: mt76: mt7996: Remove wed rro ring add
- napi at init state
-
-without this patch. rro ring will add napi at initial state. once rro ring add napi, it will have chance to be used by host driver. if host driver accessed the ring data, it will cause some issue.
-
-Signed-off-by: mtk27745 <rex.lu@mediatek.com>
----
- dma.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/dma.c b/dma.c
-index e23b744b..38701c71 100644
---- a/dma.c
-+++ b/dma.c
-@@ -1017,6 +1017,10 @@ mt76_dma_init(struct mt76_dev *dev,
- 	init_completion(&dev->mmio.wed_reset_complete);
- 
- 	mt76_for_each_q_rx(dev, i) {
-+		if (mtk_wed_device_active(&dev->mmio.wed) &&
-+		    mt76_queue_is_wed_rro(&dev->q_rx[i]))
-+			continue;
-+
- 		netif_napi_add(&dev->napi_dev, &dev->napi[i], poll);
- 		mt76_dma_rx_fill(dev, &dev->q_rx[i], false);
- 		napi_enable(&dev->napi[i]);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2018-mtk-wifi-mt76-mt7996-Remove-wed_stop-during-L1-SER.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2018-mtk-wifi-mt76-mt7996-Remove-wed_stop-during-L1-SER.patch
deleted file mode 100644
index 3bfbbc4..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2018-mtk-wifi-mt76-mt7996-Remove-wed_stop-during-L1-SER.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 4ce1116a988fa2b0172ec96797a0a81ff4899c35 Mon Sep 17 00:00:00 2001
-From: Rex Lu <rex.lu@mediatek.com>
-Date: Wed, 29 Nov 2023 13:56:52 +0800
-Subject: [PATCH 2018/2032] mtk: wifi: mt76: mt7996: Remove wed_stop during L1
- SER
-
-Align logan L1 SER flow. During L1 SER, didn't need to close wed interrupt.
-
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
----
- mt7996/mac.c | 6 ------
- 1 file changed, 6 deletions(-)
-
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 912ae650..142e9372 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -1954,12 +1954,6 @@ void mt7996_mac_reset_work(struct work_struct *work)
- 	dev_info(dev->mt76.dev,"\n%s L1 SER recovery start.",
- 		 wiphy_name(dev->mt76.hw->wiphy));
- 
--	if (mtk_wed_device_active(&dev->mt76.mmio.wed_hif2))
--		mtk_wed_device_stop(&dev->mt76.mmio.wed_hif2);
--
--	if (mtk_wed_device_active(&dev->mt76.mmio.wed))
--		mtk_wed_device_stop(&dev->mt76.mmio.wed);
--
- 	ieee80211_stop_queues(mt76_hw(dev));
- 	if (phy2)
- 		ieee80211_stop_queues(phy2->mt76->hw);
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2019-mtk-wifi-mt76-mt7996-Refactor-rro-del-ba-command-for.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2019-mtk-wifi-mt76-mt7996-Refactor-rro-del-ba-command-for.patch
deleted file mode 100644
index 4b021cb..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2019-mtk-wifi-mt76-mt7996-Refactor-rro-del-ba-command-for.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From 302b6abf2ae7eb56c7e437d67b2aa49a7d47d4fa Mon Sep 17 00:00:00 2001
-From: Rex Lu <rex.lu@mediatek.com>
-Date: Wed, 29 Nov 2023 15:51:04 +0800
-Subject: [PATCH 2019/2032] mtk: wifi: mt76: mt7996: Refactor rro del ba
- command format
-
-1. remove unused struct
-2. refactor upstream del ba command format
-
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
----
- mt7996/mcu.h | 50 +++-----------------------------------------------
- 1 file changed, 3 insertions(+), 47 deletions(-)
-
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 7b8540f6..a05dd6a5 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -273,7 +273,9 @@ struct mt7996_mcu_wed_rro_ba_delete_event {
- 	__le16 len;
- 
- 	__le16 session_id;
--	u8 __rsv2[2];
-+	__le16 mld_id;
-+	u8 tid;
-+	u8 __rsv[3];
- } __packed;
- 
- enum  {
-@@ -298,52 +300,6 @@ struct mt7996_mcu_thermal_notify {
- 	u8 __rsv2[4];
- } __packed;
- 
--struct mt7996_mcu_rro_event {
--	struct mt7996_mcu_rxd rxd;
--
--	u8 __rsv1[4];
--
--	__le16 tag;
--	__le16 len;
--} __packed;
--
--struct mt7996_mcu_rro_ba {
--	__le16 tag;
--	__le16 len;
--
--	__le16 wlan_id;
--	u8 tid;
--	u8 __rsv1;
--	__le32 status;
--	__le16 session_id;
--	u8 __rsv2[2];
--} __packed;
--
--struct mt7996_mcu_rro_ba_del_chk_done {
--	__le16 tag;
--	__le16 len;
--
--	__le16 session_id;
--	__le16 mld_id;
--	u8 tid;
--	u8 __rsv[3];
--} __packed;
--
--enum  {
--	UNI_RRO_BA_SESSION_STATUS = 0,
--	UNI_RRO_BA_SESSION_TBL	= 1,
--	UNI_RRO_BA_SESSION_DEL_CHK_DONE = 2,
--	UNI_RRO_BA_SESSION_MAX_NUM
--};
--
--struct mt7996_mcu_rro_del_ba {
--	struct mt7996_mcu_rro_event event;
--
--	u8  wlan_idx;
--	u8  tid;
--	u8 __rsv2[2];
--};
--
- enum mt7996_chan_mib_offs {
- 	UNI_MIB_OBSS_AIRTIME = 26,
- 	UNI_MIB_NON_WIFI_TIME = 27,
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2020-mtk-wifi-mt76-mt7996-get-airtime-and-RSSI-via-MCU-co.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2020-mtk-wifi-mt76-mt7996-get-airtime-and-RSSI-via-MCU-co.patch
deleted file mode 100644
index 6860f6c..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2020-mtk-wifi-mt76-mt7996-get-airtime-and-RSSI-via-MCU-co.patch
+++ /dev/null
@@ -1,784 +0,0 @@
-From da85f2d8c8f3147aab467ba9d65c6457cba0ad1e Mon Sep 17 00:00:00 2001
-From: Benjamin Lin <benjamin-jw.lin@mediatek.com>
-Date: Fri, 17 Nov 2023 18:08:06 +0800
-Subject: [PATCH 2020/2032] mtk: wifi: mt76: mt7996: get airtime and RSSI via
- MCU commands
-
-Direct access to WTBL for airtime and RSSI may cause synchronization issue with FW.
-Moreover, frequent access to WTBL, whenever TX-Free-Done event is received, leads to heavy CPU overheads.
-Therefore, indirect access to WTBL, through FW, with lower frequence is performed.
-
-Signed-off-by: Yi-Chia Hsieh <yi-chia.hsieh@mediatek.com>
-Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
----
- mt76.h               |  20 +++++
- mt76_connac_mcu.h    |  14 +++-
- mt7996/debugfs.c     |  17 ++---
- mt7996/mac.c         | 145 ++++++-----------------------------
- mt7996/mcu.c         | 177 +++++++++++++++++++++++++++++++++++++++++--
- mt7996/mcu.h         |  32 +++++++-
- mt7996/mt7996.h      |  26 ++++++-
- mt7996/mtk_debugfs.c |  71 +++++++++++++++++
- mt7996/regs.h        |   2 +
- 9 files changed, 361 insertions(+), 143 deletions(-)
-
-diff --git a/mt76.h b/mt76.h
-index 49b66ff2..c7816721 100644
---- a/mt76.h
-+++ b/mt76.h
-@@ -327,11 +327,15 @@ struct mt76_sta_stats {
- 	u32 tx_packets;		/* unit: MSDU */
- 	u32 tx_retries;
- 	u32 tx_failed;
-+	u32 tx_total_mpdu_cnt;
-+	u32 tx_failed_mpdu_cnt;
-+	u64 tx_airtime;
- 	/* WED RX */
- 	u64 rx_bytes;
- 	u32 rx_packets;
- 	u32 rx_errors;
- 	u32 rx_drops;
-+	u64 rx_airtime;
- };
- 
- enum mt76_wcid_flags {
-@@ -1330,6 +1334,22 @@ static inline int mt76_decr(int val, int size)
- 
- u8 mt76_ac_to_hwq(u8 ac);
- 
-+static inline u8
-+mt76_ac_to_tid(u8 ac)
-+{
-+	static const u8 ac_to_tid[] = {
-+		[IEEE80211_AC_BE] = 0,
-+		[IEEE80211_AC_BK] = 1,
-+		[IEEE80211_AC_VI] = 4,
-+		[IEEE80211_AC_VO] = 6
-+	};
-+
-+	if (WARN_ON(ac >= IEEE80211_NUM_ACS))
-+		return 0;
-+
-+	return ac_to_tid[ac];
-+}
-+
- static inline struct ieee80211_txq *
- mtxq_to_txq(struct mt76_txq *mtxq)
- {
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 266ee711..4f4b7b4f 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1368,11 +1368,23 @@ enum {
- 	UNI_OFFLOAD_OFFLOAD_BMC_RPY_DETECT,
- };
- 
-+enum UNI_PER_STA_INFO_TAG {
-+	UNI_PER_STA_RSSI,
-+	UNI_PER_STA_CONTENTION_RX_RATE,
-+	UNI_PER_STA_PER,
-+	UNI_PER_STA_SNR,
-+	UNI_PER_STA_TX_RATE,
-+	UNI_PER_STA_TX_CNT,
-+	UNI_PER_STA_TID_SN_GET,
-+	UNI_PER_STA_TID_SN_SET,
-+	UNI_PER_STA_MAX_NUM
-+};
-+
- enum UNI_ALL_STA_INFO_TAG {
- 	UNI_ALL_STA_TXRX_RATE,
- 	UNI_ALL_STA_TX_STAT,
- 	UNI_ALL_STA_TXRX_ADM_STAT,
--	UNI_ALL_STA_TXRX_AIR_TIME,
-+	UNI_ALL_STA_TXRX_AIRTIME,
- 	UNI_ALL_STA_DATA_TX_RETRY_COUNT,
- 	UNI_ALL_STA_GI_MODE,
- 	UNI_ALL_STA_TXRX_MSDU_COUNT,
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 8e4ceeeb..6ccf0827 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -987,12 +987,11 @@ mt7996_airtime_read(struct seq_file *s, void *data)
- {
- 	struct mt7996_dev *dev = dev_get_drvdata(s->private);
- 	struct mt76_dev *mdev = &dev->mt76;
--	struct mt7996_vow_sta_ctrl *vow;
-+	struct mt76_sta_stats *stats;
- 	struct ieee80211_sta *sta;
- 	struct mt7996_sta *msta;
- 	struct mt76_wcid *wcid;
- 	struct mt76_vif *vif;
--	u64 airtime;
- 	u16 i;
- 
- 	seq_printf(s, "VoW Airtime Information:\n");
-@@ -1004,16 +1003,16 @@ mt7996_airtime_read(struct seq_file *s, void *data)
- 
- 		msta = container_of(wcid, struct mt7996_sta, wcid);
- 		sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
--		vow = &msta->vow;
- 		vif = &msta->vif->mt76;
-+		stats = &wcid->stats;
- 
--		spin_lock_bh(&vow->lock);
--		airtime = vow->tx_airtime;
--		vow->tx_airtime = 0;
--		spin_unlock_bh(&vow->lock);
-+		seq_printf(s, "%pM WCID: %hu BandIdx: %hhu OmacIdx: 0x%hhx\t"
-+		              "TxAirtime: %llu\tRxAirtime: %llu\n",
-+		              sta->addr, i, vif->band_idx, vif->omac_idx,
-+		              stats->tx_airtime, stats->rx_airtime);
- 
--		seq_printf(s, "%pM WCID: %hu BandIdx: %hhu OmacIdx: 0x%hhx\tTxAirtime: %llu\n",
--		           sta->addr, i, vif->band_idx, vif->omac_idx, airtime);
-+		stats->tx_airtime = 0;
-+		stats->rx_airtime = 0;
- 	}
- 	rcu_read_unlock();
- 
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 142e9372..901c2036 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -12,8 +12,6 @@
- #include "mcu.h"
- #include "vendor.h"
- 
--#define to_rssi(field, rcpi)	((FIELD_GET(field, rcpi) - 220) / 2)
--
- static const struct mt7996_dfs_radar_spec etsi_radar_specs = {
- 	.pulse_th = { 110, -10, -80, 40, 5200, 128, 5200 },
- 	.radar_pattern = {
-@@ -93,110 +91,6 @@ u32 mt7996_mac_wtbl_lmac_addr(struct mt7996_dev *dev, u16 wcid, u8 dw)
- 	return MT_WTBL_LMAC_OFFS(wcid, dw);
- }
- 
--static void mt7996_mac_sta_poll(struct mt7996_dev *dev)
--{
--	static const u8 ac_to_tid[] = {
--		[IEEE80211_AC_BE] = 0,
--		[IEEE80211_AC_BK] = 1,
--		[IEEE80211_AC_VI] = 4,
--		[IEEE80211_AC_VO] = 6
--	};
--	struct ieee80211_sta *sta;
--	struct mt7996_sta *msta;
--	struct mt7996_vow_sta_ctrl *vow;
--	u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
--	LIST_HEAD(sta_poll_list);
--	int i;
--
--	spin_lock_bh(&dev->mt76.sta_poll_lock);
--	list_splice_init(&dev->mt76.sta_poll_list, &sta_poll_list);
--	spin_unlock_bh(&dev->mt76.sta_poll_lock);
--
--	rcu_read_lock();
--
--	while (true) {
--		bool clear = false;
--		u32 addr, val;
--		u16 idx;
--		s8 rssi[4];
--
--		spin_lock_bh(&dev->mt76.sta_poll_lock);
--		if (list_empty(&sta_poll_list)) {
--			spin_unlock_bh(&dev->mt76.sta_poll_lock);
--			break;
--		}
--		msta = list_first_entry(&sta_poll_list,
--					struct mt7996_sta, wcid.poll_list);
--		list_del_init(&msta->wcid.poll_list);
--		spin_unlock_bh(&dev->mt76.sta_poll_lock);
--
--		idx = msta->wcid.idx;
--
--		/* refresh peer's airtime reporting */
--		addr = mt7996_mac_wtbl_lmac_addr(dev, idx, 20);
--
--		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
--			u32 tx_last = msta->airtime_ac[i];
--			u32 rx_last = msta->airtime_ac[i + 4];
--
--			msta->airtime_ac[i] = mt76_rr(dev, addr);
--			msta->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
--
--			tx_time[i] = msta->airtime_ac[i] - tx_last;
--			rx_time[i] = msta->airtime_ac[i + 4] - rx_last;
--
--			if ((tx_last | rx_last) & BIT(30))
--				clear = true;
--
--			addr += 8;
--		}
--
--		if (clear) {
--			mt7996_mac_wtbl_update(dev, idx,
--					       MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
--			memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
--		}
--
--		if (!msta->wcid.sta)
--			continue;
--
--		sta = container_of((void *)msta, struct ieee80211_sta,
--				   drv_priv);
--		vow = &msta->vow;
--		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
--			u8 q = mt76_connac_lmac_mapping(i);
--			u32 tx_cur = tx_time[q];
--			u32 rx_cur = rx_time[q];
--			u8 tid = ac_to_tid[i];
--
--			if (!tx_cur && !rx_cur)
--				continue;
--
--			ieee80211_sta_register_airtime(sta, tid, tx_cur, rx_cur);
--
--			spin_lock_bh(&vow->lock);
--			vow->tx_airtime += tx_cur;
--			spin_unlock_bh(&vow->lock);
--		}
--
--		/* get signal strength of resp frames (CTS/BA/ACK) */
--		addr = mt7996_mac_wtbl_lmac_addr(dev, idx, 34);
--		val = mt76_rr(dev, addr);
--
--		rssi[0] = to_rssi(GENMASK(7, 0), val);
--		rssi[1] = to_rssi(GENMASK(15, 8), val);
--		rssi[2] = to_rssi(GENMASK(23, 16), val);
--		rssi[3] = to_rssi(GENMASK(31, 14), val);
--
--		msta->ack_signal =
--			mt76_rx_signal(msta->vif->phy->mt76->antenna_mask, rssi);
--
--		ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
--	}
--
--	rcu_read_unlock();
--}
--
- void mt7996_mac_enable_rtscts(struct mt7996_dev *dev,
- 			      struct ieee80211_vif *vif, bool enable)
- {
-@@ -1206,8 +1100,6 @@ mt7996_mac_tx_free(struct mt7996_dev *dev, void *data, int len)
- 		}
- 	}
- 
--	mt7996_mac_sta_poll(dev);
--
- 	if (wake)
- 		mt76_set_tx_blocked(&dev->mt76, false);
- 
-@@ -2383,31 +2275,42 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
- 
- void mt7996_mac_work(struct work_struct *work)
- {
--	struct mt7996_phy *phy;
--	struct mt76_phy *mphy;
--
--	mphy = (struct mt76_phy *)container_of(work, struct mt76_phy,
--					       mac_work.work);
--	phy = mphy->priv;
-+	struct mt76_phy *mphy = (struct mt76_phy *)container_of(work, struct mt76_phy,
-+	                                                        mac_work.work);
-+	struct mt7996_phy *phy = mphy->priv;
-+	struct mt76_dev *mdev = mphy->dev;
- 
--	mutex_lock(&mphy->dev->mutex);
-+	mutex_lock(&mdev->mutex);
- 
- 	mt76_update_survey(mphy);
- 	if (++mphy->mac_work_count == 5) {
-+		int i;
-+
- 		mphy->mac_work_count = 0;
- 
- 		mt7996_mac_update_stats(phy);
- 
--		mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_RATE);
--		if (mtk_wed_device_active(&phy->dev->mt76.mmio.wed)) {
--			mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_ADM_STAT);
--			mt7996_mcu_get_all_sta_info(phy, UNI_ALL_STA_TXRX_MSDU_COUNT);
-+		/* Update DEV-wise information only in
-+		 * the MAC work of the first band running.
-+		 */
-+		for (i = MT_BAND0; i <= mphy->band_idx; ++i) {
-+			if (i == mphy->band_idx) {
-+				mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_RATE);
-+				mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_AIRTIME);
-+				mt7996_mcu_get_rssi(mdev);
-+				if (mtk_wed_device_active(&mdev->mmio.wed)) {
-+					mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_ADM_STAT);
-+					mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_MSDU_COUNT);
-+				}
-+			} else if (mt7996_band_valid(phy->dev, i) &&
-+			           test_bit(MT76_STATE_RUNNING, &mdev->phys[i]->state))
-+				break;
- 		}
- 	}
- 
--	mutex_unlock(&mphy->dev->mutex);
-+	mutex_unlock(&mdev->mutex);
- 
--	mt76_tx_status_check(mphy->dev, false);
-+	mt76_tx_status_check(mdev, false);
- 
- 	ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
- 				     MT7996_WATCHDOG_TIME);
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 08979465..4907f729 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -560,7 +560,8 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 		u16 wlan_idx;
- 		struct mt76_wcid *wcid;
- 		struct mt76_phy *mphy;
--		u32 tx_bytes, rx_bytes, tx_packets, rx_packets;
-+		struct ieee80211_sta *sta;
-+		u32 tx_bytes, rx_bytes, tx_airtime, rx_airtime, tx_packets, rx_packets;
- 
- 		switch (le16_to_cpu(res->tag)) {
- 		case UNI_ALL_STA_TXRX_RATE:
-@@ -581,7 +582,7 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 				break;
- 
- 			mphy = mt76_dev_phy(&dev->mt76, wcid->phy_idx);
--			for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
-+			for (ac = IEEE80211_AC_VO; ac < IEEE80211_NUM_ACS; ac++) {
- 				tx_bytes = le32_to_cpu(res->adm_stat[i].tx_bytes[ac]);
- 				rx_bytes = le32_to_cpu(res->adm_stat[i].rx_bytes[ac]);
- 
-@@ -613,6 +614,24 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 			__mt7996_stat_to_netdev(mphy, wcid, 0, 0,
- 						tx_packets, rx_packets);
- 			break;
-+		case UNI_ALL_STA_TXRX_AIRTIME:
-+			wlan_idx = le16_to_cpu(res->airtime[i].wlan_idx);
-+			wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]);
-+			sta = wcid_to_sta(wcid);
-+			if (!sta)
-+				continue;
-+
-+			for (ac = IEEE80211_AC_VO; ac < IEEE80211_NUM_ACS; ++ac) {
-+				u8 lmac_ac = mt76_connac_lmac_mapping(ac);
-+				tx_airtime = le32_to_cpu(res->airtime[i].tx[lmac_ac]);
-+				rx_airtime = le32_to_cpu(res->airtime[i].rx[lmac_ac]);
-+
-+				wcid->stats.tx_airtime += tx_airtime;
-+				wcid->stats.rx_airtime += rx_airtime;
-+				ieee80211_sta_register_airtime(sta, mt76_ac_to_tid(ac),
-+				                               tx_airtime, rx_airtime);
-+			}
-+			break;
- 		default:
- 			break;
- 		}
-@@ -2242,8 +2261,6 @@ mt7996_mcu_sta_init_vow(struct mt7996_phy *phy, struct mt7996_sta *msta)
- 	vow->drr_quantum[IEEE80211_AC_VI] = VOW_DRR_QUANTUM_IDX1;
- 	vow->drr_quantum[IEEE80211_AC_BE] = VOW_DRR_QUANTUM_IDX2;
- 	vow->drr_quantum[IEEE80211_AC_BK] = VOW_DRR_QUANTUM_IDX2;
--	vow->tx_airtime = 0;
--	spin_lock_init(&vow->lock);
- 
- 	ret = mt7996_mcu_set_vow_drr_ctrl(phy, msta, VOW_DRR_CTRL_STA_BSS_GROUP);
- 	if (ret)
-@@ -4849,9 +4866,155 @@ int mt7996_mcu_set_rro(struct mt7996_dev *dev, u16 tag, u16 val)
- 				 sizeof(req), true);
- }
- 
--int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag)
-+int mt7996_mcu_get_per_sta_info(struct mt76_dev *dev, u16 tag,
-+	                        u16 sta_num, u16 *sta_list)
-+{
-+#define PER_STA_INFO_MAX_NUM	90
-+	struct mt7996_mcu_per_sta_info_event *res;
-+	struct mt76_wcid *wcid;
-+	struct sk_buff *skb;
-+	u16 wlan_idx;
-+	int i, ret;
-+	struct {
-+		u8 __rsv1;
-+		u8 unsolicit;
-+		u8 __rsv2[2];
-+
-+		__le16 tag;
-+		__le16 len;
-+		__le16 sta_num;
-+		u8 __rsv3[2];
-+		__le16 sta_list[PER_STA_INFO_MAX_NUM];
-+	} __packed req = {
-+		.unsolicit = 0,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.sta_num = cpu_to_le16(sta_num)
-+	};
-+
-+	if (sta_num > PER_STA_INFO_MAX_NUM)
-+		return -EINVAL;
-+
-+	for (i = 0; i < sta_num; ++i)
-+		req.sta_list[i] = cpu_to_le16(sta_list[i]);
-+
-+	ret = mt76_mcu_send_and_get_msg(dev, MCU_WM_UNI_CMD(PER_STA_INFO),
-+	                                &req, sizeof(req), true, &skb);
-+	if (ret)
-+		return ret;
-+
-+	res = (struct mt7996_mcu_per_sta_info_event *)skb->data;
-+	if (le16_to_cpu(res->tag) != tag) {
-+		ret = -EINVAL;
-+		goto out;
-+	}
-+
-+	rcu_read_lock();
-+	switch (tag) {
-+	case UNI_PER_STA_RSSI:
-+		for (i = 0; i < sta_num; ++i) {
-+			struct mt7996_sta *msta;
-+			struct mt76_phy *phy;
-+			s8 rssi[4];
-+			u8 *rcpi;
-+
-+			wlan_idx = le16_to_cpu(res->rssi[i].wlan_idx);
-+			wcid = rcu_dereference(dev->wcid[wlan_idx]);
-+			if (wcid) {
-+				rcpi = res->rssi[i].rcpi;
-+				rssi[0] = to_rssi(MT_PRXV_RCPI0, rcpi[0]);
-+				rssi[1] = to_rssi(MT_PRXV_RCPI0, rcpi[1]);
-+				rssi[2] = to_rssi(MT_PRXV_RCPI0, rcpi[2]);
-+				rssi[3] = to_rssi(MT_PRXV_RCPI0, rcpi[3]);
-+
-+				msta = container_of(wcid, struct mt7996_sta, wcid);
-+				phy = msta->vif->phy->mt76;
-+				msta->ack_signal = mt76_rx_signal(phy->antenna_mask, rssi);
-+				ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
-+			} else {
-+				ret = -EINVAL;
-+				dev_err(dev->dev, "Failed to update RSSI for "
-+				                  "invalid WCID: %hu\n", wlan_idx);
-+			}
-+		}
-+		break;
-+	case UNI_PER_STA_TX_CNT:
-+		for (i = 0; i < sta_num; ++i) {
-+			wlan_idx = le16_to_cpu(res->tx_cnt[i].wlan_idx);
-+			wcid = rcu_dereference(dev->wcid[wlan_idx]);
-+			if (wcid) {
-+				wcid->stats.tx_total_mpdu_cnt +=
-+				            le32_to_cpu(res->tx_cnt[i].total);
-+				wcid->stats.tx_failed_mpdu_cnt +=
-+				            le32_to_cpu(res->tx_cnt[i].failed);
-+			} else {
-+				ret = -EINVAL;
-+				dev_err(dev->dev, "Failed to update TX MPDU counts "
-+				                  "for invalid WCID: %hu\n", wlan_idx);
-+			}
-+		}
-+		break;
-+	default:
-+		ret = -EINVAL;
-+		dev_err(dev->dev, "Unknown UNI_PER_STA_INFO_TAG: %d\n", tag);
-+	}
-+	rcu_read_unlock();
-+out:
-+	dev_kfree_skb(skb);
-+	return ret;
-+}
-+
-+int mt7996_mcu_get_rssi(struct mt76_dev *dev)
-+{
-+	u16 sta_list[PER_STA_INFO_MAX_NUM];
-+	LIST_HEAD(sta_poll_list);
-+	struct mt7996_sta *msta;
-+	int i, ret;
-+	bool empty = false;
-+
-+	spin_lock_bh(&dev->sta_poll_lock);
-+	list_splice_init(&dev->sta_poll_list, &sta_poll_list);
-+	spin_unlock_bh(&dev->sta_poll_lock);
-+
-+	while (!empty) {
-+		for (i = 0; i < PER_STA_INFO_MAX_NUM; ++i) {
-+			spin_lock_bh(&dev->sta_poll_lock);
-+			if (list_empty(&sta_poll_list)) {
-+				spin_unlock_bh(&dev->sta_poll_lock);
-+
-+				if (i == 0)
-+					return 0;
-+
-+				empty = true;
-+				break;
-+			}
-+			msta = list_first_entry(&sta_poll_list,
-+			                        struct mt7996_sta,
-+			                        wcid.poll_list);
-+			list_del_init(&msta->wcid.poll_list);
-+			spin_unlock_bh(&dev->sta_poll_lock);
-+
-+			sta_list[i] = msta->wcid.idx;
-+		}
-+
-+		ret = mt7996_mcu_get_per_sta_info(dev, UNI_PER_STA_RSSI,
-+		                                  i, sta_list);
-+		if (ret) {
-+			/* Add STAs, whose RSSI has not been updated,
-+			 * back to polling list.
-+			 */
-+			spin_lock_bh(&dev->sta_poll_lock);
-+			list_splice(&sta_poll_list, &dev->sta_poll_list);
-+			spin_unlock_bh(&dev->sta_poll_lock);
-+			break;
-+		}
-+	}
-+
-+	return ret;
-+}
-+
-+int mt7996_mcu_get_all_sta_info(struct mt76_dev *dev, u16 tag)
- {
--	struct mt7996_dev *dev = phy->dev;
- 	struct {
- 		u8 _rsv[4];
- 
-@@ -4862,7 +5025,7 @@ int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag)
- 		.len = cpu_to_le16(sizeof(req) - 4),
- 	};
- 
--	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(ALL_STA_INFO),
-+	return mt76_mcu_send_msg(dev, MCU_WM_UNI_CMD(ALL_STA_INFO),
- 				 &req, sizeof(req), false);
- }
- 
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index a05dd6a5..cd327451 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -199,6 +199,31 @@ struct mt7996_mcu_mib {
- 	__le64 data;
- } __packed;
- 
-+struct per_sta_rssi {
-+	__le16 wlan_idx;
-+	u8 __rsv[2];
-+	u8 rcpi[4];
-+} __packed;
-+
-+struct per_sta_tx_cnt {
-+	__le16 wlan_idx;
-+	u8 __rsv[2];
-+	__le32 total;
-+	__le32 failed;
-+} __packed;
-+
-+struct mt7996_mcu_per_sta_info_event {
-+	u8 __rsv[4];
-+
-+	__le16 tag;
-+	__le16 len;
-+
-+	union {
-+		struct per_sta_rssi rssi[0];
-+		struct per_sta_tx_cnt tx_cnt[0];
-+	};
-+} __packed;
-+
- struct all_sta_trx_rate {
- 	__le16 wlan_idx;
- 	u8 __rsv1[2];
-@@ -237,13 +262,18 @@ struct mt7996_mcu_all_sta_info_event {
- 			__le32 tx_bytes[IEEE80211_NUM_ACS];
- 			__le32 rx_bytes[IEEE80211_NUM_ACS];
- 		} adm_stat[0] __packed;
--
- 		struct {
- 			__le16 wlan_idx;
- 			u8 rsv[2];
- 			__le32 tx_msdu_cnt;
- 			__le32 rx_msdu_cnt;
- 		} msdu_cnt[0] __packed;
-+		struct {
-+			__le16 wlan_idx;
-+			u8 __rsv[2];
-+			__le32 tx[IEEE80211_NUM_ACS];
-+			__le32 rx[IEEE80211_NUM_ACS];
-+		} airtime[0] __packed;
- 	} __packed;
- } __packed;
- 
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index d1d35e56..c5b83648 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -126,6 +126,8 @@
- #define MT7996_RRO_MSDU_PG_CR_CNT 8
- #define MT7996_RRO_MSDU_PG_SIZE_PER_CR 0x10000
- 
-+#define to_rssi(field, rcpi)	((FIELD_GET(field, rcpi) - 220) / 2)
-+
- struct mt7996_vif;
- struct mt7996_sta;
- struct mt7996_dfs_pulse;
-@@ -298,8 +300,6 @@ struct mt7996_vow_sta_ctrl {
- 	bool paused;
- 	u8 bss_grp_idx;
- 	u8 drr_quantum[IEEE80211_NUM_ACS];
--	u64 tx_airtime;
--	spinlock_t lock;
- };
- 
- struct mt7996_sta {
-@@ -308,7 +308,6 @@ struct mt7996_sta {
- 	struct mt7996_vif *vif;
- 
- 	struct list_head rc_list;
--	u32 airtime_ac[8];
- 
- 	int ack_signal;
- 	struct ewma_avg_signal avg_ack_signal;
-@@ -405,6 +404,21 @@ struct mt7996_air_monitor_ctrl {
- };
- #endif
- 
-+struct mt7996_rro_ba_session {
-+	u32 ack_sn         :12;
-+	u32 win_sz         :3;
-+	u32 bn             :1;
-+	u32 last_in_sn     :12;
-+	u32 bc             :1;
-+	u32 bd             :1;
-+	u32 sat            :1;
-+	u32 cn             :1;
-+	u32 within_cnt     :12;
-+	u32 to_sel         :3;
-+	u32 rsv            :1;
-+	u32 last_in_rxtime :12;
-+};
-+
- struct mt7996_phy {
- 	struct mt76_phy *mt76;
- 	struct mt7996_dev *dev;
-@@ -594,6 +608,7 @@ struct mt7996_dev {
- 		u32 fw_dbg_module;
- 		u8 fw_dbg_lv;
- 		u32 bcn_total_cnt[__MT_MAX_BAND];
-+		u32 sid;
- 	} dbg;
- 	const struct mt7996_dbg_reg_desc *dbg_reg;
- #endif
-@@ -819,7 +834,10 @@ int mt7996_mcu_fw_dbg_ctrl(struct mt7996_dev *dev, u32 module, u8 level);
- int mt7996_mcu_trigger_assert(struct mt7996_dev *dev);
- void mt7996_mcu_rx_event(struct mt7996_dev *dev, struct sk_buff *skb);
- void mt7996_mcu_exit(struct mt7996_dev *dev);
--int mt7996_mcu_get_all_sta_info(struct mt7996_phy *phy, u16 tag);
-+int mt7996_mcu_get_per_sta_info(struct mt76_dev *dev, u16 tag,
-+	                        u16 sta_num, u16 *sta_list);
-+int mt7996_mcu_get_rssi(struct mt76_dev *dev);
-+int mt7996_mcu_get_all_sta_info(struct mt76_dev *dev, u16 tag);
- int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id);
- int mt7996_mcu_set_tx_power_ctrl(struct mt7996_phy *phy, u8 power_ctrl_id, u8 data);
- int mt7996_mcu_get_tx_power_info(struct mt7996_phy *phy, u8 category, void *event);
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 6eea2c3c..916c7c06 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -3047,6 +3047,69 @@ mt7996_vow_drr_dbg(void *data, u64 val)
- DEFINE_DEBUGFS_ATTRIBUTE(fops_vow_drr_dbg, NULL,
- 			 mt7996_vow_drr_dbg, "%lld\n");
- 
-+static int
-+mt7996_rro_session_read(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	struct mt7996_rro_ba_session *tbl;
-+	u32 value[2];
-+
-+	mt76_wr(dev, MT_RRO_DBG_RD_CTRL, MT_RRO_DBG_RD_EXEC +
-+		(dev->dbg.sid >> 1) + 0x200);
-+
-+	if (dev->dbg.sid & 0x1) {
-+		value[0] = mt76_rr(dev, MT_RRO_DBG_RDAT_DW(2));
-+		value[1] = mt76_rr(dev, MT_RRO_DBG_RDAT_DW(3));
-+	} else {
-+		value[0] = mt76_rr(dev, MT_RRO_DBG_RDAT_DW(0));
-+		value[1] = mt76_rr(dev, MT_RRO_DBG_RDAT_DW(1));
-+	}
-+
-+	tbl = (struct mt7996_rro_ba_session *)&value[0];
-+
-+	seq_printf(s, " seid %d:\nba session table DW0:%08x DW2:%08x\n",
-+		   dev->dbg.sid, value[0], value[1]);
-+
-+	seq_printf(s, "ack_sn = 0x%x, last_in_sn = 0x%x, sat/bn/bc/bd/cn = %d/%d/%d/%d/%d\n",
-+		   tbl->ack_sn, tbl->last_in_sn, tbl->sat, tbl->bn, tbl->bc, tbl->bd, tbl->cn);
-+
-+	seq_printf(s, "within_cnt = %d, to_sel = %d, last_in_rxtime = %d\n",
-+		   tbl->within_cnt, tbl->to_sel, tbl->last_in_rxtime);
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_show_rro_mib(struct seq_file *s, void *data)
-+{
-+	struct mt7996_dev *dev = dev_get_drvdata(s->private);
-+	u32 reg[12];
-+
-+	seq_printf(s, "RRO mib Info:\n");
-+
-+	reg[0] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(0));
-+	reg[1] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(1));
-+	reg[2] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(2));
-+	reg[3] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(3));
-+	reg[4] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(4));
-+	reg[5] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(5));
-+	reg[6] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(6));
-+	reg[7] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(7));
-+	reg[8] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(8));
-+	reg[9] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(9));
-+	reg[10] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(10));
-+	reg[11] = mt76_rr(dev, WF_RRO_TOP_STATISTIC(11));
-+
-+	seq_printf(s, "STEP_ONE/WITHIN/SURPASS = %x/%x/%x\n", reg[0], reg[3], reg[4]);
-+	seq_printf(s, "REPEAT/OLDPKT/BAR = %x/%x/%x\n", reg[1], reg[2], reg[5]);
-+	seq_printf(s, "SURPASS with big gap = %x\n", reg[6]);
-+	seq_printf(s, "DISCONNECT/INVALID = %x/%x\n", reg[7], reg[8]);
-+	seq_printf(s, "TO(Step one)/TO(flush all) = %x/%x\n", reg[9], reg[10]);
-+	seq_printf(s, "buf ran out = %x\n", reg[11]);
-+
-+	return 0;
-+}
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -3146,6 +3209,14 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 
- 	debugfs_create_file("muru_prot_thr", 0200, dir, phy, &fops_muru_prot_thr);
- 
-+	if (dev->has_rro) {
-+		debugfs_create_u32("rro_sid", 0600, dir, &dev->dbg.sid);
-+		debugfs_create_devm_seqfile(dev->mt76.dev, "rro_sid_info", dir,
-+					    mt7996_rro_session_read);
-+		debugfs_create_devm_seqfile(dev->mt76.dev, "rro_mib", dir,
-+					    mt7996_show_rro_mib);
-+	}
-+
- 	return 0;
- }
- 
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index a3b62339..476b23c3 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -122,6 +122,8 @@ enum offs_rev {
- #define MT_MCU_INT_EVENT_DMA_INIT		BIT(1)
- #define MT_MCU_INT_EVENT_RESET_DONE		BIT(3)
- 
-+#define WF_RRO_TOP_STATISTIC(_n)		MT_RRO_TOP(0x180 + _n * 0x4)
-+
- /* PLE */
- #define MT_PLE_BASE				0x820c0000
- #define MT_PLE(ofs)				(MT_PLE_BASE + (ofs))
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2021-mtk-wifi-mt76-mt7996-add-support-for-WMM-PBC-configu.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2021-mtk-wifi-mt76-mt7996-add-support-for-WMM-PBC-configu.patch
deleted file mode 100644
index 6366876..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2021-mtk-wifi-mt76-mt7996-add-support-for-WMM-PBC-configu.patch
+++ /dev/null
@@ -1,218 +0,0 @@
-From 8871427856374447f4275cde02936e73e452c080 Mon Sep 17 00:00:00 2001
-From: Benjamin Lin <benjamin-jw.lin@mediatek.com>
-Date: Thu, 4 Jan 2024 09:47:00 +0800
-Subject: [PATCH 2021/2032] mtk: wifi: mt76: mt7996: add support for WMM PBC
- configuration
-
-Query per-AC-queue packet statistics from WA, and determine if multi-AC transmission is ongoing.
-If it is, enable WMM mode in WA. Otherwise, disable WMM mode.
-
-Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
----
- mt76_connac_mcu.h |  2 ++
- mt7996/init.c     |  2 ++
- mt7996/mac.c      |  4 +++
- mt7996/mcu.c      | 78 +++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mcu.h      | 15 +++++++++
- mt7996/mt7996.h   |  4 +++
- 6 files changed, 105 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 4f4b7b4f..b2b8f2a2 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1026,6 +1026,7 @@ enum {
- 	MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
- 	MCU_EXT_EVENT_RDD_REPORT = 0x3a,
- 	MCU_EXT_EVENT_CSA_NOTIFY = 0x4f,
-+	MCU_EXT_EVENT_BSS_ACQ_PKT_CNT = 0x52,
- 	MCU_EXT_EVENT_WA_TX_STAT = 0x74,
- 	MCU_EXT_EVENT_BCC_NOTIFY = 0x75,
- 	MCU_EXT_EVENT_MURU_CTRL = 0x9f,
-@@ -1224,6 +1225,7 @@ enum {
- 	MCU_EXT_CMD_TXDPD_CAL = 0x60,
- 	MCU_EXT_CMD_CAL_CACHE = 0x67,
- 	MCU_EXT_CMD_RED_ENABLE = 0x68,
-+	MCU_EXT_CMD_PKT_BUDGET_CTRL = 0x6c,
- 	MCU_EXT_CMD_SET_RADAR_TH = 0x7c,
- 	MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d,
- 	MCU_EXT_CMD_MWDS_SUPPORT = 0x80,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 7a9b9749..90f3a417 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -1493,6 +1493,8 @@ int mt7996_register_device(struct mt7996_dev *dev)
- 	INIT_WORK(&dev->dump_work, mt7996_mac_dump_work);
- 	mutex_init(&dev->dump_mutex);
- 
-+	INIT_WORK(&dev->wmm_pbc_work, mt7996_mcu_wmm_pbc_work);
-+
- 	ret = mt7996_init_hardware(dev);
- 	if (ret)
- 		return ret;
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 901c2036..88e1fd14 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -2302,6 +2302,10 @@ void mt7996_mac_work(struct work_struct *work)
- 					mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_ADM_STAT);
- 					mt7996_mcu_get_all_sta_info(mdev, UNI_ALL_STA_TXRX_MSDU_COUNT);
- 				}
-+
-+				if (mt7996_mcu_wa_cmd(phy->dev, MCU_WA_PARAM_CMD(QUERY), MCU_WA_PARAM_BSS_ACQ_PKT_CNT,
-+				                      BSS_ACQ_PKT_CNT_BSS_BITMAP_ALL | BSS_ACQ_PKT_CNT_READ_CLR, 0))
-+					dev_err(mdev->dev, "Failed to query per-AC-queue packet counts.\n");
- 			} else if (mt7996_band_valid(phy->dev, i) &&
- 			           test_bit(MT76_STATE_RUNNING, &mdev->phys[i]->state))
- 				break;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 4907f729..6405c2fa 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -666,6 +666,82 @@ mt7996_mcu_rx_thermal_notify(struct mt7996_dev *dev, struct sk_buff *skb)
- 	phy->throttle_state = n->duty_percent;
- }
- 
-+void mt7996_mcu_wmm_pbc_work(struct work_struct *work)
-+{
-+#define WMM_PBC_QUEUE_NUM	5
-+#define WMM_PBC_BSS_ALL		0xff
-+#define WMM_PBC_WLAN_IDX_ALL	0xffff
-+#define WMM_PBC_BOUND_DEFAULT	0xffff
-+#define WMM_PBC_LOW_BOUND_VO	1900
-+#define WMM_PBC_LOW_BOUND_VI	1900
-+#define WMM_PBC_LOW_BOUND_BE	1500
-+#define WMM_PBC_LOW_BOUND_BK	900
-+#define WMM_PBC_LOW_BOUND_MGMT	32
-+	struct mt7996_dev *dev = container_of(work, struct mt7996_dev, wmm_pbc_work);
-+	struct {
-+		u8 bss_idx;
-+		u8 queue_num;
-+		__le16 wlan_idx;
-+		u8 band_idx;
-+		u8 __rsv[3];
-+		struct {
-+			__le16 low;
-+			__le16 up;
-+		} __packed bound[WMM_PBC_QUEUE_NUM];
-+	} __packed req = {
-+		.bss_idx = WMM_PBC_BSS_ALL,
-+		.queue_num = WMM_PBC_QUEUE_NUM,
-+		.wlan_idx = cpu_to_le16(WMM_PBC_WLAN_IDX_ALL),
-+		.band_idx = dev->mphy.band_idx,
-+	};
-+	int i, ret;
-+
-+#define pbc_acq_low_bound_config(_ac, _bound)								\
-+	req.bound[mt76_connac_lmac_mapping(_ac)].low = dev->wmm_pbc_enable ? cpu_to_le16(_bound) : 0
-+	pbc_acq_low_bound_config(IEEE80211_AC_VO, WMM_PBC_LOW_BOUND_VO);
-+	pbc_acq_low_bound_config(IEEE80211_AC_VI, WMM_PBC_LOW_BOUND_VI);
-+	pbc_acq_low_bound_config(IEEE80211_AC_BE, WMM_PBC_LOW_BOUND_BE);
-+	pbc_acq_low_bound_config(IEEE80211_AC_BK, WMM_PBC_LOW_BOUND_BK);
-+	req.bound[4].low = dev->wmm_pbc_enable
-+	                   ? cpu_to_le16(WMM_PBC_LOW_BOUND_MGMT) : 0;
-+
-+	for (i = 0; i < WMM_PBC_QUEUE_NUM; ++i)
-+		req.bound[i].up = cpu_to_le16(WMM_PBC_BOUND_DEFAULT);
-+
-+	ret = mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(PKT_BUDGET_CTRL),
-+	                        &req, sizeof(req), true);
-+	if (ret)
-+		dev_err(dev->mt76.dev, "Failed to configure WMM PBC.\n");
-+}
-+
-+static void
-+mt7996_mcu_rx_bss_acq_pkt_cnt(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+	struct mt7996_mcu_bss_acq_pkt_cnt_event *event = (struct mt7996_mcu_bss_acq_pkt_cnt_event *)skb->data;
-+	u32 bitmap = le32_to_cpu(event->bss_bitmap);
-+	u64 sum[IEEE80211_NUM_ACS] = {0};
-+	u8 ac_cnt = 0;
-+	int i, j;
-+
-+	for (i = 0; (i < BSS_ACQ_PKT_CNT_BSS_NUM) && (bitmap & (1 << i)); ++i) {
-+		for (j = IEEE80211_AC_VO; j < IEEE80211_NUM_ACS; ++j)
-+			sum[j] += le32_to_cpu(event->bss[i].cnt[mt76_connac_lmac_mapping(j)]);
-+	}
-+
-+	for (i = IEEE80211_AC_VO; i < IEEE80211_NUM_ACS; ++i) {
-+		if (sum[i] > WMM_PKT_THRESHOLD)
-+			++ac_cnt;
-+	}
-+
-+	if (ac_cnt > 1 && !dev->wmm_pbc_enable) {
-+		dev->wmm_pbc_enable = true;
-+		queue_work(dev->mt76.wq, &dev->wmm_pbc_work);
-+	} else if (ac_cnt <= 1 && dev->wmm_pbc_enable) {
-+		dev->wmm_pbc_enable = false;
-+		queue_work(dev->mt76.wq, &dev->wmm_pbc_work);
-+	}
-+}
-+
- static void
- mt7996_mcu_rx_ext_event(struct mt7996_dev *dev, struct sk_buff *skb)
- {
-@@ -675,6 +751,8 @@ mt7996_mcu_rx_ext_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	case MCU_EXT_EVENT_FW_LOG_2_HOST:
- 		mt7996_mcu_rx_log_message(dev, skb);
- 		break;
-+	case MCU_EXT_EVENT_BSS_ACQ_PKT_CNT:
-+		mt7996_mcu_rx_bss_acq_pkt_cnt(dev, skb);
- 	default:
- 		break;
- 	}
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index cd327451..9dc7946b 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -375,10 +375,25 @@ enum {
- 	MCU_WA_PARAM_CMD_DEBUG,
- };
- 
-+#define BSS_ACQ_PKT_CNT_BSS_NUM		24
-+#define BSS_ACQ_PKT_CNT_BSS_BITMAP_ALL	0x00ffffff
-+#define BSS_ACQ_PKT_CNT_READ_CLR	BIT(31)
-+#define WMM_PKT_THRESHOLD		100
-+
-+struct mt7996_mcu_bss_acq_pkt_cnt_event {
-+	struct mt7996_mcu_rxd rxd;
-+
-+	__le32 bss_bitmap;
-+	struct {
-+		__le32 cnt[IEEE80211_NUM_ACS];
-+	} __packed bss[BSS_ACQ_PKT_CNT_BSS_NUM];
-+} __packed;
-+
- enum {
- 	MCU_WA_PARAM_PDMA_RX = 0x04,
- 	MCU_WA_PARAM_CPU_UTIL = 0x0b,
- 	MCU_WA_PARAM_RED_EN = 0x0e,
-+	MCU_WA_PARAM_BSS_ACQ_PKT_CNT = 0x12,
- 	MCU_WA_PARAM_HW_PATH_HIF_VER = 0x2f,
- 	MCU_WA_PARAM_RED_CONFIG = 0x40,
- };
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index c5b83648..6ea024ef 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -601,6 +601,9 @@ struct mt7996_dev {
- 	u8 wtbl_size_group;
- 
- 	struct mt7996_vow_ctrl vow;
-+
-+	bool wmm_pbc_enable;
-+	struct work_struct wmm_pbc_work;
- #ifdef CONFIG_MTK_DEBUG
- 	u16 wlan_idx;
- 	struct {
-@@ -852,6 +855,7 @@ int mt7996_mcu_set_band_confg(struct mt7996_phy *phy, u16 option, bool enable);
- int mt7996_mcu_set_vow_drr_ctrl(struct mt7996_phy *phy, struct mt7996_sta *msta,
- 	                        enum vow_drr_ctrl_id id);
- int mt7996_mcu_set_vow_feature_ctrl(struct mt7996_phy *phy);
-+void mt7996_mcu_wmm_pbc_work(struct work_struct *work);
- 
- static inline u8 mt7996_max_interface_num(struct mt7996_dev *dev)
- {
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2022-mtk-wifi-mt76-mt7996-eagle-support-extra-option_type.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2022-mtk-wifi-mt76-mt7996-eagle-support-extra-option_type.patch
deleted file mode 100644
index 8cf8f0f..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2022-mtk-wifi-mt76-mt7996-eagle-support-extra-option_type.patch
+++ /dev/null
@@ -1,325 +0,0 @@
-From f513775361c7aae98ca2f816edb62b1744350325 Mon Sep 17 00:00:00 2001
-From: Rex Lu <rex.lu@mediatek.com>
-Date: Thu, 1 Feb 2024 10:32:42 +0800
-Subject: [PATCH 2022/2032] mtk: wifi: mt76: mt7996: eagle support extra
- option_type
-
-1. eagle + mt7988d option_type 2 support
-2. eagle single pcie support
-
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
-
-1. adjust pcie outstanding value by pcie speed. not no longer by option_type.
-
-Signed-off-by: Rex Lu <rex.lu@mediatek.com>
----
- mt7996/dma.c    | 51 +++++++++++++++++++++++++++++++++----
- mt7996/init.c   | 67 ++++++++++++++++++++++++++++++++++++++-----------
- mt7996/main.c   | 15 +++++++++--
- mt7996/mt7996.h |  5 ++++
- mt7996/pci.c    |  2 +-
- mt7996/regs.h   |  5 ++++
- 6 files changed, 123 insertions(+), 22 deletions(-)
-
-diff --git a/mt7996/dma.c b/mt7996/dma.c
-index c23b0d65..3dc0e8a1 100644
---- a/mt7996/dma.c
-+++ b/mt7996/dma.c
-@@ -12,12 +12,20 @@ int mt7996_init_tx_queues(struct mt7996_phy *phy, int idx, int n_desc,
- {
- 	struct mt7996_dev *dev = phy->dev;
- 	u32 flags = 0;
-+	int i;
-+
-+	if (phy->mt76->band_idx == MT_BAND1 && !dev->hif2 && is_mt7996(&dev->mt76)) {
-+		phy->mt76->q_tx[0] = phy->mt76->dev->phys[MT_BAND0]->q_tx[0];
-+		for (i = 1; i <= MT_TXQ_PSD; i++)
-+			phy->mt76->q_tx[i] = phy->mt76->q_tx[0];
-+		return 0;
-+	}
- 
- 	if (mtk_wed_device_active(wed)) {
- 		ring_base += MT_TXQ_ID(0) * MT_RING_SIZE;
- 		idx -= MT_TXQ_ID(0);
- 
--		if (phy->mt76->band_idx == MT_BAND2)
-+		if (wed == &dev->mt76.mmio.wed_hif2)
- 			flags = MT_WED_Q_TX(0);
- 		else
- 			flags = MT_WED_Q_TX(idx);
-@@ -102,8 +110,20 @@ static void mt7996_dma_config(struct mt7996_dev *dev)
- 	/* data tx queue */
- 	TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0, MT7996_TXQ_BAND0);
- 	if (is_mt7996(&dev->mt76)) {
--		TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7996_TXQ_BAND1);
--		TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND2, MT7996_TXQ_BAND2);
-+		if (dev->hif2) {
-+			if (dev->option_type == 2) {
-+				/*  bn1:ring21 bn2:ring19 */
-+				TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND2, MT7996_TXQ_BAND2);
-+				TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1, MT7996_TXQ_BAND1);
-+			} else {
-+				/* default bn1:ring19 bn2:ring21 */
-+				TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7996_TXQ_BAND1);
-+				TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND2, MT7996_TXQ_BAND2);
-+			}
-+		} else {
-+			/* single pcie bn0/1:ring18 bn2:ring19 */
-+			TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1, MT7996_TXQ_BAND1);
-+		}
- 	} else {
- 		TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1, MT7996_TXQ_BAND1);
- 	}
-@@ -352,8 +372,20 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
- 			 WF_WFDMA0_GLO_CFG_EXT1_TX_FCTRL_MODE);
- 
- 		mt76_set(dev, MT_WFDMA_HOST_CONFIG,
--			 MT_WFDMA_HOST_CONFIG_PDMA_BAND |
--			 MT_WFDMA_HOST_CONFIG_BAND2_PCIE1);
-+			 MT_WFDMA_HOST_CONFIG_PDMA_BAND);
-+
-+		mt76_clear(dev, MT_WFDMA_HOST_CONFIG,
-+			   MT_WFDMA_HOST_CONFIG_BAND0_PCIE1 |
-+			   MT_WFDMA_HOST_CONFIG_BAND1_PCIE1 |
-+			   MT_WFDMA_HOST_CONFIG_BAND2_PCIE1);
-+
-+		if (dev->option_type == 2)
-+			mt76_set(dev, MT_WFDMA_HOST_CONFIG,
-+				 MT_WFDMA_HOST_CONFIG_BAND0_PCIE1 |
-+				 MT_WFDMA_HOST_CONFIG_BAND1_PCIE1);
-+		else
-+			mt76_set(dev, MT_WFDMA_HOST_CONFIG,
-+				 MT_WFDMA_HOST_CONFIG_BAND2_PCIE1);
- 
- 		if (mtk_wed_device_active(&dev->mt76.mmio.wed) &&
- 		    is_mt7992(&dev->mt76)) {
-@@ -366,6 +398,15 @@ static void mt7996_dma_enable(struct mt7996_dev *dev, bool reset)
- 		mt76_rmw(dev, MT_WFDMA_AXI_R2A_CTRL,
- 			 MT_WFDMA_AXI_R2A_CTRL_OUTSTAND_MASK, 0x14);
- 
-+		if (dev->hif2->speed < PCIE_SPEED_8_0GT ||
-+		    (dev->hif2->speed == PCIE_SPEED_8_0GT && dev->hif2->width < 2)) {
-+			mt76_rmw(dev, WF_WFDMA0_GLO_CFG_EXT0 + hif1_ofs,
-+				 WF_WFDMA0_GLO_CFG_EXT0_OUTSTAND_MASK,
-+				 FIELD_PREP(WF_WFDMA0_GLO_CFG_EXT0_OUTSTAND_MASK, 0x3));
-+			mt76_rmw(dev, MT_WFDMA_AXI_R2A_CTRL2,
-+				 MT_WFDMA_AXI_R2A_CTRL2_OUTSTAND_MASK,
-+				 FIELD_PREP(MT_WFDMA_AXI_R2A_CTRL2_OUTSTAND_MASK, 0x3));
-+		}
- 		/* WFDMA rx threshold */
- 		mt76_wr(dev, MT_WFDMA0_PAUSE_RX_Q_45_TH + hif1_ofs, 0xc000c);
- 		mt76_wr(dev, MT_WFDMA0_PAUSE_RX_Q_67_TH + hif1_ofs, 0x10008);
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 90f3a417..85fedca6 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -500,7 +500,7 @@ static void mt7996_mac_init_basic_rates(struct mt7996_dev *dev)
- void mt7996_mac_init(struct mt7996_dev *dev)
- {
- #define HIF_TXD_V2_1	0x21
--	int i;
-+	int i, rx_path_type, rro_bypass, txfree_path;
- 
- 	mt76_clear(dev, MT_MDP_DCR2, MT_MDP_DCR2_RX_TRANS_SHORT);
- 
-@@ -514,22 +514,45 @@ void mt7996_mac_init(struct mt7996_dev *dev)
- 	}
- 
- 	/* rro module init */
--	if (is_mt7996(&dev->mt76))
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_PLATFORM_TYPE, 2);
--	else
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_PLATFORM_TYPE,
--				   dev->hif2 ? 7 : 0);
-+	switch (dev->option_type) {
-+	case 2:
-+		/* eagle + 7988d */
-+		rx_path_type = 3;
-+		rro_bypass = dev->has_rro ? 1 : 3;
-+		txfree_path = dev->has_rro ? 0 : 1;
-+		break;
-+	case 3:
-+		/* eagle + Airoha */
-+		rx_path_type = 6;
-+		rro_bypass = dev->has_rro ? 1 : 3;
-+		txfree_path = dev->has_rro ? 0 : 1;
-+		break;
-+	case 4:
-+		/* Bollinger */
-+		rx_path_type = 2;
-+		rro_bypass = dev->has_rro ? 1 : 3;
-+		txfree_path = dev->has_rro ? 0 : 1;
-+		break;
-+	default:
-+		if (is_mt7996(&dev->mt76))
-+			rx_path_type = 2;
-+		else
-+			rx_path_type = 7;
-+
-+		rro_bypass = dev->has_rro ? 1 : 3;
-+		txfree_path = dev->has_rro ? 0 : 1;
-+		break;
-+	}
-+
-+	mt7996_mcu_set_rro(dev, UNI_RRO_SET_PLATFORM_TYPE, dev->hif2 ? rx_path_type : 0);
-+	mt7996_mcu_set_rro(dev, UNI_RRO_SET_BYPASS_MODE, rro_bypass);
-+	mt7996_mcu_set_rro(dev, UNI_RRO_SET_TXFREE_PATH, txfree_path);
- 
- 	if (dev->has_rro) {
- 		u16 timeout;
- 
- 		timeout = mt76_rr(dev, MT_HW_REV) == MT_HW_REV1 ? 512 : 128;
- 		mt7996_mcu_set_rro(dev, UNI_RRO_SET_FLUSH_TIMEOUT, timeout);
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_BYPASS_MODE, 1);
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_TXFREE_PATH, 0);
--	} else {
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_BYPASS_MODE, 3);
--		mt7996_mcu_set_rro(dev, UNI_RRO_SET_TXFREE_PATH, 1);
- 	}
- 
- 	mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET),
-@@ -607,9 +630,22 @@ static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy,
- 	if (phy)
- 		return 0;
- 
--	if (is_mt7996(&dev->mt76) && band == MT_BAND2 && dev->hif2) {
--		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
--		wed = &dev->mt76.mmio.wed_hif2;
-+	if (is_mt7996(&dev->mt76) && dev->hif2) {
-+		switch (dev->option_type) {
-+		case 2:
-+			/* eagle + 7988d */
-+			if (band == MT_BAND1) {
-+				hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
-+				wed = &dev->mt76.mmio.wed_hif2;
-+			}
-+			break;
-+		default:
-+			if (band == MT_BAND2) {
-+				hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
-+				wed = &dev->mt76.mmio.wed_hif2;
-+			}
-+			break;
-+		}
- 	}
- 
- 	mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7996_ops, band);
-@@ -1048,6 +1084,9 @@ int mt7996_get_chip_sku(struct mt7996_dev *dev)
- static int mt7996_init_hardware(struct mt7996_dev *dev)
- {
- 	int ret, idx;
-+	struct device_node *np = dev->mt76.dev->of_node;
-+
-+	of_property_read_u32(np, "option_type", &dev->option_type);
- 
- 	mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
- 	if (is_mt7992(&dev->mt76)) {
-diff --git a/mt7996/main.c b/mt7996/main.c
-index e1c107fb..fd6fd78b 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -1583,8 +1583,19 @@ mt7996_net_fill_forward_path(struct ieee80211_hw *hw,
- 	struct mt7996_phy *phy = mt7996_hw_phy(hw);
- 	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
- 
--	if (phy != &dev->phy && phy->mt76->band_idx == MT_BAND2)
--		wed = &dev->mt76.mmio.wed_hif2;
-+	if (phy != &dev->phy && dev->hif2) {
-+		switch (dev->option_type) {
-+		case 2:
-+			/* eagle + 7988d */
-+			if (phy->mt76->band_idx == MT_BAND1)
-+				wed = &dev->mt76.mmio.wed_hif2;
-+			break;
-+		default:
-+			if (phy->mt76->band_idx == MT_BAND2)
-+				wed = &dev->mt76.mmio.wed_hif2;
-+			break;
-+		}
-+	}
- 
- 	if (!mtk_wed_device_active(wed))
- 		return -ENODEV;
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 6ea024ef..2ca6e55d 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -8,6 +8,7 @@
- 
- #include <linux/interrupt.h>
- #include <linux/ktime.h>
-+#include <linux/pci.h>
- #include "../mt76_connac.h"
- #include "regs.h"
- 
-@@ -350,6 +351,8 @@ struct mt7996_hif {
- 	struct device *dev;
- 	void __iomem *regs;
- 	int irq;
-+	enum pci_bus_speed speed;
-+	enum pcie_link_width width;
- };
- 
- struct mt7996_scs_ctrl {
-@@ -574,6 +577,8 @@ struct mt7996_dev {
- 	u8 eeprom_mode;
- 	u32 bg_nxt_freq;
- 
-+	u32 option_type;
-+
- 	bool ibf;
- 	u8 fw_debug_wm;
- 	u8 fw_debug_wa;
-diff --git a/mt7996/pci.c b/mt7996/pci.c
-index f0d3f199..24d69d4d 100644
---- a/mt7996/pci.c
-+++ b/mt7996/pci.c
-@@ -5,7 +5,6 @@
- 
- #include <linux/kernel.h>
- #include <linux/module.h>
--#include <linux/pci.h>
- 
- #include "mt7996.h"
- #include "mac.h"
-@@ -93,6 +92,7 @@ static int mt7996_pci_hif2_probe(struct pci_dev *pdev)
- 	hif->dev = &pdev->dev;
- 	hif->regs = pcim_iomap_table(pdev)[0];
- 	hif->irq = pdev->irq;
-+	pcie_bandwidth_available(pdev, NULL, &hif->speed, &hif->width);
- 	spin_lock_bh(&hif_lock);
- 	list_add(&hif->list, &hif_list);
- 	spin_unlock_bh(&hif_lock);
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 476b23c3..050637c1 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -435,6 +435,7 @@ enum offs_rev {
- #define WF_WFDMA0_GLO_CFG_EXT0			MT_WFDMA0(0x2b0)
- #define WF_WFDMA0_GLO_CFG_EXT0_RX_WB_RXD	BIT(18)
- #define WF_WFDMA0_GLO_CFG_EXT0_WED_MERGE_MODE	BIT(14)
-+#define WF_WFDMA0_GLO_CFG_EXT0_OUTSTAND_MASK	GENMASK(27, 24)
- 
- #define WF_WFDMA0_GLO_CFG_EXT1			MT_WFDMA0(0x2b4)
- #define WF_WFDMA0_GLO_CFG_EXT1_CALC_MODE	BIT(31)
-@@ -454,6 +455,7 @@ enum offs_rev {
- 
- #define MT_WFDMA_HOST_CONFIG			MT_WFDMA_EXT_CSR(0x30)
- #define MT_WFDMA_HOST_CONFIG_PDMA_BAND		BIT(0)
-+#define MT_WFDMA_HOST_CONFIG_BAND0_PCIE1	BIT(20)
- #define MT_WFDMA_HOST_CONFIG_BAND1_PCIE1	BIT(21)
- #define MT_WFDMA_HOST_CONFIG_BAND2_PCIE1	BIT(22)
- 
-@@ -463,6 +465,9 @@ enum offs_rev {
- #define MT_WFDMA_AXI_R2A_CTRL			MT_WFDMA_EXT_CSR(0x500)
- #define MT_WFDMA_AXI_R2A_CTRL_OUTSTAND_MASK	GENMASK(4, 0)
- 
-+#define MT_WFDMA_AXI_R2A_CTRL2			MT_WFDMA_EXT_CSR(0x508)
-+#define MT_WFDMA_AXI_R2A_CTRL2_OUTSTAND_MASK	GENMASK(31, 28)
-+
- #define MT_PCIE_RECOG_ID			0xd7090
- #define MT_PCIE_RECOG_ID_MASK			GENMASK(30, 0)
- #define MT_PCIE_RECOG_ID_SEM			BIT(31)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2023-mtk-wifi-mt76-mt7996-support-enable-disable-thermal-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2023-mtk-wifi-mt76-mt7996-support-enable-disable-thermal-.patch
deleted file mode 100644
index aa7a600..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2023-mtk-wifi-mt76-mt7996-support-enable-disable-thermal-.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 918509adeb892bda553d29794bf475831a49f6d0 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Thu, 27 Jul 2023 19:35:32 +0800
-Subject: [PATCH 2023/2032] mtk: wifi: mt76: mt7996: support enable/disable
- thermal protection mechanism
-
-This commit adds a new debugfs thermal_enable to enable/disable thermal
-protection mechanism. The purpose of this commit is for autotest to
-verify thermal protection mechanism.
-
-[Usage]
-Enable thermal protection: echo 1 > thermal_enable
-Disable thermal protection: echo 0 > thermal_enable
-
-Please note that if you re-enable thermal protection mechanism, all the
-configuration values will be retained from the exising configuration,
-rather than using the default values.
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt7996/main.c        |  1 +
- mt7996/mt7996.h      |  1 +
- mt7996/mtk_debugfs.c | 45 ++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 47 insertions(+)
-
-diff --git a/mt7996/main.c b/mt7996/main.c
-index fd6fd78b..91c06cfb 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -83,6 +83,7 @@ int mt7996_run(struct ieee80211_hw *hw)
- #ifdef CONFIG_MTK_DEBUG
- 	phy->sr_enable = true;
- 	phy->enhanced_sr_enable = true;
-+	phy->thermal_protection_enable = true;
- 
- 	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL,
- 					   !dev->dbg.sku_disable);
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index 2ca6e55d..d6f7828e 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -483,6 +483,7 @@ struct mt7996_phy {
- #ifdef CONFIG_MTK_DEBUG
- 	bool sr_enable:1;
- 	bool enhanced_sr_enable:1;
-+	bool thermal_protection_enable:1;
- #endif
- };
- 
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 916c7c06..afef17cf 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -3110,6 +3110,49 @@ mt7996_show_rro_mib(struct seq_file *s, void *data)
- 	return 0;
- }
- 
-+static int
-+mt7996_thermal_enable_get(void *data, u64 *enable)
-+{
-+	struct mt7996_phy *phy = data;
-+
-+	*enable = phy->thermal_protection_enable;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_thermal_enable_set(void *data, u64 action)
-+{
-+	struct mt7996_phy *phy = data;
-+	int ret;
-+	u8 throttling;
-+
-+	if (action > 1)
-+		return -EINVAL;
-+
-+	if (!!action == phy->thermal_protection_enable)
-+		return 0;
-+
-+	ret = mt7996_mcu_set_thermal_protect(phy, !!action);
-+	if (ret)
-+		return ret;
-+
-+	if (!!!action)
-+		goto out;
-+
-+	throttling = MT7996_THERMAL_THROTTLE_MAX - phy->cdev_state;
-+	ret = mt7996_mcu_set_thermal_throttling(phy, throttling);
-+	if (ret)
-+		return ret;
-+
-+out:
-+	phy->thermal_protection_enable = !!action;
-+
-+	return 0;
-+}
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_thermal_enable, mt7996_thermal_enable_get,
-+			 mt7996_thermal_enable_set, "%lld\n");
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -3217,6 +3260,8 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 					    mt7996_show_rro_mib);
- 	}
- 
-+	debugfs_create_file("thermal_enable", 0600, dir, phy, &fops_thermal_enable);
-+
- 	return 0;
- }
- 
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2024-mtk-wifi-mt76-mt7996-support-thermal-recal-debug-com.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2024-mtk-wifi-mt76-mt7996-support-thermal-recal-debug-com.patch
deleted file mode 100644
index 8f0e9b2..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2024-mtk-wifi-mt76-mt7996-support-thermal-recal-debug-com.patch
+++ /dev/null
@@ -1,116 +0,0 @@
-From 4d28b5d5f45a4494fffd03694caeff4f59765b80 Mon Sep 17 00:00:00 2001
-From: Howard Hsu <howard-yh.hsu@mediatek.com>
-Date: Thu, 4 Jan 2024 19:53:37 +0800
-Subject: [PATCH 2024/2032] mtk: wifi: mt76: mt7996: support thermal recal
- debug command
-
-Add support thermal recal debug command.
-
-Usage:
-$ echo val > debugfs/thermal_recal
-
-The val can be the following values:
-0 = disable
-1 = enable
-2 = manual trigger
-
-Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
----
- mt76_connac_mcu.h    |  1 +
- mt7996/mt7996.h      |  1 +
- mt7996/mtk_debugfs.c | 17 +++++++++++++++++
- mt7996/mtk_mcu.c     | 21 +++++++++++++++++++++
- 4 files changed, 40 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index b2b8f2a2..97c2f5c0 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1284,6 +1284,7 @@ enum {
- 	MCU_UNI_CMD_TESTMODE_TRX_PARAM = 0x42,
- 	MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
- 	MCU_UNI_CMD_PRECAL_RESULT = 0x47,
-+	MCU_UNI_CMD_THERMAL_CAL = 0x4c,
- 	MCU_UNI_CMD_RRO = 0x57,
- 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
- 	MCU_UNI_CMD_PER_STA_INFO = 0x6d,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index d6f7828e..b5673bdd 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -1027,6 +1027,7 @@ void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type);
- void mt7996_tm_update_channel(struct mt7996_phy *phy);
- 
- int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val);
-+int mt7996_mcu_thermal_debug(struct mt7996_dev *dev, u8 mode, u8 action);
- #endif
- 
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index afef17cf..25c21f37 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -3153,6 +3153,22 @@ out:
- DEFINE_DEBUGFS_ATTRIBUTE(fops_thermal_enable, mt7996_thermal_enable_get,
- 			 mt7996_thermal_enable_set, "%lld\n");
- 
-+static int
-+mt7996_thermal_recal_set(void *data, u64 val)
-+{
-+#define THERMAL_DEBUG_OPERATION_MANUAL_TRIGGER 2
-+#define THERMAL_DEBUG_MODE_RECAL 1
-+	struct mt7996_dev *dev = data;
-+
-+	if (val > THERMAL_DEBUG_OPERATION_MANUAL_TRIGGER)
-+		return -EINVAL;
-+
-+	return mt7996_mcu_thermal_debug(dev, THERMAL_DEBUG_MODE_RECAL, val);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_thermal_recal, NULL,
-+			 mt7996_thermal_recal_set, "%llu\n");
-+
- int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- {
- 	struct mt7996_dev *dev = phy->dev;
-@@ -3261,6 +3277,7 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
- 	}
- 
- 	debugfs_create_file("thermal_enable", 0600, dir, phy, &fops_thermal_enable);
-+	debugfs_create_file("thermal_recal", 0200, dir, dev, &fops_thermal_recal);
- 
- 	return 0;
- }
-diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
-index 9a6636fd..063c2516 100644
---- a/mt7996/mtk_mcu.c
-+++ b/mt7996/mtk_mcu.c
-@@ -1280,4 +1280,25 @@ int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val)
- 				 sizeof(req), true);
- }
- 
-+int mt7996_mcu_thermal_debug(struct mt7996_dev *dev, u8 mode, u8 action)
-+{
-+	struct {
-+		u8 __rsv1[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+
-+		u8 mode;
-+		u8 action;
-+		u8 __rsv2[2];
-+	} __packed req = {
-+		.tag = cpu_to_le16(mode),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.mode = mode,
-+		.action = action,
-+	};
-+
-+	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(THERMAL_CAL), &req,
-+	                         sizeof(req), true);
-+}
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2025-mtk-wifi-mt76-mt7996-Porting-wifi6-txpower-fix-to-ea.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2025-mtk-wifi-mt76-mt7996-Porting-wifi6-txpower-fix-to-ea.patch
deleted file mode 100644
index f1c1890..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2025-mtk-wifi-mt76-mt7996-Porting-wifi6-txpower-fix-to-ea.patch
+++ /dev/null
@@ -1,470 +0,0 @@
-From 456a6bddcbec9ba8c18648735327542b837dae0d Mon Sep 17 00:00:00 2001
-From: Allen Ye <allen.ye@mediatek.com>
-Date: Thu, 25 Jan 2024 10:57:08 +0800
-Subject: [PATCH 2025/2032] mtk: wifi: mt76: mt7996: Porting wifi6 txpower fix
- to eagle
-
-Refactor txpower flow.
-1. Fix wrong bbp CR address
-2. Ignore RegDB power limit when we have single sku table. And dump more informaiton in debugfs.
-3. Refactor get_txpower ops flow, we only consider CCK and OFDM power value as maximum.
-4. Remove sku_disable due to SQC is over and default enable both sku tables.
-
-
-Fix wrong power value when user set limit close to path table limit.
-
----
- eeprom.c             |  20 ++++----
- mt7996/init.c        |  14 ++++-
- mt7996/main.c        |  11 ++--
- mt7996/mcu.c         |  41 ++++++++++++---
- mt7996/mt7996.h      |   3 ++
- mt7996/mtk_debugfs.c | 120 ++++++++++++++++++++++++++++---------------
- mt7996/regs.h        |  10 ++--
- 7 files changed, 149 insertions(+), 70 deletions(-)
-
-diff --git a/eeprom.c b/eeprom.c
-index adb87924..57b9b769 100644
---- a/eeprom.c
-+++ b/eeprom.c
-@@ -336,9 +336,10 @@ mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data,
- static void
- mt76_apply_multi_array_limit(s8 *pwr, size_t pwr_len, s8 pwr_num,
- 			     const __be32 *data, size_t len, s8 target_power,
--			     s8 nss_delta, s8 *max_power)
-+			     s8 nss_delta)
- {
- 	int i, cur;
-+	s8 max_power = -128;
- 
- 	if (!data)
- 		return;
-@@ -350,7 +351,7 @@ mt76_apply_multi_array_limit(s8 *pwr, size_t pwr_len, s8 pwr_num,
- 			break;
- 
- 		mt76_apply_array_limit(pwr + pwr_len * i, pwr_len, data + 1,
--				       target_power, nss_delta, max_power);
-+				       target_power, nss_delta, &max_power);
- 		if (--cur > 0)
- 			continue;
- 
-@@ -433,17 +434,17 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 	val = mt76_get_of_array(np, "rates-mcs", &len, mcs_rates + 1);
- 	mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]),
- 				     ARRAY_SIZE(dest->mcs), val, len,
--				     target_power, txs_delta, &max_power);
-+				     target_power, txs_delta);
- 
- 	val = mt76_get_of_array(np, "rates-ru", &len, ARRAY_SIZE(dest->ru[0]) + 1);
- 	mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]),
- 				     ARRAY_SIZE(dest->ru), val, len,
--				     target_power, txs_delta, &max_power);
-+				     target_power, txs_delta);
- 
- 	val = mt76_get_of_array(np, "rates-eht", &len, ARRAY_SIZE(dest->eht[0]) + 1);
- 	mt76_apply_multi_array_limit(dest->eht[0], ARRAY_SIZE(dest->eht[0]),
- 				     ARRAY_SIZE(dest->eht), val, len,
--				     target_power, txs_delta, &max_power);
-+				     target_power, txs_delta);
- 
- 	if (dest_path == NULL)
- 		return max_power;
-@@ -465,17 +466,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy,
- 	val = mt76_get_of_array(np, "paths-ru", &len, ARRAY_SIZE(dest_path->ru[0]) + 1);
- 	mt76_apply_multi_array_limit(dest_path->ru[0], ARRAY_SIZE(dest_path->ru[0]),
- 				     ARRAY_SIZE(dest_path->ru), val, len,
--				     target_power_combine, txs_delta, &max_power_backoff);
-+				     target_power_combine, txs_delta);
- 
- 	val = mt76_get_of_array(np, "paths-ru-bf", &len, ARRAY_SIZE(dest_path->ru_bf[0]) + 1);
- 	mt76_apply_multi_array_limit(dest_path->ru_bf[0], ARRAY_SIZE(dest_path->ru_bf[0]),
- 				     ARRAY_SIZE(dest_path->ru_bf), val, len,
--				     target_power_combine, txs_delta, &max_power_backoff);
-+				     target_power_combine, txs_delta);
- 
--	if (max_power_backoff == target_power_combine)
--		return max_power;
--
--	return max_power_backoff;
-+	return max_power;
- }
- EXPORT_SYMBOL_GPL(mt76_get_rate_power_limits);
- 
-diff --git a/mt7996/init.c b/mt7996/init.c
-index 85fedca6..bc8cfdbd 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -296,7 +296,11 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
- 	int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band);
- 	struct mt76_power_limits limits;
- 	struct mt76_power_path_limits limits_path;
-+	struct device_node *np;
- 
-+	phy->sku_limit_en = true;
-+	phy->sku_path_en = true;
-+	np = mt76_find_power_limits_node(&dev->mt76);
- 	for (i = 0; i < sband->n_channels; i++) {
- 		struct ieee80211_channel *chan = &sband->channels[i];
- 		int target_power = mt7996_eeprom_get_target_power(dev, chan);
-@@ -306,10 +310,16 @@ static void __mt7996_init_txpower(struct mt7996_phy *phy,
- 							  &limits,
- 							  &limits_path,
- 							  target_power);
-+		if (!limits_path.ofdm[0])
-+			phy->sku_path_en = false;
-+
- 		target_power += nss_delta;
- 		target_power = DIV_ROUND_UP(target_power, 2);
--		chan->max_power = min_t(int, chan->max_reg_power,
--					target_power);
-+		if (!np)
-+			chan->max_power = min_t(int, chan->max_reg_power,
-+						target_power);
-+		else
-+			chan->max_power = target_power;
- 		chan->orig_mpwr = target_power;
- 	}
- }
-diff --git a/mt7996/main.c b/mt7996/main.c
-index 91c06cfb..ca8e6125 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -84,11 +84,16 @@ int mt7996_run(struct ieee80211_hw *hw)
- 	phy->sr_enable = true;
- 	phy->enhanced_sr_enable = true;
- 	phy->thermal_protection_enable = true;
--
- 	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL,
--					   !dev->dbg.sku_disable);
-+						dev->dbg.sku_disable ? 0 : phy->sku_limit_en);
-+
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_BACKOFF_POWER_LIMIT_CTRL,
-+						dev->dbg.sku_disable ? 0 : phy->sku_path_en);
- #else
--	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL, true);
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_SKU_POWER_LIMIT_CTRL,
-+						phy->sku_limit_en);
-+	ret = mt7996_mcu_set_tx_power_ctrl(phy, UNI_TXPOWER_BACKOFF_POWER_LIMIT_CTRL,
-+						phy->sku_path_en);
- #endif
- 	if (ret)
- 		goto out;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 6405c2fa..52651693 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -5126,6 +5126,27 @@ int mt7996_mcu_wed_rro_reset_sessions(struct mt7996_dev *dev, u16 id)
- 				 sizeof(req), true);
- }
- 
-+static void
-+mt7996_update_max_txpower_cur(struct mt7996_phy *phy, int tx_power)
-+{
-+	struct mt76_phy *mphy = phy->mt76;
-+	struct ieee80211_channel *chan = mphy->main_chan;
-+	int e2p_power_limit = 0;
-+
-+	if (chan == NULL) {
-+		mphy->txpower_cur = tx_power;
-+		return;
-+	}
-+
-+	e2p_power_limit = mt7996_eeprom_get_target_power(phy->dev, chan);
-+	e2p_power_limit += mt7996_eeprom_get_power_delta(phy->dev, chan->band);
-+
-+	if (phy->sku_limit_en)
-+		mphy->txpower_cur = min_t(int, e2p_power_limit, tx_power);
-+	else
-+		mphy->txpower_cur = e2p_power_limit;
-+}
-+
- int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- {
- #define TX_POWER_LIMIT_TABLE_RATE	0
-@@ -5151,12 +5172,20 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- 	struct mt76_power_limits la = {};
- 	struct mt76_power_path_limits la_path = {};
- 	struct sk_buff *skb;
--	int i, ret, tx_power;
-+	int i, ret, txpower_limit;
-+
-+	if (hw->conf.power_level == INT_MIN)
-+		hw->conf.power_level = 127;
-+	txpower_limit = mt7996_get_power_bound(phy, hw->conf.power_level);
- 
--	tx_power = mt7996_get_power_bound(phy, hw->conf.power_level);
--	tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
--					      &la, &la_path, tx_power);
--	mphy->txpower_cur = tx_power;
-+	if (phy->sku_limit_en) {
-+		txpower_limit = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
-+							   &la, &la_path, txpower_limit);
-+		mt7996_update_max_txpower_cur(phy, txpower_limit);
-+	} else {
-+		mt7996_update_max_txpower_cur(phy, txpower_limit);
-+		return 0;
-+	}
- 
- 	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
- 				 sizeof(req) + MT7996_SKU_PATH_NUM);
-@@ -5192,7 +5221,7 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
- 		return ret;
- 
- 	/* only set per-path power table when it's configured */
--	if (!la_path.ofdm[0])
-+	if (!phy->sku_path_en)
- 		return 0;
- 
- 	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index b5673bdd..f1308112 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -461,6 +461,9 @@ struct mt7996_phy {
- 
- 	u8 muru_onoff;
- 
-+	bool sku_limit_en;
-+	bool sku_path_en;
-+
- #ifdef CONFIG_NL80211_TESTMODE
- 	struct {
- 		u32 *reg_backup;
-diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
-index 25c21f37..3f82b58c 100644
---- a/mt7996/mtk_debugfs.c
-+++ b/mt7996/mtk_debugfs.c
-@@ -2454,6 +2454,7 @@ mt7996_get_txpower_info(struct file *file, char __user *user_buf,
- 	struct mt7996_phy *phy = file->private_data;
- 	struct mt7996_mcu_txpower_event *event;
- 	struct txpower_basic_info *basic_info;
-+	struct device_node *np;
- 	static const size_t size = 2048;
- 	int len = 0;
- 	ssize_t ret;
-@@ -2510,7 +2511,10 @@ mt7996_get_txpower_info(struct file *file, char __user *user_buf,
- 	len += scnprintf(buf + len, size - len,
- 			 "    Theraml Compensation Value: %d\n",
- 			 basic_info->thermal_compensate_value);
--
-+	np = mt76_find_power_limits_node(phy->mt76->dev);
-+	len += scnprintf(buf + len, size - len,
-+			 "    RegDB:  %s\n",
-+			 !np ? "enable" : "disable");
- 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
- 
- out:
-@@ -2526,9 +2530,9 @@ static const struct file_operations mt7996_txpower_info_fops = {
- 	.llseek = default_llseek,
- };
- 
--#define mt7996_txpower_puts(rate)							\
-+#define mt7996_txpower_puts(rate, _len)							\
- ({											\
--	len += scnprintf(buf + len, size - len, "%-21s:", #rate " (TMAC)");		\
-+	len += scnprintf(buf + len, size - len, "%-*s:", _len, #rate " (TMAC)");	\
- 	for (i = 0; i < mt7996_sku_group_len[SKU_##rate]; i++, offs++)			\
- 		len += scnprintf(buf + len, size - len, " %6d",				\
- 				 event->phy_rate_info.frame_power[offs][band_idx]);	\
-@@ -2542,9 +2546,15 @@ mt7996_get_txpower_sku(struct file *file, char __user *user_buf,
- 	struct mt7996_phy *phy = file->private_data;
- 	struct mt7996_dev *dev = phy->dev;
- 	struct mt7996_mcu_txpower_event *event;
-+	struct ieee80211_channel *chan = phy->mt76->chandef.chan;
-+	struct ieee80211_supported_band sband;
- 	u8 band_idx = phy->mt76->band_idx;
- 	static const size_t size = 5120;
- 	int i, offs = 0, len = 0;
-+	u32 target_power = 0;
-+	int n_chains = hweight16(phy->mt76->chainmask);
-+	int nss_delta = mt76_tx_power_nss_delta(n_chains);
-+	int pwr_delta;
- 	ssize_t ret;
- 	char *buf;
- 	u32 reg;
-@@ -2566,41 +2576,45 @@ mt7996_get_txpower_sku(struct file *file, char __user *user_buf,
- 			 band_idx, phy->mt76->chandef.chan->hw_value);
- 	len += scnprintf(buf + len, size - len, "%-21s  %6s %6s %6s %6s\n",
- 			 " ", "1m", "2m", "5m", "11m");
--	mt7996_txpower_puts(CCK);
-+	mt7996_txpower_puts(CCK, 21);
- 
- 	len += scnprintf(buf + len, size - len,
- 			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s\n",
- 			 " ", "6m", "9m", "12m", "18m", "24m", "36m", "48m",
- 			 "54m");
--	mt7996_txpower_puts(OFDM);
-+	mt7996_txpower_puts(OFDM, 21);
- 
- 	len += scnprintf(buf + len, size - len,
- 			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s\n",
- 			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4",
- 			 "mcs5", "mcs6", "mcs7");
--	mt7996_txpower_puts(HT20);
-+	mt7996_txpower_puts(HT20, 21);
- 
- 	len += scnprintf(buf + len, size - len,
- 			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
- 			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
- 			 "mcs6", "mcs7", "mcs32");
--	mt7996_txpower_puts(HT40);
-+	mt7996_txpower_puts(HT40, 21);
- 
- 	len += scnprintf(buf + len, size - len,
- 			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s\n",
- 			 " ", "mcs0", "mcs1", "mcs2", "mcs3", "mcs4", "mcs5",
- 			 "mcs6", "mcs7", "mcs8", "mcs9", "mcs10", "mcs11");
--	mt7996_txpower_puts(VHT20);
--	mt7996_txpower_puts(VHT40);
--	mt7996_txpower_puts(VHT80);
--	mt7996_txpower_puts(VHT160);
--	mt7996_txpower_puts(HE26);
--	mt7996_txpower_puts(HE52);
--	mt7996_txpower_puts(HE106);
--	mt7996_txpower_puts(HE242);
--	mt7996_txpower_puts(HE484);
--	mt7996_txpower_puts(HE996);
--	mt7996_txpower_puts(HE2x996);
-+	mt7996_txpower_puts(VHT20, 21);
-+	mt7996_txpower_puts(VHT40, 21);
-+	mt7996_txpower_puts(VHT80, 21);
-+	mt7996_txpower_puts(VHT160, 21);
-+	mt7996_txpower_puts(HE26, 21);
-+	mt7996_txpower_puts(HE52, 21);
-+	mt7996_txpower_puts(HE106, 21);
-+	len += scnprintf(buf + len, size - len, "BW20/");
-+	mt7996_txpower_puts(HE242, 16);
-+	len += scnprintf(buf + len, size - len, "BW40/");
-+	mt7996_txpower_puts(HE484, 16);
-+	len += scnprintf(buf + len, size - len, "BW80/");
-+	mt7996_txpower_puts(HE996, 16);
-+	len += scnprintf(buf + len, size - len, "BW160/");
-+	mt7996_txpower_puts(HE2x996, 15);
- 
- 	len += scnprintf(buf + len, size - len,
- 			 "%-21s  %6s %6s %6s %6s %6s %6s %6s %6s ",
-@@ -2608,22 +2622,27 @@ mt7996_get_txpower_sku(struct file *file, char __user *user_buf,
- 	len += scnprintf(buf + len, size - len,
- 			 "%6s %6s %6s %6s %6s %6s %6s %6s\n",
- 			 "mcs8", "mcs9", "mcs10", "mcs11", "mcs12", "mcs13", "mcs14", "mcs15");
--	mt7996_txpower_puts(EHT26);
--	mt7996_txpower_puts(EHT52);
--	mt7996_txpower_puts(EHT106);
--	mt7996_txpower_puts(EHT242);
--	mt7996_txpower_puts(EHT484);
--	mt7996_txpower_puts(EHT996);
--	mt7996_txpower_puts(EHT2x996);
--	mt7996_txpower_puts(EHT4x996);
--	mt7996_txpower_puts(EHT26_52);
--	mt7996_txpower_puts(EHT26_106);
--	mt7996_txpower_puts(EHT484_242);
--	mt7996_txpower_puts(EHT996_484);
--	mt7996_txpower_puts(EHT996_484_242);
--	mt7996_txpower_puts(EHT2x996_484);
--	mt7996_txpower_puts(EHT3x996);
--	mt7996_txpower_puts(EHT3x996_484);
-+	mt7996_txpower_puts(EHT26, 21);
-+	mt7996_txpower_puts(EHT52, 21);
-+	mt7996_txpower_puts(EHT106, 21);
-+	len += scnprintf(buf + len, size - len, "BW20/");
-+	mt7996_txpower_puts(EHT242, 16);
-+	len += scnprintf(buf + len, size - len, "BW40/");
-+	mt7996_txpower_puts(EHT484, 16);
-+	len += scnprintf(buf + len, size - len, "BW80/");
-+	mt7996_txpower_puts(EHT996, 16);
-+	len += scnprintf(buf + len, size - len, "BW160/");
-+	mt7996_txpower_puts(EHT2x996, 15);
-+	len += scnprintf(buf + len, size - len, "BW320/");
-+	mt7996_txpower_puts(EHT4x996, 15);
-+	mt7996_txpower_puts(EHT26_52, 21);
-+	mt7996_txpower_puts(EHT26_106, 21);
-+	mt7996_txpower_puts(EHT484_242, 21);
-+	mt7996_txpower_puts(EHT996_484, 21);
-+	mt7996_txpower_puts(EHT996_484_242, 21);
-+	mt7996_txpower_puts(EHT2x996_484, 21);
-+	mt7996_txpower_puts(EHT3x996, 21);
-+	mt7996_txpower_puts(EHT3x996_484, 21);
- 
- 	len += scnprintf(buf + len, size - len, "\nePA Gain: %d\n",
- 			 event->phy_rate_info.epa_gain);
-@@ -2632,16 +2651,33 @@ mt7996_get_txpower_sku(struct file *file, char __user *user_buf,
- 	len += scnprintf(buf + len, size - len, "Min Power Bound: %d\n",
- 			 event->phy_rate_info.min_power_bound);
- 
--	reg = MT_WF_PHYDFE_BAND_TPC_CTRL_STAT0(band_idx);
-+	reg = MT_WF_PHYDFE_TSSI_TXCTRL01(band_idx);
- 	len += scnprintf(buf + len, size - len,
--			 "BBP TX Power (target power from TMAC)  : %6ld [0.5 dBm]\n",
--			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_TMAC));
-+			 "\nBBP TX Power (target power from TMAC)  : %6ld [0.5 dBm]\n",
-+			 mt76_get_field(dev, reg, MT_WF_PHYDFE_TSSI_TXCTRL_POWER_TMAC));
- 	len += scnprintf(buf + len, size - len,
--			 "BBP TX Power (target power from RMAC)  : %6ld [0.5 dBm]\n",
--			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_RMAC));
-+			 "RegDB maximum power:\t%d [dBm]\n",
-+			 chan->max_reg_power);
-+
-+	if (chan->band == NL80211_BAND_2GHZ)
-+		sband = phy->mt76->sband_2g.sband;
-+	else if (chan->band == NL80211_BAND_5GHZ)
-+		sband = phy->mt76->sband_5g.sband;
-+	else if (chan->band == NL80211_BAND_6GHZ)
-+		sband = phy->mt76->sband_6g.sband;
-+
-+	pwr_delta = mt7996_eeprom_get_power_delta(dev, sband.band);
-+
-+	target_power = max_t(u32, target_power, mt7996_eeprom_get_target_power(dev, chan));
-+	target_power += pwr_delta + nss_delta;
-+	target_power = DIV_ROUND_UP(target_power, 2);
-+	len += scnprintf(buf + len, size - len,
-+			 "eeprom maximum power:\t%d [dBm]\n",
-+			 target_power);
-+
- 	len += scnprintf(buf + len, size - len,
--			 "BBP TX Power (TSSI module power input)  : %6ld [0.5 dBm]\n",
--			 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER_TSSI));
-+			 "nss_delta:\t%d [0.5 dBm]\n",
-+			 nss_delta);
- 
- 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
- 
-@@ -2660,7 +2696,7 @@ static const struct file_operations mt7996_txpower_sku_fops = {
- 
- #define mt7996_txpower_path_puts(rate, arr_length)					\
- ({											\
--	len += scnprintf(buf + len, size - len, "%-23s:", #rate " (TMAC)");		\
-+	len += scnprintf(buf + len, size - len, "%23s:", #rate " (TMAC)");		\
- 	for (i = 0; i < arr_length; i++, offs++)					\
- 		len += scnprintf(buf + len, size - len, " %4d",				\
- 				 event->backoff_table_info.frame_power[offs]);		\
-diff --git a/mt7996/regs.h b/mt7996/regs.h
-index 050637c1..a0e4b3e1 100644
---- a/mt7996/regs.h
-+++ b/mt7996/regs.h
-@@ -718,6 +718,10 @@ enum offs_rev {
- 						 ((_wf) << 16) + (ofs))
- #define MT_WF_PHYRX_CSD_IRPI(_band, _wf)	MT_WF_PHYRX_CSD(_band, _wf, 0x1000)
- 
-+/* PHYDFE CTRL */
-+#define MT_WF_PHYDFE_TSSI_TXCTRL01(_band)	MT_WF_PHYRX_CSD(_band, 0, 0xc718)
-+#define MT_WF_PHYDFE_TSSI_TXCTRL_POWER_TMAC	GENMASK(31, 24)
-+
- /* PHY CTRL */
- #define MT_WF_PHY_BAND_BASE			0x83080000
- #define MT_WF_PHY_BAND(_band, ofs)		(MT_WF_PHY_BAND_BASE + \
-@@ -735,12 +739,6 @@ enum offs_rev {
- #define MT_WF_PHYRX_BAND_RX_CTRL1_IPI_EN	GENMASK(2, 0)
- #define MT_WF_PHYRX_BAND_RX_CTRL1_STSCNT_EN	GENMASK(11, 9)
- 
--/* PHYDFE CTRL */
--#define MT_WF_PHYDFE_BAND_TPC_CTRL_STAT0(_phy)	MT_WF_PHY_BAND(_phy, 0xe7a0)
--#define MT_WF_PHY_TPC_POWER_TMAC		GENMASK(15, 8)
--#define MT_WF_PHY_TPC_POWER_RMAC		GENMASK(23, 16)
--#define MT_WF_PHY_TPC_POWER_TSSI		GENMASK(31, 24)
--
- /* PHYRX CSD BAND */
- #define MT_WF_PHYRX_CSD_BAND_RXTD12(_band)		MT_WF_PHY_BAND(_band, 0x8230)
- #define MT_WF_PHYRX_CSD_BAND_RXTD12_IRPI_SW_CLR_ONLY	BIT(18)
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2026-mtk-wifi-mt76-mt7996-Add-connac3-csi-feature.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2026-mtk-wifi-mt76-mt7996-Add-connac3-csi-feature.patch
deleted file mode 100644
index 9cece6d..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2026-mtk-wifi-mt76-mt7996-Add-connac3-csi-feature.patch
+++ /dev/null
@@ -1,1090 +0,0 @@
-From 7bbed79a6d043eb149cf3b6be7982ae845ad8450 Mon Sep 17 00:00:00 2001
-From: mtk20656 <chank.chen@mediatek.com>
-Date: Sat, 20 Jan 2024 12:03:24 +0800
-Subject: [PATCH 2026/2032] mtk: wifi: mt76: mt7996: Add connac3 csi feature.
-
-1. format align to wifi6.
-2. add bw320 support.
-3. add active mode.
-
-Signed-off-by: mtk20656 <chank.chen@mediatek.com>
----
- mt76_connac_mcu.h |   2 +
- mt7996/init.c     |  22 +++
- mt7996/main.c     |   4 +
- mt7996/mcu.c      | 465 ++++++++++++++++++++++++++++++++++++++++++++++
- mt7996/mcu.h      | 105 +++++++++++
- mt7996/mt7996.h   |  55 ++++++
- mt7996/vendor.c   | 208 +++++++++++++++++++++
- mt7996/vendor.h   |  50 +++++
- 8 files changed, 911 insertions(+)
-
-diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
-index 97c2f5c0..8c0200a3 100644
---- a/mt76_connac_mcu.h
-+++ b/mt76_connac_mcu.h
-@@ -1049,6 +1049,7 @@ enum {
- 	MCU_UNI_EVENT_THERMAL = 0x35,
- 	MCU_UNI_EVENT_NIC_CAPAB = 0x43,
- 	MCU_UNI_EVENT_TESTMODE_CTRL = 0x46,
-+	MCU_UNI_EVENT_CSI_REPORT = 0x4A,
- 	MCU_UNI_EVENT_WED_RRO = 0x57,
- 	MCU_UNI_EVENT_PER_STA_INFO = 0x6d,
- 	MCU_UNI_EVENT_ALL_STA_INFO = 0x6e,
-@@ -1284,6 +1285,7 @@ enum {
- 	MCU_UNI_CMD_TESTMODE_TRX_PARAM = 0x42,
- 	MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
- 	MCU_UNI_CMD_PRECAL_RESULT = 0x47,
-+	MCU_UNI_CMD_CSI_CTRL = 0x4A,
- 	MCU_UNI_CMD_THERMAL_CAL = 0x4c,
- 	MCU_UNI_CMD_RRO = 0x57,
- 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
-diff --git a/mt7996/init.c b/mt7996/init.c
-index bc8cfdbd..a3d7a2ed 100644
---- a/mt7996/init.c
-+++ b/mt7996/init.c
-@@ -734,6 +734,24 @@ error:
- 	return ret;
- }
- 
-+#ifdef CONFIG_MTK_VENDOR
-+static int mt7996_unregister_csi(struct mt7996_phy *phy)
-+{
-+	struct csi_data *c, *tmp_c;
-+
-+	spin_lock_bh(&phy->csi.lock);
-+	phy->csi.enable = 0;
-+
-+	list_for_each_entry_safe(c, tmp_c, &phy->csi.list, node) {
-+		list_del(&c->node);
-+		kfree(c);
-+	}
-+	spin_unlock_bh(&phy->csi.lock);
-+
-+	return 0;
-+}
-+#endif
-+
- static void
- mt7996_unregister_phy(struct mt7996_phy *phy, enum mt76_band_id band)
- {
-@@ -742,6 +760,10 @@ mt7996_unregister_phy(struct mt7996_phy *phy, enum mt76_band_id band)
- 	if (!phy)
- 		return;
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	mt7996_unregister_csi(phy);
-+#endif
-+
- 	mt7996_unregister_thermal(phy);
- 
- 	mphy = phy->dev->mt76.phys[band];
-diff --git a/mt7996/main.c b/mt7996/main.c
-index ca8e6125..97101985 100644
---- a/mt7996/main.c
-+++ b/mt7996/main.c
-@@ -797,6 +797,10 @@ void mt7996_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
- 	struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
- 	int i;
- 
-+#ifdef CONFIG_MTK_VENDOR
-+	mt7996_mcu_set_csi(&dev->phy, 2, 8, 1, 0, sta->addr);
-+#endif
-+
- 	mt7996_mcu_add_sta(dev, vif, sta, false);
- 
- 	mt7996_mac_wtbl_update(dev, msta->wcid.idx,
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 52651693..9e04ea2b 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -638,6 +638,263 @@ mt7996_mcu_rx_all_sta_info_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	}
- }
- 
-+static int
-+csi_integrate_segment_data(struct mt7996_phy *phy, struct csi_data *csi)
-+{
-+	struct csi_data *csi_temp = NULL;
-+
-+	if (csi->segment_num == 0 && csi->remain_last == 0)
-+		return CSI_CHAIN_COMPLETE;
-+	else if (csi->segment_num == 0 && csi->remain_last == 1) {
-+		memcpy(&phy->csi.buffered_csi,
-+		       csi, sizeof(struct csi_data));
-+
-+		return CSI_CHAIN_SEGMENT_FIRST;
-+	} else if (csi->segment_num != 0) {
-+		csi_temp = &phy->csi.buffered_csi;
-+		if (csi->chain_info != csi_temp->chain_info ||
-+		csi->segment_num != (csi_temp->segment_num + 1))
-+			return CSI_CHAIN_SEGMENT_ERR;
-+
-+		memcpy(&csi_temp->data_i[csi_temp->data_num],
-+		       csi->data_i, csi->data_num * sizeof(s16));
-+
-+		memcpy(&csi_temp->data_q[csi_temp->data_num],
-+		       csi->data_q, csi->data_num * sizeof(s16));
-+
-+		csi_temp->data_num += csi->data_num;
-+		csi_temp->segment_num = csi->segment_num;
-+		csi_temp->remain_last = csi->remain_last;
-+
-+		if (csi->remain_last == 0)
-+			return CSI_CHAIN_SEGMENT_LAST;
-+		else if (csi->remain_last == 1)
-+			return CSI_CHAIN_SEGMENT_MIDDLE;
-+	}
-+
-+	return CSI_CHAIN_ERR;
-+}
-+
-+static int
-+mt7996_mcu_csi_report_data(struct mt7996_phy *phy, u8 *tlv_buf, u32 len)
-+{
-+	int ret, i;
-+	struct csi_data *current_csi;
-+	struct csi_data *target_csi;
-+	struct csi_tlv *tlv_data;
-+	u8 *buf_tmp;
-+	u32 rx_info, tx_rx_idx;
-+	u32 buf_len_last, offset;
-+
-+	buf_tmp = tlv_buf;
-+	buf_len_last = len;
-+	offset = sizeof(((struct csi_tlv *)0)->basic);
-+
-+	current_csi = kzalloc(sizeof(*current_csi), GFP_KERNEL);
-+	if (!current_csi)
-+		return -ENOMEM;
-+
-+	while (buf_len_last >= offset) {
-+		u32 tag, len;
-+		s16 *data_tmp = NULL;
-+
-+		tlv_data = (struct csi_tlv *)buf_tmp;
-+		tag = le32_to_cpu(tlv_data->basic.tag);
-+		len = le32_to_cpu(tlv_data->basic.len);
-+
-+		switch (tag) {
-+		case CSI_EVENT_FW_VER:
-+			current_csi->fw_ver = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_CBW:
-+			current_csi->ch_bw = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_RSSI:
-+			current_csi->rssi = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_SNR:
-+			current_csi->snr = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_BAND:
-+			current_csi->band = le32_to_cpu(tlv_data->info);
-+
-+			if (current_csi->band != phy->mt76->band_idx) {
-+				kfree(current_csi);
-+				return -EINVAL;
-+			}
-+
-+			break;
-+		case CSI_EVENT_CSI_NUM:
-+			current_csi->data_num = le32_to_cpu(tlv_data->info);
-+
-+			if (current_csi->data_num > CSI_BW80_DATA_COUNT) {
-+				kfree(current_csi);
-+				return -EINVAL;
-+			}
-+
-+			break;
-+		case CSI_EVENT_CSI_I_DATA:
-+			if (len != sizeof(s16) * current_csi->data_num) {
-+				kfree(current_csi);
-+				return -EINVAL;
-+			}
-+
-+			data_tmp = tlv_data->data;
-+			for (i = 0; i < current_csi->data_num; i++)
-+				current_csi->data_i[i] = le16_to_cpu(*(data_tmp + i));
-+			break;
-+		case CSI_EVENT_CSI_Q_DATA:
-+			if (len != sizeof(s16) * current_csi->data_num) {
-+				kfree(current_csi);
-+				return -EINVAL;
-+			}
-+
-+			data_tmp = tlv_data->data;
-+			for (i = 0; i < current_csi->data_num; i++)
-+				current_csi->data_q[i] = le16_to_cpu(*(data_tmp + i));
-+			break;
-+		case CSI_EVENT_DBW:
-+			current_csi->data_bw = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_CH_IDX:
-+			current_csi->pri_ch_idx = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_TA:
-+			memcpy(current_csi->ta, tlv_data->mac, ETH_ALEN);
-+			break;
-+		case CSI_EVENT_EXTRA_INFO:
-+			current_csi->ext_info = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_RX_MODE:
-+			rx_info = le32_to_cpu(tlv_data->info);
-+			current_csi->rx_mode = u32_get_bits(rx_info, GENMASK(15, 0));
-+			current_csi->rx_rate = u32_get_bits(rx_info, GENMASK(31, 16));
-+			break;
-+		case CSI_EVENT_H_IDX:
-+			current_csi->chain_info = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_TX_RX_IDX:
-+			tx_rx_idx = le32_to_cpu(tlv_data->info);
-+			current_csi->tx_idx = u32_get_bits(tx_rx_idx, GENMASK(31, 16));
-+			current_csi->rx_idx = u32_get_bits(tx_rx_idx, GENMASK(15, 0));
-+			break;
-+		case CSI_EVENT_TS:
-+			current_csi->ts = le32_to_cpu(tlv_data->info);
-+
-+			if (phy->csi.interval &&
-+				current_csi->ts < phy->csi.last_record + phy->csi.interval) {
-+				kfree(current_csi);
-+				return 0;
-+			}
-+
-+			break;
-+		case CSI_EVENT_PKT_SN:
-+			current_csi->pkt_sn = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_BW_SEG:
-+			current_csi->segment_num = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_REMAIN_LAST:
-+			current_csi->remain_last = le32_to_cpu(tlv_data->info);
-+			break;
-+		case CSI_EVENT_TR_STREAM:
-+			current_csi->tr_stream = le32_to_cpu(tlv_data->info);
-+			break;
-+		default:
-+			break;
-+		};
-+
-+		buf_len_last -= (offset + len);
-+
-+		if (buf_len_last >= offset)
-+			buf_tmp += (offset + len);
-+	}
-+
-+	/* integret the bw80 segment */
-+	if (current_csi->ch_bw >= CSI_BW80) {
-+		ret = csi_integrate_segment_data(phy, current_csi);
-+
-+		switch (ret) {
-+		case CSI_CHAIN_ERR:
-+		case CSI_CHAIN_SEGMENT_ERR:
-+			kfree(current_csi);
-+			return -EINVAL;
-+			break;
-+		case CSI_CHAIN_SEGMENT_FIRST:
-+		case CSI_CHAIN_SEGMENT_MIDDLE:
-+			kfree(current_csi);
-+			return 0;
-+			break;
-+		case CSI_CHAIN_COMPLETE:
-+			target_csi = current_csi;
-+			break;
-+		case CSI_CHAIN_SEGMENT_LAST:
-+			target_csi = current_csi;
-+			memcpy(target_csi, &phy->csi.buffered_csi, sizeof(struct csi_data));
-+			memset(&phy->csi.buffered_csi, 0, sizeof(struct csi_data));
-+			break;
-+		default:
-+			break;
-+		}
-+	} else {
-+		target_csi = current_csi;
-+	}
-+
-+	/* put the csi data into list */
-+	INIT_LIST_HEAD(&target_csi->node);
-+	spin_lock_bh(&phy->csi.lock);
-+
-+	if (!phy->csi.enable) {
-+		kfree(target_csi);
-+		goto out;
-+	}
-+
-+	list_add_tail(&target_csi->node, &phy->csi.list);
-+	phy->csi.count++;
-+
-+	if (phy->csi.count > CSI_MAX_BUF_NUM) {
-+		struct csi_data *old;
-+
-+		old = list_first_entry(&phy->csi.list,
-+				       struct csi_data, node);
-+
-+		list_del(&old->node);
-+		kfree(old);
-+		phy->csi.count--;
-+	}
-+
-+	if (target_csi->chain_info & BIT(15)) /* last chain */
-+		phy->csi.last_record = target_csi->ts;
-+
-+out:
-+	spin_unlock_bh(&phy->csi.lock);
-+	return 0;
-+}
-+
-+void
-+mt7996_mcu_csi_report_event(struct mt7996_dev *dev, struct sk_buff *skb)
-+{
-+	struct mt7996_mcu_csi_event *event;
-+	struct mt76_phy *mphy;
-+	struct mt7996_phy *phy;
-+
-+	event = (struct mt7996_mcu_csi_event *)skb->data;
-+
-+	mphy = dev->mt76.phys[event->band_idx];
-+	if (!mphy)
-+		return;
-+
-+	phy = mphy->priv;
-+
-+	switch (le16_to_cpu(event->tag)) {
-+	case UNI_EVENT_CSI_DATA:
-+		mt7996_mcu_csi_report_data(phy, event->tlv_buf, le16_to_cpu(event->len) - 4);
-+		break;
-+	default:
-+		break;
-+	}
-+}
-+
- static void
- mt7996_mcu_rx_thermal_notify(struct mt7996_dev *dev, struct sk_buff *skb)
- {
-@@ -881,6 +1138,11 @@ mt7996_mcu_uni_rx_unsolicited_event(struct mt7996_dev *dev, struct sk_buff *skb)
- 	case MCU_UNI_EVENT_BF:
- 		mt7996_mcu_rx_bf_event(dev, skb);
- 		break;
-+#endif
-+#ifdef CONFIG_MTK_VENDOR
-+	case MCU_UNI_EVENT_CSI_REPORT:
-+		mt7996_mcu_csi_report_event(dev, skb);
-+		break;
- #endif
- 	default:
- 		break;
-@@ -5671,4 +5933,207 @@ void mt7996_set_beacon_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
- 
- 	mt7996_mcu_add_beacon(hw, vif, val);
- }
-+
-+static int mt7996_mcu_set_csi_enable(struct mt7996_phy *phy, u16 tag)
-+{
-+	struct {
-+		u8 band;
-+		u8 rsv1[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+	} __packed req = {
-+		.band = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(CSI_CTRL), &req,
-+				sizeof(req), false);
-+}
-+
-+static int mt7996_mcu_set_csi_frame_type(struct mt7996_phy *phy, u16 tag, u8 type_idx, u32 type)
-+{
-+	struct {
-+		u8 band;
-+		u8 rsv1[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 frame_type_idx;
-+		u8 frame_type;
-+		u8 rsv2[2];
-+	} __packed req = {
-+		.band = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.frame_type_idx = type_idx,
-+		.frame_type = type,
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(CSI_CTRL), &req,
-+				sizeof(req), false);
-+}
-+
-+static int mt7996_mcu_set_csi_chain_filter(struct mt7996_phy *phy, u16 tag, u8 func, u32 value)
-+{
-+	struct {
-+		u8 band;
-+		u8 rsv1[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 function;
-+		u8 chain_value;
-+		u8 rsv2[2];
-+	} __packed req = {
-+		.band = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.function = func,
-+		.chain_value = value,
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(CSI_CTRL), &req,
-+				sizeof(req), false);
-+}
-+
-+static int mt7996_mcu_set_csi_sta_filter(struct mt7996_phy *phy, u16 tag, u32 op, u8 *sta_mac)
-+{
-+	struct {
-+		u8 band;
-+		u8 rsv1[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		u8 operation;
-+		u8 rsv2[1];
-+		u8 mac[6];
-+	} __packed req = {
-+		.band = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.operation = op,
-+	};
-+
-+	memcpy(req.mac, sta_mac, ETH_ALEN);
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(CSI_CTRL), &req,
-+				sizeof(req), false);
-+}
-+
-+static int mt7996_mcu_set_csi_active_mode(struct mt7996_phy *phy, u16 tag,
-+					  u32 interval, u8 frame_idx, u8 subframe_idx, u32 bitmap)
-+{
-+	struct {
-+		u8 band;
-+		u8 rsv1[3];
-+
-+		__le16 tag;
-+		__le16 len;
-+		__le16 interval; /* uint: ms */
-+		u8 frame_type_idx;
-+		u8 subframe_type_idx;
-+		__le32 bitmap; /* sta wcid bitmap */
-+		u8 rsv2[4];
-+	} __packed req = {
-+		.band = phy->mt76->band_idx,
-+		.tag = cpu_to_le16(tag),
-+		.len = cpu_to_le16(sizeof(req) - 4),
-+		.interval = cpu_to_le16(interval),
-+		.frame_type_idx = frame_idx,
-+		.subframe_type_idx = subframe_idx,
-+		.bitmap = cpu_to_le32(bitmap),
-+	};
-+
-+	return mt76_mcu_send_msg(&phy->dev->mt76, MCU_WM_UNI_CMD(CSI_CTRL), &req,
-+				sizeof(req), false);
-+}
-+
-+void mt7996_csi_wcid_bitmap_update(void *data, struct ieee80211_sta *sta)
-+{
-+	struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
-+	struct mt7996_phy *phy = msta->vif->phy;
-+	struct csi_bitmap_info_update *sta_info = (struct csi_bitmap_info_update *)data;
-+	u16 wcid = 0;
-+
-+#define CSI_ACTIVE_MODE_ADD 1
-+#define CSI_ACTIVE_MODE_REMOVE 0
-+
-+	if (!memcmp(sta_info->addr, sta->addr, ETH_ALEN)) {
-+		wcid = msta->wcid.idx;
-+
-+		/* active mode: only support station with wcid less than 32 */
-+		if (wcid > 32)
-+			return;
-+
-+		if (sta_info->action == CSI_ACTIVE_MODE_ADD)
-+			phy->csi.active_bitmap |= BIT(wcid);
-+		else if (sta_info->action == CSI_ACTIVE_MODE_REMOVE)
-+			phy->csi.active_bitmap &= ~(BIT(wcid));
-+	}
-+}
-+
-+int mt7996_mcu_set_csi(struct mt7996_phy *phy, u8 mode,
-+			u8 cfg, u8 v1, u32 v2, u8 *mac_addr)
-+{
-+	switch (mode) {
-+	case CSI_CONTROL_MODE_STOP:
-+		return mt7996_mcu_set_csi_enable(phy, UNI_CMD_CSI_STOP);
-+	case CSI_CONTROL_MODE_START:
-+		return mt7996_mcu_set_csi_enable(phy, UNI_CMD_CSI_START);
-+	case CSI_CONTROL_MODE_SET:
-+		switch (cfg) {
-+		case CSI_CONFIG_FRAME_TYPE:
-+			if (v2 > 255)
-+				return -EINVAL;
-+
-+			return mt7996_mcu_set_csi_frame_type(phy,
-+					UNI_CMD_CSI_SET_FRAME_TYPE, v1, v2);
-+		case CSI_CONFIG_CHAIN_FILTER:
-+			if (v2 > 255)
-+				return -EINVAL;
-+
-+			return mt7996_mcu_set_csi_chain_filter(phy,
-+					UNI_CMD_CSI_SET_CHAIN_FILTER, v1, v2);
-+		case CSI_CONFIG_STA_FILTER:
-+			if (!is_valid_ether_addr(mac_addr))
-+				return -EINVAL;
-+
-+			if (v2 > 255)
-+				return -EINVAL;
-+
-+			return mt7996_mcu_set_csi_sta_filter(phy,
-+					UNI_CMD_CSI_SET_STA_FILTER, v2, mac_addr);
-+		case CSI_CONFIG_ACTIVE_MODE:
-+			if (is_valid_ether_addr(mac_addr)) {
-+				struct csi_bitmap_info_update sta_info;
-+
-+				if (v2 > 255)
-+					return -EINVAL;
-+
-+				memcpy(sta_info.addr, mac_addr, ETH_ALEN);
-+				sta_info.action = v2;
-+
-+				ieee80211_iterate_stations_atomic(phy->mt76->hw,
-+								mt7996_csi_wcid_bitmap_update, &sta_info);
-+				return 0;
-+			} else {
-+				u8 frame_type = v1 & 0x3;
-+				u8 frame_subtype = (v1 & 0x3c) >> 2;
-+
-+					/* active mode: max interval is 3000ms */
-+					if (v2 > 3000)
-+						return -EINVAL;
-+
-+				return mt7996_mcu_set_csi_active_mode(phy, UNI_CMD_CSI_SET_ACTIVE_MODE,
-+						v2, frame_type, frame_subtype, phy->csi.active_bitmap);
-+			}
-+		default:
-+			return -EINVAL;
-+		}
-+	default:
-+		return -EINVAL;
-+	}
-+}
- #endif
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 9dc7946b..7721a01b 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -1112,4 +1112,109 @@ struct fixed_rate_table_ctrl {
- 	u8 _rsv2;
- } __packed;
- 
-+#ifdef CONFIG_MTK_VENDOR
-+struct mt7996_mcu_csi_event {
-+	struct mt7996_mcu_rxd rxd;
-+
-+	u8 band_idx;
-+	u8 _rsv[3];
-+
-+	__le16 tag;
-+	__le16 len;
-+	u8 tlv_buf[0];
-+};
-+
-+enum UNI_EVENT_CSI_TAG_T {
-+	UNI_EVENT_CSI_DATA = 0,
-+	UNI_EVENT_CSI_MAX_NUM
-+};
-+
-+struct csi_tlv {
-+	struct {
-+		__le32 tag;
-+		__le32 len;
-+	} basic;
-+	union {
-+		u8 mac[ETH_ALEN];
-+		__le32 info;
-+		s16 data[0];
-+	};
-+} __packed;
-+
-+struct csi_bitmap_info_update {
-+	u8 action;
-+	u8 addr[ETH_ALEN];
-+};
-+
-+#define CSI_MAX_BUF_NUM	3000
-+
-+enum CSI_EVENT_TLV_TAG {
-+	CSI_EVENT_FW_VER,
-+	CSI_EVENT_CBW,
-+	CSI_EVENT_RSSI,
-+	CSI_EVENT_SNR,
-+	CSI_EVENT_BAND,
-+	CSI_EVENT_CSI_NUM,
-+	CSI_EVENT_CSI_I_DATA,
-+	CSI_EVENT_CSI_Q_DATA,
-+	CSI_EVENT_DBW,
-+	CSI_EVENT_CH_IDX,
-+	CSI_EVENT_TA,
-+	CSI_EVENT_EXTRA_INFO,
-+	CSI_EVENT_RX_MODE,
-+	CSI_EVENT_RSVD1,
-+	CSI_EVENT_RSVD2,
-+	CSI_EVENT_RSVD3,
-+	CSI_EVENT_RSVD4,
-+	CSI_EVENT_H_IDX,
-+	CSI_EVENT_TX_RX_IDX,
-+	CSI_EVENT_TS,
-+	CSI_EVENT_PKT_SN,
-+	CSI_EVENT_BW_SEG,
-+	CSI_EVENT_REMAIN_LAST,
-+	CSI_EVENT_TR_STREAM,
-+	CSI_EVENT_TLV_TAG_NUM,
-+};
-+
-+enum CSI_CHAIN_TYPE {
-+	CSI_CHAIN_ERR,
-+	CSI_CHAIN_COMPLETE,
-+	CSI_CHAIN_SEGMENT_FIRST,
-+	CSI_CHAIN_SEGMENT_MIDDLE,
-+	CSI_CHAIN_SEGMENT_LAST,
-+	CSI_CHAIN_SEGMENT_ERR,
-+};
-+
-+enum CSI_CONTROL_MODE_T {
-+	CSI_CONTROL_MODE_STOP,
-+	CSI_CONTROL_MODE_START,
-+	CSI_CONTROL_MODE_SET,
-+	CSI_CONTROL_MODE_NUM
-+};
-+
-+enum CSI_CONFIG_ITEM_T {
-+	CSI_CONFIG_RSVD1,
-+	CSI_CONFIG_WF,
-+	CSI_CONFIG_RSVD2,
-+	CSI_CONFIG_FRAME_TYPE,
-+	CSI_CONFIG_TX_PATH,
-+	CSI_CONFIG_OUTPUT_FORMAT,
-+	CSI_CONFIG_INFO,
-+	CSI_CONFIG_CHAIN_FILTER,
-+	CSI_CONFIG_STA_FILTER,
-+	CSI_CONFIG_ACTIVE_MODE,
-+	CSI_CONFIG_ITEM_NUM
-+};
-+
-+/* CSI config Tag */
-+enum UNI_CMD_CSI_TAG_T {
-+	UNI_CMD_CSI_STOP = 0,
-+	UNI_CMD_CSI_START = 1,
-+	UNI_CMD_CSI_SET_FRAME_TYPE = 2,
-+	UNI_CMD_CSI_SET_CHAIN_FILTER = 3,
-+	UNI_CMD_CSI_SET_STA_FILTER = 4,
-+	UNI_CMD_CSI_SET_ACTIVE_MODE = 5,
-+};
-+#endif
-+
- #endif
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index f1308112..f172eea2 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -405,6 +405,47 @@ struct mt7996_air_monitor_ctrl {
- 	struct mt7996_air_monitor_group group[MT7996_AIR_MONITOR_MAX_GROUP];
- 	struct mt7996_air_monitor_entry entry[MT7996_AIR_MONITOR_MAX_ENTRY];
- };
-+
-+enum {
-+	CSI_BW20,
-+	CSI_BW40,
-+	CSI_BW80,
-+	CSI_BW160,
-+	CSI_BW320
-+};
-+
-+#define CSI_BW20_DATA_COUNT	64
-+#define CSI_BW40_DATA_COUNT	128
-+#define CSI_BW80_DATA_COUNT	256
-+#define CSI_BW160_DATA_COUNT	512
-+#define CSI_BW320_DATA_COUNT	1024
-+
-+struct csi_data {
-+	u8 fw_ver;
-+	u8 ch_bw;
-+	u16 data_num;
-+	s16 data_i[CSI_BW320_DATA_COUNT];
-+	s16 data_q[CSI_BW320_DATA_COUNT];
-+	u8 band;
-+	s8 rssi;
-+	u8 snr;
-+	u32 ts;
-+	u8 data_bw;
-+	u8 pri_ch_idx;
-+	u8 ta[ETH_ALEN];
-+	u32 ext_info;
-+	u16 rx_mode;
-+	u16 rx_rate;
-+	u32 chain_info;
-+	u16 tx_idx;
-+	u16 rx_idx;
-+	u32 segment_num;
-+	u8 remain_last;
-+	u16 pkt_sn;
-+	u8 tr_stream;
-+
-+	struct list_head node;
-+};
- #endif
- 
- struct mt7996_rro_ba_session {
-@@ -482,6 +523,18 @@ struct mt7996_phy {
- 	u8 rts_bw_sig;
- 	spinlock_t amnt_lock;
- 	struct mt7996_air_monitor_ctrl amnt_ctrl;
-+
-+	struct {
-+		struct list_head list;
-+		spinlock_t lock;
-+		u32 count;
-+		bool enable;
-+
-+		struct csi_data buffered_csi;
-+		u32 active_bitmap;
-+		u32 interval;
-+		u32 last_record;
-+	} csi;
- #endif
- #ifdef CONFIG_MTK_DEBUG
- 	bool sr_enable:1;
-@@ -996,6 +1049,8 @@ void mt7996_mcu_set_mimo(struct mt7996_phy *phy);
- int mt7996_set_muru_cfg(struct mt7996_phy *phy, u8 action, u8 val);
- int mt7996_mcu_set_muru_cfg(struct mt7996_phy *phy, void *data);
- void mt7996_set_beacon_vif(void *data, u8 *mac, struct ieee80211_vif *vif);
-+int mt7996_mcu_set_csi(struct mt7996_phy *phy, u8 mode,
-+		       u8 cfg, u8 v1, u32 v2, u8 *mac_addr);
- #endif
- 
- int mt7996_mcu_edcca_enable(struct mt7996_phy *phy, bool enable);
-diff --git a/mt7996/vendor.c b/mt7996/vendor.c
-index c87cc5c1..c37f1dba 100644
---- a/mt7996/vendor.c
-+++ b/mt7996/vendor.c
-@@ -117,6 +117,18 @@ beacon_ctrl_policy[NUM_MTK_VENDOR_ATTRS_BEACON_CTRL] = {
- 	[MTK_VENDOR_ATTR_BEACON_CTRL_MODE] = { .type = NLA_U8 },
- };
- 
-+static const struct nla_policy
-+csi_ctrl_policy[NUM_MTK_VENDOR_ATTRS_CSI_CTRL] = {
-+	[MTK_VENDOR_ATTR_CSI_CTRL_CFG] = {.type = NLA_NESTED },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_CFG_MODE] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_CFG_TYPE] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL1] = { .type = NLA_U8 },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL2] = { .type = NLA_U32 },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_MAC_ADDR] = { .type = NLA_NESTED },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM] = { .type = NLA_U16 },
-+	[MTK_VENDOR_ATTR_CSI_CTRL_DATA] = { .type = NLA_NESTED },
-+};
-+
- struct mt7996_amnt_data {
- 	u8 idx;
- 	u8 addr[ETH_ALEN];
-@@ -932,7 +944,188 @@ static int mt7996_vendor_beacon_ctrl(struct wiphy *wiphy,
- 
- 	return 0;
- }
-+static int mt7996_vendor_csi_ctrl(struct wiphy *wiphy,
-+				  struct wireless_dev *wdev,
-+				  const void *data,
-+				  int data_len)
-+{
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_CSI_CTRL];
-+	int err;
-+
-+	err = nla_parse(tb, MTK_VENDOR_ATTR_CSI_CTRL_MAX, data, data_len,
-+			csi_ctrl_policy, NULL);
-+	if (err)
-+		return err;
-+
-+	if (tb[MTK_VENDOR_ATTR_CSI_CTRL_CFG]) {
-+		u8 mode = 0, type = 0, v1 = 0;
-+		u32 v2 = 0;
-+		u8 mac_addr[ETH_ALEN] = {};
-+		struct nlattr *cur;
-+		int rem;
-+
-+		nla_for_each_nested(cur, tb[MTK_VENDOR_ATTR_CSI_CTRL_CFG], rem) {
-+			switch (nla_type(cur)) {
-+			case MTK_VENDOR_ATTR_CSI_CTRL_CFG_MODE:
-+				mode = nla_get_u8(cur);
-+				break;
-+			case MTK_VENDOR_ATTR_CSI_CTRL_CFG_TYPE:
-+				type = nla_get_u8(cur);
-+				break;
-+			case MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL1:
-+				v1 = nla_get_u8(cur);
-+				break;
-+			case MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL2:
-+				v2 = nla_get_u32(cur);
-+				break;
-+			default:
-+				return -EINVAL;
-+			};
-+		}
-+
-+		if (tb[MTK_VENDOR_ATTR_CSI_CTRL_MAC_ADDR]) {
-+			u8 idx = 0;
-+
-+			nla_for_each_nested(cur, tb[MTK_VENDOR_ATTR_CSI_CTRL_MAC_ADDR], rem) {
-+				mac_addr[idx++] = nla_get_u8(cur);
-+			}
-+		}
-+
-+		err = mt7996_mcu_set_csi(phy, mode, type, v1, v2, mac_addr);
-+		if (err < 0)
-+			return err;
-+
-+		spin_lock_bh(&phy->csi.lock);
- 
-+		phy->csi.enable = !!mode;
-+
-+		/* clean up old csi stats */
-+		if ((mode == CSI_CONTROL_MODE_STOP || mode == CSI_CONTROL_MODE_SET)
-+			&& !list_empty(&phy->csi.list)) {
-+			struct csi_data *c, *tmp_c;
-+
-+			list_for_each_entry_safe(c, tmp_c, &phy->csi.list, node) {
-+				list_del(&c->node);
-+				kfree(c);
-+				phy->csi.count--;
-+			}
-+		} else if (mode == CSI_CONTROL_MODE_START) {
-+			phy->csi.last_record = 0;
-+		}
-+
-+		spin_unlock_bh(&phy->csi.lock);
-+
-+		if (mode == CSI_CONTROL_MODE_SET && type == CSI_CONFIG_STA_FILTER && v1 == 2)
-+			phy->csi.interval = v2;
-+	}
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_vendor_csi_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
-+			    struct sk_buff *skb, const void *data, int data_len,
-+			    unsigned long *storage)
-+{
-+#define RESERVED_SET	BIT(31)
-+	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
-+	struct mt7996_phy *phy = mt7996_hw_phy(hw);
-+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_CSI_CTRL] = {0};
-+	int err = 0;
-+
-+	if (*storage & RESERVED_SET) {
-+		if ((*storage & GENMASK(15, 0)) == 0)
-+			return -ENOENT;
-+		(*storage)--;
-+	}
-+
-+	if (data) {
-+		err = nla_parse(tb, MTK_VENDOR_ATTR_CSI_CTRL_MAX, data, data_len,
-+				csi_ctrl_policy, NULL);
-+		if (err)
-+			return err;
-+	}
-+
-+	if (!(*storage & RESERVED_SET) && tb[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM]) {
-+		*storage = nla_get_u16(tb[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM]);
-+		*storage |= RESERVED_SET;
-+	}
-+
-+	spin_lock_bh(&phy->csi.lock);
-+
-+	if (!list_empty(&phy->csi.list)) {
-+		struct csi_data *csi;
-+		void *a, *b;
-+		int i;
-+
-+		csi = list_first_entry(&phy->csi.list, struct csi_data, node);
-+
-+		a = nla_nest_start(skb, MTK_VENDOR_ATTR_CSI_CTRL_DATA);
-+		if (!a)
-+			goto out;
-+
-+		if (nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_VER, 1) ||
-+		    nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_RSSI, csi->rssi) ||
-+		    nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_SNR, csi->snr) ||
-+		    nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_BW, csi->data_bw) ||
-+		    nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_CH_IDX, csi->pri_ch_idx) ||
-+		    nla_put_u8(skb, MTK_VENDOR_ATTR_CSI_DATA_MODE, csi->rx_mode))
-+			goto out;
-+
-+		if (nla_put_u16(skb, MTK_VENDOR_ATTR_CSI_DATA_TX_ANT, csi->tx_idx) ||
-+		    nla_put_u16(skb, MTK_VENDOR_ATTR_CSI_DATA_RX_ANT, csi->rx_idx))
-+			goto out;
-+
-+		if (nla_put_u32(skb, MTK_VENDOR_ATTR_CSI_DATA_INFO, csi->ext_info) ||
-+		    nla_put_u32(skb, MTK_VENDOR_ATTR_CSI_DATA_CHAIN_INFO, csi->chain_info) ||
-+		    nla_put_u32(skb, MTK_VENDOR_ATTR_CSI_DATA_TS, csi->ts))
-+			goto out;
-+
-+		b = nla_nest_start(skb, MTK_VENDOR_ATTR_CSI_DATA_TA);
-+		if (!b)
-+			goto out;
-+
-+		for (i = 0; i < ARRAY_SIZE(csi->ta); i++)
-+			if (nla_put_u8(skb, i, csi->ta[i]))
-+				goto out;
-+		nla_nest_end(skb, b);
-+
-+		if (nla_put_u32(skb, MTK_VENDOR_ATTR_CSI_DATA_NUM, csi->data_num))
-+			goto out;
-+
-+		b = nla_nest_start(skb, MTK_VENDOR_ATTR_CSI_DATA_I);
-+		if (!b)
-+			goto out;
-+
-+		for (i = 0; i < csi->data_num; i++)
-+			if (nla_put_u16(skb, i, csi->data_i[i]))
-+				goto out;
-+		nla_nest_end(skb, b);
-+
-+		b = nla_nest_start(skb, MTK_VENDOR_ATTR_CSI_DATA_Q);
-+		if (!b)
-+			goto out;
-+
-+		for (i = 0; i < csi->data_num; i++)
-+			if (nla_put_u16(skb, i, csi->data_q[i]))
-+				goto out;
-+		nla_nest_end(skb, b);
-+
-+		nla_nest_end(skb, a);
-+
-+		list_del(&csi->node);
-+		kfree(csi);
-+		phy->csi.count--;
-+
-+		err = phy->csi.count;
-+	}
-+out:
-+	spin_unlock_bh(&phy->csi.lock);
-+
-+	return err;
-+}
- 
- static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 	{
-@@ -1061,6 +1254,18 @@ static const struct wiphy_vendor_command mt7996_vendor_commands[] = {
- 		.policy = beacon_ctrl_policy,
- 		.maxattr = MTK_VENDOR_ATTR_BEACON_CTRL_MAX,
- 	},
-+	{
-+		.info = {
-+			.vendor_id = MTK_NL80211_VENDOR_ID,
-+			.subcmd = MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL,
-+		},
-+		.flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
-+			 WIPHY_VENDOR_CMD_NEED_RUNNING,
-+		.doit = mt7996_vendor_csi_ctrl,
-+		.dumpit = mt7996_vendor_csi_ctrl_dump,
-+		.policy = csi_ctrl_policy,
-+		.maxattr = MTK_VENDOR_ATTR_CSI_CTRL_MAX,
-+	},
- };
- 
- void mt7996_vendor_register(struct mt7996_phy *phy)
-@@ -1068,6 +1273,9 @@ void mt7996_vendor_register(struct mt7996_phy *phy)
- 	phy->mt76->hw->wiphy->vendor_commands = mt7996_vendor_commands;
- 	phy->mt76->hw->wiphy->n_vendor_commands = ARRAY_SIZE(mt7996_vendor_commands);
- 
-+	INIT_LIST_HEAD(&phy->csi.list);
-+	spin_lock_init(&phy->csi.lock);
-+
- 	spin_lock_init(&phy->amnt_lock);
- }
- #endif
-diff --git a/mt7996/vendor.h b/mt7996/vendor.h
-index e7d88828..7c9d12bb 100644
---- a/mt7996/vendor.h
-+++ b/mt7996/vendor.h
-@@ -7,6 +7,7 @@
- 
- enum mtk_nl80211_vendor_subcmds {
- 	MTK_NL80211_VENDOR_SUBCMD_AMNT_CTRL = 0xae,
-+	MTK_NL80211_VENDOR_SUBCMD_CSI_CTRL = 0xc2,
- 	MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL = 0xc3,
- 	MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL = 0xc4,
- 	MTK_NL80211_VENDOR_SUBCMD_MU_CTRL = 0xc5,
-@@ -238,6 +239,55 @@ enum mtk_vendor_attr_beacon_ctrl {
- 		NUM_MTK_VENDOR_ATTRS_BEACON_CTRL - 1
- };
- 
-+enum mtk_vendor_attr_csi_ctrl {
-+	MTK_VENDOR_ATTR_CSI_CTRL_UNSPEC,
-+
-+	MTK_VENDOR_ATTR_CSI_CTRL_CFG,
-+	MTK_VENDOR_ATTR_CSI_CTRL_CFG_MODE,
-+	MTK_VENDOR_ATTR_CSI_CTRL_CFG_TYPE,
-+	MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL1,
-+	MTK_VENDOR_ATTR_CSI_CTRL_CFG_VAL2,
-+	MTK_VENDOR_ATTR_CSI_CTRL_MAC_ADDR,
-+
-+	MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM,
-+
-+	MTK_VENDOR_ATTR_CSI_CTRL_DATA,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_CSI_CTRL,
-+	MTK_VENDOR_ATTR_CSI_CTRL_MAX =
-+		NUM_MTK_VENDOR_ATTRS_CSI_CTRL - 1
-+};
-+
-+enum mtk_vendor_attr_csi_data {
-+	MTK_VENDOR_ATTR_CSI_DATA_UNSPEC,
-+	MTK_VENDOR_ATTR_CSI_DATA_PAD,
-+
-+	MTK_VENDOR_ATTR_CSI_DATA_VER,
-+	MTK_VENDOR_ATTR_CSI_DATA_TS,
-+	MTK_VENDOR_ATTR_CSI_DATA_RSSI,
-+	MTK_VENDOR_ATTR_CSI_DATA_SNR,
-+	MTK_VENDOR_ATTR_CSI_DATA_BW,
-+	MTK_VENDOR_ATTR_CSI_DATA_CH_IDX,
-+	MTK_VENDOR_ATTR_CSI_DATA_TA,
-+	MTK_VENDOR_ATTR_CSI_DATA_NUM,
-+	MTK_VENDOR_ATTR_CSI_DATA_I,
-+	MTK_VENDOR_ATTR_CSI_DATA_Q,
-+	MTK_VENDOR_ATTR_CSI_DATA_INFO,
-+	MTK_VENDOR_ATTR_CSI_DATA_RSVD1,
-+	MTK_VENDOR_ATTR_CSI_DATA_RSVD2,
-+	MTK_VENDOR_ATTR_CSI_DATA_RSVD3,
-+	MTK_VENDOR_ATTR_CSI_DATA_RSVD4,
-+	MTK_VENDOR_ATTR_CSI_DATA_TX_ANT,
-+	MTK_VENDOR_ATTR_CSI_DATA_RX_ANT,
-+	MTK_VENDOR_ATTR_CSI_DATA_MODE,
-+	MTK_VENDOR_ATTR_CSI_DATA_CHAIN_INFO,
-+
-+	/* keep last */
-+	NUM_MTK_VENDOR_ATTRS_CSI_DATA,
-+	MTK_VENDOR_ATTR_CSI_DATA_MAX =
-+		NUM_MTK_VENDOR_ATTRS_CSI_DATA - 1
-+};
- #endif
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2027-mtk-wifi-mt76-mt7992-add-support-to-enable-index-FW-.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2027-mtk-wifi-mt76-mt7992-add-support-to-enable-index-FW-.patch
deleted file mode 100644
index 42650f3..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/2027-mtk-wifi-mt76-mt7992-add-support-to-enable-index-FW-.patch
+++ /dev/null
@@ -1,628 +0,0 @@
-From f55be6f6596db120b2e48a7c87fcacf9d9df25ef Mon Sep 17 00:00:00 2001
-From: Benjamin Lin <benjamin-jw.lin@mediatek.com>
-Date: Thu, 11 Jan 2024 08:55:13 +0800
-Subject: [PATCH 2027/2032] mtk: wifi: mt76: mt7992: add support to enable
- index FW log for ConsysPlanet
-
-Add support to enable and record index FW log, which is the input for ConsysPlanet, via mt76-test command.
-
-Usage:
-1. Foreground logging
-	1) Start: mt76-test phy0 idxlog
-	2) Stop: Ctrl + C
-2. Background logging
-	1) Start: mt76-test phy0 idxlog &
-	2) Stop: killall mt76-test
-3. Logging with FW Parser
-	1) Start Ethernet recording of FW Parser.
-	2) Start: mt76-test phy0 idxlog <PC's IP Address>
-	3) Stop: Ctrl + C
-	4) Stop FW Parser.
-
-Log Files
-- FW Log: FW text message
-	- Location: /tmp/log/clog_(timestamp)/WIFI_FW_(timestamp).clog
-- Driver Log: log message printed at driver layer
-	- Location: /tmp/log/clog_(timestamp)/WIFI_KERNEL_(timestamp).clog
-
-Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
----
- mt7996/debugfs.c  |  90 +++++++++++++++++--
- mt7996/mac.c      |  10 ++-
- mt7996/mcu.c      |  34 +++++++-
- mt7996/mcu.h      |   4 +-
- mt7996/mt7996.h   |   3 +
- tools/fwlog.c     | 218 ++++++++++++++++++++++++++++++++++------------
- tools/main.c      |   2 +
- tools/mt76-test.h |   3 +
- 8 files changed, 295 insertions(+), 69 deletions(-)
-
-diff --git a/mt7996/debugfs.c b/mt7996/debugfs.c
-index 6ccf0827..c236ec98 100644
---- a/mt7996/debugfs.c
-+++ b/mt7996/debugfs.c
-@@ -425,8 +425,8 @@ create_buf_file_cb(const char *filename, struct dentry *parent, umode_t mode,
- {
- 	struct dentry *f;
- 
--	f = debugfs_create_file("fwlog_data", mode, parent, buf,
--				&relay_file_operations);
-+	f = debugfs_create_file(filename[0] == 'f' ? "fwlog_data" : "idxlog_data",
-+	                        mode, parent, buf, &relay_file_operations);
- 	if (IS_ERR(f))
- 		return NULL;
- 
-@@ -517,6 +517,53 @@ mt7996_fw_debug_bin_get(void *data, u64 *val)
- DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_bin, mt7996_fw_debug_bin_get,
- 			 mt7996_fw_debug_bin_set, "%lld\n");
- 
-+static int
-+mt7996_idxlog_enable_get(void *data, u64 *val)
-+{
-+	struct mt7996_dev *dev = data;
-+
-+	*val = dev->idxlog_enable;
-+
-+	return 0;
-+}
-+
-+static int
-+mt7996_idxlog_enable_set(void *data, u64 val)
-+{
-+	static struct rchan_callbacks relay_cb = {
-+		.create_buf_file = create_buf_file_cb,
-+		.remove_buf_file = remove_buf_file_cb,
-+	};
-+	struct mt7996_dev *dev = data;
-+
-+	if (dev->idxlog_enable == !!val)
-+		return 0;
-+
-+	if (!dev->relay_idxlog) {
-+		dev->relay_idxlog = relay_open("idxlog_data", dev->debugfs_dir,
-+		                               1500, 512, &relay_cb, NULL);
-+		if (!dev->relay_idxlog)
-+			return -ENOMEM;
-+	}
-+
-+	dev->idxlog_enable = !!val;
-+
-+	if (val) {
-+		int ret = mt7996_mcu_fw_time_sync(&dev->mt76);
-+		if (ret)
-+			return ret;
-+
-+		/* Reset relay channel only when it is not being written to. */
-+		relay_reset(dev->relay_idxlog);
-+	}
-+
-+	return mt7996_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM,
-+	                                val ? MCU_FW_LOG_RELAY_IDX : 0);
-+}
-+
-+DEFINE_DEBUGFS_ATTRIBUTE(fops_idxlog_enable, mt7996_idxlog_enable_get,
-+	                 mt7996_idxlog_enable_set, "%llu\n");
-+
- static int
- mt7996_fw_util_wa_show(struct seq_file *file, void *data)
- {
-@@ -1037,6 +1084,7 @@ int mt7996_init_debugfs(struct mt7996_phy *phy)
- 	debugfs_create_file("fw_debug_wm", 0600, dir, dev, &fops_fw_debug_wm);
- 	debugfs_create_file("fw_debug_wa", 0600, dir, dev, &fops_fw_debug_wa);
- 	debugfs_create_file("fw_debug_bin", 0600, dir, dev, &fops_fw_debug_bin);
-+	debugfs_create_file("idxlog_enable", 0600, dir, dev, &fops_idxlog_enable);
- 	/* TODO: wm fw cpu utilization */
- 	debugfs_create_file("fw_util_wa", 0400, dir, dev,
- 			    &mt7996_fw_util_wa_fops);
-@@ -1103,6 +1151,32 @@ mt7996_debugfs_write_fwlog(struct mt7996_dev *dev, const void *hdr, int hdrlen,
- 	spin_unlock_irqrestore(&lock, flags);
- }
- 
-+static void
-+mt7996_debugfs_write_idxlog(struct mt7996_dev *dev, const void *data, int len)
-+{
-+	static DEFINE_SPINLOCK(lock);
-+	unsigned long flags;
-+	void *dest;
-+
-+	if (!dev->relay_idxlog)
-+		return;
-+
-+	spin_lock_irqsave(&lock, flags);
-+
-+	dest = relay_reserve(dev->relay_idxlog, len + 4);
-+	if (!dest)
-+		dev_err(dev->mt76.dev, "Failed to reserve slot in %s\n",
-+		        dev->relay_idxlog->base_filename);
-+	else {
-+		*(u32 *)dest = len;
-+		dest += 4;
-+		memcpy(dest, data, len);
-+		relay_flush(dev->relay_idxlog);
-+	}
-+
-+	spin_unlock_irqrestore(&lock, flags);
-+}
-+
- void mt7996_debugfs_rx_fw_monitor(struct mt7996_dev *dev, const void *data, int len)
- {
- 	struct {
-@@ -1127,11 +1201,15 @@ void mt7996_debugfs_rx_fw_monitor(struct mt7996_dev *dev, const void *data, int
- 
- bool mt7996_debugfs_rx_log(struct mt7996_dev *dev, const void *data, int len)
- {
--	if (get_unaligned_le32(data) != FW_BIN_LOG_MAGIC)
--		return false;
-+	bool is_fwlog = get_unaligned_le32(data) == FW_BIN_LOG_MAGIC;
- 
--	if (dev->relay_fwlog)
--		mt7996_debugfs_write_fwlog(dev, NULL, 0, data, len);
-+	if (is_fwlog) {
-+		if (dev->relay_fwlog)
-+			mt7996_debugfs_write_fwlog(dev, NULL, 0, data, len);
-+	} else if (dev->relay_idxlog)
-+		mt7996_debugfs_write_idxlog(dev, data, len);
-+	else
-+		return false;
- 
- 	return true;
- }
-diff --git a/mt7996/mac.c b/mt7996/mac.c
-index 88e1fd14..c2a8e752 100644
---- a/mt7996/mac.c
-+++ b/mt7996/mac.c
-@@ -2283,11 +2283,9 @@ void mt7996_mac_work(struct work_struct *work)
- 	mutex_lock(&mdev->mutex);
- 
- 	mt76_update_survey(mphy);
--	if (++mphy->mac_work_count == 5) {
-+	if (++mphy->mac_work_count % 5 == 0) {
- 		int i;
- 
--		mphy->mac_work_count = 0;
--
- 		mt7996_mac_update_stats(phy);
- 
- 		/* Update DEV-wise information only in
-@@ -2306,6 +2304,12 @@ void mt7996_mac_work(struct work_struct *work)
- 				if (mt7996_mcu_wa_cmd(phy->dev, MCU_WA_PARAM_CMD(QUERY), MCU_WA_PARAM_BSS_ACQ_PKT_CNT,
- 				                      BSS_ACQ_PKT_CNT_BSS_BITMAP_ALL | BSS_ACQ_PKT_CNT_READ_CLR, 0))
- 					dev_err(mdev->dev, "Failed to query per-AC-queue packet counts.\n");
-+
-+				if (mphy->mac_work_count == 100) {
-+					if (phy->dev->idxlog_enable && mt7996_mcu_fw_time_sync(mdev))
-+						dev_err(mdev->dev, "Failed to synchronize time with FW.\n");
-+					mphy->mac_work_count = 0;
-+				}
- 			} else if (mt7996_band_valid(phy->dev, i) &&
- 			           test_bit(MT76_STATE_RUNNING, &mdev->phys[i]->state))
- 				break;
-diff --git a/mt7996/mcu.c b/mt7996/mcu.c
-index 9e04ea2b..0cb4cfa5 100644
---- a/mt7996/mcu.c
-+++ b/mt7996/mcu.c
-@@ -397,6 +397,7 @@ static void
- mt7996_mcu_rx_log_message(struct mt7996_dev *dev, struct sk_buff *skb)
- {
- #define UNI_EVENT_FW_LOG_FORMAT 0
-+#define UNI_EVENT_FW_LOG_MEMORY	1
- 	struct mt7996_mcu_rxd *rxd = (struct mt7996_mcu_rxd *)skb->data;
- 	const char *data = (char *)&rxd[1] + 4, *type;
- 	struct tlv *tlv = (struct tlv *)data;
-@@ -408,7 +409,8 @@ mt7996_mcu_rx_log_message(struct mt7996_dev *dev, struct sk_buff *skb)
- 		goto out;
- 	}
- 
--	if (le16_to_cpu(tlv->tag) != UNI_EVENT_FW_LOG_FORMAT)
-+	if (le16_to_cpu(tlv->tag) != UNI_EVENT_FW_LOG_FORMAT &&
-+	    le16_to_cpu(tlv->tag) != UNI_EVENT_FW_LOG_MEMORY)
- 		return;
- 
- 	data += sizeof(*tlv) + 4;
-@@ -3444,6 +3446,36 @@ int mt7996_mcu_fw_dbg_ctrl(struct mt7996_dev *dev, u32 module, u8 level)
- 				 sizeof(data), false);
- }
- 
-+int mt7996_mcu_fw_time_sync(struct mt76_dev *dev)
-+{
-+	struct {
-+		u8 _rsv[4];
-+
-+		__le16 tag;
-+		__le16 len;
-+		__le32 sec;
-+		__le32 usec;
-+	} data = {
-+		.tag = cpu_to_le16(UNI_WSYS_CONFIG_FW_TIME_SYNC),
-+		.len = cpu_to_le16(sizeof(data) - 4),
-+	};
-+	struct timespec64 ts;
-+	struct tm tm;
-+
-+	ktime_get_real_ts64(&ts);
-+	data.sec = cpu_to_le32((u32)ts.tv_sec);
-+	data.usec = cpu_to_le32((u32)(ts.tv_nsec / 1000));
-+
-+	/* Dump synchronized time for ConsysPlanet to parse. */
-+	time64_to_tm(ts.tv_sec, 0, &tm);
-+	dev_info(dev->dev, "%ld-%02d-%02d %02d:%02d:%02d.%ld UTC\n",
-+	        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
-+	        tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec / 1000);
-+
-+	return mt76_mcu_send_msg(dev, MCU_WM_UNI_CMD(WSYS_CONFIG), &data,
-+	                         sizeof(data), true);
-+}
-+
- static int mt7996_mcu_set_mwds(struct mt7996_dev *dev, bool enabled)
- {
- 	struct {
-diff --git a/mt7996/mcu.h b/mt7996/mcu.h
-index 7721a01b..826cf204 100644
---- a/mt7996/mcu.h
-+++ b/mt7996/mcu.h
-@@ -357,7 +357,8 @@ enum {
- 	MCU_FW_LOG_WM,
- 	MCU_FW_LOG_WA,
- 	MCU_FW_LOG_TO_HOST,
--	MCU_FW_LOG_RELAY = 16
-+	MCU_FW_LOG_RELAY = 16,
-+	MCU_FW_LOG_RELAY_IDX = 40
- };
- 
- enum {
-@@ -949,6 +950,7 @@ enum {
- 	UNI_WSYS_CONFIG_FW_LOG_CTRL,
- 	UNI_WSYS_CONFIG_FW_DBG_CTRL,
- 	UNI_CMD_CERT_CFG = 6,
-+	UNI_WSYS_CONFIG_FW_TIME_SYNC, /* UNI_CMD_FW_TIME_SYNC in FW */
- };
- 
- enum {
-diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
-index f172eea2..10886cb1 100644
---- a/mt7996/mt7996.h
-+++ b/mt7996/mt7996.h
-@@ -642,9 +642,11 @@ struct mt7996_dev {
- 	u8 fw_debug_bin;
- 	u16 fw_debug_seq;
- 	bool fw_debug_muru_disable;
-+	bool idxlog_enable;
- 
- 	struct dentry *debugfs_dir;
- 	struct rchan *relay_fwlog;
-+	struct rchan *relay_idxlog;
- 
- 	void *cal;
- 	u32 cur_prek_offset;
-@@ -896,6 +898,7 @@ int mt7996_mcu_wa_cmd(struct mt7996_dev *dev, int cmd, u32 a1, u32 a2, u32 a3);
- int mt7996_mcu_red_config(struct mt7996_dev *dev, bool enable);
- int mt7996_mcu_fw_log_2_host(struct mt7996_dev *dev, u8 type, u8 ctrl);
- int mt7996_mcu_fw_dbg_ctrl(struct mt7996_dev *dev, u32 module, u8 level);
-+int mt7996_mcu_fw_time_sync(struct mt76_dev *dev);
- int mt7996_mcu_trigger_assert(struct mt7996_dev *dev);
- void mt7996_mcu_rx_event(struct mt7996_dev *dev, struct sk_buff *skb);
- void mt7996_mcu_exit(struct mt7996_dev *dev);
-diff --git a/tools/fwlog.c b/tools/fwlog.c
-index 3c6a61d7..0e2de2dc 100644
---- a/tools/fwlog.c
-+++ b/tools/fwlog.c
-@@ -29,10 +29,9 @@ static const char *debugfs_path(const char *phyname, const char *file)
- static int mt76_set_fwlog_en(const char *phyname, bool en, char *val)
- {
- 	FILE *f = fopen(debugfs_path(phyname, "fw_debug_bin"), "w");
--
- 	if (!f) {
--		fprintf(stderr, "Could not open fw_debug_bin file\n");
--		return 1;
-+		perror("fopen");
-+		return -1;
- 	}
- 
- 	if (en && val)
-@@ -47,6 +46,21 @@ static int mt76_set_fwlog_en(const char *phyname, bool en, char *val)
- 	return 0;
- }
- 
-+static int mt76_set_idxlog_enable(const char *phyname, bool enable)
-+{
-+	FILE *f = fopen(debugfs_path(phyname, "idxlog_enable"), "w");
-+	if (!f) {
-+		perror("fopen");
-+		return -1;
-+	}
-+
-+	fprintf(f, "%hhu", enable);
-+
-+	fclose(f);
-+
-+	return 0;
-+}
-+
- int read_retry(int fd, void *buf, int len)
- {
- 	int out_len = 0;
-@@ -80,105 +94,193 @@ static void handle_signal(int sig)
- 	done = true;
- }
- 
--int mt76_fwlog(const char *phyname, int argc, char **argv)
-+static int mt76_log_socket(struct sockaddr_in *remote, char *ip)
- {
--#define BUF_SIZE 1504
- 	struct sockaddr_in local = {
- 		.sin_family = AF_INET,
- 		.sin_addr.s_addr = INADDR_ANY,
- 	};
--	struct sockaddr_in remote = {
--		.sin_family = AF_INET,
--		.sin_port = htons(55688),
--	};
--	char *buf = calloc(BUF_SIZE, sizeof(char));
--	int ret = 0;
--	/* int yes = 1; */
--	int s, fd;
--
--	if (argc < 1) {
--		fprintf(stderr, "need destination address\n");
--		return 1;
--	}
-+	int s, ret;
- 
--	if (!inet_aton(argv[0], &remote.sin_addr)) {
--		fprintf(stderr, "invalid destination address\n");
--		return 1;
-+	remote->sin_family = AF_INET;
-+	remote->sin_port = htons(55688);
-+	if (!inet_aton(ip, &remote->sin_addr)) {
-+		fprintf(stderr, "Invalid destination IP address: %s\n", ip);
-+		return -EINVAL;
- 	}
- 
- 	s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
- 	if (s < 0) {
- 		perror("socket");
--		return 1;
-+		return s;
- 	}
- 
--	/* setsockopt(s, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)); */
--	if (bind(s, (struct sockaddr *)&local, sizeof(local)) < 0) {
-+	ret = bind(s, (struct sockaddr *)&local, sizeof(local));
-+	if (ret) {
- 		perror("bind");
--		return 1;
-+		close(s);
-+		return ret;
- 	}
- 
--	if (mt76_set_fwlog_en(phyname, true, argv[1]))
--		return 1;
-+	return s;
-+}
-+
-+static int mt76_log_relay(int in_fd, int out_fd, struct sockaddr_in *remote)
-+{
-+	char *buf = malloc(FWLOG_BUF_SIZE);
-+	int ret = 0;
- 
--	fd = open(debugfs_path(phyname, "fwlog_data"), O_RDONLY);
--	if (fd < 0) {
--		fprintf(stderr, "Could not open fwlog_data file: %s\n", strerror(errno));
--		ret = 1;
--		goto out;
-+	if (!buf) {
-+		perror("malloc");
-+		return -ENOMEM;
- 	}
- 
- 	signal(SIGTERM, handle_signal);
- 	signal(SIGINT, handle_signal);
- 	signal(SIGQUIT, handle_signal);
- 
--	while (1) {
-+	while (!done) {
- 		struct pollfd pfd = {
--			.fd = fd,
--			.events = POLLIN | POLLHUP | POLLERR,
-+			.fd = in_fd,
-+			.events = POLLIN,
- 		};
- 		uint32_t len;
--		int r;
--
--		if (done)
--			break;
-+		int rc;
- 
- 		poll(&pfd, 1, -1);
- 
--		r = read_retry(fd, &len, sizeof(len));
--		if (r < 0)
-+		rc = read_retry(in_fd, &len, sizeof(len));
-+		if (rc < 0) {
-+			if (!done) {
-+				fprintf(stderr, "Failed to read relay file.\n");
-+				ret = -1;
-+			}
- 			break;
--
--		if (!r)
-+		}
-+		if (!rc)
- 			continue;
- 
--		if (len > BUF_SIZE) {
--			fprintf(stderr, "Length error: %d > %d\n", len, BUF_SIZE);
--			ret = 1;
-+		if (len > FWLOG_BUF_SIZE) {
-+			fprintf(stderr, "Log size was too large: %u bytes\n", len);
-+			ret = -ENOMEM;
- 			break;
- 		}
- 
--		if (done)
-+		rc = read_retry(in_fd, buf, len);
-+		if (rc < 0) {
-+			if (!done) {
-+				fprintf(stderr, "Failed to read relay file.\n");
-+				ret = -1;
-+			}
- 			break;
--
--		r = read_retry(fd, buf, len);
--		if (done)
-+		}
-+		if (rc != len) {
-+			fprintf(stderr, "Expected log size: %u bytes\n", len);
-+			fprintf(stderr, "Read log size: %u bytes\n", rc);
-+			ret = -EIO;
- 			break;
-+		}
- 
--		if (r != len) {
--			fprintf(stderr, "Short read: %d < %d\n", r, len);
--			ret = 1;
-+		if (remote)
-+			rc = sendto(out_fd, buf, len, 0, (struct sockaddr *)remote, sizeof(*remote));
-+		else
-+			rc = write(out_fd, buf, len);
-+		if (rc < 0) {
-+			perror("sendto/write");
-+			ret = -1;
- 			break;
- 		}
-+	}
-+
-+	free(buf);
-+
-+	return ret;
-+}
-+
-+int mt76_fwlog(const char *phyname, int argc, char **argv)
-+{
-+	struct sockaddr_in remote;
-+	int in_fd, out_fd, ret;
-+
-+	if (argc < 1) {
-+		fprintf(stderr, "need destination address\n");
-+		return -EINVAL;
-+	}
-+
-+	out_fd = mt76_log_socket(&remote, argv[0]);
-+	if (out_fd < 0)
-+		return out_fd;
-+
-+	ret = mt76_set_fwlog_en(phyname, true, argv[1]);
-+	if (ret)
-+		goto close;
- 
--		/* send buf */
--		sendto(s, buf, len, 0, (struct sockaddr *)&remote, sizeof(remote));
-+	in_fd = open(debugfs_path(phyname, "fwlog_data"), O_RDONLY);
-+	if (in_fd < 0) {
-+		perror("open");
-+		goto disable;
- 	}
- 
--	close(fd);
-+	if (mt76_log_relay(in_fd, out_fd, &remote))
-+		fprintf(stderr, "Failed to relay FW log.\n");
- 
--out:
--	mt76_set_fwlog_en(phyname, false, NULL);
-+	close(in_fd);
-+disable:
-+	ret = mt76_set_fwlog_en(phyname, false, NULL);
-+close:
-+	close(out_fd);
-+
-+	return ret;
-+}
-+
-+int mt76_idxlog(const char *phyname, int argc, char **argv)
-+{
-+#define IDXLOG_FILE_PATH	"/tmp/log/WIFI_FW.clog"
-+	struct sockaddr_in remote;
-+	int in_fd, out_fd, ret;
-+
-+	if (argc) {
-+		out_fd = mt76_log_socket(&remote, argv[0]);
-+		if (out_fd < 0)
-+			return out_fd;
-+	} else {
-+		out_fd = open(IDXLOG_FILE_PATH, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR);
-+		if (out_fd < 0) {
-+			perror("open");
-+			return -1;
-+		}
-+	}
-+
-+	ret = mt76_set_idxlog_enable(phyname, true);
-+	if (ret)
-+		goto close;
-+
-+	in_fd = open(debugfs_path(phyname, "idxlog_data"), O_RDONLY);
-+	if (in_fd < 0) {
-+		perror("open");
-+		goto disable;
-+	}
-+
-+	if (mt76_log_relay(in_fd, out_fd, argc ? &remote : NULL))
-+		fprintf(stderr, "Failed to relay index log.\n");
-+
-+	close(in_fd);
-+disable:
-+	ret = mt76_set_idxlog_enable(phyname, false);
-+close:
-+	close(out_fd);
-+
-+	if (argc)
-+		system("timestamp=$(date +\"%y%m%d_%H%M%S\");"
-+		       "clog_dir=/tmp/log/clog_${timestamp};"
-+		       "mkdir ${clog_dir};"
-+		       "dmesg > ${clog_dir}/WIFI_KERNEL_${timestamp}.clog");
-+	else
-+		system("timestamp=$(date +\"%y%m%d_%H%M%S\");"
-+		       "clog_dir=/tmp/log/clog_${timestamp};"
-+		       "mkdir ${clog_dir};"
-+		       "mv /tmp/log/WIFI_FW.clog ${clog_dir}/WIFI_FW_${timestamp}.clog;"
-+		       "dmesg > ${clog_dir}/WIFI_KERNEL_${timestamp}.clog");
- 
- 	return ret;
- }
-diff --git a/tools/main.c b/tools/main.c
-index 699a9eea..e9e25567 100644
---- a/tools/main.c
-+++ b/tools/main.c
-@@ -198,6 +198,8 @@ int main(int argc, char **argv)
- 		ret = mt76_eeprom(phy, argc, argv);
- 	else if (!strcmp(cmd, "fwlog"))
- 		ret = mt76_fwlog(phyname, argc, argv);
-+	else if (!strcmp(cmd, "idxlog"))
-+		ret = mt76_idxlog(phyname, argc, argv);
- 	else
- 		usage();
- 
-diff --git a/tools/mt76-test.h b/tools/mt76-test.h
-index d2fafa86..b9d508c5 100644
---- a/tools/mt76-test.h
-+++ b/tools/mt76-test.h
-@@ -22,6 +22,8 @@
- #define EEPROM_FILE_PATH_FMT	"/tmp/mt76-test-%s"
- #define EEPROM_PART_SIZE	20480
- 
-+#define FWLOG_BUF_SIZE	1504
-+
- struct nl_msg;
- struct nlattr;
- 
-@@ -61,5 +63,6 @@ extern unsigned char *eeprom_data;
- void usage(void);
- int mt76_eeprom(int phy, int argc, char **argv);
- int mt76_fwlog(const char *phyname, int argc, char **argv);
-+int mt76_idxlog(const char *phyname, int argc, char **argv);
- 
- #endif
--- 
-2.18.0
-
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/.config b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/.config
index d825f94..9004ab4 100644
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/.config
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/.config
@@ -5357,6 +5357,7 @@
 #
 # WirelessAPD
 #
+CONFIG_PACKAGE_afcd=y
 # CONFIG_PACKAGE_eapol-test is not set
 # CONFIG_PACKAGE_eapol-test-mbedtls is not set
 # CONFIG_PACKAGE_eapol-test-openssl is not set
@@ -6329,3 +6330,5 @@
 # CONFIG_PACKAGE_fontconfig is not set
 # end of Font-Utils
 # end of Xorg
+
+CONFIG_LIBCURL_OPENSSL=y
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
index 249a464..6bfbe4a 100755
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
@@ -63,9 +63,6 @@
 
 prepare_flowoffload
 
-#wed3.0 patches from mtk_openwrt_feeds
-cp -rf ${release_folder}/mt7988_mt7996_mac80211/target/* ${BUILD_DIR}/target/
-
 #prepare mac80211 mt76 wifi stuff
 prepare_mac80211 ${backport_new} ${hostapd_new}
 
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
index 926ca94..01fec4a 100644
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
@@ -412,7 +412,8 @@
 	config_add_string group_cipher
 	config_add_string group_mgmt_cipher
 
-	config_add_int mld_id mld_assoc_phy mld_allowed_phy_bitmap
+	config_add_int assoc_phy
+	config_add_int mld_id mld_assoc_phy mld_allowed_phy_bitmap mld_allowed_links
 	config_add_boolean mld_primary mld_single_link
 	config_add_string mld_addr
 }
@@ -603,7 +604,7 @@
 		eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
 		vendor_elements fils ocv unsol_bcast_probe_resp_interval fils_discovery_min_interval \
 		fils_discovery_max_interval rnr group_cipher group_mgmt_cipher \
-		mld_id mld_primary mld_addr
+		mld_id mld_primary mld_addr mld_allowed_links
 
 	set_default fils 0
 	set_default isolate 0
@@ -1300,6 +1301,10 @@
 		append bss_conf "mld_primary=${mld_primary}" "$N"
 	fi
 
+	if [ "$mld_allowed_links" -gt 0 ]; then
+		append bss_conf "mld_allowed_links=${mld_allowed_links}" "$N"
+	fi
+
 	append "$var" "$bss_conf" "$N"
 	return 0
 }
@@ -1355,7 +1360,7 @@
 
 	_wpa_supplicant_common "$1"
 
-	json_get_vars mode wds multi_ap mld_single_link mld_assoc_phy mld_allowed_phy_bitmap
+	json_get_vars mode wds multi_ap assoc_phy mld_single_link mld_assoc_phy mld_allowed_phy_bitmap
 	set_default mld_allowed_phy_bitmap 0
 
 	[ -n "$network_bridge" ] && {
@@ -1425,6 +1430,8 @@
 		fi
 	fi
 
+	[ -n "$assoc_phy" ] && mld_assoc_phy=$assoc_phy
+
 	local mld_connect_band_pref=
 	if [ -n "$mld_assoc_phy" ]; then
 		if [ $(($mld_allowed_phy_bitmap & $((1<<$mld_assoc_phy)))) -eq 0 ]; then
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
index 4536292..891562e 100755
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
@@ -376,7 +376,7 @@
 			mu_beamformee:1 \
 			vht_txop_ps:1 \
 			htc_vht:1 \
-			beamformee_antennas:4 \
+			beamformee_antennas:5 \
 			beamformer_antennas:4 \
 			rx_antenna_pattern:1 \
 			tx_antenna_pattern:1 \
@@ -435,7 +435,7 @@
 		}
 
 		[ "$(($vht_cap & 0x1000))" -gt 0 -a "$su_beamformee" -gt 0 ] && {
-			cap_ant="$(( ( ($vht_cap >> 13) & 3 ) + 1 ))"
+			cap_ant="$(( ( ($vht_cap >> 13) & 7 ) + 1 ))"
 			[ "$cap_ant" -gt "$beamformee_antennas" ] && cap_ant="$beamformee_antennas"
 			[ "$cap_ant" -gt 1 ] && vht_capab="$vht_capab[BF-ANTENNA-$cap_ant]"
 		}
@@ -622,6 +622,7 @@
 ${multiple_bssid:+mbssid=$multiple_bssid}
 ${band_idx:+band_idx=$band_idx}
 #num_global_macaddr=$num_global_macaddr
+#single_hw=1
 $base_cfg
 
 EOF
@@ -788,18 +789,22 @@
 	local phy_idx=$(echo $2 | tr -d "phy")
 	local found_mld=0
 	local is_primary=1
+	local mld_allowed_links=0
 
 	iface_list="$(cat /etc/config/wireless | grep wifi-iface | cut -d ' ' -f3 | tr -s "'\n" ' ')"
 	for iface in $iface_list
 	do
 		local mld_id="$(uci show wireless.$iface | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
 		local radio_id="$(uci show wireless.$iface | grep "device" | cut -d '=' -f2 | tr -d "radio'")"
-		if [ $mld_id = $target_mld_id ] && [ $radio_id -lt $phy_idx ]; then
-			is_primary=0
-			break
+		local iface_disabled="$(uci show wireless.$iface | grep "disabled" | cut -d '=' -f2 | tr -d "'")"
+
+		if [ "$iface_disabled" != "1" ] && [ $mld_id = $target_mld_id ]; then
+			mld_allowed_links=$(($mld_allowed_links * 2 + 1))
+			[ $radio_id -lt $phy_idx ] && is_primary=0
 		fi
 	done
 	json_add_string "mld_primary" $is_primary
+	json_add_string "mld_allowed_links" $mld_allowed_links
 
         mld_list="$(cat /etc/config/wireless | grep wifi-mld | cut -d ' ' -f3 | tr -s "'\n" ' ')"
         for m in $mld_list
@@ -1423,6 +1428,8 @@
 
 	for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower
 	wireless_set_up
+
+	echo /tmp/%e.core > /proc/sys/kernel/core_pattern
 }
 
 _list_phy_interfaces() {
@@ -1452,6 +1459,13 @@
 		return 1
 	}
 
+	# each phy sleeps different times to prevent for ubus race condition.
+	if [ "$phy" = "phy1" ]; then
+		sleep 3;
+	elif [ "$phy" = "phy0" ]; then
+		sleep 6;
+	fi
+
 	mac80211_reset_config "$phy"
 
 	for wdev in $(list_phy_interfaces "$phy"); do
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
index 9d8ae63..aa3e5c8 100644
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
@@ -157,11 +157,13 @@
 			encryption=none
 			rnr=1
 			background_radar=1
+			mbo=0
 			band_idx=1
 		else
 			noscan=1
 			encryption=none
 			rnr=1
+			mbo=0
 			band_idx=0
 		fi
 	done
@@ -258,7 +260,7 @@
 			for i in $(seq 2 3); do
 				macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
 			done
-			macaddr="00:0$(($devidx - 1)):55:66${macaddr}"
+			macaddr="00:0$(($devidx + 1)):55:66${macaddr}"
 		fi
 
 		tx_burst=""
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_rom_patch.bin
index 87ad985..10d3d8f 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wa.bin
index 16af788..83b635b 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wm.bin
index a2c95da..d09cce2 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7915_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_rom_patch.bin
index a145348..fee3cd8 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wa.bin
index fe19921..b6ddf15 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wm.bin
index 6c0ecdb..c7162db 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7916_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_rom_patch.bin
index 0f956b4..34c821e 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wa.bin
index 75dba3c..fd2fc49 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wm.bin
index a526bdd..8288120 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo.bin
index aaf9865..4f807ba 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo_0.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo_0.bin
deleted file mode 100644
index 799ad67..0000000
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7981_wo_0.bin
+++ /dev/null
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch.bin
index d0f1844..0c285b4 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch_mt7975.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch_mt7975.bin
index b40b936..8271633 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch_mt7975.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_rom_patch_mt7975.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wa.bin
index ae937a8..867a764 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm.bin
index da731ad..5561f9f 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm_mt7975.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm_mt7975.bin
index 5664006..c6efce6 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm_mt7975.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wm_mt7975.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_0.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_0.bin
index 91d591f..d2a7674 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_0.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_0.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_1.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_1.bin
index 508e6a4..f067ac3 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_1.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7986_wo_1.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin
index 1f01751..3203f47 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin
index f277232..6bb8783 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_23.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin
index 1d128b7..0ee44c4 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_dsp_24.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin
index 31d86e1..62b15ff 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin
index cf61154..c6127eb 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_23.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin
index 50d3a2e..556abce 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_rom_patch_24.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin
index 27c7c00..0ddfc82 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin
index f62759a..54c9f8d 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_23.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin
index f37af42..cee6d27 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wa_24.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin
index b3b3529..ca62f15 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin
index 6623ad1..f645c9b 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_23.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin
index 7700262..f2b68ec 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_24.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin
index 74ade16..66cc70b 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin
index 04a3139..5643c9a 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_23.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin
index b1f5bad..f4a2305 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7992_wm_tm_24.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin
index d30bb8b..e9765d9 100755
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_dsp.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin
index 6952a7f..524024f 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin
index cdba71d..17a1475 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_rom_patch_233.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin
index e376241..3e04fe1 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin
index 1e54cfc..bf1ff57 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wa_233.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin
index 84f59d7..c26be71 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin
index 232949e..c685756 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_233.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin
index b9766ec..e275cbb 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm.bin
Binary files differ
diff --git a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin
index 074de8c..04a5951 100644
--- a/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin
+++ b/autobuild_mac80211_release/package/kernel/mt76/src/firmware/mt7996/mt7996_wm_tm_233.bin
Binary files differ