diff options
Diffstat (limited to 'drivers/pci/pci.c')
| -rw-r--r-- | drivers/pci/pci.c | 29 | 
1 files changed, 10 insertions, 19 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 29ed5ec1ac27..1b27b5af3d55 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1025,10 +1025,15 @@ static void __pci_start_power_transition(struct pci_dev *dev, pci_power_t state)  	if (state == PCI_D0) {  		pci_platform_power_transition(dev, PCI_D0);  		/* -		 * Mandatory power management transition delays are -		 * handled in the PCIe portdrv resume hooks. +		 * Mandatory power management transition delays, see +		 * PCI Express Base Specification Revision 2.0 Section +		 * 6.6.1: Conventional Reset.  Do not delay for +		 * devices powered on/off by corresponding bridge, +		 * because have already delayed for the bridge.  		 */  		if (dev->runtime_d3cold) { +			if (dev->d3cold_delay && !dev->imm_ready) +				msleep(dev->d3cold_delay);  			/*  			 * When powering on a bridge from D3cold, the  			 * whole hierarchy may be powered on into @@ -4602,16 +4607,14 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)  	return pci_dev_wait(dev, "PM D3->D0", PCIE_RESET_READY_POLL_MS);  } -  /** - * pcie_wait_for_link_delay - Wait until link is active or inactive + * pcie_wait_for_link - Wait until link is active or inactive   * @pdev: Bridge device   * @active: waiting for active or inactive? - * @delay: Delay to wait after link has become active (in ms)   *   * Use this to wait till link becomes active or inactive.   */ -bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active, int delay) +bool pcie_wait_for_link(struct pci_dev *pdev, bool active)  {  	int timeout = 1000;  	bool ret; @@ -4648,25 +4651,13 @@ bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active, int delay)  		timeout -= 10;  	}  	if (active && ret) -		msleep(delay); +		msleep(100);  	else if (ret != active)  		pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",  			active ? "set" : "cleared");  	return ret == active;  } -/** - * pcie_wait_for_link - Wait until link is active or inactive - * @pdev: Bridge device - * @active: waiting for active or inactive? - * - * Use this to wait till link becomes active or inactive. - */ -bool pcie_wait_for_link(struct pci_dev *pdev, bool active) -{ -	return pcie_wait_for_link_delay(pdev, active, 100); -} -  void pci_reset_secondary_bus(struct pci_dev *dev)  {  	u16 ctrl;  | 
