aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Sullivan <nathan.sullivan@ni.com>2016-01-14 14:27:27 -0500
committerDavid S. Miller <davem@davemloft.net>2016-01-15 14:47:09 -0500
commit244683749e3c632ab45655098259d5514c179c8a (patch)
treeefe74e83c7ffcab7714e3ffe580f1d9209eb208f
parent65a5124a71e85c35fa8d047a471950325855dccf (diff)
net: macb: clear interrupts when disabling them
Disabling interrupts with the IDR register does not stop the macb hardware from asserting its interrupt line if there are interrupts pending. Always clear the interrupts using ISR, and be sure to write it on hardware that is not read-to-clear, like Zynq. Not doing so will cause interrupts when the driver doesn't expect them. Signed-off-by: Nathan Sullivan <nathan.sullivan@ni.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/cadence/macb.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index c56347536f6b..9d9984a87d42 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -1040,6 +1040,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
1040 /* close possible race with dev_close */ 1040 /* close possible race with dev_close */
1041 if (unlikely(!netif_running(dev))) { 1041 if (unlikely(!netif_running(dev))) {
1042 queue_writel(queue, IDR, -1); 1042 queue_writel(queue, IDR, -1);
1043 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
1044 queue_writel(queue, ISR, -1);
1043 break; 1045 break;
1044 } 1046 }
1045 1047
@@ -1561,6 +1563,8 @@ static void macb_reset_hw(struct macb *bp)
1561 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { 1563 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) {
1562 queue_writel(queue, IDR, -1); 1564 queue_writel(queue, IDR, -1);
1563 queue_readl(queue, ISR); 1565 queue_readl(queue, ISR);
1566 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
1567 queue_writel(queue, ISR, -1);
1564 } 1568 }
1565} 1569}
1566 1570