51 lines
2.0 KiB
Diff
51 lines
2.0 KiB
Diff
From: Matthew Garrett <mjg@redhat.com>
|
|
Date: Wed, 9 Jun 2010 20:05:07 +0000 (-0400)
|
|
Subject: PCI: Don't enable aspm before drivers have had a chance to veto it
|
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjbarnes%2Fpci-2.6.git;a=commitdiff_plain;h=8f0b08c29f1df91315e48adce04462eb23671099
|
|
|
|
PCI: Don't enable aspm before drivers have had a chance to veto it
|
|
|
|
The aspm code will currently set the configured aspm policy before drivers
|
|
have had an opportunity to indicate that their hardware doesn't support it.
|
|
Unfortunately, putting some hardware in L0 or L1 can result in the hardware
|
|
no longer responding to any requests, even after aspm is disabled. It makes
|
|
more sense to leave aspm policy at the BIOS defaults at initial setup time,
|
|
reconfiguring it after pci_enable_device() is called. This allows the
|
|
driver to blacklist individual devices beforehand.
|
|
|
|
Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
|
|
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
|
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
|
|
---
|
|
|
|
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
|
|
index be53d98..7122281 100644
|
|
--- a/drivers/pci/pcie/aspm.c
|
|
+++ b/drivers/pci/pcie/aspm.c
|
|
@@ -588,11 +588,23 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
|
|
* update through pcie_aspm_cap_init().
|
|
*/
|
|
pcie_aspm_cap_init(link, blacklist);
|
|
- pcie_config_aspm_path(link);
|
|
|
|
/* Setup initial Clock PM state */
|
|
pcie_clkpm_cap_init(link, blacklist);
|
|
- pcie_set_clkpm(link, policy_to_clkpm_state(link));
|
|
+
|
|
+ /*
|
|
+ * At this stage drivers haven't had an opportunity to change the
|
|
+ * link policy setting. Enabling ASPM on broken hardware can cripple
|
|
+ * it even before the driver has had a chance to disable ASPM, so
|
|
+ * default to a safe level right now. If we're enabling ASPM beyond
|
|
+ * the BIOS's expectation, we'll do so once pci_enable_device() is
|
|
+ * called.
|
|
+ */
|
|
+ if (aspm_policy != POLICY_POWERSAVE) {
|
|
+ pcie_config_aspm_path(link);
|
|
+ pcie_set_clkpm(link, policy_to_clkpm_state(link));
|
|
+ }
|
|
+
|
|
unlock:
|
|
mutex_unlock(&aspm_lock);
|
|
out:
|