Module Name: src
Committed By: thorpej
Date: Fri Mar 13 00:45:59 UTC 2020
Modified Files:
src/sys/dev/pci: if_sip.c
Log Message:
Adjust the logic for enabling the 64-bit data path when a 64-bit slot
is detected:
- If DATA64_EN isn't set in CFG after a reset, don't use 64-bit data path
at all (it's been disabled by an EEPROM setting).
- Provide a hook for force-disabling the 64-bit data path.
- Otherwise, perform the "known 64-bit cards" check as done previously
(because dodgy-vendor-EEPROM-settings still applies).
To generate a diff of this commit:
cvs rdiff -u -r1.179 -r1.180 src/sys/dev/pci/if_sip.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/pci/if_sip.c
diff -u src/sys/dev/pci/if_sip.c:1.179 src/sys/dev/pci/if_sip.c:1.180
--- src/sys/dev/pci/if_sip.c:1.179 Sun Mar 8 02:44:12 2020
+++ src/sys/dev/pci/if_sip.c Fri Mar 13 00:45:59 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_sip.c,v 1.179 2020/03/08 02:44:12 thorpej Exp $ */
+/* $NetBSD: if_sip.c,v 1.180 2020/03/13 00:45:59 thorpej Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.179 2020/03/08 02:44:12 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.180 2020/03/13 00:45:59 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -138,6 +138,12 @@ __KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1
#define MAX_SIP_NRXDESC MAX(GSIP_NRXDESC, SIP_NRXDESC)
/*
+ * Set this to 1 to force-disable using the 64-bit data path
+ * on DP83820.
+ */
+static int gsip_disable_data64 = 0;
+
+/*
* Control structures are DMA'd to the SiS900 chip. We allocate them in
* a single clump that maps to a single DMA segment to make several things
* easier.
@@ -860,21 +866,31 @@ sipcom_dp83820_attach(struct sip_softc *
reg = bus_space_read_4(sc->sc_st, sc->sc_sh, SIP_CFG);
if (reg & CFG_PCI64_DET) {
- printf("%s: 64-bit PCI slot detected", device_xname(sc->sc_dev));
- /*
- * Check to see if this card is 64-bit. If so, enable 64-bit
- * data transfers.
- *
- * We can't use the DATA64_EN bit in the EEPROM, because
- * vendors of 32-bit cards fail to clear that bit in many
- * cases (yet the card still detects that it's in a 64-bit
- * slot; go figure).
- */
- if (sipcom_check_64bit(pa)) {
- sc->sc_cfg |= CFG_DATA64_EN;
- printf(", using 64-bit data transfers");
+ const char *using64 = NULL;
+
+ if (reg & CFG_DATA64_EN) {
+ /*
+ * Check to see if this card is 64-bit. If so,
+ * enable 64-bit data transfers.
+ *
+ * We can't trust the DATA64_EN bit in the EEPROM,
+ * because vendors of 32-bit cards fail to clear
+ * that bit in many cases (yet the card still detects
+ * that it's in a 64-bit slot because I guess they
+ * wired up ACK64# and REQ64#).
+ */
+ if (gsip_disable_data64)
+ using64 = "force-disabled";
+ else if (sipcom_check_64bit(pa)) {
+ sc->sc_cfg |= CFG_DATA64_EN;
+ using64 = "enabled";
+ } else
+ using64 = "disabled (32-bit card)";
+ } else {
+ using64 = "disabled in EEPROM";
}
- printf("\n");
+ printf("%s: 64-bit slot detected, 64-bit tranfers %s\n",
+ device_xname(sc->sc_dev), using64);
}
/*