summaryrefslogtreecommitdiffstats
path: root/sys/dev/et
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/et')
-rw-r--r--sys/dev/et/if_et.c32
-rw-r--r--sys/dev/et/if_etreg.h10
2 files changed, 24 insertions, 18 deletions
diff --git a/sys/dev/et/if_et.c b/sys/dev/et/if_et.c
index 35c7b32..6c1df0e 100644
--- a/sys/dev/et/if_et.c
+++ b/sys/dev/et/if_et.c
@@ -1158,34 +1158,40 @@ et_intr(void *xsc)
{
struct et_softc *sc = xsc;
struct ifnet *ifp;
- uint32_t intrs;
+ uint32_t status;
ET_LOCK(sc);
ifp = sc->ifp;
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
- ET_UNLOCK(sc);
- return;
- }
+ if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+ goto done;
+
+ status = CSR_READ_4(sc, ET_INTR_STATUS);
+ if ((status & ET_INTRS) == 0)
+ goto done;
/* Disable further interrupts. */
CSR_WRITE_4(sc, ET_INTR_MASK, 0xffffffff);
- intrs = CSR_READ_4(sc, ET_INTR_STATUS);
- if ((intrs & ET_INTRS) == 0)
- goto done;
-
- if (intrs & ET_INTR_RXEOF)
+ if (status & (ET_INTR_RXDMA_ERROR | ET_INTR_TXDMA_ERROR)) {
+ device_printf(sc->dev, "DMA error(0x%08x) -- resetting\n",
+ status);
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+ et_init_locked(sc);
+ ET_UNLOCK(sc);
+ return;
+ }
+ if (status & ET_INTR_RXDMA)
et_rxeof(sc);
- if (intrs & (ET_INTR_TXEOF | ET_INTR_TIMER))
+ if (status & (ET_INTR_TXDMA | ET_INTR_TIMER))
et_txeof(sc);
- if (intrs & ET_INTR_TIMER)
+ if (status & ET_INTR_TIMER)
CSR_WRITE_4(sc, ET_TIMER, sc->sc_timer);
-done:
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
CSR_WRITE_4(sc, ET_INTR_MASK, ~ET_INTRS);
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
et_start_locked(ifp);
}
+done:
ET_UNLOCK(sc);
}
diff --git a/sys/dev/et/if_etreg.h b/sys/dev/et/if_etreg.h
index 1b0f55a..6767e53 100644
--- a/sys/dev/et/if_etreg.h
+++ b/sys/dev/et/if_etreg.h
@@ -378,9 +378,9 @@
/*
* Interrupts
*/
-#define ET_INTR_TXEOF 0x00000008
+#define ET_INTR_TXDMA 0x00000008
#define ET_INTR_TXDMA_ERROR 0x00000010
-#define ET_INTR_RXEOF 0x00000020
+#define ET_INTR_RXDMA 0x00000020
#define ET_INTR_RXRING0_LOW 0x00000040
#define ET_INTR_RXRING1_LOW 0x00000080
#define ET_INTR_RXSTAT_LOW 0x00000100
@@ -393,9 +393,9 @@
#define ET_INTR_MAC_STATS 0x00080000
#define ET_INTR_SLAVE_TO 0x00100000
-#define ET_INTRS (ET_INTR_TXEOF | \
- ET_INTR_RXEOF | \
- ET_INTR_TIMER)
+#define ET_INTRS \
+ (ET_INTR_TXDMA | ET_INTR_RXDMA | ET_INTR_TIMER | \
+ ET_INTR_TXDMA_ERROR | ET_INTR_RXDMA_ERROR)
/*
* RX ring position uses same layout
OpenPOWER on IntegriCloud