Date: Sun, 1 Oct 2000 07:50:01 -0700 (PDT) From: Masayuki FUKUI <fukui@sonic.nm.fujitsu.co.jp> To: freebsd-bugs@FreeBSD.org Subject: Re: i386/20379: unable to install, monitor goes black during boot (with serial is disabled) Message-ID: <200010011450.HAA73438@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/20379; it has been noted by GNATS.
From: Masayuki FUKUI <fukui@sonic.nm.fujitsu.co.jp>
To: Sheldon Hearn <sheldonh@uunet.co.za>
Cc: freebsd-gnats-submit@FreeBSD.org, gyula_matics@hp.com,
msmith@FreeBSD.org
Subject: Re: i386/20379: unable to install, monitor goes black during boot (with serial is disabled)
Date: Sun, 01 Oct 2000 23:43:16 +0900
My machine cannot boot with 4.1.1-RELEASE as before.
I'm inconvenienced.
>On Tue, 08 Aug 2000 14:12:03 +0900, Masayuki FUKUI wrote:
>
>> It seems to me that FreeBSD 4 kernel's PCI bus probe fails on 450GX chipset
>> and the machine hangs up.
>> (maybe in src/i386/isa/pcibus.c)
I tried to find the cause and probably found it.
In src/sys/i386/isa/pcibus.c nexus_pcib_identify(),
| retry:
| for (probe.slot = 0; probe.slot <= PCI_SLOTMAX; probe.slot++) {
| probe.func = 0;
| hdrtype = pci_cfgread(&probe, PCIR_HEADERTYPE, 1);
On unavailable PCI slot, 'hdrtype' is always 0xff (-1).
(Is this right with PCI standard?)
| if (hdrtype & PCIM_MFDEV)
| pcifunchigh = 7;
| else
| pcifunchigh = 0;
and 'pcifunchigh' sets to 7.
(Is this expected?)
| for (probe.func = 0;
| probe.func <= pcifunchigh;
| probe.func++) {
| /*
| * Read the IDs and class from the device.
| */
| u_int32_t id;
| u_int8_t class, subclass, busnum;
| device_t child;
| const char *s;
|
| id = pci_cfgread(&probe, PCIR_DEVVENDOR, 4);
When 'probe.slot' is PCI_SLOTMAX (== 31) and 'probe.func' is 7,
call to 'pci_cfgread()' here and machine suddenly hangs up.
I don't know why... (or 450GX chipset's bug?)
(When 'probe.slot' is 31 and 'probe.func' is 6,
it returns from 'pci_cfgread()' and 'id' is 0xffffffff (-1).)
I don't know how to fix rightly.
But I rebuild 4-STABLE kernel with following patch,
and it works fine.
I hope for fixing the probrem as soon as possible.
--- src/sys/i386/isa/pcibus.c.orig Thu Feb 24 05:25:06 2000
+++ src/sys/i386/isa/pcibus.c Sun Oct 1 23:16:06 2000
@@ -439,6 +439,7 @@
int found = 0;
int pcifunchigh;
int found824xx = 0;
+ int found_orion = 0;
if (pci_cfgopen() == 0)
return;
@@ -448,7 +449,7 @@
for (probe.slot = 0; probe.slot <= PCI_SLOTMAX; probe.slot++) {
probe.func = 0;
hdrtype = pci_cfgread(&probe, PCIR_HEADERTYPE, 1);
- if (hdrtype & PCIM_MFDEV)
+ if (hdrtype & PCIM_MFDEV && (!found_orion || hdrtype != 0xff) )
pcifunchigh = 7;
else
pcifunchigh = 0;
@@ -483,6 +484,8 @@
found = 1;
if (id == 0x12258086)
found824xx = 1;
+ if (id == 0x84c48086)
+ found_orion = 1;
}
}
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010011450.HAA73438>
