From mboxrd@z Thu Jan 1 00:00:00 1970 From: linux@arm.linux.org.uk (Russell King - ARM Linux) Date: Sun, 22 Jan 2012 00:51:51 +0000 Subject: [BUG] PCMCIA card inserted, five s2ram cycles, you're dead Message-ID: <20120122005151.GA12326@n2100.arm.linux.org.uk> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org ARM platform, a pcnet_cs CF card inserted in pcmcia_socket0's slot which works after each resume. The messages below are produced by: printk("%s: %p [%s] %u\n", __func__, dev, kobject_name(&dev->kobj), atomic_read(&dev->kobj.kref.refcount)); placed before get_device() in each of the stated functions in drivers/base/power/main.c. As you will notice, the kref count for pcmcia_socket0 decrements each resume until it explodes. I suspect there's a bug somewhere in the PCMCIA code, possibly here: static int pcmcia_bus_early_resume(struct pcmcia_socket *skt) { if (!verify_cis_cache(skt)) { pcmcia_put_socket(skt); return 0; } I've not been able to check that theory tonight. Maybe someone who knows the code can suggest - if not, I'll try deleting that pcmcia_put_socket() call at some point tomorrow. On the 3rd suspend/resume cycle: dpm_prepare: c1a0d998 [pcmcia_socket0] 3 dpm_suspend: c1a0d998 [pcmcia_socket0] 3 dpm_suspend_noirq: c1a0d998 [pcmcia_socket0] 3 dpm_resume_noirq: c1a0d998 [pcmcia_socket0] 3 dpm_resume: c1a0d998 [pcmcia_socket0] 3 dpm_complete: c1a0d998 [pcmcia_socket0] 2 On the 4th suspend/resume cycle: dpm_prepare: c1a0d998 [pcmcia_socket0] 2 dpm_suspend: c1a0d998 [pcmcia_socket0] 2 dpm_suspend_noirq: c1a0d998 [pcmcia_socket0] 2 dpm_resume_noirq: c1a0d998 [pcmcia_socket0] 2 dpm_resume: c1a0d998 [pcmcia_socket0] 2 dpm_complete: c1a0d998 [pcmcia_socket0] 1 On the 5th suspend/resume cycle: dpm_prepare: c1a0d998 [pcmcia_socket0] 1 dpm_suspend: c1a0d998 [pcmcia_socket0] 1 dpm_suspend_noirq: c1a0d998 [pcmcia_socket0] 1 dpm_resume_noirq: c1a0d998 [pcmcia_socket0] 1 dpm_resume: c1a0d998 [pcmcia_socket0] 1 dpm_complete: c1a0d998 [pcmcia_socket0] 0 ------------[ cut here ]------------ WARNING: at include/linux/kref.h:41 kobject_get+0x28/0x50() Modules linked in: ucb1x00_core Backtrace: [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) r7:00000000 r6:c0335374 r5:c0500312 r4:00000029 [] (dump_stack+0x0/0x1c) from [] (warn_slowpath_common+0x50/0x68) [] (warn_slowpath_common+0x0/0x68) from [] (warn_slowpath_null+0x24/0x28) r8:c0adbe74 r7:c05811e0 r6:c1a19234 r5:c1a0d998 r4:c1a0d9a0 [] (warn_slowpath_null+0x0/0x28) from [] (kobject_get+0x28/0x50) [] (kobject_get+0x0/0x50) from [] (get_device+0x1c/0x24) r4:c1a0da18 [] (get_device+0x0/0x24) from [] (dpm_complete+0x5c/0x1a0) [] (dpm_complete+0x0/0x1a0) from [] (dpm_resume_end+0x1c/0x20) r8:c05a9864 r7:00000003 r6:c059ada4 r5:00000000 r4:00000010 [] (dpm_resume_end+0x0/0x20) from [] (suspend_devices_and_enter+0x1ac/0x1f8) r4:00000000 [] (suspend_devices_and_enter+0x0/0x1f8) from [] (enter_state+0xfc/0x144) r8:c0aac000 r7:c04803c0 r6:00000003 r5:00000003 r4:00000000 [] (enter_state+0x0/0x144) from [] (state_store+0x9c/0x11c) r5:00000003 r4:c05009ad [] (state_store+0x0/0x11c) from [] (kobj_attr_store+0x28/0x2c) [] (kobj_attr_store+0x0/0x2c) from [] (sysfs_write_file+0x10c/0x144) [] (sysfs_write_file+0x0/0x144) from [] (vfs_write+0xb8/0x144) [] (vfs_write+0x0/0x144) from [] (sys_write+0x4c/0x7c) r8:c020f4a4 r7:00000004 r6:c0ae0cc0 r5:00000000 r4:00000000 [] (sys_write+0x0/0x7c) from [] (ret_fast_syscall+0x0/0x2c) r6:b6f09c64 r5:00000004 r4:0209a408 ---[ end trace 589b3a68dda1e5cd ]---