Commit 71c3511c authored by Rajesh Shah's avatar Rajesh Shah Committed by Greg Kroah-Hartman

[PATCH] acpi bridge hotadd: Make pcibios_fixup_bus() hot-plug safe

PCI scan code calls the arch specific pcibios_fixup_bus() each time it scans a
new bridge.  For root bridge hot-plug, the bridge and it's attached devices
may not have been configured properly yet, so it's not safe to claim those
resources at this time.

This code goes away when we clean up the way pci resources are claimed (in
pci_enable_device()), so this is only a stopgap fix.
Signed-off-by: default avatarRajesh Shah <rajesh.shah@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent fab3fb0a
...@@ -373,6 +373,25 @@ void pcibios_bus_to_resource(struct pci_dev *dev, ...@@ -373,6 +373,25 @@ void pcibios_bus_to_resource(struct pci_dev *dev,
res->end = region->end + offset; res->end = region->end + offset;
} }
static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
{
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
struct resource *devr = &dev->resource[idx];
if (!dev->bus)
return 0;
for (i=0; i<PCI_BUS_NUM_RESOURCES; i++) {
struct resource *busr = dev->bus->resource[i];
if (!busr || ((busr->flags ^ devr->flags) & type_mask))
continue;
if ((devr->start) && (devr->start >= busr->start) &&
(devr->end <= busr->end))
return 1;
}
return 0;
}
static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
{ {
struct pci_bus_region region; struct pci_bus_region region;
...@@ -386,7 +405,8 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) ...@@ -386,7 +405,8 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
region.start = dev->resource[i].start; region.start = dev->resource[i].start;
region.end = dev->resource[i].end; region.end = dev->resource[i].end;
pcibios_bus_to_resource(dev, &dev->resource[i], &region); pcibios_bus_to_resource(dev, &dev->resource[i], &region);
pci_claim_resource(dev, i); if ((is_valid_resource(dev, i)))
pci_claim_resource(dev, i);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment