summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>2002-08-10 02:44:25 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-08-10 02:44:25 -0700
commit66431f4b27fcd31fcc658b461c4d3879ae6686ff (patch)
treef94e2ede31e89f7c3887a2533df96ad44dcba1fb
parent090d3e7718790f77b9447b4ddeebb2a394cbeb48 (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.c6
-rw-r--r--kernel/suspend.c4
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) {