| From 8a1513b49321e503fd6c8b6793e3b1f9a8a3285b Mon Sep 17 00:00:00 2001 |
| From: Kyle Evans <kvans32@gmail.com> |
| Date: Fri, 11 Sep 2015 10:40:17 -0500 |
| Subject: hp-wmi: limit hotkey enable |
| |
| From: Kyle Evans <kvans32@gmail.com> |
| |
| commit 8a1513b49321e503fd6c8b6793e3b1f9a8a3285b upstream. |
| |
| Do not write initialize magic on systems that do not have |
| feature query 0xb. Fixes Bug #82451. |
| |
| Redefine FEATURE_QUERY to align with 0xb and FEATURE2 with 0xd |
| for code clearity. |
| |
| Add a new test function, hp_wmi_bios_2008_later() & simplify |
| hp_wmi_bios_2009_later(), which fixes a bug in cases where |
| an improper value is returned. Probably also fixes Bug #69131. |
| |
| Add missing __init tag. |
| |
| Signed-off-by: Kyle Evans <kvans32@gmail.com> |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/platform/x86/hp-wmi.c | 31 ++++++++++++++++++++----------- |
| 1 file changed, 20 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/platform/x86/hp-wmi.c |
| +++ b/drivers/platform/x86/hp-wmi.c |
| @@ -54,8 +54,9 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE9 |
| #define HPWMI_HARDWARE_QUERY 0x4 |
| #define HPWMI_WIRELESS_QUERY 0x5 |
| #define HPWMI_BIOS_QUERY 0x9 |
| +#define HPWMI_FEATURE_QUERY 0xb |
| #define HPWMI_HOTKEY_QUERY 0xc |
| -#define HPWMI_FEATURE_QUERY 0xd |
| +#define HPWMI_FEATURE2_QUERY 0xd |
| #define HPWMI_WIRELESS2_QUERY 0x1b |
| #define HPWMI_POSTCODEERROR_QUERY 0x2a |
| |
| @@ -295,25 +296,33 @@ static int hp_wmi_tablet_state(void) |
| return (state & 0x4) ? 1 : 0; |
| } |
| |
| -static int __init hp_wmi_bios_2009_later(void) |
| +static int __init hp_wmi_bios_2008_later(void) |
| { |
| int state = 0; |
| int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state, |
| sizeof(state), sizeof(state)); |
| - if (ret) |
| - return ret; |
| + if (!ret) |
| + return 1; |
| |
| - return (state & 0x10) ? 1 : 0; |
| + return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO; |
| } |
| |
| -static int hp_wmi_enable_hotkeys(void) |
| +static int __init hp_wmi_bios_2009_later(void) |
| { |
| - int ret; |
| - int query = 0x6e; |
| + int state = 0; |
| + int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state, |
| + sizeof(state), sizeof(state)); |
| + if (!ret) |
| + return 1; |
| |
| - ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query), |
| - 0); |
| + return (ret == HPWMI_RET_UNKNOWN_CMDTYPE) ? 0 : -ENXIO; |
| +} |
| |
| +static int __init hp_wmi_enable_hotkeys(void) |
| +{ |
| + int value = 0x6e; |
| + int ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &value, |
| + sizeof(value), 0); |
| if (ret) |
| return -EINVAL; |
| return 0; |
| @@ -663,7 +672,7 @@ static int __init hp_wmi_input_setup(voi |
| hp_wmi_tablet_state()); |
| input_sync(hp_wmi_input_dev); |
| |
| - if (hp_wmi_bios_2009_later() == 4) |
| + if (!hp_wmi_bios_2009_later() && hp_wmi_bios_2008_later()) |
| hp_wmi_enable_hotkeys(); |
| |
| status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL); |