diff options
author | Thierry Reding <treding@nvidia.com> | 2017-08-17 07:06:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-08-18 19:14:37 -0400 |
commit | b6f6d56c91f5261c55edef2df300698c4486b669 (patch) | |
tree | 29d44f8bdb6e0e9fd844b975bab9d2f6144c0aff | |
parent | cdbeb633ca71a02b7b63bfeb94994bf4e1a0b894 (diff) |
PCI: Allow PCI express root ports to find themselves
If the pci_find_pcie_root_port() function is called on a root port
itself, return the root port rather than NULL.
This effectively reverts commit 0e405232871d6 ("PCI: fix oops when
try to find Root Port for a PCI device") which added an extra check
that would now be redundant.
Fixes: a99b646afa8a ("PCI: Disable PCIe Relaxed Ordering if unsupported")
Fixes: c56d4450eb68 ("PCI: Turn off Request Attributes to avoid Chelsio T5 Completion erratum")
Signed-off-by: Thierry Reding <treding@nvidia.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Shawn Lin <shawn.lin@rock-chips.com>
Tested-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/pci/pci.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index da5570cf5c6a..fdf65a6c13f6 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -514,7 +514,7 @@ EXPORT_SYMBOL(pci_find_resource); | |||
514 | */ | 514 | */ |
515 | struct pci_dev *pci_find_pcie_root_port(struct pci_dev *dev) | 515 | struct pci_dev *pci_find_pcie_root_port(struct pci_dev *dev) |
516 | { | 516 | { |
517 | struct pci_dev *bridge, *highest_pcie_bridge = NULL; | 517 | struct pci_dev *bridge, *highest_pcie_bridge = dev; |
518 | 518 | ||
519 | bridge = pci_upstream_bridge(dev); | 519 | bridge = pci_upstream_bridge(dev); |
520 | while (bridge && pci_is_pcie(bridge)) { | 520 | while (bridge && pci_is_pcie(bridge)) { |
@@ -522,11 +522,10 @@ struct pci_dev *pci_find_pcie_root_port(struct pci_dev *dev) | |||
522 | bridge = pci_upstream_bridge(bridge); | 522 | bridge = pci_upstream_bridge(bridge); |
523 | } | 523 | } |
524 | 524 | ||
525 | if (highest_pcie_bridge && | 525 | if (pci_pcie_type(highest_pcie_bridge) != PCI_EXP_TYPE_ROOT_PORT) |
526 | pci_pcie_type(highest_pcie_bridge) == PCI_EXP_TYPE_ROOT_PORT) | 526 | return NULL; |
527 | return highest_pcie_bridge; | ||
528 | 527 | ||
529 | return NULL; | 528 | return highest_pcie_bridge; |
530 | } | 529 | } |
531 | EXPORT_SYMBOL(pci_find_pcie_root_port); | 530 | EXPORT_SYMBOL(pci_find_pcie_root_port); |
532 | 531 | ||