Commit 997daa1b authored by Alex Hung's avatar Alex Hung Committed by Matthew Garrett

hp-wmi: detect "2009 BIOS or later" flag by WMI 0x0d for wireless cmd

Some HP BIOS has dummy WMI 0x05 cmd and it causes wireless set cmd to fail.
This patch fixes the problem by detecting "2009 BIOS or later" flag which
determines whether WMI 0x1b is supported and is used to replace WMI 0x05.
Signed-off-by: default avatarAlex Hung <alex.hung@canonical.com>
Signed-off-by: default avatarMatthew Garrett <matthew.garrett@nebula.com>
parent cfb743bf
...@@ -54,6 +54,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4"); ...@@ -54,6 +54,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
#define HPWMI_HARDWARE_QUERY 0x4 #define HPWMI_HARDWARE_QUERY 0x4
#define HPWMI_WIRELESS_QUERY 0x5 #define HPWMI_WIRELESS_QUERY 0x5
#define HPWMI_HOTKEY_QUERY 0xc #define HPWMI_HOTKEY_QUERY 0xc
#define HPWMI_FEATURE_QUERY 0xd
#define HPWMI_WIRELESS2_QUERY 0x1b #define HPWMI_WIRELESS2_QUERY 0x1b
#define HPWMI_POSTCODEERROR_QUERY 0x2a #define HPWMI_POSTCODEERROR_QUERY 0x2a
...@@ -292,6 +293,17 @@ static int hp_wmi_tablet_state(void) ...@@ -292,6 +293,17 @@ static int hp_wmi_tablet_state(void)
return (state & 0x4) ? 1 : 0; return (state & 0x4) ? 1 : 0;
} }
static int hp_wmi_bios_2009_later(void)
{
int state = 0;
int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, 0, &state,
sizeof(state), sizeof(state));
if (ret)
return ret;
return (state & 0x10) ? 1 : 0;
}
static int hp_wmi_set_block(void *data, bool blocked) static int hp_wmi_set_block(void *data, bool blocked)
{ {
enum hp_wmi_radio r = (enum hp_wmi_radio) data; enum hp_wmi_radio r = (enum hp_wmi_radio) data;
...@@ -871,7 +883,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -871,7 +883,7 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
gps_rfkill = NULL; gps_rfkill = NULL;
rfkill2_count = 0; rfkill2_count = 0;
if (hp_wmi_rfkill_setup(device)) if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device))
hp_wmi_rfkill2_setup(device); hp_wmi_rfkill2_setup(device);
err = device_create_file(&device->dev, &dev_attr_display); err = device_create_file(&device->dev, &dev_attr_display);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment