diff options
author | se <se@FreeBSD.org> | 1995-02-25 17:26:22 +0000 |
---|---|---|
committer | se <se@FreeBSD.org> | 1995-02-25 17:26:22 +0000 |
commit | f69a6c86317ff90bce1b2a1635e84dc9c463740b (patch) | |
tree | e22eb35e21dd035dda7cfe3d37657c1ceb6598bb /sys/pci/pci.c | |
parent | 0da562d454ac7b6119c29ad4ccd4c09a2a4c1022 (diff) | |
download | FreeBSD-src-f69a6c86317ff90bce1b2a1635e84dc9c463740b.zip FreeBSD-src-f69a6c86317ff90bce1b2a1635e84dc9c463740b.tar.gz |
Deal with systems, that lack a fully decoded PCI configuration space.
Submitted by: <wolf@kintaro.cologne.de> Wolfgang Stanglmeier
Diffstat (limited to 'sys/pci/pci.c')
-rw-r--r-- | sys/pci/pci.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/sys/pci/pci.c b/sys/pci/pci.c index a3ddeb8..e17b7f5 100644 --- a/sys/pci/pci.c +++ b/sys/pci/pci.c @@ -1,6 +1,6 @@ /************************************************************************** ** -** $Id: pci.c,v 1.14 1995/02/14 23:33:38 se Exp $ +** $Id: pci.c,v 1.15 1995/02/22 14:17:15 se Exp $ ** ** General subroutines for the PCI bus on 80*86 systems. ** pci_configure () @@ -36,7 +36,7 @@ *************************************************************************** */ -#define PCI_PATCHLEVEL "pl2 95/02/21" +#define PCI_PATCHLEVEL "pl3 95/02/25" #include <pci.h> #if NPCI > 0 @@ -166,6 +166,8 @@ static u_long pci_irq = PCI_IRQ; ** May be called more than once. ** Any device is attached only once. ** (Attached devices are remembered in pci_seen.) +** Has to take care of mirrored devices, which are +** entailed by incomplete decoding of pci address lines. ** **--------------------------------------------------------- */ @@ -244,6 +246,24 @@ void pci_configure() dvp = NULL; }; + /* + ** check for mirrored devices. + */ + if (device >= 8) { + pcici_t tag0; + pcidi_t type0; + tag0 = pcibus.pb_tag (bus, device & 0x07, 0); + type0 = pcibus.pb_read (tag0, PCI_ID_REG); + if (type==type0) { +#ifndef PCI_QUIET + if (dvp==NULL) continue; + printf ("%s? <%s> mirrored on pci%d:%d\n", + dvp->pd_name, name, bus, device); +#endif + continue; + }; + }; + if (dvp==NULL) { #ifndef PCI_QUIET if (pci_conf_count) |