AI Trajectory


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

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "KMSANReasoning": "",
  "NeedsKMSAN": false,
  "Reasoning": "The patch modifies yt921x_led_blink_set() in drivers/net/dsa/motorcomm/leds.c, which is part of the Motorcomm YT9215 ethernet switch driver (NET_DSA_YT921X). This driver targets specific physical ASIC hardware (Motorcomm YT9215) on an MDIO bus and is not emulated in standard QEMU or GCE virtualized environments, making the code structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

1/1 2026/09/06 00:25 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 10dc74d92c20be4516a4d649db8d6a802fc161c4\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Sun Sep 6 00:25:01 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/dsa/motorcomm/leds.c b/drivers/net/dsa/motorcomm/leds.c\nindex 7d3c0f68d8ffb..87a6b9cf60682 100644\n--- a/drivers/net/dsa/motorcomm/leds.c\n+++ b/drivers/net/dsa/motorcomm/leds.c\n@@ -107,6 +107,8 @@ yt921x_led_blink_set(struct yt921x_priv *priv, int port, int group,\n \t\t       YT921X_LED_DUTY(1, 2);\n \n \t\tuse_cycle = false;\n+\t} else if (!*onp || !*offp) {\n+\t\treturn yt921x_led_force_set(priv, port, group, *onp);\n \t} else {\n \t\tres = yt921x_led_blink_select(priv, *onp, *offp, \u0026cycle, \u0026duty);\n \t\tif (res)\n"
}

2/1 2026/09/06 00:25 agent patch-evaluator
0m Model:
core

Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies yt921x_led_blink_set() in drivers/net/dsa/motorcomm/leds.c, which is part of the Motorcomm YT9215 ethernet switch driver (NET_DSA_YT921X). This driver targets specific physical ASIC hardware (Motorcomm YT9215) on an MDIO bus and is not emulated in standard QEMU or GCE virtualized environments, making the code structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Prompt:
Target architecture: amd64

