we can not call msleep() when resuming from STR/Standby: if the current_state of the pci device is PCI_D3hot, means we are in the procedure of resuming, in this procedure, we can not re-schedule, otherwise, there will be a deadlock. Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx> --- drivers/pci/pci.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 440f4fb..3d9a4e2 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -497,8 +497,18 @@ static int pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state) /* Mandatory power management transition delays */ /* see PCI PM 1.1 5.6.1 table 18 */ - if (state == PCI_D3hot || dev->current_state == PCI_D3hot) + + /* we can not call msleep() when resume: + * + * if the current_state is PCI_D3hot, means we are in the procedure + * of resuming, in this procedure, we can not re-schedule, otherwise, + * there will be a deadlock. + */ + + if (state == PCI_D3hot) msleep(pci_pm_d3_delay); + else if (dev->current_state == PCI_D3hot) + udelay(pci_pm_d3_delay); else if (state == PCI_D2 || dev->current_state == PCI_D2) udelay(PCI_PM_D2_DELAY); -- 1.6.2.1 _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm