| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/07 07:47 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the Qualcomm Atheros WCN3660/3680 driver (drivers/net/wireless/ath/wcn36xx/smd.c). This driver is a platform driver tied to Qualcomm Snapdragon SoC hardware (requiring Qualcomm WCNSS, SMD/RPMSG, SMEM, and Device Tree mmio resources), which is structurally unreachable and not emulated in standard virtualized QEMU environments on the target architecture (amd64).",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/07 07:47 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit d03b9a1c5e67f8c6d2ee8d1c5bfd9dc3fa38c642\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Mon Sep 7 07:47:37 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c\nindex c0b477345832b..d8597bc112f0d 100644\n--- a/drivers/net/wireless/ath/wcn36xx/smd.c\n+++ b/drivers/net/wireless/ath/wcn36xx/smd.c\n@@ -1066,21 +1066,26 @@ static int wcn36xx_smd_process_ptt_msg_rsp(void *buf, size_t len,\n \t\t\t\t\t void **p_ptt_rsp_msg)\n {\n \tstruct wcn36xx_hal_process_ptt_msg_rsp_msg *rsp;\n+\tsize_t ptt_msg_len;\n \tint ret;\n \n \tret = wcn36xx_smd_rsp_status_check(buf, len);\n \tif (ret)\n \t\treturn ret;\n \n+\tif (len \u003c sizeof(*rsp))\n+\t\treturn -EIO;\n+\n \trsp = buf;\n+\tptt_msg_len = len - sizeof(*rsp);\n \n-\twcn36xx_dbg(WCN36XX_DBG_HAL, \"process ptt msg responded with length %d\\n\",\n-\t\t rsp-\u003eheader.len);\n+\twcn36xx_dbg(WCN36XX_DBG_HAL, \"process ptt msg responded with length %zu\\n\",\n+\t\t ptt_msg_len);\n \twcn36xx_dbg_dump(WCN36XX_DBG_HAL_DUMP, \"HAL_PTT_MSG_RSP:\", rsp-\u003eptt_msg,\n-\t\t\t rsp-\u003eheader.len - sizeof(rsp-\u003eptt_msg_resp_status));\n+\t\t\t ptt_msg_len);\n \n-\tif (rsp-\u003eheader.len \u003e 0) {\n-\t\t*p_ptt_rsp_msg = kmemdup(rsp-\u003eptt_msg, rsp-\u003eheader.len,\n+\tif (ptt_msg_len \u003e 0) {\n+\t\t*p_ptt_rsp_msg = kmemdup(rsp-\u003eptt_msg, ptt_msg_len,\n \t\t\t\t\t GFP_ATOMIC);\n \t\tif (!*p_ptt_rsp_msg)\n \t\t\treturn -ENOMEM;\n"
} |
| 2/1 | 2026/09/07 07:47 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Atheros WCN3660/3680 driver (drivers/net/wireless/ath/wcn36xx/smd.c). This driver is a platform driver tied to Qualcomm Snapdragon SoC hardware (requiring Qualcomm WCNSS, SMD/RPMSG, SMEM, and Device Tree mmio resources), which is structurally unreachable and not emulated in standard virtualized QEMU environments on the target architecture (amd64).",
"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 d03b9a1c5e67f8c6d2ee8d1c5bfd9dc3fa38c642
Author: syz-cluster <triage@syzkaller.com>
Date: Mon Sep 7 07:47:37 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index c0b477345832b..d8597bc112f0d 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -1066,21 +1066,26 @@ static int wcn36xx_smd_process_ptt_msg_rsp(void *buf, size_t len,
void **p_ptt_rsp_msg)
{
struct wcn36xx_hal_process_ptt_msg_rsp_msg *rsp;
+ size_t ptt_msg_len;
int ret;
ret = wcn36xx_smd_rsp_status_check(buf, len);
if (ret)
return ret;
+ if (len < sizeof(*rsp))
+ return -EIO;
+
rsp = buf;
+ ptt_msg_len = len - sizeof(*rsp);
- wcn36xx_dbg(WCN36XX_DBG_HAL, "process ptt msg responded with length %d\n",
- rsp->header.len);
+ wcn36xx_dbg(WCN36XX_DBG_HAL, "process ptt msg responded with length %zu\n",
+ ptt_msg_len);
wcn36xx_dbg_dump(WCN36XX_DBG_HAL_DUMP, "HAL_PTT_MSG_RSP:", rsp->ptt_msg,
- rsp->header.len - sizeof(rsp->ptt_msg_resp_status));
+ ptt_msg_len);
- if (rsp->header.len > 0) {
- *p_ptt_rsp_msg = kmemdup(rsp->ptt_msg, rsp->header.len,
+ if (ptt_msg_len > 0) {
+ *p_ptt_rsp_msg = kmemdup(rsp->ptt_msg, ptt_msg_len,
GFP_ATOMIC);
if (!*p_ptt_rsp_msg)
return -ENOMEM;
|
| 3/2 | 2026/09/07 07:47 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 3257 output: 38 thoughts: 129 Thoughts: **Assessing the Fuzzing Potential of This Patch** Okay, let's dive in. My initial thought is to figure out if this patch is even *worth* fuzzing. We need to be strategic with our time. First, I'm zeroing in on that modified file: `drivers/net/wireless/ath/wcn36xx/smd.c`. Right away, the "wcn36xx" part of the path is ringing some bells. I need to understand what this thing *is*. Is this a Qualcomm SMD driver? Is it SoC-specific hardware? Does it rely on something like Qualcomm's rpmsg or SMD for communication? That's going to be key. Can this be reasonably emulated, or am I going to be stuck needing special hardware to even poke at it with QEMU? To get a better understanding of the wcn36xx driver, I'll need to check the relevant `Kconfig` files and source files in the linux kernel. That should give me the context I need to assess the feasibility of fuzzing it. |
| 4/2 | 2026/09/07 07:47 | tool | grepper |
0mArgs:{
"Expression": "wcn36xx",
"PathPrefix": "drivers/net/wireless/ath/wcn36xx"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 5370 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/ath/wcn36xx/Kconfig=2=config WCN36XX\n--\ndrivers/net/wireless/ath/wcn36xx/Kconfig-10-\ndrivers/net/wireless/ath/wcn36xx/Kconfig:11:\t If you choose to build a module, it'll be called wcn36xx.\ndrivers/net/wireless/ath/wcn36xx/Kconfig-12-\n--\ndrivers/net/wireless/ath/wcn36xx/Makefile-1-# SPDX-License-Identifier: ISC\ndrivers/net/wireless/ath/wcn36xx/Makefile:2:obj-$(CONFIG_WCN36XX) := wcn36xx.o\ndrivers/net/wireless/ath/wcn36xx/Makefile:3:wcn36xx-y += main.o \\\ndrivers/net/wireless/ath/wcn36xx/Makefile-4- dxe.o \\\n--\ndrivers/net/wireless/ath/wcn36xx/Makefile-10-\ndrivers/net/wireless/ath/wcn36xx/Makefile:11:wcn36xx-$(CONFIG_NL80211_TESTMODE) += testmode.o\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-20-#include \u003clinux/uaccess.h\u003e\ndrivers/net/wireless/ath/wcn36xx/debug.c:21:#include \"wcn36xx.h\"\ndrivers/net/wireless/ath/wcn36xx/debug.c-22-#include \"debug.h\"\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c=28=static ssize_t read_file_bool_bmps(struct file *file, char __user *user_buf,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-30-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:31:\tstruct wcn36xx *wcn = file-\u003eprivate_data;\ndrivers/net/wireless/ath/wcn36xx/debug.c:32:\tstruct wcn36xx_vif *vif_priv = NULL;\ndrivers/net/wireless/ath/wcn36xx/debug.c-33-\tstruct ieee80211_vif *vif = NULL;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-36-\tlist_for_each_entry(vif_priv, \u0026wcn-\u003evif_list, list) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:37:\t\t\tvif = wcn36xx_priv_to_vif(vif_priv);\ndrivers/net/wireless/ath/wcn36xx/debug.c-38-\t\t\tif (NL80211_IFTYPE_STATION == vif-\u003etype) {\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c=52=static ssize_t write_file_bool_bmps(struct file *file,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-55-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:56:\tstruct wcn36xx *wcn = file-\u003eprivate_data;\ndrivers/net/wireless/ath/wcn36xx/debug.c:57:\tstruct wcn36xx_vif *vif_priv = NULL;\ndrivers/net/wireless/ath/wcn36xx/debug.c-58-\tstruct ieee80211_vif *vif = NULL;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-71-\t\tlist_for_each_entry(vif_priv, \u0026wcn-\u003evif_list, list) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:72:\t\t\tvif = wcn36xx_priv_to_vif(vif_priv);\ndrivers/net/wireless/ath/wcn36xx/debug.c-73-\t\t\tif (NL80211_IFTYPE_STATION == vif-\u003etype) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:74:\t\t\t\twcn36xx_enable_keep_alive_null_packet(wcn, vif);\ndrivers/net/wireless/ath/wcn36xx/debug.c:75:\t\t\t\twcn36xx_pmc_enter_bmps_state(wcn, vif);\ndrivers/net/wireless/ath/wcn36xx/debug.c-76-\t\t\t}\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-82-\t\tlist_for_each_entry(vif_priv, \u0026wcn-\u003evif_list, list) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:83:\t\t\tvif = wcn36xx_priv_to_vif(vif_priv);\ndrivers/net/wireless/ath/wcn36xx/debug.c-84-\t\t\tif (NL80211_IFTYPE_STATION == vif-\u003etype)\ndrivers/net/wireless/ath/wcn36xx/debug.c:85:\t\t\t\twcn36xx_pmc_exit_bmps_state(wcn, vif);\ndrivers/net/wireless/ath/wcn36xx/debug.c-86-\t\t}\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-92-\ndrivers/net/wireless/ath/wcn36xx/debug.c:93:static const struct file_operations fops_wcn36xx_bmps = {\ndrivers/net/wireless/ath/wcn36xx/debug.c-94-\t.open = simple_open,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c=99=static ssize_t write_file_dump(struct file *file,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-102-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:103:\tstruct wcn36xx *wcn = file-\u003eprivate_data;\ndrivers/net/wireless/ath/wcn36xx/debug.c-104-\tchar buf[255], *tmp;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-127-\ndrivers/net/wireless/ath/wcn36xx/debug.c:128:\twcn36xx_info(\"DUMP args is %d %d %d %d %d\\n\", arg[0], arg[1], arg[2],\ndrivers/net/wireless/ath/wcn36xx/debug.c-129-\t\t arg[3], arg[4]);\ndrivers/net/wireless/ath/wcn36xx/debug.c:130:\twcn36xx_smd_dump_cmd_req(wcn, arg[0], arg[1], arg[2], arg[3], arg[4]);\ndrivers/net/wireless/ath/wcn36xx/debug.c-131-\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-134-\ndrivers/net/wireless/ath/wcn36xx/debug.c:135:static const struct file_operations fops_wcn36xx_dump = {\ndrivers/net/wireless/ath/wcn36xx/debug.c-136-\t.open = simple_open,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c=140=static ssize_t read_file_firmware_feature_caps(struct file *file,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-143-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:144:\tstruct wcn36xx *wcn = file-\u003eprivate_data;\ndrivers/net/wireless/ath/wcn36xx/debug.c-145-\tsize_t len = 0, buf_len = 2048;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-155-\tfor (i = 0; i \u003c MAX_FEATURE_SUPPORTED; i++) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:156:\t\tif (wcn36xx_firmware_get_feat_caps(wcn-\u003efw_feat_caps, i)) {\ndrivers/net/wireless/ath/wcn36xx/debug.c-157-\t\t\tlen += scnprintf(buf + len, buf_len - len, \"%s\\n\",\ndrivers/net/wireless/ath/wcn36xx/debug.c:158:\t\t\t\t\t wcn36xx_firmware_get_cap_name(i));\ndrivers/net/wireless/ath/wcn36xx/debug.c-159-\t\t}\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-170-\ndrivers/net/wireless/ath/wcn36xx/debug.c:171:static const struct file_operations fops_wcn36xx_firmware_feat_caps = {\ndrivers/net/wireless/ath/wcn36xx/debug.c-172-\t.open = simple_open,\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-183-\t\tif (IS_ERR(d)) {\t\t\t\t\\\ndrivers/net/wireless/ath/wcn36xx/debug.c:184:\t\t\twcn36xx_warn(\"Create the debugfs entry failed\");\\\ndrivers/net/wireless/ath/wcn36xx/debug.c-185-\t\t\tdfs-\u003efile_##name.dentry = NULL;\t\t\\\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-189-\ndrivers/net/wireless/ath/wcn36xx/debug.c:190:void wcn36xx_debugfs_init(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/debug.c-191-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:192:\tstruct wcn36xx_dfs_entry *dfs = \u0026wcn-\u003edfs;\ndrivers/net/wireless/ath/wcn36xx/debug.c-193-\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-196-\tif (IS_ERR(dfs-\u003erootdir)) {\ndrivers/net/wireless/ath/wcn36xx/debug.c:197:\t\twcn36xx_warn(\"Create the debugfs failed\\n\");\ndrivers/net/wireless/ath/wcn36xx/debug.c-198-\t\tdfs-\u003erootdir = NULL;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.c-200-\ndrivers/net/wireless/ath/wcn36xx/debug.c:201:\tADD_FILE(bmps_switcher, 0600, \u0026fops_wcn36xx_bmps, wcn);\ndrivers/net/wireless/ath/wcn36xx/debug.c:202:\tADD_FILE(dump, 0200, \u0026fops_wcn36xx_dump, wcn);\ndrivers/net/wireless/ath/wcn36xx/debug.c-203-\tADD_FILE(firmware_feat_caps, 0200,\ndrivers/net/wireless/ath/wcn36xx/debug.c:204:\t\t \u0026fops_wcn36xx_firmware_feat_caps, wcn);\ndrivers/net/wireless/ath/wcn36xx/debug.c-205-}\ndrivers/net/wireless/ath/wcn36xx/debug.c-206-\ndrivers/net/wireless/ath/wcn36xx/debug.c:207:void wcn36xx_debugfs_exit(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/debug.c-208-{\ndrivers/net/wireless/ath/wcn36xx/debug.c:209:\tstruct wcn36xx_dfs_entry *dfs = \u0026wcn-\u003edfs;\ndrivers/net/wireless/ath/wcn36xx/debug.c-210-\tdebugfs_remove_recursive(dfs-\u003erootdir);\n--\ndrivers/net/wireless/ath/wcn36xx/debug.h-24-#ifdef CONFIG_WCN36XX_DEBUGFS\ndrivers/net/wireless/ath/wcn36xx/debug.h:25:struct wcn36xx_dfs_file {\ndrivers/net/wireless/ath/wcn36xx/debug.h-26-\tstruct dentry *dentry;\n--\ndrivers/net/wireless/ath/wcn36xx/debug.h-29-\ndrivers/net/wireless/ath/wcn36xx/debug.h:30:struct wcn36xx_dfs_entry {\ndrivers/net/wireless/ath/wcn36xx/debug.h-31-\tstruct dentry *rootdir;\ndrivers/net/wireless/ath/wcn36xx/debug.h:32:\tstruct wcn36xx_dfs_file file_bmps_switcher;\ndrivers/net/wireless/ath/wcn36xx/debug.h:33:\tstruct wcn36xx_dfs_file file_dump;\ndrivers/net/wireless/ath/wcn36xx/debug.h:34:\tstruct wcn36xx_dfs_file file_firmware_feat_caps;\ndrivers/net/wireless/ath/wcn36xx/debug.h-35-};\ndrivers/net/wireless/ath/wcn36xx/debug.h-36-\ndrivers/net/wireless/ath/wcn36xx/debug.h:37:void wcn36xx_debugfs_init(struct wcn36xx *wcn);\ndrivers/net/wireless/ath/wcn36xx/debug.h:38:void wcn36xx_debugfs_exit(struct wcn36xx *wcn);\ndrivers/net/wireless/ath/wcn36xx/debug.h-39-\ndrivers/net/wireless/ath/wcn36xx/debug.h-40-#else\ndrivers/net/wireless/ath/wcn36xx/debug.h:41:static inline void wcn36xx_debugfs_init(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/debug.h-42-{\ndrivers/net/wireless/ath/wcn36xx/debug.h-43-}\ndrivers/net/wireless/ath/wcn36xx/debug.h:44:static inline void wcn36xx_debugfs_exit(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/debug.h-45-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-26-#include \u003clinux/soc/qcom/smem_state.h\u003e\ndrivers/net/wireless/ath/wcn36xx/dxe.c:27:#include \"wcn36xx.h\"\ndrivers/net/wireless/ath/wcn36xx/dxe.c-28-#include \"txrx.h\"\ndrivers/net/wireless/ath/wcn36xx/dxe.c-29-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:30:static void wcn36xx_ccu_write_register(struct wcn36xx *wcn, int addr, int data)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-31-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:32:\twcn36xx_dbg(WCN36XX_DBG_DXE,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:33:\t\t \"wcn36xx_ccu_write_register: addr=%x, data=%x\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-34-\t\t addr, data);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-38-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:39:static void wcn36xx_dxe_write_register(struct wcn36xx *wcn, int addr, int data)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-40-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:41:\twcn36xx_dbg(WCN36XX_DBG_DXE,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:42:\t\t \"wcn36xx_dxe_write_register: addr=%x, data=%x\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-43-\t\t addr, data);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-47-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:48:static void wcn36xx_dxe_read_register(struct wcn36xx *wcn, int addr, int *data)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-49-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-51-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:52:\twcn36xx_dbg(WCN36XX_DBG_DXE,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:53:\t\t \"wcn36xx_dxe_read_register: addr=%x, data=%x\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-54-\t\t addr, *data);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-56-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:57:static void wcn36xx_dxe_free_ctl_block(struct wcn36xx_dxe_ch *ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-58-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:59:\tstruct wcn36xx_dxe_ctl *ctl = ch-\u003ehead_blk_ctl, *next;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-60-\tint i;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-68-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:69:static int wcn36xx_dxe_allocate_ctl_block(struct wcn36xx_dxe_ch *ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-70-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:71:\tstruct wcn36xx_dxe_ctl *prev_ctl = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:72:\tstruct wcn36xx_dxe_ctl *cur_ctl = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-73-\tint i;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-96-out_fail:\ndrivers/net/wireless/ath/wcn36xx/dxe.c:97:\twcn36xx_dxe_free_ctl_block(ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-98-\treturn -ENOMEM;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-100-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:101:int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-102-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-130-\t/* DXE control block allocation */\ndrivers/net/wireless/ath/wcn36xx/dxe.c:131:\tret = wcn36xx_dxe_allocate_ctl_block(\u0026wcn-\u003edxe_tx_l_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-132-\tif (ret)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-133-\t\tgoto out_err;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:134:\tret = wcn36xx_dxe_allocate_ctl_block(\u0026wcn-\u003edxe_tx_h_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-135-\tif (ret)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-136-\t\tgoto out_err;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:137:\tret = wcn36xx_dxe_allocate_ctl_block(\u0026wcn-\u003edxe_rx_l_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-138-\tif (ret)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-139-\t\tgoto out_err;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:140:\tret = wcn36xx_dxe_allocate_ctl_block(\u0026wcn-\u003edxe_rx_h_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-141-\tif (ret)\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-154-out_err:\ndrivers/net/wireless/ath/wcn36xx/dxe.c:155:\twcn36xx_err(\"Failed to allocate DXE control blocks\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c:156:\twcn36xx_dxe_free_ctl_blks(wcn);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-157-\treturn -ENOMEM;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-159-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:160:void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-161-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:162:\twcn36xx_dxe_free_ctl_block(\u0026wcn-\u003edxe_tx_l_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:163:\twcn36xx_dxe_free_ctl_block(\u0026wcn-\u003edxe_tx_h_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:164:\twcn36xx_dxe_free_ctl_block(\u0026wcn-\u003edxe_rx_l_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:165:\twcn36xx_dxe_free_ctl_block(\u0026wcn-\u003edxe_rx_h_ch);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-166-}\ndrivers/net/wireless/ath/wcn36xx/dxe.c-167-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:168:static int wcn36xx_dxe_init_descs(struct wcn36xx *wcn, struct wcn36xx_dxe_ch *wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-169-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c-170-\tstruct device *dev = wcn-\u003edev;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:171:\tstruct wcn36xx_dxe_desc *cur_dxe = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:172:\tstruct wcn36xx_dxe_desc *prev_dxe = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:173:\tstruct wcn36xx_dxe_ctl *cur_ctl = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-174-\tsize_t size;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-176-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:177:\tsize = wcn_ch-\u003edesc_num * sizeof(struct wcn36xx_dxe_desc);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-178-\twcn_ch-\u003ecpu_addr = dma_alloc_coherent(dev, size, \u0026wcn_ch-\u003edma_addr,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-188-\t\tcur_ctl-\u003edesc_phy_addr = wcn_ch-\u003edma_addr +\ndrivers/net/wireless/ath/wcn36xx/dxe.c:189:\t\t\ti * sizeof(struct wcn36xx_dxe_desc);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-190-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-227-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:228:static void wcn36xx_dxe_deinit_descs(struct device *dev, struct wcn36xx_dxe_ch *wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-229-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-231-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:232:\tsize = wcn_ch-\u003edesc_num * sizeof(struct wcn36xx_dxe_desc);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-233-\tdma_free_coherent(dev, size,wcn_ch-\u003ecpu_addr, wcn_ch-\u003edma_addr);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-235-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:236:static void wcn36xx_dxe_init_tx_bd(struct wcn36xx_dxe_ch *ch,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:237:\t\t\t\t struct wcn36xx_dxe_mem_pool *pool)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-238-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-241-\tvoid *bd_cpu_addr = pool-\u003evirt_addr;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:242:\tstruct wcn36xx_dxe_ctl *cur = ch-\u003ehead_blk_ctl;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-243-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-259-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:260:static int wcn36xx_dxe_enable_ch_int(struct wcn36xx *wcn, u16 wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-261-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-263-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:264:\twcn36xx_dxe_read_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-265-\t\t\t\t WCN36XX_DXE_INT_MASK_REG,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-269-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:270:\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-271-\t\t\t\t WCN36XX_DXE_INT_MASK_REG,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-275-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:276:static void wcn36xx_dxe_disable_ch_int(struct wcn36xx *wcn, u16 wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-277-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-279-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:280:\twcn36xx_dxe_read_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-281-\t\t\t\t WCN36XX_DXE_INT_MASK_REG,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-285-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:286:\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-287-\t\t\t\t WCN36XX_DXE_INT_MASK_REG,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-290-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:291:static int wcn36xx_dxe_fill_skb(struct device *dev,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:292:\t\t\t\tstruct wcn36xx_dxe_ctl *ctl,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-293-\t\t\t\tgfp_t gfp)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-294-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:295:\tstruct wcn36xx_dxe_desc *dxe = ctl-\u003edesc;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-296-\tstruct sk_buff *skb;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-315-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:316:static int wcn36xx_dxe_ch_alloc_skb(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:317:\t\t\t\t struct wcn36xx_dxe_ch *wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-318-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c-319-\tint i;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:320:\tstruct wcn36xx_dxe_ctl *cur_ctl = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-321-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-324-\tfor (i = 0; i \u003c wcn_ch-\u003edesc_num; i++) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:325:\t\twcn36xx_dxe_fill_skb(wcn-\u003edev, cur_ctl, GFP_KERNEL);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-326-\t\tcur_ctl = cur_ctl-\u003enext;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-331-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:332:static void wcn36xx_dxe_ch_free_skbs(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:333:\t\t\t\t struct wcn36xx_dxe_ch *wcn_ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-334-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:335:\tstruct wcn36xx_dxe_ctl *cur = wcn_ch-\u003ehead_blk_ctl;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-336-\tint i;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-343-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:344:void wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-345-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-356-\tif (!skb) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:357:\t\twcn36xx_warn(\"Spurious TX complete indication\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-358-\t\treturn;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-367-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:368:\twcn36xx_dbg(WCN36XX_DBG_DXE, \"dxe tx ack status: %d\\n\", status);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-369-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-373-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:374:static void wcn36xx_dxe_tx_timer(struct timer_list *t)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-375-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:376:\tstruct wcn36xx *wcn = timer_container_of(wcn, t, tx_ack_timer);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-377-\tstruct ieee80211_tx_info *info;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-381-\t/* TX Timeout */\ndrivers/net/wireless/ath/wcn36xx/dxe.c:382:\twcn36xx_dbg(WCN36XX_DBG_DXE, \"TX timeout\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-383-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-399-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:400:static void reap_tx_dxes(struct wcn36xx *wcn, struct wcn36xx_dxe_ch *ch)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-401-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:402:\tstruct wcn36xx_dxe_ctl *ctl;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-403-\tstruct ieee80211_tx_info *info;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-453-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:454:static irqreturn_t wcn36xx_irq_tx_complete(int irq, void *dev)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-455-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:456:\tstruct wcn36xx *wcn = dev;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-457-\tint int_src, int_reason;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-458-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:459:\twcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, \u0026int_src);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-460-\ndrivers/net/wireless/ath/wcn36xx/dxe.c-461-\tif (int_src \u0026 WCN36XX_INT_MASK_CHAN_TX_H) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:462:\t\twcn36xx_dxe_read_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-463-\t\t\t\t\t WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_H,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-465-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:466:\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-467-\t\t\t\t\t WCN36XX_DXE_0_INT_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-470-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ERR_MASK ) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:471:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-472-\t\t\t\t\t\t WCN36XX_DXE_0_INT_ERR_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-474-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:475:\t\t\twcn36xx_err(\"DXE IRQ reported error: 0x%x in high TX channel\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-476-\t\t\t\t\tint_src);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-479-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_DONE_MASK) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:480:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-481-\t\t\t\t\t\t WCN36XX_DXE_0_INT_DONE_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-485-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ED_MASK) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:486:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-487-\t\t\t\t\t\t WCN36XX_DXE_0_INT_ED_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-490-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:491:\t\twcn36xx_dbg(WCN36XX_DBG_DXE, \"dxe tx ready high, reason %08x\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-492-\t\t\t int_reason);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-500-\tif (int_src \u0026 WCN36XX_INT_MASK_CHAN_TX_L) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:501:\t\twcn36xx_dxe_read_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-502-\t\t\t\t\t WCN36XX_DXE_CH_STATUS_REG_ADDR_TX_L,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-504-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:505:\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-506-\t\t\t\t\t WCN36XX_DXE_0_INT_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-509-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ERR_MASK ) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:510:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-511-\t\t\t\t\t\t WCN36XX_DXE_0_INT_ERR_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-513-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:514:\t\t\twcn36xx_err(\"DXE IRQ reported error: 0x%x in low TX channel\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-515-\t\t\t\t\tint_src);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-518-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_DONE_MASK) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:519:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-520-\t\t\t\t\t\t WCN36XX_DXE_0_INT_DONE_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-524-\t\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ED_MASK) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:525:\t\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-526-\t\t\t\t\t\t WCN36XX_DXE_0_INT_ED_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-529-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:530:\t\twcn36xx_dbg(WCN36XX_DBG_DXE, \"dxe tx ready low, reason %08x\\n\",\ndrivers/net/wireless/ath/wcn36xx/dxe.c-531-\t\t\t int_reason);\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-541-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:542:static irqreturn_t wcn36xx_irq_rx_ready(int irq, void *dev)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-543-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:544:\tstruct wcn36xx *wcn = dev;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-545-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:546:\twcn36xx_dxe_rx_frame(wcn);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-547-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-550-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:551:static int wcn36xx_dxe_request_irqs(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-552-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-554-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:555:\tret = request_irq(wcn-\u003etx_irq, wcn36xx_irq_tx_complete,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:556:\t\t\t IRQF_TRIGGER_HIGH, \"wcn36xx_tx\", wcn);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-557-\tif (ret) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:558:\t\twcn36xx_err(\"failed to alloc tx irq\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-559-\t\tgoto out_err;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-561-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:562:\tret = request_irq(wcn-\u003erx_irq, wcn36xx_irq_rx_ready, IRQF_TRIGGER_HIGH,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:563:\t\t\t \"wcn36xx_rx\", wcn);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-564-\tif (ret) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:565:\t\twcn36xx_err(\"failed to alloc rx irq\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-566-\t\tgoto out_txirq;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-579-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:580:static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:581:\t\t\t\t struct wcn36xx_dxe_ch *ch,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-582-\t\t\t\t u32 ctrl,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-586-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:587:\tstruct wcn36xx_dxe_desc *dxe;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:588:\tstruct wcn36xx_dxe_ctl *ctl;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-589-\tdma_addr_t dma_addr;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-593-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:594:\twcn36xx_dxe_read_register(wcn, status_reg, \u0026int_reason);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:595:\twcn36xx_dxe_write_register(wcn, WCN36XX_DXE_0_INT_CLR, int_mask);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-596-\ndrivers/net/wireless/ath/wcn36xx/dxe.c-597-\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ERR_MASK) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:598:\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-599-\t\t\t\t\t WCN36XX_DXE_0_INT_ERR_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-601-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:602:\t\twcn36xx_err(\"DXE IRQ reported error on RX channel\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-603-\t}\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-605-\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_DONE_MASK)\ndrivers/net/wireless/ath/wcn36xx/dxe.c:606:\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-607-\t\t\t\t\t WCN36XX_DXE_0_INT_DONE_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-610-\tif (int_reason \u0026 WCN36XX_CH_STAT_INT_ED_MASK)\ndrivers/net/wireless/ath/wcn36xx/dxe.c:611:\t\twcn36xx_dxe_write_register(wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-612-\t\t\t\t\t WCN36XX_DXE_0_INT_ED_CLR,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-630-\t\tdma_addr = dxe-\u003edst_addr_l;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:631:\t\tret = wcn36xx_dxe_fill_skb(wcn-\u003edev, ctl, GFP_ATOMIC);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-632-\t\tif (0 == ret) {\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-637-\t\t\t\t\tDMA_FROM_DEVICE);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:638:\t\t\twcn36xx_rx_skb(wcn, skb);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-639-\t\t}\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-650-\t}\ndrivers/net/wireless/ath/wcn36xx/dxe.c:651:\twcn36xx_dxe_write_register(wcn, WCN36XX_DXE_ENCH_ADDR, en_mask);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-652-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-659-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:660:void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-661-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-663-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:664:\twcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, \u0026int_src);\ndrivers/net/wireless/ath/wcn36xx/dxe.c-665-\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-667-\tif (int_src \u0026 WCN36XX_DXE_INT_CH1_MASK)\ndrivers/net/wireless/ath/wcn36xx/dxe.c:668:\t\twcn36xx_rx_handle_packets(wcn, \u0026wcn-\u003edxe_rx_l_ch,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-669-\t\t\t\t\t WCN36XX_DXE_CTRL_RX_L,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-675-\tif (int_src \u0026 WCN36XX_DXE_INT_CH3_MASK)\ndrivers/net/wireless/ath/wcn36xx/dxe.c:676:\t\twcn36xx_rx_handle_packets(wcn, \u0026wcn-\u003edxe_rx_h_ch,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-677-\t\t\t\t\t WCN36XX_DXE_CTRL_RX_H,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-682-\tif (!int_src)\ndrivers/net/wireless/ath/wcn36xx/dxe.c:683:\t\twcn36xx_warn(\"No DXE interrupt pending\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-684-}\ndrivers/net/wireless/ath/wcn36xx/dxe.c-685-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:686:int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-687-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-723-out_err:\ndrivers/net/wireless/ath/wcn36xx/dxe.c:724:\twcn36xx_dxe_free_mem_pools(wcn);\ndrivers/net/wireless/ath/wcn36xx/dxe.c:725:\twcn36xx_err(\"Failed to allocate BD mempool\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-726-\treturn -ENOMEM;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-728-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:729:void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn)\ndrivers/net/wireless/ath/wcn36xx/dxe.c-730-{\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-744-\ndrivers/net/wireless/ath/wcn36xx/dxe.c:745:int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:746:\t\t\t struct wcn36xx_vif *vif_priv,\ndrivers/net/wireless/ath/wcn36xx/dxe.c:747:\t\t\t struct wcn36xx_tx_bd *bd,\ndrivers/net/wireless/ath/wcn36xx/dxe.c-748-\t\t\t struct sk_buff *skb,\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-750-{\ndrivers/net/wireless/ath/wcn36xx/dxe.c:751:\tstruct wcn36xx_dxe_desc *desc_bd, *desc_skb;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:752:\tstruct wcn36xx_dxe_ctl *ctl_bd, *ctl_skb;\ndrivers/net/wireless/ath/wcn36xx/dxe.c:753:\tstruct wcn36xx_dxe_ch *ch = NULL;\ndrivers/net/wireless/ath/wcn36xx/dxe.c-754-\tunsigned long flags;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-775-\tif (unlikely(ctl_skb-\u003ebd_cpu_addr)) {\ndrivers/net/wireless/ath/wcn36xx/dxe.c:776:\t\twcn36xx_err(\"bd_cpu_addr cannot be NULL for skb DXE\\n\");\ndrivers/net/wireless/ath/wcn36xx/dxe.c-777-\t\tret = -EINVAL;\n--\ndrivers/net/wireless/ath/wcn36xx/dxe.c-791-\tdesc_bd-\u003edst_addr_l = ch-\u003edxe_wq;\n\n"
} |
| 5/2 | 2026/09/07 07:47 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 18721 output: 42 thoughts: 28 Thoughts: Here's my summary, as though I'm processing those files: **Initial Assessment: Diving into the WCN36XX Driver** Okay, time to get a grip on this WCN36XX Wi-Fi driver. Let's start with the `Kconfig` file in the `drivers/net/wireless/ath/wcn36xx` directory. My immediate goal is to understand how this driver is configured and enabled within the kernel build system. I'll be looking for the dependencies, default settings, and any specific features that are controllable at compile time. This will give me a critical overview of its integration into the broader wireless subsystem. I need to grasp the building blocks. Then, I'll switch gears and crack open `main.c`. This is where the core logic of the driver will reside. I'll be looking for things like the driver's entry point, initialization routines, probe functions (how it identifies and attaches to the hardware), and exit functions (for cleanup). The goal here is to get a sense of the driver's overall architecture, how it interacts with the underlying hardware, and the general flow of operations. I'll be tracing function calls, variable declarations, and any use of kernel APIs relevant to network device drivers. I'm especially interested in how it handles interrupts, manages data buffers, and interacts with the network stack. I'm expecting this to show the core operational logic that is fundamental to this driver. I'll be reading for the design intent and architectural decisions. |
| 6/2 | 2026/09/07 07:47 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/wcn36xx/Kconfig",
"FirstLine": 1,
"LineCount": 50
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: ISC\n 2:\tconfig WCN36XX\n 3:\t\ttristate \"Qualcomm Atheros WCN3660/3680 support\"\n 4:\t\tdepends on MAC80211 \u0026\u0026 HAS_DMA\n 5:\t\tdepends on QCOM_WCNSS_CTRL || QCOM_WCNSS_CTRL=n\n 6:\t\tdepends on RPMSG || RPMSG=n\n 7:\t\thelp\n 8:\t\t This module adds support for wireless adapters based on\n 9:\t\t Qualcomm Atheros WCN3660 and WCN3680 mobile chipsets.\n 10:\t\n 11:\t\t If you choose to build a module, it'll be called wcn36xx.\n 12:\t\n 13:\tconfig WCN36XX_DEBUGFS\n 14:\t\tbool \"WCN36XX debugfs support\"\n 15:\t\tdepends on WCN36XX\n 16:\t\thelp\n 17:\t\t Enabled debugfs support\n 18:\t\n 19:\t\t If unsure, say Y to make it easier to debug problems.\n"
} |
| 7/2 | 2026/09/07 07:47 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 19404 output: 47 thoughts: 36 Thoughts: Okay, let's dive into this. I need to understand how this `wcn36xx` driver is initialized. The best place to start, as always, is the core. I'm going to jump into the source code, specifically `drivers/net/wireless/ath/wcn36xx/main.c`. That should give me the entry point and the fundamental probe sequence. I'm expecting to find the initialization function, how it's registered with the kernel, and the device structure setup. From there, I can probably follow the breadcrumbs to understand power management, interrupt handling, and everything else. Time to get my hands dirty and see what we're working with here. |
| 8/2 | 2026/09/07 07:47 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/wcn36xx/main.c",
"FirstLine": 1400,
"LineCount": 100
}Results: {
"Contents": "1400:\t\t\t\t7 \u003c\u003c IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT);\n1401:\t\n1402:\t\tvht_cap-\u003evht_mcs.rx_mcs_map =\n1403:\t\t\tcpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 |\n1404:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 2 |\n1405:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 4 |\n1406:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 6 |\n1407:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 8 |\n1408:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 10 |\n1409:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 12 |\n1410:\t\t\t\t IEEE80211_VHT_MCS_NOT_SUPPORTED \u003c\u003c 14);\n1411:\t\n1412:\t\tvht_cap-\u003evht_mcs.rx_highest = cpu_to_le16(433);\n1413:\t\tvht_cap-\u003evht_mcs.tx_highest = vht_cap-\u003evht_mcs.rx_highest;\n1414:\t\n1415:\t\tvht_cap-\u003evht_mcs.tx_mcs_map = vht_cap-\u003evht_mcs.rx_mcs_map;\n1416:\t}\n1417:\t\n1418:\tstatic int wcn36xx_init_ieee80211(struct wcn36xx *wcn)\n1419:\t{\n1420:\t\tstatic const u32 cipher_suites[] = {\n1421:\t\t\tWLAN_CIPHER_SUITE_WEP40,\n1422:\t\t\tWLAN_CIPHER_SUITE_WEP104,\n1423:\t\t\tWLAN_CIPHER_SUITE_TKIP,\n1424:\t\t\tWLAN_CIPHER_SUITE_CCMP,\n1425:\t\t};\n1426:\t\n1427:\t\tieee80211_hw_set(wcn-\u003ehw, TIMING_BEACON_ONLY);\n1428:\t\tieee80211_hw_set(wcn-\u003ehw, AMPDU_AGGREGATION);\n1429:\t\tieee80211_hw_set(wcn-\u003ehw, SUPPORTS_PS);\n1430:\t\tieee80211_hw_set(wcn-\u003ehw, SIGNAL_DBM);\n1431:\t\tieee80211_hw_set(wcn-\u003ehw, HAS_RATE_CONTROL);\n1432:\t\tieee80211_hw_set(wcn-\u003ehw, SINGLE_SCAN_ON_ALL_BANDS);\n1433:\t\tieee80211_hw_set(wcn-\u003ehw, REPORTS_TX_ACK_STATUS);\n1434:\t\n1435:\t\twcn-\u003ehw-\u003ewiphy-\u003einterface_modes = BIT(NL80211_IFTYPE_STATION) |\n1436:\t\t\tBIT(NL80211_IFTYPE_AP) |\n1437:\t\t\tBIT(NL80211_IFTYPE_ADHOC) |\n1438:\t\t\tBIT(NL80211_IFTYPE_MESH_POINT);\n1439:\t\n1440:\t\twcn-\u003ehw-\u003ewiphy-\u003ebands[NL80211_BAND_2GHZ] = \u0026wcn_band_2ghz;\n1441:\t\tif (wcn-\u003erf_id != RF_IRIS_WCN3620)\n1442:\t\t\twcn-\u003ehw-\u003ewiphy-\u003ebands[NL80211_BAND_5GHZ] = \u0026wcn_band_5ghz;\n1443:\t\n1444:\t\tif (wcn-\u003erf_id == RF_IRIS_WCN3680)\n1445:\t\t\twcn36xx_set_ieee80211_vht_caps(\u0026wcn_band_5ghz.vht_cap);\n1446:\t\n1447:\t\twcn-\u003ehw-\u003ewiphy-\u003emax_scan_ssids = WCN36XX_MAX_SCAN_SSIDS;\n1448:\t\twcn-\u003ehw-\u003ewiphy-\u003emax_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN;\n1449:\t\n1450:\t\twcn-\u003ehw-\u003ewiphy-\u003ecipher_suites = cipher_suites;\n1451:\t\twcn-\u003ehw-\u003ewiphy-\u003en_cipher_suites = ARRAY_SIZE(cipher_suites);\n1452:\t\n1453:\t#ifdef CONFIG_PM\n1454:\t\twcn-\u003ehw-\u003ewiphy-\u003ewowlan = \u0026wowlan_support;\n1455:\t#endif\n1456:\t\n1457:\t\twcn-\u003ehw-\u003emax_listen_interval = 200;\n1458:\t\n1459:\t\twcn-\u003ehw-\u003equeues = 4;\n1460:\t\n1461:\t\tSET_IEEE80211_DEV(wcn-\u003ehw, wcn-\u003edev);\n1462:\t\n1463:\t\twcn-\u003ehw-\u003esta_data_size = sizeof(struct wcn36xx_sta);\n1464:\t\twcn-\u003ehw-\u003evif_data_size = sizeof(struct wcn36xx_vif);\n1465:\t\n1466:\t\twiphy_ext_feature_set(wcn-\u003ehw-\u003ewiphy,\n1467:\t\t\t\t NL80211_EXT_FEATURE_CQM_RSSI_LIST);\n1468:\t\n1469:\t\treturn 0;\n1470:\t}\n1471:\t\n1472:\tstatic int wcn36xx_platform_get_resources(struct wcn36xx *wcn,\n1473:\t\t\t\t\t\t struct platform_device *pdev)\n1474:\t{\n1475:\t\tstruct device_node *mmio_node;\n1476:\t\tstruct device_node *iris_node;\n1477:\t\tint index;\n1478:\t\tint ret;\n1479:\t\n1480:\t\t/* Set TX IRQ */\n1481:\t\tret = platform_get_irq_byname(pdev, \"tx\");\n1482:\t\tif (ret \u003c 0)\n1483:\t\t\treturn ret;\n1484:\t\twcn-\u003etx_irq = ret;\n1485:\t\n1486:\t\t/* Set RX IRQ */\n1487:\t\tret = platform_get_irq_byname(pdev, \"rx\");\n1488:\t\tif (ret \u003c 0)\n1489:\t\t\treturn ret;\n1490:\t\twcn-\u003erx_irq = ret;\n1491:\t\n1492:\t\t/* Acquire SMSM tx enable handle */\n1493:\t\twcn-\u003etx_enable_state = qcom_smem_state_get(\u0026pdev-\u003edev,\n1494:\t\t\t\t\"tx-enable\", \u0026wcn-\u003etx_enable_state_bit);\n1495:\t\tif (IS_ERR(wcn-\u003etx_enable_state)) {\n1496:\t\t\twcn36xx_err(\"failed to get tx-enable state\\n\");\n1497:\t\t\treturn PTR_ERR(wcn-\u003etx_enable_state);\n1498:\t\t}\n1499:\t\n"
} |
| 9/2 | 2026/09/07 07:47 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 21635 output: 47 thoughts: 26 Thoughts: Okay, here's my take on those thoughts, framed as an expert's internal monologue, ready for a deep dive into `drivers/net/wireless/ath/wcn36xx/main.c`: **Diving into the WCN36xx Main Driver** Alright, let's get down to brass tacks. I'm about to scrutinize the main file for the WCN36xx wireless driver. First, let's get the lay of the land, I need to see the implementation details to know whether or not to proceed in the code. I need to be able to assess the architecture choices and the overall structure. What are the key initialization steps? Where are the critical data structures defined, and how are they managed? Are there any obvious red flags in terms of locking, error handling, or interrupt management that I should flag immediately? I'm particularly interested in how they've handled the interactions between the host driver and the firmware, given that this is likely a fairly tightly coupled system. This will require me to look in the code. I'm going to want to understand how they’ve dealt with power management, especially if this is a mobile device or embedded context. This driver will be used in these cases. Are there any custom hooks or interfaces specific to the WCN36xx chipset that deviate from the standard wireless driver framework? And finally, does this implementation support features that are specific to the device? Let's get to work! |
| 10/2 | 2026/09/07 07:48 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/wcn36xx/main.c",
"FirstLine": 1500,
"LineCount": 100
}Results: {
"Contents": "1500:\t\t/* Acquire SMSM tx rings empty handle */\n1501:\t\twcn-\u003etx_rings_empty_state = qcom_smem_state_get(\u0026pdev-\u003edev,\n1502:\t\t\t\t\"tx-rings-empty\", \u0026wcn-\u003etx_rings_empty_state_bit);\n1503:\t\tif (IS_ERR(wcn-\u003etx_rings_empty_state)) {\n1504:\t\t\twcn36xx_err(\"failed to get tx-rings-empty state\\n\");\n1505:\t\t\treturn PTR_ERR(wcn-\u003etx_rings_empty_state);\n1506:\t\t}\n1507:\t\n1508:\t\tmmio_node = of_parse_phandle(pdev-\u003edev.parent-\u003eof_node, \"qcom,mmio\", 0);\n1509:\t\tif (!mmio_node) {\n1510:\t\t\twcn36xx_err(\"failed to acquire qcom,mmio reference\\n\");\n1511:\t\t\treturn -EINVAL;\n1512:\t\t}\n1513:\t\n1514:\t\twcn-\u003eis_pronto = !!of_device_is_compatible(mmio_node, \"qcom,pronto\");\n1515:\t\twcn-\u003eis_pronto_v3 = !!of_device_is_compatible(mmio_node, \"qcom,pronto-v3-pil\");\n1516:\t\n1517:\t\t/* Map the CCU memory */\n1518:\t\tindex = of_property_match_string(mmio_node, \"reg-names\", \"ccu\");\n1519:\t\twcn-\u003eccu_base = of_iomap(mmio_node, index);\n1520:\t\tif (!wcn-\u003eccu_base) {\n1521:\t\t\twcn36xx_err(\"failed to map ccu memory\\n\");\n1522:\t\t\tret = -ENOMEM;\n1523:\t\t\tgoto put_mmio_node;\n1524:\t\t}\n1525:\t\n1526:\t\t/* Map the DXE memory */\n1527:\t\tindex = of_property_match_string(mmio_node, \"reg-names\", \"dxe\");\n1528:\t\twcn-\u003edxe_base = of_iomap(mmio_node, index);\n1529:\t\tif (!wcn-\u003edxe_base) {\n1530:\t\t\twcn36xx_err(\"failed to map dxe memory\\n\");\n1531:\t\t\tret = -ENOMEM;\n1532:\t\t\tgoto unmap_ccu;\n1533:\t\t}\n1534:\t\n1535:\t\t/* External RF module */\n1536:\t\tiris_node = of_get_child_by_name(mmio_node, \"iris\");\n1537:\t\tif (iris_node) {\n1538:\t\t\tif (of_device_is_compatible(iris_node, \"qcom,wcn3620\"))\n1539:\t\t\t\twcn-\u003erf_id = RF_IRIS_WCN3620;\n1540:\t\t\tif (of_device_is_compatible(iris_node, \"qcom,wcn3660\") ||\n1541:\t\t\t of_device_is_compatible(iris_node, \"qcom,wcn3660b\"))\n1542:\t\t\t\twcn-\u003erf_id = RF_IRIS_WCN3660;\n1543:\t\t\tif (of_device_is_compatible(iris_node, \"qcom,wcn3680\"))\n1544:\t\t\t\twcn-\u003erf_id = RF_IRIS_WCN3680;\n1545:\t\t\tof_node_put(iris_node);\n1546:\t\t}\n1547:\t\n1548:\t\tof_node_put(mmio_node);\n1549:\t\treturn 0;\n1550:\t\n1551:\tunmap_ccu:\n1552:\t\tiounmap(wcn-\u003eccu_base);\n1553:\tput_mmio_node:\n1554:\t\tof_node_put(mmio_node);\n1555:\t\treturn ret;\n1556:\t}\n1557:\t\n1558:\tstatic int wcn36xx_probe(struct platform_device *pdev)\n1559:\t{\n1560:\t\tstruct ieee80211_hw *hw;\n1561:\t\tstruct wcn36xx *wcn;\n1562:\t\tvoid *wcnss;\n1563:\t\tint ret;\n1564:\t\tconst u8 *addr;\n1565:\t\tint n_channels;\n1566:\t\n1567:\t\twcn36xx_dbg(WCN36XX_DBG_MAC, \"platform probe\\n\");\n1568:\t\n1569:\t\twcnss = dev_get_drvdata(pdev-\u003edev.parent);\n1570:\t\n1571:\t\tn_channels = wcn_band_2ghz.n_channels + wcn_band_5ghz.n_channels;\n1572:\t\thw = ieee80211_alloc_hw(struct_size(wcn, chan_survey, n_channels), \u0026wcn36xx_ops);\n1573:\t\tif (!hw) {\n1574:\t\t\twcn36xx_err(\"failed to alloc hw\\n\");\n1575:\t\t\tret = -ENOMEM;\n1576:\t\t\tgoto out_err;\n1577:\t\t}\n1578:\t\tplatform_set_drvdata(pdev, hw);\n1579:\t\twcn = hw-\u003epriv;\n1580:\t\twcn-\u003ehw = hw;\n1581:\t\twcn-\u003edev = \u0026pdev-\u003edev;\n1582:\t\twcn-\u003efirst_boot = true;\n1583:\t\tmutex_init(\u0026wcn-\u003econf_mutex);\n1584:\t\tmutex_init(\u0026wcn-\u003ehal_mutex);\n1585:\t\tmutex_init(\u0026wcn-\u003escan_lock);\n1586:\t\t__skb_queue_head_init(\u0026wcn-\u003eamsdu);\n1587:\t\n1588:\t\twcn-\u003ehal_buf = devm_kmalloc(wcn-\u003edev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);\n1589:\t\tif (!wcn-\u003ehal_buf) {\n1590:\t\t\tret = -ENOMEM;\n1591:\t\t\tgoto out_wq;\n1592:\t\t}\n1593:\t\n1594:\t\tret = dma_set_mask_and_coherent(wcn-\u003edev, DMA_BIT_MASK(32));\n1595:\t\tif (ret \u003c 0) {\n1596:\t\t\twcn36xx_err(\"failed to set DMA mask: %d\\n\", ret);\n1597:\t\t\tgoto out_wq;\n1598:\t\t}\n1599:\t\n"
} |
| 11/2 | 2026/09/07 07:48 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 23838 output: 46 thoughts: 25 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving Deeper into the Wi-Fi Driver** Okay, so I've been focusing on the `wcn36xx_probe` function and how it's handled, but now it's time to zoom out and get the complete picture. I need to understand how the probe function fits into the driver's lifecycle. Specifically, I'm thinking about how the `wcn36xx_probe` function gets called in the first place, and where the driver registration is happening. I need to trace this back to the `main.c` file. I suspect `main.c` contains the core driver initialization, module loading/unloading, and probably registers the driver with the kernel. I need to see how the probe function is tied in to driver registration, and how that gets handled during module load, and device detection. I'll need to look for calls to functions like `module_init`, `platform_driver_register`, or similar mechanisms that kick off this process. I'm hoping to get a clearer picture of the control flow. |
| 12/2 | 2026/09/07 07:48 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/wcn36xx/main.c",
"FirstLine": 1600,
"LineCount": 80
}Results: {
"Contents": "1600:\t\twcn-\u003env_file = WLAN_NV_FILE;\n1601:\t\tret = of_property_read_string(wcn-\u003edev-\u003eparent-\u003eof_node, \"firmware-name\", \u0026wcn-\u003env_file);\n1602:\t\tif (ret \u003c 0 \u0026\u0026 ret != -EINVAL) {\n1603:\t\t\twcn36xx_err(\"failed to read \\\"firmware-name\\\" property: %d\\n\", ret);\n1604:\t\t\tgoto out_wq;\n1605:\t\t}\n1606:\t\n1607:\t\twcn-\u003esmd_channel = qcom_wcnss_open_channel(wcnss, \"WLAN_CTRL\", wcn36xx_smd_rsp_process, hw);\n1608:\t\tif (IS_ERR(wcn-\u003esmd_channel)) {\n1609:\t\t\twcn36xx_err(\"failed to open WLAN_CTRL channel\\n\");\n1610:\t\t\tret = PTR_ERR(wcn-\u003esmd_channel);\n1611:\t\t\tgoto out_wq;\n1612:\t\t}\n1613:\t\n1614:\t\taddr = of_get_property(pdev-\u003edev.of_node, \"local-mac-address\", \u0026ret);\n1615:\t\tif (addr \u0026\u0026 ret != ETH_ALEN) {\n1616:\t\t\twcn36xx_err(\"invalid local-mac-address\\n\");\n1617:\t\t\tret = -EINVAL;\n1618:\t\t\tgoto out_destroy_ept;\n1619:\t\t} else if (addr) {\n1620:\t\t\twcn36xx_info(\"mac address: %pM\\n\", addr);\n1621:\t\t\tSET_IEEE80211_PERM_ADDR(wcn-\u003ehw, addr);\n1622:\t\t}\n1623:\t\n1624:\t\tret = wcn36xx_platform_get_resources(wcn, pdev);\n1625:\t\tif (ret)\n1626:\t\t\tgoto out_destroy_ept;\n1627:\t\n1628:\t\twcn36xx_init_ieee80211(wcn);\n1629:\t\tret = ieee80211_register_hw(wcn-\u003ehw);\n1630:\t\tif (ret)\n1631:\t\t\tgoto out_unmap;\n1632:\t\n1633:\t\treturn 0;\n1634:\t\n1635:\tout_unmap:\n1636:\t\tiounmap(wcn-\u003eccu_base);\n1637:\t\tiounmap(wcn-\u003edxe_base);\n1638:\tout_destroy_ept:\n1639:\t\trpmsg_destroy_ept(wcn-\u003esmd_channel);\n1640:\tout_wq:\n1641:\t\tieee80211_free_hw(hw);\n1642:\tout_err:\n1643:\t\treturn ret;\n1644:\t}\n1645:\t\n1646:\tstatic void wcn36xx_remove(struct platform_device *pdev)\n1647:\t{\n1648:\t\tstruct ieee80211_hw *hw = platform_get_drvdata(pdev);\n1649:\t\tstruct wcn36xx *wcn = hw-\u003epriv;\n1650:\t\twcn36xx_dbg(WCN36XX_DBG_MAC, \"platform remove\\n\");\n1651:\t\n1652:\t\trelease_firmware(wcn-\u003env);\n1653:\t\n1654:\t\tieee80211_unregister_hw(hw);\n1655:\t\n1656:\t\tqcom_smem_state_put(wcn-\u003etx_enable_state);\n1657:\t\tqcom_smem_state_put(wcn-\u003etx_rings_empty_state);\n1658:\t\n1659:\t\trpmsg_destroy_ept(wcn-\u003esmd_channel);\n1660:\t\n1661:\t\tiounmap(wcn-\u003edxe_base);\n1662:\t\tiounmap(wcn-\u003eccu_base);\n1663:\t\n1664:\t\t__skb_queue_purge(\u0026wcn-\u003eamsdu);\n1665:\t\n1666:\t\tmutex_destroy(\u0026wcn-\u003ehal_mutex);\n1667:\t\tieee80211_free_hw(hw);\n1668:\t}\n1669:\t\n1670:\tstatic const struct of_device_id wcn36xx_of_match[] = {\n1671:\t\t{ .compatible = \"qcom,wcnss-wlan\" },\n1672:\t\t{}\n1673:\t};\n1674:\tMODULE_DEVICE_TABLE(of, wcn36xx_of_match);\n1675:\t\n1676:\tstatic struct platform_driver wcn36xx_driver = {\n1677:\t\t.probe = wcn36xx_probe,\n1678:\t\t.remove = wcn36xx_remove,\n1679:\t\t.driver = {\n"
} |
| 13/2 | 2026/09/07 07:48 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 25509 output: 31 thoughts: 365 Thoughts: **My Assessment of the wcn36xx Driver** Okay, let's break this down. My initial thought is that `wcn36xx` appears to be a platform driver specifically for Qualcomm's WCNSS WLAN subsystem, matching the device tree node `qcom,wcnss-wlan`. And it looks like it hooks into `qcom_wcnss_open_channel`, which I know from experience typically uses rpmsg or SMD for inter-processor communication on Qualcomm SoCs. Now the interesting part: can this even run or be emulated on an amd64 system, like with QEMU? The target architecture is clearly amd64, so it's worth digging a bit. First, I need to confirm: is this Qualcomm WCNSS or the `wcn36xx` driver *even accessible* on amd64 when using QEMU? I'm going to look at the `wcn36xx_probe` function to confirm. Okay, checking `wcn36xx_probe`... I'm seeing: * It retrieves the WCNSS data from the parent device: `wcnss = dev_get_drvdata(pdev->dev.parent);` * It parses the device tree for an mmio node: `mmio_node = of_parse_phandle(pdev->dev.parent->of_node, "qcom,mmio", 0);` * It also uses `qcom_smem_state_get` to retrieve shared memory information. * It calls `qcom_wcnss_open_channel(wcnss, "WLAN_CTRL", ...)` * And finally, `platform_get_irq_byname(pdev, "tx")`. These lines jump out at me. This driver relies heavily on Device Tree information, specifically with nodes like `qcom,mmio`, and shared memory management, such as `qcom_smem_state`, all strongly indicative of a Qualcomm Snapdragon ARM/ARM64 SoC environment. The use of `qcom_wcnss_open_channel` reinforces this; it's practically a signature. The driver also mentions that it supports `qcom,pronto`, `qcom,pronto-v3-pil`, and `qcom_smem_state`. So, it's increasingly clear: this driver is built for that specific Qualcomm ecosystem. Just to be thorough, I'm going to check for any potential USB or PCI interfaces related to the wcn36xx. I'll search all the files in the `drivers/net/wireless/ath/wcn36xx/` directory and see if anything pops up. But my initial guess is that it's going to be SoC-specific and not generic enough for amd64. |
| 14/2 | 2026/09/07 07:48 | tool | codesearch-dir-index |
0mArgs:{
"Dir": "drivers/net/wireless/ath/wcn36xx"
}Results: {
"Files": [
"debug.c",
"debug.h",
"dxe.c",
"dxe.h",
"firmware.c",
"firmware.h",
"hal.h",
"main.c",
"pmc.c",
"pmc.h",
"smd.c",
"smd.h",
"testmode.c",
"testmode.h",
"testmode_i.h",
"txrx.c",
"txrx.h",
"wcn36xx.h"
],
"Subdirs": null
} |
| 15/2 | 2026/09/07 07:48 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 26661 output: 30 thoughts: 63 Thoughts: **Investigating the `wcn36xx_smd_process_ptt_msg_rsp` Function** Okay, so I need to understand the call flow and dependencies around `wcn36xx_smd_process_ptt_msg_rsp`. My immediate instinct is to check for *all* the drivers and callers of this function. I need to get a comprehensive view of how this function is used. Alright, time to fire up the grep utility. I'll search for the function name, specifically `wcn36xx_smd_process_ptt_msg_rsp`, alongside the broader `WCN36XX` context. This should allow me to pinpoint all instances of the function's usage within the codebase and quickly identify potential interactions and dependencies. This will give me a solid foundation for further analysis. |
| 16/2 | 2026/09/07 07:48 | tool | grepper |
0mArgs:{
"Expression": "wcn36xx_smd_process_ptt_msg_rsp"
}Results: {
"Output": "drivers/net/wireless/ath/wcn36xx/smd.c=1034=int wcn36xx_smd_switch_channel(struct wcn36xx *wcn,\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c-1064-\ndrivers/net/wireless/ath/wcn36xx/smd.c:1065:static int wcn36xx_smd_process_ptt_msg_rsp(void *buf, size_t len,\ndrivers/net/wireless/ath/wcn36xx/smd.c-1066-\t\t\t\t\t void **p_ptt_rsp_msg)\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c=1096=int wcn36xx_smd_process_ptt_msg(struct wcn36xx *wcn,\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c-1121-\t}\ndrivers/net/wireless/ath/wcn36xx/smd.c:1122:\tret = wcn36xx_smd_process_ptt_msg_rsp(wcn-\u003ehal_buf, wcn-\u003ehal_rsp_len,\ndrivers/net/wireless/ath/wcn36xx/smd.c-1123-\t\t\t\t\t ptt_rsp_msg);\n"
} |
| 17/2 | 2026/09/07 07:48 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 27284 output: 28 thoughts: 24 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Analyzing the Callers of `wcn36xx_smd_process_ptt_msg`** Okay, so I need to understand the control flow around `wcn36xx_smd_process_ptt_msg`. The goal is to figure out what events trigger it, and how it fits into the broader picture of the WCN36xx driver's PTT (Push-To-Talk) functionality. First things first: I need to locate all the places where this function is actually called. I'll need to figure out what functions call `wcn36xx_smd_process_ptt_msg`. I'll start with a straightforward code search. |
| 18/2 | 2026/09/07 07:48 | tool | grepper |
0mArgs:{
"Expression": "wcn36xx_smd_process_ptt_msg"
}Results: {
"Output": "drivers/net/wireless/ath/wcn36xx/smd.c=1034=int wcn36xx_smd_switch_channel(struct wcn36xx *wcn,\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c-1064-\ndrivers/net/wireless/ath/wcn36xx/smd.c:1065:static int wcn36xx_smd_process_ptt_msg_rsp(void *buf, size_t len,\ndrivers/net/wireless/ath/wcn36xx/smd.c-1066-\t\t\t\t\t void **p_ptt_rsp_msg)\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c-1095-\ndrivers/net/wireless/ath/wcn36xx/smd.c:1096:int wcn36xx_smd_process_ptt_msg(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/smd.c-1097-\t\t\t\tstruct ieee80211_vif *vif, void *ptt_msg, size_t len,\n--\ndrivers/net/wireless/ath/wcn36xx/smd.c-1121-\t}\ndrivers/net/wireless/ath/wcn36xx/smd.c:1122:\tret = wcn36xx_smd_process_ptt_msg_rsp(wcn-\u003ehal_buf, wcn-\u003ehal_rsp_len,\ndrivers/net/wireless/ath/wcn36xx/smd.c-1123-\t\t\t\t\t ptt_rsp_msg);\n--\ndrivers/net/wireless/ath/wcn36xx/smd.h=89=int wcn36xx_smd_switch_channel(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/smd.h-90-\t\t\t struct ieee80211_vif *vif, int ch);\ndrivers/net/wireless/ath/wcn36xx/smd.h:91:int wcn36xx_smd_process_ptt_msg(struct wcn36xx *wcn,\ndrivers/net/wireless/ath/wcn36xx/smd.h-92-\t\t\t\tstruct ieee80211_vif *vif,\n--\ndrivers/net/wireless/ath/wcn36xx/testmode.c=43=static int wcn36xx_tm_cmd_ptt(struct wcn36xx *wcn, struct ieee80211_vif *vif,\n--\ndrivers/net/wireless/ath/wcn36xx/testmode.c-83-\ndrivers/net/wireless/ath/wcn36xx/testmode.c:84:\t\tmsg-\u003eresp_status = wcn36xx_smd_process_ptt_msg(wcn, vif, msg,\ndrivers/net/wireless/ath/wcn36xx/testmode.c-85-\t\t\t\t\t\t\t msg-\u003emsg_body_length, (void *)(\u0026rsp));\n"
} |
| 19/2 | 2026/09/07 07:48 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 28291 output: 130 thoughts: 828 Thoughts: **Analyzing Reachability of `wcn36xx` for Fuzzing** Okay, let's break this down. The guide says if something's structurally unreachable hardware, we can set `WorthFuzzing` to `false`. That means things like vendor-specific PCIe switches or drivers that rely on physical hardware not emulated in standard QEMU are out. Also, driver teardown callbacks or code paths exclusive to different architectures are also a no-go. Now, let's look at `wcn36xx`. I know this – it's the Qualcomm Atheros wireless chipset, usually found integrated on Snapdragon platforms. It speaks Qualcomm SMD/RPMSG, uses WCNSS, and needs a device tree with a `qcom,wcnss-wlan` node. The catch? Standard QEMU, the x86_64/amd64 setup, doesn't emulate any of that Qualcomm hardware. No WCNSS, no SMD/RPMSG, nothing. And it's even worse – the target architecture is amd64, meaning even if we were using an ARM QEMU, the proprietary stuff isn't simulated. So, let's confirm the specific points: the target architecture is amd64. I'm focusing on the `wcn36xx_smd_process_ptt_msg_rsp` function in `drivers/net/wireless/ath/wcn36xx/smd.c`. Can `wcn36xx` be probed on amd64 in a virtualized environment like syzkaller? Nope. It *requires* the `qcom,wcnss-wlan` device tree node and several Qualcomm-specific parent drivers like `qcom_wcnss_open_channel`, and access to things like `qcom_smem_state_get` and `qcom,mmio`. None of that exists in a standard QEMU on amd64. To recap, the reasoning is solid. The modified code lives in the `wcn36xx` driver, which depends entirely on Qualcomm-specific hardware and subsystems. Device Tree is essential. This can't be instantiated or emulated in a standard x86_64/amd64 QEMU environment. It's fundamentally unreachable for fuzzing. Therefore, `WorthFuzzing` is unequivocally `false`. No relevant configuration options or specific symbols to focus on here, either. Time to mark this as unreachable and move on. |
| 20/2 | 2026/09/07 07:48 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Atheros WCN3660/3680 driver (drivers/net/wireless/ath/wcn36xx/smd.c). This driver is a platform driver tied to Qualcomm Snapdragon SoC hardware (requiring Qualcomm WCNSS, SMD/RPMSG, SMEM, and Device Tree mmio resources), which is structurally unreachable and not emulated in standard virtualized QEMU environments on the target architecture (amd64).",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Atheros WCN3660/3680 driver (drivers/net/wireless/ath/wcn36xx/smd.c). This driver is a platform driver tied to Qualcomm Snapdragon SoC hardware (requiring Qualcomm WCNSS, SMD/RPMSG, SMEM, and Device Tree mmio resources), which is structurally unreachable and not emulated in standard virtualized QEMU environments on the target architecture (amd64).",
"WorthFuzzing": false
} |
| 21/1 | 2026/09/07 07:48 | 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) |
|---|