diff options
Diffstat (limited to 'drivers/net/phy/microchip.c')
| -rw-r--r-- | drivers/net/phy/microchip.c | 24 | 
1 files changed, 20 insertions, 4 deletions
| diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c index a644e8e5071c..9f1f2b6c97d4 100644 --- a/drivers/net/phy/microchip.c +++ b/drivers/net/phy/microchip.c @@ -44,16 +44,32 @@ static int lan88xx_phy_config_intr(struct phy_device *phydev)  			       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 int lan88xx_phy_ack_interrupt(struct phy_device *phydev) +static irqreturn_t lan88xx_handle_interrupt(struct phy_device *phydev)  { -	int rc = phy_read(phydev, LAN88XX_INT_STS); +	int irq_status; -	return rc < 0 ? rc : 0; +	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) @@ -340,8 +356,8 @@ static struct phy_driver microchip_phy_driver[] = {  	.config_init	= lan88xx_config_init,  	.config_aneg	= lan88xx_config_aneg, -	.ack_interrupt	= lan88xx_phy_ack_interrupt,  	.config_intr	= lan88xx_phy_config_intr, +	.handle_interrupt = lan88xx_handle_interrupt,  	.suspend	= lan88xx_suspend,  	.resume		= genphy_resume, | 
