linux/drivers/acpi
Lv Zheng 3afcf2ece4 ACPI / EC: Add support to disallow QR_EC to be issued when SCI_EVT isn't set
There is a platform refusing to respond QR_EC when SCI_EVT isn't set
(Acer Aspire V5-573G).

Currently, we rely on the behaviour that the EC firmware can respond
something (for example, 0x00 to indicate "no outstanding events") to
QR_EC even when SCI_EVT is not set, but the reporter has complained
about AC/battery pluging/unpluging and video brightness change delay
on that platform.

This is because the work item that has issued QR_EC has to wait until
timeout in this case, and the _Qxx method evaluation work item queued
after QR_EC one is delayed.

It sounds reasonable to fix this issue by:
 1. Implementing SCI_EVT sanity check before issuing QR_EC in the EC
    driver's main state machine.
 2. Moving QR_EC issuing out of the work queue used by _Qxx evaluation
    to a seperate IRQ handling thread.

This patch fixes this issue using solution 1.

By disallowing QR_EC to be issued when SCI_EVT isn't set, we are able to
handle such platform in the EC driver's main state machine. This patch
enhances the state machine in this way to survive with such malfunctioning
EC firmware.

Note that this patch can also fix CLEAR_ON_RESUME quirk which also relies
on the assumption that the platforms are able to respond even when SCI_EVT
isn't set.

