diff options
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 10 | 
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e3a49f66982d..5618a8927aa9 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -4717,7 +4717,15 @@ int pcie_retrain_link(struct pci_dev *pdev, bool use_lt)  		pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_RL);  	} -	return pcie_wait_for_link_status(pdev, use_lt, !use_lt); +	rc = pcie_wait_for_link_status(pdev, use_lt, !use_lt); + +	/* +	 * Clear LBMS after a manual retrain so that the bit can be used +	 * to track link speed or width changes made by hardware itself +	 * in attempt to correct unreliable link operation. +	 */ +	pcie_capability_write_word(pdev, PCI_EXP_LNKSTA, PCI_EXP_LNKSTA_LBMS); +	return rc;  }  /**  | 
