PCI: Initialize dev->link_active_reporting earlier
authorMaciej W. Rozycki <macro@orcam.me.uk>
Sun, 11 Jun 2023 17:19:27 +0000 (18:19 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 14 Jun 2023 22:58:12 +0000 (17:58 -0500)
Determine whether Data Link Layer Link Active Reporting is available before
calling any fixups so that the cached value can be used there and later on.

[bhelgaas: move to set_pcie_port_type() where other PCIe init is done]
Link: https://lore.kernel.org/r/alpine.DEB.2.21.2305310122210.59226@angie.orcam.me.uk
Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c

index 0b2826c..782925b 100644 (file)
@@ -820,7 +820,6 @@ static void pci_set_bus_speed(struct pci_bus *bus)
 
                pcie_capability_read_dword(bridge, PCI_EXP_LNKCAP, &linkcap);
                bus->max_bus_speed = pcie_link_speed[linkcap & PCI_EXP_LNKCAP_SLS];
-               bridge->link_active_reporting = !!(linkcap & PCI_EXP_LNKCAP_DLLLARC);
 
                pcie_capability_read_word(bridge, PCI_EXP_LNKSTA, &linksta);
                pcie_update_link_speed(bus, linksta);
@@ -1527,6 +1526,7 @@ void set_pcie_port_type(struct pci_dev *pdev)
 {
        int pos;
        u16 reg16;
+       u32 reg32;
        int type;
        struct pci_dev *parent;
 
@@ -1540,6 +1540,10 @@ void set_pcie_port_type(struct pci_dev *pdev)
        pci_read_config_dword(pdev, pos + PCI_EXP_DEVCAP, &pdev->devcap);
        pdev->pcie_mpss = FIELD_GET(PCI_EXP_DEVCAP_PAYLOAD, pdev->devcap);
 
+       pcie_capability_read_dword(pdev, PCI_EXP_LNKCAP, &reg32);
+       if (reg32 & PCI_EXP_LNKCAP_DLLLARC)
+               pdev->link_active_reporting = 1;
+
        parent = pci_upstream_bridge(pdev);
        if (!parent)
                return;