ACPI / EC: Fix regression related to triggering source of EC event handling [Linux 4.14.3]

This Linux kernel change "ACPI / EC: Fix regression related to triggering source of EC event handling" is included in the Linux 4.14.3 release. This change is authored by Lv Zheng <lv.zheng [at] intel.com> on Tue Sep 26 16:54:03 2017 +0800. The commit for this change in Linux stable tree is 3fe36d0 (patch) which is from upstream commit 53c5eaa. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 53c5eaa.

ACPI / EC: Fix regression related to triggering source of EC event handling

commit 53c5eaabaea9a1b7a96f95ccc486d2ad721d95bb upstream.

Originally the Samsung quirks removed by commit 4c237371 can be covered
by commit e923e8e7 and ec_freeze_events=Y mode. But commit 9c40f956
changed ec_freeze_events=Y back to N, making this problem re-surface.

Actually, if commit e923e8e7 is robust enough, we can freely change
ec_freeze_events mode, so this patch fixes the issue by improving
commit e923e8e7.

Related commits listed in the merged order:

 Commit: e923e8e79e18fd6be9162f1be6b99a002e9df2cb
 Subject: ACPI / EC: Fix an issue that SCI_EVT cannot be detected
          after event is enabled

 Commit: 4c237371f290d1ed3b2071dd43554362137b1cce
 Subject: ACPI / EC: Remove old CLEAR_ON_RESUME quirk

 Commit: 9c40f956ce9b331493347d1b3cb7e384f7dc0581
 Subject: Revert "ACPI / EC: Enable event freeze mode..." to fix
          a regression

This patch not only fixes the reported post-resume EC event triggering
source issue, but also fixes an unreported similar issue related to the
driver bind by adding EC event triggering source in ec_install_handlers().

Fixes: e923e8e79e18 (ACPI / EC: Fix an issue that SCI_EVT cannot be detected after event is enabled)
Fixes: 4c237371f290 (ACPI / EC: Remove old CLEAR_ON_RESUME quirk)
Fixes: 9c40f956ce9b (Revert "ACPI / EC: Enable event freeze mode..." to fix a regression)
Link: https://bugzilla.kernel.org/show_bug.cgi?id=196833
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Reported-by: Alistair Hamilton <ahpatent@gmail.com>
Tested-by: Alistair Hamilton <ahpatent@gmail.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

There are 12 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/acpi/ec.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 236b143..82b3ce5 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -486,8 +486,11 @@ static inline void __acpi_ec_enable_event(struct acpi_ec *ec)
 {
    if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
        ec_log_drv("event unblocked");
-   if (!test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
-       advance_transaction(ec);
+   /*
+    * Unconditionally invoke this once after enabling the event
+    * handling mechanism to detect the pending events.
+    */
+   advance_transaction(ec);
 }

 static inline void __acpi_ec_disable_event(struct acpi_ec *ec)
@@ -1456,11 +1459,10 @@ static int ec_install_handlers(struct acpi_ec *ec, bool handle_events)
            if (test_bit(EC_FLAGS_STARTED, &ec->flags) &&
                ec->reference_count >= 1)
                acpi_ec_enable_gpe(ec, true);
-
-           /* EC is fully operational, allow queries */
-           acpi_ec_enable_event(ec);
        }
    }
+   /* EC is fully operational, allow queries */
+   acpi_ec_enable_event(ec);

    return 0;
 }

Leave a Reply

Your email address will not be published. Required fields are marked *