diff options
| author | Pavel Machek <pavel@ucw.cz> | 2002-08-10 02:44:25 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-08-10 02:44:25 -0700 |
| commit | 66431f4b27fcd31fcc658b461c4d3879ae6686ff (patch) | |
| tree | f94e2ede31e89f7c3887a2533df96ad44dcba1fb | |
| parent | 090d3e7718790f77b9447b4ddeebb2a394cbeb48 (diff) | |
[PATCH] S3 and swsusp: fixing device_resume order
pci driver's resume must not be called during RESUME_POWER_ON because
interrupts are still off and i8259A is not initialized [OHCI kills
machine in such case, cardbus probably too. PCI drivers just assume
initialized interrupts.]
Second hunk fixes device_resume calls to be okay according to
documentation.
| -rw-r--r-- | drivers/pci/pci-driver.c | 6 | ||||
| -rw-r--r-- | kernel/suspend.c | 4 |
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 3ad23175d6a5..4055c7580993 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -90,7 +90,11 @@ static int pci_device_resume(struct device * dev, u32 level) struct pci_dev * pci_dev = to_pci_dev(dev); if (pci_dev->driver) { - if (level == RESUME_POWER_ON && pci_dev->driver->resume) + /* We may not call PCI drivers resume at + RESUME_POWER_ON because interrupts are not yet + working at that point. Calling resume at + RESUME_RESTORE_STATE seems like solution. */ + if (level == RESUME_RESTORE_STATE && pci_dev->driver->resume) pci_dev->driver->resume(pci_dev); } return 0; diff --git a/kernel/suspend.c b/kernel/suspend.c index f11214bb9a67..67f26e26d594 100644 --- a/kernel/suspend.c +++ b/kernel/suspend.c @@ -619,8 +619,8 @@ static void free_some_memory(void) /* Make disk drivers accept operations, again */ static void drivers_unsuspend(void) { - device_resume(RESUME_ENABLE); device_resume(RESUME_RESTORE_STATE); + device_resume(RESUME_ENABLE); } /* Called from process context */ @@ -647,8 +647,8 @@ static int drivers_suspend(void) static void drivers_resume(int flags) { if (flags & RESUME_PHASE1) { - device_resume(RESUME_ENABLE); device_resume(RESUME_RESTORE_STATE); + device_resume(RESUME_ENABLE); } if (flags & RESUME_PHASE2) { if(pm_suspend_state) { |
