aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Jenkins <alan-jenkins@tuffmail.co.uk>2009-06-08 08:27:27 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-06-10 13:28:37 -0400
commitb3fa1329eaf2a7b97124dacf5b663fd51346ac19 (patch)
tree93fd6a76af00568e8317e3e4f084135379ec6c25
parent8f77f3849cc3ae2d6df9301785a3d316ea7d7ee1 (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.c3
-rw-r--r--drivers/platform/x86/eeepc-laptop.c8
-rw-r--r--drivers/platform/x86/hp-wmi.c4
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c31
-rw-r--r--include/linux/rfkill.h28
-rw-r--r--net/rfkill/core.c81
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 */
163int __must_check rfkill_register(struct rfkill *rfkill); 169int __must_check rfkill_register(struct rfkill *rfkill);
164 170
@@ -251,19 +257,6 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked);
251void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); 257void 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 */
264void 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
320static inline void rfkill_set_global_sw_state(const enum rfkill_type type,
321 bool blocked)
322{
323}
324
325static inline bool rfkill_blocked(struct rfkill *rfkill) 313static 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
118static struct { 119static 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
122static unsigned long rfkill_states_default_locked;
123
124static bool rfkill_epo_lock_active; 123static 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
467void 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}
488EXPORT_SYMBOL(rfkill_set_global_sw_state);
489
490 466
491bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) 467bool 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}
574EXPORT_SYMBOL(rfkill_set_states); 552EXPORT_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)