Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Dec 2011 18:17:02 +0000 (UTC)
From:      Pyun YongHyeon <yongari@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228362 - head/sys/dev/et
Message-ID:  <201112091817.pB9IH2wV044025@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: yongari
Date: Fri Dec  9 18:17:02 2011
New Revision: 228362
URL: http://svn.freebsd.org/changeset/base/228362

Log:
  Do not disable interrupt without knowing whether the raised
  interrupt is ours.  Note, interrupts are automatically ACKed when
  the status register is read.
  Add RX/TX DMA error to interrupt handler and do full controller
  reset if driver happen to encounter these errors.  There is no way
  to recover from these DMA errors without controller reset.
  Rename local variable name intrs with status to enhance
  readability.
  
  While I'm here, rename ET_INTR_TXEOF and ET_INTR_RXEOF to
  ET_INTR_TXDMA and ET_INTR_RXDMA respectively.  These interrupts
  indicate that a frame is successfully DMAed to controller's
  internal FIFO and they have nothing to do with EOF(end of frame).
  Driver does not need to wait actual end of TX/RX of a frame(e.g.
  no need to wait the end signal of TX which is generated when a
  frame in TX FIFO is emptied by MAC).  Previous names were somewhat
  confusing.

Modified:
  head/sys/dev/et/if_et.c
  head/sys/dev/et/if_etreg.h

Modified: head/sys/dev/et/if_et.c
==============================================================================
--- head/sys/dev/et/if_et.c	Fri Dec  9 17:49:34 2011	(r228361)
+++ head/sys/dev/et/if_et.c	Fri Dec  9 18:17:02 2011	(r228362)
@@ -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);
 }
 

Modified: head/sys/dev/et/if_etreg.h
==============================================================================
--- head/sys/dev/et/if_etreg.h	Fri Dec  9 17:49:34 2011	(r228361)
+++ head/sys/dev/et/if_etreg.h	Fri Dec  9 18:17:02 2011	(r228362)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112091817.pB9IH2wV044025>