net: calxedaxgmac: enable interrupts after napi_enable
authorRob Herring <rob.herring@calxeda.com>
Fri, 30 Aug 2013 21:49:25 +0000 (16:49 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Sep 2013 02:21:15 +0000 (22:21 -0400)
Fix a race condition where the interrupt handler may have called
napi_schedule before napi_enable is called. This would disable interrupts
and never actually schedule napi to run.

Reported-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/calxeda/xgmac.c

index 5d0b61a..73d3f83 100644 (file)
@@ -959,9 +959,7 @@ static int xgmac_hw_init(struct net_device *dev)
                DMA_BUS_MODE_FB | DMA_BUS_MODE_ATDS | DMA_BUS_MODE_AAL;
        writel(value, ioaddr + XGMAC_DMA_BUS_MODE);
 
-       /* Enable interrupts */
-       writel(DMA_INTR_DEFAULT_MASK, ioaddr + XGMAC_DMA_STATUS);
-       writel(DMA_INTR_DEFAULT_MASK, ioaddr + XGMAC_DMA_INTR_ENA);
+       writel(0, ioaddr + XGMAC_DMA_INTR_ENA);
 
        /* Mask power mgt interrupt */
        writel(XGMAC_INT_STAT_PMTIM, ioaddr + XGMAC_INT_STAT);
@@ -1029,6 +1027,10 @@ static int xgmac_open(struct net_device *dev)
        napi_enable(&priv->napi);
        netif_start_queue(dev);
 
+       /* Enable interrupts */
+       writel(DMA_INTR_DEFAULT_MASK, ioaddr + XGMAC_DMA_STATUS);
+       writel(DMA_INTR_DEFAULT_MASK, ioaddr + XGMAC_DMA_INTR_ENA);
+
        return 0;
 }