svn commit: r185812 - head/sys/dev/bge

Marius Strobl marius at FreeBSD.org
Tue Dec 9 13:34:23 PST 2008


Author: marius
Date: Tue Dec  9 21:34:22 2008
New Revision: 185812
URL: http://svn.freebsd.org/changeset/base/185812

Log:
  - Limit BCM5701 B5 to 32-bit mode as a workaround for a bug which
    causes data corruption in combination with certain bridges.
    Information about this problem was kindly provided by davidch. [1]
  - As BGE_FLAG_PCIX is meant to indicate that the controller is in
    PCI-X mode, revert to the pre __FreeBSD_version 602101 method of
    reading the bus mode register rather than checking the mere
    existence of a PCI-X capability, which is also there when the
    NIC f.e. is put into a 32-bit slot causing it not to be in PCI-X
    mode. Setting BGE_FLAG_PCIX inappropriately could cause the NIC
    to be tuned incorrectly.
  
  PR:		128833 [1]
  Reviewed by:	jhb
  MFC after:	3 days

Modified:
  head/sys/dev/bge/if_bge.c

Modified: head/sys/dev/bge/if_bge.c
==============================================================================
--- head/sys/dev/bge/if_bge.c	Tue Dec  9 21:10:09 2008	(r185811)
+++ head/sys/dev/bge/if_bge.c	Tue Dec  9 21:34:22 2008	(r185812)
@@ -1370,6 +1370,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 (sc->bge_asicrev == BGE_ASICREV_BCM5701 &&
+	    sc->bge_chipid == BGE_CHIPID_BCM5701_B5)
+		BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_FORCE_PCI32);
+
+	/*
 	 * Tell the firmware the driver is running
 	 */
 	if (sc->bge_asf_mode & ASF_STACKUP)
@@ -2462,26 +2472,21 @@ bge_attach(device_t dev)
 		 */
 		if (reg != 0)
 			sc->bge_flags |= BGE_FLAG_PCIE;
-	} else if (pci_find_extcap(dev, PCIY_PCIX, &reg) == 0) {
-		if (reg != 0)
-			sc->bge_flags |= BGE_FLAG_PCIX;
-	}
-			
 #else
 	if (BGE_IS_5705_PLUS(sc)) {
 		reg = pci_read_config(dev, BGE_PCIE_CAPID_REG, 4);
 		if ((reg & 0xFF) == BGE_PCIE_CAPID)
 			sc->bge_flags |= BGE_FLAG_PCIE;
+#endif
 	} else {
 		/*
 		 * Check if the device is in PCI-X Mode.
 		 * (This bit is not valid on PCI Express controllers.)
 		 */
-		if ((pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE, 4) &
+		if ((pci_read_config(dev, BGE_PCI_PCISTATE, 4) &
 		    BGE_PCISTATE_PCI_BUSMODE) == 0)
 			sc->bge_flags |= BGE_FLAG_PCIX;
 	}
-#endif
 
 #if __FreeBSD_version > 602105
 	{


More information about the svn-src-all mailing list