summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorStuart Henderson <sthen@cvs.openbsd.org>2009-06-11 23:11:28 +0000
committerStuart Henderson <sthen@cvs.openbsd.org>2009-06-11 23:11:28 +0000
commitab2ff2c44282dca04b8226bcd5a41762993ae8ba (patch)
tree986947593fc0d66e494bb8de9d89b23ebe64b980 /sys
parent2c691c7cb711929101fd0b0ba05f7c3d40351c1d (diff)
Limit the BCM5701 B5 chipset to 32-bit mode as a workaround for a
bug which causes data corruption in combination with certain bridges. Tested on BCM5701 B5 (0x105). From FreeBSD via Brad. http://www.freebsd.org/cgi/query-pr.cgi?pr=128833
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/if_bge.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c
index d3d7ce8db6a..d7177f3af99 100644
--- a/sys/dev/pci/if_bge.c
+++ b/sys/dev/pci/if_bge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_bge.c,v 1.274 2009/06/11 22:44:14 sthen Exp $ */
+/* $OpenBSD: if_bge.c,v 1.275 2009/06/11 23:11:27 sthen Exp $ */
/*
* Copyright (c) 2001 Wind River Systems
@@ -1276,6 +1276,16 @@ bge_chipinit(struct bge_softc *sc)
BGE_MODECTL_TX_NO_PHDR_CSUM);
/*
+ * BCM5701 B5 have a bug causing data corruption when using
+ * 64-bit DMA reads, which can be terminated early and then
+ * completed later as 32-bit accesses, in combination with
+ * certain bridges.
+ */
+ if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5701 &&
+ sc->bge_chipid == BGE_CHIPID_BCM5701_B5)
+ BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_FORCE_PCI32);
+
+ /*
* Disable memory write invalidate. Apparently it is not supported
* properly by these devices.
*/