diff mbox

[RFC] pci: Don't enable aspm before drivers have had a chance to veto it

Message ID 1276092618-18591-1-git-send-email-mjg@redhat.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Matthew Garrett June 9, 2010, 2:10 p.m. UTC
None
diff mbox

Patch

diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index be53d98..223b39e 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -562,6 +562,7 @@  void pcie_aspm_init_link_state(struct pci_dev *pdev)
 {
 	struct pcie_link_state *link;
 	int blacklist = !!pcie_aspm_sanity_check(pdev);
+	int orig_policy = aspm_policy;
 
 	if (aspm_disabled || !pci_is_pcie(pdev) || pdev->link_state)
 		return;
@@ -588,11 +589,23 @@  void pcie_aspm_init_link_state(struct pci_dev *pdev)
 	 * update through pcie_aspm_cap_init().
 	 */
 	pcie_aspm_cap_init(link, blacklist);
+
+	/*
+	 * 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. The real policy will be enabled
+	 * once pci_enable_device is called.
+	 */
+	if (aspm_policy == POLICY_POWERSAVE)
+		aspm_policy = POLICY_DEFAULT;
 	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));
+	aspm_policy = orig_policy;
+
 unlock:
 	mutex_unlock(&aspm_lock);
 out: