⬢ DragonFlyBSD Kernel Audit
DF-3570 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/re/re.c
+++ b/sys/dev/netif/re/re.c
@@ -31183,6 +31183,9 @@ u_int32_t MP_ReadOtherFunPciEConfigSpace(
 
 	DELAY(50);
 
+	/* Read the data register the NIC filled in during the handshake. */
+	RetVal = CSR_READ_4(sc, RE_CSIDR);
+
 	return RetVal;
 }
 
@@ -3445,9 +3448,12 @@ static void Dash2DisableTx(struct re_softc *sc)
 {
 	//if (!sc->re_dash) return;
 
-	if (HW_DASH_SUPPORT_TYPE_2(sc) || HW_DASH_SUPPORT_TYPE_3(sc)) {
+	/*
+	 * The CMAC window is only mapped for DASH parts (and only when
+	 * bus_space_map() succeeded); never touch a NULL handle.
+	 */
+	if (sc->re_cmac_handle != 0 &&
+	    (HW_DASH_SUPPORT_TYPE_2(sc) || HW_DASH_SUPPORT_TYPE_3(sc))) {
 		u_int16_t WaitCnt;
 		u_int8_t TmpUchar;
 
@@ -3474,7 +3480,8 @@ static void Dash2DisableRx(struct re_softc *sc)
 {
 	//if (!sc->re_dash) return;
 
-	if (HW_DASH_SUPPORT_TYPE_2(sc) || HW_DASH_SUPPORT_TYPE_3(sc)) {
+	if (sc->re_cmac_handle != 0 &&
+	    (HW_DASH_SUPPORT_TYPE_2(sc) || HW_DASH_SUPPORT_TYPE_3(sc))) {
 		RE_CMAC_WRITE_1(sc, RE_CMAC_IBCR0, RE_CMAC_READ_1(sc, RE_CMAC_IBCR0) & ~(BIT_0));
 	}
 }
@@ -4484,8 +4491,11 @@ static void re_init_software_variable(struct re_softc *sc)
 		break;
 	case MACFG_70:
 	case MACFG_71:
-	case MACFG_72:
-		sc->re_cmac_handle = sc->re_mapped_cmac_handle;
-		sc->re_cmac_tag = sc->re_mapped_cmac_tag;
+	case MACFG_72:
+		if (sc->re_mapped_cmac_handle != 0) {
+			sc->re_cmac_handle = sc->re_mapped_cmac_handle;
+			sc->re_cmac_tag = sc->re_mapped_cmac_tag;
+		}
 		break;
 	}