[3.8.y.z extended stable] Patch "ACPI / EC: Clear stale EC events on Samsung systems" has been added to staging queue
Kamal Mostafa
kamal at canonical.com
Fri Mar 28 16:13:16 UTC 2014
On Fri, 2014-03-28 at 15:38 +0100, D. G. Jansen wrote:
> Dear Kamal,
>
>
> please wait for now as a slight regression was reported for one system
> and the patch will be changed.
>
Ok, I have dropped this one from the 3.8-stable queue. Thanks very
much, Dennis.
-Kamal
> Best,
>
>
> Dennis
>
> Am Freitag, 28. März 2014 schrieb Kamal Mostafa :
> This is a note to let you know that I have just added a patch
> titled
>
> ACPI / EC: Clear stale EC events on Samsung systems
>
> to the linux-3.8.y-queue branch of the 3.8.y.z extended stable
> tree
> which can be found at:
>
> http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.8.y-queue
>
> This patch is scheduled to be released in version 3.8.13.21.
>
> If you, or anyone else, feels it should not be added to this
> tree, please
> reply to this email.
>
> For more information about the 3.8.y.z tree, see
> https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable
>
> Thanks.
> -Kamal
>
> ------
>
> From 1393f3f58ecb25d9ce797d30baf41eeccf975516 Mon Sep 17
> 00:00:00 2001
> From: Kieran Clancy <clancy.kieran at gmail.com>
> Date: Sat, 1 Mar 2014 00:42:28 +1030
> Subject: ACPI / EC: Clear stale EC events on Samsung systems
>
> commit ad332c8a45330d170bb38b95209de449b31cd1b4 upstream.
>
> A number of Samsung notebooks
> (530Uxx/535Uxx/540Uxx/550Pxx/900Xxx/etc)
> continue to log events during sleep (lid open/close, AC
> plug/unplug,
> battery level change), which accumulate in the EC until a
> buffer fills.
> After the buffer is full (tests suggest it holds 8 events),
> GPEs stop
> being triggered for new events. This state persists on wake or
> even on
> power cycle, and prevents new events from being registered
> until the EC
> is manually polled.
>
> This is the root cause of a number of bugs, including AC not
> being
> detected properly, lid close not triggering suspend, and low
> ambient
> light not triggering the keyboard backlight. The bug also
> seemed to be
> responsible for performance issues on at least one user's
> machine.
>
> Juan Manuel Cabo found the cause of bug and the workaround of
> polling
> the EC manually on wake.
>
> The loop which clears the stale events is based on an earlier
> patch by
> Lan Tianyu (see referenced attachment).
>
> This patch:
> - Adds a function acpi_ec_clear() which polls the EC for
> stale _Q
> events at most ACPI_EC_CLEAR_MAX (currently 100) times. A
> warning is
> logged if this limit is reached.
> - Adds a flag EC_FLAGS_CLEAR_ON_RESUME which is set to 1 if
> the DMI
> system vendor is Samsung. This check could be replaced by
> several
> more specific DMI vendor/product pairs, but it's likely
> that the bug
> affects more Samsung products than just the five series
> mentioned
> above. Further, it should not be harmful to run
> acpi_ec_clear() on
> systems without the bug; it will return immediately after
> finding no
> data waiting.
> - Runs acpi_ec_clear() on initialisation (boot), from
> acpi_ec_add()
> - Runs acpi_ec_clear() on wake, from
> acpi_ec_unblock_transactions()
>
> References: https://bugzilla.kernel.org/show_bug.cgi?id=44161
> References: https://bugzilla.kernel.org/show_bug.cgi?id=45461
> References: https://bugzilla.kernel.org/show_bug.cgi?id=57271
> References:
> https://bugzilla.kernel.org/attachment.cgi?id=126801
> Suggested-by: Juan Manuel Cabo <juanmanuel.cabo at gmail.com>
> Signed-off-by: Kieran Clancy <clancy.kieran at gmail.com>
> Reviewed-by: Lan Tianyu <tianyu.lan at intel.com>
> Reviewed-by: Dennis Jansen <dennis.jansen at web.de>
> Tested-by: Kieran Clancy <clancy.kieran at gmail.com>
> Tested-by: Juan Manuel Cabo <juanmanuel.cabo at gmail.com>
> Tested-by: Dennis Jansen <dennis.jansen at web.de>
> Tested-by: Maurizio D'Addona <mauritiusdadd at gmail.com>
> Tested-by: San Zamoyski <san at plusnet.pl>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
> [ kamal: backport to 3.8 (context) ]
> Signed-off-by: Kamal Mostafa <kamal at canonical.com>
> ---
> drivers/acpi/ec.c | 64
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 64 insertions(+)
>
> diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
> index 97fcfb0..092f862 100644
> --- a/drivers/acpi/ec.c
> +++ b/drivers/acpi/ec.c
> @@ -70,6 +70,8 @@ enum ec_command {
> #define ACPI_EC_DELAY 500 /* Wait 500ms max.
> during EC ops */
> #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to
> get global lock */
> #define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI
> EC */
> +#define ACPI_EC_CLEAR_MAX 100 /* Maximum number of
> events to query
> + * when trying to
> clear the EC */
>
> enum {
> EC_FLAGS_QUERY_PENDING, /* Query is pending */
> @@ -123,6 +125,7 @@ EXPORT_SYMBOL(first_ec);
> static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
> static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to
> be validated */
> static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive
> early DSDT scan */
> +static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear()
> on boot/resume */
>
> /*
> --------------------------------------------------------------------------
> Transaction Management
> @@ -468,6 +471,29 @@ acpi_handle ec_get_handle(void)
>
> EXPORT_SYMBOL(ec_get_handle);
>
> +static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8
> *data);
> +
> +/*
> + * Clears stale _Q events that might have accumulated in the
> EC.
> + * Run with locked ec mutex.
> + */
> +static void acpi_ec_clear(struct acpi_ec *ec)
> +{
> + int i, status;
> + u8 value = 0;
> +
> + for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) {
> + status = acpi_ec_query_unlocked(ec, &value);
> + if (status || !value)
> + break;
> + }
> +
> + if (unlikely(i == ACPI_EC_CLEAR_MAX))
> + pr_warn("Warning: Maximum of %d stale EC
> events cleared\n", i);
> + else
> + pr_info("%d stale EC events cleared\n", i);
> +}
> +
> void acpi_ec_block_transactions(void)
> {
> struct acpi_ec *ec = first_ec;
> @@ -491,6 +517,10 @@ void acpi_ec_unblock_transactions(void)
> mutex_lock(&ec->mutex);
> /* Allow transactions to be carried out again */
> clear_bit(EC_FLAGS_BLOCKED, &ec->flags);
> +
> + if (EC_FLAGS_CLEAR_ON_RESUME)
> + acpi_ec_clear(ec);
> +
> mutex_unlock(&ec->mutex);
> }
>
> @@ -848,6 +878,13 @@ static int acpi_ec_add(struct acpi_device
> *device)
>
> /* EC is fully operational, allow queries */
> clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
> +
> + /* Clear stale _Q events if hardware might require
> that */
> + if (EC_FLAGS_CLEAR_ON_RESUME) {
> + mutex_lock(&ec->mutex);
> + acpi_ec_clear(ec);
> + mutex_unlock(&ec->mutex);
> + }
> return ret;
> }
>
> @@ -949,6 +986,30 @@ static int
> ec_enlarge_storm_threshold(const struct dmi_system_id *id)
> return 0;
> }
>
> +/*
> + * On some hardware it is necessary to clear events
> accumulated by the EC during
> + * sleep. These ECs stop reporting GPEs until they are
> manually polled, if too
> + * many events are accumulated. (e.g. Samsung Series 5/9
> notebooks)
> + *
> + * https://bugzilla.kernel.org/show_bug.cgi?id=44161
> + *
> + * Ideally, the EC should also be instructed NOT to
> accumulate events during
> + * sleep (which Windows seems to do somehow), but the
> interface to control this
> + * behaviour is not known at this time.
> + *
> + * Models known to be affected are Samsung
> 530Uxx/535Uxx/540Uxx/550Pxx/900Xxx,
> + * however it is very likely that other Samsung models are
> affected.
> + *
> + * On systems which don't accumulate _Q events during sleep,
> this extra check
> + * should be harmless.
> + */
> +static int ec_clear_on_resume(const struct dmi_system_id *id)
> +{
> + pr_debug("Detected system needing EC poll on
> resume.\n");
> + EC_FLAGS_CLEAR_ON_RESUME = 1;
> + return 0;
> +}
> +
> static struct dmi_system_id __initdata ec_dmi_table[] = {
> {
> ec_skip_dsdt_scan, "Compal JFL92", {
> @@ -992,6 +1053,9 @@ static struct dmi_system_id __initdata
> ec_dmi_table[] = {
> ec_validate_ecdt, "ASUS hardware", {
> DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek Computer Inc."),
> DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),}, NULL},
> + {
> + ec_clear_on_resume, "Samsung hardware", {
> + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO.,
> LTD.")}, NULL},
> {},
> };
>
> --
> 1.8.3.2
>
>
>
> --
> Dipl.-Jur. Dennis G. Jansen, LL.M. (Berkeley)
> Tel. 0163 834 8558 | LinkedIn
> Master of Laws, University of California, Berkeley, School of Law
> ("Boalt Hall")
> Certificate in Law and Technology, University of California, Berkeley,
> School of Law ("Boalt Hall")
> Certificate in Transnational Legal Studies, Georgetown University Law
> Center
> Certificate in Internationalization of Law, Free University Berlin
> Diploma of Law, Free University Berlin
>
More information about the kernel-team
mailing list