Thread (8 messages) 8 messages, 3 authors, 2026-03-20
STALE115d

[PATCH next v1] r8169: Fix PHY lookup for mdiobus_get_phy() and improve error reporting during probe

From: Anand Moon <hidden>
Date: 2026-03-17 06:17:12
Also in: lkml
Subsystem: 8169 10/100/1000 gigabit ethernet driver, networking drivers, the rest · Maintainers: Heiner Kallweit, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

The driver currently assumes the PHY is always at address 0. On some
hardware or buggy BIOS implementations, the PHY may reside at a
different address on the MDIO bus. Update r8169_mdio_register()
to scan the bus for the first available PHY instead of hardcoding
address 0.

Additionally, switch to dev_err_probe() in the main probe path to
provide standardized error handling and cleaner log output for
registration failures.

Link: https://lore.kernel.org/all/87bc37ee-234c-4568-b72e-955c130a6838@arm.com/ (local)
Fixes: ec392abc9593 ("PCI: dw-rockchip: Enable async probe by default")
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Anand Moon <redacted>
---
 drivers/net/ethernet/realtek/r8169_main.c | 34 ++++++++++++++++-------
 1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 791277e750ba..0fd735beff92 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -5427,7 +5427,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
 {
 	struct pci_dev *pdev = tp->pci_dev;
 	struct mii_bus *new_bus;
-	int ret;
+	struct phy_device *phydev;
+	int ret, addr;
 
 	/* On some boards with this chip version the BIOS is buggy and misses
 	 * to reset the PHY page selector. This results in the PHY ID read
@@ -5462,18 +5463,31 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
 	if (ret)
 		return ret;
 
-	tp->phydev = mdiobus_get_phy(new_bus, 0);
-	if (!tp->phydev) {
+	/* find the first (lowest address) PHY on the current MAC's MII bus */
+	for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
+		struct phy_device *tmp = mdiobus_get_phy(new_bus, addr);
+
+		if (tmp) {
+			phydev = tmp;
+			break;
+		}
+	}
+
+	if (!phydev) {
+		dev_err(&pdev->dev, "no PHY found on bus\n");
 		return -ENODEV;
-	} else if (!tp->phydev->drv) {
-		/* Most chip versions fail with the genphy driver.
-		 * Therefore ensure that the dedicated PHY driver is loaded.
-		 */
+	}
+
+	/* Most chip versions fail with the genphy driver.
+	 * Therefore ensure that the dedicated PHY driver is loaded.
+	 */
+	if (!phydev->drv) {
 		dev_err(&pdev->dev, "no dedicated PHY driver found for PHY ID 0x%08x, maybe realtek.ko needs to be added to initramfs?\n",
-			tp->phydev->phy_id);
+			phydev->phy_id);
 		return -EUNATCH;
 	}
 
+	tp->phydev = phydev;
 	tp->phydev->mac_managed_pm = true;
 	if (rtl_supports_eee(tp))
 		phy_support_eee(tp->phydev);
@@ -5790,11 +5804,11 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	rc = r8169_mdio_register(tp);
 	if (rc)
-		return rc;
+		return dev_err_probe(&pdev->dev, rc, "mdio register failure\n");
 
 	rc = register_netdev(dev);
 	if (rc)
-		return rc;
+		return dev_err_probe(&pdev->dev, rc, "register newdev failure\n");
 
 	if (IS_ENABLED(CONFIG_R8169_LEDS)) {
 		if (rtl_is_8125(tp))
base-commit: 95c541ddfb0815a0ea8477af778bb13bb075079a
-- 
2.50.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help