net: phy: avoid clearing PHY interrupts twice in irq handler
[ Upstream commit5.4-rM2-2.2.x-imx-squashed249bc9744e
] 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:49644e68f4
("net: phy: add callback for custom interrupt handler to struct phy_driver") Reported-by: Michael Walle <michael@walle.cc> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
7030138e3c
commit
4d365c7b47
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue