Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d365c7b authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Greg Kroah-Hartman
Browse files

net: phy: avoid clearing PHY interrupts twice in irq handler



[ Upstream commit 249bc9744e165abe74ae326f43e9d70bad54c3b7 ]

On all PHY drivers that implement did_interrupt() reading the interrupt
status bits clears them. This means we may loose an interrupt that
is triggered between calling did_interrupt() and phy_clear_interrupt().
As part of the fix make it a requirement that did_interrupt() clears
the interrupt.

The Fixes tag refers to the first commit where the patch applies
cleanly.

Fixes: 49644e68 ("net: phy: add callback for custom interrupt handler to struct phy_driver")
Reported-by: default avatarMichael Walle <michael@walle.cc>
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7030138e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -761,7 +761,8 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
		phy_trigger_machine(phydev);
	}

	if (phy_clear_interrupt(phydev))
	/* did_interrupt() may have cleared the interrupt already */
	if (!phydev->drv->did_interrupt && phy_clear_interrupt(phydev))
		goto phy_err;
	return IRQ_HANDLED;

+1 −0
Original line number Diff line number Diff line
@@ -524,6 +524,7 @@ struct phy_driver {
	/*
	 * Checks if the PHY generated an interrupt.
	 * For multi-PHY devices with shared PHY interrupt pin
	 * Set interrupt bits have to be cleared.
	 */
	int (*did_interrupt)(struct phy_device *phydev);