diff options
-rw-r--r-- | drivers/pci/probe.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 2a943090a3b7..7feacf521e14 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -673,16 +673,20 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | |||
673 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); | 673 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); |
674 | u32 buses, i, j = 0; | 674 | u32 buses, i, j = 0; |
675 | u16 bctl; | 675 | u16 bctl; |
676 | u8 primary, secondary, subordinate; | ||
676 | int broken = 0; | 677 | int broken = 0; |
677 | 678 | ||
678 | pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); | 679 | pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); |
680 | primary = buses & 0xFF; | ||
681 | secondary = (buses >> 8) & 0xFF; | ||
682 | subordinate = (buses >> 16) & 0xFF; | ||
679 | 683 | ||
680 | dev_dbg(&dev->dev, "scanning behind bridge, config %06x, pass %d\n", | 684 | dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n", |
681 | buses & 0xffffff, pass); | 685 | secondary, subordinate, pass); |
682 | 686 | ||
683 | /* Check if setup is sensible at all */ | 687 | /* Check if setup is sensible at all */ |
684 | if (!pass && | 688 | if (!pass && |
685 | ((buses & 0xff) != bus->number || ((buses >> 8) & 0xff) <= bus->number)) { | 689 | (primary != bus->number || secondary <= bus->number)) { |
686 | dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); | 690 | dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); |
687 | broken = 1; | 691 | broken = 1; |
688 | } | 692 | } |
@@ -693,15 +697,15 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | |||
693 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, | 697 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, |
694 | bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT); | 698 | bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT); |
695 | 699 | ||
696 | if ((buses & 0xffff00) && !pcibios_assign_all_busses() && !is_cardbus && !broken) { | 700 | if ((secondary || subordinate) && !pcibios_assign_all_busses() && |
697 | unsigned int cmax, busnr; | 701 | !is_cardbus && !broken) { |
702 | unsigned int cmax; | ||
698 | /* | 703 | /* |
699 | * Bus already configured by firmware, process it in the first | 704 | * Bus already configured by firmware, process it in the first |
700 | * pass and just note the configuration. | 705 | * pass and just note the configuration. |
701 | */ | 706 | */ |
702 | if (pass) | 707 | if (pass) |
703 | goto out; | 708 | goto out; |
704 | busnr = (buses >> 8) & 0xFF; | ||
705 | 709 | ||
706 | /* | 710 | /* |
707 | * If we already got to this bus through a different bridge, | 711 | * If we already got to this bus through a different bridge, |
@@ -710,13 +714,13 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | |||
710 | * However, we continue to descend down the hierarchy and | 714 | * However, we continue to descend down the hierarchy and |
711 | * scan remaining child buses. | 715 | * scan remaining child buses. |
712 | */ | 716 | */ |
713 | child = pci_find_bus(pci_domain_nr(bus), busnr); | 717 | child = pci_find_bus(pci_domain_nr(bus), secondary); |
714 | if (!child) { | 718 | if (!child) { |
715 | child = pci_add_new_bus(bus, dev, busnr); | 719 | child = pci_add_new_bus(bus, dev, secondary); |
716 | if (!child) | 720 | if (!child) |
717 | goto out; | 721 | goto out; |
718 | child->primary = buses & 0xFF; | 722 | child->primary = primary; |
719 | child->subordinate = (buses >> 16) & 0xFF; | 723 | child->subordinate = subordinate; |
720 | child->bridge_ctl = bctl; | 724 | child->bridge_ctl = bctl; |
721 | } | 725 | } |
722 | 726 | ||