aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorRajesh Shah <rajesh.shah@intel.com>2005-04-28 03:25:47 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2005-06-28 00:52:40 -0400
commitcc57450f5c044270d2cf1dd437c1850422262109 (patch)
tree418c7546c443cfc80601da045731f6b5a9f23442 /drivers/pci
parent71c3511c22e8e0648094672abec898b3bf84c18b (diff)
[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>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/probe.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 3dc00f0ca8a0..6186f4d7b119 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -411,7 +411,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
411{ 411{
412 struct pci_bus *child; 412 struct pci_bus *child;
413 int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); 413 int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
414 u32 buses; 414 u32 buses, i;
415 u16 bctl; 415 u16 bctl;
416 416
417 pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); 417 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
470 /* Clear errors */ 470 /* Clear errors */
471 pci_write_config_word(dev, PCI_STATUS, 0xffff); 471 pci_write_config_word(dev, PCI_STATUS, 0xffff);
472 472
473 /* Prevent assigning a bus number that already exists.
474 * This can happen when a bridge is hot-plugged */
475 if (pci_find_bus(pci_domain_nr(bus), max+1))
476 return max;
473 child = pci_alloc_child_bus(bus, dev, ++max); 477 child = pci_alloc_child_bus(bus, dev, ++max);
474 buses = (buses & 0xff000000) 478 buses = (buses & 0xff000000)
475 | ((unsigned int)(child->primary) << 0) 479 | ((unsigned int)(child->primary) << 0)
@@ -501,7 +505,11 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max
501 * as cards with a PCI-to-PCI bridge can be 505 * as cards with a PCI-to-PCI bridge can be
502 * inserted later. 506 * inserted later.
503 */ 507 */
504 max += CARDBUS_RESERVE_BUSNR; 508 for (i=0; i<CARDBUS_RESERVE_BUSNR; i++)
509 if (pci_find_bus(pci_domain_nr(bus),
510 max+i+1))
511 break;
512 max += i;
505 } 513 }
506 /* 514 /*
507 * Set the subordinate bus number to its real value. 515 * Set the subordinate bus number to its real value.