El mié, 24 feb 2021 a las 23:01, Florian Fainelli (<f.faine...@gmail.com>) escribió: > > > > On 2/24/2021 1:44 PM, Heiner Kallweit wrote: > > 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(). > > Yes good point, and that is what the unchanged code does actually. > Daniel, any idea why that is not working?
Hi Florian, I don't know. bus->irq[] has no effect, only assigning the IRQ through phydev->irq works. I can resend the patch without the bus->irq[] line since it's pointless in this scenario. Regards > -- > Florian