PCI/e1000e: Add and use pci_disable_link_state_locked()
[pandora-kernel.git] / drivers / pci / pcie / aspm.c
index 3eb667b..6892601 100644 (file)
@@ -734,7 +734,7 @@ void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
  * pci_disable_link_state - disable pci device's link state, so the link will
  * never enter specific states
  */
-void pci_disable_link_state(struct pci_dev *pdev, int state)
+static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem)
 {
        struct pci_dev *parent = pdev->bus->self;
        struct pcie_link_state *link;
@@ -747,7 +747,8 @@ void pci_disable_link_state(struct pci_dev *pdev, int state)
        if (!parent || !parent->link_state)
                return;
 
-       down_read(&pci_bus_sem);
+       if (sem)
+               down_read(&pci_bus_sem);
        mutex_lock(&aspm_lock);
        link = parent->link_state;
        if (state & PCIE_LINK_STATE_L0S)
@@ -761,7 +762,19 @@ void pci_disable_link_state(struct pci_dev *pdev, int state)
                pcie_set_clkpm(link, 0);
        }
        mutex_unlock(&aspm_lock);
-       up_read(&pci_bus_sem);
+       if (sem)
+               up_read(&pci_bus_sem);
+}
+
+void pci_disable_link_state_locked(struct pci_dev *pdev, int state)
+{
+       __pci_disable_link_state(pdev, state, false);
+}
+EXPORT_SYMBOL(pci_disable_link_state_locked);
+
+void pci_disable_link_state(struct pci_dev *pdev, int state)
+{
+       __pci_disable_link_state(pdev, state, true);
 }
 EXPORT_SYMBOL(pci_disable_link_state);