@@ -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: