diff options
author | Soren Brinkmann <soren.brinkmann@xilinx.com> | 2014-05-04 18:42:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-05 17:11:18 -0400 |
commit | 6a027b705fb6d2214647a638b44ea91ee6ce7e4c (patch) | |
tree | 609a51fb8dfa3413b9e52d2ff65f8d777c5fb12b | |
parent | ccd6d0a9104e9075e57fa539ed6bb622b15284d9 (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.c | 10 |
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); |