Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 777e61ea authored by Yijing Wang's avatar Yijing Wang Committed by Bjorn Helgaas
Browse files

PCI: Use dev->has_secondary_link to find downstream PCIe links



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: default avatarYijing Wang <wangyijing@huawei.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent c8fc9339
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −2
Original line number Diff line number Diff line
@@ -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);