Commit 5396956c authored by Mika Westerberg's avatar Mika Westerberg Committed by Bjorn Helgaas

PCI: Make pcie_find_root_port() work for Root Ports

Commit 6ae72bfa ("PCI: Unify pcie_find_root_port() and
pci_find_pcie_root_port()") broke acpi_pci_bridge_d3() because calling
pcie_find_root_port() on a Root Port returned NULL when it should return
the Root Port, which in turn broke power management of PCIe hierarchies.

Rework pcie_find_root_port() so it returns its argument when it is already
a Root Port.

[bhelgaas: test device only once, test for PCIe]
Fixes: 6ae72bfa ("PCI: Unify pcie_find_root_port() and pci_find_pcie_root_port()")
Link: https://lore.kernel.org/r/20200622161248.51099-1-mika.westerberg@linux.intel.comSigned-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent b3a9e3b9
...@@ -2169,12 +2169,11 @@ static inline int pci_pcie_type(const struct pci_dev *dev) ...@@ -2169,12 +2169,11 @@ static inline int pci_pcie_type(const struct pci_dev *dev)
*/ */
static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev) static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
{ {
struct pci_dev *bridge = pci_upstream_bridge(dev); while (dev) {
if (pci_is_pcie(dev) &&
while (bridge) { pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
if (pci_pcie_type(bridge) == PCI_EXP_TYPE_ROOT_PORT) return dev;
return bridge; dev = pci_upstream_bridge(dev);
bridge = pci_upstream_bridge(bridge);
} }
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment