forked from mirrors/linux
		
	Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()"
This reverts commit08d0cc5f34. Michael reported that when attempting to resume from suspend to RAM on ASUS mini PC PN51-BB757MDE1 (DMI model: MINIPC PN51-E1),08d0cc5f34("PCI/ASPM: Remove pcie_aspm_pm_state_change()") caused a 12-second delay with no output, followed by a reboot. Workarounds include: - Reverting08d0cc5f34("PCI/ASPM: Remove pcie_aspm_pm_state_change()") - Booting with "pcie_aspm=off" - Booting with "pcie_aspm.policy=performance" - "echo 0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/link/l1_aspm" before suspending - Connecting a USB flash drive Link: https://lore.kernel.org/r/20240102232550.1751655-1-helgaas@kernel.org Fixes:08d0cc5f34("PCI/ASPM: Remove pcie_aspm_pm_state_change()") Reported-by: Michael Schaller <michael@5challer.de> Link: https://lore.kernel.org/r/76c61361-b8b4-435f-a9f1-32b716763d62@5challer.de Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: <stable@vger.kernel.org>
This commit is contained in:
		
							parent
							
								
									b85ea95d08
								
							
						
					
					
						commit
						f93e71aea6
					
				
					 3 changed files with 27 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -1335,6 +1335,9 @@ static int pci_set_full_power_state(struct pci_dev *dev)
 | 
			
		|||
		pci_restore_bars(dev);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (dev->bus->self)
 | 
			
		||||
		pcie_aspm_pm_state_change(dev->bus->self);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1429,6 +1432,9 @@ static int pci_set_low_power_state(struct pci_dev *dev, pci_power_t state)
 | 
			
		|||
				     pci_power_name(dev->current_state),
 | 
			
		||||
				     pci_power_name(state));
 | 
			
		||||
 | 
			
		||||
	if (dev->bus->self)
 | 
			
		||||
		pcie_aspm_pm_state_change(dev->bus->self);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -569,10 +569,12 @@ int pcie_retrain_link(struct pci_dev *pdev, bool use_lt);
 | 
			
		|||
#ifdef CONFIG_PCIEASPM
 | 
			
		||||
void pcie_aspm_init_link_state(struct pci_dev *pdev);
 | 
			
		||||
void pcie_aspm_exit_link_state(struct pci_dev *pdev);
 | 
			
		||||
void pcie_aspm_pm_state_change(struct pci_dev *pdev);
 | 
			
		||||
void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
 | 
			
		||||
#else
 | 
			
		||||
static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
 | 
			
		||||
static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
 | 
			
		||||
static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { }
 | 
			
		||||
static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1008,6 +1008,25 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
 | 
			
		|||
	up_read(&pci_bus_sem);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* @pdev: the root port or switch downstream port */
 | 
			
		||||
void pcie_aspm_pm_state_change(struct pci_dev *pdev)
 | 
			
		||||
{
 | 
			
		||||
	struct pcie_link_state *link = pdev->link_state;
 | 
			
		||||
 | 
			
		||||
	if (aspm_disabled || !link)
 | 
			
		||||
		return;
 | 
			
		||||
	/*
 | 
			
		||||
	 * Devices changed PM state, we should recheck if latency
 | 
			
		||||
	 * meets all functions' requirement
 | 
			
		||||
	 */
 | 
			
		||||
	down_read(&pci_bus_sem);
 | 
			
		||||
	mutex_lock(&aspm_lock);
 | 
			
		||||
	pcie_update_aspm_capable(link->root);
 | 
			
		||||
	pcie_config_aspm_path(link);
 | 
			
		||||
	mutex_unlock(&aspm_lock);
 | 
			
		||||
	up_read(&pci_bus_sem);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pcie_aspm_powersave_config_link(struct pci_dev *pdev)
 | 
			
		||||
{
 | 
			
		||||
	struct pcie_link_state *link = pdev->link_state;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue