lkml.org 
[lkml]   [2011]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/11] ACPI / PM: Do not enable multiple devices to wake up simultaneously
    Date
    From: Rafael J. Wysocki <rjw@sisk.pl>

    If a device is enabled to wake up the system from sleep states via
    /proc/acpi/wakeup and there are other devices associated with the
    same wakeup GPE, all of these devices are automatically enabled to
    wake up the system. This isn't correct, because the fact the GPE is
    shared need not imply that wakeup power has to be enabled for all the
    devices at the same time (i.e. it is possible that one device will
    have its wakeup power enabled and it will wake up the system from a
    sleep state if the shared wakeup GPE is enabled, while another device
    having its wakeup power disabled will not wake up the system even
    though the GPE is enabled). Rework acpi_system_write_wakeup_device()
    so that it only enables wakeup for one device at a time.

    Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
    ---
    drivers/acpi/proc.c | 26 +-------------------------
    1 file changed, 1 insertion(+), 25 deletions(-)

    Index: linux-2.6/drivers/acpi/proc.c
    ===================================================================
    --- linux-2.6.orig/drivers/acpi/proc.c
    +++ linux-2.6/drivers/acpi/proc.c
    @@ -341,7 +341,6 @@ acpi_system_write_wakeup_device(struct f
    char strbuf[5];
    char str[5] = "";
    unsigned int len = count;
    - struct acpi_device *found_dev = NULL;

    if (len > 4)
    len = 4;
    @@ -363,33 +362,10 @@ acpi_system_write_wakeup_device(struct f
    if (!strncmp(dev->pnp.bus_id, str, 4)) {
    dev->wakeup.state.enabled =
    dev->wakeup.state.enabled ? 0 : 1;
    - found_dev = dev;
    + physical_device_enable_wakeup(dev);
    break;
    }
    }
    - if (found_dev) {
    - physical_device_enable_wakeup(found_dev);
    - list_for_each_safe(node, next, &acpi_wakeup_device_list) {
    - struct acpi_device *dev = container_of(node,
    - struct
    - acpi_device,
    - wakeup_list);
    -
    - if ((dev != found_dev) &&
    - (dev->wakeup.gpe_number ==
    - found_dev->wakeup.gpe_number)
    - && (dev->wakeup.gpe_device ==
    - found_dev->wakeup.gpe_device)) {
    - printk(KERN_WARNING
    - "ACPI: '%s' and '%s' have the same GPE, "
    - "can't disable/enable one separately\n",
    - dev->pnp.bus_id, found_dev->pnp.bus_id);
    - dev->wakeup.state.enabled =
    - found_dev->wakeup.state.enabled;
    - physical_device_enable_wakeup(dev);
    - }
    - }
    - }
    mutex_unlock(&acpi_device_lock);
    return count;
    }


    \
     
     \ /
      Last update: 2011-01-06 23:49    [W:0.051 / U:30.384 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site