|
@@ -17,6 +17,7 @@
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/jiffies.h>
|
|
#include <linux/jiffies.h>
|
|
|
|
+#include <linux/delay.h>
|
|
#include <linux/pci-aspm.h>
|
|
#include <linux/pci-aspm.h>
|
|
#include "../pci.h"
|
|
#include "../pci.h"
|
|
|
|
|
|
@@ -75,6 +76,8 @@ static const char *policy_str[] = {
|
|
[POLICY_POWERSAVE] = "powersave"
|
|
[POLICY_POWERSAVE] = "powersave"
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#define LINK_RETRAIN_TIMEOUT HZ
|
|
|
|
+
|
|
static int policy_to_aspm_state(struct pci_dev *pdev)
|
|
static int policy_to_aspm_state(struct pci_dev *pdev)
|
|
{
|
|
{
|
|
struct pcie_link_state *link_state = pdev->link_state;
|
|
struct pcie_link_state *link_state = pdev->link_state;
|
|
@@ -238,16 +241,18 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
|
|
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
|
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
|
|
|
|
|
/* Wait for link training end */
|
|
/* Wait for link training end */
|
|
- /* break out after waiting for 1 second */
|
|
|
|
|
|
+ /* break out after waiting for timeout */
|
|
start_jiffies = jiffies;
|
|
start_jiffies = jiffies;
|
|
- while ((jiffies - start_jiffies) < HZ) {
|
|
|
|
|
|
+ for (;;) {
|
|
pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16);
|
|
pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16);
|
|
if (!(reg16 & PCI_EXP_LNKSTA_LT))
|
|
if (!(reg16 & PCI_EXP_LNKSTA_LT))
|
|
break;
|
|
break;
|
|
- cpu_relax();
|
|
|
|
|
|
+ if (time_after(jiffies, start_jiffies + LINK_RETRAIN_TIMEOUT))
|
|
|
|
+ break;
|
|
|
|
+ msleep(1);
|
|
}
|
|
}
|
|
/* training failed -> recover */
|
|
/* training failed -> recover */
|
|
- if ((jiffies - start_jiffies) >= HZ) {
|
|
|
|
|
|
+ if (reg16 & PCI_EXP_LNKSTA_LT) {
|
|
dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure"
|
|
dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure"
|
|
" common clock\n");
|
|
" common clock\n");
|
|
i = 0;
|
|
i = 0;
|