PCI: Use dev->has_secondary_link to find downstream PCIe links
authorYijing Wang <wangyijing@huawei.com>
Thu, 21 May 2015 07:05:04 +0000 (15:05 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 29 May 2015 20:35:26 +0000 (15:35 -0500)
Previously we assumed that PCIe Root Ports and Downstream Ports had Links
on their secondary side.  That is true in most systems, but it is possible
to connect a switch with either an Upstream or a Downstream Port leading
downstream.

Instead of relying on the component type to identify devices that have
links leading downstream, use the "dev->has_secondary_link" field.

[bhelgaas: changelog]
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pcie/aer/aerdrv_core.c
drivers/pci/probe.c
drivers/pci/vc.c

index 5653ea9..9803e3d 100644 (file)
@@ -425,8 +425,7 @@ static pci_ers_result_t reset_link(struct pci_dev *dev)
 
        if (driver && driver->reset_link) {
                status = driver->reset_link(udev);
-       } else if (pci_pcie_type(udev) == PCI_EXP_TYPE_DOWNSTREAM ||
-               pci_pcie_type(udev) == PCI_EXP_TYPE_ROOT_PORT) {
+       } else if (udev->has_secondary_link) {
                status = default_reset_link(udev);
        } else {
                dev_printk(KERN_DEBUG, &dev->dev,
index 96dcd7b..d405d27 100644 (file)
@@ -1629,7 +1629,7 @@ static int only_one_child(struct pci_bus *bus)
                return 0;
        if (pci_pcie_type(parent) == PCI_EXP_TYPE_ROOT_PORT)
                return 1;
-       if (pci_pcie_type(parent) == PCI_EXP_TYPE_DOWNSTREAM &&
+       if (parent->has_secondary_link &&
            !pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS))
                return 1;
        return 0;
index 7e1304d..dfbab61 100644 (file)
@@ -108,8 +108,7 @@ static void pci_vc_enable(struct pci_dev *dev, int pos, int res)
        struct pci_dev *link = NULL;
 
        /* Enable VCs from the downstream device */
-       if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT ||
-           pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)
+       if (!dev->has_secondary_link)
                return;
 
        ctrl_pos = pos + PCI_VC_RES_CTRL + (res * PCI_CAP_VC_PER_VC_SIZEOF);