[PATCH] acpi bridge hotadd: Prevent duplicate bus numbers when scanning PCI bridge
When hot-plugging a root bridge, as we try to assign bus numbers we may find that the hotplugged hieratchy has more PCI to PCI bridges (i.e. bus requirements) than available. Make sure we don't step over an existing bus when that happens. 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>
This commit is contained in:
parent
71c3511c22
commit
cc57450f5c
1 changed files with 10 additions and 2 deletions
|
@ -411,7 +411,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
|
|||
{
|
||||
struct pci_bus *child;
|
||||
int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
|
||||
u32 buses;
|
||||
u32 buses, i;
|
||||
u16 bctl;
|
||||
|
||||
pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
|
||||
|
@ -470,6 +470,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
|
|||
/* Clear errors */
|
||||
pci_write_config_word(dev, PCI_STATUS, 0xffff);
|
||||
|
||||
/* Prevent assigning a bus number that already exists.
|
||||
* This can happen when a bridge is hot-plugged */
|
||||
if (pci_find_bus(pci_domain_nr(bus), max+1))
|
||||
return max;
|
||||
child = pci_alloc_child_bus(bus, dev, ++max);
|
||||
buses = (buses & 0xff000000)
|
||||
| ((unsigned int)(child->primary) << 0)
|
||||
|
@ -501,7 +505,11 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
|
|||
* as cards with a PCI-to-PCI bridge can be
|
||||
* inserted later.
|
||||
*/
|
||||
max += CARDBUS_RESERVE_BUSNR;
|
||||
for (i=0; i<CARDBUS_RESERVE_BUSNR; i++)
|
||||
if (pci_find_bus(pci_domain_nr(bus),
|
||||
max+i+1))
|
||||
break;
|
||||
max += i;
|
||||
}
|
||||
/*
|
||||
* Set the subordinate bus number to its real value.
|
||||
|
|
Loading…
Reference in a new issue