summaryrefslogtreecommitdiffstats
path: root/drivers/pci/pcie
diff options
context:
space:
mode:
authorMyron Stowe <myron.stowe@redhat.com>2013-01-31 16:29:25 -0700
committerBjorn Helgaas <bhelgaas@google.com>2013-02-01 15:18:19 -0700
commit84fb913c43475e0d1e061220ef4622e3e82e91d6 (patch)
tree0b39d29400055705017a38e14db85bfe1d1aa823 /drivers/pci/pcie
parentd1c3ed669a2d452cacfb48c2d171a1f364dae2ed (diff)
downloadlinux-84fb913c43475e0d1e061220ef4622e3e82e91d6.tar.gz
linux-84fb913c43475e0d1e061220ef4622e3e82e91d6.tar.bz2
linux-84fb913c43475e0d1e061220ef4622e3e82e91d6.zip
PCI/ASPM: Deallocate upstream link state even if device is not PCIe
On PCI bus hotplug removal, pcie_aspm_exit_link_state() can potentially skip parent devices that have link_state allocated. Instead of exiting early if a given device is not PCIe, check whether or not the device's parent has link_state allocated. This enables pcie_aspm_exit_link_state() to properly clean up parent link_state when the last function in a slot might not be PCIe. Reported-by: Joe Lawrence <joe.lawrence@stratus.com> Tested-by: Joe Lawrence <joe.lawrence@stratus.com> Signed-off-by: Myron Stowe <myron.stowe@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/pcie')
-rw-r--r--drivers/pci/pcie/aspm.c5
1 files changed, 1 insertions, 4 deletions
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index b52630b8eada..ca44115ca1f1 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -634,10 +634,7 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
struct pci_dev *parent = pdev->bus->self;
struct pcie_link_state *link, *root, *parent_link;
- if (!pci_is_pcie(pdev) || !parent || !parent->link_state)
- return;
- if ((pci_pcie_type(parent) != PCI_EXP_TYPE_ROOT_PORT) &&
- (pci_pcie_type(parent) != PCI_EXP_TYPE_DOWNSTREAM))
+ if (!parent || !parent->link_state)
return;
down_read(&pci_bus_sem);