Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Dec 2008 20:36:32 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org
Subject:   svn commit: r186135 - in releng/7.1/sys: . contrib/pf dev/bge dev/cxgb
Message-ID:  <200812152036.mBFKaWDO016104@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Mon Dec 15 20:36:32 2008
New Revision: 186135
URL: http://svn.freebsd.org/changeset/base/186135

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
  Approved by:	re (kib)

Modified:
  releng/7.1/sys/   (props changed)
  releng/7.1/sys/contrib/pf/   (props changed)
  releng/7.1/sys/dev/bge/if_bge.c
  releng/7.1/sys/dev/cxgb/   (props changed)

Modified: releng/7.1/sys/dev/bge/if_bge.c
==============================================================================
--- releng/7.1/sys/dev/bge/if_bge.c	Mon Dec 15 20:32:16 2008	(r186134)
+++ releng/7.1/sys/dev/bge/if_bge.c	Mon Dec 15 20:36:32 2008	(r186135)
@@ -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)
@@ -2465,26 +2475,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
 	{



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812152036.mBFKaWDO016104>