net: lan78xx: Ack pending PHY ints when resetting
authorPhil Elwell <phil@raspberrypi.com>
Tue, 15 Dec 2020 16:38:37 +0000 (16:38 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:07 +0000 (11:33 +0000)
lan78xx_link_reset explicitly clears the MAC's view of the PHY's IRQ
status. In doing so it potentially leaves the PHY with a pending
interrupt that will never be acknowledged, at which point no further
interrupts will be generated.

Avoid the problem by acknowledging any pending PHY interrupt after
clearing the MAC's status bit.

See: https://github.com/raspberrypi/linux/issues/2937

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
drivers/net/usb/lan78xx.c

index 0044d75..da3f710 100644 (file)
@@ -1440,6 +1440,9 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)
        if (unlikely(ret < 0))
                return ret;
 
+       /* Acknowledge any pending PHY interrupt, lest it be the last */
+       phy_read(phydev, LAN88XX_INT_STS);
+
        mutex_lock(&phydev->lock);
        phy_read_status(phydev);
        link = phydev->link;