Stratus systems have a hierarchy that includes a PCIE Downstream bridge connected to a PCIE Upstream bridge and a PCI Downstream bridge. The system boots with this wrong hierarchy into a crippled mode (USB doesn't work, network doesn't work ...). Avoiding the Downstream bridge check in only_one_child() causes all the bridges to be enumerated and the system to function properly. Unfortunately this hardware is currently available so we should at least keep it functional. Signed-off-by: Prarit Bhargava <prarit@xxxxxxxxxx> Cc: mstowe@xxxxxxxxxx Cc: ddutile@xxxxxxxxxx Cc: jparadis@xxxxxxxxxx Cc: matthew.wilcox@xxxxxxxxxxxxxxx Cc: jbarnes@xxxxxxxxxxxxxxxx --- drivers/pci/probe.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 04e74f4..bc76812 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -10,6 +10,7 @@ #include <linux/module.h> #include <linux/cpumask.h> #include <linux/pci-aspm.h> +#include <linux/dmi.h> #include "pci.h" #define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ @@ -1275,7 +1276,15 @@ static int only_one_child(struct pci_bus *bus) struct pci_dev *parent = bus->self; if (!parent || !pci_is_pcie(parent)) return 0; - if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT || + if (parent->pcie_type == PCI_EXP_TYPE_ROOT_PORT) + return 1; + /* + * Stratus/NEC ftServer systems have a broken PCIE hierarchy in which + * one upstream and one downstream port are plugged into a downstream + * port. Avoiding the downstream port check here results in a + * functional system. + */ + if (!dmi_name_in_vendors("ftServer") && parent->pcie_type == PCI_EXP_TYPE_DOWNSTREAM) return 1; return 0; -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html