AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/09/04 20:10 flow patch-triage
0m Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "KMSANReasoning": "",
  "NeedsKMSAN": false,
  "Reasoning": "The patch modifies ath12k_mac_update_freq_range in the ath12k driver. ath12k is a vendor-specific driver for Qualcomm Wi-Fi 7 PCIe/AHB hardware devices, which requires physical hardware and cannot be emulated or probed in standard virtualized fuzzing environments (QEMU/GCE), making the modified code structurally unreachable.",
  "WorthFuzzing": false
}

1/1 2026/09/04 20:10 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit d90b087b91ced5eebf608e7cd15375f7415ab237\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Fri Sep 4 20:10:09 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c\nindex 99bf5cf79d102..654c58d7c1d5f 100644\n--- a/drivers/net/wireless/ath/ath12k/mac.c\n+++ b/drivers/net/wireless/ath/ath12k/mac.c\n@@ -14125,7 +14125,7 @@ EXPORT_SYMBOL(ath12k_mac_op_set_rekey_data);\n void ath12k_mac_update_freq_range(struct ath12k *ar,\n \t\t\t\t  u32 freq_low, u32 freq_high)\n {\n-\tif (!(freq_low \u0026\u0026 freq_high))\n+\tif (!freq_low || freq_low \u003e= freq_high)\n \t\treturn;\n \n \tif (ar-\u003efreq_range.start_freq || ar-\u003efreq_range.end_freq) {\n"
}

2/1 2026/09/04 20:10 agent patch-evaluator
0m Model:
core

Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies ath12k_mac_update_freq_range in the ath12k driver. ath12k is a vendor-specific driver for Qualcomm Wi-Fi 7 PCIe/AHB hardware devices, which requires physical hardware and cannot be emulated or probed in standard virtualized fuzzing environments (QEMU/GCE), making the modified code 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 d90b087b91ced5eebf608e7cd15375f7415ab237
Author: syz-cluster <triage@syzkaller.com>
Date:   Fri Sep 4 20:10:09 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 99bf5cf79d102..654c58d7c1d5f 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -14125,7 +14125,7 @@ EXPORT_SYMBOL(ath12k_mac_op_set_rekey_data);
 void ath12k_mac_update_freq_range(struct ath12k *ar,
 				  u32 freq_low, u32 freq_high)
 {
-	if (!(freq_low && freq_high))
+	if (!freq_low || freq_low >= freq_high)
 		return;
 
 	if (ar->freq_range.start_freq || ar->freq_range.end_freq) {

3/2 2026/09/04 20:10 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 2920
							output: 85
							thoughts: 376
						

Thoughts:
**Analyzing the Patch for Fuzzing Potential**

Okay, let's take a look at this patch and decide if it's worth the time to fuzz with syzkaller. The diff is pretty straightforward; it seems to be in the `ath12k` wireless driver. Specifically, it's a conditional check related to frequency ranges. The original check was `if (!(freq_low && freq_high))`, which has been changed to `if (!freq_low || freq_low >= freq_high)`. This suggests a potential bug or vulnerability related to frequency range validation. That's a reasonable change, at first glance.

First, I need to understand what `ath12k` *is*. I need to determine if this driver is something that's likely to be reached in a standard, virtualized environment, like QEMU or Google Compute Engine. If it requires specialized hardware, that greatly increases the overhead of fuzzing. I'll need to check the Kconfig and bus type definitions in `drivers/net/wireless/ath/ath12k/` to get a handle on this, and see what the device depends on.

I'll use `grepper` (or `read-file` if the grep fails) to quickly scan through the code base and configuration files related to `ath12k` to gather this information. My goal is to quickly ascertain the accessibility of this code for a standard fuzzing setup. Based on that assessment, I'll then decide if this patch is a good candidate for syzkaller.



4/2 2026/09/04 20:10 tool grepper
0m Args:
{
  "Expression": "ath12k_mac_update_freq_range",
  "PathPrefix": "drivers/net/wireless/ath/ath12k"
}

Results:
{
  "Output": "drivers/net/wireless/ath/ath12k/mac.c=14123=EXPORT_SYMBOL(ath12k_mac_op_set_rekey_data);\ndrivers/net/wireless/ath/ath12k/mac.c-14124-\ndrivers/net/wireless/ath/ath12k/mac.c:14125:void ath12k_mac_update_freq_range(struct ath12k *ar,\ndrivers/net/wireless/ath/ath12k/mac.c-14126-\t\t\t\t  u32 freq_low, u32 freq_high)\n--\ndrivers/net/wireless/ath/ath12k/mac.c=14225=static int ath12k_mac_setup_channels_rates(struct ath12k *ar,\n--\ndrivers/net/wireless/ath/ath12k/mac.c-14271-\ndrivers/net/wireless/ath/ath12k/mac.c:14272:\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/mac.c-14273-\n--\ndrivers/net/wireless/ath/ath12k/mac.c-14316-\ndrivers/net/wireless/ath/ath12k/mac.c:14317:\t\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/mac.c-14318-\t\t\tah-\u003euse_6ghz_regd = true;\n--\ndrivers/net/wireless/ath/ath12k/mac.c-14373-\ndrivers/net/wireless/ath/ath12k/mac.c:14374:\t\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/mac.c-14375-\n--\ndrivers/net/wireless/ath/ath12k/mac.h=204=int ath12k_mac_get_fw_stats(struct ath12k *ar, struct ath12k_fw_stats_req_params *param);\ndrivers/net/wireless/ath/ath12k/mac.h:205:void ath12k_mac_update_freq_range(struct ath12k *ar,\ndrivers/net/wireless/ath/ath12k/mac.h-206-\t\t\t\t  u32 freq_low, u32 freq_high);\n--\ndrivers/net/wireless/ath/ath12k/reg.c=269=int ath12k_regd_update(struct ath12k *ar, bool init)\n--\ndrivers/net/wireless/ath/ath12k/reg.c-309-\ndrivers/net/wireless/ath/ath12k/reg.c:310:\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/reg.c-311-\t}\n--\ndrivers/net/wireless/ath/ath12k/reg.c-321-\ndrivers/net/wireless/ath/ath12k/reg.c:322:\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/reg.c-323-\t}\n--\ndrivers/net/wireless/ath/ath12k/reg.c-328-\ndrivers/net/wireless/ath/ath12k/reg.c:329:\t\tath12k_mac_update_freq_range(ar, freq_low, freq_high);\ndrivers/net/wireless/ath/ath12k/reg.c-330-\t}\n"
}

5/2 2026/09/04 20:10 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/ath/ath12k/Kconfig",
  "FirstLine": 1,
  "LineCount": 50
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: BSD-3-Clause-Clear\n   2:\tconfig ATH12K\n   3:\t\ttristate \"Qualcomm Wi-Fi 7 support (ath12k)\"\n   4:\t\tdepends on MAC80211 \u0026\u0026 HAS_DMA \u0026\u0026 PCI\n   5:\t\tselect QCOM_QMI_HELPERS\n   6:\t\tselect MHI_BUS\n   7:\t\tselect QRTR\n   8:\t\tselect QRTR_MHI\n   9:\t\tselect PCI_PWRCTRL_PWRSEQ if HAVE_PWRCTRL\n  10:\t\thelp\n  11:\t\t  Enable support for Qualcomm Technologies Wi-Fi 7 (IEEE\n  12:\t\t  802.11be) family of chipsets, for example WCN7850 and\n  13:\t\t  QCN9274.\n  14:\t\n  15:\t\t  If you choose to build a module, it'll be called ath12k.\n  16:\t\n  17:\tconfig ATH12K_AHB\n  18:\t\tbool \"Qualcomm ath12k AHB support\"\n  19:\t\tdepends on ATH12K \u0026\u0026 REMOTEPROC\n  20:\t\tselect QCOM_MDT_LOADER\n  21:\t\tselect QCOM_PAS\n  22:\t\thelp\n  23:\t\t  Enable support for Ath12k AHB bus chipsets, example IPQ5332.\n  24:\t\n  25:\tconfig ATH12K_DEBUG\n  26:\t\tbool \"ath12k debugging\"\n  27:\t\tdepends on ATH12K\n  28:\t\thelp\n  29:\t\t  Enable debug support, for example debug messages which must\n  30:\t\t  be enabled separately using the debug_mask module parameter.\n  31:\t\n  32:\t\t  If unsure, say Y to make it easier to debug problems. But if\n  33:\t\t  you want optimal performance choose N.\n  34:\t\n  35:\tconfig ATH12K_DEBUGFS\n  36:\t\tbool \"Qualcomm ath12k debugfs support\"\n  37:\t\tdepends on ATH12K \u0026\u0026 MAC80211_DEBUGFS\n  38:\t\thelp\n  39:\t\t  Enable ath12k debugfs support\n  40:\t\n  41:\t\t  If unsure, say Y to make it easier to debug problems. But if\n  42:\t\t  you want optimal performance choose N.\n  43:\t\n  44:\tconfig ATH12K_TRACING\n  45:\t\tbool \"ath12k tracing support\"\n  46:\t\tdepends on ATH12K \u0026\u0026 EVENT_TRACING\n  47:\t\thelp\n  48:\t\t  Enable ath12k tracing infrastructure.\n  49:\t\n  50:\t\t  If unsure, say Y to make it easier to debug problems. But if\n"
}

6/2 2026/09/04 20:10 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 5413
							output: 42
							thoughts: 351
						

Thoughts:
**My Assessment of ath12k's Virtualization Feasibility**

Okay, so `ath12k` – that's the Qualcomm Wi-Fi 7 driver, specifically for the WCN7850 and QCN9274, dealing with PCI and AHB interfaces. My immediate thought is, can I even *touch* this thing in a standard virtualized environment like QEMU or Google Compute Engine?

The driver is clearly tied to the hardware: it's a PCI/AHB driver for these specific Qualcomm Wi-Fi 7 cards. So, I need to figure out if there's any chance of emulation, or if it's strictly dependent on having the physical Qualcomm hardware, the firmware, and that MHI bus connection.

The criteria I'm using state that if something's structurally unreachable, like vendor-specific PCIe switches, SmartNICs, GPU drivers (think mlxsw, pds_core, qed, ionic, amdgpu), and *especially* drivers that require the actual ASIC/PCIe cards that QEMU doesn't emulate, then it's a no-go for WorthFuzzing.

I'm thinking, "what hardware does ath12k *actually* support?" It's Qualcomm Wi-Fi 7 devices using PCIe/AHB. Okay, so now I need to determine if standard QEMU or GCE offer anything like an emulated ath12k device. And the answer is likely no. QEMU generally has other options, like mac80211_hwsim, virtio-net, e1000, rtl8139, or even USB gadget Wi-Fi devices, but `ath12k` is specifically PCI/AHB.

Let's drill down and confirm by examining `drivers/net/wireless/ath/ath12k/pci.c` and `ahb.c` to see if that reinforces the hardware dependencies.



7/2 2026/09/04 20:10 tool grepper
0m Args:
{
  "Expression": "ath12k_",
  "PathPrefix": "drivers/net/wireless/ath/ath12k/pci.c"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 1058 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/ath/ath12k/pci.c-38-\ndrivers/net/wireless/ath/ath12k/pci.c:39:static struct ath12k_pci_driver *ath12k_pci_family_drivers[ATH12K_DEVICE_FAMILY_MAX];\ndrivers/net/wireless/ath/ath12k/pci.c:40:static const struct ath12k_msi_config msi_config_one_msi = {\ndrivers/net/wireless/ath/ath12k/pci.c-41-\t.total_vectors = 1,\ndrivers/net/wireless/ath/ath12k/pci.c-42-\t.total_users = 4,\ndrivers/net/wireless/ath/ath12k/pci.c:43:\t.users = (struct ath12k_msi_user[]) {\ndrivers/net/wireless/ath/ath12k/pci.c-44-\t\t{ .name = \"MHI\", .num_vectors = 3, .base_vector = 0 },\n--\ndrivers/net/wireless/ath/ath12k/pci.c=51=static const char *irq_name[ATH12K_IRQ_NUM_MAX] = {\n--\ndrivers/net/wireless/ath/ath12k/pci.c-109-\ndrivers/net/wireless/ath/ath12k/pci.c:110:static void ath12k_pci_select_window(struct ath12k_pci *ab_pci, u32 offset)\ndrivers/net/wireless/ath/ath12k/pci.c-111-{\ndrivers/net/wireless/ath/ath12k/pci.c:112:\tstruct ath12k_base *ab = ab_pci-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-113-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-130-\ndrivers/net/wireless/ath/ath12k/pci.c:131:static void ath12k_pci_select_static_window(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-132-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-147-\ndrivers/net/wireless/ath/ath12k/pci.c:148:static u32 ath12k_pci_get_window_start(struct ath12k_base *ab,\ndrivers/net/wireless/ath/ath12k/pci.c-149-\t\t\t\t       u32 offset)\ndrivers/net/wireless/ath/ath12k/pci.c-150-{\ndrivers/net/wireless/ath/ath12k/pci.c:151:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-152-\tu32 window_start;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-165-\ndrivers/net/wireless/ath/ath12k/pci.c:166:static inline bool ath12k_pci_is_offset_within_mhi_region(u32 offset)\ndrivers/net/wireless/ath/ath12k/pci.c-167-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-170-\ndrivers/net/wireless/ath/ath12k/pci.c:171:static void ath12k_pci_restore_window(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-172-{\ndrivers/net/wireless/ath/ath12k/pci.c:173:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-174-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-183-\ndrivers/net/wireless/ath/ath12k/pci.c:184:static void ath12k_pci_soc_global_reset(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-185-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-187-\ndrivers/net/wireless/ath/ath12k/pci.c:188:\tval = ath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);\ndrivers/net/wireless/ath/ath12k/pci.c-189-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-191-\ndrivers/net/wireless/ath/ath12k/pci.c:192:\tath12k_pci_write32(ab, PCIE_SOC_GLOBAL_RESET, val);\ndrivers/net/wireless/ath/ath12k/pci.c-193-\t/* Flush the posted write to the device */\ndrivers/net/wireless/ath/ath12k/pci.c:194:\tath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);\ndrivers/net/wireless/ath/ath12k/pci.c-195-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-202-\ndrivers/net/wireless/ath/ath12k/pci.c:203:\tath12k_pci_write32(ab, PCIE_SOC_GLOBAL_RESET, val);\ndrivers/net/wireless/ath/ath12k/pci.c-204-\t/* Flush the posted write to the device */\ndrivers/net/wireless/ath/ath12k/pci.c:205:\tath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);\ndrivers/net/wireless/ath/ath12k/pci.c-206-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-208-\ndrivers/net/wireless/ath/ath12k/pci.c:209:\tval = ath12k_pci_read32(ab, PCIE_SOC_GLOBAL_RESET);\ndrivers/net/wireless/ath/ath12k/pci.c-210-\tif (val == 0xffffffff)\ndrivers/net/wireless/ath/ath12k/pci.c:211:\t\tath12k_warn(ab, \"link down error during global reset\\n\");\ndrivers/net/wireless/ath/ath12k/pci.c-212-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-215-\t */\ndrivers/net/wireless/ath/ath12k/pci.c:216:\tath12k_pci_restore_window(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-217-}\ndrivers/net/wireless/ath/ath12k/pci.c-218-\ndrivers/net/wireless/ath/ath12k/pci.c:219:static void ath12k_pci_clear_dbg_registers(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-220-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-223-\t/* read cookie */\ndrivers/net/wireless/ath/ath12k/pci.c:224:\tval = ath12k_pci_read32(ab, PCIE_Q6_COOKIE_ADDR);\ndrivers/net/wireless/ath/ath12k/pci.c:225:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"cookie:0x%x\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-226-\ndrivers/net/wireless/ath/ath12k/pci.c:227:\tval = ath12k_pci_read32(ab, WLAON_WARM_SW_ENTRY);\ndrivers/net/wireless/ath/ath12k/pci.c:228:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"WLAON_WARM_SW_ENTRY 0x%x\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-229-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-235-\t */\ndrivers/net/wireless/ath/ath12k/pci.c:236:\tath12k_pci_write32(ab, WLAON_WARM_SW_ENTRY, 0);\ndrivers/net/wireless/ath/ath12k/pci.c-237-\tmdelay(10);\ndrivers/net/wireless/ath/ath12k/pci.c-238-\ndrivers/net/wireless/ath/ath12k/pci.c:239:\tval = ath12k_pci_read32(ab, WLAON_WARM_SW_ENTRY);\ndrivers/net/wireless/ath/ath12k/pci.c:240:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"WLAON_WARM_SW_ENTRY 0x%x\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-241-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-244-\t */\ndrivers/net/wireless/ath/ath12k/pci.c:245:\tval = ath12k_pci_read32(ab, WLAON_SOC_RESET_CAUSE_REG);\ndrivers/net/wireless/ath/ath12k/pci.c:246:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"soc reset cause:%d\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-247-}\ndrivers/net/wireless/ath/ath12k/pci.c-248-\ndrivers/net/wireless/ath/ath12k/pci.c:249:static void ath12k_pci_enable_ltssm(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-250-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-253-\ndrivers/net/wireless/ath/ath12k/pci.c:254:\tval = ath12k_pci_read32(ab, PCIE_PCIE_PARF_LTSSM);\ndrivers/net/wireless/ath/ath12k/pci.c-255-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-260-\ndrivers/net/wireless/ath/ath12k/pci.c:261:\t\tath12k_pci_write32(ab, PCIE_PCIE_PARF_LTSSM, PARM_LTSSM_VALUE);\ndrivers/net/wireless/ath/ath12k/pci.c:262:\t\tval = ath12k_pci_read32(ab, PCIE_PCIE_PARF_LTSSM);\ndrivers/net/wireless/ath/ath12k/pci.c-263-\t}\ndrivers/net/wireless/ath/ath12k/pci.c-264-\ndrivers/net/wireless/ath/ath12k/pci.c:265:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"pci ltssm 0x%x\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-266-\ndrivers/net/wireless/ath/ath12k/pci.c:267:\tval = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab));\ndrivers/net/wireless/ath/ath12k/pci.c-268-\tval |= GCC_GCC_PCIE_HOT_RST_VAL;\ndrivers/net/wireless/ath/ath12k/pci.c:269:\tath12k_pci_write32(ab, GCC_GCC_PCIE_HOT_RST(ab), val);\ndrivers/net/wireless/ath/ath12k/pci.c:270:\tval = ath12k_pci_read32(ab, GCC_GCC_PCIE_HOT_RST(ab));\ndrivers/net/wireless/ath/ath12k/pci.c-271-\ndrivers/net/wireless/ath/ath12k/pci.c:272:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"pci pcie_hot_rst 0x%x\\n\", val);\ndrivers/net/wireless/ath/ath12k/pci.c-273-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-276-\ndrivers/net/wireless/ath/ath12k/pci.c:277:static void ath12k_pci_clear_all_intrs(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-278-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-283-\t */\ndrivers/net/wireless/ath/ath12k/pci.c:284:\tath12k_pci_write32(ab, PCIE_PCIE_INT_ALL_CLEAR, PCIE_INT_CLEAR_ALL);\ndrivers/net/wireless/ath/ath12k/pci.c-285-}\ndrivers/net/wireless/ath/ath12k/pci.c-286-\ndrivers/net/wireless/ath/ath12k/pci.c:287:static void ath12k_pci_set_wlaon_pwr_ctrl(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-288-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-290-\ndrivers/net/wireless/ath/ath12k/pci.c:291:\tval = ath12k_pci_read32(ab, WLAON_QFPROM_PWR_CTRL_REG);\ndrivers/net/wireless/ath/ath12k/pci.c-292-\tval \u0026= ~QFPROM_PWR_CTRL_VDD4BLOW_MASK;\ndrivers/net/wireless/ath/ath12k/pci.c:293:\tath12k_pci_write32(ab, WLAON_QFPROM_PWR_CTRL_REG, val);\ndrivers/net/wireless/ath/ath12k/pci.c-294-}\ndrivers/net/wireless/ath/ath12k/pci.c-295-\ndrivers/net/wireless/ath/ath12k/pci.c:296:static void ath12k_pci_force_wake(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-297-{\ndrivers/net/wireless/ath/ath12k/pci.c:298:\tath12k_pci_write32(ab, PCIE_SOC_WAKE_PCIE_LOCAL_REG, 1);\ndrivers/net/wireless/ath/ath12k/pci.c-299-\tmdelay(5);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-301-\ndrivers/net/wireless/ath/ath12k/pci.c:302:static void ath12k_pci_sw_reset(struct ath12k_base *ab, bool power_on)\ndrivers/net/wireless/ath/ath12k/pci.c-303-{\ndrivers/net/wireless/ath/ath12k/pci.c-304-\tif (power_on) {\ndrivers/net/wireless/ath/ath12k/pci.c:305:\t\tath12k_pci_enable_ltssm(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:306:\t\tath12k_pci_clear_all_intrs(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:307:\t\tath12k_pci_set_wlaon_pwr_ctrl(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-308-\t}\ndrivers/net/wireless/ath/ath12k/pci.c-309-\ndrivers/net/wireless/ath/ath12k/pci.c:310:\tath12k_mhi_clear_vector(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:311:\tath12k_pci_clear_dbg_registers(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:312:\tath12k_pci_soc_global_reset(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:313:\tath12k_mhi_set_mhictrl_reset(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-314-}\ndrivers/net/wireless/ath/ath12k/pci.c-315-\ndrivers/net/wireless/ath/ath12k/pci.c:316:static void ath12k_pci_free_ext_irq(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-317-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-320-\tfor (i = 0; i \u003c ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:321:\t\tstruct ath12k_ext_irq_grp *irq_grp = \u0026ab-\u003eext_irq_grp[i];\ndrivers/net/wireless/ath/ath12k/pci.c-322-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-330-\ndrivers/net/wireless/ath/ath12k/pci.c:331:static void ath12k_pci_free_irq(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-332-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-335-\tfor (i = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:336:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-337-\t\t\tcontinue;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-341-\ndrivers/net/wireless/ath/ath12k/pci.c:342:\tath12k_pci_free_ext_irq(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-343-}\ndrivers/net/wireless/ath/ath12k/pci.c-344-\ndrivers/net/wireless/ath/ath12k/pci.c:345:static void ath12k_pci_ce_irq_enable(struct ath12k_base *ab, u16 ce_id)\ndrivers/net/wireless/ath/ath12k/pci.c-346-{\ndrivers/net/wireless/ath/ath12k/pci.c:347:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-348-\tu32 irq_idx;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-359-\ndrivers/net/wireless/ath/ath12k/pci.c:360:static void ath12k_pci_ce_irq_disable(struct ath12k_base *ab, u16 ce_id)\ndrivers/net/wireless/ath/ath12k/pci.c-361-{\ndrivers/net/wireless/ath/ath12k/pci.c:362:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-363-\tu32 irq_idx;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-374-\ndrivers/net/wireless/ath/ath12k/pci.c:375:static void ath12k_pci_ce_irqs_disable(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-376-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-381-\tfor (i = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:382:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-383-\t\t\tcontinue;\ndrivers/net/wireless/ath/ath12k/pci.c:384:\t\tath12k_pci_ce_irq_disable(ab, i);\ndrivers/net/wireless/ath/ath12k/pci.c-385-\t}\n--\ndrivers/net/wireless/ath/ath12k/pci.c-387-\ndrivers/net/wireless/ath/ath12k/pci.c:388:static void ath12k_pci_sync_ce_irqs(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-389-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-393-\tfor (i = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:394:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-395-\t\t\tcontinue;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-401-\ndrivers/net/wireless/ath/ath12k/pci.c:402:static void ath12k_pci_ce_workqueue(struct work_struct *work)\ndrivers/net/wireless/ath/ath12k/pci.c-403-{\ndrivers/net/wireless/ath/ath12k/pci.c:404:\tstruct ath12k_ce_pipe *ce_pipe = from_work(ce_pipe, work, intr_wq);\ndrivers/net/wireless/ath/ath12k/pci.c-405-\tint irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe-\u003epipe_num;\ndrivers/net/wireless/ath/ath12k/pci.c-406-\ndrivers/net/wireless/ath/ath12k/pci.c:407:\tath12k_ce_per_engine_service(ce_pipe-\u003eab, ce_pipe-\u003epipe_num);\ndrivers/net/wireless/ath/ath12k/pci.c-408-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-411-\ndrivers/net/wireless/ath/ath12k/pci.c:412:static irqreturn_t ath12k_pci_ce_interrupt_handler(int irq, void *arg)\ndrivers/net/wireless/ath/ath12k/pci.c-413-{\ndrivers/net/wireless/ath/ath12k/pci.c:414:\tstruct ath12k_ce_pipe *ce_pipe = arg;\ndrivers/net/wireless/ath/ath12k/pci.c:415:\tstruct ath12k_base *ab = ce_pipe-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-416-\tint irq_idx = ATH12K_PCI_IRQ_CE0_OFFSET + ce_pipe-\u003epipe_num;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-430-\ndrivers/net/wireless/ath/ath12k/pci.c:431:static void ath12k_pci_ext_grp_disable(struct ath12k_ext_irq_grp *irq_grp)\ndrivers/net/wireless/ath/ath12k/pci.c-432-{\ndrivers/net/wireless/ath/ath12k/pci.c:433:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp-\u003eab);\ndrivers/net/wireless/ath/ath12k/pci.c-434-\tint i;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-445-\ndrivers/net/wireless/ath/ath12k/pci.c:446:static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-447-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-453-\tfor (i = 0; i \u003c ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:454:\t\tstruct ath12k_ext_irq_grp *irq_grp = \u0026ab-\u003eext_irq_grp[i];\ndrivers/net/wireless/ath/ath12k/pci.c-455-\ndrivers/net/wireless/ath/ath12k/pci.c:456:\t\tath12k_pci_ext_grp_disable(irq_grp);\ndrivers/net/wireless/ath/ath12k/pci.c-457-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-465-\ndrivers/net/wireless/ath/ath12k/pci.c:466:static void ath12k_pci_ext_grp_enable(struct ath12k_ext_irq_grp *irq_grp)\ndrivers/net/wireless/ath/ath12k/pci.c-467-{\ndrivers/net/wireless/ath/ath12k/pci.c:468:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(irq_grp-\u003eab);\ndrivers/net/wireless/ath/ath12k/pci.c-469-\tint i;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-480-\ndrivers/net/wireless/ath/ath12k/pci.c:481:static void ath12k_pci_sync_ext_irqs(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-482-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-485-\tfor (i = 0; i \u003c ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:486:\t\tstruct ath12k_ext_irq_grp *irq_grp = \u0026ab-\u003eext_irq_grp[i];\ndrivers/net/wireless/ath/ath12k/pci.c-487-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-494-\ndrivers/net/wireless/ath/ath12k/pci.c:495:static int ath12k_pci_ext_grp_napi_poll(struct napi_struct *napi, int budget)\ndrivers/net/wireless/ath/ath12k/pci.c-496-{\ndrivers/net/wireless/ath/ath12k/pci.c:497:\tstruct ath12k_ext_irq_grp *irq_grp = container_of(napi,\ndrivers/net/wireless/ath/ath12k/pci.c:498:\t\t\t\t\t\tstruct ath12k_ext_irq_grp,\ndrivers/net/wireless/ath/ath12k/pci.c-499-\t\t\t\t\t\tnapi);\ndrivers/net/wireless/ath/ath12k/pci.c:500:\tstruct ath12k_base *ab = irq_grp-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c:501:\tstruct ath12k_dp *dp = ath12k_ab_to_dp(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-502-\tint work_done;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-504-\ndrivers/net/wireless/ath/ath12k/pci.c:505:\twork_done = ath12k_dp_service_srng(dp, irq_grp, budget);\ndrivers/net/wireless/ath/ath12k/pci.c-506-\tif (work_done \u003c budget) {\n--\ndrivers/net/wireless/ath/ath12k/pci.c-517-\ndrivers/net/wireless/ath/ath12k/pci.c:518:static irqreturn_t ath12k_pci_ext_interrupt_handler(int irq, void *arg)\ndrivers/net/wireless/ath/ath12k/pci.c-519-{\ndrivers/net/wireless/ath/ath12k/pci.c:520:\tstruct ath12k_ext_irq_grp *irq_grp = arg;\ndrivers/net/wireless/ath/ath12k/pci.c:521:\tstruct ath12k_base *ab = irq_grp-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-522-\tint i;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-526-\ndrivers/net/wireless/ath/ath12k/pci.c:527:\tath12k_dbg(irq_grp-\u003eab, ATH12K_DBG_PCI, \"ext irq:%d\\n\", irq);\ndrivers/net/wireless/ath/ath12k/pci.c-528-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-539-\ndrivers/net/wireless/ath/ath12k/pci.c:540:static int ath12k_pci_ext_irq_config(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-541-{\ndrivers/net/wireless/ath/ath12k/pci.c:542:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-543-\tint i, j, n, ret, num_vectors = 0;\ndrivers/net/wireless/ath/ath12k/pci.c-544-\tu32 user_base_data = 0, base_vector = 0, base_idx;\ndrivers/net/wireless/ath/ath12k/pci.c:545:\tstruct ath12k_ext_irq_grp *irq_grp;\ndrivers/net/wireless/ath/ath12k/pci.c-546-\tbool threaded_napi = false;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-549-\tbase_idx = ATH12K_PCI_IRQ_CE0_OFFSET + CE_COUNT_MAX;\ndrivers/net/wireless/ath/ath12k/pci.c:550:\tret = ath12k_pci_get_user_msi_assignment(ab, \"DP\",\ndrivers/net/wireless/ath/ath12k/pci.c-551-\t\t\t\t\t\t \u0026num_vectors,\n--\ndrivers/net/wireless/ath/ath12k/pci.c-556-\ndrivers/net/wireless/ath/ath12k/pci.c:557:\tirq = ath12k_pci_get_msi_irq(ab-\u003edev, base_vector);\ndrivers/net/wireless/ath/ath12k/pci.c-558-\tif (irq \u003e= 0)\n--\ndrivers/net/wireless/ath/ath12k/pci.c-573-\t\tnetif_napi_add(irq_grp-\u003enapi_ndev, \u0026irq_grp-\u003enapi,\ndrivers/net/wireless/ath/ath12k/pci.c:574:\t\t\t       ath12k_pci_ext_grp_napi_poll);\ndrivers/net/wireless/ath/ath12k/pci.c-575-\t\tif (threaded_napi)\n--\ndrivers/net/wireless/ath/ath12k/pci.c-595-\ndrivers/net/wireless/ath/ath12k/pci.c:596:\t\t\tirq = ath12k_pci_get_msi_irq(ab-\u003edev, vector);\ndrivers/net/wireless/ath/ath12k/pci.c-597-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-599-\ndrivers/net/wireless/ath/ath12k/pci.c:600:\t\t\tath12k_dbg(ab, ATH12K_DBG_PCI,\ndrivers/net/wireless/ath/ath12k/pci.c-601-\t\t\t\t   \"irq:%d group:%d\\n\", irq, i);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-603-\t\t\tirq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);\ndrivers/net/wireless/ath/ath12k/pci.c:604:\t\t\tret = request_irq(irq, ath12k_pci_ext_interrupt_handler,\ndrivers/net/wireless/ath/ath12k/pci.c-605-\t\t\t\t\t  ab_pci-\u003eirq_flags,\n--\ndrivers/net/wireless/ath/ath12k/pci.c-607-\t\t\tif (ret) {\ndrivers/net/wireless/ath/ath12k/pci.c:608:\t\t\t\tath12k_err(ab, \"failed request irq %d: %d\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c-609-\t\t\t\t\t   vector, ret);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-612-\t\t}\ndrivers/net/wireless/ath/ath12k/pci.c:613:\t\tath12k_pci_ext_grp_disable(irq_grp);\ndrivers/net/wireless/ath/ath12k/pci.c-614-\t}\n--\ndrivers/net/wireless/ath/ath12k/pci.c-628-\ndrivers/net/wireless/ath/ath12k/pci.c:629:static int ath12k_pci_set_irq_affinity_hint(struct ath12k_pci *ab_pci,\ndrivers/net/wireless/ath/ath12k/pci.c-630-\t\t\t\t\t    const struct cpumask *m)\n--\ndrivers/net/wireless/ath/ath12k/pci.c-637-\ndrivers/net/wireless/ath/ath12k/pci.c:638:static int ath12k_pci_config_irq(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-639-{\ndrivers/net/wireless/ath/ath12k/pci.c:640:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c:641:\tstruct ath12k_ce_pipe *ce_pipe;\ndrivers/net/wireless/ath/ath12k/pci.c-642-\tu32 msi_data_start;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-647-\ndrivers/net/wireless/ath/ath12k/pci.c:648:\tret = ath12k_pci_get_user_msi_assignment(ab,\ndrivers/net/wireless/ath/ath12k/pci.c-649-\t\t\t\t\t\t \"CE\", \u0026msi_data_count,\n--\ndrivers/net/wireless/ath/ath12k/pci.c-656-\tfor (i = 0, msi_data_idx = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:657:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-658-\t\t\tcontinue;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-660-\t\tmsi_data = (msi_data_idx % msi_data_count) + msi_irq_start;\ndrivers/net/wireless/ath/ath12k/pci.c:661:\t\tirq = ath12k_pci_get_msi_irq(ab-\u003edev, msi_data);\ndrivers/net/wireless/ath/ath12k/pci.c-662-\t\tce_pipe = \u0026ab-\u003ece.ce_pipe[i];\n--\ndrivers/net/wireless/ath/ath12k/pci.c-665-\ndrivers/net/wireless/ath/ath12k/pci.c:666:\t\tINIT_WORK(\u0026ce_pipe-\u003eintr_wq, ath12k_pci_ce_workqueue);\ndrivers/net/wireless/ath/ath12k/pci.c-667-\ndrivers/net/wireless/ath/ath12k/pci.c:668:\t\tret = request_irq(irq, ath12k_pci_ce_interrupt_handler,\ndrivers/net/wireless/ath/ath12k/pci.c-669-\t\t\t\t  ab_pci-\u003eirq_flags, irq_name[irq_idx],\n--\ndrivers/net/wireless/ath/ath12k/pci.c-671-\t\tif (ret) {\ndrivers/net/wireless/ath/ath12k/pci.c:672:\t\t\tath12k_err(ab, \"failed to request irq %d: %d\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c-673-\t\t\t\t   irq_idx, ret);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-679-\ndrivers/net/wireless/ath/ath12k/pci.c:680:\t\tath12k_pci_ce_irq_disable(ab, i);\ndrivers/net/wireless/ath/ath12k/pci.c-681-\t}\ndrivers/net/wireless/ath/ath12k/pci.c-682-\ndrivers/net/wireless/ath/ath12k/pci.c:683:\tret = ath12k_pci_ext_irq_config(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-684-\tif (ret)\n--\ndrivers/net/wireless/ath/ath12k/pci.c-689-\ndrivers/net/wireless/ath/ath12k/pci.c:690:static void ath12k_pci_init_qmi_ce_config(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-691-{\ndrivers/net/wireless/ath/ath12k/pci.c:692:\tstruct ath12k_qmi_ce_cfg *cfg = \u0026ab-\u003eqmi.ce_cfg;\ndrivers/net/wireless/ath/ath12k/pci.c-693-\ndrivers/net/wireless/ath/ath12k/pci.c:694:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-695-\tstruct pci_bus *bus = ab_pci-\u003epdev-\u003ebus;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-703-\ndrivers/net/wireless/ath/ath12k/pci.c:704:\tif (ath12k_fw_feature_supported(ab, ATH12K_FW_FEATURE_MULTI_QRTR_ID)) {\ndrivers/net/wireless/ath/ath12k/pci.c-705-\t\tab_pci-\u003eqmi_instance =\n--\ndrivers/net/wireless/ath/ath12k/pci.c-711-\ndrivers/net/wireless/ath/ath12k/pci.c:712:static void ath12k_pci_ce_irqs_enable(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-713-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-718-\tfor (i = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:719:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-720-\t\t\tcontinue;\ndrivers/net/wireless/ath/ath12k/pci.c:721:\t\tath12k_pci_ce_irq_enable(ab, i);\ndrivers/net/wireless/ath/ath12k/pci.c-722-\t}\n--\ndrivers/net/wireless/ath/ath12k/pci.c-724-\ndrivers/net/wireless/ath/ath12k/pci.c:725:static void ath12k_pci_msi_config(struct ath12k_pci *ab_pci, bool enable)\ndrivers/net/wireless/ath/ath12k/pci.c-726-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-739-\ndrivers/net/wireless/ath/ath12k/pci.c:740:static void ath12k_pci_msi_enable(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-741-{\ndrivers/net/wireless/ath/ath12k/pci.c:742:\tath12k_pci_msi_config(ab_pci, true);\ndrivers/net/wireless/ath/ath12k/pci.c-743-}\ndrivers/net/wireless/ath/ath12k/pci.c-744-\ndrivers/net/wireless/ath/ath12k/pci.c:745:static void ath12k_pci_msi_disable(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-746-{\ndrivers/net/wireless/ath/ath12k/pci.c:747:\tath12k_pci_msi_config(ab_pci, false);\ndrivers/net/wireless/ath/ath12k/pci.c-748-}\ndrivers/net/wireless/ath/ath12k/pci.c-749-\ndrivers/net/wireless/ath/ath12k/pci.c:750:static int ath12k_pci_msi_alloc(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-751-{\ndrivers/net/wireless/ath/ath12k/pci.c:752:\tstruct ath12k_base *ab = ab_pci-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c:753:\tconst struct ath12k_msi_config *msi_config = ab_pci-\u003emsi_config;\ndrivers/net/wireless/ath/ath12k/pci.c-754-\tstruct msi_desc *msi_desc;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-777-\t\tab_pci-\u003eirq_flags = IRQF_SHARED | IRQF_NOBALANCING;\ndrivers/net/wireless/ath/ath12k/pci.c:778:\t\tath12k_dbg(ab, ATH12K_DBG_PCI, \"request MSI one vector\\n\");\ndrivers/net/wireless/ath/ath12k/pci.c-779-\t}\ndrivers/net/wireless/ath/ath12k/pci.c-780-\ndrivers/net/wireless/ath/ath12k/pci.c:781:\tath12k_info(ab, \"MSI vectors: %d\\n\", num_vectors);\ndrivers/net/wireless/ath/ath12k/pci.c-782-\ndrivers/net/wireless/ath/ath12k/pci.c:783:\tath12k_pci_msi_disable(ab_pci);\ndrivers/net/wireless/ath/ath12k/pci.c-784-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-786-\tif (!msi_desc) {\ndrivers/net/wireless/ath/ath12k/pci.c:787:\t\tath12k_err(ab, \"msi_desc is NULL!\\n\");\ndrivers/net/wireless/ath/ath12k/pci.c-788-\t\tret = -EINVAL;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-795-\ndrivers/net/wireless/ath/ath12k/pci.c:796:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"msi base data is %d\\n\", ab_pci-\u003emsi_ep_base_data);\ndrivers/net/wireless/ath/ath12k/pci.c-797-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-806-\ndrivers/net/wireless/ath/ath12k/pci.c:807:static void ath12k_pci_msi_free(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-808-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-811-\ndrivers/net/wireless/ath/ath12k/pci.c:812:static int ath12k_pci_config_msi_data(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-813-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-817-\tif (!msi_desc) {\ndrivers/net/wireless/ath/ath12k/pci.c:818:\t\tath12k_err(ab_pci-\u003eab, \"msi_desc is NULL!\\n\");\ndrivers/net/wireless/ath/ath12k/pci.c-819-\t\tpci_free_irq_vectors(ab_pci-\u003epdev);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-824-\ndrivers/net/wireless/ath/ath12k/pci.c:825:\tath12k_dbg(ab_pci-\u003eab, ATH12K_DBG_PCI, \"pci after request_irq msi_ep_base_data %d\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c-826-\t\t   ab_pci-\u003emsi_ep_base_data);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-830-\ndrivers/net/wireless/ath/ath12k/pci.c:831:static int ath12k_pci_claim(struct ath12k_pci *ab_pci, struct pci_dev *pdev)\ndrivers/net/wireless/ath/ath12k/pci.c-832-{\ndrivers/net/wireless/ath/ath12k/pci.c:833:\tstruct ath12k_base *ab = ab_pci-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-834-\tu16 device_id;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-838-\tif (device_id != ab_pci-\u003edev_id)  {\ndrivers/net/wireless/ath/ath12k/pci.c:839:\t\tath12k_err(ab, \"pci device id mismatch: 0x%x 0x%x\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c-840-\t\t\t   device_id, ab_pci-\u003edev_id);\n--\ndrivers/net/wireless/ath/ath12k/pci.c-846-\tif (ret) {\ndrivers/net/wireless/ath/ath12k/pci.c:847:\t\tath12k_err(ab, \"failed to assign pci resource: %d\\n\", ret);\ndrivers/net/wireless/ath/ath12k/pci.c-848-\t\tgoto out;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-852-\tif (ret) {\ndrivers/net/wireless/ath/ath12k/pci.c:853:\t\tath12k_err(ab, \"failed to enable pci device: %d\\n\", ret);\ndrivers/net/wireless/ath/ath12k/pci.c-854-\t\tgoto out;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-856-\ndrivers/net/wireless/ath/ath12k/pci.c:857:\tret = pci_request_region(pdev, ATH12K_PCI_BAR_NUM, \"ath12k_pci\");\ndrivers/net/wireless/ath/ath12k/pci.c-858-\tif (ret) {\ndrivers/net/wireless/ath/ath12k/pci.c:859:\t\tath12k_err(ab, \"failed to request pci region: %d\\n\", ret);\ndrivers/net/wireless/ath/ath12k/pci.c-860-\t\tgoto disable_device;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-871-\tif (!ab-\u003emem) {\ndrivers/net/wireless/ath/ath12k/pci.c:872:\t\tath12k_err(ab, \"failed to map pci bar %d\\n\", ATH12K_PCI_BAR_NUM);\ndrivers/net/wireless/ath/ath12k/pci.c-873-\t\tret = -EIO;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-876-\ndrivers/net/wireless/ath/ath12k/pci.c:877:\tath12k_dbg(ab, ATH12K_DBG_BOOT, \"boot pci_mem 0x%p\\n\", ab-\u003emem);\ndrivers/net/wireless/ath/ath12k/pci.c-878-\treturn 0;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-887-\ndrivers/net/wireless/ath/ath12k/pci.c:888:static void ath12k_pci_free_region(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-889-{\ndrivers/net/wireless/ath/ath12k/pci.c:890:\tstruct ath12k_base *ab = ab_pci-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-891-\tstruct pci_dev *pci_dev = ab_pci-\u003epdev;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-899-\ndrivers/net/wireless/ath/ath12k/pci.c:900:static void ath12k_pci_aspm_disable(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-901-{\ndrivers/net/wireless/ath/ath12k/pci.c:902:\tstruct ath12k_base *ab = ab_pci-\u003eab;\ndrivers/net/wireless/ath/ath12k/pci.c-903-\n--\ndrivers/net/wireless/ath/ath12k/pci.c-906-\ndrivers/net/wireless/ath/ath12k/pci.c:907:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"pci link_ctl 0x%04x L0s %d L1 %d\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c-908-\t\t   ab_pci-\u003elink_ctl,\n--\ndrivers/net/wireless/ath/ath12k/pci.c-918-\ndrivers/net/wireless/ath/ath12k/pci.c:919:static void ath12k_pci_update_qrtr_node_id(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-920-{\ndrivers/net/wireless/ath/ath12k/pci.c:921:\tstruct ath12k_pci *ab_pci = ath12k_pci_priv(ab);\ndrivers/net/wireless/ath/ath12k/pci.c-922-\tu32 reg;\n--\ndrivers/net/wireless/ath/ath12k/pci.c-932-\treg = PCIE_LOCAL_REG_QRTR_NODE_ID(ab) \u0026 WINDOW_RANGE_MASK;\ndrivers/net/wireless/ath/ath12k/pci.c:933:\tath12k_pci_write32(ab, reg, ab_pci-\u003eqmi_instance);\ndrivers/net/wireless/ath/ath12k/pci.c-934-\ndrivers/net/wireless/ath/ath12k/pci.c:935:\tath12k_dbg(ab, ATH12K_DBG_PCI, \"pci reg 0x%x instance 0x%x read val 0x%x\\n\",\ndrivers/net/wireless/ath/ath12k/pci.c:936:\t\t   reg, ab_pci-\u003eqmi_instance, ath12k_pci_read32(ab, reg));\ndrivers/net/wireless/ath/ath12k/pci.c-937-}\ndrivers/net/wireless/ath/ath12k/pci.c-938-\ndrivers/net/wireless/ath/ath12k/pci.c:939:static void ath12k_pci_aspm_restore(struct ath12k_pci *ab_pci)\ndrivers/net/wireless/ath/ath12k/pci.c-940-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-948-\ndrivers/net/wireless/ath/ath12k/pci.c:949:static void ath12k_pci_cancel_workqueue(struct ath12k_base *ab)\ndrivers/net/wireless/ath/ath12k/pci.c-950-{\n--\ndrivers/net/wireless/ath/ath12k/pci.c-953-\tfor (i = 0; i \u003c ab-\u003ehw_params-\u003ece_count; i++) {\ndrivers/net/wireless/ath/ath12k/pci.c:954:\t\tstruct ath12k_ce_pipe *ce_pipe = \u0026ab-\u003ece.ce_pipe[i];\ndrivers/net/wireless/ath/ath12k/pci.c-955-\ndrivers/net/wireless/ath/ath12k/pci.c:956:\t\tif (ath12k_ce_get_attr_flags(ab, i) \u0026 CE_ATTR_DIS_INTR)\ndrivers/net/wireless/ath/ath12k/pci.c-957-\t\t\tcontinue;\n--\n\n"
}

8/2 2026/09/04 20:10 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 21468
							output: 30
							thoughts: 489
						

Thoughts:
**WorthFuzzing Decision for ath12k Driver**

Okay, let's dive into this `ath12k` driver and determine if it's a good candidate for fuzzing. First, I know it's a PCI/AHB driver designed specifically for Qualcomm Wi-Fi 7 hardware. That's a red flag right away – vendor-specific drivers often have tricky dependencies. Let me see... I'm supposed to apply the "WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)" instructions. Specifically, I need to look at "Structurally unreachable hardware" scenarios.

Based on my understanding and this text, `ath12k` is *definitely* one of those cases. It requires physical Qualcomm hardware, specific PCIe cards or AHB SoCs, and likely particular firmware that isn't replicated in standard QEMU. It's not like it has some clever emulation layer. So it's looking like it's inherently unreachable in the typical syzkaller environment.

Hold on, I need to be completely sure. Could `ath12k` or, more specifically, a function like `ath12k_mac_update_freq_range` be somehow triggered via a different route, like `mac80211_hwsim`, `nl80211`, or `cfg80211`? I need to check the callers of this function. Let's see... looking at the code, it's called by `ath12k_mac_setup_channels_rates` and `ath12k_regd_update`. They're internal functions, called during the hardware initialization or regulatory rules updates for an `ath12k` device (`struct ath12k *ar`). That makes sense – the hardware itself, or something directly tied to it, needs to initialize and update these things.

Given that and the fact that `ath12k` needs specific Qualcomm PCI/AHB chipsets, and cannot be initialized in standard QEMU without physical PCIe devices, my conclusion is that it *is* structurally unreachable for fuzzing. I need to make *absolutely* sure there's no virtual bus or USB component of this driver as well, though it looks like it's a slim chance. Let me quickly check the files in `drivers/net/wireless/ath/ath12k/` to be sure.



9/2 2026/09/04 20:10 tool codesearch-dir-index
0m Args:
{
  "Dir": "drivers/net/wireless/ath/ath12k"
}

Results:
{
  "Files": [
    "acpi.c",
    "acpi.h",
    "ahb.c",
    "ahb.h",
    "ce.c",
    "ce.h",
    "cmn_defs.h",
    "core.c",
    "core.h",
    "coredump.c",
    "coredump.h",
    "dbring.c",
    "dbring.h",
    "debug.c",
    "debug.h",
    "debugfs.c",
    "debugfs.h",
    "debugfs_htt_stats.c",
    "debugfs_htt_stats.h",
    "debugfs_sta.c",
    "debugfs_sta.h",
    "dp.c",
    "dp.h",
    "dp_cmn.h",
    "dp_htt.c",
    "dp_htt.h",
    "dp_mon.c",
    "dp_mon.h",
    "dp_peer.c",
    "dp_peer.h",
    "dp_rx.c",
    "dp_rx.h",
    "dp_tx.c",
    "dp_tx.h",
    "fw.c",
    "fw.h",
    "hal.c",
    "hal.h",
    "hif.h",
    "htc.c",
    "htc.h",
    "hw.h",
    "mac.c",
    "mac.h",
    "mhi.c",
    "mhi.h",
    "p2p.c",
    "p2p.h",
    "pci.c",
    "pci.h",
    "peer.c",
    "peer.h",
    "qmi.c",
    "qmi.h",
    "reg.c",
    "reg.h",
    "testmode.c",
    "testmode.h",
    "thermal.c",
    "thermal.h",
    "trace.c",
    "trace.h",
    "wmi.c",
    "wmi.h",
    "wow.c",
    "wow.h"
  ],
  "Subdirs": [
    "wifi7"
  ]
}

10/2 2026/09/04 20:10 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 22984
							output: 111
							thoughts: 169
						

Thoughts:
**Unreachable Code in the ath12k Driver**

Okay, so I've been looking at this patch and, frankly, it's a dead end. The code modifies `ath12k_mac_update_freq_range`, which immediately tells me we're dealing with the Qualcomm Wi-Fi 7 driver, *ath12k*. That's the first red flag. I know from experience that `ath12k` is tightly bound to Qualcomm's specific hardware – PCI and AHB buses, specifically. Forget about seeing this thing in a virtual environment. There’s no support for virtual or USB device emulation within `ath12k`, at least not in any standard QEMU setup I’ve ever seen.

Therefore, since the only supported hardware is PCI and AHB based, and no standard fuzzing environments are based on these, this modified code is, structurally speaking, untouchable. It’s unreachable hardware code within the context of any normal fuzzing effort. It's a waste of time to pursue this any further, given the current environment. Time to mark this as a "no-go".



11/2 2026/09/04 20:10 tool set-results
0m Args:
{
  "EnableConfigs": [],
  "FocusSymbols": [],
  "Reasoning": "The patch modifies ath12k_mac_update_freq_range in the ath12k driver. ath12k is a vendor-specific driver for Qualcomm Wi-Fi 7 PCIe/AHB hardware devices, which requires physical hardware and cannot be emulated or probed in standard virtualized fuzzing environments (QEMU/GCE), making the modified code structurally unreachable.",
  "WorthFuzzing": false
}

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies ath12k_mac_update_freq_range in the ath12k driver. ath12k is a vendor-specific driver for Qualcomm Wi-Fi 7 PCIe/AHB hardware devices, which requires physical hardware and cannot be emulated or probed in standard virtualized fuzzing environments (QEMU/GCE), making the modified code structurally unreachable.",
  "WorthFuzzing": false
}

12/1 2026/09/04 20:10 action If
0m Args:
{
  "WorthFuzzing": false
}

Results:
null

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