public inbox for linux-pci@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] PCI: Always lift 2.5GT/s restriction in PCIe failed link retraining
@ 2025-12-08 19:24 Maciej W. Rozycki
  2025-12-08 19:24 ` [PATCH v2 1/3] " Maciej W. Rozycki
                   ` (4 more replies)
  0 siblings, 5 replies; 27+ messages in thread
From: Maciej W. Rozycki @ 2025-12-08 19:24 UTC (permalink / raw)
  To: Bjorn Helgaas, Matthew W Carlis, ALOK TIWARI
  Cc: ashishk, msaggi, sconnor, Lukas Wunner, Ilpo Järvinen, Jiwei,
	guojinhui.liam, ahuang12, sunjw10, linux-pci, linux-kernel

Hi,

 I've figured out that backporting will be less intrusive if an update to 
use `->supported_speeds' is posted as a separate follow-up change.  So it 
is now 2/3 in this series, after 1/3 comprising the original patch, only 
trivially updated.  Then 3/3 moves the maximum link speed determination 
earlier on for an early exit in the PCIE_SPEED_2_5GT case; maybe unlikely, 
but essentially free now, now that we retrieve the speed anyway, and makes 
code a little simpler yet.

 Please let me know if you'd prefer me to fold 2/3 into 1/3 after all.

 Previous iterations:

- v1 at: <https://lore.kernel.org/r/alpine.DEB.2.21.2511290245460.36486@angie.orcam.me.uk/>.

  Maciej

^ permalink raw reply	[flat|nested] 27+ messages in thread
* [PATCH] PCI: Always lift 2.5GT/s restriction in PCIe failed link retraining
@ 2025-12-01  3:52 Maciej W. Rozycki
  2025-12-01  9:45 ` Ilpo Järvinen
  2025-12-04 18:30 ` Matthew W Carlis
  0 siblings, 2 replies; 27+ messages in thread
From: Maciej W. Rozycki @ 2025-12-01  3:52 UTC (permalink / raw)
  To: Bjorn Helgaas, Matthew W Carlis, ALOK TIWARI
  Cc: ashishk, bamstadt, msaggi, sconnor, Lukas Wunner,
	Ilpo Järvinen, Jiwei, guojinhui.liam, ahuang12, sunjw10,
	linux-pci, linux-kernel

Discard Vendor:Device ID matching in the PCIe failed link retraining 
quirk and ignore the link status for the removal of the 2.5GT/s speed 
clamp, whether applied by the quirk itself or the firmware earlier on.  
Revert to the original target link speed if this final link retraining 
has failed.

This is so that link training noise in hot-plug scenarios does not make 
a link remain clamped to the 2.5GT/s speed where an event race has led 
the quirk to apply the speed clamp for one device, only to leave it in 
place for a subsequent device to be plugged in.

Fixes: a89c82249c37 ("PCI: Work around PCIe link training failures")
Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Cc: <stable@vger.kernel.org> # v6.5+
---
 drivers/pci/quirks.c |   50 ++++++++++++++++++--------------------------------
 1 file changed, 18 insertions(+), 32 deletions(-)

linux-pcie-failed-link-retrain-unclamp-always.diff
Index: linux-macro/drivers/pci/quirks.c
===================================================================
--- linux-macro.orig/drivers/pci/quirks.c
+++ linux-macro/drivers/pci/quirks.c
@@ -79,11 +79,10 @@ static bool pcie_lbms_seen(struct pci_de
  * Restrict the speed to 2.5GT/s then with the Target Link Speed field,
  * request a retrain and check the result.
  *
- * If this turns out successful and we know by the Vendor:Device ID it is
- * safe to do so, then lift the restriction, letting the devices negotiate
- * a higher speed.  Also check for a similar 2.5GT/s speed restriction the
- * firmware may have already arranged and lift it with ports that already
- * report their data link being up.
+ * If this turns out successful, or where a 2.5GT/s speed restriction has
+ * been previously arranged by the firmware and the port reports its link
+ * already being up, lift the restriction, in a hope it is safe to do so,
+ * letting the devices negotiate a higher speed.
  *
  * Otherwise revert the speed to the original setting and request a retrain
  * again to remove any residual state, ignoring the result as it's supposed
@@ -94,52 +93,39 @@ static bool pcie_lbms_seen(struct pci_de
  */
 int pcie_failed_link_retrain(struct pci_dev *dev)
 {
-	static const struct pci_device_id ids[] = {
-		{ PCI_VDEVICE(ASMEDIA, 0x2824) }, /* ASMedia ASM2824 */
-		{}
-	};
-	u16 lnksta, lnkctl2;
+	u16 lnksta, lnkctl2, oldlnkctl2;
 	int ret = -ENOTTY;
+	u32 lnkcap;
 
 	if (!pci_is_pcie(dev) || !pcie_downstream_port(dev) ||
 	    !pcie_cap_has_lnkctl2(dev) || !dev->link_active_reporting)
 		return ret;
 
 	pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &lnksta);
+	pcie_capability_read_word(dev, PCI_EXP_LNKCTL2, &oldlnkctl2);
 	if (!(lnksta & PCI_EXP_LNKSTA_DLLLA) && pcie_lbms_seen(dev, lnksta)) {
-		u16 oldlnkctl2;
-
 		pci_info(dev, "broken device, retraining non-functional downstream link at 2.5GT/s\n");
 
-		pcie_capability_read_word(dev, PCI_EXP_LNKCTL2, &oldlnkctl2);
 		ret = pcie_set_target_speed(dev, PCIE_SPEED_2_5GT, false);
-		if (ret) {
-			pci_info(dev, "retraining failed\n");
-			pcie_set_target_speed(dev, PCIE_LNKCTL2_TLS2SPEED(oldlnkctl2),
-					      true);
-			return ret;
-		}
-
-		pcie_capability_read_word(dev, PCI_EXP_LNKSTA, &lnksta);
+		if (ret)
+			goto err;
 	}
 
 	pcie_capability_read_word(dev, PCI_EXP_LNKCTL2, &lnkctl2);
-
-	if ((lnksta & PCI_EXP_LNKSTA_DLLLA) &&
-	    (lnkctl2 & PCI_EXP_LNKCTL2_TLS) == PCI_EXP_LNKCTL2_TLS_2_5GT &&
-	    pci_match_id(ids, dev)) {
-		u32 lnkcap;
-
+	pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &lnkcap);
+	if ((lnkctl2 & PCI_EXP_LNKCTL2_TLS) == PCI_EXP_LNKCTL2_TLS_2_5GT &&
+	    (lnkcap & PCI_EXP_LNKCAP_SLS) != PCI_EXP_LNKCAP_SLS_2_5GB) {
 		pci_info(dev, "removing 2.5GT/s downstream link speed restriction\n");
-		pcie_capability_read_dword(dev, PCI_EXP_LNKCAP, &lnkcap);
 		ret = pcie_set_target_speed(dev, PCIE_LNKCAP_SLS2SPEED(lnkcap), false);
-		if (ret) {
-			pci_info(dev, "retraining failed\n");
-			return ret;
-		}
+		if (ret)
+			goto err;
 	}
 
 	return ret;
+err:
+	pci_info(dev, "retraining failed\n");
+	pcie_set_target_speed(dev, PCIE_LNKCTL2_TLS2SPEED(oldlnkctl2), true);
+	return ret;
 }
 
 static ktime_t fixup_debug_start(struct pci_dev *dev,

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2026-03-26 19:52 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-08 19:24 [PATCH v2 0/3] PCI: Always lift 2.5GT/s restriction in PCIe failed link retraining Maciej W. Rozycki
2025-12-08 19:24 ` [PATCH v2 1/3] " Maciej W. Rozycki
2026-02-05 11:00   ` [External] : " ALOK TIWARI
2025-12-08 19:24 ` [PATCH v2 2/3] PCI: Use pcie_get_speed_cap() " Maciej W. Rozycki
2026-02-05 10:59   ` [External] : " ALOK TIWARI
2025-12-08 19:24 ` [PATCH v2 3/3] PCI: Bail out early for 2.5GT/s devices " Maciej W. Rozycki
2026-02-05 10:57   ` [External] : " ALOK TIWARI
2026-02-04 17:12 ` [PING][PATCH v2 0/3] PCI: Always lift 2.5GT/s restriction " Maciej W. Rozycki
2026-02-19  3:42   ` ALOK TIWARI
2026-03-09 15:45     ` ALOK TIWARI
2026-02-19 21:26 ` [PATCH " Bjorn Helgaas
2026-02-19 22:09   ` [PATCH] " Matthew W Carlis
2026-02-19 22:53     ` Bjorn Helgaas
2026-02-20 12:03       ` Maciej W. Rozycki
2026-02-23 17:36         ` Bjorn Helgaas
2026-02-23 22:49           ` Matthew W Carlis
2026-02-23 23:14           ` Maciej W. Rozycki
2026-02-25  1:41             ` Matthew W Carlis
2026-02-26 22:02               ` Maciej W. Rozycki
2026-03-26 19:52                 ` ALOK TIWARI
  -- strict thread matches above, loose matches on Subject: below --
2025-12-01  3:52 Maciej W. Rozycki
2025-12-01  9:45 ` Ilpo Järvinen
2025-12-01 13:55   ` Maciej W. Rozycki
2025-12-01 16:48     ` Ilpo Järvinen
2025-12-08 19:24     ` Maciej W. Rozycki
2025-12-04 18:30 ` Matthew W Carlis
2025-12-08 19:25   ` Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox