[PATCH net v9 2/4] net: usb: smsc95xx: register the PHY interrupt with the MDIO bus
From: Aleksei Sviridkin
Date: Fri Sep 18 2026 - 21:54:44 EST
The interrupt this driver maps for its PHY is written only into
phydev->irq, while the bus table mdiobus->irq[] keeps reading PHY_POLL
for the same address. That table is where phylib records what the bus
described - phy_device_create() seeds phydev->irq from it - so the
number lives only as long as nothing else writes that one field.
The bus is the one this function is about to register, so put the number
in its table first and let the scan seed the PHY from there. Which
address answers is not known that early, so the whole table gets it.
Found going through the drivers that keep a PHY interrupt outside the
bus table, so that the restore on detach later in this series has a
number to hand back here as well.
Assisted-by: LLM
Signed-off-by: Aleksei Sviridkin <f@xxxxxx>
---
Notes:
Compile-tested only; I have no LAN95xx device.
No Fixes: tag, for the same reason as patch 1: the write has no reader until
patch 3 lands.
The mapping is created well before mdiobus_alloc(), so the number is in hand
where the table is filled, and mdiobus_alloc_size() is the only thing that
writes PHY_POLL into that table - a fill placed after the alloc and before
mdiobus_register() is not undone by the scan. Which address the PHY answers
on is what phy_find_first() goes looking for afterwards, hence the whole
table; mdio-moxart.c fills its own the same way.
Teardown order keeps the number live for as long as it is read:
smsc95xx_unbind() disconnects the PHY before it disposes the interrupt
mapping.
drivers/net/usb/smsc95xx.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 42e4048b574b..ad65d2b9cec7 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -1148,7 +1148,7 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
{
struct smsc95xx_priv *pdata;
char usb_path[64];
- int ret, phy_irq;
+ int ret, phy_irq, i;
u32 val;
ret = usbnet_get_endpoints(dev, intf);
@@ -1239,6 +1239,9 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id),
"usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum);
+ for (i = 0; i < PHY_MAX_ADDR; i++)
+ pdata->mdiobus->irq[i] = phy_irq;
+
ret = mdiobus_register(pdata->mdiobus);
if (ret) {
netdev_err(dev->net, "Could not register MDIO bus\n");
@@ -1252,7 +1255,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
goto unregister_mdio;
}
- pdata->phydev->irq = phy_irq;
pdata->phydev->is_internal = pdata->is_internal_phy;
/* detect device revision as different features may be available */
--
2.53.0