Skip to content

Commit 5396956

Browse files
westeribjorn-helgaas
authored andcommitted
PCI: Make pcie_find_root_port() work for Root Ports
Commit 6ae72bf ("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: 6ae72bf ("PCI: Unify pcie_find_root_port() and pci_find_pcie_root_port()") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mika Westerberg <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent b3a9e3b commit 5396956

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

include/linux/pci.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2169,12 +2169,11 @@ static inline int pci_pcie_type(const struct pci_dev *dev)
21692169
*/
21702170
static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
21712171
{
2172-
struct pci_dev *bridge = pci_upstream_bridge(dev);
2173-
2174-
while (bridge) {
2175-
if (pci_pcie_type(bridge) == PCI_EXP_TYPE_ROOT_PORT)
2176-
return bridge;
2177-
bridge = pci_upstream_bridge(bridge);
2172+
while (dev) {
2173+
if (pci_is_pcie(dev) &&
2174+
pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
2175+
return dev;
2176+
dev = pci_upstream_bridge(dev);
21782177
}
21792178

21802179
return NULL;

0 commit comments

Comments
 (0)