|
@@ -77,59 +77,6 @@ int pcibios_scanned;
|
|
|
*/
|
|
|
DEFINE_SPINLOCK(pci_config_lock);
|
|
|
|
|
|
-/*
|
|
|
- * Several buggy motherboards address only 16 devices and mirror
|
|
|
- * them to next 16 IDs. We try to detect this `feature' on all
|
|
|
- * primary buses (those containing host bridges as they are
|
|
|
- * expected to be unique) and remove the ghost devices.
|
|
|
- */
|
|
|
-
|
|
|
-static void __devinit pcibios_fixup_ghosts(struct pci_bus *b)
|
|
|
-{
|
|
|
- struct list_head *ln, *mn;
|
|
|
- struct pci_dev *d, *e;
|
|
|
- int mirror = PCI_DEVFN(16,0);
|
|
|
- int seen_host_bridge = 0;
|
|
|
- int i;
|
|
|
-
|
|
|
- DBG("PCI: Scanning for ghost devices on bus %d\n", b->number);
|
|
|
- list_for_each(ln, &b->devices) {
|
|
|
- d = pci_dev_b(ln);
|
|
|
- if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
|
|
|
- seen_host_bridge++;
|
|
|
- for (mn=ln->next; mn != &b->devices; mn=mn->next) {
|
|
|
- e = pci_dev_b(mn);
|
|
|
- if (e->devfn != d->devfn + mirror ||
|
|
|
- e->vendor != d->vendor ||
|
|
|
- e->device != d->device ||
|
|
|
- e->class != d->class)
|
|
|
- continue;
|
|
|
- for(i=0; i<PCI_NUM_RESOURCES; i++)
|
|
|
- if (e->resource[i].start != d->resource[i].start ||
|
|
|
- e->resource[i].end != d->resource[i].end ||
|
|
|
- e->resource[i].flags != d->resource[i].flags)
|
|
|
- continue;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (mn == &b->devices)
|
|
|
- return;
|
|
|
- }
|
|
|
- if (!seen_host_bridge)
|
|
|
- return;
|
|
|
- printk(KERN_WARNING "PCI: Ignoring ghost devices on bus %02x\n", b->number);
|
|
|
-
|
|
|
- ln = &b->devices;
|
|
|
- while (ln->next != &b->devices) {
|
|
|
- d = pci_dev_b(ln->next);
|
|
|
- if (d->devfn >= mirror) {
|
|
|
- list_del(&d->global_list);
|
|
|
- list_del(&d->bus_list);
|
|
|
- kfree(d);
|
|
|
- } else
|
|
|
- ln = ln->next;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
|
|
|
{
|
|
|
struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];
|
|
@@ -152,7 +99,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
|
|
|
{
|
|
|
struct pci_dev *dev;
|
|
|
|
|
|
- pcibios_fixup_ghosts(b);
|
|
|
pci_read_bridge_bases(b);
|
|
|
list_for_each_entry(dev, &b->devices, bus_list)
|
|
|
pcibios_fixup_device_resources(dev);
|