nuport-mac: properly protect the phy interrupt handler
authorFlorian Fainelli <florian@openwrt.org>
Thu, 2 Aug 2012 18:13:17 +0000 (18:13 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Thu, 2 Aug 2012 18:13:17 +0000 (18:13 +0000)
SVN-Revision: 32951

target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c

index 657fb6a6462fe206ad5c939298e1fb7958b74d5f..794987f73b89148a89976938005b8d74f7da484a 100644 (file)
@@ -422,19 +422,25 @@ static irqreturn_t nuport_mac_link_interrupt(int irq, void *dev_id)
        struct nuport_mac_priv *priv = netdev_priv(dev);
        u32 reg;
        u8 phy_addr;
+       unsigned long flags;
+       irqreturn_t ret = IRQ_HANDLED;
 
+       spin_lock_irqsave(&priv->lock, flags);
        reg = nuport_mac_readl(LINK_INT_CSR);
        phy_addr = (reg >> LINK_PHY_ADDR_SHIFT) & (PHY_MAX_ADDR - 1);
 
        if (phy_addr != priv->phydev->addr) {
                netdev_err(dev, "spurious PHY irq (phy: %d)\n", phy_addr);
-               return IRQ_NONE;
+               ret = IRQ_NONE;
+               goto out;
        }
 
        priv->phydev->link = (reg & LINK_UP);
        nuport_mac_adjust_link(dev);
 
-       return IRQ_HANDLED;
+out:
+       spin_unlock_irqrestore(&priv->lock, flags);
+       return ret;
 }
 
 static irqreturn_t nuport_mac_tx_interrupt(int irq, void *dev_id)