aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-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.