mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-21 15:45:02 +00:00
- 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
This commit is contained in:
parent
21b14a75f6
commit
90447aad0a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185812
@ -1369,6 +1369,16 @@ bge_chipinit(struct bge_softc *sc)
|
||||
BGE_MODECTL_MAC_ATTN_INTR | BGE_MODECTL_HOST_SEND_BDS |
|
||||
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
|
||||
*/
|
||||
@ -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, ®) == 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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user