Move code polling for the Link Training bit to clear into a function of 
its own.

Signed-off-by: Maciej W. Rozycki <ma...@orcam.me.uk>
---
New change in v9.
---
 drivers/pci/pci.c |   37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

linux-pcie-wait-for-link-status.diff
Index: linux-macro/drivers/pci/pci.c
===================================================================
--- linux-macro.orig/drivers/pci/pci.c
+++ linux-macro/drivers/pci/pci.c
@@ -4850,6 +4850,28 @@ static int pci_pm_reset(struct pci_dev *
 }
 
 /**
+ * pcie_wait_for_link_status - Wait for link training end
+ * @pdev: Device whose link to wait for.
+ *
+ * Return TRUE if successful, or FALSE if training has not completed
+ * within PCIE_LINK_RETRAIN_TIMEOUT_MS milliseconds.
+ */
+static bool pcie_wait_for_link_status(struct pci_dev *pdev)
+{
+       unsigned long end_jiffies;
+       u16 lnksta;
+
+       end_jiffies = jiffies + msecs_to_jiffies(PCIE_LINK_RETRAIN_TIMEOUT_MS);
+       do {
+               pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnksta);
+               if (!(lnksta & PCI_EXP_LNKSTA_LT))
+                       break;
+               msleep(1);
+       } while (time_before(jiffies, end_jiffies));
+       return !(lnksta & PCI_EXP_LNKSTA_LT);
+}
+
+/**
  * pcie_wait_for_link_delay - Wait until link is active or inactive
  * @pdev: Bridge device
  * @active: waiting for active or inactive?
@@ -4916,14 +4938,11 @@ bool pcie_wait_for_link(struct pci_dev *
  * pcie_retrain_link - Request a link retrain and wait for it to complete
  * @pdev: Device whose link to retrain.
  *
- * Return TRUE if successful, or FALSE if training has not completed
- * within PCIE_LINK_RETRAIN_TIMEOUT_MS milliseconds.
+ * Return TRUE if successful, or FALSE if training has not completed.
  */
 bool pcie_retrain_link(struct pci_dev *pdev)
 {
-       unsigned long end_jiffies;
        u16 lnkctl;
-       u16 lnksta;
 
        pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &lnkctl);
        lnkctl |= PCI_EXP_LNKCTL_RL;
@@ -4938,15 +4957,7 @@ bool pcie_retrain_link(struct pci_dev *p
                pcie_capability_write_word(pdev, PCI_EXP_LNKCTL, lnkctl);
        }
 
-       /* Wait for link training end. Break out after waiting for timeout. */
-       end_jiffies = jiffies + msecs_to_jiffies(PCIE_LINK_RETRAIN_TIMEOUT_MS);
-       do {
-               pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnksta);
-               if (!(lnksta & PCI_EXP_LNKSTA_LT))
-                       break;
-               msleep(1);
-       } while (time_before(jiffies, end_jiffies));
-       return !(lnksta & PCI_EXP_LNKSTA_LT);
+       return pcie_wait_for_link_status(pdev);
 }
 
 /*

Reply via email to