• Ilpo Järvinen's avatar
    PCI: Wait for Link before restoring Downstream Buses · 3e40aa29
    Ilpo Järvinen authored
    __pci_reset_bus() calls pci_bridge_secondary_bus_reset() to perform the
    reset and also waits for the Secondary Bus to become again accessible.
    __pci_reset_bus() then calls pci_bus_restore_locked() that restores the PCI
    devices connected to the bus, and if necessary, recursively restores also
    the subordinate buses and their devices.
    
    The logic in pci_bus_restore_locked() does not take into account that after
    restoring a device on one level, there might be another Link Downstream
    that can only start to come up after restore has been performed for its
    Downstream Port device. That is, the Link may require additional wait until
    it becomes accessible.
    
    Similarly, pci_slot_restore_locked() lacks wait.
    
    Amend pci_bus_restore_locked() and pci_slot_restore_locked() to wait for
    the Secondary Bus before recursively performing the restore of that bus.
    
    Fixes: 090a3c53 ("PCI: Add pci_reset_slot() and pci_reset_bus()")
    Link: https://lore.kernel.org/r/20240808121708.2523-1-ilpo.jarvinen@linux.intel.comSigned-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    3e40aa29
pci.c 183 KB