Module Name:    src
Committed By:   msaitoh
Date:           Thu Oct 26 13:00:13 UTC 2023

Modified Files:
        src/sys/dev/ic: dwc_eqos.c

Log Message:
eqos(4): Use EQOS_TXLOCK() more to be stable.

 Fix a bug that sc_tx.{cur,next,queued} become inconsitent.
Use txlock when accessing TX data.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/ic/dwc_eqos.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/dwc_eqos.c
diff -u src/sys/dev/ic/dwc_eqos.c:1.25 src/sys/dev/ic/dwc_eqos.c:1.26
--- src/sys/dev/ic/dwc_eqos.c:1.25	Mon Oct 23 15:29:38 2023
+++ src/sys/dev/ic/dwc_eqos.c	Thu Oct 26 13:00:13 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.25 2023/10/23 15:29:38 msaitoh Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.26 2023/10/26 13:00:13 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -38,7 +38,7 @@
 #include "opt_net_mpsafe.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.25 2023/10/23 15:29:38 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.26 2023/10/26 13:00:13 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -269,6 +269,8 @@ eqos_setup_txdesc(struct eqos_softc *sc,
 
 	DPRINTF(EDEB_TXRING, "preparing desc %u\n", index);
 
+	EQOS_ASSERT_TXLOCKED(sc);
+
 	if (paddr == 0 || len == 0) {
 		DPRINTF(EDEB_TXRING,
 		    "tx for desc %u done!\n", index);
@@ -924,6 +926,7 @@ eqos_txintr(struct eqos_softc *sc, int q
 	DPRINTF(EDEB_INTR, "qid: %u\n", qid);
 
 	EQOS_ASSERT_LOCKED(sc);
+	EQOS_ASSERT_TXLOCKED(sc);
 
 	for (i = sc->sc_tx.next; sc->sc_tx.queued > 0; i = TX_NEXT(i)) {
 		KASSERT(sc->sc_tx.queued > 0);
@@ -1128,7 +1131,9 @@ eqos_intr(void *arg)
 	}
 
 	if ((dma_status & GMAC_DMA_CHAN0_STATUS_TI) != 0) {
+		EQOS_TXLOCK(sc);
 		eqos_txintr(sc, 0);
+		EQOS_TXUNLOCK(sc);
 		if_schedule_deferred_start(ifp);
 		sc->sc_ev_txintr.ev_count++;
 	}
@@ -1336,7 +1341,9 @@ eqos_setup_dma(struct eqos_softc *sc, in
 			    "cannot create TX buffer map\n");
 			return error;
 		}
+		EQOS_TXLOCK(sc);
 		eqos_setup_txdesc(sc, i, 0, 0, 0, 0);
+		EQOS_TXUNLOCK(sc);
 	}
 
 	/* Setup RX ring */

Reply via email to