For your convenience, here is the diff of the changes:
commit 10dc74d92c20be4516a4d649db8d6a802fc161c4
Author: syz-cluster <triage@syzkaller.com>
Date:   Sun Sep 6 00:25:01 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/dsa/motorcomm/leds.c b/drivers/net/dsa/motorcomm/leds.c
index 7d3c0f68d8ffb..87a6b9cf60682 100644
--- a/drivers/net/dsa/motorcomm/leds.c
+++ b/drivers/net/dsa/motorcomm/leds.c
@@ -107,6 +107,8 @@ yt921x_led_blink_set(struct yt921x_priv *priv, int port, int group,
 		       YT921X_LED_DUTY(1, 2);
 
 		use_cycle = false;
+	} else if (!*onp || !*offp) {
+		return yt921x_led_force_set(priv, port, group, *onp);
 	} else {
 		res = yt921x_led_blink_select(priv, *onp, *offp, &cycle, &duty);
 		if (res)

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

Args:
null

Results:
null

Tokens:
							input: 2932
							output: 69
							thoughts: 54
						

Thoughts:
Okay, here's my interpretation of those thoughts, tailored for an expert audience, as if they were my own:

**Initial Assessment of the LED Driver Patch**

Alright, the change is hitting `drivers/net/dsa/motorcomm/leds.c`. Immediately, I need to get a handle on what's being impacted and what's connected to it. I'm thinking, "right, `leds.c` in the Motorcomm DSA context - what's the configuration landscape here? What hardware does this touch?" Let's start with a file inspection, mentally reviewing the relevant Kconfig options and overall hardware architecture to understand the possible reach of this change.

Now it's time to dig into the code itself. I'm going to quickly use `read-file` (or `grepper` if I need to search more broadly) to assess the change. Let's see what's actually being modified, identify the core logic, and quickly evaluate any potential side effects.



4/2 2026/09/06 00:25 tool read-file
0m Args:
{
  "File": "drivers/net/dsa/motorcomm/leds.c",
  "FirstLine": 90,
  "LineCount": 40
}

Results:
{
  "Contents": "  90:\t\n  91:\tstatic int\n  92:\tyt921x_led_blink_set(struct yt921x_priv *priv, int port, int group,\n  93:\t\t\t     unsigned long *onp, unsigned long *offp)\n  94:\t{\n  95:\t\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\n  96:\t\tunsigned short cycle;\n  97:\t\tunsigned char duty;\n  98:\t\tbool use_cycle;\n  99:\t\tu32 ctrl;\n 100:\t\tu32 mask;\n 101:\t\tu32 val;\n 102:\t\tint res;\n 103:\t\n 104:\t\tif (!*onp \u0026\u0026 !*offp) {\n 105:\t\t\tcycle = YT921X_LED_BLINK_DEF;\n 106:\t\t\tduty = (pp-\u003eled_duty_mask \u0026 ~BIT(group)) ? pp-\u003eled_duty :\n 107:\t\t\t       YT921X_LED_DUTY(1, 2);\n 108:\t\n 109:\t\t\tuse_cycle = false;\n 110:\t\t} else if (!*onp || !*offp) {\n 111:\t\t\treturn yt921x_led_force_set(priv, port, group, *onp);\n 112:\t\t} else {\n 113:\t\t\tres = yt921x_led_blink_select(priv, *onp, *offp, \u0026cycle, \u0026duty);\n 114:\t\t\tif (res)\n 115:\t\t\t\treturn res;\n 116:\t\n 117:\t\t\tuse_cycle = cycle \u003c YT921X_LED_BLINK_DEF;\n 118:\t\n 119:\t\t\tif (use_cycle \u0026\u0026 cycle != pp-\u003eled_cycle \u0026\u0026\n 120:\t\t\t    (pp-\u003eled_cycle_mask \u0026 ~BIT(group)))\n 121:\t\t\t\treturn -EOPNOTSUPP;\n 122:\t\t\tif (duty != pp-\u003eled_duty \u0026\u0026 (pp-\u003eled_duty_mask \u0026 ~BIT(group)))\n 123:\t\t\t\treturn -EOPNOTSUPP;\n 124:\t\t}\n 125:\t\n 126:\t\tpp-\u003eled_cycle_mask \u0026= ~BIT(group);\n 127:\t\tpp-\u003eled_duty_mask \u0026= ~BIT(group);\n 128:\t\n 129:\t\t/* The chip seems to jam a while if changing duty directly */\n"
}

5/2 2026/09/06 00:25 tool grepper
0m Args:
{
  "Expression": "motorcomm",
  "PathPrefix": "drivers/net/dsa"
}

Results:
{
  "Output": "drivers/net/dsa/Kconfig=83=source \"drivers/net/dsa/microchip/Kconfig\"\ndrivers/net/dsa/Kconfig-84-\ndrivers/net/dsa/Kconfig:85:source \"drivers/net/dsa/motorcomm/Kconfig\"\ndrivers/net/dsa/Kconfig-86-\n--\ndrivers/net/dsa/Makefile=21=obj-y\t\t\t\t+= microchip/\ndrivers/net/dsa/Makefile:22:obj-y\t\t\t\t+= motorcomm/\ndrivers/net/dsa/Makefile-23-obj-y\t\t\t\t+= mv88e6xxx/\n--\ndrivers/net/dsa/motorcomm/chip.c=4772=static const struct of_device_id yt921x_of_match[] = {\ndrivers/net/dsa/motorcomm/chip.c:4773:\t{ .compatible = \"motorcomm,yt9215\" },\ndrivers/net/dsa/motorcomm/chip.c-4774-\t{}\n"
}

6/2 2026/09/06 00:25 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 4185
							output: 73
							thoughts: 23
						

Thoughts:
Here's my take on the process, considering I'm an expert:

**Diving into the MotorComm DSA Driver**

Okay, so I need to get a handle on the MotorComm DSA driver. First things first, let's navigate to `drivers/net/dsa/motorcomm/`. That's where the core logic will be. I need to understand how this specific driver interacts with the DSA framework. My immediate focus will be on the `Kconfig` file and the driver's source code itself. The Kconfig will tell me the build options and dependencies – what features are enabled, what other modules are required, what hardware configurations are supported, and which symbols are configurable. This is key because it shapes the entire landscape of what's *possible* with this driver on the target platform. Then I'll dive into the driver itself, examining the critical functions: initialization, probe, and removal. I'll pay close attention to how it handles register access, interrupt handling (if any), and how it registers with the DSA core. What's the interrupt setup, what is the structure of the net_device registered, how does the initialization flow get configured with the underlying hardware, how does it provide the necessary hooks for DSA to do its magic? I'll also look for any vendor-specific extensions or quirks. Finally, I'll need to confirm that this version properly handles any security requirements.



7/2 2026/09/06 00:25 tool read-file
0m Args:
{
  "File": "drivers/net/dsa/motorcomm/Kconfig",
  "FirstLine": 1,
  "LineCount": 30
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: GPL-2.0-only\n   2:\tconfig NET_DSA_YT921X\n   3:\t\ttristate \"Motorcomm YT9215 ethernet switch chip support\"\n   4:\t\tselect NET_DSA_TAG_YT921X\n   5:\t\tselect NET_IEEE8021Q_HELPERS if DCB\n   6:\t\thelp\n   7:\t\t  This enables support for the Motorcomm YT9215 ethernet switch\n   8:\t\t  chip.\n   9:\t\n  10:\tconfig NET_DSA_YT921X_LEDS\n  11:\t\tbool \"LED support for Motorcomm YT9215\"\n  12:\t\tdefault y\n  13:\t\tdepends on NET_DSA_YT921X\n  14:\t\tdepends on LEDS_CLASS=y || LEDS_CLASS=NET_DSA_YT921X\n  15:\t\thelp\n  16:\t\t  This enables support for controlling the LEDs attached to the\n  17:\t\t  Motorcomm YT9215 switch chips.\n"
}

8/2 2026/09/06 00:25 tool grepper
0m Args:
{
  "Expression": "yt921x_",
  "PathPrefix": "drivers/net/dsa/motorcomm"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 2561 lines.\nUse more precise expression if possible.\n\ndrivers/net/dsa/motorcomm/chip.c-31-\ndrivers/net/dsa/motorcomm/chip.c:32:struct yt921x_mib_desc {\ndrivers/net/dsa/motorcomm/chip.c-33-\tunsigned int size;\n--\ndrivers/net/dsa/motorcomm/chip.c-40-\ndrivers/net/dsa/motorcomm/chip.c:41:/* Must agree with yt921x_mib\ndrivers/net/dsa/motorcomm/chip.c-42- *\n--\ndrivers/net/dsa/motorcomm/chip.c-46- */\ndrivers/net/dsa/motorcomm/chip.c:47:static const struct yt921x_mib_desc yt921x_mib_descs[] = {\ndrivers/net/dsa/motorcomm/chip.c-48-\tMIB_DESC(1, YT921X_MIB_DATA_RX_BROADCAST, NULL),\n--\ndrivers/net/dsa/motorcomm/chip.c-98-\ndrivers/net/dsa/motorcomm/chip.c:99:struct yt921x_info {\ndrivers/net/dsa/motorcomm/chip.c-100-\tconst char *name;\n--\ndrivers/net/dsa/motorcomm/chip.c-106-\tu16 internal_mask;\ndrivers/net/dsa/motorcomm/chip.c:107:\t/* TODO: see comments in yt921x_dsa_phylink_get_caps() */\ndrivers/net/dsa/motorcomm/chip.c-108-\tu16 external_mask;\n--\ndrivers/net/dsa/motorcomm/chip.c-115-\ndrivers/net/dsa/motorcomm/chip.c:116:static const struct yt921x_info yt921x_infos[] = {\ndrivers/net/dsa/motorcomm/chip.c-117-\t{\n--\ndrivers/net/dsa/motorcomm/chip.c-164-\ndrivers/net/dsa/motorcomm/chip.c:165:struct yt921x_reg_mdio {\ndrivers/net/dsa/motorcomm/chip.c-166-\tstruct mii_bus *bus;\n--\ndrivers/net/dsa/motorcomm/chip.c-181-\ndrivers/net/dsa/motorcomm/chip.c:182:#define to_yt921x_priv(_ds) container_of_const(_ds, struct yt921x_priv, ds)\ndrivers/net/dsa/motorcomm/chip.c-183-#define to_device(priv) ((priv)-\u003eds.dev)\n--\ndrivers/net/dsa/motorcomm/chip.c=190=static u32 ethaddr_lo2_to_u32(const unsigned char *addr)\n--\ndrivers/net/dsa/motorcomm/chip.c-194-\ndrivers/net/dsa/motorcomm/chip.c:195:static int yt921x_reg_mdio_read(void *context, u32 reg, u32 *valp)\ndrivers/net/dsa/motorcomm/chip.c-196-{\ndrivers/net/dsa/motorcomm/chip.c:197:\tstruct yt921x_reg_mdio *mdio = context;\ndrivers/net/dsa/motorcomm/chip.c-198-\tstruct mii_bus *bus = mdio-\u003ebus;\n--\ndrivers/net/dsa/motorcomm/chip.c-235-\ndrivers/net/dsa/motorcomm/chip.c:236:static int yt921x_reg_mdio_write(void *context, u32 reg, u32 val)\ndrivers/net/dsa/motorcomm/chip.c-237-{\ndrivers/net/dsa/motorcomm/chip.c:238:\tstruct yt921x_reg_mdio *mdio = context;\ndrivers/net/dsa/motorcomm/chip.c-239-\tstruct mii_bus *bus = mdio-\u003ebus;\n--\ndrivers/net/dsa/motorcomm/chip.c-271-\ndrivers/net/dsa/motorcomm/chip.c:272:static const struct yt921x_reg_ops yt921x_reg_ops_mdio = {\ndrivers/net/dsa/motorcomm/chip.c:273:\t.read = yt921x_reg_mdio_read,\ndrivers/net/dsa/motorcomm/chip.c:274:\t.write = yt921x_reg_mdio_write,\ndrivers/net/dsa/motorcomm/chip.c-275-};\n--\ndrivers/net/dsa/motorcomm/chip.c-278-\ndrivers/net/dsa/motorcomm/chip.c:279:static int yt921x_intif_wait(struct yt921x_priv *priv)\ndrivers/net/dsa/motorcomm/chip.c-280-{\n--\ndrivers/net/dsa/motorcomm/chip.c-282-\ndrivers/net/dsa/motorcomm/chip.c:283:\treturn yt921x_reg_wait(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START,\ndrivers/net/dsa/motorcomm/chip.c-284-\t\t\t       \u0026val);\n--\ndrivers/net/dsa/motorcomm/chip.c=287=static int\ndrivers/net/dsa/motorcomm/chip.c:288:yt921x_intif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp)\ndrivers/net/dsa/motorcomm/chip.c-289-{\n--\ndrivers/net/dsa/motorcomm/chip.c-295-\ndrivers/net/dsa/motorcomm/chip.c:296:\tres = yt921x_intif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-297-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-303-\t       YT921X_MBUS_CTRL_READ;\ndrivers/net/dsa/motorcomm/chip.c:304:\tres = yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl);\ndrivers/net/dsa/motorcomm/chip.c-305-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-306-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:307:\tres = yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START);\ndrivers/net/dsa/motorcomm/chip.c-308-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-310-\ndrivers/net/dsa/motorcomm/chip.c:311:\tres = yt921x_intif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-312-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-313-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:314:\tres = yt921x_reg_read(priv, YT921X_INT_MBUS_DIN, \u0026val);\ndrivers/net/dsa/motorcomm/chip.c-315-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c=326=static int\ndrivers/net/dsa/motorcomm/chip.c:327:yt921x_intif_write(struct yt921x_priv *priv, int port, int reg, u16 val)\ndrivers/net/dsa/motorcomm/chip.c-328-{\n--\ndrivers/net/dsa/motorcomm/chip.c-332-\ndrivers/net/dsa/motorcomm/chip.c:333:\tres = yt921x_intif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-334-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-340-\t       YT921X_MBUS_CTRL_WRITE;\ndrivers/net/dsa/motorcomm/chip.c:341:\tres = yt921x_reg_update_bits(priv, YT921X_INT_MBUS_CTRL, mask, ctrl);\ndrivers/net/dsa/motorcomm/chip.c-342-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-343-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:344:\tres = yt921x_reg_write(priv, YT921X_INT_MBUS_DOUT, val);\ndrivers/net/dsa/motorcomm/chip.c-345-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-346-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:347:\tres = yt921x_reg_write(priv, YT921X_INT_MBUS_OP, YT921X_MBUS_OP_START);\ndrivers/net/dsa/motorcomm/chip.c-348-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-350-\ndrivers/net/dsa/motorcomm/chip.c:351:\treturn yt921x_intif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-352-}\ndrivers/net/dsa/motorcomm/chip.c-353-\ndrivers/net/dsa/motorcomm/chip.c:354:static int yt921x_mbus_int_read(struct mii_bus *mbus, int port, int reg)\ndrivers/net/dsa/motorcomm/chip.c-355-{\ndrivers/net/dsa/motorcomm/chip.c:356:\tstruct yt921x_priv *priv = mbus-\u003epriv;\ndrivers/net/dsa/motorcomm/chip.c-357-\tu16 val;\n--\ndrivers/net/dsa/motorcomm/chip.c-363-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:364:\tres = yt921x_intif_read(priv, port, reg, \u0026val);\ndrivers/net/dsa/motorcomm/chip.c-365-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=372=static int\ndrivers/net/dsa/motorcomm/chip.c:373:yt921x_mbus_int_write(struct mii_bus *mbus, int port, int reg, u16 data)\ndrivers/net/dsa/motorcomm/chip.c-374-{\ndrivers/net/dsa/motorcomm/chip.c:375:\tstruct yt921x_priv *priv = mbus-\u003epriv;\ndrivers/net/dsa/motorcomm/chip.c-376-\tint res;\n--\ndrivers/net/dsa/motorcomm/chip.c-381-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:382:\tres = yt921x_intif_write(priv, port, reg, data);\ndrivers/net/dsa/motorcomm/chip.c-383-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=388=static int\ndrivers/net/dsa/motorcomm/chip.c:389:yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp)\ndrivers/net/dsa/motorcomm/chip.c-390-{\n--\ndrivers/net/dsa/motorcomm/chip.c-401-\tmbus-\u003epriv = priv;\ndrivers/net/dsa/motorcomm/chip.c:402:\tmbus-\u003eread = yt921x_mbus_int_read;\ndrivers/net/dsa/motorcomm/chip.c:403:\tmbus-\u003ewrite = yt921x_mbus_int_write;\ndrivers/net/dsa/motorcomm/chip.c-404-\tmbus-\u003eparent = dev;\n--\ndrivers/net/dsa/motorcomm/chip.c-415-\ndrivers/net/dsa/motorcomm/chip.c:416:static int yt921x_extif_wait(struct yt921x_priv *priv)\ndrivers/net/dsa/motorcomm/chip.c-417-{\n--\ndrivers/net/dsa/motorcomm/chip.c-419-\ndrivers/net/dsa/motorcomm/chip.c:420:\treturn yt921x_reg_wait(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START,\ndrivers/net/dsa/motorcomm/chip.c-421-\t\t\t       \u0026val);\n--\ndrivers/net/dsa/motorcomm/chip.c=424=static int\ndrivers/net/dsa/motorcomm/chip.c:425:yt921x_extif_read(struct yt921x_priv *priv, int port, int reg, u16 *valp)\ndrivers/net/dsa/motorcomm/chip.c-426-{\n--\ndrivers/net/dsa/motorcomm/chip.c-432-\ndrivers/net/dsa/motorcomm/chip.c:433:\tres = yt921x_extif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-434-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-440-\t       YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_READ;\ndrivers/net/dsa/motorcomm/chip.c:441:\tres = yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl);\ndrivers/net/dsa/motorcomm/chip.c-442-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-443-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:444:\tres = yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START);\ndrivers/net/dsa/motorcomm/chip.c-445-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-447-\ndrivers/net/dsa/motorcomm/chip.c:448:\tres = yt921x_extif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-449-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-450-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:451:\tres = yt921x_reg_read(priv, YT921X_EXT_MBUS_DIN, \u0026val);\ndrivers/net/dsa/motorcomm/chip.c-452-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c=463=static int\ndrivers/net/dsa/motorcomm/chip.c:464:yt921x_extif_write(struct yt921x_priv *priv, int port, int reg, u16 val)\ndrivers/net/dsa/motorcomm/chip.c-465-{\n--\ndrivers/net/dsa/motorcomm/chip.c-469-\ndrivers/net/dsa/motorcomm/chip.c:470:\tres = yt921x_extif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-471-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-477-\t       YT921X_MBUS_CTRL_TYPE_C22 | YT921X_MBUS_CTRL_WRITE;\ndrivers/net/dsa/motorcomm/chip.c:478:\tres = yt921x_reg_update_bits(priv, YT921X_EXT_MBUS_CTRL, mask, ctrl);\ndrivers/net/dsa/motorcomm/chip.c-479-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-480-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:481:\tres = yt921x_reg_write(priv, YT921X_EXT_MBUS_DOUT, val);\ndrivers/net/dsa/motorcomm/chip.c-482-\tif (res)\ndrivers/net/dsa/motorcomm/chip.c-483-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:484:\tres = yt921x_reg_write(priv, YT921X_EXT_MBUS_OP, YT921X_MBUS_OP_START);\ndrivers/net/dsa/motorcomm/chip.c-485-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-487-\ndrivers/net/dsa/motorcomm/chip.c:488:\treturn yt921x_extif_wait(priv);\ndrivers/net/dsa/motorcomm/chip.c-489-}\ndrivers/net/dsa/motorcomm/chip.c-490-\ndrivers/net/dsa/motorcomm/chip.c:491:static int yt921x_mbus_ext_read(struct mii_bus *mbus, int port, int reg)\ndrivers/net/dsa/motorcomm/chip.c-492-{\ndrivers/net/dsa/motorcomm/chip.c:493:\tstruct yt921x_priv *priv = mbus-\u003epriv;\ndrivers/net/dsa/motorcomm/chip.c-494-\tu16 val;\n--\ndrivers/net/dsa/motorcomm/chip.c-497-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:498:\tres = yt921x_extif_read(priv, port, reg, \u0026val);\ndrivers/net/dsa/motorcomm/chip.c-499-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=506=static int\ndrivers/net/dsa/motorcomm/chip.c:507:yt921x_mbus_ext_write(struct mii_bus *mbus, int port, int reg, u16 data)\ndrivers/net/dsa/motorcomm/chip.c-508-{\ndrivers/net/dsa/motorcomm/chip.c:509:\tstruct yt921x_priv *priv = mbus-\u003epriv;\ndrivers/net/dsa/motorcomm/chip.c-510-\tint res;\n--\ndrivers/net/dsa/motorcomm/chip.c-512-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:513:\tres = yt921x_extif_write(priv, port, reg, data);\ndrivers/net/dsa/motorcomm/chip.c-514-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=519=static int\ndrivers/net/dsa/motorcomm/chip.c:520:yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp)\ndrivers/net/dsa/motorcomm/chip.c-521-{\n--\ndrivers/net/dsa/motorcomm/chip.c-533-\t/* TODO: c45? */\ndrivers/net/dsa/motorcomm/chip.c:534:\tmbus-\u003eread = yt921x_mbus_ext_read;\ndrivers/net/dsa/motorcomm/chip.c:535:\tmbus-\u003ewrite = yt921x_mbus_ext_write;\ndrivers/net/dsa/motorcomm/chip.c-536-\tmbus-\u003eparent = dev;\n--\ndrivers/net/dsa/motorcomm/chip.c-547-/* Read and handle overflow of 32bit MIBs. MIB buffer must be zeroed before. */\ndrivers/net/dsa/motorcomm/chip.c:548:static int yt921x_read_mib(struct yt921x_priv *priv, int port)\ndrivers/net/dsa/motorcomm/chip.c-549-{\ndrivers/net/dsa/motorcomm/chip.c:550:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c-551-\tstruct device *dev = to_device(priv);\ndrivers/net/dsa/motorcomm/chip.c:552:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-553-\tint res = 0;\ndrivers/net/dsa/motorcomm/chip.c-554-\ndrivers/net/dsa/motorcomm/chip.c:555:\t/* Reading of yt921x_port::mib is not protected by a lock and it's vain\ndrivers/net/dsa/motorcomm/chip.c-556-\t * to keep its consistency, since we have to read registers one by one\n--\ndrivers/net/dsa/motorcomm/chip.c-562-\ndrivers/net/dsa/motorcomm/chip.c:563:\tfor (size_t i = 0; i \u003c ARRAY_SIZE(yt921x_mib_descs); i++) {\ndrivers/net/dsa/motorcomm/chip.c:564:\t\tconst struct yt921x_mib_desc *desc = \u0026yt921x_mib_descs[i];\ndrivers/net/dsa/motorcomm/chip.c-565-\t\tu32 reg = YT921X_MIBn_DATA0(port) + desc-\u003eoffset;\n--\ndrivers/net/dsa/motorcomm/chip.c-569-\ndrivers/net/dsa/motorcomm/chip.c:570:\t\tres = yt921x_reg_read(priv, reg, \u0026val0);\ndrivers/net/dsa/motorcomm/chip.c-571-\t\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-582-\ndrivers/net/dsa/motorcomm/chip.c:583:\t\t\tres = yt921x_reg_read(priv, reg + 4, \u0026val1);\ndrivers/net/dsa/motorcomm/chip.c-584-\t\t\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-606-\ndrivers/net/dsa/motorcomm/chip.c:607:static void yt921x_poll_mib(struct work_struct *work)\ndrivers/net/dsa/motorcomm/chip.c-608-{\ndrivers/net/dsa/motorcomm/chip.c:609:\tstruct yt921x_port *pp = container_of_const(work, struct yt921x_port,\ndrivers/net/dsa/motorcomm/chip.c-610-\t\t\t\t\t\t    mib_read.work);\ndrivers/net/dsa/motorcomm/chip.c:611:\tstruct yt921x_priv *priv = (void *)(pp - pp-\u003eindex) -\ndrivers/net/dsa/motorcomm/chip.c:612:\t\t\t\t   offsetof(struct yt921x_priv, ports);\ndrivers/net/dsa/motorcomm/chip.c-613-\tunsigned long delay = YT921X_STATS_INTERVAL_JIFFIES;\n--\ndrivers/net/dsa/motorcomm/chip.c-617-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:618:\tres = yt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-619-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=626=static void\ndrivers/net/dsa/motorcomm/chip.c:627:yt921x_dsa_get_strings(struct dsa_switch *ds, int port, u32 stringset,\ndrivers/net/dsa/motorcomm/chip.c-628-\t\t       uint8_t *data)\n--\ndrivers/net/dsa/motorcomm/chip.c-632-\ndrivers/net/dsa/motorcomm/chip.c:633:\tfor (size_t i = 0; i \u003c ARRAY_SIZE(yt921x_mib_descs); i++) {\ndrivers/net/dsa/motorcomm/chip.c:634:\t\tconst struct yt921x_mib_desc *desc = \u0026yt921x_mib_descs[i];\ndrivers/net/dsa/motorcomm/chip.c-635-\n--\ndrivers/net/dsa/motorcomm/chip.c=641=static void\ndrivers/net/dsa/motorcomm/chip.c:642:yt921x_dsa_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data)\ndrivers/net/dsa/motorcomm/chip.c-643-{\ndrivers/net/dsa/motorcomm/chip.c:644:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:645:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:646:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-647-\tsize_t j;\n--\ndrivers/net/dsa/motorcomm/chip.c-649-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:650:\tyt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-651-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c-653-\tj = 0;\ndrivers/net/dsa/motorcomm/chip.c:654:\tfor (size_t i = 0; i \u003c ARRAY_SIZE(yt921x_mib_descs); i++) {\ndrivers/net/dsa/motorcomm/chip.c:655:\t\tconst struct yt921x_mib_desc *desc = \u0026yt921x_mib_descs[i];\ndrivers/net/dsa/motorcomm/chip.c-656-\n--\ndrivers/net/dsa/motorcomm/chip.c-664-\ndrivers/net/dsa/motorcomm/chip.c:665:static int yt921x_dsa_get_sset_count(struct dsa_switch *ds, int port, int sset)\ndrivers/net/dsa/motorcomm/chip.c-666-{\n--\ndrivers/net/dsa/motorcomm/chip.c-671-\ndrivers/net/dsa/motorcomm/chip.c:672:\tfor (size_t i = 0; i \u003c ARRAY_SIZE(yt921x_mib_descs); i++) {\ndrivers/net/dsa/motorcomm/chip.c:673:\t\tconst struct yt921x_mib_desc *desc = \u0026yt921x_mib_descs[i];\ndrivers/net/dsa/motorcomm/chip.c-674-\n--\ndrivers/net/dsa/motorcomm/chip.c=682=static void\ndrivers/net/dsa/motorcomm/chip.c:683:yt921x_dsa_get_eth_mac_stats(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-684-\t\t\t     struct ethtool_eth_mac_stats *mac_stats)\ndrivers/net/dsa/motorcomm/chip.c-685-{\ndrivers/net/dsa/motorcomm/chip.c:686:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:687:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:688:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-689-\ndrivers/net/dsa/motorcomm/chip.c-690-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:691:\tyt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-692-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=718=static void\ndrivers/net/dsa/motorcomm/chip.c:719:yt921x_dsa_get_eth_ctrl_stats(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-720-\t\t\t      struct ethtool_eth_ctrl_stats *ctrl_stats)\ndrivers/net/dsa/motorcomm/chip.c-721-{\ndrivers/net/dsa/motorcomm/chip.c:722:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:723:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:724:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-725-\ndrivers/net/dsa/motorcomm/chip.c-726-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:727:\tyt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-728-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c-734-\ndrivers/net/dsa/motorcomm/chip.c:735:static const struct ethtool_rmon_hist_range yt921x_rmon_ranges[] = {\ndrivers/net/dsa/motorcomm/chip.c-736-\t{ 0, 64 },\n--\ndrivers/net/dsa/motorcomm/chip.c=746=static void\ndrivers/net/dsa/motorcomm/chip.c:747:yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-748-\t\t\t  struct ethtool_rmon_stats *rmon_stats,\n--\ndrivers/net/dsa/motorcomm/chip.c-750-{\ndrivers/net/dsa/motorcomm/chip.c:751:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:752:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:753:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-754-\ndrivers/net/dsa/motorcomm/chip.c-755-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:756:\tyt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-757-\tmutex_unlock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c-758-\ndrivers/net/dsa/motorcomm/chip.c:759:\t*ranges = yt921x_rmon_ranges;\ndrivers/net/dsa/motorcomm/chip.c-760-\n--\ndrivers/net/dsa/motorcomm/chip.c=783=static void\ndrivers/net/dsa/motorcomm/chip.c:784:yt921x_dsa_get_stats64(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-785-\t\t       struct rtnl_link_stats64 *stats)\ndrivers/net/dsa/motorcomm/chip.c-786-{\ndrivers/net/dsa/motorcomm/chip.c:787:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:788:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:789:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-790-\n--\ndrivers/net/dsa/motorcomm/chip.c=819=static void\ndrivers/net/dsa/motorcomm/chip.c:820:yt921x_dsa_get_pause_stats(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-821-\t\t\t   struct ethtool_pause_stats *pause_stats)\ndrivers/net/dsa/motorcomm/chip.c-822-{\ndrivers/net/dsa/motorcomm/chip.c:823:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:824:\tstruct yt921x_port *pp = \u0026priv-\u003eports[port];\ndrivers/net/dsa/motorcomm/chip.c:825:\tstruct yt921x_mib *mib = \u0026pp-\u003emib;\ndrivers/net/dsa/motorcomm/chip.c-826-\ndrivers/net/dsa/motorcomm/chip.c-827-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:828:\tyt921x_read_mib(priv, port);\ndrivers/net/dsa/motorcomm/chip.c-829-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=835=static int\ndrivers/net/dsa/motorcomm/chip.c:836:yt921x_set_eee(struct yt921x_priv *priv, int port, struct ethtool_keee *e)\ndrivers/net/dsa/motorcomm/chip.c-837-{\n--\ndrivers/net/dsa/motorcomm/chip.c-849-\tif (!!new_mask != !!priv-\u003eeee_ports_mask) {\ndrivers/net/dsa/motorcomm/chip.c:850:\t\tres = yt921x_reg_toggle_bits(priv, YT921X_PON_STRAP_FUNC,\ndrivers/net/dsa/motorcomm/chip.c-851-\t\t\t\t\t     YT921X_PON_STRAP_EEE, !!new_mask);\n--\ndrivers/net/dsa/motorcomm/chip.c-853-\t\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:854:\t\tres = yt921x_reg_toggle_bits(priv, YT921X_PON_STRAP_VAL,\ndrivers/net/dsa/motorcomm/chip.c-855-\t\t\t\t\t     YT921X_PON_STRAP_EEE, !!new_mask);\n--\ndrivers/net/dsa/motorcomm/chip.c-862-\t/* Enable / disable port EEE */\ndrivers/net/dsa/motorcomm/chip.c:863:\tres = yt921x_reg_toggle_bits(priv, YT921X_EEE_CTRL,\ndrivers/net/dsa/motorcomm/chip.c-864-\t\t\t\t     YT921X_EEE_CTRL_ENn(port), enable);\n--\ndrivers/net/dsa/motorcomm/chip.c-866-\t\treturn res;\ndrivers/net/dsa/motorcomm/chip.c:867:\tres = yt921x_reg_toggle_bits(priv, YT921X_EEEn_VAL(port),\ndrivers/net/dsa/motorcomm/chip.c-868-\t\t\t\t     YT921X_EEE_VAL_DATA, enable);\n--\ndrivers/net/dsa/motorcomm/chip.c=875=static int\ndrivers/net/dsa/motorcomm/chip.c:876:yt921x_dsa_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *e)\ndrivers/net/dsa/motorcomm/chip.c-877-{\ndrivers/net/dsa/motorcomm/chip.c:878:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c-879-\tint res;\n--\ndrivers/net/dsa/motorcomm/chip.c-881-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:882:\tres = yt921x_set_eee(priv, port, e);\ndrivers/net/dsa/motorcomm/chip.c-883-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c-887-\ndrivers/net/dsa/motorcomm/chip.c:888:static int yt921x_mtu_fetch(struct yt921x_priv *priv, int port)\ndrivers/net/dsa/motorcomm/chip.c-889-{\n--\ndrivers/net/dsa/motorcomm/chip.c=895=static int\ndrivers/net/dsa/motorcomm/chip.c:896:yt921x_dsa_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)\ndrivers/net/dsa/motorcomm/chip.c-897-{\n--\ndrivers/net/dsa/motorcomm/chip.c-901-\ndrivers/net/dsa/motorcomm/chip.c:902:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c-903-\tstruct dsa_port *dp = dsa_to_port(ds, port);\n--\ndrivers/net/dsa/motorcomm/chip.c-911-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:912:\tres = yt921x_reg_update_bits(priv, YT921X_MACn_FRAME(port),\ndrivers/net/dsa/motorcomm/chip.c-913-\t\t\t\t     YT921X_MAC_FRAME_SIZE_M,\n--\ndrivers/net/dsa/motorcomm/chip.c-919-\ndrivers/net/dsa/motorcomm/chip.c:920:static int yt921x_dsa_port_max_mtu(struct dsa_switch *ds, int port)\ndrivers/net/dsa/motorcomm/chip.c-921-{\n--\ndrivers/net/dsa/motorcomm/chip.c=953=static u64 token2burst(u32 token, int unit, int C)\n--\ndrivers/net/dsa/motorcomm/chip.c-957-\ndrivers/net/dsa/motorcomm/chip.c:958:struct yt921x_marker {\ndrivers/net/dsa/motorcomm/chip.c-959-\tu32 cir;\n--\ndrivers/net/dsa/motorcomm/chip.c=969=static int\ndrivers/net/dsa/motorcomm/chip.c:970:yt921x_marker_tfm(struct yt921x_marker *marker, u64 rate, u64 burst,\ndrivers/net/dsa/motorcomm/chip.c-971-\t\t  unsigned int flags, unsigned int slot_ns, u32 cir_max,\ndrivers/net/dsa/motorcomm/chip.c:972:\t\t  u32 cbs_max, int unit_max, struct yt921x_priv *priv, int port,\ndrivers/net/dsa/motorcomm/chip.c-973-\t\t  struct netlink_ext_ack *extack)\n--\ndrivers/net/dsa/motorcomm/chip.c-977-\tstruct device *dev = to_device(priv);\ndrivers/net/dsa/motorcomm/chip.c:978:\tstruct yt921x_marker m;\ndrivers/net/dsa/motorcomm/chip.c-979-\tu64 burst_est;\n--\ndrivers/net/dsa/motorcomm/chip.c-999-\telse\ndrivers/net/dsa/motorcomm/chip.c:1000:\t\tburst_sug += ETH_HLEN + yt921x_mtu_fetch(priv, port) +\ndrivers/net/dsa/motorcomm/chip.c-1001-\t\t\t     ETH_FCS_LEN;\n--\ndrivers/net/dsa/motorcomm/chip.c=1059=static int\ndrivers/net/dsa/motorcomm/chip.c:1060:yt921x_marker_tfm_police(struct yt921x_marker *marker,\ndrivers/net/dsa/motorcomm/chip.c-1061-\t\t\t const struct flow_action_police *police,\ndrivers/net/dsa/motorcomm/chip.c:1062:\t\t\t unsigned int flags, struct yt921x_priv *priv, int port,\ndrivers/net/dsa/motorcomm/chip.c-1063-\t\t\t struct netlink_ext_ack *extack)\n--\ndrivers/net/dsa/motorcomm/chip.c-1073-\ndrivers/net/dsa/motorcomm/chip.c:1074:\treturn yt921x_marker_tfm(marker, rate, burst, flags,\ndrivers/net/dsa/motorcomm/chip.c-1075-\t\t\t\t priv-\u003emeter_slot_ns, YT921X_METER_CIR_MAX,\n--\ndrivers/net/dsa/motorcomm/chip.c=1080=static int\ndrivers/net/dsa/motorcomm/chip.c:1081:yt921x_marker_tfm_shape(struct yt921x_marker *marker, u64 rate, u64 burst,\ndrivers/net/dsa/motorcomm/chip.c:1082:\t\t\tunsigned int flags, struct yt921x_priv *priv, int port,\ndrivers/net/dsa/motorcomm/chip.c-1083-\t\t\tstruct netlink_ext_ack *extack)\ndrivers/net/dsa/motorcomm/chip.c-1084-{\ndrivers/net/dsa/motorcomm/chip.c:1085:\treturn yt921x_marker_tfm(marker, rate, burst, flags,\ndrivers/net/dsa/motorcomm/chip.c-1086-\t\t\t\t priv-\u003eport_shape_slot_ns, YT921X_SHAPE_CIR_MAX,\n--\ndrivers/net/dsa/motorcomm/chip.c=1091=static int\ndrivers/net/dsa/motorcomm/chip.c:1092:yt921x_police_validate(const struct flow_action_police *police,\ndrivers/net/dsa/motorcomm/chip.c-1093-\t\t       const struct flow_action *action,\n--\ndrivers/net/dsa/motorcomm/chip.c=1127=static int\ndrivers/net/dsa/motorcomm/chip.c:1128:yt921x_meter_config(struct yt921x_priv *priv, unsigned int id,\ndrivers/net/dsa/motorcomm/chip.c:1129:\t\t    const struct yt921x_marker *marker)\ndrivers/net/dsa/motorcomm/chip.c-1130-{\n--\ndrivers/net/dsa/motorcomm/chip.c-1147-\ndrivers/net/dsa/motorcomm/chip.c:1148:\treturn yt921x_reg96_write(priv, YT921X_METERn_CTRL(id), ctrls);\ndrivers/net/dsa/motorcomm/chip.c-1149-}\ndrivers/net/dsa/motorcomm/chip.c-1150-\ndrivers/net/dsa/motorcomm/chip.c:1151:static void yt921x_dsa_port_policer_del(struct dsa_switch *ds, int port)\ndrivers/net/dsa/motorcomm/chip.c-1152-{\ndrivers/net/dsa/motorcomm/chip.c:1153:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c-1154-\tstruct device *dev = to_device(priv);\n--\ndrivers/net/dsa/motorcomm/chip.c-1157-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:1158:\tres = yt921x_reg_write(priv, YT921X_PORTn_METER(port), 0);\ndrivers/net/dsa/motorcomm/chip.c-1159-\tmutex_unlock(\u0026priv-\u003ereg_lock);\n--\ndrivers/net/dsa/motorcomm/chip.c=1166=static int\ndrivers/net/dsa/motorcomm/chip.c:1167:yt921x_dsa_port_policer_add(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-1168-\t\t\t    const struct flow_action_police *police,\n--\ndrivers/net/dsa/motorcomm/chip.c-1170-{\ndrivers/net/dsa/motorcomm/chip.c:1171:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c:1172:\tstruct yt921x_marker marker;\ndrivers/net/dsa/motorcomm/chip.c-1173-\tu32 ctrl;\n--\ndrivers/net/dsa/motorcomm/chip.c-1175-\ndrivers/net/dsa/motorcomm/chip.c:1176:\tres = yt921x_police_validate(police, NULL, NULL, extack);\ndrivers/net/dsa/motorcomm/chip.c-1177-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-1179-\ndrivers/net/dsa/motorcomm/chip.c:1180:\tres = yt921x_marker_tfm_police(\u0026marker, police, 0, priv, port, extack);\ndrivers/net/dsa/motorcomm/chip.c-1181-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-1184-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/chip.c:1185:\tres = yt921x_meter_config(priv, port + YT921X_METER_NUM, \u0026marker);\ndrivers/net/dsa/motorcomm/chip.c-1186-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c-1189-\tctrl = YT921X_PORT_METER_ID(port) | YT921X_PORT_METER_EN;\ndrivers/net/dsa/motorcomm/chip.c:1190:\tres = yt921x_reg_write(priv, YT921X_PORTn_METER(port), ctrl);\ndrivers/net/dsa/motorcomm/chip.c-1191-end:\n--\ndrivers/net/dsa/motorcomm/chip.c=1197=static int\ndrivers/net/dsa/motorcomm/chip.c:1198:yt921x_dsa_port_setup_tc_tbf_port(struct dsa_switch *ds, int port,\ndrivers/net/dsa/motorcomm/chip.c-1199-\t\t\t\t  const struct tc_tbf_qopt_offload *qopt)\ndrivers/net/dsa/motorcomm/chip.c-1200-{\ndrivers/net/dsa/motorcomm/chip.c:1201:\tstruct yt921x_priv *priv = to_yt921x_priv(ds);\ndrivers/net/dsa/motorcomm/chip.c-1202-\tstruct netlink_ext_ack *extack = qopt-\u003eextack;\n--\ndrivers/net/dsa/motorcomm/chip.c-1220-\t\tconst struct tc_tbf_qopt_offload_replace_params *p;\ndrivers/net/dsa/motorcomm/chip.c:1221:\t\tstruct yt921x_marker marker;\ndrivers/net/dsa/motorcomm/chip.c-1222-\n--\ndrivers/net/dsa/motorcomm/chip.c-1224-\ndrivers/net/dsa/motorcomm/chip.c:1225:\t\tres = yt921x_marker_tfm_shape(\u0026marker, p-\u003erate.rate_bytes_ps,\ndrivers/net/dsa/motorcomm/chip.c-1226-\t\t\t\t\t      p-\u003emax_size,\n--\ndrivers/net/dsa/motorcomm/chip.c-1242-\tmutex_lock(\u0026priv-\u003ereg_lock);\n\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 18077
							output: 27
							thoughts: 48
						

Thoughts:
**Investigating the System's Interaction with yt921x**

Okay, so I need to figure out how this `yt921x` integrates within the system. My first thought is to determine its point of entry. Is it using a platform driver, or perhaps interacting via MDIO, SPI, or some other interface? I need to understand its connection to the system's hardware abstraction layers.

To start, I'll go directly to the most logical place: the `drivers/net/dsa/motorcomm/` directory. That seems like the most likely location for any driver-level code specific to this hardware. I'll need to dissect those files to understand the driver's architecture and how it's interfacing with the broader network subsystem. Let's see what's in there.



10/2 2026/09/06 00:25 tool codesearch-dir-index
0m Args:
{
  "Dir": "drivers/net/dsa/motorcomm"
}

Results:
{
  "Files": [
    "chip.c",
    "chip.h",
    "leds.c",
    "leds.h",
    "smi.c",
    "smi.h"
  ],
  "Subdirs": null
}

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

Args:
null

Results:
null

Tokens:
							input: 18376
							output: 36
							thoughts: 26
						

Thoughts:
Here's my thought process, as if I were considering those files:

**Initial Assessment of Driver Implementation**

Okay, so I need to get a handle on how this system's bus drivers are handled, and how the modules are initialized and probed. My immediate thought is to zero in on `smi.c` and `chip.c`. These file names are pretty typical. They're strong candidates to contain the core bus driver logic, or at least the relevant initialization procedures. I'm thinking I'll find the device probe functions in there, too. I want to see how the system identifies and attaches to the relevant hardware. Let's start digging.



12/2 2026/09/06 00:25 tool grepper
0m Args:
{
  "Expression": "module_|driver_register|probe",
  "PathPrefix": "drivers/net/dsa/motorcomm"
}

Results:
{
  "Output": "drivers/net/dsa/motorcomm/chip.c=4692=static void yt921x_mdio_remove(struct mdio_device *mdiodev)\n--\ndrivers/net/dsa/motorcomm/chip.c-4723-\ndrivers/net/dsa/motorcomm/chip.c:4724:static int yt921x_mdio_probe(struct mdio_device *mdiodev)\ndrivers/net/dsa/motorcomm/chip.c-4725-{\n--\ndrivers/net/dsa/motorcomm/chip.c=4778=static struct mdio_driver yt921x_mdio_driver = {\ndrivers/net/dsa/motorcomm/chip.c:4779:\t.probe = yt921x_mdio_probe,\ndrivers/net/dsa/motorcomm/chip.c-4780-\t.remove = yt921x_mdio_remove,\n--\ndrivers/net/dsa/motorcomm/chip.c-4787-\ndrivers/net/dsa/motorcomm/chip.c:4788:mdio_module_driver(yt921x_mdio_driver);\ndrivers/net/dsa/motorcomm/chip.c-4789-\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 18908
							output: 42
							thoughts: 293
						

Thoughts:
**My Analysis of MDIO Device Instantiation in a Virtualized Environment**

Okay, so I'm thinking about how MDIO devices are brought up, specifically in a virtualized setting like QEMU or when fuzzing with syzkaller. The question is, can we instantiate and probe these devices, or even DSA switches, without having the actual hardware present?

First, I need to understand if DSA hardware is even *reachable* in a standard virtualized environment like QEMU or GCE. And how does syzkaller play into all of this with MDIO devices or DSA drivers? I should search kernel fuzzing contexts for clues about how DSA switch drivers or MDIO drivers are handled. Let's see... looking at that Section 2, the "structurally unreachable hardware" category probably isn't relevant here – things like vendor-specific PCIe switches, SmartNICs, or GPU drivers (mlxsw, qed, amdgpu, etc.) are out because they need specific hardware that isn't emulated in QEMU. But "reachable drivers and protocols" is interesting... drivers accessible via virtual buses like virtio, USB gadget, loopback, netlink, binder, and sockets could be the ticket.

Now, let's see about the yt921x device. I remember seeing something about it. Okay, here we are: `struct mdio_driver yt921x_mdio_driver`, and `yt921x_of_match`. Right, does it bind through Device Tree (OF) or directly through the MDIO bus? I need to check `yt921x_mdio_probe` and `yt921x_of_match`. This should give me some insight into its instantiation method.



14/2 2026/09/06 00:25 tool read-file
0m Args:
{
  "File": "drivers/net/dsa/motorcomm/chip.c",
  "FirstLine": 4720,
  "LineCount": 70
}

Results:
{
  "Contents": "4720:\t\t}\n4721:\t\tmutex_destroy(\u0026priv-\u003ereg_lock);\n4722:\t}\n4723:\t\n4724:\tstatic int yt921x_mdio_probe(struct mdio_device *mdiodev)\n4725:\t{\n4726:\t\tstruct device *dev = \u0026mdiodev-\u003edev;\n4727:\t\tstruct yt921x_reg_mdio *mdio;\n4728:\t\tstruct yt921x_priv *priv;\n4729:\t\tstruct dsa_switch *ds;\n4730:\t\n4731:\t\tpriv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);\n4732:\t\tif (!priv)\n4733:\t\t\treturn -ENOMEM;\n4734:\t\n4735:\t\tmdio = devm_kzalloc(dev, sizeof(*mdio), GFP_KERNEL);\n4736:\t\tif (!mdio)\n4737:\t\t\treturn -ENOMEM;\n4738:\t\n4739:\t\tmdio-\u003ebus = mdiodev-\u003ebus;\n4740:\t\tmdio-\u003eaddr = mdiodev-\u003eaddr;\n4741:\t\tmdio-\u003eswitchid = 0;\n4742:\t\n4743:\t\tmutex_init(\u0026priv-\u003ereg_lock);\n4744:\t\n4745:\t\tpriv-\u003ereg_ops = \u0026yt921x_reg_ops_mdio;\n4746:\t\tpriv-\u003ereg_ctx = mdio;\n4747:\t\n4748:\t\tfor (size_t i = 0; i \u003c ARRAY_SIZE(priv-\u003eports); i++) {\n4749:\t\t\tstruct yt921x_port *pp = \u0026priv-\u003eports[i];\n4750:\t\n4751:\t\t\tpp-\u003eindex = i;\n4752:\t\t\tINIT_DELAYED_WORK(\u0026pp-\u003emib_read, yt921x_poll_mib);\n4753:\t\t}\n4754:\t\n4755:\t\tds = \u0026priv-\u003eds;\n4756:\t\tds-\u003edev = dev;\n4757:\t\tds-\u003eassisted_learning_on_cpu_port = true;\n4758:\t\tds-\u003edscp_prio_mapping_is_global = true;\n4759:\t\tds-\u003epriv = priv;\n4760:\t\tds-\u003eops = \u0026yt921x_dsa_switch_ops;\n4761:\t\tds-\u003eageing_time_min = 1 * 5000;\n4762:\t\tds-\u003eageing_time_max = U16_MAX * 5000;\n4763:\t\tds-\u003ephylink_mac_ops = \u0026yt921x_phylink_mac_ops;\n4764:\t\tds-\u003enum_lag_ids = YT921X_LAG_NUM;\n4765:\t\tds-\u003enum_ports = YT921X_PORT_NUM;\n4766:\t\n4767:\t\tmdiodev_set_drvdata(mdiodev, priv);\n4768:\t\n4769:\t\treturn dsa_register_switch(ds);\n4770:\t}\n4771:\t\n4772:\tstatic const struct of_device_id yt921x_of_match[] = {\n4773:\t\t{ .compatible = \"motorcomm,yt9215\" },\n4774:\t\t{}\n4775:\t};\n4776:\tMODULE_DEVICE_TABLE(of, yt921x_of_match);\n4777:\t\n4778:\tstatic struct mdio_driver yt921x_mdio_driver = {\n4779:\t\t.probe = yt921x_mdio_probe,\n4780:\t\t.remove = yt921x_mdio_remove,\n4781:\t\t.shutdown = yt921x_mdio_shutdown,\n4782:\t\t.mdiodrv.driver = {\n4783:\t\t\t.name = YT921X_NAME,\n4784:\t\t\t.of_match_table = yt921x_of_match,\n4785:\t\t},\n4786:\t};\n4787:\t\n4788:\tmdio_module_driver(yt921x_mdio_driver);\n4789:\t\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 20760
							output: 40
							thoughts: 26
						

Thoughts:
Here's my summary, as if I were thinking these thoughts:

**Analyzing `yt921x_led_blink_set` Call Flow**

Okay, so I need to figure out the call path to this `yt921x_led_blink_set` function. Let's trace how it's actually being used. I need to understand where in the code this modified function is being invoked and, crucially, how we reach that point. Is it called directly, or is it part of a larger chain of function calls? Are there conditional statements or other logic that determine whether or not it's triggered? Identifying the entry point is key to understanding its purpose and potential impact. I need to quickly determine the control flow that leads to it. I'm going to look for references to the function name, or anything related to the LED blinking functionality within the codebase, and see where they lead.



16/2 2026/09/06 00:25 tool grepper
0m Args:
{
  "Expression": "yt921x_led_blink_set",
  "PathPrefix": "drivers/net/dsa/motorcomm"
}

Results:
{
  "Output": "drivers/net/dsa/motorcomm/leds.c=91=static int\ndrivers/net/dsa/motorcomm/leds.c:92:yt921x_led_blink_set(struct yt921x_priv *priv, int port, int group,\ndrivers/net/dsa/motorcomm/leds.c-93-\t\t     unsigned long *onp, unsigned long *offp)\n--\ndrivers/net/dsa/motorcomm/leds.c=335=yt921x_cled_blink_set(struct led_classdev *led_cdev, unsigned long *delay_on,\n--\ndrivers/net/dsa/motorcomm/leds.c-343-\tmutex_lock(\u0026priv-\u003ereg_lock);\ndrivers/net/dsa/motorcomm/leds.c:344:\tres = yt921x_led_blink_set(priv, pp-\u003eindex, led-\u003egroup, delay_on,\ndrivers/net/dsa/motorcomm/leds.c-345-\t\t\t\t   delay_off);\n"
}

17/2 2026/09/06 00:25 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 21291
							output: 27
							thoughts: 301
						

Thoughts:
**Analyzing the LED Control for the Motorcomm YT9215 Switch**

Okay, let's break this down. `yt921x_cled_blink_set` is the callback function for an `led_classdev` structure. That's good, it suggests a standard LED framework is in use. It's set up when the yt921x switch is probed and registered. So, the key is understanding how the device itself gets probed.

Ah, right, it's an MDIO device. And the compatible string is "motorcomm,yt9215" – that's the tell. It relies on Device Tree (OF) or an MDIO bus match for probing. Now, the real question is whether I can even get this to probe in a standard virtual environment like QEMU or Google Compute Engine, running on x86_64 or amd64.

Okay, let's think. First, is there even an MDIO bus, or any kind of OF emulation, or virtual bus implemented on amd64 in those environments? I seriously doubt it... but let's be sure. In typical QEMU/GCE, there's no physical Motorcomm YT9215 switch chip. `yt921x_mdio_driver` requires that specific hardware and its associated device tree node. And so, the question I need to answer is, can syzkaller or something similar in userspace, somehow create MDIO devices on-the-fly or bind the `mdio_driver` directly? I need to search the kernel code and see if there's any mechanism for creating MDIO devices from userspace, or even, if there is such a thing as a virtual MDIO bus I could leverage.



18/2 2026/09/06 00:25 tool grepper
0m Args:
{
  "Expression": "mdio_device_register|mdio_device_create"
}

Results:
{
  "Output": "drivers/net/dsa/dsa_loop.c=446=static int __init dsa_loop_create_switch_mdiodev(void)\n--\ndrivers/net/dsa/dsa_loop.c-466-\ndrivers/net/dsa/dsa_loop.c:467:\tswitch_mdiodev = mdio_device_create(bus, 31);\ndrivers/net/dsa/dsa_loop.c-468-\tif (IS_ERR(switch_mdiodev))\n--\ndrivers/net/dsa/dsa_loop.c-473-\ndrivers/net/dsa/dsa_loop.c:474:\tret = mdio_device_register(switch_mdiodev);\ndrivers/net/dsa/dsa_loop.c-475-\tif (ret)\n--\ndrivers/net/mdio/of_mdio.c=52=static int of_mdiobus_register_device(struct mii_bus *mdio,\n--\ndrivers/net/mdio/of_mdio.c-58-\ndrivers/net/mdio/of_mdio.c:59:\tmdiodev = mdio_device_create(mdio, addr);\ndrivers/net/mdio/of_mdio.c-60-\tif (IS_ERR(mdiodev))\n--\ndrivers/net/mdio/of_mdio.c-68-\t/* All data is now stored in the mdiodev struct; register it. */\ndrivers/net/mdio/of_mdio.c:69:\trc = mdio_device_register(mdiodev);\ndrivers/net/mdio/of_mdio.c-70-\tif (rc) {\n--\ndrivers/net/pcs/pcs-lynx.c=310=struct phylink_pcs *lynx_pcs_create_mdiodev(struct mii_bus *bus, int addr)\n--\ndrivers/net/pcs/pcs-lynx.c-314-\ndrivers/net/pcs/pcs-lynx.c:315:\tmdio = mdio_device_create(bus, addr);\ndrivers/net/pcs/pcs-lynx.c-316-\tif (IS_ERR(mdio))\n--\ndrivers/net/pcs/pcs-xpcs-plat.c=337=static int xpcs_plat_init_dev(struct dw_xpcs_plat *pxpcs)\n--\ndrivers/net/pcs/pcs-xpcs-plat.c-343-\t/* There is a single memory-mapped DW XPCS device */\ndrivers/net/pcs/pcs-xpcs-plat.c:344:\tmdiodev = mdio_device_create(pxpcs-\u003ebus, 0);\ndrivers/net/pcs/pcs-xpcs-plat.c-345-\tif (IS_ERR(mdiodev))\n--\ndrivers/net/pcs/pcs-xpcs-plat.c-356-\ndrivers/net/pcs/pcs-xpcs-plat.c:357:\tret = mdio_device_register(mdiodev);\ndrivers/net/pcs/pcs-xpcs-plat.c-358-\tif (ret) {\n--\ndrivers/net/pcs/pcs-xpcs.c=1621=struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr)\n--\ndrivers/net/pcs/pcs-xpcs.c-1625-\ndrivers/net/pcs/pcs-xpcs.c:1626:\tmdiodev = mdio_device_create(bus, addr);\ndrivers/net/pcs/pcs-xpcs.c-1627-\tif (IS_ERR(mdiodev))\n--\ndrivers/net/phy/air_en8811h.c=1080=static int an8811hb_probe(struct phy_device *phydev)\n--\ndrivers/net/phy/air_en8811h.c-1098-\t */\ndrivers/net/phy/air_en8811h.c:1099:\tmdiodev = mdio_device_create(phydev-\u003emdio.bus,\ndrivers/net/phy/air_en8811h.c-1100-\t\t\t\t     phydev-\u003emdio.addr + EN8811H_PBUS_ADDR_OFFS);\n--\ndrivers/net/phy/air_en8811h.c-1103-\ndrivers/net/phy/air_en8811h.c:1104:\tret = mdio_device_register(mdiodev);\ndrivers/net/phy/air_en8811h.c-1105-\tif (ret)\n--\ndrivers/net/phy/mdio_device.c-26-/**\ndrivers/net/phy/mdio_device.c:27: * mdio_device_register_reset - Read and initialize the reset properties of\ndrivers/net/phy/mdio_device.c-28- *\t\t\t\tan mdio device\n--\ndrivers/net/phy/mdio_device.c-32- */\ndrivers/net/phy/mdio_device.c:33:static int mdio_device_register_reset(struct mdio_device *mdiodev)\ndrivers/net/phy/mdio_device.c-34-{\n--\ndrivers/net/phy/mdio_device.c=113=static void mdio_device_release(struct device *dev)\n--\ndrivers/net/phy/mdio_device.c-118-\ndrivers/net/phy/mdio_device.c:119:struct mdio_device *mdio_device_create(struct mii_bus *bus, int addr)\ndrivers/net/phy/mdio_device.c-120-{\n--\ndrivers/net/phy/mdio_device.c-142-}\ndrivers/net/phy/mdio_device.c:143:EXPORT_SYMBOL(mdio_device_create);\ndrivers/net/phy/mdio_device.c-144-\ndrivers/net/phy/mdio_device.c-145-/**\ndrivers/net/phy/mdio_device.c:146: * mdio_device_register - Register the mdio device on the MDIO bus\ndrivers/net/phy/mdio_device.c-147- * @mdiodev: mdio_device structure to be added to the MDIO bus\n--\ndrivers/net/phy/mdio_device.c-150- */\ndrivers/net/phy/mdio_device.c:151:int mdio_device_register(struct mdio_device *mdiodev)\ndrivers/net/phy/mdio_device.c-152-{\n--\ndrivers/net/phy/mdio_device.c-172-}\ndrivers/net/phy/mdio_device.c:173:EXPORT_SYMBOL(mdio_device_register);\ndrivers/net/phy/mdio_device.c-174-\n--\ndrivers/net/phy/mdio_device.c-180- * This doesn't free the mdio_device itself, it merely reverses the effects\ndrivers/net/phy/mdio_device.c:181: * of mdio_device_register(). Use mdio_device_free() to free the device\ndrivers/net/phy/mdio_device.c-182- * after calling this function.\n--\ndrivers/net/phy/mdio_device.c=191=int mdiobus_register_device(struct mdio_device *mdiodev)\n--\ndrivers/net/phy/mdio_device.c-198-\tif (mdiodev-\u003eflags \u0026 MDIO_DEVICE_FLAG_PHY) {\ndrivers/net/phy/mdio_device.c:199:\t\terr = mdio_device_register_reset(mdiodev);\ndrivers/net/phy/mdio_device.c-200-\t\tif (err)\n--\ninclude/linux/mdio.h=94=void mdio_device_free(struct mdio_device *mdiodev);\ninclude/linux/mdio.h:95:struct mdio_device *mdio_device_create(struct mii_bus *bus, int addr);\ninclude/linux/mdio.h:96:int mdio_device_register(struct mdio_device *mdiodev);\ninclude/linux/mdio.h-97-void mdio_device_remove(struct mdio_device *mdiodev);\n"
}

19/2 2026/09/06 00:25 llm patch-evaluator
0m Model:
gemini-3.7-flash

Args:
null

Results:
null

Tokens:
							input: 24118
							output: 135
							thoughts: 686
						

Thoughts:
**Analysis of Fuzzing Reachability for Motorcomm YT9215 LED Driver**

Okay, let's break this down. We're looking at `dsa_loop` – the mock DSA driver – and the Motorcomm YT9215 driver (`NET_DSA_YT921X`). My understanding is, the YT9215 communicates with its switch chip via MDIO, using `yt921x_reg_ops_mdio`. The driver probes based on an MDIO device matching the "motorcomm,yt9215" OF compatible string or driver name.

Now, considering the QEMU/GCE x86_64 setup, we're dealing with a standard virtualized environment. There's no physical Motorcomm YT9215 hardware present, and, crucially, no emulation of this specific ASIC.

Referring to the instructions, section 2 flags "structurally unreachable hardware". This specifically calls out vendor-specific stuff like PCIe switches, SmartNICs, or GPU drivers that depend on physical ASICs or PCIe cards not emulated in standard QEMU. That's a red flag. Section 1 reinforces this – reachability is key. Fuzzing only works on code that *executes* in these environments, which means we can only test devices that are emulated such as USB gadgets, or netdevs etc. If the code is structurally unreachable, we don't fuzz it.

Okay, let's be absolutely sure. The modified file is `drivers/net/dsa/motorcomm/leds.c`, which is part of the `NET_DSA_YT921X` driver. The function changed is `yt921x_led_blink_set`, an internal LED configuration function for the YT9215. It requires the YT9215 switch to be probed and bound to an MDIO device. This requires the physical YT9215 ASIC.

Therefore, because this particular hardware is not present, nor emulated, in QEMU/GCE, this code is structurally unreachable for syzkaller fuzzing.

Let's summarize:
-   `WorthFuzzing`: false
-   `FocusSymbols`: []
-   `EnableConfigs`: []
-   `Reasoning`: The patch targets `yt921x_led_blink_set()` within `drivers/net/dsa/motorcomm/leds.c`, which, as part of the `NET_DSA_YT921X` driver, requires specific physical switch hardware (YT9215 ASIC on an MDIO bus). Since we are in QEMU/GCE, this hardware is not emulated in the standard virtualized fuzzing environment, making the modified code structurally unreachable.

Now, let's call `set-results`.



20/2 2026/09/06 00:25 tool set-results
0m Args:
{
  "EnableConfigs": [],
  "FocusSymbols": [],
  "Reasoning": "The patch modifies yt921x_led_blink_set() in drivers/net/dsa/motorcomm/leds.c, which is part of the Motorcomm YT9215 ethernet switch driver (NET_DSA_YT921X). This driver targets specific physical ASIC hardware (Motorcomm YT9215) on an MDIO bus and is not emulated in standard QEMU or GCE virtualized environments, making the code structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies yt921x_led_blink_set() in drivers/net/dsa/motorcomm/leds.c, which is part of the Motorcomm YT9215 ethernet switch driver (NET_DSA_YT921X). This driver targets specific physical ASIC hardware (Motorcomm YT9215) on an MDIO bus and is not emulated in standard QEMU or GCE virtualized environments, making the code structurally unreachable for fuzzing.",
  "WorthFuzzing": false
}

21/1 2026/09/06 00:25 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)