]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: Bail out early for 2.5GT/s devices in PCIe failed link retraining
authorMaciej W. Rozycki <macro@orcam.me.uk>
Mon, 8 Dec 2025 19:24:38 +0000 (19:24 +0000)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 6 May 2026 22:21:28 +0000 (17:21 -0500)
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
drivers/pci/quirks.c

index 81ee3f69b9188ff50f571103ddabab5103174e58..1b4ae046dd69ba9ba14a505346f696a938b6e641 100644 (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)