net: macb: Re-enable RX interrupt only when RX is done
authorSoren Brinkmann <soren.brinkmann@xilinx.com>
Sun, 4 May 2014 22:43:00 +0000 (15:43 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 May 2014 21:11:18 +0000 (17:11 -0400)
When data is received during the driver processing received data the
NAPI is re-scheduled. In that case the RX interrupt should not be
re-enabled.

Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cadence/macb.c

index e38fe39d9589068c5d93b13e47e78d4069cbdb83..3f4b8ee0b0e740d10c13532295224e99047ff376 100644 (file)
@@ -891,16 +891,15 @@ static int macb_poll(struct napi_struct *napi, int budget)
        if (work_done < budget) {
                napi_complete(napi);
 
-               /*
-                * We've done what we can to clean the buffers. Make sure we
-                * get notified when new packets arrive.
-                */
-               macb_writel(bp, IER, MACB_RX_INT_FLAGS);
-
                /* Packets received while interrupts were disabled */
                status = macb_readl(bp, RSR);
-               if (unlikely(status))
+               if (unlikely(status)) {
+                       if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
+                               macb_writel(bp, ISR, MACB_BIT(RCOMP));
                        napi_reschedule(napi);
+               } else {
+                       macb_writel(bp, IER, MACB_RX_INT_FLAGS);
+               }
        }
 
        /* TODO: Handle errors */