]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Revert "net: phy: microchip: force IRQ polling mode for lan88xx"
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 12 May 2025 14:01:41 +0000 (16:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 18 May 2025 06:20:38 +0000 (08:20 +0200)
This reverts commit 853e14cf36f6b16a372444a1eff54a3d7c6c1268 which is
commit 30a41ed32d3088cd0d682a13d7f30b23baed7e93 upstream.

It is reported to cause NFS boot problems on a Raspberry Pi 3b so revert
it from this branch for now.

Cc: Fiona Klute <fiona.klute@gmx.de>
Cc: Andrew Lunn <andrew@lunn.ch>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Sasha Levin <sashal@kernel.org>
Link: https://lore.kernel.org/r/aB6uurX99AZWM9I1@finisterre.sirena.org.uk
Reported-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/phy/microchip.c

index 7c8bcec0a8fab0df590c9718adb04d63ef0b8444..230f2fcf9c46a1d3410cad7dc307fdfc2df5448e 100644 (file)
@@ -31,6 +31,47 @@ static int lan88xx_write_page(struct phy_device *phydev, int page)
        return __phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, page);
 }
 
+static int lan88xx_phy_config_intr(struct phy_device *phydev)
+{
+       int rc;
+
+       if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
+               /* unmask all source and clear them before enable */
+               rc = phy_write(phydev, LAN88XX_INT_MASK, 0x7FFF);
+               rc = phy_read(phydev, LAN88XX_INT_STS);
+               rc = phy_write(phydev, LAN88XX_INT_MASK,
+                              LAN88XX_INT_MASK_MDINTPIN_EN_ |
+                              LAN88XX_INT_MASK_LINK_CHANGE_);
+       } else {
+               rc = phy_write(phydev, LAN88XX_INT_MASK, 0);
+               if (rc)
+                       return rc;
+
+               /* Ack interrupts after they have been disabled */
+               rc = phy_read(phydev, LAN88XX_INT_STS);
+       }
+
+       return rc < 0 ? rc : 0;
+}
+
+static irqreturn_t lan88xx_handle_interrupt(struct phy_device *phydev)
+{
+       int irq_status;
+
+       irq_status = phy_read(phydev, LAN88XX_INT_STS);
+       if (irq_status < 0) {
+               phy_error(phydev);
+               return IRQ_NONE;
+       }
+
+       if (!(irq_status & LAN88XX_INT_STS_LINK_CHANGE_))
+               return IRQ_NONE;
+
+       phy_trigger_machine(phydev);
+
+       return IRQ_HANDLED;
+}
+
 static int lan88xx_suspend(struct phy_device *phydev)
 {
        struct lan88xx_priv *priv = phydev->priv;
@@ -347,9 +388,8 @@ static struct phy_driver microchip_phy_driver[] = {
        .config_aneg    = lan88xx_config_aneg,
        .link_change_notify = lan88xx_link_change_notify,
 
-       /* Interrupt handling is broken, do not define related
-        * functions to force polling.
-        */
+       .config_intr    = lan88xx_phy_config_intr,
+       .handle_interrupt = lan88xx_handle_interrupt,
 
        .suspend        = lan88xx_suspend,
        .resume         = genphy_resume,