Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Feb 2012 09:46:20 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-stable@freebsd.org, pyunyh@gmail.com
Subject:   Re: Regression in 8.2-STABLE bge code (from 7.4-STABLE)
Message-ID:  <201202230946.20471.jhb@freebsd.org>
In-Reply-To: <20120215005600.GB1336@michelle.cdnetworks.com>
References:  <alpine.BSF.2.00.1201281833470.19011@familysquires.net> <20120215005600.GB1336@michelle.cdnetworks.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday, February 14, 2012 7:56:00 pm YongHyeon PYUN wrote:
> On Sat, Jan 28, 2012 at 09:24:53PM -0500, Michael L. Squires wrote:
> 
> Sorry for late reply.  Had been busy due to relocation.
> 
> > There is a bug in the Tyan S4881/S4882 PCI-X bridges that was fixed with a 
> > patch in 7.x (thank you very much).  This patch is not present in the 
> > 8.2-STABLE code and the symptoms (watchdog timeouts) have recurred.
> > 
> 
> Hmm, I thought the mailbox reordering bug was avoided by limiting
> DMA address space to 32bits but it seems it was not right workaround
> for AMD 8131 PCI-X Bridge.
> 
> > The watchdog timeouts do not appear to be present after I switched to an 
> > Intel gigabit PCI-X card.
> > 
> > I did a brute-force patch of the 8.2-STABLE bge code using the patches for
> > 7.4-STABLE; the resulting code compiled and, other than odd behavior at
> > startup, seems to be working normally.
> > 
> > This is using FreeBSD 8.2-STABLE amd64; I don't know what happens with 
> > i386.
> > 
> > Given the age of the boards it may be easier if I just continue using the
> > Intel gigabit card but am happy to test anything that comes my way.
> > 
> 
> Try attached patch and let me know how it goes.
> I didn't enable 64bit DMA addressing though. I think the AMD-8131
> PCI-X bridge needs both workarounds.

Eh, please don't do the thing where you walk all pcib devices.  Instead, walk 
up the tree like so:

static int
bge_mbox_reorder(struct bge_softc *sc)
{
	devclass_t pcib, pci;
	device_t dev, bus;

	pci = devclass_find("pci");
	pcib = devclass_find("pcib");
	dev = sc->dev;
	bus = device_get_parent(dev);
	for (;;) {
		dev = device_get_parent(bus);
		bus = device_get_parent(dev);
		if (device_get_devclass(dev) != pcib_devclass ||
		    device_get_devclass(bus) != pci_devclass)
			break;
		/* Probe device ID. */
	}
	return (0);
}

It is not safe to use pci_get_vendor() with non-PCI devices (you may get
random junk, and Host-PCI bridges are not PCI devices).  Also, this will only
apply the quirk if a relevant bridge is in the bge device's path.

-- 
John Baldwin



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