On 24.02.2021 16:44, Daniel González Cabanelas wrote: > The current bcm63xx_enet driver doesn't asign the internal phy IRQ. As a > result of this it works in polling mode. > > Fix it using the phy_device structure to assign the platform IRQ. > > Tested under a BCM6348 board. Kernel dmesg before the patch: > Broadcom BCM63XX (1) bcm63xx_enet-0:01: attached PHY driver [Broadcom > BCM63XX (1)] (mii_bus:phy_addr=bcm63xx_enet-0:01, irq=POLL) > > After the patch: > Broadcom BCM63XX (1) bcm63xx_enet-0:01: attached PHY driver [Broadcom > BCM63XX (1)] (mii_bus:phy_addr=bcm63xx_enet-0:01, irq=17) > > Pluging and uplugging the ethernet cable now generates interrupts and the > PHY goes up and down as expected. > > Signed-off-by: Daniel González Cabanelas <dgcb...@gmail.com> > --- > changes in V2: > - snippet moved after the mdiobus registration > - added missing brackets > > drivers/net/ethernet/broadcom/bcm63xx_enet.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c > b/drivers/net/ethernet/broadcom/bcm63xx_enet.c > index fd876721316..dd218722560 100644 > --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c > +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c > @@ -1818,10 +1818,19 @@ static int bcm_enet_probe(struct platform_device > *pdev) > * if a slave is not present on hw */ > bus->phy_mask = ~(1 << priv->phy_id); > > - if (priv->has_phy_interrupt) > + ret = mdiobus_register(bus); > + > + if (priv->has_phy_interrupt) { > + phydev = mdiobus_get_phy(bus, priv->phy_id); > + if (!phydev) { > + dev_err(&dev->dev, "no PHY found\n"); > + goto out_unregister_mdio; > + } > + > bus->irq[priv->phy_id] = priv->phy_interrupt; > + phydev->irq = priv->phy_interrupt; > + } > > - ret = mdiobus_register(bus);
You shouldn't have to set phydev->irq, this is done by phy_device_create(). For this to work bus->irq[] needs to be set before calling mdiobus_register(). > if (ret) { > dev_err(&pdev->dev, "unable to register mdio bus\n"); > goto out_free_mdio; >