From 1965f66e7db08d1ebccd24a59043eba826cc1ce8 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Mon, 10 Sep 2012 17:19:33 -0700 Subject: 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 Reported-by: VL Tested-by: VL Signed-off-by: Yinghai Lu Signed-off-by: Bjorn Helgaas Cc: stable@vger.kernel.org --- drivers/pci/probe.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'drivers/pci') diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 9f8a6b79a8e..61859d04cfe 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, /* Check if setup is sensible at all */ if (!pass && - (primary != bus->number || secondary <= bus->number)) { - dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); + (primary != bus->number || secondary <= bus->number || + secondary > subordinate)) { + dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", + secondary, subordinate); broken = 1; } -- cgit v1.2.3-70-g09d2 From 817a268516f3aaf9e54c5a0f880de37d03ef4c79 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Fri, 14 Sep 2012 17:48:41 -0700 Subject: PCI: Use correct type when freeing bus resource list Should use struct pci_bus_resource instead of struct pci_host_bridge_window Commit 45ca9e9730 ("PCI: add helpers for building PCI bus resource lists") added pci_free_resource_list() and used it in pci_bus_remove_resources(). Later it was also used for host bridge aperture lists, which was fine until commit 0efd5aab41 ("PCI: add struct pci_host_bridge_window with CPU/bus address offset"). That commit added offset information, so we needed a struct pci_host_bridge_window that was separate from struct pci_bus_resource. Commit 0efd5aab41 should have split the host bridge aperture users of pci_free_resource_list() from the pci_bus_resource user (pci_bus_remove_resources()), but it did not. [bhelgaas: changelog -- 0efd5aab41 was mine, so this is all my fault] Signed-off-by: Yinghai Lu Signed-off-by: Bjorn Helgaas --- drivers/pci/bus.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'drivers/pci') diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index 4b0970b46e0..6241fd05bd4 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c @@ -87,11 +87,15 @@ EXPORT_SYMBOL_GPL(pci_bus_resource_n); void pci_bus_remove_resources(struct pci_bus *bus) { int i; + struct pci_bus_resource *bus_res, *tmp; for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) bus->resource[i] = NULL; - pci_free_resource_list(&bus->resources); + list_for_each_entry_safe(bus_res, tmp, &bus->resources, list) { + list_del(&bus_res->list); + kfree(bus_res); + } } /** -- cgit v1.2.3-70-g09d2