Hi, Greg

Samsung users have reported that this reversion is required.
I can help to port it back to 3.17-stable.
I'll send it later.

Best regards
-Lv

> From: [email protected] [mailto:[email protected]]
> Sent: Monday, November 10, 2014 12:12 PM
> 
> 
> The patch below does not apply to the 3.17-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <[email protected]>.
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From df9ff91801da603079018f21a9412385b62f0f8e Mon Sep 17 00:00:00 2001
> From: Lv Zheng <[email protected]>
> Date: Wed, 29 Oct 2014 11:33:43 +0800
> Subject: [PATCH] Revert "ACPI / EC: Add support to disallow QR_EC to be issued
>  before completing previous QR_EC"
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> It is reported that the following commit breaks Samsung hardware:
>  Commit: 558e4736f2e1b0e6323adf7a5e4df77ed6cfc1a4.
>  Subject: ACPI / EC: Add support to disallow QR_EC to be issued before
>           completing previous QR_EC
> 
> Which means the Samsung behavior conflicts with the Acer behavior.
> 
> 1. Samsung may behave like:
>    [ +event 1 ] SCI_EVT set
>    [ +event 2 ] SCI_EVT set
>                               write QR_EC
>                               read event
>    [ -event 1 ] SCI_EVT clear
>    Without the above commit, Samsung can work:
>    [ +event 1 ] SCI_EVT set
>    [ +event 2 ] SCI_EVT set
>                               write QR_EC
>                               CAN prepare next QR_EC as SCI_EVT=1
>                               read event
>    [ -event 1 ] SCI_EVT clear
>                               write QR_EC
>                               read event
>    [ -event 2 ] SCI_EVT clear
>    With the above commit, Samsung cannot work:
>    [ +event 1 ] SCI_EVT set
>    [ +event 2 ] SCI_EVT set
>                               write QR_EC
>                               read event
>    [ -event 1 ] SCI_EVT clear
>                               CANNOT prepare next QR_EC as SCI_EVT=0
> 2. Acer may behave like:
>    [ +event 1 ] SCI_EVT set
>    [ +event 2 ]
>                               write QR_EC
>                               read event
>    [ -event 1 ] SCI_EVT clear
>    [ +event 2 ] SCI_EVT set
>    Without the above commit, Acer cannot work when there is only 1 event:
>    [ +event 1 ] SCI_EVT set
>                               write QR_EC
>                               can prepared next QR_EC as SCI_EVT=1
>                               read event
>    [ -event 1 ] SCI_EVT clear
>                               CANNOT write QR_EC as SCI_EVT=0
>    With the above commit, Acer can work:
>    [ +event 1 ] SCI_EVT set
>    [ +event 2 ]
>                               write QR_EC
>                               read event
>    [ -event 1 ] SCI_EVT set
>                               can prepare next QR_EC because SCI_EVT=0
>                               CAN write QR_EC as SCI_EVT=1
> 
> Since Acer can also work with only the following commit applied:
>  Commit: 3afcf2ece453e1a8c2c6de19cdf06da3772a1b08
>  Subject: ACPI / EC: Add support to disallow QR_EC to be issued when
>           SCI_EVT isn't set
> commit 558e4736f2e1b0e6323adf7a5e4df77ed6cfc1a4 can be reverted.
> 
> Fixes: 558e4736f2e1 (ACPI / EC: Add support to disallow QR_EC to be issued 
> ...)
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=44161
> Reported-and-tested-by: Ortwin Glück <[email protected]>
> Signed-off-by: Lv Zheng <[email protected]>
> Cc: 3.17+ <[email protected]> # 3.17+
> Signed-off-by: Rafael J. Wysocki <[email protected]>
> 
> diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
> index 3d304ff7f095..31b699f2d088 100644
> --- a/drivers/acpi/ec.c
> +++ b/drivers/acpi/ec.c
> @@ -334,13 +334,13 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec 
> *ec,
>       pr_debug("***** Command(%s) started *****\n",
>                acpi_ec_cmd_string(t->command));
>       start_transaction(ec);
> -     spin_unlock_irqrestore(&ec->lock, tmp);
> -     ret = ec_poll(ec);
> -     spin_lock_irqsave(&ec->lock, tmp);
>       if (ec->curr->command == ACPI_EC_COMMAND_QUERY) {
>               clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
>               pr_debug("***** Event stopped *****\n");
>       }
> +     spin_unlock_irqrestore(&ec->lock, tmp);
> +     ret = ec_poll(ec);
> +     spin_lock_irqsave(&ec->lock, tmp);
>       pr_debug("***** Command(%s) stopped *****\n",
>                acpi_ec_cmd_string(t->command));
>       ec->curr = NULL;

Reply via email to