PCI: Bail out early for 2.5GT/s devices in PCIe failed link retraining

There's no point in retraining a failed 2.5GT/s device at 2.5GT/s, so just
don't and return early.  While such devices might be unlikely to implement
Link Active reporting, we need to retrieve the maximum link speed and use
it in a conditional later on anyway, so the early check comes for free.

Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Tested-by: Alok Tiwari <alok.a.tiwari@oracle.com>
Link: https://patch.msgid.link/alpine.DEB.2.21.2512080356070.49654@angie.orcam.me.uk
This commit is contained in:
Maciej W. Rozycki 2025-12-08 19:24:38 +00:00 committed by Bjorn Helgaas
parent 30a3613080
commit 64d63fd281

View File

@ -102,6 +102,10 @@ int pcie_failed_link_retrain(struct pci_dev *dev)
!pcie_cap_has_lnkctl2(dev) || !dev->link_active_reporting)
return ret;
speed_cap = pcie_get_speed_cap(dev);
if (speed_cap <= PCIE_SPEED_2_5GT)
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)) {
@ -111,10 +115,8 @@ int pcie_failed_link_retrain(struct pci_dev *dev)
goto err;
}
speed_cap = pcie_get_speed_cap(dev);
pcie_capability_read_word(dev, PCI_EXP_LNKCTL2, &lnkctl2);
if ((lnkctl2 & PCI_EXP_LNKCTL2_TLS) == PCI_EXP_LNKCTL2_TLS_2_5GT &&
speed_cap > PCIE_SPEED_2_5GT) {
if ((lnkctl2 & PCI_EXP_LNKCTL2_TLS) == PCI_EXP_LNKCTL2_TLS_2_5GT) {
pci_info(dev, "removing 2.5GT/s downstream link speed restriction\n");
ret = pcie_set_target_speed(dev, speed_cap, false);
if (ret)