3.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "Rafael J. Wysocki" <rafael.j.wyso...@intel.com>

commit 175f8e2650f7ca6b33d338be3ccc1c00e89594ea upstream.

In some cases acpi_device_wakeup() may be called to ensure wakeup
power to be off for a given device even though that device's wakeup
GPE has not been enabled so far.  It calls acpi_disable_gpe() on a
GPE that's not enabled and this causes ACPICA to return the AE_LIMIT
status code from that call which then is reported as an error by the
ACPICA's debug facilities (if enabled).  This may lead to a fair
amount of confusion, so introduce a new ACPI device wakeup flag
to store the wakeup GPE status and avoid disabling wakeup GPEs
that have not been enabled.

Reported-and-tested-by: Venkat Raghavulu <venkat.raghav...@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wyso...@intel.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/acpi/device_pm.c |   12 ++++++++++--
 include/acpi/acpi_bus.h  |    1 +
 2 files changed, 11 insertions(+), 2 deletions(-)

--- a/drivers/acpi/device_pm.c
+++ b/drivers/acpi/device_pm.c
@@ -680,13 +680,21 @@ static int acpi_device_wakeup(struct acp
                if (error)
                        return error;
 
+               if (adev->wakeup.flags.enabled)
+                       return 0;
+
                res = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
-               if (ACPI_FAILURE(res)) {
+               if (ACPI_SUCCESS(res)) {
+                       adev->wakeup.flags.enabled = 1;
+               } else {
                        acpi_disable_wakeup_device_power(adev);
                        return -EIO;
                }
        } else {
-               acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
+               if (adev->wakeup.flags.enabled) {
+                       acpi_disable_gpe(wakeup->gpe_device, 
wakeup->gpe_number);
+                       adev->wakeup.flags.enabled = 0;
+               }
                acpi_disable_wakeup_device_power(adev);
        }
        return 0;
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -312,6 +312,7 @@ struct acpi_device_wakeup_flags {
        u8 valid:1;             /* Can successfully enable wakeup? */
        u8 run_wake:1;          /* Run-Wake GPE devices */
        u8 notifier_present:1;  /* Wake-up notify handler has been installed */
+       u8 enabled:1;           /* Enabled for wakeup */
 };
 
 struct acpi_device_wakeup_context {


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

Reply via email to