git: 29776aa436cf - main - dwc: Move interrupt related code to core and dma file

From: Emmanuel Vadot <manu_at_FreeBSD.org>
Date: Thu, 05 Oct 2023 15:35:08 UTC
The branch main has been updated by manu:

URL: https://cgit.FreeBSD.org/src/commit/?id=29776aa436cf248950bcf755c6a53ec0590d89bf

commit 29776aa436cf248950bcf755c6a53ec0590d89bf
Author:     Emmanuel Vadot <manu@FreeBSD.org>
AuthorDate: 2023-10-03 16:04:03 +0000
Commit:     Emmanuel Vadot <manu@FreeBSD.org>
CommitDate: 2023-10-05 15:34:40 +0000

    dwc: Move interrupt related code to core and dma file
    
    No functional changes intended.
---
 sys/dev/dwc/dwc1000_core.c | 19 +++++++++++++++++++
 sys/dev/dwc/dwc1000_core.h |  2 ++
 sys/dev/dwc/dwc1000_dma.c  | 35 +++++++++++++++++++++++++++++++++++
 sys/dev/dwc/dwc1000_dma.h  |  1 +
 sys/dev/dwc/if_dwc.c       | 38 +++++++++-----------------------------
 5 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/sys/dev/dwc/dwc1000_core.c b/sys/dev/dwc/dwc1000_core.c
index c93019a49f3e..6cf836f87be2 100644
--- a/sys/dev/dwc/dwc1000_core.c
+++ b/sys/dev/dwc/dwc1000_core.c
@@ -419,3 +419,22 @@ dwc1000_harvest_stats(struct dwc_softc *sc)
 
 	dwc1000_clear_stats(sc);
 }
+
+void
+dwc1000_intr(struct dwc_softc *sc)
+{
+	uint32_t reg;
+
+	DWC_ASSERT_LOCKED(sc);
+
+	reg = READ4(sc, INTERRUPT_STATUS);
+	if (reg)
+		READ4(sc, SGMII_RGMII_SMII_CTRL_STATUS);
+}
+
+void
+dwc1000_intr_disable(struct dwc_softc *sc)
+{
+
+	WRITE4(sc, INTERRUPT_ENABLE, 0);
+}
diff --git a/sys/dev/dwc/dwc1000_core.h b/sys/dev/dwc/dwc1000_core.h
index 2069215bfffe..cb7d1f3946e9 100644
--- a/sys/dev/dwc/dwc1000_core.h
+++ b/sys/dev/dwc/dwc1000_core.h
@@ -39,5 +39,7 @@ void dwc1000_enable_csum_offload(struct dwc_softc *sc);
 void dwc1000_setup_rxfilter(struct dwc_softc *sc);
 void dwc1000_get_hwaddr(struct dwc_softc *sc, uint8_t *hwaddr);
 void dwc1000_harvest_stats(struct dwc_softc *sc);
+void dwc1000_intr(struct dwc_softc *softc);
+void dwc1000_intr_disable(struct dwc_softc *sc);
 
 #endif	/* __DWC1000_CORE_H__ */
diff --git a/sys/dev/dwc/dwc1000_dma.c b/sys/dev/dwc/dwc1000_dma.c
index ad8bdbcfc883..3d95c9d8e764 100644
--- a/sys/dev/dwc/dwc1000_dma.c
+++ b/sys/dev/dwc/dwc1000_dma.c
@@ -810,3 +810,38 @@ dma1000_free(struct dwc_softc *sc)
 	if (sc->txdesc_tag != NULL)
 		bus_dma_tag_destroy(sc->txdesc_tag);
 }
+
+/*
+ * Interrupt function
+ */
+
+int
+dma1000_intr(struct dwc_softc *sc)
+{
+	uint32_t reg;
+	int rv;
+
+	DWC_ASSERT_LOCKED(sc);
+
+	rv = 0;
+	reg = READ4(sc, DMA_STATUS);
+	if (reg & DMA_STATUS_NIS) {
+		if (reg & DMA_STATUS_RI)
+			dma1000_rxfinish_locked(sc);
+
+		if (reg & DMA_STATUS_TI) {
+			dma1000_txfinish_locked(sc);
+			dma1000_txstart(sc);
+		}
+	}
+
+	if (reg & DMA_STATUS_AIS) {
+		if (reg & DMA_STATUS_FBI) {
+			/* Fatal bus error */
+			rv = EIO;
+		}
+	}
+
+	WRITE4(sc, DMA_STATUS, reg & DMA_STATUS_INTR_MASK);
+	return (rv);
+}
diff --git a/sys/dev/dwc/dwc1000_dma.h b/sys/dev/dwc/dwc1000_dma.h
index b4af29076625..96a98c2d6d51 100644
--- a/sys/dev/dwc/dwc1000_dma.h
+++ b/sys/dev/dwc/dwc1000_dma.h
@@ -50,5 +50,6 @@ int dma1000_setup_txbuf(struct dwc_softc *sc, int idx, struct mbuf **mp);
 void dma1000_txfinish_locked(struct dwc_softc *sc);
 void dma1000_rxfinish_locked(struct dwc_softc *sc);
 void dma1000_txstart(struct dwc_softc *sc);
+int dma1000_intr(struct dwc_softc *sc);
 
 #endif	/* __DWC1000_DMA_H__ */
diff --git a/sys/dev/dwc/if_dwc.c b/sys/dev/dwc/if_dwc.c
index 107158cebf02..896e2f2205a0 100644
--- a/sys/dev/dwc/if_dwc.c
+++ b/sys/dev/dwc/if_dwc.c
@@ -300,38 +300,18 @@ static void
 dwc_intr(void *arg)
 {
 	struct dwc_softc *sc;
-	uint32_t reg;
+	int rv;
 
 	sc = arg;
-
 	DWC_LOCK(sc);
-
-	reg = READ4(sc, INTERRUPT_STATUS);
-	if (reg)
-		READ4(sc, SGMII_RGMII_SMII_CTRL_STATUS);
-
-	reg = READ4(sc, DMA_STATUS);
-	if (reg & DMA_STATUS_NIS) {
-		if (reg & DMA_STATUS_RI)
-			dma1000_rxfinish_locked(sc);
-
-		if (reg & DMA_STATUS_TI) {
-			dma1000_txfinish_locked(sc);
-			dwc_txstart_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);
-		}
+	dwc1000_intr(sc);
+	rv = dma1000_intr(sc);
+	if (rv == EIO) {
+		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);
 }
 
@@ -706,7 +686,7 @@ dwc_detach(device_t dev)
 	 * Disable and tear down interrupts before anything else, so we don't
 	 * race with the handler.
 	 */
-	WRITE4(sc, INTERRUPT_ENABLE, 0);
+	dwc1000_intr_disable(sc);
 	if (sc->intr_cookie != NULL) {
 		bus_teardown_intr(dev, sc->res[1], sc->intr_cookie);
 	}