diff mbox

[PATCHv4] hp-wmi: limit hotkey enable

Message ID 1441907100-4141-1-git-send-email-kvans32@gmail.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Kyle Evans Sept. 10, 2015, 5:45 p.m. UTC
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.

Signed-off-by: Kyle Evans <kvans32@gmail.com>
---
 Since v1:
 - Refactored feature query 0xb into separate function
 - Redefine FEATURE_QUERY to align with 0xb and FEATURE2 with 0xd

 Since v2:
 - Simplify hp_wmi_bios_200x_later functions. No longer returns true 
 (4) when the test fails. However, if state is somehow useful, that is lost.

 Since v3:
 - Fix whitespace, email client reformatting.

 drivers/platform/x86/hp-wmi.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

Comments

Darren Hart Sept. 10, 2015, 9:21 p.m. UTC | #1
On Thu, Sep 10, 2015 at 12:45:00PM -0500, Kyle Evans wrote:
> 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.
> 
> Signed-off-by: Kyle Evans <kvans32@gmail.com>
> ---
>  Since v1:
>  - Refactored feature query 0xb into separate function
>  - Redefine FEATURE_QUERY to align with 0xb and FEATURE2 with 0xd
> 
>  Since v2:
>  - Simplify hp_wmi_bios_200x_later functions. No longer returns true 
>  (4) when the test fails. However, if state is somehow useful, that is lost.
> 
>  Since v3:
>  - Fix whitespace, email client reformatting.

Thanks, this one applies cleanly, however:

drivers/platform/x86/hp-wmi.c: In function ‘hp_wmi_input_setup’:
drivers/platform/x86/hp-wmi.c:675:2: error: implicit declaration of function ‘hp_wmi_2008_later’ [-Werror=implicit-function-declaration]
  if (!hp_wmi_bios_2009_later() && hp_wmi_2008_later())
  ^
drivers/platform/x86/hp-wmi.c: At top level:
drivers/platform/x86/hp-wmi.c:299:19: warning: ‘hp_wmi_bios_2008_later’ defined but not used [-Wunused-function]
 static int __init hp_wmi_bios_2008_later(void)

Looks like you missed "bios" in the call to hp_wmi_bios_2008_later. Which
suggests this version was not compile tested. As I cannot test the code myself
without hardware, I depend on submitters even more to do the testing, so it is
really important that you have tested the exact patch that I send to Linus.
Kyle Evans Sept. 11, 2015, 3:05 p.m. UTC | #2
On 09/10/2015 04:21 PM, Darren Hart wrote:
> On Thu, Sep 10, 2015 at 12:45:00PM -0500, Kyle Evans wrote:
>> 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.
>>
>> Signed-off-by: Kyle Evans <kvans32@gmail.com>
>> ---
>>   Since v1:
>>   - Refactored feature query 0xb into separate function
>>   - Redefine FEATURE_QUERY to align with 0xb and FEATURE2 with 0xd
>>
>>   Since v2:
>>   - Simplify hp_wmi_bios_200x_later functions. No longer returns true
>>   (4) when the test fails. However, if state is somehow useful, that is lost.
>>
>>   Since v3:
>>   - Fix whitespace, email client reformatting.
>
> Thanks, this one applies cleanly, however:
>
> drivers/platform/x86/hp-wmi.c: In function ‘hp_wmi_input_setup’:
> drivers/platform/x86/hp-wmi.c:675:2: error: implicit declaration of function ‘hp_wmi_2008_later’ [-Werror=implicit-function-declaration]
>    if (!hp_wmi_bios_2009_later() && hp_wmi_2008_later())
>    ^
> drivers/platform/x86/hp-wmi.c: At top level:
> drivers/platform/x86/hp-wmi.c:299:19: warning: ‘hp_wmi_bios_2008_later’ defined but not used [-Wunused-function]
>   static int __init hp_wmi_bios_2008_later(void)
>
> Looks like you missed "bios" in the call to hp_wmi_bios_2008_later. Which
> suggests this version was not compile tested. As I cannot test the code myself
> without hardware, I depend on submitters even more to do the testing, so it is
> really important that you have tested the exact patch that I send to Linus.
>
Sorry for all the rookie mistakes.
I did run a compile and reboot script. Unfortunately, the error logic 
was commented out when I was debugging the reboot code and never 
re-enabled. Lesson learned. I'm on it.
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
index 0669731..45a9eaa 100644
--- a/drivers/platform/x86/hp-wmi.c
+++ b/drivers/platform/x86/hp-wmi.c
@@ -54,8 +54,9 @@  MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
 #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 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(void)
 			    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_2008_later())
 		hp_wmi_enable_hotkeys();
 
 	status = wmi_install_notify_handler(HPWMI_EVENT_GUID, hp_wmi_notify, NULL);