| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/05 10:39 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies mt7603_mac_init() in the MediaTek MT7603 wireless driver (CONFIG_MT7603E). This driver supports only vendor-specific PCIe devices (MT7603E) and SoC platforms (MT7628/MT7688), which are not emulated in standard virtualized fuzzing environments (QEMU/GCE) and do not support USB emulation. Therefore, the modified code is structurally unreachable.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/05 10:39 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 3ce44629562116a9ced5c6af8a11c2bc67a4a4a6\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Sat Sep 5 10:39:03 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/mediatek/mt76/mt7603/init.c b/drivers/net/wireless/mediatek/mt76/mt7603/init.c\nindex 10f2ec70c792b..218ec406d2a87 100644\n--- a/drivers/net/wireless/mediatek/mt76/mt7603/init.c\n+++ b/drivers/net/wireless/mediatek/mt76/mt7603/init.c\n@@ -230,6 +230,7 @@ mt7603_mac_init(struct mt7603_dev *dev)\n \n \teth_broadcast_addr(bc_addr);\n \tmt7603_wtbl_init(dev, MT7603_WTBL_RESERVED, -1, bc_addr);\n+\tmt76_wcid_init(\u0026dev-\u003eglobal_sta.wcid, 0);\n \tdev-\u003eglobal_sta.wcid.idx = MT7603_WTBL_RESERVED;\n \trcu_assign_pointer(dev-\u003emt76.wcid[MT7603_WTBL_RESERVED],\n \t\t\t \u0026dev-\u003eglobal_sta.wcid);\n"
} |
| 2/1 | 2026/09/05 10:39 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies mt7603_mac_init() in the MediaTek MT7603 wireless driver (CONFIG_MT7603E). This driver supports only vendor-specific PCIe devices (MT7603E) and SoC platforms (MT7628/MT7688), which are not emulated in standard virtualized fuzzing environments (QEMU/GCE) and do not support USB emulation. Therefore, the modified code is structurally unreachable.",
"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 3ce44629562116a9ced5c6af8a11c2bc67a4a4a6
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Sep 5 10:39:03 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/init.c b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
index 10f2ec70c792b..218ec406d2a87 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7603/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
@@ -230,6 +230,7 @@ mt7603_mac_init(struct mt7603_dev *dev)
eth_broadcast_addr(bc_addr);
mt7603_wtbl_init(dev, MT7603_WTBL_RESERVED, -1, bc_addr);
+ mt76_wcid_init(&dev->global_sta.wcid, 0);
dev->global_sta.wcid.idx = MT7603_WTBL_RESERVED;
rcu_assign_pointer(dev->mt76.wcid[MT7603_WTBL_RESERVED],
&dev->global_sta.wcid);
|
| 3/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 2983 output: 37 thoughts: 164 Thoughts: **Analyzing a Patch for Fuzzing Potential** Okay, so I've got this patch in front of me, and my immediate thought is to decide if it's worth the fuzzing effort. It looks like we're diving into the `drivers/net/wireless/mediatek/mt76/mt7603/init.c` file, specifically the `mt7603_mac_init` function. The key change is the addition of `mt76_wcid_init(&dev->global_sta.wcid, 0);`. That's a good starting point, but I need more context before I make any judgements. First, I need to understand what `mt7603` actually *is*. Is it a PCIe device? A System-on-Chip (SoC) component? USB? This drives the attack surface I have to consider. I'm going to quickly get a lay of the land here. I'll probably fire up `grep` (or possibly just `read-file` and a good search) and dig into the `drivers/net/wireless/mediatek/mt76/mt7603/` directory. I want to see how `mt7603` is probed, how it's used, and what data structures are involved. This will tell me if the new `wcid` initialization touches areas that have high fuzzing potential. I'm especially interested in things like hardware registers, command queues, and shared memory regions that could be accessed from user space. Knowing if there are any obvious drivers for the device will help me understand what's in the device's driver and how I can target it. |
| 4/2 | 2026/09/05 10:39 | tool | grepper |
0mArgs:{
"Expression": "mt7603",
"PathPrefix": "drivers/net/wireless/mediatek/mt76"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 1834 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/mediatek/mt76/Kconfig=45=source \"drivers/net/wireless/mediatek/mt76/mt76x2/Kconfig\"\ndrivers/net/wireless/mediatek/mt76/Kconfig:46:source \"drivers/net/wireless/mediatek/mt76/mt7603/Kconfig\"\ndrivers/net/wireless/mediatek/mt76/Kconfig-47-source \"drivers/net/wireless/mediatek/mt76/mt7615/Kconfig\"\n--\ndrivers/net/wireless/mediatek/mt76/Makefile=46=obj-$(CONFIG_MT76x2_COMMON) += mt76x2/\ndrivers/net/wireless/mediatek/mt76/Makefile:47:obj-$(CONFIG_MT7603E) += mt7603/\ndrivers/net/wireless/mediatek/mt76/Makefile-48-obj-$(CONFIG_MT7615_COMMON) += mt7615/\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/Makefile-1-# SPDX-License-Identifier: BSD-3-Clause-Clear\ndrivers/net/wireless/mediatek/mt76/mt7603/Makefile:2:obj-$(CONFIG_MT7603E) += mt7603e.o\ndrivers/net/wireless/mediatek/mt76/mt7603/Makefile-3-\ndrivers/net/wireless/mediatek/mt76/mt7603/Makefile:4:mt7603e-y := \\\ndrivers/net/wireless/mediatek/mt76/mt7603/Makefile-5-\tpci.o soc.o main.o init.o mcu.o \\\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-2-\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:3:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-4-\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c=5=struct beacon_bc_data {\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:6:\tstruct mt7603_dev *dev;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-7-\tstruct sk_buff_head q;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c=12=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:13:mt7603_mac_stuck_beacon_recovery(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-14-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c=29=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:30:mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-31-{\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:32:\tstruct mt7603_dev *dev = (struct mt7603_dev *)priv;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-33-\tstruct mt76_dev *mdev = \u0026dev-\u003emt76;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:34:\tstruct mt7603_vif *mvif = (struct mt7603_vif *)vif-\u003edrv_priv;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-35-\tstruct sk_buff *skb = NULL;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c=78=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:79:mt7603_add_buffered_bc(void *priv, u8 *mac, struct ieee80211_vif *vif)\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-80-{\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-81-\tstruct beacon_bc_data *data = priv;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:82:\tstruct mt7603_dev *dev = data-\u003edev;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:83:\tstruct mt7603_vif *mvif = (struct mt7603_vif *)vif-\u003edrv_priv;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-84-\tstruct ieee80211_tx_info *info;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-102-\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:103:void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-104-{\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:105:\tstruct mt7603_dev *dev = from_tasklet(dev, t, mt76.pre_tbtt_tasklet);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-106-\tstruct mt76_dev *mdev = \u0026dev-\u003emt76;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-127-\t\tdev-\u003ebeacon_check = 0;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:128:\tmt7603_mac_stuck_beacon_recovery(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-129-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-133-\t\tIEEE80211_IFACE_ITER_RESUME_ALL,\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:134:\t\tmt7603_update_beacon_iter, dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-135-\tmt76_queue_kick(dev, q);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-146-\t\t\tIEEE80211_IFACE_ITER_RESUME_ALL,\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:147:\t\t\tmt7603_add_buffered_bc, \u0026data);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-148-\t} while (nframes != skb_queue_len(\u0026data.q) \u0026\u0026\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-164-\t\tstruct ieee80211_vif *vif = info-\u003econtrol.vif;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:165:\t\tstruct mt7603_vif *mvif = (struct mt7603_vif *)vif-\u003edrv_priv;\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-166-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-181-\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:182:void mt7603_beacon_set_timer(struct mt7603_dev *dev, int idx, int intval)\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-183-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-193-\tif (!dev-\u003emt76.beacon_mask || (!intval \u0026\u0026 idx \u003c 0)) {\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:194:\t\tmt7603_irq_disable(dev, MT_INT_MAC_IRQ3);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-195-\t\tmt76_clear(dev, MT_ARB_SCR, MT_ARB_SCR_BCNQ_OPMODE_MASK);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-220-\t\t MT_WF_ARB_BCN_START_BSS0n(1)));\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c:221:\tmt7603_irq_enable(dev, MT_INT_MAC_IRQ3);\ndrivers/net/wireless/mediatek/mt76/mt7603/beacon.c-222-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-2-\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:3:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-4-#include \"../trace.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-5-\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:6:void mt7603_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q)\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-7-{\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:8:\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-9-\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:10:\tmt7603_irq_enable(dev, MT_INT_RX_DONE(q));\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-11-}\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-12-\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:13:irqreturn_t mt7603_irq_handler(int irq, void *dev_instance)\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-14-{\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:15:\tstruct mt7603_dev *dev = dev_instance;\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-16-\tu32 intr;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-39-\tif (intr \u0026 MT_INT_TX_DONE_ALL) {\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:40:\t\tmt7603_irq_disable(dev, MT_INT_TX_DONE_ALL);\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-41-\t\tnapi_schedule(\u0026dev-\u003emt76.tx_napi);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-45-\t\tdev-\u003erx_pse_check = 0;\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:46:\t\tmt7603_irq_disable(dev, MT_INT_RX_DONE(0));\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-47-\t\tnapi_schedule(\u0026dev-\u003emt76.napi[0]);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-51-\t\tdev-\u003erx_pse_check = 0;\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:52:\t\tmt7603_irq_disable(dev, MT_INT_RX_DONE(1));\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-53-\t\tnapi_schedule(\u0026dev-\u003emt76.napi[1]);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-58-\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c:59:u32 mt7603_reg_map(struct mt7603_dev *dev, u32 addr)\ndrivers/net/wireless/mediatek/mt76/mt7603/core.c-60-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-2-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:3:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-4-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c=5=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:6:mt7603_reset_read(struct seq_file *s, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-7-{\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:8:\tstruct mt7603_dev *dev = dev_get_drvdata(s-\u003eprivate);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-9-\tstatic const char * const reset_cause_str[] = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c=31=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:32:mt7603_radio_read(struct seq_file *s, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-33-{\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:34:\tstruct mt7603_dev *dev = dev_get_drvdata(s-\u003eprivate);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-35-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c=43=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:44:mt7603_edcca_set(void *data, u64 val)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-45-{\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:46:\tstruct mt7603_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-47-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-52-\t\t\t dev-\u003emt76.region == NL80211_DFS_ETSI;\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:53:\tmt7603_init_edcca(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-54-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c=60=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:61:mt7603_edcca_get(void *data, u64 *val)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-62-{\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:63:\tstruct mt7603_dev *dev = data;\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-64-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-68-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:69:DEFINE_DEBUGFS_ATTRIBUTE(fops_edcca, mt7603_edcca_get,\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:70:\t\t\t mt7603_edcca_set, \"%lld\\n\");\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-71-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c=72=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:73:mt7603_ampdu_stat_show(struct seq_file *file, void *data)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-74-{\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:75:\tstruct mt7603_dev *dev = file-\u003eprivate;\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-76-\tint bound[3], i, range;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-93-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:94:DEFINE_SHOW_ATTRIBUTE(mt7603_ampdu_stat);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-95-\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:96:void mt7603_init_debugfs(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-97-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-104-\tdebugfs_create_file(\"ampdu_stat\", 0400, dir, dev,\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:105:\t\t\t \u0026mt7603_ampdu_stat_fops);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-106-\tdebugfs_create_devm_seqfile(dev-\u003emt76.dev, \"xmit-queues\", dir,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-110-\tdebugfs_create_devm_seqfile(dev-\u003emt76.dev, \"reset\", dir,\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:111:\t\t\t\t mt7603_reset_read);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-112-\tdebugfs_create_devm_seqfile(dev-\u003emt76.dev, \"radio\", dir,\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c:113:\t\t\t\t mt7603_radio_read);\ndrivers/net/wireless/mediatek/mt76/mt7603/debugfs.c-114-\tdebugfs_create_u8(\"sensitivity_limit\", 0600, dir,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-2-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:3:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-4-#include \"mac.h\"\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c=14=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:15:mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-16-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-29-\tstruct ieee80211_sta *sta;\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:30:\tstruct mt7603_sta *msta;\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-31-\tstruct mt76_wcid *wcid;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-49-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:50:\tpriv = msta = container_of(wcid, struct mt7603_sta, wcid);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-51-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-94-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:95:void mt7603_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-96-\t\t\t struct sk_buff *skb, u32 *info)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-97-{\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:98:\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-99-\t__le32 *rxd = (__le32 *)skb-\u003edata;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-108-\t\telse\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:109:\t\t\tmt7603_rx_loopback_skb(dev, skb);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-110-\t\treturn;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-115-\t\tfor (rxd++; rxd + 5 \u003c= end; rxd += 5)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:116:\t\t\tmt7603_mac_add_txs(dev, rxd);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-117-\t\tdev_kfree_skb(skb);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-122-\tcase PKT_TYPE_NORMAL:\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:123:\t\tif (mt7603_mac_fill_rx(dev, skb) == 0) {\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-124-\t\t\tmt76_rx(\u0026dev-\u003emt76, q, skb);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c=134=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:135:mt7603_init_rx_queue(struct mt7603_dev *dev, struct mt76_queue *q,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-136-\t\t int idx, int n_desc, int bufsize)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-144-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:145:\tmt7603_irq_enable(dev, MT_INT_RX_DONE(idx));\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-146-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-149-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:150:static int mt7603_poll_tx(struct napi_struct *napi, int budget)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-151-{\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:152:\tstruct mt7603_dev *dev;\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-153-\tint i;\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-154-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:155:\tdev = container_of(napi, struct mt7603_dev, mt76.tx_napi);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-156-\tdev-\u003etx_dma_check = 0;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-162-\tif (napi_complete_done(napi, 0))\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:163:\t\tmt7603_irq_enable(dev, MT_INT_TX_DONE_ALL);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-164-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-168-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:169:\tmt7603_mac_sta_poll(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-170-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-175-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:176:int mt7603_dma_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-177-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-189-\tmt76_wr(dev, MT_WPDMA_RST_IDX, ~0);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:190:\tmt7603_pse_client_reset(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-191-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-219-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:220:\tmt7603_irq_enable(dev,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-221-\t\t\t MT_INT_TX_DONE(IEEE80211_AC_VO) |\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-229-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:230:\tret = mt7603_init_rx_queue(dev, \u0026dev-\u003emt76.q_rx[MT_RXQ_MCU], 1,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-231-\t\t\t\t MT7603_MCU_RX_RING_SIZE, MT_RX_BUF_SIZE);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-234-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:235:\tret = mt7603_init_rx_queue(dev, \u0026dev-\u003emt76.q_rx[MT_RXQ_MAIN], 0,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-236-\t\t\t\t MT7603_RX_RING_SIZE, MT_RX_BUF_SIZE);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-245-\tnetif_napi_add_tx(dev-\u003emt76.tx_napi_dev, \u0026dev-\u003emt76.tx_napi,\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:246:\t\t\t mt7603_poll_tx);\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-247-\tnapi_enable(\u0026dev-\u003emt76.tx_napi);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-251-\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c:252:void mt7603_dma_cleanup(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/dma.c-253-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-3-#include \u003clinux/of.h\u003e\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:4:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-5-#include \"eeprom.h\"\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c=7=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:8:mt7603_efuse_read(struct mt7603_dev *dev, u32 base, u16 addr, u8 *data)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-9-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c=40=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:41:mt7603_efuse_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-42-{\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:43:\tu32 base = mt7603_reg_map(dev, MT_EFUSE_BASE);\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-44-\tint len = MT7603_EEPROM_SIZE;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-57-\tfor (i = 0; i + 16 \u003c= len; i += 16) {\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:58:\t\tret = mt7603_efuse_read(dev, base, i, buf + i);\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-59-\t\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c=66=static bool\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:67:mt7603_has_cal_free_data(struct mt7603_dev *dev, u8 *efuse)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-68-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c=90=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:91:mt7603_apply_cal_free_data(struct mt7603_dev *dev, u8 *efuse)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-92-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-111-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:112:\tif (!mt7603_has_cal_free_data(dev, efuse))\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-113-\t\treturn;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c=125=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:126:mt7603_eeprom_load(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-127-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-133-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:134:\treturn mt7603_efuse_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-135-}\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-136-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:137:static int mt7603_check_eeprom(struct mt76_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-138-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-151-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:152:static inline bool is_mt7688(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-153-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-156-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:157:int mt7603_eeprom_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-158-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-161-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:162:\tret = mt7603_eeprom_load(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-163-\tif (ret \u003c 0)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-166-\tif (dev-\u003emt76.otp.data) {\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:167:\t\tif (mt7603_check_eeprom(\u0026dev-\u003emt76) == 0)\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c:168:\t\t\tmt7603_apply_cal_free_data(dev, dev-\u003emt76.otp.data);\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.c-169-\t\telse\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h-5-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h:6:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h-7-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h:8:enum mt7603_eeprom_field {\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h-9-\tMT_EE_CHIP_ID =\t\t\t\t0x000,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h-81-\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h:82:enum mt7603_eeprom_source {\ndrivers/net/wireless/mediatek/mt76/mt7603/eeprom.h-83-\tMT_EE_SRC_PROM,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-3-#include \u003clinux/etherdevice.h\u003e\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:4:#include \"mt7603.h\"\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-5-#include \"mac.h\"\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-7-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:8:const struct mt76_driver_ops mt7603_drv_ops = {\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-9-\t.txwi_size = MT_TXD_SIZE,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-11-\t.survey_flags = SURVEY_INFO_TIME_TX,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:12:\t.tx_prepare_skb = mt7603_tx_prepare_skb,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:13:\t.tx_complete_skb = mt7603_tx_complete_skb,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:14:\t.rx_skb = mt7603_queue_rx_skb,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:15:\t.rx_poll_complete = mt7603_rx_poll_complete,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:16:\t.sta_ps = mt7603_sta_ps,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:17:\t.sta_add = mt7603_sta_add,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:18:\t.sta_event = mt7603_sta_event,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:19:\t.sta_remove = mt7603_sta_remove,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:20:\t.update_survey = mt7603_update_channel,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:21:\t.set_channel = mt7603_set_channel,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-22-};\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=24=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:25:mt7603_set_tmac_template(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-26-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-33-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:34:\taddr = mt7603_reg_map(dev, MT_CLIENT_BASE_PHYS_ADDR);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-35-\taddr += MT_CLIENT_TMAC_INFO_TEMPLATE;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=40=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:41:mt7603_dma_sched_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-42-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-88-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:89:\tif (is_mt7603(dev))\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-90-\t\treserved_count = 0;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-93-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:94:\tif (is_mt7603(dev) \u0026\u0026 mt76xx_rev(dev) \u003e= MT7603_REV_E2) {\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-95-\t\tmt76_wr(dev, MT_GROUP_THRESH(0),\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=114=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:115:mt7603_phy_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-116-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=133=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:134:mt7603_mac_init(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-135-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-194-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:195:\tmt7603_set_tmac_template(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-196-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-197-\t/* Enable RX group to HIF */\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:198:\taddr = mt7603_reg_map(dev, MT_CLIENT_BASE_PHYS_ADDR);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-199-\tmt76_set(dev, addr + MT_CLIENT_RXINF, MT_CLIENT_RXINF_RXSH_GROUPS);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-228-\tfor (i = 0; i \u003c MT7603_WTBL_SIZE; i++)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:229:\t\tmt7603_wtbl_clear(dev, i);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-230-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-231-\teth_broadcast_addr(bc_addr);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:232:\tmt7603_wtbl_init(dev, MT7603_WTBL_RESERVED, -1, bc_addr);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-233-\tmt76_wcid_init(\u0026dev-\u003eglobal_sta.wcid, 0);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=278=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:279:mt7603_init_hardware(struct mt7603_dev *dev)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-280-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-284-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:285:\tret = mt7603_eeprom_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-286-\tif (ret \u003c 0)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-288-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:289:\tret = mt7603_dma_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-290-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-293-\tmt76_wr(dev, MT_WPDMA_GLO_CFG, 0x52000850);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:294:\tmt7603_mac_dma_start(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-295-\tdev-\u003erxfilter = mt76_rr(dev, MT_WF_RFCR);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-303-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:304:\tret = mt7603_mcu_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-305-\tif (ret)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-307-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:308:\tmt7603_dma_sched_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:309:\tmt7603_mcu_set_eeprom(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:310:\tmt7603_phy_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:311:\tmt7603_mac_init(dev);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-312-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=332=static const struct ieee80211_iface_combination if_comb[] = {\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-341-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:342:static void mt7603_led_set_config(struct mt76_phy *mphy, u8 delay_on,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-343-\t\t\t\t u8 delay_off)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-344-{\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:345:\tstruct mt7603_dev *dev = container_of(mphy-\u003edev, struct mt7603_dev,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-346-\t\t\t\t\t mt76);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-352-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:353:\taddr = mt7603_reg_map(dev, MT_LED_STATUS_0(mphy-\u003eleds.pin));\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-354-\tmt76_wr(dev, addr, val);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:355:\taddr = mt7603_reg_map(dev, MT_LED_STATUS_1(mphy-\u003eleds.pin));\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-356-\tmt76_wr(dev, addr, val);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-361-\t\tval |= MT_LED_CTRL_POLARITY(mphy-\u003eleds.pin);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:362:\taddr = mt7603_reg_map(dev, MT_LED_CTRL);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-363-\tmt76_wr(dev, addr, val);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-365-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:366:static int mt7603_led_set_blink(struct led_classdev *led_cdev,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-367-\t\t\t\tunsigned long *delay_on,\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-376-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:377:\tmt7603_led_set_config(mphy, delta_on, delta_off);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-378-\treturn 0;\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-380-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:381:static void mt7603_led_set_brightness(struct led_classdev *led_cdev,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-382-\t\t\t\t enum led_brightness brightness)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-387-\tif (!brightness)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:388:\t\tmt7603_led_set_config(mphy, 0, 0xff);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-389-\telse\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:390:\t\tmt7603_led_set_config(mphy, 0xff, 0);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-391-}\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-392-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:393:static u32 __mt7603_reg_addr(struct mt7603_dev *dev, u32 addr)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-394-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-397-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:398:\treturn mt7603_reg_map(dev, addr);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-399-}\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-400-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:401:static u32 mt7603_rr(struct mt76_dev *mdev, u32 offset)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-402-{\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:403:\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:404:\tu32 addr = __mt7603_reg_addr(dev, offset);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-405-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-408-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:409:static void mt7603_wr(struct mt76_dev *mdev, u32 offset, u32 val)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-410-{\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:411:\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:412:\tu32 addr = __mt7603_reg_addr(dev, offset);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-413-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-416-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:417:static u32 mt7603_rmw(struct mt76_dev *mdev, u32 offset, u32 mask, u32 val)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-418-{\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:419:\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:420:\tu32 addr = __mt7603_reg_addr(dev, offset);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-421-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=425=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:426:mt7603_regd_notifier(struct wiphy *wiphy,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-427-\t\t struct regulatory_request *request)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-429-\tstruct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:430:\tstruct mt7603_dev *dev = hw-\u003epriv;\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-431-\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=437=static int\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:438:mt7603_txpower_signed(int val)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-439-{\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c=452=static void\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:453:mt7603_init_txpower(struct mt7603_dev *dev,\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-454-\t\t struct ieee80211_supported_band *sband)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-465-\text_pa_pwr = eeprom[MT_EE_TX_POWER_TSSI_OFF];\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:466:\tif (ext_pa \u0026\u0026 is_mt7603(dev) \u0026\u0026 ext_pa_pwr != 0 \u0026\u0026 ext_pa_pwr != 0xff)\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-467-\t\ttarget_power = ext_pa_pwr \u0026 ~BIT(7);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-473-\tfor (i = 0; i \u003c 14; i++) {\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:474:\t\tcur_offset = mt7603_txpower_signed(rate_power[i]);\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-475-\t\tmax_offset = max(max_offset, cur_offset);\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c-495-\ndrivers/net/wireless/mediatek/mt76/mt7603/init.c:496:int mt7603_register_device(struct mt7603_dev *dev)\n\n"
} |
| 5/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 19902 output: 40 thoughts: 63 Thoughts: **Investigating MT7603 Bus Support and Device Probing** Okay, so I need to dig into how the MT7603 chipset handles different buses and, specifically, how the devices probe and initialize. I know this chipset fairly well, but a quick refresh is always good before I dive deeper. My first step is to focus on the kernel source code. I should probably start with the `drivers/net/wireless/mediatek/mt76/mt7603/` directory. I'll be looking closely at the `pci.c`, `soc.c` files, and the `Kconfig` files – they should give me a good overview of the supported bus types and the relevant device probing sequences. I'm expecting `pci.c` to handle the PCI-specific initialization, but I'll also be watching to see how the code is structured in the SOC case in `soc.c` and how the driver is configured in `Kconfig`. This will provide a good picture of the different hardware environments that the mt7603 driver supports and how the devices discover and configure themselves within those bus architectures. |
| 6/2 | 2026/09/05 10:39 | tool | grepper |
0mArgs:{
"Expression": "module_",
"PathPrefix": "drivers/net/wireless/mediatek/mt76/mt7603"
}Results: {
"Output": "drivers/net/wireless/mediatek/mt76/mt7603/main.c=809=static void __exit mt7603_exit(void)\n--\ndrivers/net/wireless/mediatek/mt76/mt7603/main.c-816-\ndrivers/net/wireless/mediatek/mt76/mt7603/main.c:817:module_init(mt7603_init);\ndrivers/net/wireless/mediatek/mt76/mt7603/main.c:818:module_exit(mt7603_exit);\n"
} |
| 7/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 20411 output: 50 thoughts: 48 Thoughts: Here's my summary, as if I were thinking these thoughts: **Analyzing the MT7603 Wireless Driver Implementation** Okay, so I need to dig into this MT7603 driver. I'm going to start by taking a look at `drivers/net/wireless/mediatek/mt76/mt7603/main.c` around line 800. That should give me a good entry point into the core functionality of the module, and hopefully, I can get a handle on what's going on with the MT7603 here. I'll need to correlate the register maps and firmware interface with the main loop and associated structures. After that, I'll need to check the PCI implementation in `pci.c`, and the SOC implementation in `soc.c` to see how it interacts with the system. This will depend on the machine it runs on, so I'll need to see how the code handles different configurations. I need to understand how these modules integrate and differ from each other. I'll need to identify potential bottlenecks or areas of inefficiency. Let's get cracking. |
| 8/2 | 2026/09/05 10:39 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/mediatek/mt76/mt7603/main.c",
"FirstLine": 790,
"LineCount": 40
}Results: {
"Contents": " 790:\tMODULE_DESCRIPTION(\"MediaTek MT7603E and MT76x8 wireless driver\");\n 791:\tMODULE_LICENSE(\"Dual BSD/GPL\");\n 792:\t\n 793:\tstatic int __init mt7603_init(void)\n 794:\t{\n 795:\t\tint ret;\n 796:\t\n 797:\t\tret = platform_driver_register(\u0026mt76_wmac_driver);\n 798:\t\tif (ret)\n 799:\t\t\treturn ret;\n 800:\t\n 801:\t#ifdef CONFIG_PCI\n 802:\t\tret = pci_register_driver(\u0026mt7603_pci_driver);\n 803:\t\tif (ret)\n 804:\t\t\tplatform_driver_unregister(\u0026mt76_wmac_driver);\n 805:\t#endif\n 806:\t\treturn ret;\n 807:\t}\n 808:\t\n 809:\tstatic void __exit mt7603_exit(void)\n 810:\t{\n 811:\t#ifdef CONFIG_PCI\n 812:\t\tpci_unregister_driver(\u0026mt7603_pci_driver);\n 813:\t#endif\n 814:\t\tplatform_driver_unregister(\u0026mt76_wmac_driver);\n 815:\t}\n 816:\t\n 817:\tmodule_init(mt7603_init);\n 818:\tmodule_exit(mt7603_exit);\n"
} |
| 9/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 21170 output: 49 thoughts: 21 Thoughts: Here's a summary of my immediate train of thought: **Checking Key Files for Context and Understanding** Alright, before I dive too deep into this, I need to get a lay of the land. My initial approach is to go straight to the usual suspects: `pci.c`, `soc.c`, and the `Kconfig` files. I'm assuming that's where I'll find a foundational understanding of the PCI interaction, the System-on-Chip (SoC) specifics that are relevant, and the overall configuration parameters governing this module or system. Grabbing the low-hanging fruit early helps to avoid wasted time. This approach allows me to quickly assess the core components and configuration options before getting bogged down in more intricate details or potential rabbit holes. I can then use this knowledge to establish a better mental model of the system. |
| 10/2 | 2026/09/05 10:39 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/mediatek/mt76/mt7603/pci.c",
"FirstLine": 1,
"LineCount": 80
}Results: {
"Contents": " 1:\t// SPDX-License-Identifier: BSD-3-Clause-Clear\n 2:\t\n 3:\t#include \u003clinux/kernel.h\u003e\n 4:\t#include \u003clinux/module.h\u003e\n 5:\t#include \u003clinux/pci.h\u003e\n 6:\t\n 7:\t#include \"mt7603.h\"\n 8:\t\n 9:\tstatic const struct pci_device_id mt76pci_device_table[] = {\n 10:\t\t{ PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7603) },\n 11:\t\t{ },\n 12:\t};\n 13:\t\n 14:\tstatic int\n 15:\tmt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)\n 16:\t{\n 17:\t\tstruct mt7603_dev *dev;\n 18:\t\tstruct mt76_dev *mdev;\n 19:\t\tint ret;\n 20:\t\n 21:\t\tret = pcim_enable_device(pdev);\n 22:\t\tif (ret)\n 23:\t\t\treturn ret;\n 24:\t\n 25:\t\tret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));\n 26:\t\tif (ret)\n 27:\t\t\treturn ret;\n 28:\t\n 29:\t\tpci_set_master(pdev);\n 30:\t\n 31:\t\tret = dma_set_mask(\u0026pdev-\u003edev, DMA_BIT_MASK(32));\n 32:\t\tif (ret)\n 33:\t\t\treturn ret;\n 34:\t\n 35:\t\tmdev = mt76_alloc_device(\u0026pdev-\u003edev, sizeof(*dev), \u0026mt7603_ops,\n 36:\t\t\t\t\t \u0026mt7603_drv_ops);\n 37:\t\tif (!mdev)\n 38:\t\t\treturn -ENOMEM;\n 39:\t\n 40:\t\tdev = container_of(mdev, struct mt7603_dev, mt76);\n 41:\t\tmt76_mmio_init(mdev, pcim_iomap_table(pdev)[0]);\n 42:\t\n 43:\t\tmdev-\u003erev = (mt76_rr(dev, MT_HW_CHIPID) \u003c\u003c 16) |\n 44:\t\t\t (mt76_rr(dev, MT_HW_REV) \u0026 0xff);\n 45:\t\tdev_info(mdev-\u003edev, \"ASIC revision: %04x\\n\", mdev-\u003erev);\n 46:\t\n 47:\t\tmt76_wr(dev, MT_INT_MASK_CSR, 0);\n 48:\t\n 49:\t\tret = devm_request_irq(mdev-\u003edev, pdev-\u003eirq, mt7603_irq_handler,\n 50:\t\t\t\t IRQF_SHARED, KBUILD_MODNAME, dev);\n 51:\t\tif (ret)\n 52:\t\t\tgoto error;\n 53:\t\n 54:\t\tret = mt7603_register_device(dev);\n 55:\t\tif (ret)\n 56:\t\t\tgoto error;\n 57:\t\n 58:\t\treturn 0;\n 59:\terror:\n 60:\t\tmt76_free_device(\u0026dev-\u003emt76);\n 61:\t\n 62:\t\treturn ret;\n 63:\t}\n 64:\t\n 65:\tstatic void\n 66:\tmt76pci_remove(struct pci_dev *pdev)\n 67:\t{\n 68:\t\tstruct mt76_dev *mdev = pci_get_drvdata(pdev);\n 69:\t\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\n 70:\t\n 71:\t\tmt7603_unregister_device(dev);\n 72:\t}\n 73:\t\n 74:\tMODULE_DEVICE_TABLE(pci, mt76pci_device_table);\n 75:\tMODULE_FIRMWARE(MT7603_FIRMWARE_E1);\n 76:\tMODULE_FIRMWARE(MT7603_FIRMWARE_E2);\n 77:\t\n 78:\tstruct pci_driver mt7603_pci_driver = {\n 79:\t\t.name\t\t= KBUILD_MODNAME,\n 80:\t\t.id_table\t= mt76pci_device_table,\n"
} |
| 11/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 22625 output: 48 thoughts: 10 Thoughts: Here's my take on those thoughts, tailored for an expert audience: **Diving into `soc.c`** Alright, so we're at a point where we need to be thorough. I've been focusing on [implied preceding context the user would understand based on "Let's also check soc.c"], but a crucial next step, considering the scope of what we're tackling, is to give `soc.c` a close look. It's probably the linchpin in [implied relationship to the user's field and context] that touches on [specific aspect the user would understand based on "soc.c"]. I want to make sure we haven't overlooked any integration points or dependencies with what we've already examined. This is about ensuring complete coverage. There might be some subtle interactions here that, if missed, would lead to real headaches down the line. I am thinking particularly about [specific potential issues the user may consider, based on "soc.c" within the context] and making sure the implications of [likely area of code] have been thoroughly vetted. |
| 12/2 | 2026/09/05 10:39 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/mediatek/mt76/mt7603/soc.c",
"FirstLine": 1,
"LineCount": 80
}Results: {
"Contents": " 1:\t// SPDX-License-Identifier: BSD-3-Clause-Clear\n 2:\t\n 3:\t#include \u003clinux/kernel.h\u003e\n 4:\t#include \u003clinux/module.h\u003e\n 5:\t#include \u003clinux/platform_device.h\u003e\n 6:\t\n 7:\t#include \"mt7603.h\"\n 8:\t\n 9:\tstatic int\n 10:\tmt76_wmac_probe(struct platform_device *pdev)\n 11:\t{\n 12:\t\tstruct mt7603_dev *dev;\n 13:\t\tvoid __iomem *mem_base;\n 14:\t\tstruct mt76_dev *mdev;\n 15:\t\tint irq;\n 16:\t\tint ret;\n 17:\t\n 18:\t\tirq = platform_get_irq(pdev, 0);\n 19:\t\tif (irq \u003c 0)\n 20:\t\t\treturn irq;\n 21:\t\n 22:\t\tmem_base = devm_platform_ioremap_resource(pdev, 0);\n 23:\t\tif (IS_ERR(mem_base))\n 24:\t\t\treturn PTR_ERR(mem_base);\n 25:\t\n 26:\t\tmdev = mt76_alloc_device(\u0026pdev-\u003edev, sizeof(*dev), \u0026mt7603_ops,\n 27:\t\t\t\t\t \u0026mt7603_drv_ops);\n 28:\t\tif (!mdev)\n 29:\t\t\treturn -ENOMEM;\n 30:\t\n 31:\t\tdev = container_of(mdev, struct mt7603_dev, mt76);\n 32:\t\tmt76_mmio_init(mdev, mem_base);\n 33:\t\n 34:\t\tmdev-\u003erev = (mt76_rr(dev, MT_HW_CHIPID) \u003c\u003c 16) |\n 35:\t\t\t (mt76_rr(dev, MT_HW_REV) \u0026 0xff);\n 36:\t\tdev_info(mdev-\u003edev, \"ASIC revision: %04x\\n\", mdev-\u003erev);\n 37:\t\n 38:\t\tmt76_wr(dev, MT_INT_MASK_CSR, 0);\n 39:\t\n 40:\t\tret = devm_request_irq(mdev-\u003edev, irq, mt7603_irq_handler,\n 41:\t\t\t\t IRQF_SHARED, KBUILD_MODNAME, dev);\n 42:\t\tif (ret)\n 43:\t\t\tgoto error;\n 44:\t\n 45:\t\tret = mt7603_register_device(dev);\n 46:\t\tif (ret)\n 47:\t\t\tgoto error;\n 48:\t\n 49:\t\treturn 0;\n 50:\terror:\n 51:\t\tmt76_free_device(mdev);\n 52:\t\treturn ret;\n 53:\t}\n 54:\t\n 55:\tstatic void mt76_wmac_remove(struct platform_device *pdev)\n 56:\t{\n 57:\t\tstruct mt76_dev *mdev = platform_get_drvdata(pdev);\n 58:\t\tstruct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);\n 59:\t\n 60:\t\tmt7603_unregister_device(dev);\n 61:\t}\n 62:\t\n 63:\tstatic const struct of_device_id of_wmac_match[] = {\n 64:\t\t{ .compatible = \"mediatek,mt7628-wmac\" },\n 65:\t\t{},\n 66:\t};\n 67:\t\n 68:\tMODULE_DEVICE_TABLE(of, of_wmac_match);\n 69:\tMODULE_FIRMWARE(MT7628_FIRMWARE_E1);\n 70:\tMODULE_FIRMWARE(MT7628_FIRMWARE_E2);\n 71:\t\n 72:\tstruct platform_driver mt76_wmac_driver = {\n 73:\t\t.probe\t\t= mt76_wmac_probe,\n 74:\t\t.remove\t\t= mt76_wmac_remove,\n 75:\t\t.driver = {\n 76:\t\t\t.name = \"mt76_wmac\",\n 77:\t\t\t.of_match_table = of_wmac_match,\n 78:\t\t},\n 79:\t};\n"
} |
| 13/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 24091 output: 47 thoughts: 63 Thoughts: **Investigating MT7603's Connectivity Options** Okay, so I need to figure out how the MT7603 chipset handles network interfaces. My initial hunch is to check its USB capabilities, see if it has any virtual or emulated interfaces, or if it's strictly a physical PCIe or SoC device. The best place to start, given my experience, is likely the driver's Kconfig file. I'll take a look at `drivers/net/wireless/mediatek/mt76/mt7603/Kconfig` to get a better understanding of the device's configuration options and build-time settings, which should immediately clarify if there's any USB support declared or hinted at within the driver. This is usually the quickest way to get a high-level overview. |
| 14/2 | 2026/09/05 10:39 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/mediatek/mt76/mt7603/Kconfig",
"FirstLine": 1,
"LineCount": 40
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: BSD-3-Clause-Clear\n 2:\tconfig MT7603E\n 3:\t\ttristate \"MediaTek MT7603E (PCIe) and MT76x8 WLAN support\"\n 4:\t\tselect MT76_CORE\n 5:\t\tdepends on MAC80211\n 6:\t\tdepends on PCI\n 7:\t\thelp\n 8:\t\t This adds support for MT7603E PCIe wireless devices and the WLAN core\n 9:\t\t on MT7628/MT7688 SoC devices. This family supports IEEE 802.11n 2x2\n 10:\t\t to 300Mbps PHY rate\n 11:\t\n 12:\t\t To compile this driver as a module, choose M here.\n"
} |
| 15/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 24583 output: 32 thoughts: 484 Thoughts: **My Assessment of the WorthFuzzing Criteria for MT7603** Okay, let's see. My initial thought was to quickly check if QEMU offered some level of USB or other emulation for mt7603 or just the base mt76 modules, maybe even hwsim, to give me a leg up on fuzzing. But, hold on a second...mt7603 is specifically for the MediaTek MT7603E PCIe device and the MT7628/MT7688 SoCs. I was expecting maybe a standard QEMU or GCE emulation of the MediaTek MT7603 PCIe or SoC device, but no dice. QEMU doesn't seem to touch that hardware at all. Alright, time to carefully review section 2 of the instructions. The "WorthFuzzing=false" criteria are pretty clear: non-executable changes, unreachable hardware (specifically vendor-specific PCIe switches, SmartNICs, GPU drivers requiring physical hardware not emulated in standard QEMU) and unreachable execution paths (driver teardown, PCI hot-unplug). Let's break this down. Is the MT7603 a vendor-specific PCIe/SoC wireless driver? Yes! The MT7603E is specifically MediaTek hardware. Does standard QEMU emulate the MT7603? Nope. We already established that. And I should probably do a quick sanity check to see if there is any USB interface support within mt7603 before I make a final assessment. I'll need to check the codebase to confirm if any USB interface support exists. So, given that MT7603 is a vendor-specific PCIe/SoC driver and not emulated by QEMU, according to the instructions, this seems like a solid case for "WorthFuzzing=false" since it's structurally unreachable in my virtualized environment. |
| 16/2 | 2026/09/05 10:39 | tool | grepper |
0mError:no matches Args: {
"Expression": "mt7603.*usb",
"PathPrefix": "drivers/net/wireless"
}Results: {
"error": "no matches"
} |
| 17/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 25521 output: 36 thoughts: 28 Thoughts: Here's my take on the thought process, as if it were my own: **Navigating the MT7603 Wireless Driver** Okay, time to dive in. My immediate thought is to get a lay of the land within the `drivers/net/wireless/mediatek/mt76/mt7603/` directory. I want to build a mental map of the core files and structures associated with the MT7603 wireless driver. Before I start debugging or trying to understand a specific function, I need that overview. I'm going to quickly scan the index to get a sense of the key modules, header files, and implementation files present. This preliminary step is crucial; it helps me avoid getting lost in the weeds and allows me to contextualize any subsequent investigations or bug reports I might be working with. I need to refresh my familiarity with this particular driver, and a directory index scan is the fastest way to achieve that. |
| 18/2 | 2026/09/05 10:39 | tool | codesearch-dir-index |
0mArgs:{
"Dir": "drivers/net/wireless/mediatek/mt76/mt7603"
}Results: {
"Files": [
"beacon.c",
"core.c",
"debugfs.c",
"dma.c",
"eeprom.c",
"eeprom.h",
"init.c",
"mac.c",
"mac.h",
"main.c",
"mcu.c",
"mcu.h",
"mt7603.h",
"pci.c",
"regs.h",
"soc.c"
],
"Subdirs": null
} |
| 19/2 | 2026/09/05 10:39 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 25904 output: 134 thoughts: 519 Thoughts: **My Assessment of the MT7603 Driver's Fuzzing Suitability** Okay, let's break this down. My goal is to determine if the `mt7603` driver, specifically the `mt7603_mac_init` function, is a viable target for fuzzing. I need to figure out where this function is called and whether the conditions for executing that call are met in typical virtualized environments. First, I traced the call chain for `mt7603_mac_init`. It's a static function within `init.c` and is called by `mt7603_init_hardware`. That in turn is called from either `mt7603_register_device` or `mt7603_reset_work`. Now, `mt7603_register_device` gets called during the PCI probe (`mt76pci_probe`) or from a platform probe (`mt76_wmac_probe`). Here's the problem: neither the MT7603E PCIe nor the MT7628 SoC WMAC hardware is emulated in standard environments like QEMU or Google Compute Engine. These are specialized hardware components, and standard fuzzing setups are *not* going to be able to probe, much less execute, this driver. Software-emulated devices, like USB gadgets, are out because there's no USB driver for `mt7603`. It's PCI and SoC-specific. This clearly falls under the category of "Structurally unreachable hardware." Specifically, this is similar to vendor-specific PCIe switches, SmartNICs, or GPU drivers. They require physical hardware or hardware-specific PCIe cards that QEMU doesn't emulate. Let's summarize this concisely: the patch modifies `drivers/net/wireless/mediatek/mt76/mt7603/init.c`, specifically `mt7603_mac_init`. The driver is for the MT7603E PCIe and MT7628/MT7688 SoC. It is unreachable in a standard QEMU or GCE VM without the actual physical hardware. Therefore, it's not worth fuzzing. The `WorthFuzzing` flag should be set to `false`. There are no specific symbols of interest (`FocusSymbols` is empty), and no special configurations (`EnableConfigs` is empty) needed. |
| 20/2 | 2026/09/05 10:39 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies mt7603_mac_init() in the MediaTek MT7603 wireless driver (CONFIG_MT7603E). This driver supports only vendor-specific PCIe devices (MT7603E) and SoC platforms (MT7628/MT7688), which are not emulated in standard virtualized fuzzing environments (QEMU/GCE) and do not support USB emulation. Therefore, the modified code is structurally unreachable.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies mt7603_mac_init() in the MediaTek MT7603 wireless driver (CONFIG_MT7603E). This driver supports only vendor-specific PCIe devices (MT7603E) and SoC platforms (MT7628/MT7688), which are not emulated in standard virtualized fuzzing environments (QEMU/GCE) and do not support USB emulation. Therefore, the modified code is structurally unreachable.",
"WorthFuzzing": false
} |
| 21/1 | 2026/09/05 10:39 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|