Fixes: c0d653412f ACPI / EC: Fix race condition in ec_transaction_completed()
Link: https://bugzilla.kernel.org/show_bug.cgi?id=82611
Reported-and-tested-by: Alexander Mezin <mezin.alexander@gmail.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Cc: 3.16+ <stable@vger.kernel.org> # 3.16+
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2014-08-26 02:15:47 +02:00
..
acpica Merge branch 'acpica' 2014-08-05 22:50:12 +02:00
apei ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
ac.c Revert "ACPI / AC: Remove AC's proc directory." 2014-07-07 01:13:46 +02:00
acpi_cmos_rtc.c ACPI / PNP: use device ID list for PNPACPI device enumeration 2014-05-30 16:04:35 +02:00
acpi_extlog.c ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
acpi_ipmi.c ACPI / IPMI: Cleanup coding styles 2013-09-30 19:46:13 +02:00
acpi_lpss.c ACPI / LPSS: add LPSS device for Wildcat Point PCH 2014-08-01 03:10:23 +02:00
acpi_memhotplug.c ACPI / scan: always register memory hotplug scan handler 2014-05-30 16:04:36 +02:00
acpi_pad.c ACPI / PAD: Use time_before() for time comparison 2014-05-27 01:38:23 +02:00
acpi_platform.c Merge branch 'acpi-platform' 2014-06-03 23:11:52 +02:00
acpi_pnp.c ACPI / PNP: Replace faulty is_hex_digit() by isxdigit() 2014-07-31 23:07:48 +02:00
acpi_processor.c ACPI: Don't use acpi_lapic in ACPI core code 2014-07-21 13:50:58 +02:00
battery.c ACPI / battery: Fix warning message in acpi_battery_get_state() 2014-08-10 16:19:31 +02:00
battery.h ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
bgrt.c
blacklist.c ACPI: move models with win8 brightness problems from win8 blacklist to use_native_backlight 2014-07-21 13:43:56 +02:00
bus.c ACPICA: Linux: Add stub support for Linux specific variables and functions. 2014-07-20 01:34:57 +02:00
button.c ACPI / button: Do not propagate wakeup-from-suspend events 2014-07-23 00:59:04 +02:00
cm_sbs.c ACPI: Revert "ACPI: Remove CONFIG_ACPI_PROCFS_POWER and cm_sbsc.c" 2014-05-06 01:52:09 +02:00
container.c ACPI / scan: always register container scan handler 2014-05-30 16:04:36 +02:00
custom_method.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
debugfs.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
device_pm.c ACPI / PM: Use ACPI_COMPANION() instead of ACPI_HANDLE() 2014-07-23 01:01:41 +02:00
dock.c ACPI / dock: Drop dock_device_ids[] table 2014-04-07 14:11:35 +02:00
ec_sys.c ACPI / EC: Mark the function acpi_ec_add_debugfs() as static in ec_sys.c 2014-01-06 00:13:22 +01:00
ec.c ACPI / EC: Add support to disallow QR_EC to be issued when SCI_EVT isn't set 2014-08-26 02:15:47 +02:00
event.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
fan.c ACPI / fan: do nothing in suspend and poweroff callback 2014-02-20 21:42:09 +01:00
glue.c ACPI / scan: Add bind/unbind callbacks to struct acpi_scan_handler 2014-02-11 00:35:46 +01:00
hed.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
internal.h Merge branches 'acpi-pnp' and 'acpi-pci' 2014-07-27 23:55:35 +02:00
Kconfig ACPI and power management updates for 3.17-rc1 2014-08-06 20:34:19 -07:00
Makefile ACPI / processor: Introduce ARCH_MIGHT_HAVE_ACPI_PDC 2014-07-21 13:50:58 +02:00
numa.c ACPI / numa: Use __weak, not the gcc-specific version 2014-02-03 10:39:43 -07:00
nvs.c ACPI: Clean up acpi_os_map/unmap_memory() to eliminate __iomem. 2014-05-27 18:13:08 +02:00
osl.c ACPI: add config for BIOS table scan 2014-07-21 13:50:58 +02:00
pci_irq.c x86, irq, PCI: Keep IRQ assignment for PCI devices during suspend/hibernation 2014-08-08 11:14:45 +02:00
pci_link.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
pci_root.c ACPI / PM: Revork the handling of ACPI device wakeup notifications 2014-07-23 01:00:45 +02:00
pci_slot.c ACPI / PCI: Include appropriate header file in pci_slot.c 2014-01-06 00:13:22 +01:00
power.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
proc.c ACPI / proc: remove unneeded NULL check 2014-02-05 01:06:21 +01:00
processor_core.c Merge branches 'acpi-video', 'acpi-battery', 'acpi-processor' and 'acpi-lpss' 2014-08-05 22:50:54 +02:00
processor_driver.c ACPI / processor: Make acpi_cpu_soft_notify() process CPU FROZEN events 2014-08-06 22:22:03 +02:00
processor_idle.c ACPI and power management updates for 3.14-rc1 2014-01-24 15:51:02 -08:00
processor_pdc.c ACPI / processor: Introduce ARCH_MIGHT_HAVE_ACPI_PDC 2014-07-21 13:50:58 +02:00
processor_perflib.c ACPI / processor: use acpi_evaluate_ost() to replace open-coded version 2014-02-21 00:27:47 +01:00
processor_thermal.c ACPI: correct minor typos 2013-12-07 01:38:45 +01:00
processor_throttling.c ACPI / processor: Rework processor throttling with work_on_cpu() 2014-02-27 00:21:05 +01:00
reboot.c
resource.c ACPI / resources: only reject zero length resources based at address zero 2014-07-07 22:11:09 +02:00
sbs.c ACPI / battery: move some ACPI_BATTERY_* definitions to header 2014-03-19 01:57:46 +01:00
sbshc.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00
sbshc.h
scan.c Merge branches 'acpi-processor', 'acpi-hotplug' and 'acpi-battery' 2014-08-10 16:23:33 +02:00
sleep.c ACPI / sleep: Do not save NVS for new machines to accelerate S3 2014-07-24 01:03:18 +02:00
sleep.h
sysfs.c ACPI: Remove duplicate definitions of PREFIX 2014-03-19 02:01:57 +01:00
tables.c ACPI: use kstrto*() instead of simple_strto*() 2014-06-17 14:01:56 +02:00
thermal.c Merge back earlier ACPI thermal material. 2014-05-29 13:28:14 +02:00
utils.c ACPI: add dynamic_debug support 2014-05-26 14:38:57 +02:00
video_detect.c ACPI / video: Add Dell Inspiron 5737 to the blacklist 2014-07-07 23:38:10 +02:00
video.c ACPI / video: Add use_native_backlight quirk for HP EliteBook 2014 models 2014-07-30 02:00:40 +02:00
wakeup.c ACPI: Clean up inclusions of ACPI header files 2013-12-07 01:03:14 +01:00