[PATCH]1/2: fix power manager recall problem.

Hu Gang (hugang@soulinfo.com)
Sat, 19 Oct 2002 20:01:04 +0800


--=.Hz7Snl41h65OI8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

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

--=.Hz7Snl41h65OI8 Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.0 (GNU/Linux)

iD8DBQE9sUmDPM4uCy7bAJgRAs4BAJ9h85BbsY3ZYuJbKFQ12JO5YLQzYgCdHKr/ 6Qt3WYZDh1Bv8DGkud/grNw= =78QX -----END PGP SIGNATURE-----

--=.Hz7Snl41h65OI8-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/