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