From: Rafael J. Wysocki <[email protected]>
It turns out that some PCI devices are only found to be
wakeup-capable during registration, in which case, when
device_set_wakeup_capable() is called, device_is_registered() already
returns 'true' for the given device, but dpm_sysfs_add() hasn't been
called for it yet. This leads to situations in which the device's
power.can_wakeup flag is not set as requested because of failing
wakeup_sysfs_add() and its wakeup-related sysfs files are not
created, although they should be present. This is a post-2.6.38
regression introduced by commit cb8f51bdadb7969139c2e39c2defd4cde98c1
(PM: Do not create wakeup sysfs files for devices that cannot wake
up).
To work around this problem initialize the device's power.entry
field to an empty list head and make device_set_wakeup_capable()
check if it is still empty before attempting to add the devices
wakeup-related sysfs files with wakeup_sysfs_add(). Namely, if
power.entry is still empty at this point, device_pm_add() hasn't been
called yet for the device and its wakeup-related files will be
created later, so device_set_wakeup_capable() doesn't have to create
them.
Reported-by: Tino Keitel <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
---
drivers/base/power/main.c | 1 +
drivers/base/power/wakeup.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
Index: linux-2.6/drivers/base/power/main.c
===================================================================
--- linux-2.6.orig/drivers/base/power/main.c
+++ linux-2.6/drivers/base/power/main.c
@@ -63,6 +63,7 @@ void device_pm_init(struct device *dev)
dev->power.wakeup = NULL;
spin_lock_init(&dev->power.lock);
pm_runtime_init(dev);
+ INIT_LIST_HEAD(&dev->power.entry);
}
/**
Index: linux-2.6/drivers/base/power/wakeup.c
===================================================================
--- linux-2.6.orig/drivers/base/power/wakeup.c
+++ linux-2.6/drivers/base/power/wakeup.c
@@ -258,7 +258,7 @@ void device_set_wakeup_capable(struct de
if (!!dev->power.can_wakeup == !!capable)
return;
- if (device_is_registered(dev)) {
+ if (device_is_registered(dev) && !list_empty(&dev->power.entry)) {
if (capable) {
if (wakeup_sysfs_add(dev))
return;
Hi,
I'm currently travelling and therefore unable to test the patch. I'll
send feedback next Monday.
Regards,
Tino
Hi,
the patch works fine on top of current git
(8f7544682c488dfc4117b37ed10435bb2d3d8d73). Wakeup using the keyboard
works.
Regards,
Tino
On Monday, April 25, 2011, Tino Keitel wrote:
> Hi,
>
> the patch works fine on top of current git
> (8f7544682c488dfc4117b37ed10435bb2d3d8d73). Wakeup using the keyboard
> works.
Great, thanks for testing.
Greg, are you fine with https://lkml.org/lkml/2011/4/21/404 ?
Rafael
On Mon, Apr 25, 2011 at 10:10:16PM +0200, Rafael J. Wysocki wrote:
> On Monday, April 25, 2011, Tino Keitel wrote:
> > Hi,
> >
> > the patch works fine on top of current git
> > (8f7544682c488dfc4117b37ed10435bb2d3d8d73). Wakeup using the keyboard
> > works.
>
> Great, thanks for testing.
>
> Greg, are you fine with https://lkml.org/lkml/2011/4/21/404 ?
Yes, very much so, sorry for not giving my ack before:
Acked-by: Greg Kroah-Hartman <[email protected]>
thanks,
greg k-h