diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-06-08 08:27:27 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-06-10 13:28:37 -0400 |
commit | b3fa1329eaf2a7b97124dacf5b663fd51346ac19 (patch) | |
tree | 93fd6a76af00568e8317e3e4f084135379ec6c25 | |
parent | 8f77f3849cc3ae2d6df9301785a3d316ea7d7ee1 (diff) |
rfkill: remove set_global_sw_state
rfkill_set_global_sw_state() (previously rfkill_set_default()) will no
longer be exported by the rewritten rfkill core.
Instead, platform drivers which can provide persistent soft-rfkill state
across power-down/reboot should indicate their initial state by calling
rfkill_set_sw_state() before registration. Otherwise, they will be
initialized to a default value during registration by a set_block call.
We remove existing calls to rfkill_set_sw_state() which happen before
registration, since these had no effect in the old model. If these
drivers do have persistent state, the calls can be put back (subject
to testing :-). This affects hp-wmi and acer-wmi.
Drivers with persistent state will affect the global state only if
rfkill-input is enabled. This is required, otherwise booting with
wireless soft-blocked and pressing the wireless-toggle key once would
have no apparent effect. This special case will be removed in future
along with rfkill-input, in favour of a more flexible userspace daemon
(see Documentation/feature-removal-schedule.txt).
Now rfkill_global_states[n].def is only used to preserve global states
over EPO, it is renamed to ".sav".
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/platform/x86/acer-wmi.c | 3 | ||||
-rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 8 | ||||
-rw-r--r-- | drivers/platform/x86/hp-wmi.c | 4 | ||||
-rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 31 | ||||
-rw-r--r-- | include/linux/rfkill.h | 28 | ||||
-rw-r--r-- | net/rfkill/core.c | 81 |
6 files changed, 56 insertions, 99 deletions
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index b618fa51db2d..09a503e5da6a 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -988,7 +988,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev, | |||
988 | char *name, u32 cap) | 988 | char *name, u32 cap) |
989 | { | 989 | { |
990 | int err; | 990 | int err; |
991 | u32 state; | ||
992 | struct rfkill *rfkill_dev; | 991 | struct rfkill *rfkill_dev; |
993 | 992 | ||
994 | rfkill_dev = rfkill_alloc(name, dev, type, | 993 | rfkill_dev = rfkill_alloc(name, dev, type, |
@@ -996,8 +995,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev, | |||
996 | (void *)(unsigned long)cap); | 995 | (void *)(unsigned long)cap); |
997 | if (!rfkill_dev) | 996 | if (!rfkill_dev) |
998 | return ERR_PTR(-ENOMEM); | 997 | return ERR_PTR(-ENOMEM); |
999 | get_u32(&state, cap); | ||
1000 | rfkill_set_sw_state(rfkill_dev, !state); | ||
1001 | 998 | ||
1002 | err = rfkill_register(rfkill_dev); | 999 | err = rfkill_register(rfkill_dev); |
1003 | if (err) { | 1000 | if (err) { |
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index 1208d0cedd15..03bf522bd7ab 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
@@ -675,8 +675,8 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
675 | if (!ehotk->eeepc_wlan_rfkill) | 675 | if (!ehotk->eeepc_wlan_rfkill) |
676 | goto wlan_fail; | 676 | goto wlan_fail; |
677 | 677 | ||
678 | rfkill_set_global_sw_state(RFKILL_TYPE_WLAN, | 678 | rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, |
679 | get_acpi(CM_ASL_WLAN) != 1); | 679 | get_acpi(CM_ASL_WLAN) != 1); |
680 | result = rfkill_register(ehotk->eeepc_wlan_rfkill); | 680 | result = rfkill_register(ehotk->eeepc_wlan_rfkill); |
681 | if (result) | 681 | if (result) |
682 | goto wlan_fail; | 682 | goto wlan_fail; |
@@ -693,8 +693,8 @@ static int eeepc_hotk_add(struct acpi_device *device) | |||
693 | if (!ehotk->eeepc_bluetooth_rfkill) | 693 | if (!ehotk->eeepc_bluetooth_rfkill) |
694 | goto bluetooth_fail; | 694 | goto bluetooth_fail; |
695 | 695 | ||
696 | rfkill_set_global_sw_state(RFKILL_TYPE_BLUETOOTH, | 696 | rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill, |
697 | get_acpi(CM_ASL_BLUETOOTH) != 1); | 697 | get_acpi(CM_ASL_BLUETOOTH) != 1); |
698 | result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); | 698 | result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); |
699 | if (result) | 699 | if (result) |
700 | goto bluetooth_fail; | 700 | goto bluetooth_fail; |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 8d931145cbfa..16fffe44e333 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
@@ -422,7 +422,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
422 | RFKILL_TYPE_WLAN, | 422 | RFKILL_TYPE_WLAN, |
423 | &hp_wmi_rfkill_ops, | 423 | &hp_wmi_rfkill_ops, |
424 | (void *) 0); | 424 | (void *) 0); |
425 | rfkill_set_sw_state(wifi_rfkill, hp_wmi_wifi_state()); | ||
426 | err = rfkill_register(wifi_rfkill); | 425 | err = rfkill_register(wifi_rfkill); |
427 | if (err) | 426 | if (err) |
428 | goto register_wifi_error; | 427 | goto register_wifi_error; |
@@ -433,8 +432,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
433 | RFKILL_TYPE_BLUETOOTH, | 432 | RFKILL_TYPE_BLUETOOTH, |
434 | &hp_wmi_rfkill_ops, | 433 | &hp_wmi_rfkill_ops, |
435 | (void *) 1); | 434 | (void *) 1); |
436 | rfkill_set_sw_state(bluetooth_rfkill, | ||
437 | hp_wmi_bluetooth_state()); | ||
438 | err = rfkill_register(bluetooth_rfkill); | 435 | err = rfkill_register(bluetooth_rfkill); |
439 | if (err) | 436 | if (err) |
440 | goto register_bluetooth_error; | 437 | goto register_bluetooth_error; |
@@ -445,7 +442,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
445 | RFKILL_TYPE_WWAN, | 442 | RFKILL_TYPE_WWAN, |
446 | &hp_wmi_rfkill_ops, | 443 | &hp_wmi_rfkill_ops, |
447 | (void *) 2); | 444 | (void *) 2); |
448 | rfkill_set_sw_state(wwan_rfkill, hp_wmi_wwan_state()); | ||
449 | err = rfkill_register(wwan_rfkill); | 445 | err = rfkill_register(wwan_rfkill); |
450 | if (err) | 446 | if (err) |
451 | goto register_wwan_err; | 447 | goto register_wwan_err; |
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index cfcafa4e9473..86e958539f46 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -1168,21 +1168,6 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, | |||
1168 | 1168 | ||
1169 | BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); | 1169 | BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); |
1170 | 1170 | ||
1171 | initial_sw_status = (tp_rfkops->get_status)(); | ||
1172 | if (initial_sw_status < 0) { | ||
1173 | printk(TPACPI_ERR | ||
1174 | "failed to read initial state for %s, error %d; " | ||
1175 | "will turn radio off\n", name, initial_sw_status); | ||
1176 | } else { | ||
1177 | initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF); | ||
1178 | if (set_default) { | ||
1179 | /* try to set the initial state as the default for the | ||
1180 | * rfkill type, since we ask the firmware to preserve | ||
1181 | * it across S5 in NVRAM */ | ||
1182 | rfkill_set_global_sw_state(rfktype, initial_sw_state); | ||
1183 | } | ||
1184 | } | ||
1185 | |||
1186 | atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL); | 1171 | atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL); |
1187 | if (atp_rfk) | 1172 | if (atp_rfk) |
1188 | atp_rfk->rfkill = rfkill_alloc(name, | 1173 | atp_rfk->rfkill = rfkill_alloc(name, |
@@ -1200,8 +1185,20 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, | |||
1200 | atp_rfk->id = id; | 1185 | atp_rfk->id = id; |
1201 | atp_rfk->ops = tp_rfkops; | 1186 | atp_rfk->ops = tp_rfkops; |
1202 | 1187 | ||
1203 | rfkill_set_states(atp_rfk->rfkill, initial_sw_state, | 1188 | initial_sw_status = (tp_rfkops->get_status)(); |
1204 | tpacpi_rfk_check_hwblock_state()); | 1189 | if (initial_sw_status < 0) { |
1190 | printk(TPACPI_ERR | ||
1191 | "failed to read initial state for %s, error %d\n", | ||
1192 | name, initial_sw_status); | ||
1193 | } else { | ||
1194 | initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF); | ||
1195 | if (set_default) { | ||
1196 | /* try to keep the initial state, since we ask the | ||
1197 | * firmware to preserve it across S5 in NVRAM */ | ||
1198 | rfkill_set_sw_state(atp_rfk->rfkill, initial_sw_state); | ||
1199 | } | ||
1200 | } | ||
1201 | rfkill_set_hw_state(atp_rfk->rfkill, tpacpi_rfk_check_hwblock_state()); | ||
1205 | 1202 | ||
1206 | res = rfkill_register(atp_rfk->rfkill); | 1203 | res = rfkill_register(atp_rfk->rfkill); |
1207 | if (res < 0) { | 1204 | if (res < 0) { |
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index d7e818ad0bc4..c1dca0b8138b 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
@@ -157,8 +157,14 @@ struct rfkill * __must_check rfkill_alloc(const char *name, | |||
157 | * @rfkill: rfkill structure to be registered | 157 | * @rfkill: rfkill structure to be registered |
158 | * | 158 | * |
159 | * This function should be called by the transmitter driver to register | 159 | * This function should be called by the transmitter driver to register |
160 | * the rfkill structure needs to be registered. Before calling this function | 160 | * the rfkill structure. Before calling this function the driver needs |
161 | * the driver needs to be ready to service method calls from rfkill. | 161 | * to be ready to service method calls from rfkill. |
162 | * | ||
163 | * If the software blocked state is not set before registration, | ||
164 | * set_block will be called to initialize it to a default value. | ||
165 | * | ||
166 | * If the hardware blocked state is not set before registration, | ||
167 | * it is assumed to be unblocked. | ||
162 | */ | 168 | */ |
163 | int __must_check rfkill_register(struct rfkill *rfkill); | 169 | int __must_check rfkill_register(struct rfkill *rfkill); |
164 | 170 | ||
@@ -251,19 +257,6 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked); | |||
251 | void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); | 257 | void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); |
252 | 258 | ||
253 | /** | 259 | /** |
254 | * rfkill_set_global_sw_state - set global sw block default | ||
255 | * @type: rfkill type to set default for | ||
256 | * @blocked: default to set | ||
257 | * | ||
258 | * This function sets the global default -- use at boot if your platform has | ||
259 | * an rfkill switch. If not early enough this call may be ignored. | ||
260 | * | ||
261 | * XXX: instead of ignoring -- how about just updating all currently | ||
262 | * registered drivers? | ||
263 | */ | ||
264 | void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked); | ||
265 | |||
266 | /** | ||
267 | * rfkill_blocked - query rfkill block | 260 | * rfkill_blocked - query rfkill block |
268 | * | 261 | * |
269 | * @rfkill: rfkill struct to query | 262 | * @rfkill: rfkill struct to query |
@@ -317,11 +310,6 @@ static inline void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) | |||
317 | { | 310 | { |
318 | } | 311 | } |
319 | 312 | ||
320 | static inline void rfkill_set_global_sw_state(const enum rfkill_type type, | ||
321 | bool blocked) | ||
322 | { | ||
323 | } | ||
324 | |||
325 | static inline bool rfkill_blocked(struct rfkill *rfkill) | 313 | static inline bool rfkill_blocked(struct rfkill *rfkill) |
326 | { | 314 | { |
327 | return false; | 315 | return false; |
diff --git a/net/rfkill/core.c b/net/rfkill/core.c index e161ebc40a35..fa430bd03f14 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c | |||
@@ -57,6 +57,7 @@ struct rfkill { | |||
57 | 57 | ||
58 | bool registered; | 58 | bool registered; |
59 | bool suspended; | 59 | bool suspended; |
60 | bool persistent; | ||
60 | 61 | ||
61 | const struct rfkill_ops *ops; | 62 | const struct rfkill_ops *ops; |
62 | void *data; | 63 | void *data; |
@@ -116,11 +117,9 @@ MODULE_PARM_DESC(default_state, | |||
116 | "Default initial state for all radio types, 0 = radio off"); | 117 | "Default initial state for all radio types, 0 = radio off"); |
117 | 118 | ||
118 | static struct { | 119 | static struct { |
119 | bool cur, def; | 120 | bool cur, sav; |
120 | } rfkill_global_states[NUM_RFKILL_TYPES]; | 121 | } rfkill_global_states[NUM_RFKILL_TYPES]; |
121 | 122 | ||
122 | static unsigned long rfkill_states_default_locked; | ||
123 | |||
124 | static bool rfkill_epo_lock_active; | 123 | static bool rfkill_epo_lock_active; |
125 | 124 | ||
126 | 125 | ||
@@ -392,7 +391,7 @@ void rfkill_epo(void) | |||
392 | rfkill_set_block(rfkill, true); | 391 | rfkill_set_block(rfkill, true); |
393 | 392 | ||
394 | for (i = 0; i < NUM_RFKILL_TYPES; i++) { | 393 | for (i = 0; i < NUM_RFKILL_TYPES; i++) { |
395 | rfkill_global_states[i].def = rfkill_global_states[i].cur; | 394 | rfkill_global_states[i].sav = rfkill_global_states[i].cur; |
396 | rfkill_global_states[i].cur = true; | 395 | rfkill_global_states[i].cur = true; |
397 | } | 396 | } |
398 | 397 | ||
@@ -417,7 +416,7 @@ void rfkill_restore_states(void) | |||
417 | 416 | ||
418 | rfkill_epo_lock_active = false; | 417 | rfkill_epo_lock_active = false; |
419 | for (i = 0; i < NUM_RFKILL_TYPES; i++) | 418 | for (i = 0; i < NUM_RFKILL_TYPES; i++) |
420 | __rfkill_switch_all(i, rfkill_global_states[i].def); | 419 | __rfkill_switch_all(i, rfkill_global_states[i].sav); |
421 | mutex_unlock(&rfkill_global_mutex); | 420 | mutex_unlock(&rfkill_global_mutex); |
422 | } | 421 | } |
423 | 422 | ||
@@ -464,29 +463,6 @@ bool rfkill_get_global_sw_state(const enum rfkill_type type) | |||
464 | } | 463 | } |
465 | #endif | 464 | #endif |
466 | 465 | ||
467 | void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked) | ||
468 | { | ||
469 | BUG_ON(type == RFKILL_TYPE_ALL); | ||
470 | |||
471 | mutex_lock(&rfkill_global_mutex); | ||
472 | |||
473 | /* don't allow unblock when epo */ | ||
474 | if (rfkill_epo_lock_active && !blocked) | ||
475 | goto out; | ||
476 | |||
477 | /* too late */ | ||
478 | if (rfkill_states_default_locked & BIT(type)) | ||
479 | goto out; | ||
480 | |||
481 | rfkill_states_default_locked |= BIT(type); | ||
482 | |||
483 | rfkill_global_states[type].cur = blocked; | ||
484 | rfkill_global_states[type].def = blocked; | ||
485 | out: | ||
486 | mutex_unlock(&rfkill_global_mutex); | ||
487 | } | ||
488 | EXPORT_SYMBOL(rfkill_set_global_sw_state); | ||
489 | |||
490 | 466 | ||
491 | bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) | 467 | bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) |
492 | { | 468 | { |
@@ -532,13 +508,14 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) | |||
532 | blocked = blocked || hwblock; | 508 | blocked = blocked || hwblock; |
533 | spin_unlock_irqrestore(&rfkill->lock, flags); | 509 | spin_unlock_irqrestore(&rfkill->lock, flags); |
534 | 510 | ||
535 | if (!rfkill->registered) | 511 | if (!rfkill->registered) { |
536 | return blocked; | 512 | rfkill->persistent = true; |
513 | } else { | ||
514 | if (prev != blocked && !hwblock) | ||
515 | schedule_work(&rfkill->uevent_work); | ||
537 | 516 | ||
538 | if (prev != blocked && !hwblock) | 517 | rfkill_led_trigger_event(rfkill); |
539 | schedule_work(&rfkill->uevent_work); | 518 | } |
540 | |||
541 | rfkill_led_trigger_event(rfkill); | ||
542 | 519 | ||
543 | return blocked; | 520 | return blocked; |
544 | } | 521 | } |
@@ -563,13 +540,14 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) | |||
563 | 540 | ||
564 | spin_unlock_irqrestore(&rfkill->lock, flags); | 541 | spin_unlock_irqrestore(&rfkill->lock, flags); |
565 | 542 | ||
566 | if (!rfkill->registered) | 543 | if (!rfkill->registered) { |
567 | return; | 544 | rfkill->persistent = true; |
568 | 545 | } else { | |
569 | if (swprev != sw || hwprev != hw) | 546 | if (swprev != sw || hwprev != hw) |
570 | schedule_work(&rfkill->uevent_work); | 547 | schedule_work(&rfkill->uevent_work); |
571 | 548 | ||
572 | rfkill_led_trigger_event(rfkill); | 549 | rfkill_led_trigger_event(rfkill); |
550 | } | ||
573 | } | 551 | } |
574 | EXPORT_SYMBOL(rfkill_set_states); | 552 | EXPORT_SYMBOL(rfkill_set_states); |
575 | 553 | ||
@@ -888,15 +866,6 @@ int __must_check rfkill_register(struct rfkill *rfkill) | |||
888 | dev_set_name(dev, "rfkill%lu", rfkill_no); | 866 | dev_set_name(dev, "rfkill%lu", rfkill_no); |
889 | rfkill_no++; | 867 | rfkill_no++; |
890 | 868 | ||
891 | if (!(rfkill_states_default_locked & BIT(rfkill->type))) { | ||
892 | /* first of its kind */ | ||
893 | BUILD_BUG_ON(NUM_RFKILL_TYPES > | ||
894 | sizeof(rfkill_states_default_locked) * 8); | ||
895 | rfkill_states_default_locked |= BIT(rfkill->type); | ||
896 | rfkill_global_states[rfkill->type].cur = | ||
897 | rfkill_global_states[rfkill->type].def; | ||
898 | } | ||
899 | |||
900 | list_add_tail(&rfkill->node, &rfkill_list); | 869 | list_add_tail(&rfkill->node, &rfkill_list); |
901 | 870 | ||
902 | error = device_add(dev); | 871 | error = device_add(dev); |
@@ -916,7 +885,17 @@ int __must_check rfkill_register(struct rfkill *rfkill) | |||
916 | if (rfkill->ops->poll) | 885 | if (rfkill->ops->poll) |
917 | schedule_delayed_work(&rfkill->poll_work, | 886 | schedule_delayed_work(&rfkill->poll_work, |
918 | round_jiffies_relative(POLL_INTERVAL)); | 887 | round_jiffies_relative(POLL_INTERVAL)); |
919 | schedule_work(&rfkill->sync_work); | 888 | |
889 | if (!rfkill->persistent || rfkill_epo_lock_active) { | ||
890 | schedule_work(&rfkill->sync_work); | ||
891 | } else { | ||
892 | #ifdef CONFIG_RFKILL_INPUT | ||
893 | bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW); | ||
894 | |||
895 | if (!atomic_read(&rfkill_input_disabled)) | ||
896 | __rfkill_switch_all(rfkill->type, soft_blocked); | ||
897 | #endif | ||
898 | } | ||
920 | 899 | ||
921 | rfkill_send_events(rfkill, RFKILL_OP_ADD); | 900 | rfkill_send_events(rfkill, RFKILL_OP_ADD); |
922 | 901 | ||
@@ -1193,7 +1172,7 @@ static int __init rfkill_init(void) | |||
1193 | int i; | 1172 | int i; |
1194 | 1173 | ||
1195 | for (i = 0; i < NUM_RFKILL_TYPES; i++) | 1174 | for (i = 0; i < NUM_RFKILL_TYPES; i++) |
1196 | rfkill_global_states[i].def = !rfkill_default_state; | 1175 | rfkill_global_states[i].cur = !rfkill_default_state; |
1197 | 1176 | ||
1198 | error = class_register(&rfkill_class); | 1177 | error = class_register(&rfkill_class); |
1199 | if (error) | 1178 | if (error) |