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 /net/rfkill | |
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>
Diffstat (limited to 'net/rfkill')
-rw-r--r-- | net/rfkill/core.c | 81 |
1 files changed, 30 insertions, 51 deletions
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) |