AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/09/11 06:32 flow patch-triage
0m Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "KMSANReasoning": "",
  "NeedsKMSAN": false,
  "Reasoning": "The patch modifies drivers/net/wireless/mediatek/mt76/mt7996/mac.c in the MediaTek MT7996 wireless driver (CONFIG_MT7996E). This driver is exclusively a PCIe device driver for physical MediaTek MT7996/MT7992/MT7990 hardware, which is not emulated in standard virtualized fuzzing environments (QEMU/GCE). Consequently, the modified code is structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

1/1 2026/09/11 06:32 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 585f096c486ffc803fd76840b11e8625d80c2946\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Fri Sep 11 06:32:02 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c\nindex 1cba381a78b82..e24dd530486c4 100644\n--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c\n+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c\n@@ -1057,7 +1057,7 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,\n \tif (!wcid)\n \t\twcid = \u0026dev-\u003emt76.global_wcid;\n \n-\tif ((is_8023 || ieee80211_is_data_qos(hdr-\u003eframe_control)) \u0026\u0026 sta-\u003emlo \u0026\u0026\n+\tif (sta \u0026\u0026 (is_8023 || ieee80211_is_data_qos(hdr-\u003eframe_control)) \u0026\u0026 sta-\u003emlo \u0026\u0026\n \t    likely(tx_info-\u003eskb-\u003eprotocol != cpu_to_be16(ETH_P_PAE))) {\n \t\tu8 tid = tx_info-\u003eskb-\u003epriority \u0026 IEEE80211_QOS_CTL_TID_MASK;\n \n@@ -1097,7 +1097,7 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,\n \t * compatible with 802.11 EAPOL frame, we do the translation by\n \t * software\n \t */\n-\tif (tx_info-\u003eskb-\u003eprotocol == cpu_to_be16(ETH_P_PAE) \u0026\u0026 sta-\u003emlo) {\n+\tif (sta \u0026\u0026 tx_info-\u003eskb-\u003eprotocol == cpu_to_be16(ETH_P_PAE) \u0026\u0026 sta-\u003emlo) {\n \t\tstruct ieee80211_hdr *hdr = (void *)tx_info-\u003eskb-\u003edata;\n \t\tstruct ieee80211_bss_conf *link_conf;\n \t\tstruct ieee80211_link_sta *link_sta;\n"
}

2/1 2026/09/11 06:32 agent patch-evaluator
0m Model:
core

Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/net/wireless/mediatek/mt76/mt7996/mac.c in the MediaTek MT7996 wireless driver (CONFIG_MT7996E). This driver is exclusively a PCIe device driver for physical MediaTek MT7996/MT7992/MT7990 hardware, which is not emulated in standard virtualized fuzzing environments (QEMU/GCE). Consequently, the modified code is structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

Instruction:
You are an expert Linux kernel maintainer and security engineer.
Your job is to review a provided patch series and evaluate whether it warrants fuzzing with syzkaller.

IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on internal assumptions. You must actively use your code access
tools to inspect the actual source code, callers, and surrounding context.

================================================================================
1. CORE TRIAGE PHILOSOPHY
================================================================================
The goal of patch fuzzing is to discover crashes, regressions, exposed latent bugs,
and newly triggered assertions introduced by the patch series.

- REACHABILITY IS THE PRIMARY GATE:
  Fuzzing can only discover bugs in code that can actually execute in standard virtualized
  environments (GCE or QEMU, utilizing software-emulated devices like USB gadgets, netdev, tun/tap).
  If the modified code is structurally unreachable (see Section 2), it MUST NOT be fuzzed,
  regardless of whether it adds assertions or complex logic.

- DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS:
  Patch authors routinely label changes as "cleanups", "refactorings", or state
  "No functional change intended". Do NOT take these claims at face value.
  Code refactorings that rearrange logic, introduce helper functions, or alter state management
  in core subsystems frequently introduce subtle semantic shifts or uncover latent kernel bugs.
  If reachable executable code is modified or refactored, it MUST be fuzzed.

- NEW OR MODIFIED ASSERTIONS IN REACHABLE CODE MUST BE FUZZED:
  When a patch introduces or modifies runtime checks or assertions (e.g., WARN_ON*, VM_WARN_ON*,
  BUG_ON*, lockdep_assert*) in reachable code paths, it enforces new or stricter invariants.
  Even if the author believes the invariant always holds, fuzzing is essential to verify whether
  an unusual sequence of operations can violate it.

================================================================================
2. WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)
================================================================================
Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:

- Non-kernel and non-executable changes:
  * Modifications to Documentation/, comments, or spelling fixes.
  * User-space directories, self-tests, samples, or scripts (e.g., tools/, samples/, scripts/, usr/)
    that do not affect the compiled kernel image (vmlinux) or kernel modules.
  * Purely decorative logging (e.g., message strings in pr_err, printk, dev_info) or tracepoints
    that do not alter control flow or data structures.
  * Build system or Kconfig changes that do not alter compiled C logic.
- Structurally unreachable hardware:
  * Vendor-specific PCIe switches, SmartNICs, or GPU drivers (e.g., mlxsw, pds_core, qed,
    ionic, amdgpu) requiring physical ASIC/PCIe cards not emulated in standard QEMU.
- Unreachable execution paths:
  * Driver teardown callbacks (.remove, .shutdown, pci_unregister_driver) executed only during
    physical PCI hot-unplug or manual sysfs driver unbinding.
  * Code paths exclusive to architectures other than the target architecture.

================================================================================
3. WHEN TO RETURN WorthFuzzing=true (POSITIVE CRITERIA)
================================================================================
Return WorthFuzzing=true whenever the patch touches reachable executable code, including:
- Core Subsystems:
  * Any logic modifications in memory management (mm/), synchronization/locking (kernel/locking/),
    BPF, scheduler, core networking, VFS, or syscall handling.
- Refactorings and Code Cleanups:
  * Any restructuring of reachable data structures, helper abstractions, or algorithm flows.
- Runtime Assertions and Defensive Checks:
  * Any introduction or alteration of assertions (WARN_ON*, VM_WARN_ON*, BUG_ON*, etc.) in reachable paths.
- Reachable Drivers and Protocols:
  * Drivers accessible via virtual buses (virtio, USB gadget, loopback, netlink, binder, sockets, etc.).

================================================================================
4. EXTRACTING FocusSymbols (PREVENTING DILUTION)
================================================================================
When WorthFuzzing=true, you must extract specific kernel functions into FocusSymbols to guide the fuzzer:

- AVOID UBIQUITOUS LIFECYCLE HOT-PATHS:
  Do NOT list generic, ubiquitous functions called by almost every program in the corpus
  (including, but not limited to: general memory allocators and deallocators, page fault
  and trap handlers, or core synchronization primitives; this is not an exhaustive list).
  Listing ubiquitous functions causes the fuzzer to classify thousands of unrelated tests as "focused",
  which severely dilutes fuzzing effort away from the actual changes.

- TARGET SPECIFIC FEATURE LOGIC AND ENTRYPOINTS:
  List functions that specifically implement the logic being added or altered, or direct API entrypoints
  for the subsystem feature under review.

- HANDLING STATIC INLINE FUNCTIONS IN HEADERS (.h):
  Compiler-inlined static functions (such as static inlines in mm/*.h or include/linux/*.h) lack
  distinct symbol addresses in vmlinux and cannot be targeted directly by symbol coverage filters.
  If the changes are primarily in static inline helpers, identify non-static, feature-specific caller
  functions in .c files that exercise them (avoiding ubiquitous lifecycle wrappers).

================================================================================
5. IDENTIFYING EnableConfigs
================================================================================
Identify any specific CONFIG_ options required to properly compile and reach the modified code:
- Inspect Kconfig files and #ifdef guards; do not make assumptions.
- Check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed.
- Strip any 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4").
Prefer calling several tools at the same time to save round-trips.


Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.

Prompt:
Target architecture: amd64

For your convenience, here is the diff of the changes:
commit 585f096c486ffc803fd76840b11e8625d80c2946
Author: syz-cluster <triage@syzkaller.com>
Date:   Fri Sep 11 06:32:02 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index 1cba381a78b82..e24dd530486c4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -1057,7 +1057,7 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 	if (!wcid)
 		wcid = &dev->mt76.global_wcid;
 
-	if ((is_8023 || ieee80211_is_data_qos(hdr->frame_control)) && sta->mlo &&
+	if (sta && (is_8023 || ieee80211_is_data_qos(hdr->frame_control)) && sta->mlo &&
 	    likely(tx_info->skb->protocol != cpu_to_be16(ETH_P_PAE))) {
 		u8 tid = tx_info->skb->priority & IEEE80211_QOS_CTL_TID_MASK;
 
@@ -1097,7 +1097,7 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 	 * compatible with 802.11 EAPOL frame, we do the translation by
 	 * software
 	 */
-	if (tx_info->skb->protocol == cpu_to_be16(ETH_P_PAE) && sta->mlo) {
+	if (sta && tx_info->skb->protocol == cpu_to_be16(ETH_P_PAE) && sta->mlo) {
 		struct ieee80211_hdr *hdr = (void *)tx_info->skb->data;
 		struct ieee80211_bss_conf *link_conf;
 		struct ieee80211_link_sta *link_sta;

3/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 3246
							output: 44
							thoughts: 311
						

Thoughts:
**Analyzing a Network Driver Patch**

Alright, let's dive into this patch. My immediate thought is to understand the context, so I see the changes are within `drivers/net/wireless/mediatek/mt76/mt7996/mac.c`. Okay, that's MediaTek's MT7996 wireless driver; got it. Now, the diff itself shows two instances of what looks like added `sta` checks before accessing `sta->mlo`. Specifically the lines are within the function `mt7996_tx_prepare_skb`. It's a fairly straightforward change; it adds a null pointer check for `sta` before dereferencing it in two `if` statements.

My immediate reaction is that this is likely a good thing - defensive programming against a potential null pointer dereference. The `sta` variable is likely a pointer to a station entry, and without this check, we could have a crash if it's somehow null in those code paths. The addition of the `sta` check makes this code much more robust, regardless of the `is_8023` or `ieee80211_is_data_qos` conditions, or the `ETH_P_PAE` protocol being met.

Now, to be thorough, I'd want to quickly confirm what the mt7996 driver is. Is this a PCIe device, a system-on-a-chip (SoC) integration, USB, or something else like mac80211_hwsim? I'll probably just glance at the surrounding files in `drivers/net/wireless/mediatek/mt76/mt7996/` and the Kconfig to confirm its architecture and understand any relevant dependencies or nuances. Then, I can make a judgement on how critical this is, but it's probably pretty important.



4/2 2026/09/11 06:32 tool grepper
0m Args:
{
  "Expression": "mt7996",
  "PathPrefix": "drivers/net/wireless/mediatek/mt76/mt7996/"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 6618 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-2-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:3:obj-$(CONFIG_MT7996E) += mt7996e.o\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-4-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:5:mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \\\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-6-\t     debugfs.o mmio.o\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-7-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:8:mt7996e-$(CONFIG_MT7996_NPU) += npu.o\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:9:mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c=12=MODULE_PARM_DESC(coredump_memdump, \"Optional ability to dump firmware memory\");\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-13-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:14:static const struct mt7996_mem_region mt7996_mem_regions[] = {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-15-\t{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-46-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:47:const struct mt7996_mem_region*\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:48:mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-49-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-52-\tcase MT7996_DEVICE_ID_2:\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:53:\t\t*num = ARRAY_SIZE(mt7996_mem_regions);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:54:\t\treturn \u0026mt7996_mem_regions[0];\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-55-\tdefault:\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-59-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:60:static int mt7996_coredump_get_mem_size(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-61-{\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:62:\tconst struct mt7996_mem_region *mem_region;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-63-\tsize_t size = 0;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-66-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:67:\tmem_region = mt7996_coredump_get_mem_layout(dev, \u0026num);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-68-\tif (!mem_region)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-76-\t/* reserve space for the headers */\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:77:\tsize += num * sizeof(struct mt7996_mem_hdr);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-78-\t/* make sure it is aligned 4 bytes for debug message print out */\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-83-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:84:struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-85-{\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:86:\tstruct mt7996_crash_data *crash_data = dev-\u003ecoredump.crash_data;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-87-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c=100=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:101:mt7996_coredump_fw_state(struct mt7996_dev *dev, struct mt7996_coredump *dump,\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-102-\t\t\t bool *exception)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c=117=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:118:mt7996_coredump_fw_stack(struct mt7996_dev *dev, struct mt7996_coredump *dump,\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-119-\t\t\t bool exception)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-161-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:162:static struct mt7996_coredump *mt7996_coredump_build(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-163-{\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:164:\tstruct mt7996_crash_data *crash_data = dev-\u003ecoredump.crash_data;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:165:\tstruct mt7996_coredump *dump;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:166:\tstruct mt7996_coredump_mem *dump_mem;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-167-\tsize_t len, sofar = 0, hdr_len = sizeof(*dump);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-186-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:187:\tdump = (struct mt7996_coredump *)(buf);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-188-\tdump-\u003elen = len;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-200-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:201:\tmt7996_coredump_fw_state(dev, dump, \u0026exception);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:202:\tmt7996_coredump_fw_stack(dev, dump, exception);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-203-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-204-\t/* gather memory content */\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:205:\tdump_mem = (struct mt7996_coredump_mem *)(buf + sofar);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-206-\tdump_mem-\u003elen = crash_data-\u003ememdump_buf_len;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-215-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:216:int mt7996_coredump_submit(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-217-{\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:218:\tstruct mt7996_coredump *dump;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-219-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:220:\tdump = mt7996_coredump_build(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-221-\tif (!dump) {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-230-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:231:int mt7996_coredump_register(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-232-{\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:233:\tstruct mt7996_crash_data *crash_data;\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-234-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-241-\tif (coredump_memdump) {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:242:\t\tcrash_data-\u003ememdump_buf_len = mt7996_coredump_get_mem_size(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-243-\t\tif (!crash_data-\u003ememdump_buf_len)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-256-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:257:void mt7996_coredump_unregister(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-258-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-6-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:7:#include \"mt7996.h\"\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-8-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:9:struct mt7996_coredump {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-10-\tchar magic[16];\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-39-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:40:struct mt7996_coredump_mem {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-41-\tu32 len;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-44-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:45:struct mt7996_mem_hdr {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-46-\tu32 start;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-50-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:51:struct mt7996_mem_region {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-52-\tu32 start;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-59-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:60:const struct mt7996_mem_region *\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:61:mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:62:struct mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:63:int mt7996_coredump_submit(struct mt7996_dev *dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:64:int mt7996_coredump_register(struct mt7996_dev *dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:65:void mt7996_coredump_unregister(struct mt7996_dev *dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-66-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-68-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:69:static inline const struct mt7996_mem_region *\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:70:mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-71-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-74-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:75:static inline int mt7996_coredump_submit(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-76-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h=80=static inline struct\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:81:mt7996_crash_data *mt7996_coredump_new(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-82-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-85-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:86:static inline int mt7996_coredump_register(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-87-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-90-\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h:91:static inline void mt7996_coredump_unregister(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.h-92-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-6-#include \u003clinux/relay.h\u003e\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:7:#include \"mt7996.h\"\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-8-#include \"eeprom.h\"\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=23=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:24:mt7996_implicit_txbf_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-25-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:26:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-27-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-32-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:33:\treturn mt7996_mcu_set_txbf(dev, BF_HW_EN_UPDATE);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-34-}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=36=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:37:mt7996_implicit_txbf_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-38-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:39:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-40-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-45-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:46:DEFINE_DEBUGFS_ATTRIBUTE(fops_implicit_txbf, mt7996_implicit_txbf_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:47:\t\t\t mt7996_implicit_txbf_set, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-48-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=50=static ssize_t\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:51:mt7996_sys_recovery_set(struct file *file, const char __user *user_buf,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-52-\t\t\tsize_t count, loff_t *ppos)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-53-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:54:\tstruct mt7996_dev *dev = file-\u003eprivate_data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-55-\tchar buf[16], *sep;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-91-\tcase UNI_CMD_SER_QUERY:\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:92:\t\tret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_QUERY, 0, band);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-93-\t\tbreak;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-100-\tcase UNI_CMD_SER_SET_RECOVER_L4_MDP:\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:101:\t\tret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_SET, BIT(val), band);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-102-\t\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-104-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:105:\t\tret = mt7996_mcu_set_ser(dev, UNI_CMD_SER_TRIGGER, val, band);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-106-\t\tbreak;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-111-\t\tdev-\u003erecovery.state |= MT_MCU_CMD_WDT_MASK;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:112:\t\tmt7996_reset(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-113-\t\tbreak;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-116-\tcase UNI_CMD_SER_SET_SYSTEM_ASSERT:\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:117:\t\tret = mt7996_mcu_trigger_assert(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-118-\t\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=128=static ssize_t\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:129:mt7996_sys_recovery_get(struct file *file, char __user *user_buf,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-130-\t\t\tsize_t count, loff_t *ppos)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-131-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:132:\tstruct mt7996_dev *dev = file-\u003eprivate_data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-133-\tchar *buff;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-214-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:215:static const struct file_operations mt7996_sys_recovery_ops = {\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:216:\t.write = mt7996_sys_recovery_set,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:217:\t.read = mt7996_sys_recovery_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-218-\t.open = simple_open,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=222=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:223:mt7996_radar_trigger(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-224-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-226-#define RADAR_BACKGROUND\t2\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:227:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:228:\tstruct mt7996_phy *phy = mt7996_band_phy(dev, NL80211_BAND_5GHZ);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-229-\tstruct cfg80211_chan_def *chandef;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-247-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:248:\trdd_idx = mt7996_get_rdd_idx(phy, val == RADAR_BACKGROUND);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-249-\tif (rdd_idx \u003c 0) {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-258-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:259:\treturn mt7996_mcu_rdd_cmd(dev, RDD_RADAR_EMULATE, rdd_idx, 0);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-260-}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=262=DEFINE_DEBUGFS_ATTRIBUTE(fops_radar_trigger, NULL,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:263:\t\t\t mt7996_radar_trigger, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-264-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=265=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:266:mt7996_rdd_monitor(struct seq_file *s, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-267-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:268:\tstruct mt7996_dev *dev = dev_get_drvdata(s-\u003eprivate);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-269-\tstruct cfg80211_chan_def *chandef = \u0026dev-\u003erdd2_chandef;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=312=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:313:mt7996_fw_debug_wm_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-314-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:315:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-316-\tenum {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-337-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:338:\tret = mt7996_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, val);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-339-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-350-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:351:\t\tret = mt7996_mcu_fw_dbg_ctrl(dev, debug, val);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-352-\t\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=359=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:360:mt7996_fw_debug_wm_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-361-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:362:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-363-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-368-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:369:DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_wm, mt7996_fw_debug_wm_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:370:\t\t\t mt7996_fw_debug_wm_set, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-371-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=372=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:373:mt7996_fw_debug_wa_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-374-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:375:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-376-\tint ret;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-379-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:380:\tret = mt7996_mcu_fw_log_2_host(dev, MCU_FW_LOG_WA, dev-\u003efw_debug_wa);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-381-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-383-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:384:\treturn mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_PDMA_RX,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-385-\t\t\t\t !!dev-\u003efw_debug_wa, 0);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=388=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:389:mt7996_fw_debug_wa_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-390-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:391:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-392-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-397-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:398:DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_wa, mt7996_fw_debug_wa_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:399:\t\t\t mt7996_fw_debug_wa_set, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-400-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=425=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:426:mt7996_fw_debug_bin_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-427-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-431-\t};\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:432:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-433-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-443-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:444:\treturn mt7996_fw_debug_wm_set(dev, dev-\u003efw_debug_wm);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-445-}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=447=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:448:mt7996_fw_debug_bin_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-449-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:450:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-451-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-456-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:457:DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_bin, mt7996_fw_debug_bin_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:458:\t\t\t mt7996_fw_debug_bin_set, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-459-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=460=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:461:mt7996_fw_util_wa_show(struct seq_file *file, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-462-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:463:\tstruct mt7996_dev *dev = file-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-464-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-465-\tif (dev-\u003efw_debug_wa)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:466:\t\treturn mt7996_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(QUERY),\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-467-\t\t\t\t\t MCU_WA_PARAM_CPU_UTIL, 0, 0);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-471-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:472:DEFINE_SHOW_ATTRIBUTE(mt7996_fw_util_wa);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-473-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=474=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:475:mt7996_ampdu_stat_read_phy(struct mt7996_phy *phy, struct seq_file *file)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-476-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:477:\tstruct mt7996_dev *dev = phy-\u003edev;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-478-\tint bound[15], range[8], i;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=504=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:505:mt7996_txbf_stat_read_phy(struct mt7996_phy *phy, struct seq_file *s)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-506-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=552=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:553:mt7996_tx_stats_show_phy(struct seq_file *file, struct mt7996_phy *phy)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-554-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-558-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:559:\tmt7996_mac_update_stats(phy);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:560:\tmt7996_ampdu_stat_read_phy(phy, file);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-561-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-568-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:569:\tmt7996_txbf_stat_read_phy(phy, file);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-570-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=584=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:585:mt7996_tx_stats_show(struct seq_file *file, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-586-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:587:\tstruct mt7996_dev *dev = file-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:588:\tstruct mt7996_phy *phy = \u0026dev-\u003ephy;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-589-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-591-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:592:\tmt7996_tx_stats_show_phy(file, phy);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:593:\tphy = mt7996_phy2(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-594-\tif (phy)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:595:\t\tmt7996_tx_stats_show_phy(file, phy);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:596:\tphy = mt7996_phy3(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-597-\tif (phy)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:598:\t\tmt7996_tx_stats_show_phy(file, phy);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-599-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-604-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:605:DEFINE_SHOW_ATTRIBUTE(mt7996_tx_stats);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-606-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=607=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:608:mt7996_hw_queue_read(struct seq_file *s, u32 size,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-609-\t\t     const struct hw_queue_map *map)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-610-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:611:\tstruct mt7996_phy *phy = s-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:612:\tstruct mt7996_dev *dev = phy-\u003edev;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-613-\tu32 i, val;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=638=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:639:mt7996_sta_hw_queue_read(void *data, struct ieee80211_sta *sta)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-640-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:641:\tstruct mt7996_sta *msta = (struct mt7996_sta *)sta-\u003edrv_priv;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:642:\tstruct mt7996_vif *mvif = msta-\u003evif;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:643:\tstruct mt7996_phy *phy = mt7996_vif_link_phy(\u0026mvif-\u003edeflink);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-644-\tstruct ieee80211_link_sta *link_sta;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-646-\tstruct ieee80211_vif *vif;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:647:\tstruct mt7996_dev *dev;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-648-\tunsigned int link_id;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-658-\tfor_each_sta_active_link(vif, sta, link_sta, link_id) {\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:659:\t\tstruct mt7996_sta_link *msta_link;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-660-\t\tstruct mt76_vif_link *mlink;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-666-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:667:\t\tmsta_link = mt7996_sta_link(msta, link_id);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-668-\t\tif (!msta_link)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=694=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:695:mt7996_hw_queues_show(struct seq_file *file, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-696-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:697:\tstruct mt7996_dev *dev = file-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:698:\tstruct mt7996_phy *phy = \u0026dev-\u003ephy;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-699-\tstatic const struct hw_queue_map ple_queue_map[] = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-747-\tseq_puts(file, \"PLE non-empty queue info:\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:748:\tmt7996_hw_queue_read(file, ARRAY_SIZE(ple_queue_map),\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-749-\t\t\t     \u0026ple_queue_map[0]);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-752-\tieee80211_iterate_stations_atomic(phy-\u003emt76-\u003ehw,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:753:\t\t\t\t\t  mt7996_sta_hw_queue_read, file);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:754:\tphy = mt7996_phy2(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-755-\tif (phy)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-756-\t\tieee80211_iterate_stations_atomic(phy-\u003emt76-\u003ehw,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:757:\t\t\t\t\t\t  mt7996_sta_hw_queue_read, file);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:758:\tphy = mt7996_phy3(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-759-\tif (phy)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-760-\t\tieee80211_iterate_stations_atomic(phy-\u003emt76-\u003ehw,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:761:\t\t\t\t\t\t  mt7996_sta_hw_queue_read, file);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-762-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-764-\tseq_puts(file, \"PSE non-empty queue info:\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:765:\tmt7996_hw_queue_read(file, ARRAY_SIZE(pse_queue_map),\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-766-\t\t\t     \u0026pse_queue_map[0]);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-770-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:771:DEFINE_SHOW_ATTRIBUTE(mt7996_hw_queues);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-772-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=773=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:774:mt7996_xmit_queues_show(struct seq_file *file, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-775-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:776:\tstruct mt7996_dev *dev = file-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:777:\tstruct mt7996_phy *phy;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-778-\tstruct {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-790-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:791:\tphy = mt7996_phy2(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-792-\tif (phy)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-794-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:795:\tphy = mt7996_phy3(dev);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-796-\tif (phy)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-813-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:814:DEFINE_SHOW_ATTRIBUTE(mt7996_xmit_queues);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-815-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=816=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:817:mt7996_twt_stats(struct seq_file *s, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-818-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:819:\tstruct mt7996_dev *dev = dev_get_drvdata(s-\u003eprivate);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:820:\tstruct mt7996_twt_flow *iter;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-821-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=845=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:846:mt7996_rf_regval_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-847-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:848:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-849-\tu32 regval;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-851-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:852:\tret = mt7996_mcu_rf_regval(dev, dev-\u003emt76.debugfs_reg, \u0026regval, false);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-853-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=861=static int\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:862:mt7996_rf_regval_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-863-{\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:864:\tstruct mt7996_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-865-\tu32 val32 = val;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-866-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:867:\treturn mt7996_mcu_rf_regval(dev, dev-\u003emt76.debugfs_reg, \u0026val32, true);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-868-}\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-869-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:870:DEFINE_DEBUGFS_ATTRIBUTE(fops_rf_regval, mt7996_rf_regval_get,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:871:\t\t\t mt7996_rf_regval_set, \"0x%08llx\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-872-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:873:int mt7996_init_debugfs(struct mt7996_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-874-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-879-\tdebugfs_create_file(\"hw-queues\", 0400, dir, dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:880:\t\t\t    \u0026mt7996_hw_queues_fops);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-881-\tdebugfs_create_file(\"xmit-queues\", 0400, dir, dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:882:\t\t\t    \u0026mt7996_xmit_queues_fops);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:883:\tdebugfs_create_file(\"tx_stats\", 0400, dir, dev, \u0026mt7996_tx_stats_fops);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-884-\tdebugfs_create_file(\"sys_recovery\", 0600, dir, dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:885:\t\t\t    \u0026mt7996_sys_recovery_ops);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-886-\tdebugfs_create_file(\"fw_debug_wm\", 0600, dir, dev, \u0026fops_fw_debug_wm);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-890-\tdebugfs_create_file(\"fw_util_wa\", 0400, dir, dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:891:\t\t\t    \u0026mt7996_fw_util_wa_fops);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-892-\tdebugfs_create_file(\"implicit_txbf\", 0600, dir, dev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-894-\tdebugfs_create_devm_seqfile(dev-\u003emt76.dev, \"twt_stats\", dir,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:895:\t\t\t\t    mt7996_twt_stats);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-896-\tdebugfs_create_file(\"rf_regval\", 0600, dir, dev, \u0026fops_rf_regval);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-901-\tdebugfs_create_devm_seqfile(dev-\u003emt76.dev, \"rdd_monitor\", dir,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:902:\t\t\t\t    mt7996_rdd_monitor);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-903-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c=909=static void\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:910:mt7996_debugfs_write_fwlog(struct mt7996_dev *dev, const void *hdr, int hdrlen,\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-911-\t\t\t   const void *data, int len)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-933-\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:934:void mt7996_debugfs_rx_fw_monitor(struct mt7996_dev *dev, const void *data, int len)\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-935-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-955-\thdr.len = *(__le16 *)data;\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c:956:\tmt7996_debugfs_write_fwlog(dev, \u0026hdr, sizeof(hdr), data, len);\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-957-}\ndrivers/net/wireless/mediatek/mt76/mt7996/debugfs.c-958-\n\n"
}

5/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 20825
							output: 37
							thoughts: 21
						

Thoughts:
Here's my take on those thoughts:

**Navigating the Mediatek Wireless Landscape**

Okay, so I need to dive into the Mediatek wireless driver code, specifically the `mt76` family. Let's see what the Kconfig file has to offer. This file is the key to understanding the configuration options and dependencies for these drivers. It's where the knobs are that I can turn to enable or disable features, modules, or support for specific hardware. I need to figure out which options are relevant to the current problem. This will help to identify the specific configuration parameters I might need to adjust, or even debug, to get this Mediatek wireless setup working as expected. This will be my starting point for a deeper dive.



6/2 2026/09/11 06:32 tool grepper
0m Args:
{
  "Expression": "MT7996",
  "PathPrefix": "drivers/net/wireless/mediatek/mt76"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 1582 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/mediatek/mt76/Makefile=50=obj-$(CONFIG_MT7921_COMMON) += mt7921/\ndrivers/net/wireless/mediatek/mt76/Makefile:51:obj-$(CONFIG_MT7996E) += mt7996/\ndrivers/net/wireless/mediatek/mt76/Makefile-52-obj-$(CONFIG_MT7925_COMMON) += mt7925/\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-1-# SPDX-License-Identifier: BSD-3-Clause-Clear\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:2:config MT7996E\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:3:\ttristate \"MediaTek MT7996 (PCIe) support\"\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-4-\tselect MT76_CONNAC_LIB\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-9-\thelp\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:10:\t  This adds support for MT7996-based PCIe wireless devices,\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-11-\t  which support concurrent tri-band operation at 6GHz, 5GHz,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-15-\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:16:config MT7996_NPU\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:17:\tbool \"MT7996 (PCIe) NPU support\"\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig:18:\tdepends on MT7996E\ndrivers/net/wireless/mediatek/mt76/mt7996/Kconfig-19-\tdepends on NET_AIROHA_NPU=y || MT76_CORE=NET_AIROHA_NPU\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-2-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:3:obj-$(CONFIG_MT7996E) += mt7996e.o\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-4-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile=5=mt7996e-y := pci.o init.o dma.o eeprom.o main.o mcu.o mac.o \\\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-7-\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile:8:mt7996e-$(CONFIG_MT7996_NPU) += npu.o\ndrivers/net/wireless/mediatek/mt76/mt7996/Makefile-9-mt7996e-$(CONFIG_DEV_COREDUMP) += coredump.o\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c=48=mt7996_coredump_get_mem_layout(struct mt7996_dev *dev, u32 *num)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-50-\tswitch (mt76_chip(\u0026dev-\u003emt76)) {\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:51:\tcase MT7996_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c:52:\tcase MT7996_DEVICE_ID_2:\ndrivers/net/wireless/mediatek/mt76/mt7996/coredump.c-53-\t\t*num = ARRAY_SIZE(mt7996_mem_regions);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c=46=static void mt7996_dma_config(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-59-\t/* rx queue */\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:60:\tRXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM, MT7996_RXQ_MCU_WM);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-61-\t/* for mt7990, RX ring 1 is for SDO instead */\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:62:\tRXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA, MT7996_RXQ_MCU_WA);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:63:\tRXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0, MT7996_RXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-64-\tif (mt7996_has_wa(dev))\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-65-\t\tRXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:66:\t\t\t   MT7996_RXQ_MCU_WA_MAIN);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-67-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-69-\tcase MT7992_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:70:\t\tRXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT, MT7996_RXQ_MCU_WA_EXT);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:71:\t\tRXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1, MT7996_RXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-72-\t\tbreak;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-73-\tcase MT7990_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:74:\t\tRXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1, MT7996_RXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-75-\t\tRXQ_CONFIG(MT_RXQ_TXFREE_BAND0, WFDMA0,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-80-\t\tbreak;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:81:\tcase MT7996_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-82-\tdefault:\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-83-\t\t/* mt7996 band2 */\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:84:\t\tRXQ_CONFIG(MT_RXQ_BAND2_WA, WFDMA0, MT_INT_RX_DONE_WA_TRI, MT7996_RXQ_MCU_WA_TRI);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:85:\t\tRXQ_CONFIG(MT_RXQ_BAND2, WFDMA0, MT_INT_RX_DONE_BAND2, MT7996_RXQ_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-86-\t\tbreak;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-91-\t\tRXQ_CONFIG(MT_RXQ_RRO_BAND0, WFDMA0, MT_INT_RX_DONE_RRO_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:92:\t\t\t   MT7996_RXQ_RRO_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-93-\t\tif (dev-\u003emt76.hwrro_mode == MT76_HWRRO_V3)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-95-\t\t\t\t   MT_INT_RX_DONE_MSDU_PG_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:96:\t\t\t\t   MT7996_RXQ_MSDU_PG_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-97-\t\tif (is_mt7996(\u0026dev-\u003emt76)) {\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-98-\t\t\tRXQ_CONFIG(MT_RXQ_TXFREE_BAND0, WFDMA0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:99:\t\t\t\t   MT_INT_RX_TXFREE_MAIN, MT7996_RXQ_TXFREE0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-100-\t\t\t/* band1 */\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-102-\t\t\t\t   MT_INT_RX_DONE_MSDU_PG_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:103:\t\t\t\t   MT7996_RXQ_MSDU_PG_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-104-\t\t\t/* band2 */\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-106-\t\t\t\t   MT_INT_RX_DONE_RRO_BAND2,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:107:\t\t\t\t   MT7996_RXQ_RRO_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-108-\t\t\tRXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND2, WFDMA0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-109-\t\t\t\t   MT_INT_RX_DONE_MSDU_PG_BAND2,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:110:\t\t\t\t   MT7996_RXQ_MSDU_PG_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-111-\t\t\tRXQ_CONFIG(MT_RXQ_TXFREE_BAND2, WFDMA0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:112:\t\t\t\t   MT_INT_RX_TXFREE_TRI, MT7996_RXQ_TXFREE2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-113-\t\t} else {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-115-\t\t\t\t   MT_INT_RX_DONE_RRO_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:116:\t\t\t\t   MT7996_RXQ_RRO_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-117-\t\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-121-\t\t\t\t   MT_INT_RX_DONE_RRO_IND,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:122:\t\t\t\t   MT7996_RXQ_RRO_IND);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-123-\t\telse\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-125-\t\t\t\t   MT_INT_RX_DONE_RRO_RXDMAD_C,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:126:\t\t\t\t   MT7996_RXQ_RRO_RXDMAD_C);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-127-\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-133-\t\t\t\tTXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND2,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:134:\t\t\t\t\t   MT7996_TXQ_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-135-\t\t\t\tTXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:136:\t\t\t\t\t   MT7996_TXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-137-\t\t\t\tTXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:138:\t\t\t\t\t   MT7996_TXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-139-\t\t\t} else {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-141-\t\t\t\tTXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:142:\t\t\t\t\t   MT7996_TXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-143-\t\t\t\tTXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:144:\t\t\t\t\t   MT7996_TXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-145-\t\t\t\tTXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND2,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:146:\t\t\t\t\t   MT7996_TXQ_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-147-\t\t\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-150-\t\t\tTXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:151:\t\t\t\t   MT7996_TXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-152-\t\t\tTXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:153:\t\t\t\t   MT7996_TXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-154-\t\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-158-\t\t\tTXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:159:\t\t\t\t   MT7996_TXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-160-\t\t\tTXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND2,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:161:\t\t\t\t   MT7996_TXQ_BAND2);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-162-\t\t} else {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-164-\t\t\tTXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:165:\t\t\t\t   MT7996_TXQ_BAND0);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-166-\t\t\tTXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:167:\t\t\t\t   MT7996_TXQ_BAND1);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-168-\t\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-171-\t/* mcu tx queue */\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:172:\tMCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL, MT7996_TXQ_FWDL);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:173:\tMCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM, MT7996_TXQ_MCU_WM);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-174-\tif (mt7996_has_wa(dev))\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-175-\t\tMCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:176:\t\t\t    MT7996_TXQ_MCU_WA);\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-177-}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c=521=int mt7996_dma_rro_init(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-535-\t\t\t\t       MT_RXQ_ID(MT_RXQ_RRO_RXDMAD_C),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:536:\t\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:537:\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-538-\t\t\t\t       MT_RXQ_RRO_AP_RING_BASE);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-561-\t\t\t       MT_RXQ_ID(MT_RXQ_RRO_IND),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:562:\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-563-\t\t\t       0, MT_RXQ_RRO_IND_RING_BASE);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-574-\tsize = is_mt7996(mdev) \u0026\u0026 mt76_npu_device_active(mdev)\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:575:\t       ? MT7996_NPU_RX_RING_SIZE / 4 : MT7996_RX_RING_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-576-\tret = mt76_queue_alloc(dev, \u0026mdev-\u003eq_rx[MT_RXQ_MSDU_PAGE_BAND0],\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-577-\t\t\t       MT_RXQ_ID(MT_RXQ_MSDU_PAGE_BAND0),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:578:\t\t\t       size, MT7996_RX_MSDU_PAGE_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-579-\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_MSDU_PAGE_BAND0));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-591-\t\tsize = is_mt7996(mdev) \u0026\u0026 mt76_npu_device_active(mdev)\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:592:\t\t       ? MT7996_NPU_RX_RING_SIZE / 2 : MT7996_RX_RING_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-593-\t\tret = mt76_queue_alloc(dev, \u0026mdev-\u003eq_rx[MT_RXQ_MSDU_PAGE_BAND1],\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-594-\t\t\t\t       MT_RXQ_ID(MT_RXQ_MSDU_PAGE_BAND1),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:595:\t\t\t\t       size, MT7996_RX_MSDU_PAGE_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-596-\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_MSDU_PAGE_BAND1));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-609-\t\tsize = is_mt7996(mdev) \u0026\u0026 mt76_npu_device_active(mdev)\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:610:\t\t       ? MT7996_NPU_RX_RING_SIZE : MT7996_RX_RING_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-611-\t\tret = mt76_queue_alloc(dev, \u0026mdev-\u003eq_rx[MT_RXQ_MSDU_PAGE_BAND2],\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-612-\t\t\t\t       MT_RXQ_ID(MT_RXQ_MSDU_PAGE_BAND2),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:613:\t\t\t\t       size, MT7996_RX_MSDU_PAGE_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-614-\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_MSDU_PAGE_BAND2));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c=664=int mt7996_dma_init(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-683-\t\tret = mt7996_init_tx_queues(\u0026dev-\u003ephy, MT_TXQ_ID(0),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:684:\t\t\t\t\t    MT7996_NPU_TX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-685-\t\t\t\t\t    MT_TXQ_RING_BASE(0) + hif1_ofs,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-689-\t\t\t\t\t    MT_TXQ_ID(dev-\u003emphy.band_idx),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:690:\t\t\t\t\t    MT7996_TX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-691-\t\t\t\t\t    MT_TXQ_RING_BASE(0), wed);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-697-\t\t\t\t  MT_MCUQ_ID(MT_MCUQ_WM),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:698:\t\t\t\t  MT7996_TX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-699-\t\t\t\t  MT_MCUQ_RING_BASE(MT_MCUQ_WM));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-706-\t\t\t\t\t  MT_MCUQ_ID(MT_MCUQ_WA),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:707:\t\t\t\t\t  MT7996_TX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-708-\t\t\t\t\t  MT_MCUQ_RING_BASE(MT_MCUQ_WA));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-715-\t\t\t\t  MT_MCUQ_ID(MT_MCUQ_FWDL),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:716:\t\t\t\t  MT7996_TX_FWDL_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-717-\t\t\t\t  MT_MCUQ_RING_BASE(MT_MCUQ_FWDL));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-723-\t\t\t       MT_RXQ_ID(MT_RXQ_MCU),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:724:\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:725:\t\t\t       MT7996_RX_MCU_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-726-\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_MCU));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-732-\t\t\t       MT_RXQ_ID(MT_RXQ_MCU_WA),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:733:\t\t\t       MT7996_RX_MCU_RING_SIZE_WA,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:734:\t\t\t       MT7996_RX_MCU_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-735-\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_MCU_WA));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-746-\t\t\t       MT_RXQ_ID(MT_RXQ_MAIN),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:747:\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-748-\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-766-\t\t\t\t       MT_RXQ_ID(MT_RXQ_MAIN_WA),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:767:\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-768-\t\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-778-\t\t\t\t       MT_RXQ_ID(MT_RXQ_TXFREE_BAND0),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:779:\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:780:\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-781-\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND0));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-792-\t\t\t\t       MT_RXQ_ID(MT_RXQ_TXFREE_BAND1),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:793:\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:794:\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-795-\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND1));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-804-\t\t\t\t       MT_RXQ_ID(MT_RXQ_BAND2),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:805:\t\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-806-\t\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-820-\t\t\t\t       MT_RXQ_ID(MT_RXQ_BAND2_WA),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:821:\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-822-\t\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-835-\t\t\t\t       MT_RXQ_ID(MT_RXQ_BAND1),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:836:\t\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-837-\t\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-852-\t\t\t\t\t       MT_RXQ_ID(MT_RXQ_BAND1_WA),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:853:\t\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-854-\t\t\t\t\t       MT_RX_BUF_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-868-\t\t\t\t       MT_RXQ_ID(MT_RXQ_RRO_BAND0),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:869:\t\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:870:\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-871-\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND0));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-883-\t\t\t\t\t       MT_RXQ_ID(MT_RXQ_RRO_BAND1),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:884:\t\t\t\t\t       MT7996_RX_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:885:\t\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-886-\t\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND1) + hif1_ofs);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-900-\t\t\t\t\t       MT_RXQ_ID(MT_RXQ_TXFREE_BAND0),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:901:\t\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:902:\t\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-903-\t\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND0));\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-919-\t\t\t       mt76_npu_device_active(\u0026dev-\u003emt76)\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:920:\t\t\t       ? MT7996_NPU_RX_RING_SIZE : MT7996_RX_RING_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-921-\t\t\tret = mt76_queue_alloc(dev, \u0026dev-\u003emt76.q_rx[MT_RXQ_RRO_BAND2],\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-922-\t\t\t\t\t       MT_RXQ_ID(MT_RXQ_RRO_BAND2),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:923:\t\t\t\t\t       size, MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-924-\t\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_RRO_BAND2) + hif1_ofs);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-934-\t\t\t\t\t       MT_RXQ_ID(MT_RXQ_TXFREE_BAND2),\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:935:\t\t\t\t\t       MT7996_RX_MCU_RING_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c:936:\t\t\t\t\t       MT7996_RX_BUF_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/dma.c-937-\t\t\t\t\t       MT_RXQ_RING_BASE(MT_RXQ_TXFREE_BAND2) + hif1_ofs);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=10=static int mt7996_check_eeprom(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-15-\tswitch (val) {\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:16:\tcase MT7996_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-17-\t\treturn is_mt7996(\u0026dev-\u003emt76) ? 0 : -EINVAL;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=27=static char *mt7996_eeprom_name(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-32-\t\tcase MT7992_VAR_TYPE_23:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:33:\t\t\tif (dev-\u003evar.fem == MT7996_FEM_INT)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-34-\t\t\t\treturn MT7992_EEPROM_DEFAULT_23_INT;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-39-\t\tdefault:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:40:\t\t\tif (dev-\u003evar.fem == MT7996_FEM_INT)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-41-\t\t\t\treturn MT7992_EEPROM_DEFAULT_INT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:42:\t\t\tif (dev-\u003evar.fem == MT7996_FEM_MIX)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-43-\t\t\t\treturn MT7992_EEPROM_DEFAULT_MIX;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-46-\tcase MT7990_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:47:\t\tif (dev-\u003evar.fem == MT7996_FEM_INT)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-48-\t\t\treturn MT7990_EEPROM_DEFAULT_INT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-49-\t\treturn MT7990_EEPROM_DEFAULT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:50:\tcase MT7996_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-51-\tdefault:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-52-\t\tswitch (dev-\u003evar.type) {\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:53:\t\tcase MT7996_VAR_TYPE_233:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:54:\t\t\tif (dev-\u003evar.fem == MT7996_FEM_INT)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:55:\t\t\t\treturn MT7996_EEPROM_DEFAULT_233_INT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:56:\t\t\treturn MT7996_EEPROM_DEFAULT_233;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:57:\t\tcase MT7996_VAR_TYPE_444:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-58-\t\tdefault:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:59:\t\t\tif (dev-\u003evar.fem == MT7996_FEM_INT)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:60:\t\t\t\treturn MT7996_EEPROM_DEFAULT_INT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:61:\t\t\treturn MT7996_EEPROM_DEFAULT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-62-\t\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=98=static bool mt7996_eeprom_variant_valid(struct mt7996_dev *dev, const u8 *def)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-108-\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:109:\tif (dev-\u003evar.fem == MT7996_FEM_EXT \u0026\u0026\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-110-\t    !(fem[0] == FEM_EXT \u0026\u0026 fem[1] == FEM_EXT))\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-111-\t\treturn false;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:112:\telse if (dev-\u003evar.fem == MT7996_FEM_INT \u0026\u0026\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-113-\t\t !(fem[0] == FEM_INT \u0026\u0026 fem[1] == FEM_INT))\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-114-\t\treturn false;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:115:\telse if (dev-\u003evar.fem == MT7996_FEM_MIX \u0026\u0026\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-116-\t\t !(fem[0] == FEM_INT \u0026\u0026 fem[1] == FEM_EXT))\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=137=mt7996_eeprom_check_or_use_default(struct mt7996_dev *dev, bool use_default)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-152-\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:153:\tif (fw-\u003esize \u003c MT7996_EEPROM_SIZE) {\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-154-\t\tdev_err(dev-\u003emt76.dev, \"Invalid default bin size\\n\");\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-162-\tdev_warn(dev-\u003emt76.dev, \"eeprom load fail, use default bin\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:163:\tmemcpy(eeprom, fw-\u003edata, MT7996_EEPROM_SIZE);\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-164-\tdev-\u003eeeprom_mode = EEPROM_MODE_DEFAULT_BIN;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=172=static int mt7996_eeprom_load(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-177-\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:178:\tret = mt76_eeprom_init(\u0026dev-\u003emt76, MT7996_EEPROM_SIZE);\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-179-\tif (ret \u003c 0)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-186-\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:187:\tmemset(dev-\u003emt76.eeprom.data, 0, MT7996_EEPROM_SIZE);\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-188-\tif (mt7996_has_ext_eeprom(dev)) {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-190-\t\tdev-\u003eeeprom_mode = EEPROM_MODE_EXT;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:191:\t\teeprom_blk_size = MT7996_EXT_EEPROM_BLOCK_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-192-\t} else {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-196-\t\tdev-\u003eeeprom_mode = EEPROM_MODE_EFUSE;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:197:\t\teeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-198-\t\tret = mt7996_mcu_get_efuse_free_block(dev, \u0026free_block_num);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-217-\t/* read eeprom data from fw */\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:218:\tblock_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-219-\tfor (i = 1; i \u003c block_num; i++) {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-222-\t\tif (i == block_num - 1)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:223:\t\t\tlen = MT7996_EEPROM_SIZE % eeprom_blk_size;\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-224-\t\tret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c=395=bool mt7996_eeprom_has_background_radar(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-397-\tswitch (mt76_chip(\u0026dev-\u003emt76)) {\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:398:\tcase MT7996_DEVICE_ID:\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c:399:\t\tif (dev-\u003evar.type == MT7996_VAR_TYPE_233)\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.c-400-\t\t\treturn false;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.h-5-\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.h:6:#ifndef __MT7996_EEPROM_H\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.h:7:#define __MT7996_EEPROM_H\ndrivers/net/wireless/mediatek/mt76/mt7996/eeprom.h-8-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=17=static const struct ieee80211_iface_limit if_limits_global = {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:18:\t.max = MT7996_MAX_INTERFACES * MT7996_MAX_RADIOS,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-19-\t.types = BIT(NL80211_IFTYPE_STATION)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=27=static const struct ieee80211_iface_combination if_comb_global = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-29-\t.n_limits = 1,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:30:\t.max_interfaces = MT7996_MAX_INTERFACES * MT7996_MAX_RADIOS,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:31:\t.num_different_channels = MT7996_MAX_RADIOS,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-32-\t.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=39=static const struct ieee80211_iface_combination if_comb_global_7992 = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-42-\t.max_interfaces = 32,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:43:\t.num_different_channels = MT7996_MAX_RADIOS - 1,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-44-\t.radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=51=static const struct ieee80211_iface_limit if_limits[] = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-58-\t}, {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:59:\t\t.max = MT7996_MAX_INTERFACES,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-60-\t\t.types = BIT(NL80211_IFTYPE_STATION)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=64=static const struct ieee80211_iface_combination if_comb = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-66-\t.n_limits = ARRAY_SIZE(if_limits),\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:67:\t.max_interfaces = MT7996_MAX_INTERFACES,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-68-\t.num_different_channels = 1,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=84=static const struct wiphy_iftype_ext_capab iftypes_ext_capa[] = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-92-\t\t\tFIELD_PREP_CONST(IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:93:\t\t\t\t\t MT7996_MAX_RADIOS - 1),\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-94-\t}, {\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-101-\t\t\tFIELD_PREP_CONST(IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:102:\t\t\t\t\t MT7996_MAX_RADIOS - 1),\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-103-\t},\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=132=static ssize_t mt7996_thermal_temp_store(struct device *dev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-147-\t/* add a safety margin ~10 */\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:148:\tif ((i - 1 == MT7996_CRIT_TEMP_IDX \u0026\u0026\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:149:\t     val \u003e phy-\u003ethrottle_temp[MT7996_MAX_TEMP_IDX] - 10) ||\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:150:\t    (i - 1 == MT7996_MAX_TEMP_IDX \u0026\u0026\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:151:\t     val - 10 \u003c phy-\u003ethrottle_temp[MT7996_CRIT_TEMP_IDX])) {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-152-\t\tdev_err(phy-\u003edev-\u003emt76.dev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=183=mt7996_thermal_get_max_throttle_state(struct thermal_cooling_device *cdev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-185-{\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:186:\t*state = MT7996_CDEV_THROTTLE_MAX;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-187-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=203=mt7996_thermal_set_cur_throttle_state(struct thermal_cooling_device *cdev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-206-\tstruct mt7996_phy *phy = cdev-\u003edevdata;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:207:\tu8 throttling = MT7996_THERMAL_THROTTLE_MAX - state;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-208-\tint ret;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-209-\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:210:\tif (state \u003e MT7996_CDEV_THROTTLE_MAX) {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-211-\t\tdev_err(phy-\u003edev-\u003emt76.dev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=250=static int mt7996_thermal_init(struct mt7996_phy *phy)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-274-\t/* initialize critical/maximum high temperature */\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:275:\tphy-\u003ethrottle_temp[MT7996_CRIT_TEMP_IDX] = MT7996_CRIT_TEMP;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:276:\tphy-\u003ethrottle_temp[MT7996_MAX_TEMP_IDX] = MT7996_MAX_TEMP;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-277-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=603=static void mt7996_mac_init_basic_rates(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-609-\t\t/* odd index for driver, even index for firmware */\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:610:\t\tu16 idx = MT7996_BASIC_RATES_TBL + 2 * i;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-611-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=690=static int mt7996_register_phy(struct mt7996_dev *dev, enum mt76_band_id band)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-753-\t\t\t   mt76_npu_device_active(\u0026dev-\u003emt76)\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:754:\t\t\t   ? MT7996_NPU_TX_RING_SIZE / 2 : MT7996_TX_RING_SIZE;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-755-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=833=static void mt7996_rro_hw_init_v3(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-843-\t\twed-\u003ewlan.ind_cmd.win_size =\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:844:\t\t\tffs(MT7996_RRO_WINDOW_MAX_LEN) - 6;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-845-\t\tif (is_mt7996(\u0026dev-\u003emt76))\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-846-\t\t\twed-\u003ewlan.ind_cmd.particular_sid =\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:847:\t\t\t\tMT7996_RRO_MAX_SESSION;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-848-\t\telse\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-851-\t\t\tdev-\u003ewed_rro.session.phy_addr;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:852:\t\twed-\u003ewlan.ind_cmd.se_group_nums = MT7996_RRO_ADDR_ELEM_LEN;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-853-\t\twed-\u003ewlan.ind_cmd.ack_sn_addr = MT_RRO_ACK_SN_CTRL;\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-869-\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:870:\tsession_id = is_mt7996(\u0026dev-\u003emt76) ? MT7996_RRO_MAX_SESSION : 1;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-871-\tmt76_wr(dev, MT_RRO_PARTICULAR_CFG1,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=957=static int mt7996_wed_rro_init(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-969-\t\t\tptr = dmam_alloc_coherent(dev-\u003emt76.dma_dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:970:\t\t\t\t\t\t  MT7996_RRO_BA_BITMAP_CR_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-971-\t\t\t\t\t\t  \u0026dev-\u003ewed_rro.ba_bitmap[i].phy_addr,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-983-\t\tptr = dmam_alloc_coherent(dev-\u003emt76.dma_dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:984:\t\t\t\tMT7996_RRO_WINDOW_MAX_SIZE * sizeof(*addr),\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-985-\t\t\t\t\u0026dev-\u003ewed_rro.addr_elem[i].phy_addr,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-991-\t\tmemset(dev-\u003ewed_rro.addr_elem[i].ptr, 0,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:992:\t\t       MT7996_RRO_WINDOW_MAX_SIZE * sizeof(*addr));\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-993-\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-994-\t\taddr = dev-\u003ewed_rro.addr_elem[i].ptr;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:995:\t\tfor (j = 0; j \u003c MT7996_RRO_WINDOW_MAX_SIZE; j++) {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-996-\t\t\taddr-\u003edata = cpu_to_le32(val);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1018-\t\tptr = dmam_alloc_coherent(dev-\u003emt76.dma_dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:1019:\t\t\t\t\t  MT7996_RRO_MSDU_PG_SIZE_PER_CR,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1020-\t\t\t\t\t  \u0026dev-\u003ewed_rro.msdu_pg[i].phy_addr,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1027-\t\tmemset(dev-\u003ewed_rro.msdu_pg[i].ptr, 0,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:1028:\t\t       MT7996_RRO_MSDU_PG_SIZE_PER_CR);\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1029-\t}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1052-\tptr = dmam_alloc_coherent(dev-\u003emt76.dma_dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:1053:\t\t\t\t  MT7996_RRO_WINDOW_MAX_LEN * sizeof(*addr),\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1054-\t\t\t\t  \u0026dev-\u003ewed_rro.session.phy_addr,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1060-\taddr = dev-\u003ewed_rro.session.ptr;\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:1061:\tfor (i = 0; i \u003c MT7996_RRO_WINDOW_MAX_LEN; i++) {\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1062-\t\taddr-\u003edata = cpu_to_le32(val);\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c=1075=static void mt7996_wed_rro_free(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1086-\t\tdmam_free_coherent(dev-\u003emt76.dma_dev,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c:1087:\t\t\t\t   MT7996_RRO_BA_BITMAP_CR_SIZE,\ndrivers/net/wireless/mediatek/mt76/mt7996/init.c-1088-\t\t\t\t   dev-\u003ewed_rro.ba_bitmap[i].ptr,\n--\n\n"
}

7/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 39220
							output: 36
							thoughts: 85
						

Thoughts:
**Investigating the MT7996 Driver**

Okay, so I'm looking into the `drivers/net/wireless/mediatek/mt76/mt7996/` directory. Right, this points to the PCIe driver for the MT7996E wireless device. Now, my immediate question is, beyond the PCIe connection, does this driver support any other interfaces? Specifically, I'm wondering if there's a USB implementation or any virtual interface possibilities baked in. It's not immediately obvious just from the driver's location.

So, the next logical step is to dive into the file structure of `drivers/net/wireless/mediatek/mt76/mt7996/` itself. I need to poke around and see what the code reveals. Time to see what we're actually working with. Let's see what we can dig up.



8/2 2026/09/11 06:32 tool codesearch-dir-index
0m Args:
{
  "Dir": "drivers/net/wireless/mediatek/mt76/mt7996"
}

Results:
{
  "Files": [
    "coredump.c",
    "coredump.h",
    "debugfs.c",
    "dma.c",
    "eeprom.c",
    "eeprom.h",
    "init.c",
    "mac.c",
    "mac.h",
    "main.c",
    "mcu.c",
    "mcu.h",
    "mmio.c",
    "mt7996.h",
    "npu.c",
    "pci.c",
    "regs.h"
  ],
  "Subdirs": null
}

9/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 39661
							output: 47
							thoughts: 20
						

Thoughts:
Here's my take on the process, framed as a thought process:

**Diving into PCI Support**

Okay, so I need to get a handle on the PCI support, specifically the bus types. My initial hunch is that `pci.c` and `Kconfig` are the places to start. `pci.c` is the obvious location for the core PCI driver code, so it'll probably define the actual bus type enumeration, structures, and potentially have some initialization logic related to bus type detection.

Then, `Kconfig`… that's where the configuration options live. I'll need to see what configuration symbols control which bus types are compiled in. Are there separate options for PCI, PCIe, PCI-X, or are they handled more generally? Are there fine-grained choices, or is it a more broad, inclusive approach? This also gives me insight into the default behavior for different architectures and how we enable/disable certain features related to bus support. I'll be looking for dependencies, default values, and any relationships between the bus type options. Time to dig in and confirm my assumptions, or discover where my initial understanding is incomplete!



10/2 2026/09/11 06:32 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/mediatek/mt76/mt7996/Kconfig",
  "FirstLine": 1,
  "LineCount": 30
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: BSD-3-Clause-Clear\n   2:\tconfig MT7996E\n   3:\t\ttristate \"MediaTek MT7996 (PCIe) support\"\n   4:\t\tselect MT76_CONNAC_LIB\n   5:\t\tselect WANT_DEV_COREDUMP\n   6:\t\tselect RELAY\n   7:\t\tdepends on MAC80211\n   8:\t\tdepends on PCI\n   9:\t\thelp\n  10:\t\t  This adds support for MT7996-based PCIe wireless devices,\n  11:\t\t  which support concurrent tri-band operation at 6GHz, 5GHz,\n  12:\t\t  and 2.4GHz IEEE 802.11be 4x4:4SS 4096-QAM, 320MHz channels.\n  13:\t\n  14:\t\t  To compile this driver as a module, choose M here.\n  15:\t\n  16:\tconfig MT7996_NPU\n  17:\t\tbool \"MT7996 (PCIe) NPU support\"\n  18:\t\tdepends on MT7996E\n  19:\t\tdepends on NET_AIROHA_NPU=y || MT76_CORE=NET_AIROHA_NPU\n  20:\t\tselect MT76_NPU\n  21:\t\tdefault n\n"
}

11/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 40324
							output: 50
							thoughts: 65
						

Thoughts:
**My Initial Assessment of MT7996E**

Alright, let's take a look at this `MT7996E`. Based on what I'm seeing, this is a PCIe-centric beast, purely driven by the `PCI` bus. The core of this seems to be centered around drivers like `pci.c` and `mmio.c`, which makes sense for PCIe interactions. 

Now, before I dig too deep, my initial thought is to quickly rule out any extraneous connections. I need to confirm this is solely focused on PCIe. So, let's just do a quick scan to see if there are any USB or virtual device hooks associated with `mt7996`. I'm especially interested in confirming whether its direct dependencies on PCI are exclusive of any others.

Okay, first stop, I'm going to start with a deep dive into `pci.c`. That's where I need to focus my attention. It's the lynchpin here, so let's see what's what.



12/2 2026/09/11 06:32 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/mediatek/mt76/mt7996/pci.c",
  "FirstLine": 1,
  "LineCount": 100
}

Results:
{
  "Contents": "   1:\t// SPDX-License-Identifier: BSD-3-Clause-Clear\n   2:\t/*\n   3:\t * Copyright (C) 2022 MediaTek Inc.\n   4:\t */\n   5:\t\n   6:\t#include \u003clinux/kernel.h\u003e\n   7:\t#include \u003clinux/module.h\u003e\n   8:\t#include \u003clinux/pci.h\u003e\n   9:\t\n  10:\t#include \"mt7996.h\"\n  11:\t#include \"mac.h\"\n  12:\t#include \"../trace.h\"\n  13:\t\n  14:\tstatic LIST_HEAD(hif_list);\n  15:\tstatic DEFINE_SPINLOCK(hif_lock);\n  16:\tstatic u32 hif_idx;\n  17:\t\n  18:\tstatic const struct pci_device_id mt7996_pci_device_table[] = {\n  19:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7996_DEVICE_ID) },\n  20:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7992_DEVICE_ID) },\n  21:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7990_DEVICE_ID) },\n  22:\t\t{ },\n  23:\t};\n  24:\t\n  25:\tstatic const struct pci_device_id mt7996_hif_device_table[] = {\n  26:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7996_DEVICE_ID_2) },\n  27:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7992_DEVICE_ID_2) },\n  28:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, MT7990_DEVICE_ID_2) },\n  29:\t\t{ },\n  30:\t};\n  31:\t\n  32:\tstatic struct mt7996_hif *mt7996_pci_get_hif2(u32 idx)\n  33:\t{\n  34:\t\tstruct mt7996_hif *hif;\n  35:\t\tu32 val;\n  36:\t\n  37:\t\tspin_lock_bh(\u0026hif_lock);\n  38:\t\n  39:\t\tlist_for_each_entry(hif, \u0026hif_list, list) {\n  40:\t\t\tval = readl(hif-\u003eregs + MT_PCIE_RECOG_ID);\n  41:\t\t\tval \u0026= MT_PCIE_RECOG_ID_MASK;\n  42:\t\t\tif (val != idx)\n  43:\t\t\t\tcontinue;\n  44:\t\n  45:\t\t\tget_device(hif-\u003edev);\n  46:\t\t\tgoto out;\n  47:\t\t}\n  48:\t\thif = NULL;\n  49:\t\n  50:\tout:\n  51:\t\tspin_unlock_bh(\u0026hif_lock);\n  52:\t\n  53:\t\treturn hif;\n  54:\t}\n  55:\t\n  56:\tstatic void mt7996_put_hif2(struct mt7996_hif *hif)\n  57:\t{\n  58:\t\tif (!hif)\n  59:\t\t\treturn;\n  60:\t\n  61:\t\tput_device(hif-\u003edev);\n  62:\t}\n  63:\t\n  64:\tstatic struct mt7996_hif *mt7996_pci_init_hif2(struct pci_dev *pdev)\n  65:\t{\n  66:\t\thif_idx++;\n  67:\t\n  68:\t\tif (!pci_get_device(PCI_VENDOR_ID_MEDIATEK, MT7996_DEVICE_ID_2, NULL) \u0026\u0026\n  69:\t\t    !pci_get_device(PCI_VENDOR_ID_MEDIATEK, MT7992_DEVICE_ID_2, NULL) \u0026\u0026\n  70:\t\t    !pci_get_device(PCI_VENDOR_ID_MEDIATEK, MT7990_DEVICE_ID_2, NULL))\n  71:\t\t\treturn NULL;\n  72:\t\n  73:\t\twritel(hif_idx | MT_PCIE_RECOG_ID_SEM,\n  74:\t\t       pcim_iomap_table(pdev)[0] + MT_PCIE_RECOG_ID);\n  75:\t\n  76:\t\treturn mt7996_pci_get_hif2(hif_idx);\n  77:\t}\n  78:\t\n  79:\tstatic int mt7996_pci_hif2_probe(struct pci_dev *pdev)\n  80:\t{\n  81:\t\tstruct mt7996_hif *hif;\n  82:\t\n  83:\t\thif = devm_kzalloc(\u0026pdev-\u003edev, sizeof(*hif), GFP_KERNEL);\n  84:\t\tif (!hif)\n  85:\t\t\treturn -ENOMEM;\n  86:\t\n  87:\t\thif-\u003edev = \u0026pdev-\u003edev;\n  88:\t\thif-\u003eregs = pcim_iomap_table(pdev)[0];\n  89:\t\thif-\u003eirq = pdev-\u003eirq;\n  90:\t\tpcie_bandwidth_available(pdev, NULL, \u0026hif-\u003espeed, \u0026hif-\u003ewidth);\n  91:\t\tspin_lock_bh(\u0026hif_lock);\n  92:\t\tlist_add(\u0026hif-\u003elist, \u0026hif_list);\n  93:\t\tspin_unlock_bh(\u0026hif_lock);\n  94:\t\tpci_set_drvdata(pdev, hif);\n  95:\t\n  96:\t\treturn 0;\n  97:\t}\n  98:\t\n  99:\tstatic int mt7996_pci_probe(struct pci_dev *pdev,\n 100:\t\t\t\t    const struct pci_device_id *id)\n"
}

13/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 42245
							output: 40
							thoughts: 235
						

Thoughts:
**My Assessment of MT7996 Emulation Feasibility**

Okay, let's break this down systematically. My initial thought is to make sure I understand the scope of the problem. Section 2 of the instructions highlights the potential for "structurally unreachable hardware," specifically vendor-specific components like PCIe switches, SmartNICs, or GPU drivers. I need to keep this in mind as I assess the MT7996.

Now, focusing on the core question: can I simulate or reach the MT7996, a MediaTek WiFi 7 PCIe NIC (which could be an MT7996, MT7992, or MT7990), within a QEMU environment, or through alternative methods like USB, mac80211_hwsim, or something similar?

First, I'll confirm the obvious: QEMU doesn't offer native emulation for MediaTek's MT76 series PCIe devices. So, standard QEMU emulation is out. This means I need to dig deeper. My next step involves checking if any virtual emulation, mock, or USB probe exists for the mt7996. I'm going to search for probe entry points. This will be the key to assessing whether the device can be loaded or probed without physical hardware present.



14/2 2026/09/11 06:32 tool grepper
0m Args:
{
  "Expression": "_driver",
  "PathPrefix": "drivers/net/wireless/mediatek/mt76/mt7996"
}

Results:
{
  "Output": "drivers/net/wireless/mediatek/mt76/mt7996/mcu.c=3228=int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3314-\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c:3315:static int mt7996_driver_own(struct mt7996_dev *dev, u8 band)\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3316-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c=3713=int mt7996_mcu_init_firmware(struct mt7996_dev *dev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3721-\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c:3722:\tret = mt7996_driver_own(dev, 0);\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3723-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3726-\tif (dev-\u003ehif2) {\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c:3727:\t\tret = mt7996_driver_own(dev, 1);\ndrivers/net/wireless/mediatek/mt76/mt7996/mcu.c-3728-\t\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c=832=struct mt7996_dev *mt7996_mmio_probe(struct device *pdev,\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-834-{\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:835:\tstatic const struct mt76_driver_ops drv_ops = {\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-836-\t\t/* txwi_size = txd size + txp size */\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c=885=static int __init mt7996_init(void)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-888-\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:889:\tret = pci_register_driver(\u0026mt7996_hif_driver);\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-890-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-892-\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:893:\tret = pci_register_driver(\u0026mt7996_pci_driver);\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-894-\tif (ret)\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:895:\t\tpci_unregister_driver(\u0026mt7996_hif_driver);\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-896-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c=900=static void __exit mt7996_exit(void)\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-901-{\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:902:\tpci_unregister_driver(\u0026mt7996_pci_driver);\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c:903:\tpci_unregister_driver(\u0026mt7996_hif_driver);\ndrivers/net/wireless/mediatek/mt76/mt7996/mmio.c-904-}\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/mt7996.h=669=extern const struct ieee80211_ops mt7996_ops;\ndrivers/net/wireless/mediatek/mt76/mt7996/mt7996.h:670:extern struct pci_driver mt7996_pci_driver;\ndrivers/net/wireless/mediatek/mt76/mt7996/mt7996.h:671:extern struct pci_driver mt7996_hif_driver;\ndrivers/net/wireless/mediatek/mt76/mt7996/mt7996.h-672-\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c=233=static void mt7996_pci_remove(struct pci_dev *pdev)\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c-243-\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c:244:struct pci_driver mt7996_hif_driver = {\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c-245-\t.name\t\t= KBUILD_MODNAME \"_hif\",\n--\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c-250-\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c:251:struct pci_driver mt7996_pci_driver = {\ndrivers/net/wireless/mediatek/mt76/mt7996/pci.c-252-\t.name\t\t= KBUILD_MODNAME,\n"
}

15/2 2026/09/11 06:32 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 44487
							output: 140
							thoughts: 436
						

Thoughts:
**My Assessment: MT7996 Driver - Not Fuzzable**

Okay, so I'm looking at this `mt7996` driver, and it's clear this is a PCIe-specific driver for MediaTek's MT7996, MT7992, and MT7990 hardware. It's registered via `pci_register_driver` which is standard for PCIe devices. The driver itself is not designed to function in emulated environments like QEMU or Google Compute Engine; it *requires* actual PCIe hardware.

Based on the documentation, this puts it firmly in the "structurally unreachable hardware" category. Section 2 clearly states that fuzzing should only target code that's *reachable* in standard virtualized environments. This includes things like vendor-specific switches, SmartNICs, GPU drivers – the MT7996 falls into this category: a wireless PCIe driver without emulated hardware support.

Therefore, since the MT7996 is unreachable during fuzzing, the modified code, specifically within `mt7996_tx_prepare_skb` in this case, would never be exercised.

So, let's confirm the relevant parameters. I am confident that `WorthFuzzing` should be set to `false`, `EnableConfigs` remains empty, and `FocusSymbols` also stays empty. The `Reasoning` will be a clear explanation: The MT7996 driver depends on a non-emulatable MediaTek PCIe hardware chip. The fuzzing code is structurally unreachable, making fuzzing pointless.

Alright, parameters confirmed. I'll initiate the set-results function now.



16/2 2026/09/11 06:32 tool set-results
0m Args:
{
  "EnableConfigs": [],
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/net/wireless/mediatek/mt76/mt7996/mac.c in the MediaTek MT7996 wireless driver (CONFIG_MT7996E). This driver is exclusively a PCIe device driver for physical MediaTek MT7996/MT7992/MT7990 hardware, which is not emulated in standard virtualized fuzzing environments (QEMU/GCE). Consequently, the modified code is structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/net/wireless/mediatek/mt76/mt7996/mac.c in the MediaTek MT7996 wireless driver (CONFIG_MT7996E). This driver is exclusively a PCIe device driver for physical MediaTek MT7996/MT7992/MT7990 hardware, which is not emulated in standard virtualized fuzzing environments (QEMU/GCE). Consequently, the modified code is structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

17/1 2026/09/11 06:32 action If
0m Args:
{
  "WorthFuzzing": false
}

Results:
null

LLM Calls Summary:
Total Calls Total Tokens Avg Tokens Total Duration (Seconds) Avg Duration (Seconds)
Tool Calls Summary:
Total Calls Total Duration (Seconds) Avg Duration (Seconds)