| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/03 07:42 | flow | patch-triage |
2mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell 88E6xxx DSA switch driver. This is a hardware-specific driver that requires an MDIO bus and is instantiated exclusively via Device Tree (or platform data which is unused). Since standard virtualized environments (like QEMU/GCE) do not emulate this specific hardware or provide the necessary Device Tree nodes, this code is unreachable and cannot be fuzzed.",
"WorthFuzzing": false
} |
| 1/1 | 2026/07/03 07:42 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 6657b7415f0df625cfbc8eff11ce031541be599e\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Fri Jul 3 07:42:44 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c\nindex 80b877c74513d6..73c28bf2bf3cbf 100644\n--- a/drivers/net/dsa/mv88e6xxx/chip.c\n+++ b/drivers/net/dsa/mv88e6xxx/chip.c\n@@ -974,6 +974,10 @@ static void mv88e6xxx_mac_link_down(struct phylink_config *config,\n \t mode == MLO_AN_FIXED) \u0026\u0026 ops-\u003eport_sync_link)\n \t\terr = ops-\u003eport_sync_link(chip, port, mode, false);\n \n+\tif (!err)\n+\t\terr = mv88e6xxx_port_set_force_flow_ctl(chip, port, false,\n+\t\t\t\t\t\t\tfalse);\n+\n \tif (!err \u0026\u0026 ops-\u003eport_set_speed_duplex)\n \t\terr = ops-\u003eport_set_speed_duplex(chip, port, SPEED_UNFORCED,\n \t\t\t\t\t\t DUPLEX_UNFORCED);\n@@ -1012,6 +1016,11 @@ static void mv88e6xxx_mac_link_up(struct phylink_config *config,\n \t\t\t\tgoto error;\n \t\t}\n \n+\t\terr = mv88e6xxx_port_set_force_flow_ctl(chip, port, true,\n+\t\t\t\t\t\t\trx_pause);\n+\t\tif (err)\n+\t\t\tgoto error;\n+\n \t\tif (ops-\u003eport_sync_link)\n \t\t\terr = ops-\u003eport_sync_link(chip, port, mode, true);\n \t}\ndiff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c\nindex ea1fab71968a0a..7ee802cf3412c7 100644\n--- a/drivers/net/dsa/mv88e6xxx/port.c\n+++ b/drivers/net/dsa/mv88e6xxx/port.c\n@@ -182,6 +182,26 @@ int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)\n \treturn 0;\n }\n \n+int mv88e6xxx_port_set_force_flow_ctl(struct mv88e6xxx_chip *chip, int port,\n+\t\t\t\t bool force, bool value)\n+{\n+\tu16 reg;\n+\tint err;\n+\n+\terr = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, \u0026reg);\n+\tif (err)\n+\t\treturn err;\n+\n+\treg \u0026= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_FC | MV88E6XXX_PORT_MAC_CTL_FC);\n+\tif (force) {\n+\t\treg |= MV88E6XXX_PORT_MAC_CTL_FORCE_FC;\n+\t\tif (value)\n+\t\t\treg |= MV88E6XXX_PORT_MAC_CTL_FC;\n+\t}\n+\n+\treturn mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);\n+}\n+\n int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup)\n {\n \tconst struct mv88e6xxx_ops *ops = chip-\u003einfo-\u003eops;\ndiff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h\nindex 5b6cde9f7406f5..f98df6351f5b77 100644\n--- a/drivers/net/dsa/mv88e6xxx/port.h\n+++ b/drivers/net/dsa/mv88e6xxx/port.h\n@@ -485,6 +485,8 @@ int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,\n \t\t\t\t phy_interface_t mode);\n \n int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link);\n+int mv88e6xxx_port_set_force_flow_ctl(struct mv88e6xxx_chip *chip, int port,\n+\t\t\t\t bool force, bool value);\n \n int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);\n int mv88e6185_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);\n"
} |
| 2/1 | 2026/07/03 07:42 | agent | patch-evaluator |
2mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell 88E6xxx DSA switch driver. This is a hardware-specific driver that requires an MDIO bus and is instantiated exclusively via Device Tree (or platform data which is unused). Since standard virtualized environments (like QEMU/GCE) do not emulate this specific hardware or provide the necessary Device Tree nodes, this code is unreachable and cannot be fuzzed.",
"WorthFuzzing": false
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. List them in the EnableConfigs output array, and DO NOT add a '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: For your convenience, here is the diff of the changes:
commit 6657b7415f0df625cfbc8eff11ce031541be599e
Author: syz-cluster <triage@syzkaller.com>
Date: Fri Jul 3 07:42:44 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 80b877c74513d6..73c28bf2bf3cbf 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -974,6 +974,10 @@ static void mv88e6xxx_mac_link_down(struct phylink_config *config,
mode == MLO_AN_FIXED) && ops->port_sync_link)
err = ops->port_sync_link(chip, port, mode, false);
+ if (!err)
+ err = mv88e6xxx_port_set_force_flow_ctl(chip, port, false,
+ false);
+
if (!err && ops->port_set_speed_duplex)
err = ops->port_set_speed_duplex(chip, port, SPEED_UNFORCED,
DUPLEX_UNFORCED);
@@ -1012,6 +1016,11 @@ static void mv88e6xxx_mac_link_up(struct phylink_config *config,
goto error;
}
+ err = mv88e6xxx_port_set_force_flow_ctl(chip, port, true,
+ rx_pause);
+ if (err)
+ goto error;
+
if (ops->port_sync_link)
err = ops->port_sync_link(chip, port, mode, true);
}
diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c
index ea1fab71968a0a..7ee802cf3412c7 100644
--- a/drivers/net/dsa/mv88e6xxx/port.c
+++ b/drivers/net/dsa/mv88e6xxx/port.c
@@ -182,6 +182,26 @@ int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
return 0;
}
+int mv88e6xxx_port_set_force_flow_ctl(struct mv88e6xxx_chip *chip, int port,
+ bool force, bool value)
+{
+ u16 reg;
+ int err;
+
+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_MAC_CTL, ®);
+ if (err)
+ return err;
+
+ reg &= ~(MV88E6XXX_PORT_MAC_CTL_FORCE_FC | MV88E6XXX_PORT_MAC_CTL_FC);
+ if (force) {
+ reg |= MV88E6XXX_PORT_MAC_CTL_FORCE_FC;
+ if (value)
+ reg |= MV88E6XXX_PORT_MAC_CTL_FC;
+ }
+
+ return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
+}
+
int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup)
{
const struct mv88e6xxx_ops *ops = chip->info->ops;
diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h
index 5b6cde9f7406f5..f98df6351f5b77 100644
--- a/drivers/net/dsa/mv88e6xxx/port.h
+++ b/drivers/net/dsa/mv88e6xxx/port.h
@@ -485,6 +485,8 @@ int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
phy_interface_t mode);
int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link);
+int mv88e6xxx_port_set_force_flow_ctl(struct mv88e6xxx_chip *chip, int port,
+ bool force, bool value);
int mv88e6xxx_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);
int mv88e6185_port_sync_link(struct mv88e6xxx_chip *chip, int port, unsigned int mode, bool isup);
|
| 3/2 | 2026/07/03 07:42 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2895 output: 24 thoughts: 193 Thoughts: **Analyzing a Potential Driver Patch** Okay, so I'm looking at this patch that touches `drivers/net/dsa/mv88e6xxx/chip.c` and `drivers/net/dsa/mv88e6xxx/port.c`. It looks like it's introducing `mv88e6xxx_port_set_force_flow_ctl` and then calls that function from `mv88e6xxx_mac_link_down` and `mv88e6xxx_mac_link_up`. That strongly suggests this is a driver for Marvell 88E6xxx Ethernet switches within the DSA (Distributed Switch Architecture) framework. My immediate question, as always, is about the deployment context. DSA switches are *typically* physical hardware. They're connected to the system via MDIO, I2C, or SPI. But with virtualization becoming so prevalent, I have to consider: is this driver *actually* reachable in a virtualized environment? Is there some kind of emulated DSA switch I should be aware of, or is this patch inherently tied to real hardware? I need to check the build configuration and see if this driver is purely hardware-dependent or if there's any indication of virtualization support. I'll search for `NET_DSA_MV88E6XXX` in the Kconfig files to get a clearer picture of its configuration options and potential dependencies. That should point me in the right direction. |
| 4/2 | 2026/07/03 07:43 | tool | grepper |
0mArgs:{
"Expression": "NET_DSA_MV88E6XXX"
}Results: {
"Output": "arch/arm/configs/multi_v5_defconfig=97=CONFIG_NET_DSA_MV88E6060=y\narch/arm/configs/multi_v5_defconfig:98:CONFIG_NET_DSA_MV88E6XXX=y\narch/arm/configs/multi_v5_defconfig-99-CONFIG_MACB=y\n--\narch/arm/configs/mvebu_v5_defconfig=80=CONFIG_NET_DSA_MV88E6060=y\narch/arm/configs/mvebu_v5_defconfig:81:CONFIG_NET_DSA_MV88E6XXX=y\narch/arm/configs/mvebu_v5_defconfig-82-CONFIG_MV643XX_ETH=y\n--\narch/arm/configs/orion5x_defconfig=67=CONFIG_MII=y\narch/arm/configs/orion5x_defconfig:68:CONFIG_NET_DSA_MV88E6XXX=y\narch/arm/configs/orion5x_defconfig-69-CONFIG_MV643XX_ETH=y\n--\ndrivers/net/dsa/mv88e6xxx/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/dsa/mv88e6xxx/Kconfig:2:config NET_DSA_MV88E6XXX\ndrivers/net/dsa/mv88e6xxx/Kconfig-3-\ttristate \"Marvell 88E6xxx Ethernet switch fabric support\"\n--\ndrivers/net/dsa/mv88e6xxx/Kconfig-11-\ndrivers/net/dsa/mv88e6xxx/Kconfig:12:config NET_DSA_MV88E6XXX_PTP\ndrivers/net/dsa/mv88e6xxx/Kconfig-13-\tbool \"PTP support for Marvell 88E6xxx\"\ndrivers/net/dsa/mv88e6xxx/Kconfig-14-\tdefault n\ndrivers/net/dsa/mv88e6xxx/Kconfig:15:\tdepends on (NET_DSA_MV88E6XXX = y \u0026\u0026 PTP_1588_CLOCK = y) || \\\ndrivers/net/dsa/mv88e6xxx/Kconfig:16:\t (NET_DSA_MV88E6XXX = m \u0026\u0026 PTP_1588_CLOCK)\ndrivers/net/dsa/mv88e6xxx/Kconfig-17-\thelp\n--\ndrivers/net/dsa/mv88e6xxx/Kconfig-20-\ndrivers/net/dsa/mv88e6xxx/Kconfig:21:config NET_DSA_MV88E6XXX_LEDS\ndrivers/net/dsa/mv88e6xxx/Kconfig-22-\tbool \"LED support for Marvell 88E6xxx\"\ndrivers/net/dsa/mv88e6xxx/Kconfig-23-\tdefault y\ndrivers/net/dsa/mv88e6xxx/Kconfig:24:\tdepends on NET_DSA_MV88E6XXX\ndrivers/net/dsa/mv88e6xxx/Kconfig:25:\tdepends on LEDS_CLASS=y || LEDS_CLASS=NET_DSA_MV88E6XXX\ndrivers/net/dsa/mv88e6xxx/Kconfig-26-\tdepends on LEDS_TRIGGERS\n--\ndrivers/net/dsa/mv88e6xxx/Makefile-1-# SPDX-License-Identifier: GPL-2.0\ndrivers/net/dsa/mv88e6xxx/Makefile:2:obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o\ndrivers/net/dsa/mv88e6xxx/Makefile-3-mv88e6xxx-objs := chip.o\n--\ndrivers/net/dsa/mv88e6xxx/Makefile=10=mv88e6xxx-objs += global2_scratch.o\ndrivers/net/dsa/mv88e6xxx/Makefile:11:mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += hwtstamp.o\ndrivers/net/dsa/mv88e6xxx/Makefile:12:mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_LEDS) += leds.o\ndrivers/net/dsa/mv88e6xxx/Makefile-13-mv88e6xxx-objs += pcs-6185.o\n--\ndrivers/net/dsa/mv88e6xxx/Makefile=18=mv88e6xxx-objs += port_hidden.o\ndrivers/net/dsa/mv88e6xxx/Makefile:19:mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += ptp.o\ndrivers/net/dsa/mv88e6xxx/Makefile-20-mv88e6xxx-objs += serdes.o\n--\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-110-\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h:111:#ifdef CONFIG_NET_DSA_MV88E6XXX_PTP\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-112-\n--\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h=133=int mv88e6165_global_disable(struct mv88e6xxx_chip *chip);\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-134-\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h:135:#else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-136-\n--\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h=175=static inline void mv88e6xxx_hwtstamp_free(struct mv88e6xxx_chip *chip)\n--\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-178-\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h:179:#endif /* CONFIG_NET_DSA_MV88E6XXX_PTP */\ndrivers/net/dsa/mv88e6xxx/hwtstamp.h-180-\n--\ndrivers/net/dsa/mv88e6xxx/port.h=581=int mv88e6352_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode);\ndrivers/net/dsa/mv88e6xxx/port.h:582:#ifdef CONFIG_NET_DSA_MV88E6XXX_LEDS\ndrivers/net/dsa/mv88e6xxx/port.h-583-int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port);\n--\ndrivers/net/dsa/mv88e6xxx/ptp.h-66-\ndrivers/net/dsa/mv88e6xxx/ptp.h:67:#ifdef CONFIG_NET_DSA_MV88E6XXX_PTP\ndrivers/net/dsa/mv88e6xxx/ptp.h-68-\n--\ndrivers/net/dsa/mv88e6xxx/ptp.h=77=extern const struct mv88e6xxx_ptp_ops mv88e6390_ptp_ops;\ndrivers/net/dsa/mv88e6xxx/ptp.h-78-\ndrivers/net/dsa/mv88e6xxx/ptp.h:79:#else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */\ndrivers/net/dsa/mv88e6xxx/ptp.h-80-\n--\ndrivers/net/dsa/mv88e6xxx/ptp.h=92=static const struct mv88e6xxx_ptp_ops mv88e6390_ptp_ops = {};\ndrivers/net/dsa/mv88e6xxx/ptp.h-93-\ndrivers/net/dsa/mv88e6xxx/ptp.h:94:#endif /* CONFIG_NET_DSA_MV88E6XXX_PTP */\ndrivers/net/dsa/mv88e6xxx/ptp.h-95-\n--\nnet/dsa/port.c=1726=static const char * const dsa_switches_apply_workarounds[] = {\n--\nnet/dsa/port.c-1777-#endif\nnet/dsa/port.c:1778:#if IS_ENABLED(CONFIG_NET_DSA_MV88E6XXX)\nnet/dsa/port.c-1779-\t\"marvell,mv88e6085\",\n"
} |
| 5/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5715 output: 54 thoughts: 207 Thoughts: **Analyzing the Feasibility of Testing NET_DSA_MV88E6XXX in Syzkaller** Okay, so I'm looking at this `NET_DSA_MV88E6XXX` driver and immediately I'm thinking about virtualization. DSA switches, in my experience, are usually tied to physical hardware. I know about the `dsa_loop` mock driver, which helps, but `mv88e6xxx` is a *specific* hardware driver, so that's not going to be a straightforward test. The question then becomes, can I even *reach* this thing within a virtualized environment? My first thought goes to I2C/MDIO emulation; could I somehow probe it through that? The catch is, and I have to be realistic here, syzkaller doesn't typically provide dedicated I2C/MDIO hardware emulation for Marvell switches specifically. I know syzkaller has some basic I2C/MDIO fuzzing capabilities; things like `vhci` or `i2c-stub` exist, right? But the chances of actually reaching complex hardware drivers without a targeted mock setup are slim, especially with the kinds of complex data flows involved with network switching. So, I need to figure out if there is *any* method I can use to probe `mv88e6xxx` within syzkaller. Right now, I'm thinking I need to find out if `mv88e6xxx` relies *purely* on MDIO/SMI for its communication. I'll need to dig into the kernel source and see what its dependencies look like, how it actually interfaces. Let's see if this thing is even reachable from a userland perspective, or if it requires a more privileged execution context. |
| 6/2 | 2026/07/03 07:43 | tool | grepper |
0mError:no matches Args: {
"Expression": "module_mdio_driver|module_i2c_driver|module_spi_driver",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"error": "no matches"
} |
| 7/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6364 output: 38 thoughts: 16 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Investigating the `mv88e6xxx` Registration Process** Alright, so I need to dig into the `mv88e6xxx` driver. My immediate focus is understanding *how* it's registered within the system. I want to see the specific mechanisms being employed. Are we talking about a platform device, a simple I2C or SPI probe, or something more complex? I need to quickly identify the registration function calls. Are we looking at `platform_device_register`, `i2c_driver_register`, or a custom registration scheme? Understanding this initial setup is crucial for tracing the driver's execution path and understanding its dependencies. I'll need to know whether the initialization sequence is typical or if there are any unusual quirks I need to be aware of. The registration method will clue me in to the interrupt handling, clock setup, and other resource management strategies. From there, I can start to map out the overall driver architecture and how it interacts with the underlying hardware. |
| 8/2 | 2026/07/03 07:43 | tool | grepper |
0mArgs:{
"Expression": "module_.*driver",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7530=static struct mdio_driver mv88e6xxx_driver = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7540-\ndrivers/net/dsa/mv88e6xxx/chip.c:7541:mdio_module_driver(mv88e6xxx_driver);\ndrivers/net/dsa/mv88e6xxx/chip.c-7542-\n"
} |
| 9/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6786 output: 46 thoughts: 150 Thoughts: **MDIO Driver Fuzzing Feasibility** Okay, so I'm looking at this MDIO driver and my first thought is, can syzkaller even touch this thing? I know it has *some* MDIO support, maybe through that `mdio-mock` thing, or something similar? Actually, no, that's not really how it works. I remember now, syzkaller *can* inject MDIO devices, but only if there's a virtual MDIO bus set up, right? But regardless of syzkaller's device injection capability, the core of the problem here seems to be that the patch modifies `mv88e6xxx_mac_link_down` and `mv88e6xxx_mac_link_up`. These functions are directly related to link state changes – link down/up, respectively. So, the key is whether or not these functions are even reachable. Let's see… Okay, it looks like `mv88e6xxx_mac_link_down` is part of `phylink_mac_ops`. That's a good starting point. This at least gives me something to look at, and it's looking like this could be a good point to start investigating exploitability. |
| 10/2 | 2026/07/03 07:43 | tool | grepper |
0mArgs:{
"Expression": "mv88e6xxx_mac_link_down",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=928=static int mv88e6xxx_mac_finish(struct phylink_config *config,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-956-\ndrivers/net/dsa/mv88e6xxx/chip.c:957:static void mv88e6xxx_mac_link_down(struct phylink_config *config,\ndrivers/net/dsa/mv88e6xxx/chip.c-958-\t\t\t\t unsigned int mode,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7187=static const struct phylink_mac_ops mv88e6xxx_phylink_mac_ops = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7191-\t.mac_finish\t\t= mv88e6xxx_mac_finish,\ndrivers/net/dsa/mv88e6xxx/chip.c:7192:\t.mac_link_down\t\t= mv88e6xxx_mac_link_down,\ndrivers/net/dsa/mv88e6xxx/chip.c-7193-\t.mac_link_up\t\t= mv88e6xxx_mac_link_up,\n"
} |
| 11/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 7591 output: 18 thoughts: 139 Thoughts: **Investigating the Reachability of `mv88e6xxx_mac_link_down` in Syzkaller** Okay, so I'm trying to figure out if we can actually trigger the `mv88e6xxx_mac_link_down` function within syzkaller's test environment. My first thought is to check the syzkaller configs – is the `NET_DSA_MV88E6XXX` driver enabled? Syzkaller's usually pretty aggressive about enabling drivers, but this one is specific. Even if the driver is enabled, the real question is whether this code is reachable in a virtualized context. To get to `mv88e6xxx_mac_link_down`, the driver needs to probe successfully. That means we need an MDIO bus and a device with the right ID for the driver. My next question is: does syzkaller provide a mechanism for instantiating MDIO devices? I know we have `dsa_loop` for DSA, but that's just a fixed mock driver. I need to dig deeper and see if there's any MDIO bus emulation happening within syzkaller that could let us do this. The absence of a mechanism is an important piece of information. |
| 12/2 | 2026/07/03 07:43 | tool | grepper |
0mError:no matches Args: {
"Expression": "mdio.*mock"
}Results: {
"error": "no matches"
} |
| 13/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8026 output: 18 thoughts: 9 Thoughts: Okay, here's my interpretation of that thought process, tailored for an expert audience, and presented as if it were my own internal monologue: **Investigating a Potentially Obscure Interface** Hmm, so I'm looking at a situation where a standard MDIO interface might be in play. But, given the specifics, I need to dig deeper than the typical configurations. My thought process is now circling around *`mdio.*dummy`*. I’m immediately considering if I'm looking at a specialized or perhaps even a debug implementation of MDIO. That "dummy" term is often used as a placeholder or to denote a simplified or virtual instance. It could be pointing to a scenario where the actual PHY interaction is being simulated or bypassed, perhaps for testing, development, or in a system with unusual hardware architecture. Is the system utilizing a custom driver or a specific hardware abstraction layer that leverages this convention? It's the first place I'm going to investigate and see if it yields further clues. I have to look deeper. |
| 14/2 | 2026/07/03 07:43 | tool | grepper |
0mError:no matches Args: {
"Expression": "mdio.*dummy"
}Results: {
"error": "no matches"
} |
| 15/2 | 2026/07/03 07:43 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8282 output: 44 thoughts: 77 Thoughts: **Considering the Switch Configuration** Okay, so I'm thinking about how to approach this... `fixed-link` comes to mind as a potential starting point. But wait, that's really for PHYs, isn't it? This is an MDIO device – the switch itself, the `mv88e6xxx`. The key here is getting the MDIO bus to recognize and probe the switch, and that means making sure a device with a corresponding ID is present on the bus. Time to dive into the `mv88e6xxx_driver` matching table to see how it's done. |
| 16/2 | 2026/07/03 07:44 | tool | grepper |
0mArgs:{
"Expression": "mv88e6xxx_of_match",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7500=static void mv88e6xxx_shutdown(struct mdio_device *mdiodev)\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7511-\ndrivers/net/dsa/mv88e6xxx/chip.c:7512:static const struct of_device_id mv88e6xxx_of_match[] = {\ndrivers/net/dsa/mv88e6xxx/chip.c-7513-\t{\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7527-\ndrivers/net/dsa/mv88e6xxx/chip.c:7528:MODULE_DEVICE_TABLE(of, mv88e6xxx_of_match);\ndrivers/net/dsa/mv88e6xxx/chip.c-7529-\ndrivers/net/dsa/mv88e6xxx/chip.c=7530=static struct mdio_driver mv88e6xxx_driver = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7535-\t\t.name = \"mv88e6085\",\ndrivers/net/dsa/mv88e6xxx/chip.c:7536:\t\t.of_match_table = mv88e6xxx_of_match,\ndrivers/net/dsa/mv88e6xxx/chip.c-7537-\t\t.pm = \u0026mv88e6xxx_pm_ops,\n"
} |
| 17/2 | 2026/07/03 07:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8942 output: 42 thoughts: 165 Thoughts: **Analyzing the Probe Path** Okay, so I'm looking at this driver and how it's trying to initialize. My initial thought is it's matching based on the Device Tree (`of_match_table`), which is the standard way to do things like this. Now, the interesting part is where this is likely to run: Syzkaller. And I'm thinking, most Syzkaller setups, particularly on x86_64, use ACPI. Sometimes we see arm64 with a specific DT. It's rare for Syzkaller to magically create device tree nodes for arbitrary hardware, unless, of course, there's an overlay or they're using a mock setup. Hold on a second, I need to be more precise. Syzkaller *does* have methods for injecting device tree nodes on certain configurations or it could be running on a board that *has* a device tree. But generally, for the usual x86_64 environments like GCE or QEMU, this driver is *not* going to probe. There won't be a device tree node present for something like "marvell,mv88e6085" without some very specific setup and furthermore, there's no physical MDIO bus for it to latch onto. So, the question is, how else can this driver be triggered? I need to check if there's an alternative initialization path that bypasses the device tree entirely. |
| 18/2 | 2026/07/03 07:44 | tool | grepper |
0mArgs:{
"Expression": "mv88e6xxx_probe",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7320=static SIMPLE_DEV_PM_OPS(mv88e6xxx_pm_ops, mv88e6xxx_suspend, mv88e6xxx_resume);\ndrivers/net/dsa/mv88e6xxx/chip.c-7321-\ndrivers/net/dsa/mv88e6xxx/chip.c:7322:static int mv88e6xxx_probe(struct mdio_device *mdiodev)\ndrivers/net/dsa/mv88e6xxx/chip.c-7323-{\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7530=static struct mdio_driver mv88e6xxx_driver = {\ndrivers/net/dsa/mv88e6xxx/chip.c:7531:\t.probe\t= mv88e6xxx_probe,\ndrivers/net/dsa/mv88e6xxx/chip.c-7532-\t.remove = mv88e6xxx_remove,\n"
} |
| 19/2 | 2026/07/03 07:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9741 output: 18 thoughts: 87 Thoughts: **MDIO Driver Investigation** Okay, so I'm looking at this MDIO driver, and my immediate thought is, "Well, duh, it's not going to do anything unless it *has* an MDIO bus and a compatible device." That's just basic hardware dependency. My next question is whether there's some kind of software MDIO bus that syzkaller could potentially manipulate to probe this thing? I recall seeing a `dsa_loop` out there, which sounds promising. But I also remember it registering a *specific*, pre-defined PHY and switch, which is a bit limiting. I'll need to double check how the `dsa_loop_driver` is registered. Let's get into `dsa_loop.c` and figure out exactly what `dsa_loop` is doing. |
| 20/2 | 2026/07/03 07:44 | tool | grepper |
0mArgs:{
"Expression": "dsa_loop"
}Results: {
"Output": "Documentation/networking/dsa/dsa.rst=159=all attached switch ports must be down while doing this).\nDocumentation/networking/dsa/dsa.rst-160-\nDocumentation/networking/dsa/dsa.rst:161:It is desirable that all tagging protocols are testable with the ``dsa_loop``\nDocumentation/networking/dsa/dsa.rst-162-mockup driver, which can be attached to any network interface. The goal is that\n--\ndrivers/net/dsa/Makefile=3=bcm-sf2-objs\t\t\t:= bcm_sf2.o bcm_sf2_cfp.o\ndrivers/net/dsa/Makefile:4:obj-$(CONFIG_NET_DSA_LOOP)\t+= dsa_loop.o\ndrivers/net/dsa/Makefile-5-obj-$(CONFIG_NET_DSA_KS8995) \t+= ks8995.o\n--\ndrivers/net/dsa/dsa_loop.c-24-\ndrivers/net/dsa/dsa_loop.c:25:struct dsa_loop_vlan {\ndrivers/net/dsa/dsa_loop.c-26-\tu16 members;\n--\ndrivers/net/dsa/dsa_loop.c-29-\ndrivers/net/dsa/dsa_loop.c:30:struct dsa_loop_mib_entry {\ndrivers/net/dsa/dsa_loop.c-31-\tchar name[ETH_GSTRING_LEN];\n--\ndrivers/net/dsa/dsa_loop.c-34-\ndrivers/net/dsa/dsa_loop.c:35:enum dsa_loop_mib_counters {\ndrivers/net/dsa/dsa_loop.c-36-\tDSA_LOOP_PHY_READ_OK,\n--\ndrivers/net/dsa/dsa_loop.c-42-\ndrivers/net/dsa/dsa_loop.c:43:struct dsa_loop_port {\ndrivers/net/dsa/dsa_loop.c:44:\tstruct dsa_loop_mib_entry mib[__DSA_LOOP_CNT_MAX];\ndrivers/net/dsa/dsa_loop.c-45-\tu16 pvid;\n--\ndrivers/net/dsa/dsa_loop.c-48-\ndrivers/net/dsa/dsa_loop.c:49:struct dsa_loop_priv {\ndrivers/net/dsa/dsa_loop.c-50-\tstruct mii_bus\t*bus;\ndrivers/net/dsa/dsa_loop.c-51-\tunsigned int\tport_base;\ndrivers/net/dsa/dsa_loop.c:52:\tstruct dsa_loop_vlan vlans[VLAN_N_VID];\ndrivers/net/dsa/dsa_loop.c-53-\tstruct net_device *netdev;\ndrivers/net/dsa/dsa_loop.c:54:\tstruct dsa_loop_port ports[DSA_MAX_PORTS];\ndrivers/net/dsa/dsa_loop.c-55-};\ndrivers/net/dsa/dsa_loop.c-56-\ndrivers/net/dsa/dsa_loop.c:57:struct dsa_loop_pdata {\ndrivers/net/dsa/dsa_loop.c-58-\t/* Must be first, such that dsa_register_switch() can access this\n--\ndrivers/net/dsa/dsa_loop.c-66-\ndrivers/net/dsa/dsa_loop.c:67:static struct dsa_loop_mib_entry dsa_loop_mibs[] = {\ndrivers/net/dsa/dsa_loop.c-68-\t[DSA_LOOP_PHY_READ_OK]\t= { \"phy_read_ok\", },\n--\ndrivers/net/dsa/dsa_loop.c=75=static struct mdio_device *switch_mdiodev;\ndrivers/net/dsa/dsa_loop.c-76-\ndrivers/net/dsa/dsa_loop.c:77:enum dsa_loop_devlink_resource_id {\ndrivers/net/dsa/dsa_loop.c-78-\tDSA_LOOP_DEVLINK_PARAM_ID_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */\n--\ndrivers/net/dsa/dsa_loop.c-81-\ndrivers/net/dsa/dsa_loop.c:82:static u64 dsa_loop_devlink_vtu_get(void *priv)\ndrivers/net/dsa/dsa_loop.c-83-{\ndrivers/net/dsa/dsa_loop.c:84:\tstruct dsa_loop_priv *ps = priv;\ndrivers/net/dsa/dsa_loop.c-85-\tunsigned int i, count = 0;\ndrivers/net/dsa/dsa_loop.c:86:\tstruct dsa_loop_vlan *vl;\ndrivers/net/dsa/dsa_loop.c-87-\n--\ndrivers/net/dsa/dsa_loop.c-96-\ndrivers/net/dsa/dsa_loop.c:97:static int dsa_loop_setup_devlink_resources(struct dsa_switch *ds)\ndrivers/net/dsa/dsa_loop.c-98-{\ndrivers/net/dsa/dsa_loop.c-99-\tstruct devlink_resource_size_params size_params;\ndrivers/net/dsa/dsa_loop.c:100:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-101-\tint err;\n--\ndrivers/net/dsa/dsa_loop.c-115-\t\t\t\t\t DSA_LOOP_DEVLINK_PARAM_ID_VTU,\ndrivers/net/dsa/dsa_loop.c:116:\t\t\t\t\t dsa_loop_devlink_vtu_get, ps);\ndrivers/net/dsa/dsa_loop.c-117-\n--\ndrivers/net/dsa/dsa_loop.c-124-\ndrivers/net/dsa/dsa_loop.c:125:static enum dsa_tag_protocol dsa_loop_get_protocol(struct dsa_switch *ds,\ndrivers/net/dsa/dsa_loop.c-126-\t\t\t\t\t\t int port,\n--\ndrivers/net/dsa/dsa_loop.c-133-\ndrivers/net/dsa/dsa_loop.c:134:static int dsa_loop_setup(struct dsa_switch *ds)\ndrivers/net/dsa/dsa_loop.c-135-{\ndrivers/net/dsa/dsa_loop.c:136:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-137-\tunsigned int i;\n--\ndrivers/net/dsa/dsa_loop.c-139-\tfor (i = 0; i \u003c ds-\u003enum_ports; i++)\ndrivers/net/dsa/dsa_loop.c:140:\t\tmemcpy(ps-\u003eports[i].mib, dsa_loop_mibs,\ndrivers/net/dsa/dsa_loop.c:141:\t\t sizeof(dsa_loop_mibs));\ndrivers/net/dsa/dsa_loop.c-142-\n--\ndrivers/net/dsa/dsa_loop.c-144-\ndrivers/net/dsa/dsa_loop.c:145:\treturn dsa_loop_setup_devlink_resources(ds);\ndrivers/net/dsa/dsa_loop.c-146-}\ndrivers/net/dsa/dsa_loop.c-147-\ndrivers/net/dsa/dsa_loop.c:148:static void dsa_loop_teardown(struct dsa_switch *ds)\ndrivers/net/dsa/dsa_loop.c-149-{\n--\ndrivers/net/dsa/dsa_loop.c-152-\ndrivers/net/dsa/dsa_loop.c:153:static int dsa_loop_get_sset_count(struct dsa_switch *ds, int port, int sset)\ndrivers/net/dsa/dsa_loop.c-154-{\n--\ndrivers/net/dsa/dsa_loop.c-160-\ndrivers/net/dsa/dsa_loop.c:161:static void dsa_loop_get_strings(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-162-\t\t\t\t u32 stringset, uint8_t *data)\ndrivers/net/dsa/dsa_loop.c-163-{\ndrivers/net/dsa/dsa_loop.c:164:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-165-\tunsigned int i;\n--\ndrivers/net/dsa/dsa_loop.c-173-\ndrivers/net/dsa/dsa_loop.c:174:static void dsa_loop_get_ethtool_stats(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-175-\t\t\t\t uint64_t *data)\ndrivers/net/dsa/dsa_loop.c-176-{\ndrivers/net/dsa/dsa_loop.c:177:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-178-\tunsigned int i;\n--\ndrivers/net/dsa/dsa_loop.c-183-\ndrivers/net/dsa/dsa_loop.c:184:static int dsa_loop_phy_read(struct dsa_switch *ds, int port, int regnum)\ndrivers/net/dsa/dsa_loop.c-185-{\ndrivers/net/dsa/dsa_loop.c:186:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-187-\tstruct mii_bus *bus = ps-\u003ebus;\n--\ndrivers/net/dsa/dsa_loop.c-198-\ndrivers/net/dsa/dsa_loop.c:199:static int dsa_loop_phy_write(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-200-\t\t\t int regnum, u16 value)\ndrivers/net/dsa/dsa_loop.c-201-{\ndrivers/net/dsa/dsa_loop.c:202:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-203-\tstruct mii_bus *bus = ps-\u003ebus;\n--\ndrivers/net/dsa/dsa_loop.c-214-\ndrivers/net/dsa/dsa_loop.c:215:static int dsa_loop_port_bridge_join(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-216-\t\t\t\t struct dsa_bridge bridge,\n--\ndrivers/net/dsa/dsa_loop.c-225-\ndrivers/net/dsa/dsa_loop.c:226:static void dsa_loop_port_bridge_leave(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-227-\t\t\t\t struct dsa_bridge bridge)\n--\ndrivers/net/dsa/dsa_loop.c-232-\ndrivers/net/dsa/dsa_loop.c:233:static void dsa_loop_port_stp_state_set(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-234-\t\t\t\t\tu8 state)\n--\ndrivers/net/dsa/dsa_loop.c-239-\ndrivers/net/dsa/dsa_loop.c:240:static int dsa_loop_port_vlan_filtering(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-241-\t\t\t\t\tbool vlan_filtering,\n--\ndrivers/net/dsa/dsa_loop.c-249-\ndrivers/net/dsa/dsa_loop.c:250:static int dsa_loop_port_vlan_add(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-251-\t\t\t\t const struct switchdev_obj_port_vlan *vlan,\n--\ndrivers/net/dsa/dsa_loop.c-255-\tbool pvid = vlan-\u003eflags \u0026 BRIDGE_VLAN_INFO_PVID;\ndrivers/net/dsa/dsa_loop.c:256:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-257-\tstruct mii_bus *bus = ps-\u003ebus;\ndrivers/net/dsa/dsa_loop.c:258:\tstruct dsa_loop_vlan *vl;\ndrivers/net/dsa/dsa_loop.c-259-\n--\ndrivers/net/dsa/dsa_loop.c-282-\ndrivers/net/dsa/dsa_loop.c:283:static int dsa_loop_port_vlan_del(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-284-\t\t\t\t const struct switchdev_obj_port_vlan *vlan)\n--\ndrivers/net/dsa/dsa_loop.c-286-\tbool untagged = vlan-\u003eflags \u0026 BRIDGE_VLAN_INFO_UNTAGGED;\ndrivers/net/dsa/dsa_loop.c:287:\tstruct dsa_loop_priv *ps = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-288-\tu16 pvid = ps-\u003eports[port].pvid;\ndrivers/net/dsa/dsa_loop.c-289-\tstruct mii_bus *bus = ps-\u003ebus;\ndrivers/net/dsa/dsa_loop.c:290:\tstruct dsa_loop_vlan *vl;\ndrivers/net/dsa/dsa_loop.c-291-\n--\ndrivers/net/dsa/dsa_loop.c-310-\ndrivers/net/dsa/dsa_loop.c:311:static int dsa_loop_port_change_mtu(struct dsa_switch *ds, int port,\ndrivers/net/dsa/dsa_loop.c-312-\t\t\t\t int new_mtu)\ndrivers/net/dsa/dsa_loop.c-313-{\ndrivers/net/dsa/dsa_loop.c:314:\tstruct dsa_loop_priv *priv = ds-\u003epriv;\ndrivers/net/dsa/dsa_loop.c-315-\n--\ndrivers/net/dsa/dsa_loop.c-320-\ndrivers/net/dsa/dsa_loop.c:321:static int dsa_loop_port_max_mtu(struct dsa_switch *ds, int port)\ndrivers/net/dsa/dsa_loop.c-322-{\n--\ndrivers/net/dsa/dsa_loop.c-325-\ndrivers/net/dsa/dsa_loop.c:326:static void dsa_loop_phylink_get_caps(struct dsa_switch *dsa, int port,\ndrivers/net/dsa/dsa_loop.c-327-\t\t\t\t struct phylink_config *config)\n--\ndrivers/net/dsa/dsa_loop.c-333-\ndrivers/net/dsa/dsa_loop.c:334:static const struct dsa_switch_ops dsa_loop_driver = {\ndrivers/net/dsa/dsa_loop.c:335:\t.get_tag_protocol\t= dsa_loop_get_protocol,\ndrivers/net/dsa/dsa_loop.c:336:\t.setup\t\t\t= dsa_loop_setup,\ndrivers/net/dsa/dsa_loop.c:337:\t.teardown\t\t= dsa_loop_teardown,\ndrivers/net/dsa/dsa_loop.c:338:\t.get_strings\t\t= dsa_loop_get_strings,\ndrivers/net/dsa/dsa_loop.c:339:\t.get_ethtool_stats\t= dsa_loop_get_ethtool_stats,\ndrivers/net/dsa/dsa_loop.c:340:\t.get_sset_count\t\t= dsa_loop_get_sset_count,\ndrivers/net/dsa/dsa_loop.c:341:\t.get_ethtool_phy_stats\t= dsa_loop_get_ethtool_stats,\ndrivers/net/dsa/dsa_loop.c:342:\t.phy_read\t\t= dsa_loop_phy_read,\ndrivers/net/dsa/dsa_loop.c:343:\t.phy_write\t\t= dsa_loop_phy_write,\ndrivers/net/dsa/dsa_loop.c:344:\t.port_bridge_join\t= dsa_loop_port_bridge_join,\ndrivers/net/dsa/dsa_loop.c:345:\t.port_bridge_leave\t= dsa_loop_port_bridge_leave,\ndrivers/net/dsa/dsa_loop.c:346:\t.port_stp_state_set\t= dsa_loop_port_stp_state_set,\ndrivers/net/dsa/dsa_loop.c:347:\t.port_vlan_filtering\t= dsa_loop_port_vlan_filtering,\ndrivers/net/dsa/dsa_loop.c:348:\t.port_vlan_add\t\t= dsa_loop_port_vlan_add,\ndrivers/net/dsa/dsa_loop.c:349:\t.port_vlan_del\t\t= dsa_loop_port_vlan_del,\ndrivers/net/dsa/dsa_loop.c:350:\t.port_change_mtu\t= dsa_loop_port_change_mtu,\ndrivers/net/dsa/dsa_loop.c:351:\t.port_max_mtu\t\t= dsa_loop_port_max_mtu,\ndrivers/net/dsa/dsa_loop.c:352:\t.phylink_get_caps\t= dsa_loop_phylink_get_caps,\ndrivers/net/dsa/dsa_loop.c-353-};\ndrivers/net/dsa/dsa_loop.c-354-\ndrivers/net/dsa/dsa_loop.c:355:static int dsa_loop_drv_probe(struct mdio_device *mdiodev)\ndrivers/net/dsa/dsa_loop.c-356-{\ndrivers/net/dsa/dsa_loop.c:357:\tstruct dsa_loop_pdata *pdata = mdiodev-\u003edev.platform_data;\ndrivers/net/dsa/dsa_loop.c:358:\tstruct dsa_loop_priv *ps;\ndrivers/net/dsa/dsa_loop.c-359-\tstruct dsa_switch *ds;\n--\ndrivers/net/dsa/dsa_loop.c-382-\tds-\u003edev = \u0026mdiodev-\u003edev;\ndrivers/net/dsa/dsa_loop.c:383:\tds-\u003eops = \u0026dsa_loop_driver;\ndrivers/net/dsa/dsa_loop.c-384-\tds-\u003epriv = ps;\n--\ndrivers/net/dsa/dsa_loop.c-396-\ndrivers/net/dsa/dsa_loop.c:397:static void dsa_loop_drv_remove(struct mdio_device *mdiodev)\ndrivers/net/dsa/dsa_loop.c-398-{\ndrivers/net/dsa/dsa_loop.c-399-\tstruct dsa_switch *ds = dev_get_drvdata(\u0026mdiodev-\u003edev);\ndrivers/net/dsa/dsa_loop.c:400:\tstruct dsa_loop_priv *ps;\ndrivers/net/dsa/dsa_loop.c-401-\n--\ndrivers/net/dsa/dsa_loop.c-410-\ndrivers/net/dsa/dsa_loop.c:411:static void dsa_loop_drv_shutdown(struct mdio_device *mdiodev)\ndrivers/net/dsa/dsa_loop.c-412-{\n--\ndrivers/net/dsa/dsa_loop.c-422-\ndrivers/net/dsa/dsa_loop.c:423:static struct mdio_driver dsa_loop_drv = {\ndrivers/net/dsa/dsa_loop.c-424-\t.mdiodrv.driver\t= {\n--\ndrivers/net/dsa/dsa_loop.c-426-\t},\ndrivers/net/dsa/dsa_loop.c:427:\t.probe\t= dsa_loop_drv_probe,\ndrivers/net/dsa/dsa_loop.c:428:\t.remove\t= dsa_loop_drv_remove,\ndrivers/net/dsa/dsa_loop.c:429:\t.shutdown = dsa_loop_drv_shutdown,\ndrivers/net/dsa/dsa_loop.c-430-};\ndrivers/net/dsa/dsa_loop.c-431-\ndrivers/net/dsa/dsa_loop.c:432:static int dsa_loop_bus_match(struct device *dev,\ndrivers/net/dsa/dsa_loop.c-433-\t\t\t const struct device_driver *drv)\ndrivers/net/dsa/dsa_loop.c-434-{\ndrivers/net/dsa/dsa_loop.c:435:\treturn drv == \u0026dsa_loop_drv.mdiodrv.driver;\ndrivers/net/dsa/dsa_loop.c-436-}\ndrivers/net/dsa/dsa_loop.c-437-\ndrivers/net/dsa/dsa_loop.c:438:static void dsa_loop_phydevs_unregister(void)\ndrivers/net/dsa/dsa_loop.c-439-{\n--\ndrivers/net/dsa/dsa_loop.c-445-\ndrivers/net/dsa/dsa_loop.c:446:static int __init dsa_loop_create_switch_mdiodev(void)\ndrivers/net/dsa/dsa_loop.c-447-{\ndrivers/net/dsa/dsa_loop.c:448:\tstatic struct dsa_loop_pdata dsa_loop_pdata = {\ndrivers/net/dsa/dsa_loop.c-449-\t\t.cd = {\n--\ndrivers/net/dsa/dsa_loop.c-470-\ndrivers/net/dsa/dsa_loop.c:471:\tswitch_mdiodev-\u003ebus_match = dsa_loop_bus_match;\ndrivers/net/dsa/dsa_loop.c:472:\tswitch_mdiodev-\u003edev.platform_data = \u0026dsa_loop_pdata;\ndrivers/net/dsa/dsa_loop.c-473-\n--\ndrivers/net/dsa/dsa_loop.c-481-\ndrivers/net/dsa/dsa_loop.c:482:static int __init dsa_loop_init(void)\ndrivers/net/dsa/dsa_loop.c-483-{\n--\ndrivers/net/dsa/dsa_loop.c-486-\ndrivers/net/dsa/dsa_loop.c:487:\tret = dsa_loop_create_switch_mdiodev();\ndrivers/net/dsa/dsa_loop.c-488-\tif (ret)\n--\ndrivers/net/dsa/dsa_loop.c-493-\ndrivers/net/dsa/dsa_loop.c:494:\tret = mdio_driver_register(\u0026dsa_loop_drv);\ndrivers/net/dsa/dsa_loop.c-495-\tif (ret) {\ndrivers/net/dsa/dsa_loop.c:496:\t\tdsa_loop_phydevs_unregister();\ndrivers/net/dsa/dsa_loop.c-497-\t\tmdio_device_remove(switch_mdiodev);\n--\ndrivers/net/dsa/dsa_loop.c-502-}\ndrivers/net/dsa/dsa_loop.c:503:module_init(dsa_loop_init);\ndrivers/net/dsa/dsa_loop.c-504-\ndrivers/net/dsa/dsa_loop.c:505:static void __exit dsa_loop_exit(void)\ndrivers/net/dsa/dsa_loop.c-506-{\ndrivers/net/dsa/dsa_loop.c:507:\tmdio_driver_unregister(\u0026dsa_loop_drv);\ndrivers/net/dsa/dsa_loop.c:508:\tdsa_loop_phydevs_unregister();\ndrivers/net/dsa/dsa_loop.c-509-\tmdio_device_remove(switch_mdiodev);\n--\ndrivers/net/dsa/dsa_loop.c-511-}\ndrivers/net/dsa/dsa_loop.c:512:module_exit(dsa_loop_exit);\ndrivers/net/dsa/dsa_loop.c-513-\n"
} |
| 21/2 | 2026/07/03 07:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 16683 output: 29 thoughts: 130 Thoughts: **Investigating MDIO Device Instantiation** Okay, so `dsa_loop` has its own driver, `dsa_loop_drv`, and critically, it *doesn't* load `mv88e6xxx`. This means I can't reach the `mv88e6xxx` registers directly through `dsa_loop`, which is a problem. I need to figure out an alternative. The question now becomes, is there *another* way to get at the `mv88e6xxx` registers? My initial thought is about a mock MDIO bus. Could there be a way to create a virtual MDIO bus interface that would allow user space to essentially "mock up" or instantiate these arbitrary MDIO devices? That's a good lead. Let's see if there's a user space interface designed for just this kind of operation. I know that I2C provides a mechanism via `/sys/bus/i2c/devices/i2c-*/new_device`. Does MDIO expose a similar interface? Time to dig around the kernel sources and see if there is something comparable for MDIO device instantiation. |
| 22/2 | 2026/07/03 07:44 | tool | grepper |
0mError:no matches Args: {
"Expression": "new_device",
"PathPrefix": "drivers/net/phy/"
}Results: {
"error": "no matches"
} |
| 23/2 | 2026/07/03 07:44 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 17099 output: 30 thoughts: 13 Thoughts: Here's my take on the thought process: **Diving into the MDIO Drivers** Okay, time to get started. My initial instinct is to go straight to the heart of the matter – the `drivers/net/mdio/` directory. This is the logical place to begin my investigation into the Media Independent Interface (MDIO) drivers. Given my expertise, I already know this directory will likely house the core functionality and implementation details for interfacing with various PHYs (Physical Layer Transceivers) and MDIO-compliant devices. I expect to find source code that defines the MDIO bus operations, device probing, register access routines, and interrupt handling if applicable. Let's see what we can find! |
| 24/2 | 2026/07/03 07:45 | tool | grepper |
0mError:no matches Args: {
"Expression": "new_device",
"PathPrefix": "drivers/net/mdio/"
}Results: {
"error": "no matches"
} |
| 25/2 | 2026/07/03 07:45 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 17305 output: 44 thoughts: 265 Thoughts: **MDIO Device Instantiation Concerns** Okay, so I'm thinking about MDIO and how to instantiate these devices from userspace. It seems like there isn't a direct userspace interface, which is a common problem. Then I remember, wait, syzkaller has pseudo-syscalls for other interfaces like USB and Netlink. So, I wonder, does syzkaller have anything for MDIO? I don't have direct access to the syzkaller source right now, but I can see if there are kernel functions that it would likely leverage. However, a nagging feeling surfaces: if this MDIO device is matched through the Device Tree (OF), and we're on a standard x86_64 VM, it probably won't even probe. I should have realized that immediately. Then I recall that syzkaller *does* target some ARM boards, but even in those cases, the Device Tree is static and fixed at boot. If the Device Tree doesn't include something like `marvell,mv88e6085`, that specific driver won't load. So the question becomes: is there *any* other mechanism for probing the `mv88e6xxx` driver? Let me go back and double-check `mv88e6xxx_of_match` again. I need to make sure I'm not missing something obvious. |
| 26/2 | 2026/07/03 07:45 | tool | grepper |
0mArgs:{
"Expression": "mv88e6xxx_of_match",
"PathPrefix": "drivers/net/dsa/mv88e6xxx/"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7500=static void mv88e6xxx_shutdown(struct mdio_device *mdiodev)\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7511-\ndrivers/net/dsa/mv88e6xxx/chip.c:7512:static const struct of_device_id mv88e6xxx_of_match[] = {\ndrivers/net/dsa/mv88e6xxx/chip.c-7513-\t{\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7527-\ndrivers/net/dsa/mv88e6xxx/chip.c:7528:MODULE_DEVICE_TABLE(of, mv88e6xxx_of_match);\ndrivers/net/dsa/mv88e6xxx/chip.c-7529-\ndrivers/net/dsa/mv88e6xxx/chip.c=7530=static struct mdio_driver mv88e6xxx_driver = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7535-\t\t.name = \"mv88e6085\",\ndrivers/net/dsa/mv88e6xxx/chip.c:7536:\t\t.of_match_table = mv88e6xxx_of_match,\ndrivers/net/dsa/mv88e6xxx/chip.c-7537-\t\t.pm = \u0026mv88e6xxx_pm_ops,\n"
} |
| 27/2 | 2026/07/03 07:45 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 18317 output: 22 thoughts: 131 Thoughts: **Investigating the mv88e6xxx Driver's Device Registration** Okay, so I'm looking at this `mv88e6xxx_driver`, and something's bugging me. Specifically, the driver's got `.name = "mv88e6085"`. That name matching is an interesting technique for MDIO drivers, and it makes sense if the bus itself registers a device *with* that specific name. But the question is, how does an MDIO device *get* registered with that exact string, "mv88e6085"? My experience says that MDIO devices are typically brought online by the MDIO bus driver, which uses two main methods: hardware probing (where the PHY ID is checked) or device tree configurations. Now, switches... switches are a different beast. Their PHY IDs often aren't standard, so the device tree is usually the critical piece in getting them identified and connected. So, I'm going to dig deeper. I need to know: Is there any other place in the kernel that registers this device? I'm missing something, and I need to find the root cause. This name matching has to be coming from somewhere. |
| 28/2 | 2026/07/03 07:45 | tool | grepper |
0mArgs:{
"Expression": "mv88e6085"
}Results: {
"Output": "Documentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml=19=properties:\n--\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-22- - enum:\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:23: - marvell,mv88e6085\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-24- - marvell,mv88e6190\n--\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-26- description: |\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:27: marvell,mv88e6085: This switch uses base address 0x10.\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-28- This switch and its siblings will be autodetected from\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:29: ID registers found in the switch, so only \"marvell,mv88e6085\" should be\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-30- specified. This includes the following list of MV88Exxxx switches:\n--\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-43- - items:\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:44: - const: marvell,turris-mox-mv88e6085\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:45: - const: marvell,mv88e6085\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-46- - items:\n--\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml=109=examples:\n--\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-116- ethernet-switch@0 {\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml:117: compatible = \"marvell,mv88e6085\";\nDocumentation/devicetree/bindings/net/dsa/marvell,mv88e6xxx.yaml-118- reg = \u003c0\u003e;\n--\nDocumentation/devicetree/bindings/net/ethernet-switch.yaml=23=allOf:\n--\nDocumentation/devicetree/bindings/net/ethernet-switch.yaml-32- enum:\nDocumentation/devicetree/bindings/net/ethernet-switch.yaml:33: - marvell,turris-mox-mv88e6085\nDocumentation/devicetree/bindings/net/ethernet-switch.yaml-34- - marvell,turris-mox-mv88e6190\n--\narch/arm/boot/dts/marvell/armada-370-rd.dts=152=\tswitch: ethernet-switch@10 {\narch/arm/boot/dts/marvell/armada-370-rd.dts:153:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-370-rd.dts-154-\t\treg = \u003c0x10\u003e;\n--\narch/arm/boot/dts/marvell/armada-385-clearfog-gtr-s4.dts=16=\tswitch0: ethernet-switch@4 {\narch/arm/boot/dts/marvell/armada-385-clearfog-gtr-s4.dts:17:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-385-clearfog-gtr-s4.dts-18-\t\treg = \u003c4\u003e;\n--\narch/arm/boot/dts/marvell/armada-385-linksys.dtsi=161=\tethernet-switch@0 {\narch/arm/boot/dts/marvell/armada-385-linksys.dtsi:162:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-385-linksys.dtsi-163-\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/marvell/armada-385-turris-omnia.dts=467=\tethernet-switch@10 {\n--\narch/arm/boot/dts/marvell/armada-385-turris-omnia.dts-469-\t\tpinctrl-0 = \u003c\u0026swint_pins\u003e;\narch/arm/boot/dts/marvell/armada-385-turris-omnia.dts:470:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-385-turris-omnia.dts-471-\n--\narch/arm/boot/dts/marvell/armada-388-clearfog.dts=96=\tethernet-switch@4 {\narch/arm/boot/dts/marvell/armada-388-clearfog.dts:97:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-388-clearfog.dts-98-\t\treg = \u003c4\u003e;\n--\narch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts=268=\tethernet-switch@0 {\narch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts:269:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/armada-xp-linksys-mamba.dts-270-\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts=82=\tswitch0: switch@11 {\narch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts:83:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts-84-\t\treg = \u003c0x11\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-dir665.dts=196=\tswitch@0 {\narch/arm/boot/dts/marvell/kirkwood-dir665.dts:197:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-dir665.dts-198-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-l-50.dts=211=\tswitch0: switch@10 {\narch/arm/boot/dts/marvell/kirkwood-l-50.dts:212:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-l-50.dts-213-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-l-50.dts=269=\tswitch@11 {\narch/arm/boot/dts/marvell/kirkwood-l-50.dts:270:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-l-50.dts-271-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts=162=\tswitch@10 {\narch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts:163:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts-164-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts=113=\tswitch@0 {\narch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts:114:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts-115-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi=77=\tswitch: switch@0 {\narch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi:78:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi-79-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts=109=\tswitch: switch@0 {\narch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts:110:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts-111-\t\t#address-cells = \u003c1\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx51-zii-rdu1.dts=173=\t\tswitch@0 {\narch/arm/boot/dts/nxp/imx/imx51-zii-rdu1.dts:174:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx51-zii-rdu1.dts-175-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts=49=\t\tswitch@0 {\narch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts:50:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts-51-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts=216=\t\tswitch@0 {\narch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts:217:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts-218-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi=128=\t\tswitch@0 {\narch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi:129:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi-130-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi=105=\t\tswitch: switch@0 {\narch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi:106:\t\t\tcompatible = \"marvell,mv88e6085\"; /* 88e6240*/\narch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi-107-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi=174=\t\tswitch@0 {\narch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi:175:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi-176-\t\t\treg = \u003c0\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi=730=\t\tswitch: switch@0 {\narch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi:731:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi-732-\t\t\tpinctrl-0 = \u003c\u0026pinctrl_switch_irq\u003e;\n--\narch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts=228=\t\tswitch: switch@0 {\narch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts:229:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts-230-\t\t\tpinctrl-names = \"default\";\n--\narch/arm/boot/dts/nxp/vf/vf610-zii-cfu1.dts=165=\t\tswitch0: ethernet-switch@0 {\narch/arm/boot/dts/nxp/vf/vf610-zii-cfu1.dts:166:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/vf/vf610-zii-cfu1.dts-167-\t\t\tpinctrl-names = \"default\";\n--\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts=30=\t\t\tswitch0: switch@0 {\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts:31:\t\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts-32-\t\t\t\tpinctrl-0 = \u003c\u0026pinctrl_gpio_switch0\u003e;\n--\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts=114=\t\t\tswitch1: switch@0 {\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts:115:\t\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts-116-\t\t\t\tpinctrl-0 = \u003c\u0026pinctrl_gpio_switch1\u003e;\n--\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts=201=\t\t\tswitch2: switch@0 {\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts:202:\t\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm/boot/dts/nxp/vf/vf610-zii-dev-rev-b.dts-203-\t\t\t\treg = \u003c0\u003e;\n--\narch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi=150=\t\tswitch: switch@0 {\narch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi:151:\t\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi-152-\t\t\tpinctrl-0 = \u003c\u0026pinctrl_switch_irq\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts=125=\tswitch0: ethernet-switch@3 {\narch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts:126:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-espressobin-ultra.dts-127-\t\treg = \u003c3\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi=147=\tswitch0: ethernet-switch@1 {\narch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi:148:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-espressobin.dtsi-149-\t\treg = \u003c1\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts=150=\tswitch0: ethernet-switch@1 {\narch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts:151:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-gl-mv1000.dts-152-\t\treg = \u003c1\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts=438=\tswitch0@2 {\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts:439:\t\tcompatible = \"marvell,turris-mox-mv88e6085\", \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts-440-\t\treg = \u003c0x2\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts=632=\tswitch1@2 {\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts:633:\t\tcompatible = \"marvell,turris-mox-mv88e6085\", \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts-634-\t\treg = \u003c0x2\u003e;\n--\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts=817=\tswitch2@2 {\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts:818:\t\tcompatible = \"marvell,turris-mox-mv88e6085\", \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts-819-\t\treg = \u003c0x2\u003e;\n--\narch/arm64/boot/dts/marvell/armada-7040-mochabin.dts=304=\tswitch: ethernet-switch@3 {\narch/arm64/boot/dts/marvell/armada-7040-mochabin.dts:305:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-7040-mochabin.dts-306-\t\treg = \u003c3\u003e;\n--\narch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts=500=\tswitch0: ethernet-switch@4 {\narch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts:501:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts-502-\t\treg = \u003c4\u003e;\n--\narch/arm64/boot/dts/marvell/cn9130-cf-pro.dts=88=\tethernet-switch@4 {\narch/arm64/boot/dts/marvell/cn9130-cf-pro.dts:89:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/cn9130-cf-pro.dts-90-\t\treg = \u003c4\u003e;\n--\narch/arm64/boot/dts/marvell/cn9132-clearfog.dts=264=\tethernet-switch@4 {\narch/arm64/boot/dts/marvell/cn9132-clearfog.dts:265:\t\tcompatible = \"marvell,mv88e6085\";\narch/arm64/boot/dts/marvell/cn9132-clearfog.dts-266-\t\treg = \u003c4\u003e;\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4217=static int mv88e6xxx_set_eeprom(struct dsa_switch *ds,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4235-\ndrivers/net/dsa/mv88e6xxx/chip.c:4236:static const struct mv88e6xxx_ops mv88e6085_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4237-\t/* MV88E6XXX_FAMILY_6097 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4238:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4239:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4240-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4271-\t.reset = mv88e6185_g1_reset,\ndrivers/net/dsa/mv88e6xxx/chip.c:4272:\t.rmu_disable = mv88e6085_g1_rmu_disable,\ndrivers/net/dsa/mv88e6xxx/chip.c-4273-\t.vtu_getnext = mv88e6352_g1_vtu_getnext,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4281=static const struct mv88e6xxx_ops mv88e6095_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4282-\t/* MV88E6XXX_FAMILY_6095 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4283:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4284:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4285-\t.set_switch_mac = mv88e6xxx_g1_set_switch_mac,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4290-\t.port_set_speed_duplex = mv88e6185_port_set_speed_duplex,\ndrivers/net/dsa/mv88e6xxx/chip.c:4291:\t.port_set_frame_mode = mv88e6085_port_set_frame_mode,\ndrivers/net/dsa/mv88e6xxx/chip.c-4292-\t.port_set_ucast_flood = mv88e6185_port_set_forward_unknown,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4313=static const struct mv88e6xxx_ops mv88e6097_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4314-\t/* MV88E6XXX_FAMILY_6097 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4315:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4316:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4317-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4349-\t.reset = mv88e6352_g1_reset,\ndrivers/net/dsa/mv88e6xxx/chip.c:4350:\t.rmu_disable = mv88e6085_g1_rmu_disable,\ndrivers/net/dsa/mv88e6xxx/chip.c-4351-\t.vtu_getnext = mv88e6352_g1_vtu_getnext,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4360=static const struct mv88e6xxx_ops mv88e6123_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4361-\t/* MV88E6XXX_FAMILY_6165 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4362:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4363:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4364-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4372-\t.port_set_speed_duplex = mv88e6185_port_set_speed_duplex,\ndrivers/net/dsa/mv88e6xxx/chip.c:4373:\t.port_set_frame_mode = mv88e6085_port_set_frame_mode,\ndrivers/net/dsa/mv88e6xxx/chip.c-4374-\t.port_set_ucast_flood = mv88e6352_port_set_ucast_flood,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4401=static const struct mv88e6xxx_ops mv88e6131_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4402-\t/* MV88E6XXX_FAMILY_6185 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4403:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4404:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4405-\t.set_switch_mac = mv88e6xxx_g1_set_switch_mac,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4441=static const struct mv88e6xxx_ops mv88e6141_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4442-\t/* MV88E6XXX_FAMILY_6341 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4443:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4444:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4445-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4503=static const struct mv88e6xxx_ops mv88e6161_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4504-\t/* MV88E6XXX_FAMILY_6165 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4505:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4506:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4507-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4551=static const struct mv88e6xxx_ops mv88e6165_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4552-\t/* MV88E6XXX_FAMILY_6165 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4553:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4554:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4555-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4588=static const struct mv88e6xxx_ops mv88e6171_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4589-\t/* MV88E6XXX_FAMILY_6351 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4590:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4591:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4592-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4634=static const struct mv88e6xxx_ops mv88e6172_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4635-\t/* MV88E6XXX_FAMILY_6352 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4636:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4637:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4638-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4692=static const struct mv88e6xxx_ops mv88e6175_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4693-\t/* MV88E6XXX_FAMILY_6351 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4694:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4695:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4696-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4738=static const struct mv88e6xxx_ops mv88e6176_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4739-\t/* MV88E6XXX_FAMILY_6352 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4740:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4741:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4742-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=4797=static const struct mv88e6xxx_ops mv88e6185_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-4798-\t/* MV88E6XXX_FAMILY_6185 */\ndrivers/net/dsa/mv88e6xxx/chip.c:4799:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:4800:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-4801-\t.set_switch_mac = mv88e6xxx_g1_set_switch_mac,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-4806-\t.port_set_speed_duplex = mv88e6185_port_set_speed_duplex,\ndrivers/net/dsa/mv88e6xxx/chip.c:4807:\t.port_set_frame_mode = mv88e6085_port_set_frame_mode,\ndrivers/net/dsa/mv88e6xxx/chip.c-4808-\t.port_set_ucast_flood = mv88e6185_port_set_forward_unknown,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5011=static const struct mv88e6xxx_ops mv88e6240_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-5012-\t/* MV88E6XXX_FAMILY_6352 */\ndrivers/net/dsa/mv88e6xxx/chip.c:5013:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5014:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5015-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5072=static const struct mv88e6xxx_ops mv88e6250_ops = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-5074-\t.ieee_pri_map = mv88e6250_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5075:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5076-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5178=static const struct mv88e6xxx_ops mv88e6320_ops = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-5180-\t.setup_errata = mv88e6320_setup_errata,\ndrivers/net/dsa/mv88e6xxx/chip.c:5181:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5182:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5183-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5234=static const struct mv88e6xxx_ops mv88e6321_ops = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-5236-\t.setup_errata = mv88e6320_setup_errata,\ndrivers/net/dsa/mv88e6xxx/chip.c:5237:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5238:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5239-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5294=static const struct mv88e6xxx_ops mv88e6341_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-5295-\t/* MV88E6XXX_FAMILY_6341 */\ndrivers/net/dsa/mv88e6xxx/chip.c:5296:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5297:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5298-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5358=static const struct mv88e6xxx_ops mv88e6350_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-5359-\t/* MV88E6XXX_FAMILY_6351 */\ndrivers/net/dsa/mv88e6xxx/chip.c:5360:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5361:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5362-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5404=static const struct mv88e6xxx_ops mv88e6351_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-5405-\t/* MV88E6XXX_FAMILY_6351 */\ndrivers/net/dsa/mv88e6xxx/chip.c:5406:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5407:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5408-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5452=static const struct mv88e6xxx_ops mv88e6352_ops = {\ndrivers/net/dsa/mv88e6xxx/chip.c-5453-\t/* MV88E6XXX_FAMILY_6352 */\ndrivers/net/dsa/mv88e6xxx/chip.c:5454:\t.ieee_pri_map = mv88e6085_g1_ieee_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c:5455:\t.ip_pri_map = mv88e6085_g1_ip_pri_map,\ndrivers/net/dsa/mv88e6xxx/chip.c-5456-\t.irl_init_all = mv88e6352_g2_irl_init_all,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=5707=static const struct mv88e6xxx_info mv88e6xxx_table[] = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-5774-\t\t.multi_chip = true,\ndrivers/net/dsa/mv88e6xxx/chip.c:5775:\t\t.ops = \u0026mv88e6085_ops,\ndrivers/net/dsa/mv88e6xxx/chip.c-5776-\t},\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7512=static const struct of_device_id mv88e6xxx_of_match[] = {\ndrivers/net/dsa/mv88e6xxx/chip.c-7513-\t{\ndrivers/net/dsa/mv88e6xxx/chip.c:7514:\t\t.compatible = \"marvell,mv88e6085\",\ndrivers/net/dsa/mv88e6xxx/chip.c-7515-\t\t.data = \u0026mv88e6xxx_table[MV88E6085],\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7530=static struct mdio_driver mv88e6xxx_driver = {\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7534-\t.mdiodrv.driver = {\ndrivers/net/dsa/mv88e6xxx/chip.c:7535:\t\t.name = \"mv88e6085\",\ndrivers/net/dsa/mv88e6xxx/chip.c-7536-\t\t.of_match_table = mv88e6xxx_of_match,\n--\ndrivers/net/dsa/mv88e6xxx/global1.c=288=int mv88e6185_g1_set_max_frame_size(struct mv88e6xxx_chip *chip, int mtu)\n--\ndrivers/net/dsa/mv88e6xxx/global1.c-316-\ndrivers/net/dsa/mv88e6xxx/global1.c:317:int mv88e6085_g1_ip_pri_map(struct mv88e6xxx_chip *chip)\ndrivers/net/dsa/mv88e6xxx/global1.c-318-{\n--\ndrivers/net/dsa/mv88e6xxx/global1.c-358-\ndrivers/net/dsa/mv88e6xxx/global1.c:359:int mv88e6085_g1_ieee_pri_map(struct mv88e6xxx_chip *chip)\ndrivers/net/dsa/mv88e6xxx/global1.c-360-{\n--\ndrivers/net/dsa/mv88e6xxx/global1.c=526=int mv88e6185_g1_set_cascade_port(struct mv88e6xxx_chip *chip, int port)\n--\ndrivers/net/dsa/mv88e6xxx/global1.c-532-\ndrivers/net/dsa/mv88e6xxx/global1.c:533:int mv88e6085_g1_rmu_disable(struct mv88e6xxx_chip *chip)\ndrivers/net/dsa/mv88e6xxx/global1.c-534-{\n--\ndrivers/net/dsa/mv88e6xxx/global1.h=309=int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);\ndrivers/net/dsa/mv88e6xxx/global1.h-310-\ndrivers/net/dsa/mv88e6xxx/global1.h:311:int mv88e6085_g1_ip_pri_map(struct mv88e6xxx_chip *chip);\ndrivers/net/dsa/mv88e6xxx/global1.h-312-\ndrivers/net/dsa/mv88e6xxx/global1.h:313:int mv88e6085_g1_ieee_pri_map(struct mv88e6xxx_chip *chip);\ndrivers/net/dsa/mv88e6xxx/global1.h-314-int mv88e6250_g1_ieee_pri_map(struct mv88e6xxx_chip *chip);\n--\ndrivers/net/dsa/mv88e6xxx/global1.h=316=int mv88e6185_g1_set_cascade_port(struct mv88e6xxx_chip *chip, int port);\ndrivers/net/dsa/mv88e6xxx/global1.h-317-\ndrivers/net/dsa/mv88e6xxx/global1.h:318:int mv88e6085_g1_rmu_disable(struct mv88e6xxx_chip *chip);\ndrivers/net/dsa/mv88e6xxx/global1.h-319-int mv88e6352_g1_rmu_disable(struct mv88e6xxx_chip *chip);\n--\ndrivers/net/dsa/mv88e6xxx/port.c=819=int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,\n--\ndrivers/net/dsa/mv88e6xxx/port.c-850-\ndrivers/net/dsa/mv88e6xxx/port.c:851:int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,\ndrivers/net/dsa/mv88e6xxx/port.c-852-\t\t\t\t enum mv88e6xxx_frame_mode mode)\n--\ndrivers/net/dsa/mv88e6xxx/port.h=528=int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,\ndrivers/net/dsa/mv88e6xxx/port.h-529-\t\t\t\t enum mv88e6xxx_egress_mode mode);\ndrivers/net/dsa/mv88e6xxx/port.h:530:int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,\ndrivers/net/dsa/mv88e6xxx/port.h-531-\t\t\t\t enum mv88e6xxx_frame_mode mode);\n--\nnet/dsa/port.c=1726=static const char * const dsa_switches_apply_workarounds[] = {\n--\nnet/dsa/port.c-1778-#if IS_ENABLED(CONFIG_NET_DSA_MV88E6XXX)\nnet/dsa/port.c:1779:\t\"marvell,mv88e6085\",\nnet/dsa/port.c-1780-\t\"marvell,mv88e6190\",\n"
} |
| 29/2 | 2026/07/03 07:45 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 32376 output: 23 thoughts: 455 Thoughts: **My Analysis of Reaching the Marvell Switch Driver in syzkaller** Okay, so I'm trying to figure out how to get the `marvell,mv88e6085` driver running in syzkaller. The problem is, this driver is *only* instantiated via Device Tree, which is a huge hurdle. Syzkaller primarily operates on x86_64 VMs with ACPI, meaning no Device Tree by default. Even when it *does* run on ARM64, it's using a fixed device tree, like the `virt` machine in QEMU, which certainly won't include my target `marvell,mv88e6085` device. So, the question is, can I inject arbitrary Device Tree nodes dynamically within syzkaller? I'm already aware that syzkaller doesn't have a *general* mechanism for injecting Device Tree nodes – there isn't some universal pseudo-syscall or configuration option unless something like `CONFIG_OF_OVERLAY` is enabled, and even then, I'd need a userspace interface, which is rarely, if ever, exposed in syzkaller. Let me think… I *do* see things like `syz_usb_connect` and `syz_80211_inject_frame`. Is there *anything* like a `syz_mdio_connect`? Nope, nothing like that. Alright, can I probe this driver using something like netlink or sysfs? Not likely. MDIO drivers are triggered when the MDIO bus *matches* the device, but there isn't an MDIO bus registered with this specific device in syzkaller's standard environment. So, basically, the `drivers/net/dsa/mv88e6xxx/` code is completely unreachable, right? Wait, maybe I can use `dsa_loop` and modify it? Hmm, no, that's just a fixed mock. What if I use PCI to emulate MDIO? Some network cards *do* have MDIO buses, but they probe their *own* PHYs. They're not looking for a DSA switch unless the Device Tree or platform data says so. On x86, this platform data usually comes from board files (which don't exist for x86) or from a PCI driver. The final question is, do I know of any PCI driver that would instantiate an `mv88e6xxx` using platform data? That’s where I need to focus my efforts. |
| 30/2 | 2026/07/03 07:45 | tool | grepper |
0mArgs:{
"Expression": "mv88e6xxx_pdata"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7294=static const void *pdata_device_get_match_data(struct device *dev)\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7296-\tconst struct of_device_id *matches = dev-\u003edriver-\u003eof_match_table;\ndrivers/net/dsa/mv88e6xxx/chip.c:7297:\tconst struct dsa_mv88e6xxx_pdata *pdata = dev-\u003eplatform_data;\ndrivers/net/dsa/mv88e6xxx/chip.c-7298-\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7322=static int mv88e6xxx_probe(struct mdio_device *mdiodev)\ndrivers/net/dsa/mv88e6xxx/chip.c-7323-{\ndrivers/net/dsa/mv88e6xxx/chip.c:7324:\tstruct dsa_mv88e6xxx_pdata *pdata = mdiodev-\u003edev.platform_data;\ndrivers/net/dsa/mv88e6xxx/chip.c-7325-\tconst struct mv88e6xxx_info *compat_info = NULL;\n--\ninclude/linux/platform_data/mv88e6xxx.h-6-\ninclude/linux/platform_data/mv88e6xxx.h:7:struct dsa_mv88e6xxx_pdata {\ninclude/linux/platform_data/mv88e6xxx.h-8-\t/* Must be first, such that dsa_register_switch() can access this\n"
} |
| 31/2 | 2026/07/03 07:45 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 33833 output: 26 thoughts: 26 Thoughts: Okay, let's dive into this. Here's my thought process on this specific question, summarized as though it were my own: **Investigating `dsa_mv88e6xxx_pdata` Usage** Alright, the objective is to figure out the scope of `dsa_mv88e6xxx_pdata`. My first instinct is to see how widely this thing is actually being employed. Is it purely internal to the driver, or does it have an influence elsewhere in the system, possibly in another component of this driver? Getting the precise picture requires a targeted search. I need to track down all instances where this specific data structure is referenced outside the immediate driver code. I'll need to use some techniques to do this. |
| 32/2 | 2026/07/03 07:45 | tool | grepper |
0mArgs:{
"Expression": "dsa_mv88e6xxx_pdata"
}Results: {
"Output": "drivers/net/dsa/mv88e6xxx/chip.c=7294=static const void *pdata_device_get_match_data(struct device *dev)\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-7296-\tconst struct of_device_id *matches = dev-\u003edriver-\u003eof_match_table;\ndrivers/net/dsa/mv88e6xxx/chip.c:7297:\tconst struct dsa_mv88e6xxx_pdata *pdata = dev-\u003eplatform_data;\ndrivers/net/dsa/mv88e6xxx/chip.c-7298-\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=7322=static int mv88e6xxx_probe(struct mdio_device *mdiodev)\ndrivers/net/dsa/mv88e6xxx/chip.c-7323-{\ndrivers/net/dsa/mv88e6xxx/chip.c:7324:\tstruct dsa_mv88e6xxx_pdata *pdata = mdiodev-\u003edev.platform_data;\ndrivers/net/dsa/mv88e6xxx/chip.c-7325-\tconst struct mv88e6xxx_info *compat_info = NULL;\n--\ninclude/linux/platform_data/mv88e6xxx.h-6-\ninclude/linux/platform_data/mv88e6xxx.h:7:struct dsa_mv88e6xxx_pdata {\ninclude/linux/platform_data/mv88e6xxx.h-8-\t/* Must be first, such that dsa_register_switch() can access this\n"
} |
| 33/2 | 2026/07/03 07:45 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 34479 output: 114 thoughts: 147 Thoughts: **Unreachable Code in Virtualized Environments** Okay, here's the situation as I understand it. This particular piece of code, specifically the Marvell 88E6xxx DSA switch driver, is in a bit of a pickle. I've looked through the kernel, and it's clear this device isn't being instantiated through any standard platform data methods. No board files or PCI drivers are setting it up. It's *solely* reliant on Device Tree (DT) for its instantiation. Now, here's the kicker: my focus is on fuzzing, specifically within virtualized environments. And the key here is that neither the standard `syzkaller` environments I use, whether it's x86_64 VMs or ARM64 VMs with a `virt` DT, include this specific device in their Device Tree. Essentially, this driver is completely absent from the virtualized landscape I'm interested in. Therefore, because this driver's probing is entirely dependent on Device Tree, and Device Tree is not present in my target virtualized fuzzing environments, this code path is unreachable. There's just no way it's going to probe or execute any functionality in my scenarios. So, I'm going to have to set `WorthFuzzing` to `false`. My reasoning is straightforward: this is a hardware-specific DSA switch driver for the Marvell 88E6xxx family, and its probing relies exclusively on Device Tree. Since Device Tree is not present or configured in my virtualized environments (QEMU, GCE etc.), there's no way to trigger its execution. |
| 34/2 | 2026/07/03 07:45 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell 88E6xxx DSA switch driver. This is a hardware-specific driver that requires an MDIO bus and is instantiated exclusively via Device Tree (or platform data which is unused). Since standard virtualized environments (like QEMU/GCE) do not emulate this specific hardware or provide the necessary Device Tree nodes, this code is unreachable and cannot be fuzzed.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Marvell 88E6xxx DSA switch driver. This is a hardware-specific driver that requires an MDIO bus and is instantiated exclusively via Device Tree (or platform data which is unused). Since standard virtualized environments (like QEMU/GCE) do not emulate this specific hardware or provide the necessary Device Tree nodes, this code is unreachable and cannot be fuzzed.",
"WorthFuzzing": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|