Commit 3f6e2f13 authored by Matthew Garrett's avatar Matthew Garrett Committed by Linus Torvalds

hp-wmi: update to match current rfkill semantics

hp-wmi currently changes the RFKill state by altering the struct members
rather than using the dedicated interface, meaning that update events
won't be pushed to userspace.  This patch fixes that, along with fixing
the declared type of the WWAN kill switch.  It also ensures that rfkill
interfaces are only registered for hardware that exists.
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Acked-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Ivo van Doorn <ivdoorn@gmail.com>
Cc: Dave Young <hidave.darkstar@gmail.com>
Cc: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 61e55d05
...@@ -177,9 +177,9 @@ static int hp_wmi_wifi_state(void) ...@@ -177,9 +177,9 @@ static int hp_wmi_wifi_state(void)
int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
if (wireless & 0x100) if (wireless & 0x100)
return 1; return RFKILL_STATE_UNBLOCKED;
else else
return 0; return RFKILL_STATE_SOFT_BLOCKED;
} }
static int hp_wmi_bluetooth_state(void) static int hp_wmi_bluetooth_state(void)
...@@ -187,9 +187,9 @@ static int hp_wmi_bluetooth_state(void) ...@@ -187,9 +187,9 @@ static int hp_wmi_bluetooth_state(void)
int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
if (wireless & 0x10000) if (wireless & 0x10000)
return 1; return RFKILL_STATE_UNBLOCKED;
else else
return 0; return RFKILL_STATE_SOFT_BLOCKED;
} }
static int hp_wmi_wwan_state(void) static int hp_wmi_wwan_state(void)
...@@ -197,9 +197,9 @@ static int hp_wmi_wwan_state(void) ...@@ -197,9 +197,9 @@ static int hp_wmi_wwan_state(void)
int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
if (wireless & 0x1000000) if (wireless & 0x1000000)
return 1; return RFKILL_STATE_UNBLOCKED;
else else
return 0; return RFKILL_STATE_SOFT_BLOCKED;
} }
static ssize_t show_display(struct device *dev, struct device_attribute *attr, static ssize_t show_display(struct device *dev, struct device_attribute *attr,
...@@ -338,12 +338,14 @@ void hp_wmi_notify(u32 value, void *context) ...@@ -338,12 +338,14 @@ void hp_wmi_notify(u32 value, void *context)
} }
} else if (eventcode == 0x5) { } else if (eventcode == 0x5) {
if (wifi_rfkill) if (wifi_rfkill)
wifi_rfkill->state = hp_wmi_wifi_state(); rfkill_force_state(wifi_rfkill,
hp_wmi_wifi_state());
if (bluetooth_rfkill) if (bluetooth_rfkill)
bluetooth_rfkill->state = rfkill_force_state(bluetooth_rfkill,
hp_wmi_bluetooth_state(); hp_wmi_bluetooth_state());
if (wwan_rfkill) if (wwan_rfkill)
wwan_rfkill->state = hp_wmi_wwan_state(); rfkill_force_state(wwan_rfkill,
hp_wmi_wwan_state());
} else } else
printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n", printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n",
eventcode); eventcode);
...@@ -398,6 +400,7 @@ static void cleanup_sysfs(struct platform_device *device) ...@@ -398,6 +400,7 @@ static void cleanup_sysfs(struct platform_device *device)
static int __init hp_wmi_bios_setup(struct platform_device *device) static int __init hp_wmi_bios_setup(struct platform_device *device)
{ {
int err; int err;
int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0);
err = device_create_file(&device->dev, &dev_attr_display); err = device_create_file(&device->dev, &dev_attr_display);
if (err) if (err)
...@@ -412,28 +415,33 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -412,28 +415,33 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
if (err) if (err)
goto add_sysfs_error; goto add_sysfs_error;
if (wireless & 0x1) {
wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN); wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN);
wifi_rfkill->name = "hp-wifi"; wifi_rfkill->name = "hp-wifi";
wifi_rfkill->state = hp_wmi_wifi_state(); wifi_rfkill->state = hp_wmi_wifi_state();
wifi_rfkill->toggle_radio = hp_wmi_wifi_set; wifi_rfkill->toggle_radio = hp_wmi_wifi_set;
wifi_rfkill->user_claim_unsupported = 1; wifi_rfkill->user_claim_unsupported = 1;
rfkill_register(wifi_rfkill);
}
if (wireless & 0x2) {
bluetooth_rfkill = rfkill_allocate(&device->dev, bluetooth_rfkill = rfkill_allocate(&device->dev,
RFKILL_TYPE_BLUETOOTH); RFKILL_TYPE_BLUETOOTH);
bluetooth_rfkill->name = "hp-bluetooth"; bluetooth_rfkill->name = "hp-bluetooth";
bluetooth_rfkill->state = hp_wmi_bluetooth_state(); bluetooth_rfkill->state = hp_wmi_bluetooth_state();
bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set;
bluetooth_rfkill->user_claim_unsupported = 1; bluetooth_rfkill->user_claim_unsupported = 1;
rfkill_register(bluetooth_rfkill);
}
wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WIMAX); if (wireless & 0x4) {
wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WWAN);
wwan_rfkill->name = "hp-wwan"; wwan_rfkill->name = "hp-wwan";
wwan_rfkill->state = hp_wmi_wwan_state(); wwan_rfkill->state = hp_wmi_wwan_state();
wwan_rfkill->toggle_radio = hp_wmi_wwan_set; wwan_rfkill->toggle_radio = hp_wmi_wwan_set;
wwan_rfkill->user_claim_unsupported = 1; wwan_rfkill->user_claim_unsupported = 1;
rfkill_register(wifi_rfkill);
rfkill_register(bluetooth_rfkill);
rfkill_register(wwan_rfkill); rfkill_register(wwan_rfkill);
}
return 0; return 0;
add_sysfs_error: add_sysfs_error:
...@@ -445,8 +453,11 @@ static int __exit hp_wmi_bios_remove(struct platform_device *device) ...@@ -445,8 +453,11 @@ static int __exit hp_wmi_bios_remove(struct platform_device *device)
{ {
cleanup_sysfs(device); cleanup_sysfs(device);
if (wifi_rfkill)
rfkill_unregister(wifi_rfkill); rfkill_unregister(wifi_rfkill);
if (bluetooth_rfkill)
rfkill_unregister(bluetooth_rfkill); rfkill_unregister(bluetooth_rfkill);
if (wwan_rfkill)
rfkill_unregister(wwan_rfkill); rfkill_unregister(wwan_rfkill);
return 0; return 0;
......
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