aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSoren Brinkmann <soren.brinkmann@xilinx.com>2014-05-04 18:42:59 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-05 17:11:18 -0400
commit6a027b705fb6d2214647a638b44ea91ee6ce7e4c (patch)
tree609a51fb8dfa3413b9e52d2ff65f8d777c5fb12b
parentccd6d0a9104e9075e57fa539ed6bb622b15284d9 (diff)
net: macb: Clear interrupt flags
A few interrupt flags were not cleared in the ISR, resulting in a sytem trapped in the ISR in cases one of those interrupts occurred. Clear all flags to avoid such situations. Signed-off-by: Soren Brinkmann <soren.brinkmann@xilinx.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/cadence/macb.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index 18fdcd9d51b3..e38fe39d9589 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -951,6 +951,10 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
951 if (unlikely(status & (MACB_TX_ERR_FLAGS))) { 951 if (unlikely(status & (MACB_TX_ERR_FLAGS))) {
952 macb_writel(bp, IDR, MACB_TX_INT_FLAGS); 952 macb_writel(bp, IDR, MACB_TX_INT_FLAGS);
953 schedule_work(&bp->tx_error_task); 953 schedule_work(&bp->tx_error_task);
954
955 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
956 macb_writel(bp, ISR, MACB_TX_ERR_FLAGS);
957
954 break; 958 break;
955 } 959 }
956 960
@@ -968,6 +972,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
968 bp->hw_stats.gem.rx_overruns++; 972 bp->hw_stats.gem.rx_overruns++;
969 else 973 else
970 bp->hw_stats.macb.rx_overruns++; 974 bp->hw_stats.macb.rx_overruns++;
975
976 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
977 macb_writel(bp, ISR, MACB_BIT(ISR_ROVR));
971 } 978 }
972 979
973 if (status & MACB_BIT(HRESP)) { 980 if (status & MACB_BIT(HRESP)) {
@@ -977,6 +984,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
977 * (work queue?) 984 * (work queue?)
978 */ 985 */
979 netdev_err(dev, "DMA bus error: HRESP not OK\n"); 986 netdev_err(dev, "DMA bus error: HRESP not OK\n");
987
988 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
989 macb_writel(bp, ISR, MACB_BIT(HRESP));
980 } 990 }
981 991
982 status = macb_readl(bp, ISR); 992 status = macb_readl(bp, ISR);