Skip to content

Commit

Permalink
rfkill: remove user_claim stuff
Browse files Browse the repository at this point in the history
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: Johannes Berg <[email protected]>
Signed-off-by: John W. Linville <[email protected]>
  • Loading branch information
jmberg authored and linvjw committed Apr 22, 2009
1 parent c1c6b14 commit 621cac8
Show file tree
Hide file tree
Showing 12 changed files with 9 additions and 72 deletions.
16 changes: 6 additions & 10 deletions Documentation/rfkill.txt
Original file line number Diff line number Diff line change
Expand Up @@ -521,16 +521,12 @@ status of the system.
Input devices may issue events that are related to rfkill. These are the
various KEY_* events and SW_* events supported by rfkill-input.c.

******IMPORTANT******
When rfkill-input is ACTIVE, userspace is NOT TO CHANGE THE STATE OF AN RFKILL
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
is *absolute*; do NOT violate it.
******IMPORTANT******

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.
Userspace may not change the state of an rfkill switch in response to an
input event, it should refrain from changing states entirely.

Userspace cannot assume it is the only source of control for rfkill switches.
Their state can 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
change by writing to the "state" attribute in order for anything to happen.
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/ath9k/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1267,7 +1267,6 @@ static int ath_init_sw_rfkill(struct ath_softc *sc)
sc->rf_kill.rfkill->data = sc;
sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio;
sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED;
sc->rf_kill.rfkill->user_claim_unsupported = 1;

return 0;
}
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/b43/rfkill.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,6 @@ void b43_rfkill_init(struct b43_wldev *dev)
rfk->rfkill->state = RFKILL_STATE_UNBLOCKED;
rfk->rfkill->data = dev;
rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle;
rfk->rfkill->user_claim_unsupported = 1;

rfk->poll_dev = input_allocate_polled_device();
if (!rfk->poll_dev) {
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/b43legacy/rfkill.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
rfk->rfkill->state = RFKILL_STATE_UNBLOCKED;
rfk->rfkill->data = dev;
rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle;
rfk->rfkill->user_claim_unsupported = 1;

rfk->poll_dev = input_allocate_polled_device();
if (!rfk->poll_dev) {
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/iwlwifi/iwl-rfkill.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ int iwl_rfkill_init(struct iwl_priv *priv)
priv->rfkill->data = priv;
priv->rfkill->state = RFKILL_STATE_UNBLOCKED;
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->resume = NULL;
Expand Down
1 change: 0 additions & 1 deletion drivers/platform/x86/acer-wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1005,7 +1005,6 @@ enum rfkill_type type, char *name, u32 cap)
*data = cap;
rfkill_dev->data = data;
rfkill_dev->toggle_radio = acer_rfkill_set;
rfkill_dev->user_claim_unsupported = 1;

err = rfkill_register(rfkill_dev);
if (err) {
Expand Down
3 changes: 0 additions & 3 deletions drivers/platform/x86/hp-wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
wifi_rfkill->name = "hp-wifi";
wifi_rfkill->state = hp_wmi_wifi_state();
wifi_rfkill->toggle_radio = hp_wmi_wifi_set;
wifi_rfkill->user_claim_unsupported = 1;
err = rfkill_register(wifi_rfkill);
if (err)
goto add_sysfs_error;
Expand All @@ -446,7 +445,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
bluetooth_rfkill->name = "hp-bluetooth";
bluetooth_rfkill->state = hp_wmi_bluetooth_state();
bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set;
bluetooth_rfkill->user_claim_unsupported = 1;
err = rfkill_register(bluetooth_rfkill);
if (err)
goto register_bluetooth_error;
Expand All @@ -457,7 +455,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
wwan_rfkill->name = "hp-wwan";
wwan_rfkill->state = hp_wmi_wwan_state();
wwan_rfkill->toggle_radio = hp_wmi_wwan_set;
wwan_rfkill->user_claim_unsupported = 1;
err = rfkill_register(wwan_rfkill);
if (err)
goto register_wwan_err;
Expand Down
4 changes: 0 additions & 4 deletions drivers/platform/x86/sony-laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -1097,7 +1097,6 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device)
sony_wifi_rfkill->name = "sony-wifi";
sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wifi_rfkill->get_state = sony_nc_rfkill_get;
sony_wifi_rfkill->user_claim_unsupported = 1;
sony_wifi_rfkill->data = (void *)SONY_WIFI;
err = rfkill_register(sony_wifi_rfkill);
if (err)
Expand All @@ -1119,7 +1118,6 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device)
sony_bluetooth_rfkill->name = "sony-bluetooth";
sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get;
sony_bluetooth_rfkill->user_claim_unsupported = 1;
sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH;
err = rfkill_register(sony_bluetooth_rfkill);
if (err)
Expand All @@ -1140,7 +1138,6 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device)
sony_wwan_rfkill->name = "sony-wwan";
sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wwan_rfkill->get_state = sony_nc_rfkill_get;
sony_wwan_rfkill->user_claim_unsupported = 1;
sony_wwan_rfkill->data = (void *)SONY_WWAN;
err = rfkill_register(sony_wwan_rfkill);
if (err)
Expand All @@ -1161,7 +1158,6 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device)
sony_wimax_rfkill->name = "sony-wimax";
sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set;
sony_wimax_rfkill->get_state = sony_nc_rfkill_get;
sony_wimax_rfkill->user_claim_unsupported = 1;
sony_wimax_rfkill->data = (void *)SONY_WIMAX;
err = rfkill_register(sony_wimax_rfkill);
if (err)
Expand Down
1 change: 0 additions & 1 deletion drivers/platform/x86/toshiba_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,6 @@ static int __init toshiba_acpi_init(void)

toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name;
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;

if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) {
Expand Down
6 changes: 0 additions & 6 deletions include/linux/rfkill.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,6 @@ enum rfkill_state {
* @type: Radio type which the button controls, the value stored
* here should be a value from enum rfkill_type.
* @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
* and also protects the state.
* @data: Pointer to the RF button drivers private data which will be
Expand All @@ -83,9 +80,6 @@ struct rfkill {
const char *name;
enum rfkill_type type;

bool user_claim_unsupported;
bool user_claim;

/* the mutex serializes callbacks and also protects
* the state */
struct mutex mutex;
Expand Down
45 changes: 3 additions & 42 deletions net/rfkill/rfkill.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ static void __rfkill_switch_all(const enum rfkill_type type,

rfkill_global_states[type].current_state = state;
list_for_each_entry(rfkill, &rfkill_list, node) {
if ((!rfkill->user_claim) && (rfkill->type == type)) {
if (rfkill->type == type) {
mutex_lock(&rfkill->mutex);
rfkill_toggle_radio(rfkill, state, 0);
mutex_unlock(&rfkill->mutex);
Expand Down Expand Up @@ -447,53 +447,14 @@ static ssize_t rfkill_claim_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct rfkill *rfkill = to_rfkill(dev);

return sprintf(buf, "%d\n", rfkill->user_claim);
return sprintf(buf, "%d\n", 0);
}

static ssize_t rfkill_claim_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct rfkill *rfkill = to_rfkill(dev);
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;
return -EOPNOTSUPP;
}

static struct device_attribute rfkill_dev_attrs[] = {
Expand Down
1 change: 0 additions & 1 deletion net/wimax/op-rfkill.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,6 @@ int wimax_rfkill_add(struct wimax_dev *wimax_dev)
rfkill->state = RFKILL_STATE_UNBLOCKED;
rfkill->data = wimax_dev;
rfkill->toggle_radio = wimax_rfkill_toggle_radio;
rfkill->user_claim_unsupported = 1;

/* Initialize the input device for the hw key */
input_dev = input_allocate_device();
Expand Down

0 comments on commit 621cac8

Please sign in to comment.