PCI: Make pcie_find_root_port() work for Root Ports
Commit6ae72bfa65
("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:6ae72bfa65
("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.com Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
b3a9e3b962
commit
5396956cc7
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue