c431ada45d
When you hot-plug a (root) bridge hierarchy, it may have p2p bridges and devices attached to it that have not been configured by firmware. In this case, we need to configure the devices before starting them. This patch separates device start from device scan so that we can introduce the configuration step in the middle. I kept the existing semantics for pci_scan_bus() since there are a huge number of callers to that function. Also, I have no way of testing the changes I made to the parisc files, so this needs review by those folks. Sorry for the massive cross-post, this touches files in many different places. Signed-off-by: Rajesh Shah <rajesh.shah@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
56 lines
1.2 KiB
C
56 lines
1.2 KiB
C
/*
|
|
* legacy.c - traditional, old school PCI bus probing
|
|
*/
|
|
#include <linux/init.h>
|
|
#include <linux/pci.h>
|
|
#include "pci.h"
|
|
|
|
/*
|
|
* Discover remaining PCI buses in case there are peer host bridges.
|
|
* We use the number of last PCI bus provided by the PCI BIOS.
|
|
*/
|
|
static void __devinit pcibios_fixup_peer_bridges(void)
|
|
{
|
|
int n, devfn;
|
|
|
|
if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff)
|
|
return;
|
|
DBG("PCI: Peer bridge fixup\n");
|
|
|
|
for (n=0; n <= pcibios_last_bus; n++) {
|
|
u32 l;
|
|
if (pci_find_bus(0, n))
|
|
continue;
|
|
for (devfn = 0; devfn < 256; devfn += 8) {
|
|
if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) &&
|
|
l != 0x0000 && l != 0xffff) {
|
|
DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l);
|
|
printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n);
|
|
pci_scan_bus(n, &pci_root_ops, NULL);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static int __init pci_legacy_init(void)
|
|
{
|
|
if (!raw_pci_ops) {
|
|
printk("PCI: System does not support PCI\n");
|
|
return 0;
|
|
}
|
|
|
|
if (pcibios_scanned++)
|
|
return 0;
|
|
|
|
printk("PCI: Probing PCI hardware\n");
|
|
pci_root_bus = pcibios_scan_root(0);
|
|
if (pci_root_bus)
|
|
pci_bus_add_devices(pci_root_bus);
|
|
|
|
pcibios_fixup_peer_bridges();
|
|
|
|
return 0;
|
|
}
|
|
|
|
subsys_initcall(pci_legacy_init);
|