Patch "PCI: Wait for Link before restoring Downstream Buses" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    PCI: Wait for Link before restoring Downstream Buses

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     pci-wait-for-link-before-restoring-downstream-buses.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 31969a64ffc7118a3aa44cbd023a3c11ff21f025
Author: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
Date:   Thu Aug 8 15:17:07 2024 +0300

    PCI: Wait for Link before restoring Downstream Buses
    
    [ Upstream commit 3e40aa29d47e231a54640addf6a09c1f64c5b63f ]
    
    __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: 090a3c5322e9 ("PCI: Add pci_reset_slot() and pci_reset_bus()")
    Link: https://lore.kernel.org/r/20240808121708.2523-1-ilpo.jarvinen@xxxxxxxxxxxxxxx
    Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
    Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 53e9e9788bd54..da52f98d8f7f3 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -5875,8 +5875,10 @@ static void pci_bus_restore_locked(struct pci_bus *bus)
 
 	list_for_each_entry(dev, &bus->devices, bus_list) {
 		pci_dev_restore(dev);
-		if (dev->subordinate)
+		if (dev->subordinate) {
+			pci_bridge_wait_for_secondary_bus(dev, "bus reset");
 			pci_bus_restore_locked(dev->subordinate);
+		}
 	}
 }
 
@@ -5910,8 +5912,10 @@ static void pci_slot_restore_locked(struct pci_slot *slot)
 		if (!dev->slot || dev->slot != slot)
 			continue;
 		pci_dev_restore(dev);
-		if (dev->subordinate)
+		if (dev->subordinate) {
+			pci_bridge_wait_for_secondary_bus(dev, "slot reset");
 			pci_bus_restore_locked(dev->subordinate);
+		}
 	}
 }
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux