| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/07 06:35 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the Airoha EN8811H / AN8811HB Ethernet PHY driver (drivers/net/phy/air_en8811h.c) to handle package variant detection and LED GPIO configuration. This code requires dedicated physical Airoha PHY hardware on an MDIO bus and cannot be instantiated or executed in standard virtualized fuzzing environments (QEMU/GCE), making it structurally unreachable.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/07 06:35 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 3ab6127ccef9de1e63e73701a67cd6fcb76be59d\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Mon Sep 7 06:35:25 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/phy/air_en8811h.c b/drivers/net/phy/air_en8811h.c\nindex 38eb18f0e9bb4..ae24c41f538aa 100644\n--- a/drivers/net/phy/air_en8811h.c\n+++ b/drivers/net/phy/air_en8811h.c\n@@ -145,10 +145,22 @@\n \n #define AN8811HB_GPIO_OUTPUT\t\t0x5cf8b8\n #define AN8811HB_GPIO_OUTPUT_345\t\t(BIT(3) | BIT(4) | BIT(5))\n+#define AN8811HB_GPIO_OUTPUT_0115\t\t(BIT(0) | BIT(1) | BIT(15))\n+\n+#define AN8811HB_GPIO_SEL1\t\t0x5cf8bc\n+#define AN8811HB_GPIO_SEL1_0_MASK\t\tGENMASK(3, 0)\n+#define AN8811HB_GPIO_SEL1_1_MASK\t\tGENMASK(7, 4)\n+#define AN8811HB_GPIO_SEL1_0\t\t\tBIT(0)\n+#define AN8811HB_GPIO_SEL1_1\t\t\t0\n+\n+#define AN8811HB_GPIO_SEL2\t\t0x5cf8c0\n+#define AN8811HB_GPIO_SEL2_15_MASK\t\tGENMASK(31, 28)\n+#define AN8811HB_GPIO_SEL2_15\t\t\tBIT(29)\n \n #define AN8811HB_HWTRAP1\t\t0x5cf910\n #define AN8811HB_HWTRAP2\t\t0x5cf914\n #define AN8811HB_HWTRAP2_CKO\t\t\tBIT(28)\n+#define AN8811HB_HWTRAP2_PKG\t\t\tGENMASK(14, 12)\n \n #define AN8811HB_CLK_DRV\t\t0x5cf9e4\n #define AN8811HB_CLK_DRV_CKO_MASK\t\tGENMASK(14, 12)\n@@ -202,6 +214,7 @@ struct en8811h_priv {\n \tstruct phy_device\t*phydev;\n \tunsigned int\t\tcko_is_enabled;\n \tstruct mdio_device\t*pbusdev;\n+\tbool\t\t\tis_an8811hbcn;\n };\n \n enum {\n@@ -1071,10 +1084,49 @@ static int en8811h_leds_setup(struct phy_device *phydev)\n \treturn ret;\n }\n \n+static int an8811hb_led_gpio_setup(struct phy_device *phydev)\n+{\n+\tstruct en8811h_priv *priv = phydev-\u003epriv;\n+\tint ret;\n+\n+\tif (priv-\u003eis_an8811hbcn) {\n+\t\t/* AN8811HBCN: LED GPIOs are 0, 1, 15 */\n+\t\tret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,\n+\t\t\t\t\t\t AN8811HB_GPIO_OUTPUT_0115,\n+\t\t\t\t\t\t AN8811HB_GPIO_OUTPUT_0115);\n+\t\tif (ret \u003c 0)\n+\t\t\treturn ret;\n+\n+\t\tret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL1,\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL1_0_MASK |\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL1_1_MASK,\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL1_0 |\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL1_1);\n+\t\tif (ret \u003c 0)\n+\t\t\treturn ret;\n+\n+\t\tret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL2,\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL2_15_MASK,\n+\t\t\t\t\t\t AN8811HB_GPIO_SEL2_15);\n+\t\tif (ret \u003c 0)\n+\t\t\treturn ret;\n+\t} else {\n+\t\t/* AN8811HBN: LED GPIOs are 3, 4, 5 */\n+\t\tret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,\n+\t\t\t\t\t\t AN8811HB_GPIO_OUTPUT_345,\n+\t\t\t\t\t\t AN8811HB_GPIO_OUTPUT_345);\n+\t\tif (ret \u003c 0)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n static int an8811hb_probe(struct phy_device *phydev)\n {\n \tstruct mdio_device *mdiodev;\n \tstruct en8811h_priv *priv;\n+\tu32 reg_val;\n \tint ret;\n \n \tpriv = devm_kzalloc(\u0026phydev-\u003emdio.dev, sizeof(struct en8811h_priv),\n@@ -1115,6 +1167,12 @@ static int an8811hb_probe(struct phy_device *phydev)\n \t/* MDIO_DEVS1/2 empty, so set mmds_present bits here */\n \tphydev-\u003ec45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;\n \n+\t/* Detect package variant */\n+\tret = air_phy_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, \u0026reg_val);\n+\tif (ret \u003c 0)\n+\t\tgoto err_dev_create;\n+\tpriv-\u003eis_an8811hbcn = FIELD_GET(AN8811HB_HWTRAP2_PKG, reg_val);\n+\n \tret = en8811h_leds_setup(phydev);\n \tif (ret \u003c 0)\n \t\tgoto err_dev_create;\n@@ -1263,10 +1321,11 @@ static int an8811hb_config_init(struct phy_device *phydev)\n \t\treturn ret;\n \t}\n \n-\t/* Restore LED GPIO output enables after MCU initialization. */\n-\tret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,\n-\t\t\t\t\t AN8811HB_GPIO_OUTPUT_345,\n-\t\t\t\t\t AN8811HB_GPIO_OUTPUT_345);\n+\tret = an8811hb_led_gpio_setup(phydev);\n+\tif (ret \u003c 0) {\n+\t\tphydev_err(phydev, \"Failed to set up LED GPIO: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n \treturn ret;\n }\n \n"
} |
| 2/1 | 2026/09/07 06:35 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Airoha EN8811H / AN8811HB Ethernet PHY driver (drivers/net/phy/air_en8811h.c) to handle package variant detection and LED GPIO configuration. This code requires dedicated physical Airoha PHY hardware on an MDIO bus and cannot be instantiated or executed in standard virtualized fuzzing environments (QEMU/GCE), making it structurally unreachable.",
"WorthFuzzing": false
}Instruction: You are an expert Linux kernel maintainer and security engineer.
Your job is to review a provided patch series and evaluate whether it warrants fuzzing with syzkaller.
IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on internal assumptions. You must actively use your code access
tools to inspect the actual source code, callers, and surrounding context.
================================================================================
1. CORE TRIAGE PHILOSOPHY
================================================================================
The goal of patch fuzzing is to discover crashes, regressions, exposed latent bugs,
and newly triggered assertions introduced by the patch series.
- REACHABILITY IS THE PRIMARY GATE:
Fuzzing can only discover bugs in code that can actually execute in standard virtualized
environments (GCE or QEMU, utilizing software-emulated devices like USB gadgets, netdev, tun/tap).
If the modified code is structurally unreachable (see Section 2), it MUST NOT be fuzzed,
regardless of whether it adds assertions or complex logic.
- DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS:
Patch authors routinely label changes as "cleanups", "refactorings", or state
"No functional change intended". Do NOT take these claims at face value.
Code refactorings that rearrange logic, introduce helper functions, or alter state management
in core subsystems frequently introduce subtle semantic shifts or uncover latent kernel bugs.
If reachable executable code is modified or refactored, it MUST be fuzzed.
- NEW OR MODIFIED ASSERTIONS IN REACHABLE CODE MUST BE FUZZED:
When a patch introduces or modifies runtime checks or assertions (e.g., WARN_ON*, VM_WARN_ON*,
BUG_ON*, lockdep_assert*) in reachable code paths, it enforces new or stricter invariants.
Even if the author believes the invariant always holds, fuzzing is essential to verify whether
an unusual sequence of operations can violate it.
================================================================================
2. WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)
================================================================================
Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:
- Non-kernel and non-executable changes:
* Modifications to Documentation/, comments, or spelling fixes.
* User-space directories, self-tests, samples, or scripts (e.g., tools/, samples/, scripts/, usr/)
that do not affect the compiled kernel image (vmlinux) or kernel modules.
* Purely decorative logging (e.g., message strings in pr_err, printk, dev_info) or tracepoints
that do not alter control flow or data structures.
* Build system or Kconfig changes that do not alter compiled C logic.
- Structurally unreachable hardware:
* Vendor-specific PCIe switches, SmartNICs, or GPU drivers (e.g., mlxsw, pds_core, qed,
ionic, amdgpu) requiring physical ASIC/PCIe cards not emulated in standard QEMU.
- Unreachable execution paths:
* Driver teardown callbacks (.remove, .shutdown, pci_unregister_driver) executed only during
physical PCI hot-unplug or manual sysfs driver unbinding.
* Code paths exclusive to architectures other than the target architecture.
================================================================================
3. WHEN TO RETURN WorthFuzzing=true (POSITIVE CRITERIA)
================================================================================
Return WorthFuzzing=true whenever the patch touches reachable executable code, including:
- Core Subsystems:
* Any logic modifications in memory management (mm/), synchronization/locking (kernel/locking/),
BPF, scheduler, core networking, VFS, or syscall handling.
- Refactorings and Code Cleanups:
* Any restructuring of reachable data structures, helper abstractions, or algorithm flows.
- Runtime Assertions and Defensive Checks:
* Any introduction or alteration of assertions (WARN_ON*, VM_WARN_ON*, BUG_ON*, etc.) in reachable paths.
- Reachable Drivers and Protocols:
* Drivers accessible via virtual buses (virtio, USB gadget, loopback, netlink, binder, sockets, etc.).
================================================================================
4. EXTRACTING FocusSymbols (PREVENTING DILUTION)
================================================================================
When WorthFuzzing=true, you must extract specific kernel functions into FocusSymbols to guide the fuzzer:
- AVOID UBIQUITOUS LIFECYCLE HOT-PATHS:
Do NOT list generic, ubiquitous functions called by almost every program in the corpus
(including, but not limited to: general memory allocators and deallocators, page fault
and trap handlers, or core synchronization primitives; this is not an exhaustive list).
Listing ubiquitous functions causes the fuzzer to classify thousands of unrelated tests as "focused",
which severely dilutes fuzzing effort away from the actual changes.
- TARGET SPECIFIC FEATURE LOGIC AND ENTRYPOINTS:
List functions that specifically implement the logic being added or altered, or direct API entrypoints
for the subsystem feature under review.
- HANDLING STATIC INLINE FUNCTIONS IN HEADERS (.h):
Compiler-inlined static functions (such as static inlines in mm/*.h or include/linux/*.h) lack
distinct symbol addresses in vmlinux and cannot be targeted directly by symbol coverage filters.
If the changes are primarily in static inline helpers, identify non-static, feature-specific caller
functions in .c files that exercise them (avoiding ubiquitous lifecycle wrappers).
================================================================================
5. IDENTIFYING EnableConfigs
================================================================================
Identify any specific CONFIG_ options required to properly compile and reach the modified code:
- Inspect Kconfig files and #ifdef guards; do not make assumptions.
- Check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed.
- Strip any 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4").
Prefer calling several tools at the same time to save round-trips.
Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.
Prompt: Target architecture: amd64
For your convenience, here is the diff of the changes:
commit 3ab6127ccef9de1e63e73701a67cd6fcb76be59d
Author: syz-cluster <triage@syzkaller.com>
Date: Mon Sep 7 06:35:25 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/phy/air_en8811h.c b/drivers/net/phy/air_en8811h.c
index 38eb18f0e9bb4..ae24c41f538aa 100644
--- a/drivers/net/phy/air_en8811h.c
+++ b/drivers/net/phy/air_en8811h.c
@@ -145,10 +145,22 @@
#define AN8811HB_GPIO_OUTPUT 0x5cf8b8
#define AN8811HB_GPIO_OUTPUT_345 (BIT(3) | BIT(4) | BIT(5))
+#define AN8811HB_GPIO_OUTPUT_0115 (BIT(0) | BIT(1) | BIT(15))
+
+#define AN8811HB_GPIO_SEL1 0x5cf8bc
+#define AN8811HB_GPIO_SEL1_0_MASK GENMASK(3, 0)
+#define AN8811HB_GPIO_SEL1_1_MASK GENMASK(7, 4)
+#define AN8811HB_GPIO_SEL1_0 BIT(0)
+#define AN8811HB_GPIO_SEL1_1 0
+
+#define AN8811HB_GPIO_SEL2 0x5cf8c0
+#define AN8811HB_GPIO_SEL2_15_MASK GENMASK(31, 28)
+#define AN8811HB_GPIO_SEL2_15 BIT(29)
#define AN8811HB_HWTRAP1 0x5cf910
#define AN8811HB_HWTRAP2 0x5cf914
#define AN8811HB_HWTRAP2_CKO BIT(28)
+#define AN8811HB_HWTRAP2_PKG GENMASK(14, 12)
#define AN8811HB_CLK_DRV 0x5cf9e4
#define AN8811HB_CLK_DRV_CKO_MASK GENMASK(14, 12)
@@ -202,6 +214,7 @@ struct en8811h_priv {
struct phy_device *phydev;
unsigned int cko_is_enabled;
struct mdio_device *pbusdev;
+ bool is_an8811hbcn;
};
enum {
@@ -1071,10 +1084,49 @@ static int en8811h_leds_setup(struct phy_device *phydev)
return ret;
}
+static int an8811hb_led_gpio_setup(struct phy_device *phydev)
+{
+ struct en8811h_priv *priv = phydev->priv;
+ int ret;
+
+ if (priv->is_an8811hbcn) {
+ /* AN8811HBCN: LED GPIOs are 0, 1, 15 */
+ ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
+ AN8811HB_GPIO_OUTPUT_0115,
+ AN8811HB_GPIO_OUTPUT_0115);
+ if (ret < 0)
+ return ret;
+
+ ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL1,
+ AN8811HB_GPIO_SEL1_0_MASK |
+ AN8811HB_GPIO_SEL1_1_MASK,
+ AN8811HB_GPIO_SEL1_0 |
+ AN8811HB_GPIO_SEL1_1);
+ if (ret < 0)
+ return ret;
+
+ ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_SEL2,
+ AN8811HB_GPIO_SEL2_15_MASK,
+ AN8811HB_GPIO_SEL2_15);
+ if (ret < 0)
+ return ret;
+ } else {
+ /* AN8811HBN: LED GPIOs are 3, 4, 5 */
+ ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
+ AN8811HB_GPIO_OUTPUT_345,
+ AN8811HB_GPIO_OUTPUT_345);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
static int an8811hb_probe(struct phy_device *phydev)
{
struct mdio_device *mdiodev;
struct en8811h_priv *priv;
+ u32 reg_val;
int ret;
priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct en8811h_priv),
@@ -1115,6 +1167,12 @@ static int an8811hb_probe(struct phy_device *phydev)
/* MDIO_DEVS1/2 empty, so set mmds_present bits here */
phydev->c45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
+ /* Detect package variant */
+ ret = air_phy_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, ®_val);
+ if (ret < 0)
+ goto err_dev_create;
+ priv->is_an8811hbcn = FIELD_GET(AN8811HB_HWTRAP2_PKG, reg_val);
+
ret = en8811h_leds_setup(phydev);
if (ret < 0)
goto err_dev_create;
@@ -1263,10 +1321,11 @@ static int an8811hb_config_init(struct phy_device *phydev)
return ret;
}
- /* Restore LED GPIO output enables after MCU initialization. */
- ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
- AN8811HB_GPIO_OUTPUT_345,
- AN8811HB_GPIO_OUTPUT_345);
+ ret = an8811hb_led_gpio_setup(phydev);
+ if (ret < 0) {
+ phydev_err(phydev, "Failed to set up LED GPIO: %d\n", ret);
+ return ret;
+ }
return ret;
}
|
| 3/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 4458 output: 22 thoughts: 176 Thoughts: **Assessing the Fuzzing Potential of This Patch** Okay, let's take a look at this patch and decide if it's worth our time to throw it into the syzkaller fuzzing grinder. My first step is always to understand the scope and potential impact. Right off the bat, I see the patch is touching `drivers/net/phy/air_en8811h.c`. Hmm, an Ethernet PHY driver – the Airoha EN8811H/AN8811HB Gigabit Ethernet PHY driver, to be precise. That gives me a general idea. Now, to really determine its fuzzing value, I need to check its reachability within typical virtualized environments. The Kconfig, the driver's dependencies, and if it's on the MDIO bus, all have a bearing on this. I'll need to dig into the source and kernel configuration to see if we can get to it in QEMU or GCE. I need to figure out if it's even compiled and linked. Time to search the kernel source, or look at existing syzkaller configs, to see where `air_en8811h.c` or, more broadly, Ethernet PHY drivers, are used and configured. Knowing how these drivers are brought into play will tell me if the attack surface is exposed. This will help determine the path to exploitation, and whether a fuzzing target is justified. |
| 4/2 | 2026/09/07 06:35 | tool | grepper |
0mArgs:{
"Expression": "air_en8811h"
}Results: {
"Output": "drivers/net/phy/Makefile=33=obj-$(CONFIG_AIR_AN8801_PHY)\t+= air_an8801.o\ndrivers/net/phy/Makefile:34:obj-$(CONFIG_AIR_EN8811H_PHY) += air_en8811h.o\ndrivers/net/phy/Makefile-35-obj-$(CONFIG_AIR_NET_PHYLIB)\t+= air_phy_lib.o\n--\ndrivers/net/phy/mediatek/mtk-ge-soc.c-324-/* LED basic control register, part of the same LED block as the LED0/LED1\ndrivers/net/phy/mediatek/mtk-ge-soc.c:325: * control registers above. The air_en8811h driver describes the same\ndrivers/net/phy/mediatek/mtk-ge-soc.c-326- * register as AIR_PHY_LED_BCR.\n--\ndrivers/net/phy/mediatek/mtk-ge-soc.c=1482=static int en7528_phy_config_init(struct phy_device *phydev)\n--\ndrivers/net/phy/mediatek/mtk-ge-soc.c-1486-\t * programmed into the LED control registers. Hand the pins over to\ndrivers/net/phy/mediatek/mtk-ge-soc.c:1487:\t * the LED control registers the same way the air_en8811h driver\ndrivers/net/phy/mediatek/mtk-ge-soc.c-1488-\t * does; the mode field of this register is already set out of reset.\n"
} |
| 5/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 5376 output: 35 thoughts: 29 Thoughts: Here's my thought process, as if I were reviewing this: **Initial Investigation into Air-EN8811H PHY Configuration** Okay, time to dig into this. I need to understand the configuration options for the Air-EN8811H PHY. My first instinct is to zero in on the `Kconfig` file within the driver's network PHY directory. That's usually where these things are defined and controlled. Specifically, I'll be looking around the `CONFIG_AIR_EN8811H_PHY` symbol. This is where the core logic for the driver's behavior is likely defined. I'll need to confirm what conditions enable this device, which might involve dependency checks on other hardware or software features, and any default configurations. My focus is on understanding the build-time configuration parameters to see if this has been configured properly. |
| 6/2 | 2026/09/07 06:35 | tool | grepper |
0mArgs:{
"Expression": "AIR_EN8811H_PHY",
"PathPrefix": "drivers/net/phy"
}Results: {
"Output": "drivers/net/phy/Kconfig=93=config AIR_AN8801_PHY\n--\ndrivers/net/phy/Kconfig-98-\ndrivers/net/phy/Kconfig:99:config AIR_EN8811H_PHY\ndrivers/net/phy/Kconfig-100-\ttristate \"Airoha EN8811H 2.5 Gigabit PHY\"\n--\ndrivers/net/phy/Makefile=33=obj-$(CONFIG_AIR_AN8801_PHY)\t+= air_an8801.o\ndrivers/net/phy/Makefile:34:obj-$(CONFIG_AIR_EN8811H_PHY) += air_en8811h.o\ndrivers/net/phy/Makefile-35-obj-$(CONFIG_AIR_NET_PHYLIB)\t+= air_phy_lib.o\n"
} |
| 7/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 5846 output: 45 thoughts: 37 Thoughts: Okay, let's dive into this. I need to understand how this `air_en8811h.c` driver hooks into the system, specifically concerning its PHY driver registration. My goal is to figure out the device it's designed to bind to. I'll zero in on the `phy_driver` registration section within the code. That's the key. By analyzing how `phy_driver` is handled, I should be able to deduce the intended target hardware. This is routine, but essential when assessing a new driver. |
| 8/2 | 2026/09/07 06:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/phy/air_en8811h.c",
"FirstLine": 1300,
"LineCount": 80
}Results: {
"Contents": "1300:\t\tstruct en8811h_priv *priv = phydev-\u003epriv;\n1301:\t\tint ret;\n1302:\t\n1303:\t\t/* If restart happened in .probe(), no need to restart now */\n1304:\t\tif (priv-\u003emcu_needs_restart) {\n1305:\t\t\tret = en8811h_restart_mcu(phydev);\n1306:\t\t\tif (ret \u003c 0)\n1307:\t\t\t\treturn ret;\n1308:\t\t} else {\n1309:\t\t\t/* Next calls to .config_init() mcu needs to restart */\n1310:\t\t\tpriv-\u003emcu_needs_restart = true;\n1311:\t\t}\n1312:\t\n1313:\t\tret = an8811hb_config_serdes_polarity(phydev);\n1314:\t\tif (ret \u003c 0)\n1315:\t\t\treturn ret;\n1316:\t\n1317:\t\tret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,\n1318:\t\t\t\t AIR_LED_MODE_USER_DEFINE);\n1319:\t\tif (ret \u003c 0) {\n1320:\t\t\tphydev_err(phydev, \"Failed to initialize leds: %d\\n\", ret);\n1321:\t\t\treturn ret;\n1322:\t\t}\n1323:\t\n1324:\t\tret = an8811hb_led_gpio_setup(phydev);\n1325:\t\tif (ret \u003c 0) {\n1326:\t\t\tphydev_err(phydev, \"Failed to set up LED GPIO: %d\\n\", ret);\n1327:\t\t\treturn ret;\n1328:\t\t}\n1329:\t\treturn ret;\n1330:\t}\n1331:\t\n1332:\tstatic int en8811h_config_init(struct phy_device *phydev)\n1333:\t{\n1334:\t\tstruct en8811h_priv *priv = phydev-\u003epriv;\n1335:\t\tint ret;\n1336:\t\n1337:\t\t/* If restart happened in .probe(), no need to restart now */\n1338:\t\tif (priv-\u003emcu_needs_restart) {\n1339:\t\t\tret = en8811h_restart_mcu(phydev);\n1340:\t\t\tif (ret \u003c 0)\n1341:\t\t\t\treturn ret;\n1342:\t\t} else {\n1343:\t\t\t/* Next calls to .config_init() mcu needs to restart */\n1344:\t\t\tpriv-\u003emcu_needs_restart = true;\n1345:\t\t}\n1346:\t\n1347:\t\t/* Select mode 1, the only mode supported.\n1348:\t\t * Configures the SerDes for 2500Base-X with rate adaptation\n1349:\t\t */\n1350:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_1,\n1351:\t\t\t\t AIR_PHY_MCU_CMD_1_MODE1);\n1352:\t\tif (ret \u003c 0)\n1353:\t\t\treturn ret;\n1354:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_2,\n1355:\t\t\t\t AIR_PHY_MCU_CMD_2_MODE1);\n1356:\t\tif (ret \u003c 0)\n1357:\t\t\treturn ret;\n1358:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,\n1359:\t\t\t\t AIR_PHY_MCU_CMD_3_MODE1);\n1360:\t\tif (ret \u003c 0)\n1361:\t\t\treturn ret;\n1362:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,\n1363:\t\t\t\t AIR_PHY_MCU_CMD_4_MODE1);\n1364:\t\tif (ret \u003c 0)\n1365:\t\t\treturn ret;\n1366:\t\n1367:\t\tret = en8811h_config_serdes_polarity(phydev);\n1368:\t\tif (ret \u003c 0)\n1369:\t\t\treturn ret;\n1370:\t\n1371:\t\tret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,\n1372:\t\t\t\t AIR_LED_MODE_USER_DEFINE);\n1373:\t\tif (ret \u003c 0) {\n1374:\t\t\tphydev_err(phydev, \"Failed to initialize leds: %d\\n\", ret);\n1375:\t\t\treturn ret;\n1376:\t\t}\n1377:\t\n1378:\t\t/* Configure led gpio pins as output. Must be redone on every\n1379:\t\t * .config_init(), not just once in .probe(): en8811h_restart_mcu()\n"
} |
| 9/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 7406 output: 45 thoughts: 35 Thoughts: Okay, let's dive into this. Here's my take on understanding how the PHY device matching and probing works, based on the file name `drivers/net/phy/air_en8811h.c`: **Probing the Air-EN8811H PHY** Right, so I want to understand how the system identifies and initializes this particular PHY – the Air-EN8811H. Given the file path, `drivers/net/phy/air_en8811h.c`, my natural next step is to examine the contents of that file. I'm going to pore over it to understand the matching process. I'm especially interested in seeing how the system determines whether a connected PHY is *actually* an Air-EN8811H and then how it's brought online, basically probing. I'll be looking for clues about the device's identification data, how it's handled during driver initialization, and any specific initialization sequences needed. I expect to find some standard PHY driver framework elements, but the crucial bits will be the specifics related to *this* particular PHY and how it fits into the broader network subsystem. Time to dig in and get a good grasp of the control flow. |
| 10/2 | 2026/09/07 06:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/phy/air_en8811h.c",
"FirstLine": 1410,
"LineCount": 80
}Results: {
"Contents": "1410:\t\tint ret;\n1411:\t\tu32 adv;\n1412:\t\n1413:\t\tif (phydev-\u003eautoneg == AUTONEG_DISABLE) {\n1414:\t\t\tphydev_warn(phydev, \"Disabling autoneg is not supported\\n\");\n1415:\t\t\treturn -EINVAL;\n1416:\t\t}\n1417:\t\n1418:\t\tadv = linkmode_adv_to_mii_10gbt_adv_t(phydev-\u003eadvertising);\n1419:\t\n1420:\t\tret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,\n1421:\t\t\t\t\t MDIO_AN_10GBT_CTRL_ADV2_5G, adv);\n1422:\t\tif (ret \u003c 0)\n1423:\t\t\treturn ret;\n1424:\t\tif (ret \u003e 0)\n1425:\t\t\tchanged = true;\n1426:\t\n1427:\t\treturn __genphy_config_aneg(phydev, changed);\n1428:\t}\n1429:\t\n1430:\tstatic int en8811h_read_status(struct phy_device *phydev)\n1431:\t{\n1432:\t\tstruct en8811h_priv *priv = phydev-\u003epriv;\n1433:\t\tu32 pbus_value;\n1434:\t\tint ret, val;\n1435:\t\n1436:\t\tret = genphy_update_link(phydev);\n1437:\t\tif (ret)\n1438:\t\t\treturn ret;\n1439:\t\n1440:\t\tphydev-\u003emaster_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED;\n1441:\t\tphydev-\u003emaster_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;\n1442:\t\tphydev-\u003espeed = SPEED_UNKNOWN;\n1443:\t\tphydev-\u003eduplex = DUPLEX_UNKNOWN;\n1444:\t\tphydev-\u003epause = 0;\n1445:\t\tphydev-\u003easym_pause = 0;\n1446:\t\tphydev-\u003erate_matching = RATE_MATCH_PAUSE;\n1447:\t\n1448:\t\tret = genphy_read_master_slave(phydev);\n1449:\t\tif (ret \u003c 0)\n1450:\t\t\treturn ret;\n1451:\t\n1452:\t\tret = genphy_read_lpa(phydev);\n1453:\t\tif (ret \u003c 0)\n1454:\t\t\treturn ret;\n1455:\t\n1456:\t\tif (phy_id_compare_model(phydev-\u003ephy_id, AN8811HB_PHY_ID)) {\n1457:\t\t\tval = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);\n1458:\t\t\tif (val \u003c 0)\n1459:\t\t\t\treturn val;\n1460:\t\t\tlinkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,\n1461:\t\t\t\t\t phydev-\u003elp_advertising,\n1462:\t\t\t\t\t val \u0026 MDIO_AN_10GBT_STAT_LP2_5G);\n1463:\t\t} else {\n1464:\t\t\t/* Get link partner 2.5GBASE-T ability from vendor register */\n1465:\t\t\tret = air_phy_buckpbus_reg_read(phydev, EN8811H_2P5G_LPA,\n1466:\t\t\t\t\t\t\t\u0026pbus_value);\n1467:\t\t\tif (ret \u003c 0)\n1468:\t\t\t\treturn ret;\n1469:\t\t\tlinkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,\n1470:\t\t\t\t\t phydev-\u003elp_advertising,\n1471:\t\t\t\t\t pbus_value \u0026 EN8811H_2P5G_LPA_2P5G);\n1472:\t\t}\n1473:\t\n1474:\t\tif (phydev-\u003eautoneg_complete)\n1475:\t\t\tphy_resolve_aneg_pause(phydev);\n1476:\t\n1477:\t\tif (!phydev-\u003elink)\n1478:\t\t\treturn 0;\n1479:\t\n1480:\t\t/* Get real speed from vendor register */\n1481:\t\tval = phy_read(phydev, AIR_AUX_CTRL_STATUS);\n1482:\t\tif (val \u003c 0)\n1483:\t\t\treturn val;\n1484:\t\tswitch (val \u0026 AIR_AUX_CTRL_STATUS_SPEED_MASK) {\n1485:\t\tcase AIR_AUX_CTRL_STATUS_SPEED_2500:\n1486:\t\t\tphydev-\u003espeed = SPEED_2500;\n1487:\t\t\tbreak;\n1488:\t\tcase AIR_AUX_CTRL_STATUS_SPEED_1000:\n1489:\t\t\tphydev-\u003espeed = SPEED_1000;\n"
} |
| 11/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 9090 output: 45 thoughts: 35 Thoughts: Here's my take on the thought process, as if it were my own: **Diving into the Air-EN8811H PHY Driver** Alright, time to dig deeper into this `air_en8811h.c` file within the `drivers/net/phy` directory. I need to get a full picture here. I'm focusing on the module definition and the all-important `phy_driver` struct. This is where the core of the driver's interface is defined – how it presents itself to the system, how it interacts with the PHY, and what capabilities it exposes. Gotta verify the module's structure and then the meat of its operational details to understand how this PHY is actually managed. Let's get to it! |
| 12/2 | 2026/09/07 06:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/phy/air_en8811h.c",
"FirstLine": 1490,
"LineCount": 80
}Results: {
"Contents": "1490:\t\t\tbreak;\n1491:\t\tcase AIR_AUX_CTRL_STATUS_SPEED_100:\n1492:\t\t\tphydev-\u003espeed = SPEED_100;\n1493:\t\t\tbreak;\n1494:\t\tcase AIR_AUX_CTRL_STATUS_SPEED_10:\n1495:\t\t\tphydev-\u003espeed = SPEED_10;\n1496:\t\t\tbreak;\n1497:\t\t}\n1498:\t\n1499:\t\t/* Firmware before version 24011202 has no vendor register 2P5G_LPA.\n1500:\t\t * Assume link partner advertised it if connected at 2500Mbps.\n1501:\t\t */\n1502:\t\tif (priv-\u003efirmware_version \u003c 0x24011202) {\n1503:\t\t\tlinkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,\n1504:\t\t\t\t\t phydev-\u003elp_advertising,\n1505:\t\t\t\t\t phydev-\u003espeed == SPEED_2500);\n1506:\t\t}\n1507:\t\n1508:\t\t/* Only supports full duplex */\n1509:\t\tphydev-\u003eduplex = DUPLEX_FULL;\n1510:\t\n1511:\t\treturn 0;\n1512:\t}\n1513:\t\n1514:\tstatic int en8811h_clear_intr(struct phy_device *phydev)\n1515:\t{\n1516:\t\tint ret;\n1517:\t\n1518:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,\n1519:\t\t\t\t AIR_PHY_MCU_CMD_3_DOCMD);\n1520:\t\tif (ret \u003c 0)\n1521:\t\t\treturn ret;\n1522:\t\n1523:\t\tret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,\n1524:\t\t\t\t AIR_PHY_MCU_CMD_4_INTCLR);\n1525:\t\tif (ret \u003c 0)\n1526:\t\t\treturn ret;\n1527:\t\n1528:\t\treturn 0;\n1529:\t}\n1530:\t\n1531:\tstatic irqreturn_t en8811h_handle_interrupt(struct phy_device *phydev)\n1532:\t{\n1533:\t\tint ret;\n1534:\t\n1535:\t\tret = en8811h_clear_intr(phydev);\n1536:\t\tif (ret \u003c 0) {\n1537:\t\t\tphy_error(phydev);\n1538:\t\t\treturn IRQ_NONE;\n1539:\t\t}\n1540:\t\n1541:\t\tphy_trigger_machine(phydev);\n1542:\t\n1543:\t\treturn IRQ_HANDLED;\n1544:\t}\n1545:\t\n1546:\tstatic int en8811h_resume(struct phy_device *phydev)\n1547:\t{\n1548:\t\tclk_restore_context();\n1549:\t\n1550:\t\treturn genphy_resume(phydev);\n1551:\t}\n1552:\t\n1553:\tstatic int en8811h_suspend(struct phy_device *phydev)\n1554:\t{\n1555:\t\tclk_save_context();\n1556:\t\n1557:\t\treturn genphy_suspend(phydev);\n1558:\t}\n1559:\t\n1560:\tstatic void an8811hb_remove(struct phy_device *phydev)\n1561:\t{\n1562:\t\tstruct en8811h_priv *priv = phydev-\u003epriv;\n1563:\t\n1564:\t\tif (priv-\u003epbusdev) {\n1565:\t\t\tmdio_device_remove(priv-\u003epbusdev);\n1566:\t\t\tmdio_device_free(priv-\u003epbusdev);\n1567:\t\t}\n1568:\t}\n1569:\t\n"
} |
| 13/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 10471 output: 45 thoughts: 12 Thoughts: Okay, let's dive into this. I need to get a handle on what's happening from line 1570 onwards. That's where the critical piece is, where the analysis is taking place. This is where the core of my understanding is either going to deepen or break, so I need to make sure I'm focused. Let's see what we've got. |
| 14/2 | 2026/09/07 06:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/phy/air_en8811h.c",
"FirstLine": 1570,
"LineCount": 80
}Results: {
"Contents": "1570:\tstatic struct phy_driver en8811h_driver[] = {\n1571:\t{\n1572:\t\tPHY_ID_MATCH_MODEL(EN8811H_PHY_ID),\n1573:\t\t.name\t\t\t= \"Airoha EN8811H\",\n1574:\t\t.probe\t\t\t= en8811h_probe,\n1575:\t\t.get_features\t\t= en8811h_get_features,\n1576:\t\t.config_init\t\t= en8811h_config_init,\n1577:\t\t.get_rate_matching\t= en8811h_get_rate_matching,\n1578:\t\t.config_aneg\t\t= en8811h_config_aneg,\n1579:\t\t.read_status\t\t= en8811h_read_status,\n1580:\t\t.resume\t\t\t= en8811h_resume,\n1581:\t\t.suspend\t\t= en8811h_suspend,\n1582:\t\t.config_intr\t\t= en8811h_clear_intr,\n1583:\t\t.handle_interrupt\t= en8811h_handle_interrupt,\n1584:\t\t.led_hw_is_supported\t= en8811h_led_hw_is_supported,\n1585:\t\t.read_page\t\t= air_phy_read_page,\n1586:\t\t.write_page\t\t= air_phy_write_page,\n1587:\t\t.led_blink_set\t\t= air_led_blink_set,\n1588:\t\t.led_brightness_set\t= air_led_brightness_set,\n1589:\t\t.led_hw_control_set\t= air_led_hw_control_set,\n1590:\t\t.led_hw_control_get\t= air_led_hw_control_get,\n1591:\t},\n1592:\t{\n1593:\t\tPHY_ID_MATCH_MODEL(AN8811HB_PHY_ID),\n1594:\t\t.name\t\t\t= \"Airoha AN8811HB\",\n1595:\t\t.probe\t\t\t= an8811hb_probe,\n1596:\t\t.remove\t\t\t= an8811hb_remove,\n1597:\t\t.get_features\t\t= en8811h_get_features,\n1598:\t\t.config_init\t\t= an8811hb_config_init,\n1599:\t\t.get_rate_matching\t= en8811h_get_rate_matching,\n1600:\t\t.config_aneg\t\t= en8811h_config_aneg,\n1601:\t\t.read_status\t\t= en8811h_read_status,\n1602:\t\t.resume\t\t\t= en8811h_resume,\n1603:\t\t.suspend\t\t= en8811h_suspend,\n1604:\t\t.config_intr\t\t= en8811h_clear_intr,\n1605:\t\t.handle_interrupt\t= en8811h_handle_interrupt,\n1606:\t\t.led_hw_is_supported\t= en8811h_led_hw_is_supported,\n1607:\t\t.read_page\t\t= air_phy_read_page,\n1608:\t\t.write_page\t\t= air_phy_write_page,\n1609:\t\t.led_blink_set\t\t= air_led_blink_set,\n1610:\t\t.led_brightness_set\t= air_led_brightness_set,\n1611:\t\t.led_hw_control_set\t= air_led_hw_control_set,\n1612:\t\t.led_hw_control_get\t= air_led_hw_control_get,\n1613:\t} };\n1614:\t\n1615:\tmodule_phy_driver(en8811h_driver);\n1616:\t\n1617:\tstatic const struct mdio_device_id __maybe_unused en8811h_tbl[] = {\n1618:\t\t{ PHY_ID_MATCH_MODEL(EN8811H_PHY_ID) },\n1619:\t\t{ PHY_ID_MATCH_MODEL(AN8811HB_PHY_ID) },\n1620:\t\t{ }\n1621:\t};\n1622:\t\n1623:\tMODULE_DEVICE_TABLE(mdio, en8811h_tbl);\n1624:\tMODULE_FIRMWARE(EN8811H_MD32_DM);\n1625:\tMODULE_FIRMWARE(EN8811H_MD32_DSP);\n1626:\tMODULE_FIRMWARE(AN8811HB_MD32_DM);\n1627:\tMODULE_FIRMWARE(AN8811HB_MD32_DSP);\n1628:\t\n1629:\tMODULE_DESCRIPTION(\"Airoha EN8811H and AN8811HB PHY drivers\");\n1630:\tMODULE_AUTHOR(\"Airoha\");\n1631:\tMODULE_AUTHOR(\"Eric Woudstra \u003cericwouds@gmail.com\u003e\");\n1632:\tMODULE_LICENSE(\"GPL\");\n"
} |
| 15/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 11983 output: 20 thoughts: 245 Thoughts: **My MDIO/PHY Reachability Analysis** Okay, so I'm thinking about how reachable MDIO PHY devices are when it comes to fuzzing, specifically within something like syzkaller. The question I'm trying to answer is: can we actually *get to* these things? First, I need to figure out the instantiation process. Can we probe them, emulate them, or instantiate them in a standard fuzzing environment like QEMU? I know a MAC driver usually creates an MDIO bus and scans, or it comes through the device tree, ACPI, platform devices or MDIO netlink. The real trick is: can *user space* do this? Or, do we have MDIO PHY drivers in standard QEMU / virtio configurations? Next, I'll need to dig into the kernel's MDIO buses and PHY drivers directly. I'm focusing on the feasibility of instantiating a specific PHY device with a target PHY ID like `AN8811HB_PHY_ID` without needing actual hardware. Finally, the key question is whether any virtual MDIO buses or software MDIO drivers can provide a way in? This means looking for things like `mdio-gpio`, `mdio-bitbang`, `mdio-dummy`, and so on. I'll need to also check the sysfs and netlink interfaces for any MDIO related entrypoints. This is my best bet for a software approach. |
| 16/2 | 2026/09/07 06:35 | tool | grepper |
0mError:no matches Args: {
"Expression": "mdio_bus_register"
}Results: {
"error": "no matches"
} |
| 17/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 12568 output: 19 thoughts: 12 Thoughts: Okay, here's my attempt at summarizing that thought process, tailored for an expert audience: **MDIObus Registration - Where to Start?** Alright, the task at hand is definitely related to MDIO bus registration. That's the starting point. I need to get a handle on how this system initializes and interacts with the MDIO bus. So, instead of randomly diving in, I need to know the entry points. Let's see... the most likely function name to start with, given my experience, is `mdiobus_register`. It’s usually a pretty reliable indicator. Let's start with a quick search for that. Depending on the results, I'll know whether this will involve some driver-specific implementation, bus layer manipulation, or overall board architecture. |
| 18/2 | 2026/09/07 06:35 | tool | grepper |
0mArgs:{
"Expression": "mdiobus_register"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 1138 lines.\nUse more precise expression if possible.\n\nDocumentation/driver-api/driver-model/devres.rst=349=MDIO\n--\nDocumentation/driver-api/driver-model/devres.rst-351- devm_mdiobus_alloc_size()\nDocumentation/driver-api/driver-model/devres.rst:352: devm_mdiobus_register()\nDocumentation/driver-api/driver-model/devres.rst:353: devm_of_mdiobus_register()\nDocumentation/driver-api/driver-model/devres.rst-354-\n--\nDocumentation/firmware-guide/acpi/dsd/motorcomm-yt8xxx-phy.rst=12=device (the same objects that are registered via\nDocumentation/firmware-guide/acpi/dsd/motorcomm-yt8xxx-phy.rst:13:``fwnode_mdiobus_register_phy()``). MAC-side connection properties such as\nDocumentation/firmware-guide/acpi/dsd/motorcomm-yt8xxx-phy.rst-14-``phy-handle`` and ``phy-mode`` are documented in [acpi-mdio-phy]_.\n--\nDocumentation/firmware-guide/acpi/dsd/phy.rst=7=The PHYs on an MDIO bus [phy] are probed and registered using\nDocumentation/firmware-guide/acpi/dsd/phy.rst:8:fwnode_mdiobus_register_phy().\nDocumentation/firmware-guide/acpi/dsd/phy.rst-9-\n--\nDocumentation/networking/phy.rst=40=registered as a distinct device.\n--\nDocumentation/networking/phy.rst-56- driver needs, setup the mii_bus structure, and register with the PAL using\nDocumentation/networking/phy.rst:57: mdiobus_register. Similarly, there's a remove function to undo all of\nDocumentation/networking/phy.rst-58- that (use mdiobus_unregister).\n--\narch/powerpc/platforms/82xx/ep8248e.c=109=static int ep8248e_mdio_probe(struct platform_device *ofdev)\n--\narch/powerpc/platforms/82xx/ep8248e.c-132-\narch/powerpc/platforms/82xx/ep8248e.c:133:\tret = of_mdiobus_register(bus, ofdev-\u003edev.of_node);\narch/powerpc/platforms/82xx/ep8248e.c-134-\tif (ret)\n--\narch/powerpc/platforms/pasemi/gpio_mdio.c=207=static int gpio_mdio_probe(struct platform_device *ofdev)\n--\narch/powerpc/platforms/pasemi/gpio_mdio.c-243-\narch/powerpc/platforms/pasemi/gpio_mdio.c:244:\terr = of_mdiobus_register(new_bus, np);\narch/powerpc/platforms/pasemi/gpio_mdio.c-245-\n--\ndrivers/net/dsa/bcm_sf2.c=607=static int bcm_sf2_mdio_register(struct dsa_switch *ds)\n--\ndrivers/net/dsa/bcm_sf2.c-683-\ndrivers/net/dsa/bcm_sf2.c:684:\terr = mdiobus_register(priv-\u003euser_mii_bus);\ndrivers/net/dsa/bcm_sf2.c-685-\tif (err)\n--\ndrivers/net/dsa/lantiq/lantiq_gswip_common.c=187=static int gswip_mdio(struct gswip_priv *priv)\n--\ndrivers/net/dsa/lantiq/lantiq_gswip_common.c-213-\ndrivers/net/dsa/lantiq/lantiq_gswip_common.c:214:\terr = devm_of_mdiobus_register(dev, bus, mdio_np);\ndrivers/net/dsa/lantiq/lantiq_gswip_common.c-215-\n--\ndrivers/net/dsa/microchip/ksz9477.c=321=static int ksz9477_pcs_create(struct ksz_device *dev)\n--\ndrivers/net/dsa/microchip/ksz9477.c-341-\ndrivers/net/dsa/microchip/ksz9477.c:342:\tret = devm_mdiobus_register(dev-\u003edev, bus);\ndrivers/net/dsa/microchip/ksz9477.c-343-\tif (ret)\n--\ndrivers/net/dsa/microchip/ksz_common.c=2321=int ksz_mdio_register(struct ksz_device *dev)\n--\ndrivers/net/dsa/microchip/ksz_common.c-2392-\ndrivers/net/dsa/microchip/ksz_common.c:2393:\tret = devm_of_mdiobus_register(ds-\u003edev, bus, mdio_np);\ndrivers/net/dsa/microchip/ksz_common.c-2394-\tif (ret) {\n--\ndrivers/net/dsa/microchip/lan937x_main.c=685=static int lan937x_mdio_register(struct ksz_device *dev)\n--\ndrivers/net/dsa/microchip/lan937x_main.c-755-\ndrivers/net/dsa/microchip/lan937x_main.c:756:\tret = devm_of_mdiobus_register(ds-\u003edev, bus, mdio_np);\ndrivers/net/dsa/microchip/lan937x_main.c-757-\tif (ret)\n--\ndrivers/net/dsa/motorcomm/chip.c=389=yt921x_mbus_int_init(struct yt921x_priv *priv, struct device_node *mnp)\n--\ndrivers/net/dsa/motorcomm/chip.c-406-\ndrivers/net/dsa/motorcomm/chip.c:407:\tres = devm_of_mdiobus_register(dev, mbus, mnp);\ndrivers/net/dsa/motorcomm/chip.c-408-\tif (res)\n--\ndrivers/net/dsa/motorcomm/chip.c=520=yt921x_mbus_ext_init(struct yt921x_priv *priv, struct device_node *mnp)\n--\ndrivers/net/dsa/motorcomm/chip.c-537-\ndrivers/net/dsa/motorcomm/chip.c:538:\tres = devm_of_mdiobus_register(dev, mbus, mnp);\ndrivers/net/dsa/motorcomm/chip.c-539-\tif (res)\n--\ndrivers/net/dsa/mt7530.c=2337=mt7530_setup_mdio(struct mt7530_priv *priv)\n--\ndrivers/net/dsa/mt7530.c-2372-\ndrivers/net/dsa/mt7530.c:2373:\tret = devm_of_mdiobus_register(dev, bus, mnp);\ndrivers/net/dsa/mt7530.c-2374-\tif (ret) {\n--\ndrivers/net/dsa/mt7628.c=242=static int mt7628_setup_internal_mdio(struct dsa_switch *ds)\n--\ndrivers/net/dsa/mt7628.c-261-\ndrivers/net/dsa/mt7628.c:262:\treturn devm_mdiobus_register(dev, bus);\ndrivers/net/dsa/mt7628.c-263-}\n--\ndrivers/net/dsa/mv88e6xxx/chip.c=3834=static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,\n--\ndrivers/net/dsa/mv88e6xxx/chip.c-3887-\ndrivers/net/dsa/mv88e6xxx/chip.c:3888:\terr = of_mdiobus_register(bus, np);\ndrivers/net/dsa/mv88e6xxx/chip.c-3889-\tif (err) {\n--\ndrivers/net/dsa/mxl862xx/mxl862xx.c=267=static int mxl862xx_setup_mdio(struct dsa_switch *ds)\n--\ndrivers/net/dsa/mxl862xx/mxl862xx.c-292-\ndrivers/net/dsa/mxl862xx/mxl862xx.c:293:\tret = devm_of_mdiobus_register(dev, bus, mdio_np);\ndrivers/net/dsa/mxl862xx/mxl862xx.c-294-\tof_node_put(mdio_np);\n--\ndrivers/net/dsa/netc/netc_main.c=149=static int netc_port_create_emdio_bus(struct netc_port *np,\n--\ndrivers/net/dsa/netc/netc_main.c-179-\ndrivers/net/dsa/netc/netc_main.c:180:\terr = devm_of_mdiobus_register(dev, bus, node);\ndrivers/net/dsa/netc/netc_main.c-181-\tif (err)\n--\ndrivers/net/dsa/ocelot/felix_vsc9959.c=957=static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)\n--\ndrivers/net/dsa/ocelot/felix_vsc9959.c-1013-\t/* Needed in order to initialize the bus mutex lock */\ndrivers/net/dsa/ocelot/felix_vsc9959.c:1014:\trc = mdiobus_register(bus);\ndrivers/net/dsa/ocelot/felix_vsc9959.c-1015-\tif (rc \u003c 0) {\n--\ndrivers/net/dsa/ocelot/seville_vsc9953.c=878=static int vsc9953_mdio_bus_alloc(struct ocelot *ocelot)\n--\ndrivers/net/dsa/ocelot/seville_vsc9953.c-903-\t/* Needed in order to initialize the bus mutex lock */\ndrivers/net/dsa/ocelot/seville_vsc9953.c:904:\trc = devm_of_mdiobus_register(dev, bus, NULL);\ndrivers/net/dsa/ocelot/seville_vsc9953.c-905-\tif (rc \u003c 0) {\n--\ndrivers/net/dsa/qca/ar9331.c=357=static int ar9331_sw_mbus_init(struct ar9331_sw_priv *priv)\n--\ndrivers/net/dsa/qca/ar9331.c-381-\ndrivers/net/dsa/qca/ar9331.c:382:\tret = devm_of_mdiobus_register(dev, mbus, mnp);\ndrivers/net/dsa/qca/ar9331.c-383-\tof_node_put(mnp);\n--\ndrivers/net/dsa/qca/qca8k-8xxx.c=947=qca8k_mdio_register(struct qca8k_priv *priv)\n--\ndrivers/net/dsa/qca/qca8k-8xxx.c-986-\ndrivers/net/dsa/qca/qca8k-8xxx.c:987:\tret = devm_of_mdiobus_register(dev, bus, mdio);\ndrivers/net/dsa/qca/qca8k-8xxx.c-988-\n--\ndrivers/net/dsa/realtek/rtl83xx.c=75=int rtl83xx_setup_user_mdio(struct dsa_switch *ds)\n--\ndrivers/net/dsa/realtek/rtl83xx.c-100-\ndrivers/net/dsa/realtek/rtl83xx.c:101:\tret = devm_of_mdiobus_register(priv-\u003edev, bus, mdio_np);\ndrivers/net/dsa/realtek/rtl83xx.c-102-\tif (ret) {\n--\ndrivers/net/dsa/rzn1_a5psw.c=1117=static int a5psw_probe_mdio(struct a5psw *a5psw, struct device_node *node)\n--\ndrivers/net/dsa/rzn1_a5psw.c-1143-\ndrivers/net/dsa/rzn1_a5psw.c:1144:\treturn devm_of_mdiobus_register(dev, bus, node);\ndrivers/net/dsa/rzn1_a5psw.c-1145-}\n--\ndrivers/net/dsa/sja1105/sja1105.h=307=void sja1105_frame_memory_partitioning(struct sja1105_private *priv);\n--\ndrivers/net/dsa/sja1105/sja1105.h-309-/* From sja1105_mdio.c */\ndrivers/net/dsa/sja1105/sja1105.h:310:int sja1105_mdiobus_register(struct dsa_switch *ds);\ndrivers/net/dsa/sja1105/sja1105.h-311-void sja1105_mdiobus_unregister(struct dsa_switch *ds);\n--\ndrivers/net/dsa/sja1105/sja1105_main.c=3026=static int sja1105_setup(struct dsa_switch *ds)\n--\ndrivers/net/dsa/sja1105/sja1105_main.c-3067-\ndrivers/net/dsa/sja1105/sja1105_main.c:3068:\trc = sja1105_mdiobus_register(ds);\ndrivers/net/dsa/sja1105/sja1105_main.c-3069-\tif (rc \u003c 0) {\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c=258=static int sja1105_mdiobus_base_tx_register(struct sja1105_private *priv,\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c-287-\ndrivers/net/dsa/sja1105/sja1105_mdio.c:288:\trc = of_mdiobus_register(bus, np);\ndrivers/net/dsa/sja1105/sja1105_mdio.c-289-\tif (rc) {\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c=312=static int sja1105_mdiobus_base_t1_register(struct sja1105_private *priv,\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c-343-\ndrivers/net/dsa/sja1105/sja1105_mdio.c:344:\trc = of_mdiobus_register(bus, np);\ndrivers/net/dsa/sja1105/sja1105_mdio.c-345-\tif (rc) {\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c=368=static int sja1105_mdiobus_pcs_register(struct sja1105_private *priv)\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c-395-\ndrivers/net/dsa/sja1105/sja1105_mdio.c:396:\trc = mdiobus_register(bus);\ndrivers/net/dsa/sja1105/sja1105_mdio.c-397-\tif (rc) {\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c=439=static void sja1105_mdiobus_pcs_unregister(struct sja1105_private *priv)\n--\ndrivers/net/dsa/sja1105/sja1105_mdio.c-458-\ndrivers/net/dsa/sja1105/sja1105_mdio.c:459:int sja1105_mdiobus_register(struct dsa_switch *ds)\ndrivers/net/dsa/sja1105/sja1105_mdio.c-460-{\n--\ndrivers/net/ethernet/8390/ax88796.c=459=static int ax_mii_init(struct net_device *dev)\n--\ndrivers/net/ethernet/8390/ax88796.c-478-\ndrivers/net/ethernet/8390/ax88796.c:479:\terr = mdiobus_register(ax-\u003emii_bus);\ndrivers/net/ethernet/8390/ax88796.c-480-\tif (err)\n--\ndrivers/net/ethernet/actions/owl-emac.c=1321=static int owl_emac_mdio_init(struct net_device *netdev)\n--\ndrivers/net/ethernet/actions/owl-emac.c-1345-\ndrivers/net/ethernet/actions/owl-emac.c:1346:\tret = devm_of_mdiobus_register(dev, priv-\u003emii, mdio_node);\ndrivers/net/ethernet/actions/owl-emac.c-1347-\n--\ndrivers/net/ethernet/adi/adin1110.c=509=static int adin1110_register_mdiobus(struct adin1110_priv *priv,\n--\ndrivers/net/ethernet/adi/adin1110.c-529-\ndrivers/net/ethernet/adi/adin1110.c:530:\tret = devm_mdiobus_register(dev, mii_bus);\ndrivers/net/ethernet/adi/adin1110.c-531-\tif (ret)\n--\ndrivers/net/ethernet/adi/adin1140.c=617=static int adin1140_mdio_register(struct adin1140_priv *priv,\n--\ndrivers/net/ethernet/adi/adin1140.c-636-\ndrivers/net/ethernet/adi/adin1140.c:637:\treturn devm_mdiobus_register(\u0026spidev-\u003edev, priv-\u003emdiobus);\ndrivers/net/ethernet/adi/adin1140.c-638-}\n--\ndrivers/net/ethernet/aeroflex/greth.c=1290=static int greth_mdio_init(struct greth_private *greth)\n--\ndrivers/net/ethernet/aeroflex/greth.c-1306-\ndrivers/net/ethernet/aeroflex/greth.c:1307:\tret = mdiobus_register(greth-\u003emdio);\ndrivers/net/ethernet/aeroflex/greth.c-1308-\tif (ret) {\n--\ndrivers/net/ethernet/agere/et131x.c=3931=static int et131x_pci_setup(struct pci_dev *pdev,\n--\ndrivers/net/ethernet/agere/et131x.c-4026-\ndrivers/net/ethernet/agere/et131x.c:4027:\trc = mdiobus_register(adapter-\u003emii_bus);\ndrivers/net/ethernet/agere/et131x.c-4028-\tif (rc \u003c 0) {\n--\ndrivers/net/ethernet/altera/altera_tse_main.c=121=static int altera_tse_mdio_create(struct net_device *dev, unsigned int id)\n--\ndrivers/net/ethernet/altera/altera_tse_main.c-157-\ndrivers/net/ethernet/altera/altera_tse_main.c:158:\tret = of_mdiobus_register(mdio, mdio_node);\ndrivers/net/ethernet/altera/altera_tse_main.c-159-\tif (ret != 0) {\n--\ndrivers/net/ethernet/amd/au1000_eth.c=1061=static int au1000_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/amd/au1000_eth.c-1221-\ndrivers/net/ethernet/amd/au1000_eth.c:1222:\terr = mdiobus_register(aup-\u003emii_bus);\ndrivers/net/ethernet/amd/au1000_eth.c-1223-\tif (err) {\n--\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c=3428=static int xgbe_phy_init(struct xgbe_prv_data *pdata)\n--\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c-3717-\tsnprintf(mii-\u003eid, sizeof(mii-\u003eid), \"%s\", dev_name(pdata-\u003edev));\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c:3718:\tret = mdiobus_register(mii);\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c-3719-\tif (ret) {\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c:3720:\t\tdev_err(pdata-\u003edev, \"mdiobus_register failed\\n\");\ndrivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c-3721-\t\treturn ret;\n--\ndrivers/net/ethernet/apm/xgene-v2/mdio.c=98=int xge_mdio_config(struct net_device *ndev)\n--\ndrivers/net/ethernet/apm/xgene-v2/mdio.c-118-\tmdio_bus-\u003ephy_mask = 0x1;\ndrivers/net/ethernet/apm/xgene-v2/mdio.c:119:\tret = mdiobus_register(mdio_bus);\ndrivers/net/ethernet/apm/xgene-v2/mdio.c-120-\tif (ret)\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c=837=int xgene_enet_phy_connect(struct net_device *ndev)\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-887-\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c:888:static int xgene_mdiobus_register(struct xgene_enet_pdata *pdata,\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-889-\t\t\t\t struct mii_bus *mdio)\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-912-\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c:913:\t\tret = of_mdiobus_register(mdio, mdio_np);\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-914-\t\tof_node_put(mdio_np);\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-921-\t/* Register the MDIO bus */\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c:922:\tret = mdiobus_register(mdio);\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-923-\tif (ret)\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c=939=int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata)\n--\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-957-\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c:958:\tret = xgene_mdiobus_register(pdata, mdio_bus);\ndrivers/net/ethernet/apm/xgene/xgene_enet_hw.c-959-\tif (ret) {\n--\ndrivers/net/ethernet/arc/emac_mdio.c=131=int arc_mdio_probe(struct arc_emac_priv *priv)\n--\ndrivers/net/ethernet/arc/emac_mdio.c-172-\ndrivers/net/ethernet/arc/emac_mdio.c:173:\terror = of_mdiobus_register(bus, mdio_node);\ndrivers/net/ethernet/arc/emac_mdio.c-174-\tof_node_put(mdio_node);\n--\ndrivers/net/ethernet/asix/ax88796c_main.c=966=static int ax88796c_probe(struct spi_device *spi)\n--\ndrivers/net/ethernet/asix/ax88796c_main.c-1010-\ndrivers/net/ethernet/asix/ax88796c_main.c:1011:\tret = devm_mdiobus_register(\u0026spi-\u003edev, ax_local-\u003emdiobus);\ndrivers/net/ethernet/asix/ax88796c_main.c-1012-\tif (ret \u003c 0) {\n--\ndrivers/net/ethernet/atheros/ag71xx.c=687=static int ag71xx_mdio_probe(struct ag71xx *ag)\n--\ndrivers/net/ethernet/atheros/ag71xx.c-727-\tmnp = of_get_child_by_name(np, \"mdio\");\ndrivers/net/ethernet/atheros/ag71xx.c:728:\terr = devm_of_mdiobus_register(dev, mii_bus, mnp);\ndrivers/net/ethernet/atheros/ag71xx.c-729-\tof_node_put(mnp);\n--\ndrivers/net/ethernet/broadcom/b44.c=2234=static int b44_register_phy_one(struct b44 *bp)\n--\ndrivers/net/ethernet/broadcom/b44.c-2259-\ndrivers/net/ethernet/broadcom/b44.c:2260:\terr = mdiobus_register(mii_bus);\ndrivers/net/ethernet/broadcom/b44.c-2261-\tif (err) {\n--\ndrivers/net/ethernet/broadcom/bcm63xx_enet.c=1713=static int bcm_enet_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/broadcom/bcm63xx_enet.c-1829-\ndrivers/net/ethernet/broadcom/bcm63xx_enet.c:1830:\t\tret = mdiobus_register(bus);\ndrivers/net/ethernet/broadcom/bcm63xx_enet.c-1831-\t\tif (ret) {\n--\ndrivers/net/ethernet/broadcom/bgmac-bcma-mdio.c=211=struct mii_bus *bcma_mdio_mii_register(struct bgmac *bgmac)\n--\ndrivers/net/ethernet/broadcom/bgmac-bcma-mdio.c-235-\ndrivers/net/ethernet/broadcom/bgmac-bcma-mdio.c:236:\terr = of_mdiobus_register(mii_bus, np);\ndrivers/net/ethernet/broadcom/bgmac-bcma-mdio.c-237-\tof_node_put(np);\n--\ndrivers/net/ethernet/broadcom/genet/bcmmii.c=193=int bcmgenet_mii_config(struct net_device *dev, bool init)\n--\ndrivers/net/ethernet/broadcom/genet/bcmmii.c-233-\t\tphy_name = \"external RvMII\";\ndrivers/net/ethernet/broadcom/genet/bcmmii.c:234:\t\t/* of_mdiobus_register took care of reading the 'max-speed'\ndrivers/net/ethernet/broadcom/genet/bcmmii.c-235-\t\t * PHY property for us, effectively limiting the PHY supported\n--\ndrivers/net/ethernet/broadcom/sb1250-mac.c=2157=static int sbmac_init(struct platform_device *pldev, long long base)\n--\ndrivers/net/ethernet/broadcom/sb1250-mac.c-2227-\t */\ndrivers/net/ethernet/broadcom/sb1250-mac.c:2228:\terr = mdiobus_register(sc-\u003emii_bus);\ndrivers/net/ethernet/broadcom/sb1250-mac.c-2229-\tif (err) {\n--\ndrivers/net/ethernet/broadcom/tg3.c=1505=static int tg3_mdio_init(struct tg3 *tp)\n--\ndrivers/net/ethernet/broadcom/tg3.c-1557-\ndrivers/net/ethernet/broadcom/tg3.c:1558:\ti = mdiobus_register(tp-\u003emdio_bus);\ndrivers/net/ethernet/broadcom/tg3.c-1559-\tif (i) {\n--\ndrivers/net/ethernet/cadence/macb_main.c=1023=static int macb_mii_probe(struct net_device *netdev)\n--\ndrivers/net/ethernet/cadence/macb_main.c-1096-\ndrivers/net/ethernet/cadence/macb_main.c:1097:static int macb_mdiobus_register(struct macb *bp, struct device_node *mdio_np)\ndrivers/net/ethernet/cadence/macb_main.c-1098-{\n--\ndrivers/net/ethernet/cadence/macb_main.c-1104-\tif (mdio_np)\ndrivers/net/ethernet/cadence/macb_main.c:1105:\t\treturn of_mdiobus_register(bp-\u003emii_bus, mdio_np);\ndrivers/net/ethernet/cadence/macb_main.c-1106-\n--\ndrivers/net/ethernet/cadence/macb_main.c-1118-\ndrivers/net/ethernet/cadence/macb_main.c:1119:\t\t\treturn of_mdiobus_register(bp-\u003emii_bus, np);\ndrivers/net/ethernet/cadence/macb_main.c-1120-\t\t}\ndrivers/net/ethernet/cadence/macb_main.c-1121-\ndrivers/net/ethernet/cadence/macb_main.c:1122:\treturn mdiobus_register(bp-\u003emii_bus);\ndrivers/net/ethernet/cadence/macb_main.c-1123-}\n--\ndrivers/net/ethernet/cadence/macb_main.c=1125=static int macb_mii_init(struct macb *bp)\n--\ndrivers/net/ethernet/cadence/macb_main.c-1158-\ndrivers/net/ethernet/cadence/macb_main.c:1159:\terr = macb_mdiobus_register(bp, mdio_np);\ndrivers/net/ethernet/cadence/macb_main.c-1160-\tif (err)\n--\ndrivers/net/ethernet/davicom/dm9051.c=1107=static int dm9051_mdio_register(struct board_info *db)\n--\ndrivers/net/ethernet/davicom/dm9051.c-1124-\ndrivers/net/ethernet/davicom/dm9051.c:1125:\tret = devm_mdiobus_register(\u0026spi-\u003edev, db-\u003emdiobus);\ndrivers/net/ethernet/davicom/dm9051.c-1126-\tif (ret)\n--\ndrivers/net/ethernet/engleder/tsnep_main.c=2423=static int tsnep_mdio_init(struct tsnep_adapter *adapter)\n--\ndrivers/net/ethernet/engleder/tsnep_main.c-2454-\ndrivers/net/ethernet/engleder/tsnep_main.c:2455:\tretval = of_mdiobus_register(adapter-\u003emdiobus, np);\ndrivers/net/ethernet/engleder/tsnep_main.c-2456-\n--\ndrivers/net/ethernet/ethoc.c=1024=static int ethoc_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/ethoc.c-1207-\ndrivers/net/ethernet/ethoc.c:1208:\tret = mdiobus_register(priv-\u003emdio);\ndrivers/net/ethernet/ethoc.c-1209-\tif (ret) {\n--\ndrivers/net/ethernet/faraday/ftgmac100.c=1734=static int ftgmac100_setup_mdio(struct net_device *netdev)\n--\ndrivers/net/ethernet/faraday/ftgmac100.c-1769-\ndrivers/net/ethernet/faraday/ftgmac100.c:1770:\terr = devm_of_mdiobus_register(priv-\u003edev, priv-\u003emii_bus, mdio_np);\ndrivers/net/ethernet/faraday/ftgmac100.c-1771-\tof_node_put(mdio_np);\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c=36=static int enetc_pci_mdio_probe(struct pci_dev *pdev,\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c-90-\ndrivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c:91:\terr = of_mdiobus_register(bus, dev-\u003eof_node);\ndrivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c-92-\tif (err)\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c=266=static int enetc_mdio_probe(struct enetc_pf *pf, struct device_node *np)\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c-292-\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c:293:\terr = of_mdiobus_register(bus, np);\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c-294-\tif (err)\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c=308=static int enetc_imdio_create(struct enetc_pf *pf)\n--\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c-342-\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c:343:\terr = mdiobus_register(bus);\ndrivers/net/ethernet/freescale/enetc/enetc_pf_common.c-344-\tif (err) {\n--\ndrivers/net/ethernet/freescale/fec_main.c=3042=static int fec_enet_mii_init(struct platform_device *pdev)\n--\ndrivers/net/ethernet/freescale/fec_main.c-3160-\ndrivers/net/ethernet/freescale/fec_main.c:3161:\terr = of_mdiobus_register(fep-\u003emii_bus, node);\ndrivers/net/ethernet/freescale/fec_main.c-3162-\tif (err)\n--\ndrivers/net/ethernet/freescale/fec_mpc52xx_phy.c=65=static int mpc52xx_fec_mdio_probe(struct platform_device *of)\n--\ndrivers/net/ethernet/freescale/fec_mpc52xx_phy.c-105-\ndrivers/net/ethernet/freescale/fec_mpc52xx_phy.c:106:\terr = of_mdiobus_register(bus, np);\ndrivers/net/ethernet/freescale/fec_mpc52xx_phy.c-107-\tif (err)\n--\ndrivers/net/ethernet/freescale/fs_enet/mii-bitbang.c=149=static int fs_enet_mdio_probe(struct platform_device *ofdev)\n--\ndrivers/net/ethernet/freescale/fs_enet/mii-bitbang.c-175-\ndrivers/net/ethernet/freescale/fs_enet/mii-bitbang.c:176:\tret = of_mdiobus_register(new_bus, ofdev-\u003edev.of_node);\ndrivers/net/ethernet/freescale/fs_enet/mii-bitbang.c-177-\tif (ret)\n--\ndrivers/net/ethernet/freescale/fs_enet/mii-fec.c=97=static int fs_enet_mdio_probe(struct platform_device *ofdev)\n--\ndrivers/net/ethernet/freescale/fs_enet/mii-fec.c-166-\ndrivers/net/ethernet/freescale/fs_enet/mii-fec.c:167:\tret = of_mdiobus_register(new_bus, ofdev-\u003edev.of_node);\ndrivers/net/ethernet/freescale/fs_enet/mii-fec.c-168-\tif (ret)\n--\ndrivers/net/ethernet/freescale/fsl_pq_mdio.c=409=static int fsl_pq_mdio_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/freescale/fsl_pq_mdio.c-493-\ndrivers/net/ethernet/freescale/fsl_pq_mdio.c:494:\terr = of_mdiobus_register(new_bus, np);\ndrivers/net/ethernet/freescale/fsl_pq_mdio.c-495-\tif (err) {\n--\ndrivers/net/ethernet/freescale/xgmac_mdio.c=371=static int xgmac_mdio_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/freescale/xgmac_mdio.c-426-\tif (is_of_node(fwnode))\ndrivers/net/ethernet/freescale/xgmac_mdio.c:427:\t\tret = of_mdiobus_register(bus, to_of_node(fwnode));\ndrivers/net/ethernet/freescale/xgmac_mdio.c-428-\telse if (is_acpi_node(fwnode))\ndrivers/net/ethernet/freescale/xgmac_mdio.c:429:\t\tret = acpi_mdiobus_register(bus, fwnode);\ndrivers/net/ethernet/freescale/xgmac_mdio.c-430-\telse\n--\ndrivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.c=266=int hbg_mdio_init(struct hbg_priv *priv)\n--\ndrivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.c-291-\ndrivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.c:292:\tret = devm_mdiobus_register(dev, mdio_bus);\ndrivers/net/ethernet/hisilicon/hibmcge/hbg_mdio.c-293-\tif (ret)\n--\ndrivers/net/ethernet/hisilicon/hix5hd2_gmac.c=1094=static int hix5hd2_dev_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/hisilicon/hix5hd2_gmac.c-1185-\ndrivers/net/ethernet/hisilicon/hix5hd2_gmac.c:1186:\tret = of_mdiobus_register(bus, node);\ndrivers/net/ethernet/hisilicon/hix5hd2_gmac.c-1187-\tif (ret)\n--\ndrivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c=123=int hclge_mac_mdio_config(struct hclge_dev *hdev)\n--\ndrivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c-154-\tmdio_bus-\u003ephy_mask = ~(1U \u003c\u003c mac-\u003ephy_addr);\ndrivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c:155:\tret = mdiobus_register(mdio_bus);\ndrivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c-156-\tif (ret) {\n--\ndrivers/net/ethernet/hisilicon/hns_mdio.c=495=static int hns_mdio_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/hisilicon/hns_mdio.c-583-\ndrivers/net/ethernet/hisilicon/hns_mdio.c:584:\t\tret = of_mdiobus_register(new_bus, pdev-\u003edev.of_node);\ndrivers/net/ethernet/hisilicon/hns_mdio.c-585-\t} else if (is_acpi_node(pdev-\u003edev.fwnode)) {\n--\ndrivers/net/ethernet/hisilicon/hns_mdio.c-592-\t\t/* Register the MDIO bus */\ndrivers/net/ethernet/hisilicon/hns_mdio.c:593:\t\tret = mdiobus_register(new_bus);\ndrivers/net/ethernet/hisilicon/hns_mdio.c-594-\t} else {\n--\ndrivers/net/ethernet/ibm/emac/core.c=2560=static int emac_dt_mdio_probe(struct emac_instance *dev)\n--\ndrivers/net/ethernet/ibm/emac/core.c-2584-\tsnprintf(bus-\u003eid, MII_BUS_ID_SIZE, \"%s\", dev-\u003eofdev-\u003ename);\ndrivers/net/ethernet/ibm/emac/core.c:2585:\tres = devm_of_mdiobus_register(\u0026dev-\u003eofdev-\u003edev, bus, mii_np);\ndrivers/net/ethernet/ibm/emac/core.c-2586-\tif (res) {\n--\ndrivers/net/ethernet/intel/ixgbe/ixgbe_phy.c=1026=int ixgbe_mii_bus_init(struct ixgbe_hw *hw)\n--\ndrivers/net/ethernet/intel/ixgbe/ixgbe_phy.c-1088-\tadapter-\u003emii_bus = bus;\ndrivers/net/ethernet/intel/ixgbe/ixgbe_phy.c:1089:\treturn mdiobus_register(bus);\ndrivers/net/ethernet/intel/ixgbe/ixgbe_phy.c-1090-}\n--\ndrivers/net/ethernet/lantiq_etop.c=385=ltq_etop_mdio_init(struct net_device *dev)\n--\ndrivers/net/ethernet/lantiq_etop.c-402-\t\t priv-\u003epdev-\u003ename, priv-\u003epdev-\u003eid);\ndrivers/net/ethernet/lantiq_etop.c:403:\tif (mdiobus_register(priv-\u003emii_bus)) {\ndrivers/net/ethernet/lantiq_etop.c-404-\t\terr = -ENXIO;\n--\ndrivers/net/ethernet/marvell/mvmdio.c=283=static int orion_mdio_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/marvell/mvmdio.c-381-\t/* For the platforms not supporting DT/ACPI fall-back\ndrivers/net/ethernet/marvell/mvmdio.c:382:\t * to mdiobus_register via of_mdiobus_register.\ndrivers/net/ethernet/marvell/mvmdio.c-383-\t */\ndrivers/net/ethernet/marvell/mvmdio.c-384-\tif (is_acpi_node(pdev-\u003edev.fwnode))\ndrivers/net/ethernet/marvell/mvmdio.c:385:\t\tret = acpi_mdiobus_register(bus, pdev-\u003edev.fwnode);\ndrivers/net/ethernet/marvell/mvmdio.c-386-\telse\ndrivers/net/ethernet/marvell/mvmdio.c:387:\t\tret = of_mdiobus_register(bus, pdev-\u003edev.of_node);\ndrivers/net/ethernet/marvell/mvmdio.c-388-\tif (ret \u003c 0) {\n--\ndrivers/net/ethernet/marvell/pxa168_eth.c=1387=static int pxa168_eth_probe(struct platform_device *pdev)\n--\ndrivers/net/ethernet/marvell/pxa168_eth.c-1504-\tpep-\u003esmi_bus-\u003ephy_mask = 0xffffffff;\ndrivers/net/ethernet/marvell/pxa168_eth.c:1505:\terr = mdiobus_register(pep-\u003esmi_bus);\ndrivers/net/ethernet/marvell/pxa168_eth.c-1506-\tif (err)\n--\ndrivers/net/ethernet/mediatek/mtk_eth_soc.c=998=static int mtk_mdio_init(struct mtk_eth *eth)\n--\ndrivers/net/ethernet/mediatek/mtk_eth_soc.c-1037-\tdev_dbg(eth-\u003edev, \"MDC is running on %d Hz\\n\", MDC_MAX_FREQ / eth-\u003emdc_divider);\ndrivers/net/ethernet/mediatek/mtk_eth_soc.c:1038:\tret = of_mdiobus_register(eth-\u003emii_bus, mii_np);\ndrivers/net/ethernet/mediatek/mtk_eth_soc.c-1039-\n--\ndrivers/net/ethernet/mediatek/mtk_star_emac.c=1422=static int mtk_star_mdio_init(struct net_device *ndev)\n--\ndrivers/net/ethernet/mediatek/mtk_star_emac.c-1447-\ndrivers/net/ethernet/mediatek/mtk_star_emac.c:1448:\tret = devm_of_mdiobus_register(dev, priv-\u003emii, mdio_node);\ndrivers/net/ethernet/mediatek/mtk_star_emac.c-1449-\n--\ndrivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c=287=int mlxbf_gige_mdio_probe(struct platform_device *pdev, struct mlxbf_gige *priv)\n--\ndrivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c-332-\ndrivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c:333:\tret = mdiobus_register(priv-\u003emdiobus);\ndrivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_mdio.c-334-\tif (ret)\n--\ndrivers/net/ethernet/meta/fbnic/fbnic_mdio.c=253=int fbnic_mdiobus_create(struct fbnic_dev *fbd)\n--\ndrivers/net/ethernet/meta/fbnic/fbnic_mdio.c-272-\n\n"
} |
| 19/2 | 2026/09/07 06:35 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 25626 output: 19 thoughts: 305 Thoughts: **My Assessment of the Airoha EN8811H PHY Driver and Emulation Possibilities** Okay, here's what I'm thinking. I'm looking at `drivers/net/phy/air_en8811h.c`, the driver for that Airoha EN8811H and AN8811HB Ethernet PHY transceiver. Airoha, right? Often seen on MediaTek/Airoha router boards or dedicated networking equipment. My immediate question is, is there any standard virtualization support, like in QEMU or with a USB interface, for that specific chip? The answer is probably no. These virtualized environments, typically they'll rely on something like e1000, virtio-net, or rtl8139 network interfaces. Or, perhaps a USB Ethernet dongle using something like ax88179_178a or cdc_ether. The thing is, even *if* there's an MDIO bus available in the emulated NIC, that `EN8811H_PHY_ID` or `AN8811HB_PHY_ID` - that's hardware-specific. A direct emulation is likely out of the question. So, the next question is if there are any *workarounds* for getting the driver loaded or probed within QEMU. Can I, for example, leverage syzkaller to create some sort of mock MDIO or PHY device from userspace? Time to investigate the possibility of userspace MDIO or PHY device creation interfaces. I'll need to research, see if there are standard methods like netlink, sysfs, or maybe some ioctl calls that could be leveraged. |
| 20/2 | 2026/09/07 06:36 | tool | grepper |
0mArgs:{
"Expression": "phy_device_create"
}Results: {
"Output": "drivers/net/mdio/fwnode_mdio.c=117=int fwnode_mdiobus_register_phy(struct mii_bus *bus,\n--\ndrivers/net/mdio/fwnode_mdio.c-134-\telse\ndrivers/net/mdio/fwnode_mdio.c:135:\t\tphy = phy_device_create(bus, addr, phy_id, 0, NULL);\ndrivers/net/mdio/fwnode_mdio.c-136-\tif (IS_ERR(phy)) {\n--\ndrivers/net/phy/nxp-tja11xx.c=551=static void tja1102_p1_register(struct work_struct *work)\n--\ndrivers/net/phy/nxp-tja11xx.c-585-\t\t/* Real PHY ID of Port 1 is 0 */\ndrivers/net/phy/nxp-tja11xx.c:586:\t\tphy = phy_device_create(bus, addr, PHY_ID_TJA1102, false, NULL);\ndrivers/net/phy/nxp-tja11xx.c-587-\t\tif (IS_ERR(phy)) {\n--\ndrivers/net/phy/nxp-tja11xx.c-592-\ndrivers/net/phy/nxp-tja11xx.c:593:\t\t/* Overwrite parent device. phy_device_create() set parent to\ndrivers/net/phy/nxp-tja11xx.c-594-\t\t * the mii_bus-\u003edev, which is not correct in case.\n--\ndrivers/net/phy/phy_device.c=728=static int phy_request_driver_module(struct phy_device *dev, u32 phy_id)\n--\ndrivers/net/phy/phy_device.c-747-\ndrivers/net/phy/phy_device.c:748:struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id,\ndrivers/net/phy/phy_device.c-749-\t\t\t\t bool is_c45,\n--\ndrivers/net/phy/phy_device.c-839-}\ndrivers/net/phy/phy_device.c:840:EXPORT_SYMBOL(phy_device_create);\ndrivers/net/phy/phy_device.c-841-\n--\ndrivers/net/phy/phy_device.c=1071=struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)\n--\ndrivers/net/phy/phy_device.c-1096-\t\tif (!r)\ndrivers/net/phy/phy_device.c:1097:\t\t\treturn phy_device_create(bus, addr, phy_id,\ndrivers/net/phy/phy_device.c-1098-\t\t\t\t\t\t true, \u0026c45_ids);\n--\ndrivers/net/phy/phy_device.c-1100-\ndrivers/net/phy/phy_device.c:1101:\treturn phy_device_create(bus, addr, phy_id, is_c45, \u0026c45_ids);\ndrivers/net/phy/phy_device.c-1102-}\n--\ninclude/linux/phy.h=2167=int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum,\n--\ninclude/linux/phy.h-2169-\ninclude/linux/phy.h:2170:struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id,\ninclude/linux/phy.h-2171-\t\t\t\t bool is_c45,\n"
} |
| 21/2 | 2026/09/07 06:36 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 27274 output: 123 thoughts: 547 Thoughts: **My Assessment: Structurally Unreachable Code, Not Worth Fuzzing** Okay, let's break this down systematically. My initial thought is to investigate how this code path is triggered. The MDIO bus seems like a key starting point. I know these buses are typically registered by Ethernet MAC drivers when they detect connected PHYs via physical MDIO lines. Specifically, I'm looking at the `air_en8811h.c` driver. This driver has logic that relies on a specific PHY ID read from a hardware transceiver, in this case, the Airoha EN8811H. Now, considering the environment, standard fuzzing setups like QEMU or Google Compute Engine (GCE) VMs on amd64 don't provide this hardware or an accurate emulation of it. The Airoha EN8811H is, in essence, absent. I'll consult Section 2 of the triage guide. It explicitly calls out "Structurally unreachable hardware," mentioning vendor-specific PCIe switches, SmartNICs, GPU drivers (like mlxsw, pds_core, etc.), that rely on physical ASIC/PCIe cards that are not emulated in standard QEMU. That is my understanding of this patch and the relevant driver, right now. The guide emphasizes that reachability is the primary gate. I can only fuzz code that *can* actually execute within the standard virtualized environments. If the code is structurally unreachable, as described in Section 2, it should *not* be fuzzed, regardless of complexity or added assertions. Let's do a quick double-check. The patch itself is adding support for the package variant detection in `an8811hb_probe` and uses the `AN8811HB_HWTRAP2` register to adjust LED GPIO setup during probe and config initialization. Now the question remains: is `air_en8811h.c` reachable? The answer is no. It depends on the presence of the Airoha EN8811H hardware or a physical MDIO bus connected to it, which is not present or emulated in the typical QEMU/GCE environments. Therefore, my conclusion is that this falls under the "structurally unreachable hardware" category. `WorthFuzzing` should be set to `false`. Let's make sure our results reflect this: * `FocusSymbols: []` * `EnableConfigs: []` * `WorthFuzzing: false` * `Reasoning: Concise explanation of the verdict.` And now I'm ready to call `set-results`. |
| 22/2 | 2026/09/07 06:36 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Airoha EN8811H / AN8811HB Ethernet PHY driver (drivers/net/phy/air_en8811h.c) to handle package variant detection and LED GPIO configuration. This code requires dedicated physical Airoha PHY hardware on an MDIO bus and cannot be instantiated or executed in standard virtualized fuzzing environments (QEMU/GCE), making it structurally unreachable.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Airoha EN8811H / AN8811HB Ethernet PHY driver (drivers/net/phy/air_en8811h.c) to handle package variant detection and LED GPIO configuration. This code requires dedicated physical Airoha PHY hardware on an MDIO bus and cannot be instantiated or executed in standard virtualized fuzzing environments (QEMU/GCE), making it structurally unreachable.",
"WorthFuzzing": false
} |
| 23/1 | 2026/09/07 06:36 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|