]> git.baikalelectronics.ru Git - kernel.git/commit
ACPI: EC: Fix regression related to wrong ECDT initialization order
authorLv Zheng <lv.zheng@intel.com>
Wed, 16 Aug 2017 07:29:49 +0000 (15:29 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 17 Aug 2017 18:52:19 +0000 (20:52 +0200)
commitf327be6f27a6a56db7b6076ec6ba750a0bcc2786
tree46bfeaed8d0d4e5c086d070d9cb5c20821770c66
parente6e62669ad2689defa545e29aa752b50a20944a9
ACPI: EC: Fix regression related to wrong ECDT initialization order

Commit a107dcd2e091 (ACPI / EC: Fix a gap that ECDT EC cannot handle
EC events) introduced acpi_ec_ecdt_start(), but that function is
invoked before acpi_ec_query_init(), which is too early.  This causes
the kernel to crash if an EC event occurs after boot, when ec_query_wq
is not valid:

 BUG: unable to handle kernel NULL pointer dereference at 0000000000000102
 ...
 Workqueue: events acpi_ec_event_handler
 task: ffff9f539790dac0 task.stack: ffffb437c0e10000
 RIP: 0010:__queue_work+0x32/0x430

Normally, the DSDT EC should always be valid, so acpi_ec_ecdt_start()
is actually a no-op in the majority of cases.  However, commit
87bbf51f03c6 (ACPI / EC: Add support to skip boot stage DSDT probe)
caused the probing of the DSDT EC as the "boot EC" to be skipped when
the ECDT EC is valid and uncovered the bug.

Fix this issue by invoking acpi_ec_ecdt_start() after acpi_ec_query_init()
in acpi_ec_init().

Link: https://jira01.devtools.intel.com/browse/LCK-4348
Fixes: a107dcd2e091 (ACPI / EC: Fix a gap that ECDT EC cannot handle EC events)
Fixes: 87bbf51f03c6 (ACPI / EC: Add support to skip boot stage DSDT probe)
Reported-by: Wang Wendy <wendy.wang@intel.com>
Tested-by: Feng Chenzhou <chenzhoux.feng@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
[ rjw: Changelog ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/ec.c
drivers/acpi/internal.h
drivers/acpi/scan.c