[rtems-libbsd commit] if_dwc: Fix a possible interrupt starvation

Sebastian Huber sebh at rtems.org
Tue Jan 10 10:06:12 UTC 2017


Module:    rtems-libbsd
Branch:    master
Commit:    c07da019f311447ef88c53fd63301935e40d7136
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=c07da019f311447ef88c53fd63301935e40d7136

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Sep  7 08:34:34 2015 +0200

if_dwc: Fix a possible interrupt starvation

---

 freebsd/sys/dev/dwc/if_dwc.c | 29 ++++++++++++-----------------
 freebsd/sys/dev/dwc/if_dwc.h |  1 +
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/freebsd/sys/dev/dwc/if_dwc.c b/freebsd/sys/dev/dwc/if_dwc.c
index 98885ed..1d60697 100644
--- a/freebsd/sys/dev/dwc/if_dwc.c
+++ b/freebsd/sys/dev/dwc/if_dwc.c
@@ -893,27 +893,22 @@ dwc_intr(void *arg)
 		READ4(sc, SGMII_RGMII_SMII_CTRL_STATUS);
 
 	reg = READ4(sc, DMA_STATUS);
-	if (reg & DMA_STATUS_NIS) {
-		if (reg & DMA_STATUS_RI)
-			dwc_rxfinish_locked(sc);
+	WRITE4(sc, DMA_STATUS, reg & DMA_STATUS_INTR_MASK);
 
-		if (reg & DMA_STATUS_TI) {
-			dwc_txfinish_locked(sc);
-			dwc_txstart_locked(sc);
-		}
-	}
+	if (reg & (DMA_STATUS_RI | DMA_STATUS_RU))
+		dwc_rxfinish_locked(sc);
 
-	if (reg & DMA_STATUS_AIS) {
-		if (reg & DMA_STATUS_FBI) {
-			/* Fatal bus error */
-			device_printf(sc->dev,
-			    "Ethernet DMA error, restarting controller.\n");
-			dwc_stop_locked(sc);
-			dwc_init_locked(sc);
-		}
+	if (reg & DMA_STATUS_TI)
+		dwc_txfinish_locked(sc);
+
+	if (reg & DMA_STATUS_FBI) {
+		/* Fatal bus error */
+		device_printf(sc->dev,
+		    "Ethernet DMA error, restarting controller.\n");
+		dwc_stop_locked(sc);
+		dwc_init_locked(sc);
 	}
 
-	WRITE4(sc, DMA_STATUS, reg & DMA_STATUS_INTR_MASK);
 	DWC_UNLOCK(sc);
 }
 
diff --git a/freebsd/sys/dev/dwc/if_dwc.h b/freebsd/sys/dev/dwc/if_dwc.h
index d6078ba..79a6ba1 100644
--- a/freebsd/sys/dev/dwc/if_dwc.h
+++ b/freebsd/sys/dev/dwc/if_dwc.h
@@ -231,6 +231,7 @@
 #define	 DMA_STATUS_NIS		(1 << 16)
 #define	 DMA_STATUS_AIS		(1 << 15)
 #define	 DMA_STATUS_FBI		(1 << 13)
+#define	 DMA_STATUS_RU		(1 << 7)
 #define	 DMA_STATUS_RI		(1 << 6)
 #define	 DMA_STATUS_TI		(1 << 0)
 #define	 DMA_STATUS_INTR_MASK	0x1ffff



More information about the vc mailing list