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