[PATCH] [PATCH] hp-wmi: improve wlan rfkill support

From: Alan Jenkins
Date: Sat Jul 18 2009 - 11:48:37 EST


1) The platform appears to support both hardware and software block
states. The current code only reads the overall state, and reports
it as the software state. Fix it.

2) Since the software state appears to be persistent, mark it as such.

3) Check rfkill in the resume handler resume. Both the hard and soft
blocked states could change over hibernation.

Signed-off-by: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx>
---
drivers/platform/x86/hp-wmi.c | 27 +++++++++++++++++++++++----
1 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
index ca50856..517ac47 100644
--- a/drivers/platform/x86/hp-wmi.c
+++ b/drivers/platform/x86/hp-wmi.c
@@ -180,11 +180,21 @@ static const struct rfkill_ops hp_wmi_rfkill_ops = {
.set_block = hp_wmi_set_block,
};

-static bool hp_wmi_wifi_state(void)
+static bool hp_wmi_wifi_sw_state(void)
{
int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);

- if (wireless & 0x100)
+ if (wireless & 0x200)
+ return false;
+ else
+ return true;
+}
+
+static bool hp_wmi_wifi_hw_state(void)
+{
+ int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
+
+ if (wireless & 0x800)
return false;
else
return true;
@@ -359,8 +369,9 @@ static void hp_wmi_notify(u32 value, void *context)
input_sync(hp_wmi_input_dev);
} else if (eventcode == 0x5) {
if (wifi_rfkill)
- rfkill_set_sw_state(wifi_rfkill,
- hp_wmi_wifi_state());
+ rfkill_set_states(wifi_rfkill,
+ hp_wmi_wifi_sw_state(),
+ hp_wmi_wifi_hw_state());
if (bluetooth_rfkill)
rfkill_set_sw_state(bluetooth_rfkill,
hp_wmi_bluetooth_state());
@@ -451,6 +462,10 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
RFKILL_TYPE_WLAN,
&hp_wmi_rfkill_ops,
(void *) 0);
+ rfkill_init_sw_state(wifi_rfkill,
+ hp_wmi_wifi_sw_state());
+ rfkill_set_hw_state(wifi_rfkill,
+ hp_wmi_wifi_hw_state());
err = rfkill_register(wifi_rfkill);
if (err)
goto register_wifi_error;
@@ -526,6 +541,10 @@ static int hp_wmi_resume_handler(struct platform_device *device)
hp_wmi_tablet_state());
input_sync(hp_wmi_input_dev);

+ rfkill_set_states(wifi_rfkill,
+ hp_wmi_wifi_sw_state(),
+ hp_wmi_wifi_hw_state());
+
return 0;
}

--
1.6.3.2



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/