Commit 621cac85 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

rfkill: remove user_claim stuff

Almost all drivers do not support user_claim, so remove it
completely and always report -EOPNOTSUPP to userspace. Since
userspace cannot really drive rfkill _anyway_ (due to the
odd restrictions imposed by the documentation) having this
code is just pointless.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c1c6b14b
...@@ -521,16 +521,12 @@ status of the system. ...@@ -521,16 +521,12 @@ status of the system.
Input devices may issue events that are related to rfkill. These are the Input devices may issue events that are related to rfkill. These are the
various KEY_* events and SW_* events supported by rfkill-input.c. various KEY_* events and SW_* events supported by rfkill-input.c.
******IMPORTANT****** Userspace may not change the state of an rfkill switch in response to an
When rfkill-input is ACTIVE, userspace is NOT TO CHANGE THE STATE OF AN RFKILL input event, it should refrain from changing states entirely.
SWITCH IN RESPONSE TO AN INPUT EVENT also handled by rfkill-input, unless it
has set to true the user_claim attribute for that particular switch. This rule Userspace cannot assume it is the only source of control for rfkill switches.
is *absolute*; do NOT violate it. Their state can change due to firmware actions, direct user actions, and the
******IMPORTANT****** rfkill-input EPO override for *_RFKILL_ALL.
Userspace must not assume it is the only source of control for rfkill switches.
Their state CAN and WILL change due to firmware actions, direct user actions,
and the rfkill-input EPO override for *_RFKILL_ALL.
When rfkill-input is not active, userspace must initiate a rfkill status When rfkill-input is not active, userspace must initiate a rfkill status
change by writing to the "state" attribute in order for anything to happen. change by writing to the "state" attribute in order for anything to happen.
......
...@@ -1267,7 +1267,6 @@ static int ath_init_sw_rfkill(struct ath_softc *sc) ...@@ -1267,7 +1267,6 @@ static int ath_init_sw_rfkill(struct ath_softc *sc)
sc->rf_kill.rfkill->data = sc; sc->rf_kill.rfkill->data = sc;
sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio; sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio;
sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED; sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED;
sc->rf_kill.rfkill->user_claim_unsupported = 1;
return 0; return 0;
} }
......
...@@ -139,7 +139,6 @@ void b43_rfkill_init(struct b43_wldev *dev) ...@@ -139,7 +139,6 @@ void b43_rfkill_init(struct b43_wldev *dev)
rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; rfk->rfkill->state = RFKILL_STATE_UNBLOCKED;
rfk->rfkill->data = dev; rfk->rfkill->data = dev;
rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle; rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle;
rfk->rfkill->user_claim_unsupported = 1;
rfk->poll_dev = input_allocate_polled_device(); rfk->poll_dev = input_allocate_polled_device();
if (!rfk->poll_dev) { if (!rfk->poll_dev) {
......
...@@ -142,7 +142,6 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev) ...@@ -142,7 +142,6 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; rfk->rfkill->state = RFKILL_STATE_UNBLOCKED;
rfk->rfkill->data = dev; rfk->rfkill->data = dev;
rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle; rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle;
rfk->rfkill->user_claim_unsupported = 1;
rfk->poll_dev = input_allocate_polled_device(); rfk->poll_dev = input_allocate_polled_device();
if (!rfk->poll_dev) { if (!rfk->poll_dev) {
......
...@@ -91,7 +91,6 @@ int iwl_rfkill_init(struct iwl_priv *priv) ...@@ -91,7 +91,6 @@ int iwl_rfkill_init(struct iwl_priv *priv)
priv->rfkill->data = priv; priv->rfkill->data = priv;
priv->rfkill->state = RFKILL_STATE_UNBLOCKED; priv->rfkill->state = RFKILL_STATE_UNBLOCKED;
priv->rfkill->toggle_radio = iwl_rfkill_soft_rf_kill; priv->rfkill->toggle_radio = iwl_rfkill_soft_rf_kill;
priv->rfkill->user_claim_unsupported = 1;
priv->rfkill->dev.class->suspend = NULL; priv->rfkill->dev.class->suspend = NULL;
priv->rfkill->dev.class->resume = NULL; priv->rfkill->dev.class->resume = NULL;
......
...@@ -1005,7 +1005,6 @@ enum rfkill_type type, char *name, u32 cap) ...@@ -1005,7 +1005,6 @@ enum rfkill_type type, char *name, u32 cap)
*data = cap; *data = cap;
rfkill_dev->data = data; rfkill_dev->data = data;
rfkill_dev->toggle_radio = acer_rfkill_set; rfkill_dev->toggle_radio = acer_rfkill_set;
rfkill_dev->user_claim_unsupported = 1;
err = rfkill_register(rfkill_dev); err = rfkill_register(rfkill_dev);
if (err) { if (err) {
......
...@@ -434,7 +434,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -434,7 +434,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
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;
err = rfkill_register(wifi_rfkill); err = rfkill_register(wifi_rfkill);
if (err) if (err)
goto add_sysfs_error; goto add_sysfs_error;
...@@ -446,7 +445,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -446,7 +445,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
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;
err = rfkill_register(bluetooth_rfkill); err = rfkill_register(bluetooth_rfkill);
if (err) if (err)
goto register_bluetooth_error; goto register_bluetooth_error;
...@@ -457,7 +455,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -457,7 +455,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
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;
err = rfkill_register(wwan_rfkill); err = rfkill_register(wwan_rfkill);
if (err) if (err)
goto register_wwan_err; goto register_wwan_err;
......
...@@ -1097,7 +1097,6 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device) ...@@ -1097,7 +1097,6 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device)
sony_wifi_rfkill->name = "sony-wifi"; sony_wifi_rfkill->name = "sony-wifi";
sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set; sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wifi_rfkill->get_state = sony_nc_rfkill_get; sony_wifi_rfkill->get_state = sony_nc_rfkill_get;
sony_wifi_rfkill->user_claim_unsupported = 1;
sony_wifi_rfkill->data = (void *)SONY_WIFI; sony_wifi_rfkill->data = (void *)SONY_WIFI;
err = rfkill_register(sony_wifi_rfkill); err = rfkill_register(sony_wifi_rfkill);
if (err) if (err)
...@@ -1119,7 +1118,6 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device) ...@@ -1119,7 +1118,6 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device)
sony_bluetooth_rfkill->name = "sony-bluetooth"; sony_bluetooth_rfkill->name = "sony-bluetooth";
sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set; sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get; sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get;
sony_bluetooth_rfkill->user_claim_unsupported = 1;
sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH; sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH;
err = rfkill_register(sony_bluetooth_rfkill); err = rfkill_register(sony_bluetooth_rfkill);
if (err) if (err)
...@@ -1140,7 +1138,6 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device) ...@@ -1140,7 +1138,6 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device)
sony_wwan_rfkill->name = "sony-wwan"; sony_wwan_rfkill->name = "sony-wwan";
sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set; sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wwan_rfkill->get_state = sony_nc_rfkill_get; sony_wwan_rfkill->get_state = sony_nc_rfkill_get;
sony_wwan_rfkill->user_claim_unsupported = 1;
sony_wwan_rfkill->data = (void *)SONY_WWAN; sony_wwan_rfkill->data = (void *)SONY_WWAN;
err = rfkill_register(sony_wwan_rfkill); err = rfkill_register(sony_wwan_rfkill);
if (err) if (err)
...@@ -1161,7 +1158,6 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device) ...@@ -1161,7 +1158,6 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device)
sony_wimax_rfkill->name = "sony-wimax"; sony_wimax_rfkill->name = "sony-wimax";
sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set; sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wimax_rfkill->get_state = sony_nc_rfkill_get; sony_wimax_rfkill->get_state = sony_nc_rfkill_get;
sony_wimax_rfkill->user_claim_unsupported = 1;
sony_wimax_rfkill->data = (void *)SONY_WIMAX; sony_wimax_rfkill->data = (void *)SONY_WIMAX;
err = rfkill_register(sony_wimax_rfkill); err = rfkill_register(sony_wimax_rfkill);
if (err) if (err)
......
...@@ -803,7 +803,6 @@ static int __init toshiba_acpi_init(void) ...@@ -803,7 +803,6 @@ static int __init toshiba_acpi_init(void)
toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name; toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name;
toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio; toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio;
toshiba_acpi.rfk_dev->user_claim_unsupported = 1;
toshiba_acpi.rfk_dev->data = &toshiba_acpi; toshiba_acpi.rfk_dev->data = &toshiba_acpi;
if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) { if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) {
......
...@@ -58,9 +58,6 @@ enum rfkill_state { ...@@ -58,9 +58,6 @@ enum rfkill_state {
* @type: Radio type which the button controls, the value stored * @type: Radio type which the button controls, the value stored
* here should be a value from enum rfkill_type. * here should be a value from enum rfkill_type.
* @state: State of the switch, "UNBLOCKED" means radio can operate. * @state: State of the switch, "UNBLOCKED" means radio can operate.
* @user_claim_unsupported: Whether the hardware supports exclusive
* RF-kill control by userspace. Set this before registering.
* @user_claim: Set when the switch is controlled exlusively by userspace.
* @mutex: Guards switch state transitions. It serializes callbacks * @mutex: Guards switch state transitions. It serializes callbacks
* and also protects the state. * and also protects the state.
* @data: Pointer to the RF button drivers private data which will be * @data: Pointer to the RF button drivers private data which will be
...@@ -83,9 +80,6 @@ struct rfkill { ...@@ -83,9 +80,6 @@ struct rfkill {
const char *name; const char *name;
enum rfkill_type type; enum rfkill_type type;
bool user_claim_unsupported;
bool user_claim;
/* the mutex serializes callbacks and also protects /* the mutex serializes callbacks and also protects
* the state */ * the state */
struct mutex mutex; struct mutex mutex;
......
...@@ -200,7 +200,7 @@ static void __rfkill_switch_all(const enum rfkill_type type, ...@@ -200,7 +200,7 @@ static void __rfkill_switch_all(const enum rfkill_type type,
rfkill_global_states[type].current_state = state; rfkill_global_states[type].current_state = state;
list_for_each_entry(rfkill, &rfkill_list, node) { list_for_each_entry(rfkill, &rfkill_list, node) {
if ((!rfkill->user_claim) && (rfkill->type == type)) { if (rfkill->type == type) {
mutex_lock(&rfkill->mutex); mutex_lock(&rfkill->mutex);
rfkill_toggle_radio(rfkill, state, 0); rfkill_toggle_radio(rfkill, state, 0);
mutex_unlock(&rfkill->mutex); mutex_unlock(&rfkill->mutex);
...@@ -447,53 +447,14 @@ static ssize_t rfkill_claim_show(struct device *dev, ...@@ -447,53 +447,14 @@ static ssize_t rfkill_claim_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct rfkill *rfkill = to_rfkill(dev); return sprintf(buf, "%d\n", 0);
return sprintf(buf, "%d\n", rfkill->user_claim);
} }
static ssize_t rfkill_claim_store(struct device *dev, static ssize_t rfkill_claim_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct rfkill *rfkill = to_rfkill(dev); return -EOPNOTSUPP;
unsigned long claim_tmp;
bool claim;
int error;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
if (rfkill->user_claim_unsupported)
return -EOPNOTSUPP;
error = strict_strtoul(buf, 0, &claim_tmp);
if (error)
return error;
claim = !!claim_tmp;
/*
* Take the global lock to make sure the kernel is not in
* the middle of rfkill_switch_all
*/
error = mutex_lock_killable(&rfkill_global_mutex);
if (error)
return error;
if (rfkill->user_claim != claim) {
if (!claim && !rfkill_epo_lock_active) {
mutex_lock(&rfkill->mutex);
rfkill_toggle_radio(rfkill,
rfkill_global_states[rfkill->type].current_state,
0);
mutex_unlock(&rfkill->mutex);
}
rfkill->user_claim = claim;
}
mutex_unlock(&rfkill_global_mutex);
return error ? error : count;
} }
static struct device_attribute rfkill_dev_attrs[] = { static struct device_attribute rfkill_dev_attrs[] = {
......
...@@ -364,7 +364,6 @@ int wimax_rfkill_add(struct wimax_dev *wimax_dev) ...@@ -364,7 +364,6 @@ int wimax_rfkill_add(struct wimax_dev *wimax_dev)
rfkill->state = RFKILL_STATE_UNBLOCKED; rfkill->state = RFKILL_STATE_UNBLOCKED;
rfkill->data = wimax_dev; rfkill->data = wimax_dev;
rfkill->toggle_radio = wimax_rfkill_toggle_radio; rfkill->toggle_radio = wimax_rfkill_toggle_radio;
rfkill->user_claim_unsupported = 1;
/* Initialize the input device for the hw key */ /* Initialize the input device for the hw key */
input_dev = input_allocate_device(); input_dev = input_allocate_device();
......
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