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>