diff options
-rw-r--r-- | Documentation/rfkill.txt | 16 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/main.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/b43/rfkill.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/rfkill.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rfkill.c | 1 | ||||
-rw-r--r-- | drivers/platform/x86/acer-wmi.c | 1 | ||||
-rw-r--r-- | drivers/platform/x86/hp-wmi.c | 3 | ||||
-rw-r--r-- | drivers/platform/x86/sony-laptop.c | 4 | ||||
-rw-r--r-- | drivers/platform/x86/toshiba_acpi.c | 1 | ||||
-rw-r--r-- | include/linux/rfkill.h | 6 | ||||
-rw-r--r-- | net/rfkill/rfkill.c | 45 | ||||
-rw-r--r-- | net/wimax/op-rfkill.c | 1 |
12 files changed, 9 insertions, 72 deletions
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt index 4d3ee317a4a3..40c3a3f10816 100644 --- a/Documentation/rfkill.txt +++ b/Documentation/rfkill.txt | |||
@@ -521,16 +521,12 @@ status of the system. | |||
521 | Input devices may issue events that are related to rfkill. These are the | 521 | Input devices may issue events that are related to rfkill. These are the |
522 | various KEY_* events and SW_* events supported by rfkill-input.c. | 522 | various KEY_* events and SW_* events supported by rfkill-input.c. |
523 | 523 | ||
524 | ******IMPORTANT****** | 524 | Userspace may not change the state of an rfkill switch in response to an |
525 | When rfkill-input is ACTIVE, userspace is NOT TO CHANGE THE STATE OF AN RFKILL | 525 | input event, it should refrain from changing states entirely. |
526 | SWITCH IN RESPONSE TO AN INPUT EVENT also handled by rfkill-input, unless it | 526 | |
527 | has set to true the user_claim attribute for that particular switch. This rule | 527 | Userspace cannot assume it is the only source of control for rfkill switches. |
528 | is *absolute*; do NOT violate it. | 528 | Their state can change due to firmware actions, direct user actions, and the |
529 | ******IMPORTANT****** | 529 | rfkill-input EPO override for *_RFKILL_ALL. |
530 | |||
531 | Userspace must not assume it is the only source of control for rfkill switches. | ||
532 | Their state CAN and WILL change due to firmware actions, direct user actions, | ||
533 | and the rfkill-input EPO override for *_RFKILL_ALL. | ||
534 | 530 | ||
535 | When rfkill-input is not active, userspace must initiate a rfkill status | 531 | When rfkill-input is not active, userspace must initiate a rfkill status |
536 | change by writing to the "state" attribute in order for anything to happen. | 532 | change by writing to the "state" attribute in order for anything to happen. |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 13d4e6756c99..0607df20e497 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -1267,7 +1267,6 @@ static int ath_init_sw_rfkill(struct ath_softc *sc) | |||
1267 | sc->rf_kill.rfkill->data = sc; | 1267 | sc->rf_kill.rfkill->data = sc; |
1268 | sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio; | 1268 | sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio; |
1269 | sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED; | 1269 | sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED; |
1270 | sc->rf_kill.rfkill->user_claim_unsupported = 1; | ||
1271 | 1270 | ||
1272 | return 0; | 1271 | return 0; |
1273 | } | 1272 | } |
diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c index afad42358693..9e1d00bc24d3 100644 --- a/drivers/net/wireless/b43/rfkill.c +++ b/drivers/net/wireless/b43/rfkill.c | |||
@@ -139,7 +139,6 @@ void b43_rfkill_init(struct b43_wldev *dev) | |||
139 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; | 139 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; |
140 | rfk->rfkill->data = dev; | 140 | rfk->rfkill->data = dev; |
141 | rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle; | 141 | rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle; |
142 | rfk->rfkill->user_claim_unsupported = 1; | ||
143 | 142 | ||
144 | rfk->poll_dev = input_allocate_polled_device(); | 143 | rfk->poll_dev = input_allocate_polled_device(); |
145 | if (!rfk->poll_dev) { | 144 | if (!rfk->poll_dev) { |
diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c index b32bf6a94f19..4b0c7d27a51f 100644 --- a/drivers/net/wireless/b43legacy/rfkill.c +++ b/drivers/net/wireless/b43legacy/rfkill.c | |||
@@ -142,7 +142,6 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev) | |||
142 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; | 142 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; |
143 | rfk->rfkill->data = dev; | 143 | rfk->rfkill->data = dev; |
144 | rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle; | 144 | rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle; |
145 | rfk->rfkill->user_claim_unsupported = 1; | ||
146 | 145 | ||
147 | rfk->poll_dev = input_allocate_polled_device(); | 146 | rfk->poll_dev = input_allocate_polled_device(); |
148 | if (!rfk->poll_dev) { | 147 | if (!rfk->poll_dev) { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.c b/drivers/net/wireless/iwlwifi/iwl-rfkill.c index 2ad9faf1508a..65605ad44e4b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rfkill.c +++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.c | |||
@@ -91,7 +91,6 @@ int iwl_rfkill_init(struct iwl_priv *priv) | |||
91 | priv->rfkill->data = priv; | 91 | priv->rfkill->data = priv; |
92 | priv->rfkill->state = RFKILL_STATE_UNBLOCKED; | 92 | priv->rfkill->state = RFKILL_STATE_UNBLOCKED; |
93 | priv->rfkill->toggle_radio = iwl_rfkill_soft_rf_kill; | 93 | priv->rfkill->toggle_radio = iwl_rfkill_soft_rf_kill; |
94 | priv->rfkill->user_claim_unsupported = 1; | ||
95 | 94 | ||
96 | priv->rfkill->dev.class->suspend = NULL; | 95 | priv->rfkill->dev.class->suspend = NULL; |
97 | priv->rfkill->dev.class->resume = NULL; | 96 | priv->rfkill->dev.class->resume = NULL; |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 0f6e43bf4fc2..62d02b3c998e 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -1005,7 +1005,6 @@ enum rfkill_type type, char *name, u32 cap) | |||
1005 | *data = cap; | 1005 | *data = cap; |
1006 | rfkill_dev->data = data; | 1006 | rfkill_dev->data = data; |
1007 | rfkill_dev->toggle_radio = acer_rfkill_set; | 1007 | rfkill_dev->toggle_radio = acer_rfkill_set; |
1008 | rfkill_dev->user_claim_unsupported = 1; | ||
1009 | 1008 | ||
1010 | err = rfkill_register(rfkill_dev); | 1009 | err = rfkill_register(rfkill_dev); |
1011 | if (err) { | 1010 | if (err) { |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 50d9019de2be..fe171fad12cf 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
@@ -434,7 +434,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
434 | wifi_rfkill->name = "hp-wifi"; | 434 | wifi_rfkill->name = "hp-wifi"; |
435 | wifi_rfkill->state = hp_wmi_wifi_state(); | 435 | wifi_rfkill->state = hp_wmi_wifi_state(); |
436 | wifi_rfkill->toggle_radio = hp_wmi_wifi_set; | 436 | wifi_rfkill->toggle_radio = hp_wmi_wifi_set; |
437 | wifi_rfkill->user_claim_unsupported = 1; | ||
438 | err = rfkill_register(wifi_rfkill); | 437 | err = rfkill_register(wifi_rfkill); |
439 | if (err) | 438 | if (err) |
440 | goto add_sysfs_error; | 439 | goto add_sysfs_error; |
@@ -446,7 +445,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
446 | bluetooth_rfkill->name = "hp-bluetooth"; | 445 | bluetooth_rfkill->name = "hp-bluetooth"; |
447 | bluetooth_rfkill->state = hp_wmi_bluetooth_state(); | 446 | bluetooth_rfkill->state = hp_wmi_bluetooth_state(); |
448 | bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; | 447 | bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; |
449 | bluetooth_rfkill->user_claim_unsupported = 1; | ||
450 | err = rfkill_register(bluetooth_rfkill); | 448 | err = rfkill_register(bluetooth_rfkill); |
451 | if (err) | 449 | if (err) |
452 | goto register_bluetooth_error; | 450 | goto register_bluetooth_error; |
@@ -457,7 +455,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) | |||
457 | wwan_rfkill->name = "hp-wwan"; | 455 | wwan_rfkill->name = "hp-wwan"; |
458 | wwan_rfkill->state = hp_wmi_wwan_state(); | 456 | wwan_rfkill->state = hp_wmi_wwan_state(); |
459 | wwan_rfkill->toggle_radio = hp_wmi_wwan_set; | 457 | wwan_rfkill->toggle_radio = hp_wmi_wwan_set; |
460 | wwan_rfkill->user_claim_unsupported = 1; | ||
461 | err = rfkill_register(wwan_rfkill); | 458 | err = rfkill_register(wwan_rfkill); |
462 | if (err) | 459 | if (err) |
463 | goto register_wwan_err; | 460 | goto register_wwan_err; |
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index d3c92d777bde..184e99e72684 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
@@ -1097,7 +1097,6 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device) | |||
1097 | sony_wifi_rfkill->name = "sony-wifi"; | 1097 | sony_wifi_rfkill->name = "sony-wifi"; |
1098 | sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set; | 1098 | sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set; |
1099 | sony_wifi_rfkill->get_state = sony_nc_rfkill_get; | 1099 | sony_wifi_rfkill->get_state = sony_nc_rfkill_get; |
1100 | sony_wifi_rfkill->user_claim_unsupported = 1; | ||
1101 | sony_wifi_rfkill->data = (void *)SONY_WIFI; | 1100 | sony_wifi_rfkill->data = (void *)SONY_WIFI; |
1102 | err = rfkill_register(sony_wifi_rfkill); | 1101 | err = rfkill_register(sony_wifi_rfkill); |
1103 | if (err) | 1102 | if (err) |
@@ -1119,7 +1118,6 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device) | |||
1119 | sony_bluetooth_rfkill->name = "sony-bluetooth"; | 1118 | sony_bluetooth_rfkill->name = "sony-bluetooth"; |
1120 | sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set; | 1119 | sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set; |
1121 | sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get; | 1120 | sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get; |
1122 | sony_bluetooth_rfkill->user_claim_unsupported = 1; | ||
1123 | sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH; | 1121 | sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH; |
1124 | err = rfkill_register(sony_bluetooth_rfkill); | 1122 | err = rfkill_register(sony_bluetooth_rfkill); |
1125 | if (err) | 1123 | if (err) |
@@ -1140,7 +1138,6 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device) | |||
1140 | sony_wwan_rfkill->name = "sony-wwan"; | 1138 | sony_wwan_rfkill->name = "sony-wwan"; |
1141 | sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set; | 1139 | sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set; |
1142 | sony_wwan_rfkill->get_state = sony_nc_rfkill_get; | 1140 | sony_wwan_rfkill->get_state = sony_nc_rfkill_get; |
1143 | sony_wwan_rfkill->user_claim_unsupported = 1; | ||
1144 | sony_wwan_rfkill->data = (void *)SONY_WWAN; | 1141 | sony_wwan_rfkill->data = (void *)SONY_WWAN; |
1145 | err = rfkill_register(sony_wwan_rfkill); | 1142 | err = rfkill_register(sony_wwan_rfkill); |
1146 | if (err) | 1143 | if (err) |
@@ -1161,7 +1158,6 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device) | |||
1161 | sony_wimax_rfkill->name = "sony-wimax"; | 1158 | sony_wimax_rfkill->name = "sony-wimax"; |
1162 | sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set; | 1159 | sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set; |
1163 | sony_wimax_rfkill->get_state = sony_nc_rfkill_get; | 1160 | sony_wimax_rfkill->get_state = sony_nc_rfkill_get; |
1164 | sony_wimax_rfkill->user_claim_unsupported = 1; | ||
1165 | sony_wimax_rfkill->data = (void *)SONY_WIMAX; | 1161 | sony_wimax_rfkill->data = (void *)SONY_WIMAX; |
1166 | err = rfkill_register(sony_wimax_rfkill); | 1162 | err = rfkill_register(sony_wimax_rfkill); |
1167 | if (err) | 1163 | if (err) |
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 9f187265db8e..4345089f5171 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c | |||
@@ -803,7 +803,6 @@ static int __init toshiba_acpi_init(void) | |||
803 | 803 | ||
804 | toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name; | 804 | toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name; |
805 | toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio; | 805 | toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio; |
806 | toshiba_acpi.rfk_dev->user_claim_unsupported = 1; | ||
807 | toshiba_acpi.rfk_dev->data = &toshiba_acpi; | 806 | toshiba_acpi.rfk_dev->data = &toshiba_acpi; |
808 | 807 | ||
809 | if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) { | 808 | if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) { |
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index e1ec7d9aa49c..de18ef227e00 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
@@ -58,9 +58,6 @@ enum rfkill_state { | |||
58 | * @type: Radio type which the button controls, the value stored | 58 | * @type: Radio type which the button controls, the value stored |
59 | * here should be a value from enum rfkill_type. | 59 | * here should be a value from enum rfkill_type. |
60 | * @state: State of the switch, "UNBLOCKED" means radio can operate. | 60 | * @state: State of the switch, "UNBLOCKED" means radio can operate. |
61 | * @user_claim_unsupported: Whether the hardware supports exclusive | ||
62 | * RF-kill control by userspace. Set this before registering. | ||
63 | * @user_claim: Set when the switch is controlled exlusively by userspace. | ||
64 | * @mutex: Guards switch state transitions. It serializes callbacks | 61 | * @mutex: Guards switch state transitions. It serializes callbacks |
65 | * and also protects the state. | 62 | * and also protects the state. |
66 | * @data: Pointer to the RF button drivers private data which will be | 63 | * @data: Pointer to the RF button drivers private data which will be |
@@ -83,9 +80,6 @@ struct rfkill { | |||
83 | const char *name; | 80 | const char *name; |
84 | enum rfkill_type type; | 81 | enum rfkill_type type; |
85 | 82 | ||
86 | bool user_claim_unsupported; | ||
87 | bool user_claim; | ||
88 | |||
89 | /* the mutex serializes callbacks and also protects | 83 | /* the mutex serializes callbacks and also protects |
90 | * the state */ | 84 | * the state */ |
91 | struct mutex mutex; | 85 | struct mutex mutex; |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 3eaa39403c13..df1269c5ca70 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -200,7 +200,7 @@ static void __rfkill_switch_all(const enum rfkill_type type, | |||
200 | 200 | ||
201 | rfkill_global_states[type].current_state = state; | 201 | rfkill_global_states[type].current_state = state; |
202 | list_for_each_entry(rfkill, &rfkill_list, node) { | 202 | list_for_each_entry(rfkill, &rfkill_list, node) { |
203 | if ((!rfkill->user_claim) && (rfkill->type == type)) { | 203 | if (rfkill->type == type) { |
204 | mutex_lock(&rfkill->mutex); | 204 | mutex_lock(&rfkill->mutex); |
205 | rfkill_toggle_radio(rfkill, state, 0); | 205 | rfkill_toggle_radio(rfkill, state, 0); |
206 | mutex_unlock(&rfkill->mutex); | 206 | mutex_unlock(&rfkill->mutex); |
@@ -447,53 +447,14 @@ static ssize_t rfkill_claim_show(struct device *dev, | |||
447 | struct device_attribute *attr, | 447 | struct device_attribute *attr, |
448 | char *buf) | 448 | char *buf) |
449 | { | 449 | { |
450 | struct rfkill *rfkill = to_rfkill(dev); | 450 | return sprintf(buf, "%d\n", 0); |
451 | |||
452 | return sprintf(buf, "%d\n", rfkill->user_claim); | ||
453 | } | 451 | } |
454 | 452 | ||
455 | static ssize_t rfkill_claim_store(struct device *dev, | 453 | static ssize_t rfkill_claim_store(struct device *dev, |
456 | struct device_attribute *attr, | 454 | struct device_attribute *attr, |
457 | const char *buf, size_t count) | 455 | const char *buf, size_t count) |
458 | { | 456 | { |
459 | struct rfkill *rfkill = to_rfkill(dev); | 457 | return -EOPNOTSUPP; |
460 | unsigned long claim_tmp; | ||
461 | bool claim; | ||
462 | int error; | ||
463 | |||
464 | if (!capable(CAP_NET_ADMIN)) | ||
465 | return -EPERM; | ||
466 | |||
467 | if (rfkill->user_claim_unsupported) | ||
468 | return -EOPNOTSUPP; | ||
469 | |||
470 | error = strict_strtoul(buf, 0, &claim_tmp); | ||
471 | if (error) | ||
472 | return error; | ||
473 | claim = !!claim_tmp; | ||
474 | |||
475 | /* | ||
476 | * Take the global lock to make sure the kernel is not in | ||
477 | * the middle of rfkill_switch_all | ||
478 | */ | ||
479 | error = mutex_lock_killable(&rfkill_global_mutex); | ||
480 | if (error) | ||
481 | return error; | ||
482 | |||
483 | if (rfkill->user_claim != claim) { | ||
484 | if (!claim && !rfkill_epo_lock_active) { | ||
485 | mutex_lock(&rfkill->mutex); | ||
486 | rfkill_toggle_radio(rfkill, | ||
487 | rfkill_global_states[rfkill->type].current_state, | ||
488 | 0); | ||
489 | mutex_unlock(&rfkill->mutex); | ||
490 | } | ||
491 | rfkill->user_claim = claim; | ||
492 | } | ||
493 | |||
494 | mutex_unlock(&rfkill_global_mutex); | ||
495 | |||
496 | return error ? error : count; | ||
497 | } | 458 | } |
498 | 459 | ||
499 | static struct device_attribute rfkill_dev_attrs[] = { | 460 | static struct device_attribute rfkill_dev_attrs[] = { |
diff --git a/net/wimax/op-rfkill.c b/net/wimax/op-rfkill.c index 870032faece2..a3616e2ccb8a 100644 --- a/net/wimax/op-rfkill.c +++ b/net/wimax/op-rfkill.c | |||
@@ -364,7 +364,6 @@ int wimax_rfkill_add(struct wimax_dev *wimax_dev) | |||
364 | rfkill->state = RFKILL_STATE_UNBLOCKED; | 364 | rfkill->state = RFKILL_STATE_UNBLOCKED; |
365 | rfkill->data = wimax_dev; | 365 | rfkill->data = wimax_dev; |
366 | rfkill->toggle_radio = wimax_rfkill_toggle_radio; | 366 | rfkill->toggle_radio = wimax_rfkill_toggle_radio; |
367 | rfkill->user_claim_unsupported = 1; | ||
368 | 367 | ||
369 | /* Initialize the input device for the hw key */ | 368 | /* Initialize the input device for the hw key */ |
370 | input_dev = input_allocate_device(); | 369 | input_dev = input_allocate_device(); |