Module Name:    src
Committed By:   christos
Date:           Mon Aug 12 18:55:01 UTC 2024

Modified Files:
        src/sys/dev/ic: rtl8169.c rtl81x9reg.h rtl81x9var.h

Log Message:
PR/58588: Christos Zoulas: Avoid crashes when exiting promiscuous mode (^C
tcpdump) by disabling RX in re_stop. Also add some earlyoff stuff while here.
>From FreeBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.177 -r1.178 src/sys/dev/ic/rtl8169.c
cvs rdiff -u -r1.54 -r1.55 src/sys/dev/ic/rtl81x9reg.h
cvs rdiff -u -r1.58 -r1.59 src/sys/dev/ic/rtl81x9var.h

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/rtl8169.c
diff -u src/sys/dev/ic/rtl8169.c:1.177 src/sys/dev/ic/rtl8169.c:1.178
--- src/sys/dev/ic/rtl8169.c:1.177	Fri Jul  5 00:31:51 2024
+++ src/sys/dev/ic/rtl8169.c	Mon Aug 12 14:55:01 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtl8169.c,v 1.177 2024/07/05 04:31:51 rin Exp $	*/
+/*	$NetBSD: rtl8169.c,v 1.178 2024/08/12 18:55:01 christos Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998-2003
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtl8169.c,v 1.177 2024/07/05 04:31:51 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtl8169.c,v 1.178 2024/08/12 18:55:01 christos Exp $");
 /* $FreeBSD: /repoman/r/ncvs/src/sys/dev/re/if_re.c,v 1.20 2004/04/11 20:34:08 ru Exp $ */
 
 /*
@@ -669,6 +669,8 @@ re_attach(struct rtk_softc *sc)
 			break;
 		case RTK_HWREV_8168E_VL:
 		case RTK_HWREV_8168F:
+			sc->sc_quirk |= RTKQ_EARLYOFF;
+			/*FALLTHROUGH*/
 		case RTK_HWREV_8411:
 			sc->sc_quirk |= RTKQ_DESCV2 | RTKQ_NOEECMD |
 			    RTKQ_MACSTAT | RTKQ_CMDSTOP | RTKQ_NOJUMBO;
@@ -1969,6 +1971,10 @@ re_init(struct ifnet *ifp)
 	/* Set the individual bit to receive frames for this host only. */
 	rxcfg = CSR_READ_4(sc, RTK_RXCFG);
 	rxcfg |= RTK_RXCFG_RX_INDIV;
+	if (sc->sc_quirk & RTKQ_EARLYOFF)
+		rxcfg |= RTK_RXCFG_EARLYOFF;
+	else if (sc->sc_quirk & RTKQ_RXDV_GATED)
+		rxcfg |= RTK_RXCFG_EARLYOFFV2;
 
 	/* If we want promiscuous mode, set the allframes bit. */
 	if (ifp->if_flags & IFF_PROMISC)
@@ -2173,6 +2179,21 @@ re_stop(struct ifnet *ifp, int disable)
 
 	mii_down(&sc->mii);
 
+        /*      
+         * Disable accepting frames to put RX MAC into idle state.
+         * Otherwise it's possible to get frames while stop command
+         * execution is in progress and controller can DMA the frame
+         * to already freed RX buffer during that period.
+         */     
+        CSR_WRITE_4(sc, RTK_RXCFG, CSR_READ_4(sc, RTK_RXCFG) &
+            ~(RTK_RXCFG_RX_ALLPHYS | RTK_RXCFG_RX_INDIV | RTK_RXCFG_RX_MULTI |
+            RTK_RXCFG_RX_BROAD));
+
+	if (sc->sc_quirk & RTKQ_RXDV_GATED) {
+		CSR_WRITE_4(sc, RTK_MISC,
+		    CSR_READ_4(sc, RTK_MISC) | RTK_MISC_RXDV_GATED_EN);
+	}
+
 	if ((sc->sc_quirk & RTKQ_CMDSTOP) != 0)
 		CSR_WRITE_1(sc, RTK_COMMAND, RTK_CMD_STOPREQ | RTK_CMD_TX_ENB |
 		    RTK_CMD_RX_ENB);

Index: src/sys/dev/ic/rtl81x9reg.h
diff -u src/sys/dev/ic/rtl81x9reg.h:1.54 src/sys/dev/ic/rtl81x9reg.h:1.55
--- src/sys/dev/ic/rtl81x9reg.h:1.54	Mon Sep 21 02:57:00 2020
+++ src/sys/dev/ic/rtl81x9reg.h	Mon Aug 12 14:55:01 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtl81x9reg.h,v 1.54 2020/09/21 06:57:00 msaitoh Exp $	*/
+/*	$NetBSD: rtl81x9reg.h,v 1.55 2024/08/12 18:55:01 christos Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998
@@ -291,8 +291,10 @@
 #define RTK_RXCFG_RX_RUNT	0x00000010
 #define RTK_RXCFG_RX_ERRPKT	0x00000020
 #define RTK_RXCFG_WRAP		0x00000080
+#define RTK_RXCFG_EARLYOFFV2	0x00000800 
 #define RTK_RXCFG_MAXDMA	0x00000700
 #define RTK_RXCFG_BUFSZ		0x00001800
+#define RTK_RXCFG_EARLYOFF	0x00003800 
 #define RTK_RXCFG_FIFOTHRESH	0x0000E000
 #define RTK_RXCFG_EARLYTHRESH	0x07000000
 

Index: src/sys/dev/ic/rtl81x9var.h
diff -u src/sys/dev/ic/rtl81x9var.h:1.58 src/sys/dev/ic/rtl81x9var.h:1.59
--- src/sys/dev/ic/rtl81x9var.h:1.58	Mon Sep 21 02:57:00 2020
+++ src/sys/dev/ic/rtl81x9var.h	Mon Aug 12 14:55:01 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtl81x9var.h,v 1.58 2020/09/21 06:57:00 msaitoh Exp $	*/
+/*	$NetBSD: rtl81x9var.h,v 1.59 2024/08/12 18:55:01 christos Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998
@@ -196,6 +196,7 @@ struct rtk_softc {
 #define RTKQ_RXDV_GATED		0x00000800
 #define RTKQ_IM_HW		0x00001000	/* HW interrupt mitigation */
 #define RTKQ_TXRXEN_LATER	0x00002000	/* TX/RX enable timing */
+#define RTKQ_EARLYOFF		0x00004000	/* Enable early receive? */
 
 	bus_dma_tag_t		sc_dmat;
 

Reply via email to