diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-09-10 20:19:33 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2012-09-18 18:47:54 -0400 |
commit | 1965f66e7db08d1ebccd24a59043eba826cc1ce8 (patch) | |
tree | cd7955992bdf7ebc44afa3d247349a41af94d3e4 /drivers/pci | |
parent | 55d512e245bc7699a8800e23df1a24195dd08217 (diff) |
PCI: Check P2P bridge for invalid secondary/subordinate range
For bridges with "secondary > subordinate", i.e., invalid bus number
apertures, we don't enumerate anything behind the bridge unless the
user specified "pci=assign-busses".
This patch makes us automatically try to reassign the downstream bus
numbers in this case (just for that bridge, not for all bridges as
"pci=assign-busses" does).
We don't discover all the devices on the Intel DP43BF motherboard
without this change (or "pci=assign-busses") because its BIOS configures
a bridge as:
pci 0000:00:1e.0: PCI bridge to [bus 20-08] (subtractive decode)
[bhelgaas: changelog, change message to dev_info]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=18412
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=625754
Reported-by: Brian C. Huffman <bhuffman@graze.net>
Reported-by: VL <vl.homutov@gmail.com>
Tested-by: VL <vl.homutov@gmail.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 9f8a6b79a8ec..61859d04cfea 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -729,8 +729,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | |||
729 | 729 | ||
730 | /* Check if setup is sensible at all */ | 730 | /* Check if setup is sensible at all */ |
731 | if (!pass && | 731 | if (!pass && |
732 | (primary != bus->number || secondary <= bus->number)) { | 732 | (primary != bus->number || secondary <= bus->number || |
733 | dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); | 733 | secondary > subordinate)) { |
734 | dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", | ||
735 | secondary, subordinate); | ||
734 | broken = 1; | 736 | broken = 1; |
735 | } | 737 | } |
736 | 738 | ||