summaryrefslogtreecommitdiffstats
path: root/arch/i386/kernel/bios32.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-09-19 19:15:08 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-09-19 19:15:08 +0000
commit03ba4131783cc9e872f8bb26a03f15bc11f27564 (patch)
tree88db8dba75ae06ba3bad08e42c5e52efc162535c /arch/i386/kernel/bios32.c
parent257730f99381dd26e10b832fce4c94cae7ac1176 (diff)
- Merge with Linux 2.1.121.
- Bugfixes.
Diffstat (limited to 'arch/i386/kernel/bios32.c')
-rw-r--r--arch/i386/kernel/bios32.c58
1 files changed, 35 insertions, 23 deletions
diff --git a/arch/i386/kernel/bios32.c b/arch/i386/kernel/bios32.c
index 1752ff2c0..31049ec2a 100644
--- a/arch/i386/kernel/bios32.c
+++ b/arch/i386/kernel/bios32.c
@@ -1,7 +1,7 @@
/*
* bios32.c - Low-Level PCI Access
*
- * $Id: bios32.c,v 1.44 1998/08/04 14:54:56 mj Exp $
+ * $Id: bios32.c,v 1.45 1998/08/15 10:41:04 mj Exp $
*
* Copyright 1993, 1994 Drew Eckhardt
* Visionary Computing
@@ -945,7 +945,8 @@ __initfunc(void pcibios_fixup_ghosts(struct pci_bus *b))
__initfunc(void pcibios_fixup_peer_bridges(void))
{
struct pci_bus *b = &pci_root;
- int i;
+ int i, cnt=-1;
+ struct pci_dev *d;
#ifdef CONFIG_PCI_DIRECT
/*
@@ -956,23 +957,34 @@ __initfunc(void pcibios_fixup_peer_bridges(void))
if (access_pci == &pci_direct_conf2)
return;
#endif
+ for(d=b->devices; d; d=d->sibling)
+ if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
+ cnt++;
do {
int n = b->subordinate+1;
+ int found = 0;
u16 l;
for(i=0; i<256; i += 8)
if (!pcibios_read_config_word(n, i, PCI_VENDOR_ID, &l) &&
l != 0x0000 && l != 0xffff) {
DBG("Found device at %02x:%02x\n", n, i);
- printk("PCI: Discovered primary peer bus %02x\n", n);
- b = kmalloc(sizeof(*b), GFP_KERNEL);
- memset(b, 0, sizeof(*b));
- b->next = pci_root.next;
- pci_root.next = b;
- b->number = b->secondary = n;
- b->subordinate = 0xff;
- b->subordinate = pci_scan_bus(b);
- break;
+ found++;
+ if (!pcibios_read_config_word(n, i, PCI_CLASS_DEVICE, &l) &&
+ l == PCI_CLASS_BRIDGE_HOST)
+ cnt++;
}
+ if (found && cnt > 0) {
+ cnt--;
+ printk("PCI: Discovered primary peer bus %02x\n", n);
+ b = kmalloc(sizeof(*b), GFP_KERNEL);
+ memset(b, 0, sizeof(*b));
+ b->next = pci_root.next;
+ pci_root.next = b;
+ b->number = b->secondary = n;
+ b->subordinate = 0xff;
+ b->subordinate = pci_scan_bus(b);
+ break;
+ }
} while (i < 256);
}
@@ -1034,19 +1046,19 @@ __initfunc(void pcibios_fixup_devices(void))
* Recalculate IRQ numbers if we use the I/O APIC
*/
{
- int irq;
- unsigned char pin;
-
- pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
- if (pin) {
- pin--; /* interrupt pins are numbered starting from 1 */
- irq = IO_APIC_get_PCI_irq_vector (dev->bus->number, PCI_SLOT(dev->devfn), pin);
- if (irq >= 0) {
- printk("PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
- dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
- dev->irq = irq;
+ int irq;
+ unsigned char pin;
+
+ pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+ if (pin) {
+ pin--; /* interrupt pins are numbered starting from 1 */
+ irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
+ if (irq >= 0) {
+ printk("PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
+ dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
+ dev->irq = irq;
}
- }
+ }
}
#endif
/*