diff options
| -rw-r--r-- | drivers/pci/probe.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 00ba6a03dca5..3c9834d80850 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -433,7 +433,7 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max | |||
| 433 | { | 433 | { |
| 434 | struct pci_bus *child; | 434 | struct pci_bus *child; |
| 435 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); | 435 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); |
| 436 | u32 buses, i; | 436 | u32 buses, i, j = 0; |
| 437 | u16 bctl; | 437 | u16 bctl; |
| 438 | 438 | ||
| 439 | pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); | 439 | pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); |
| @@ -543,10 +543,29 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max | |||
| 543 | * as cards with a PCI-to-PCI bridge can be | 543 | * as cards with a PCI-to-PCI bridge can be |
| 544 | * inserted later. | 544 | * inserted later. |
| 545 | */ | 545 | */ |
| 546 | for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) | 546 | for (i=0; i<CARDBUS_RESERVE_BUSNR; i++) { |
| 547 | struct pci_bus *parent = bus; | ||
| 547 | if (pci_find_bus(pci_domain_nr(bus), | 548 | if (pci_find_bus(pci_domain_nr(bus), |
| 548 | max+i+1)) | 549 | max+i+1)) |
| 549 | break; | 550 | break; |
| 551 | while (parent->parent) { | ||
| 552 | if ((!pcibios_assign_all_busses()) && | ||
| 553 | (parent->subordinate > max) && | ||
| 554 | (parent->subordinate <= max+i)) { | ||
| 555 | j = 1; | ||
| 556 | } | ||
| 557 | parent = parent->parent; | ||
| 558 | } | ||
| 559 | if (j) { | ||
| 560 | /* | ||
| 561 | * Often, there are two cardbus bridges | ||
| 562 | * -- try to leave one valid bus number | ||
| 563 | * for each one. | ||
| 564 | */ | ||
| 565 | i /= 2; | ||
| 566 | break; | ||
| 567 | } | ||
| 568 | } | ||
| 550 | max += i; | 569 | max += i; |
| 551 | pci_fixup_parent_subordinate_busnr(child, max); | 570 | pci_fixup_parent_subordinate_busnr(child, max); |
| 552 | } | 571 | } |
| @@ -561,6 +580,22 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max | |||
| 561 | 580 | ||
| 562 | sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number); | 581 | sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number); |
| 563 | 582 | ||
| 583 | while (bus->parent) { | ||
| 584 | if ((child->subordinate > bus->subordinate) || | ||
| 585 | (child->number > bus->subordinate) || | ||
| 586 | (child->number < bus->number) || | ||
| 587 | (child->subordinate < bus->number)) { | ||
| 588 | printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) may be " | ||
| 589 | "hidden behind%s bridge #%02x (-#%02x)%s\n", | ||
| 590 | child->number, child->subordinate, | ||
| 591 | bus->self->transparent ? " transparent" : " ", | ||
| 592 | bus->number, bus->subordinate, | ||
| 593 | pcibios_assign_all_busses() ? " " : | ||
| 594 | " (try 'pci=assign-busses')"); | ||
| 595 | } | ||
| 596 | bus = bus->parent; | ||
| 597 | } | ||
| 598 | |||
| 564 | return max; | 599 | return max; |
| 565 | } | 600 | } |
| 566 | 601 | ||
