Messages in this thread Patch in this message |  | | Date | Sat, 19 Oct 2002 20:01:04 +0800 | | From | Hu Gang <> | | Subject | [PATCH]1/2: fix power manager recall problem. |
| |
Hello Patrick Mochel, Pavel Machek:
I'm tested the 2.5.3X suspend function and found the problem. I'm enable debug option here is the log. ---------------------- skip... Freeing memory: | Syncing disks before copy call device_resume SUSPEND_NOTIFY Suspending devices suspending device PCI device 8086:7111 suspending device PCI device 1022:2000 call device_resume SUSPEND_SAVE_STATE Suspending devices suspending device PCI device 8086:7111 suspending device PCI device 1022:2000 call device_resume SUSPEND_DISABLE Suspending devices suspending device PCI device 8086:7111 suspending device PCI device 1022:2000 call pm_send_all PM_SUSPEND call pci_pm_suspend call pcnet32_suspend /critical section: Counting pages to copy[nosave c02af000] (pages needed: 4795+512=5307 free: 27972) Alloc pagedir [nosave c02af000]<4>Freeing prev allocated pagedir call device_resume RESUME_RESTORE_STATE resuming device PCI device 1022:2000 call pcnet32_resume resuming device PCI device 8086:7111 resuming device i8259A PIC skip...... ------------------------ first the we call device suspend it suspend pci device and other device, but when we call pm_send_all to pm_suspend, it retry to suspend pci device, here is the real problem.
This patch can fix it. Please apply. ------------------------------ diff -ur linux-2.5.44-clean/drivers/base/power.c linux-2.5.44-suspend/drivers/base/power.c --- linux-2.5.44-clean/drivers/base/power.c Sat Oct 19 15:56:47 2002 +++ linux-2.5.44-suspend/drivers/base/power.c Sat Oct 19 18:00:28 2002 @@ -37,6 +37,14 @@ down(&device_sem); list_for_each(node,&global_device_list) { struct device * dev = to_dev(node); + if (dev->bus) { + char *name = dev->bus->name; + pr_debug("bus is %s\n", name); + if (strncmp(name, "pci", 3) == 0) { + pr_debug("skip pci bus\n"); + continue; + } + } if (device_present(dev) && dev->driver && dev->driver->suspend) { pr_debug("suspending device %s\n",dev->name); error = dev->driver->suspend(dev,state,level); @@ -63,6 +71,14 @@ down(&device_sem); list_for_each_prev(node,&global_device_list) { struct device * dev = to_dev(node); + if (dev->bus) { + char *name = dev->bus->name; + pr_debug("bus is %s\n", name); + if (strncmp(name, "pci", 3) == 0) { + pr_debug("skip pci bus\n"); + continue; + } + } if (device_present(dev) && dev->driver && dev->driver->resume) { pr_debug("resuming device %s\n",dev->name); dev->driver->resume(dev,level); -- - Hu Gang[unhandled content-type:application/pgp-signature] |  |