diff options
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 12 |
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. |