提交 b3fa1329 编写于 作者: A Alan Jenkins 提交者: John W. Linville

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: NAlan Jenkins <alan-jenkins@tuffmail.co.uk>
Acked-by: NHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 8f77f384
...@@ -988,7 +988,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev, ...@@ -988,7 +988,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev,
char *name, u32 cap) char *name, u32 cap)
{ {
int err; int err;
u32 state;
struct rfkill *rfkill_dev; struct rfkill *rfkill_dev;
rfkill_dev = rfkill_alloc(name, dev, type, rfkill_dev = rfkill_alloc(name, dev, type,
...@@ -996,8 +995,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev, ...@@ -996,8 +995,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev,
(void *)(unsigned long)cap); (void *)(unsigned long)cap);
if (!rfkill_dev) if (!rfkill_dev)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
get_u32(&state, cap);
rfkill_set_sw_state(rfkill_dev, !state);
err = rfkill_register(rfkill_dev); err = rfkill_register(rfkill_dev);
if (err) { if (err) {
......
...@@ -675,8 +675,8 @@ static int eeepc_hotk_add(struct acpi_device *device) ...@@ -675,8 +675,8 @@ static int eeepc_hotk_add(struct acpi_device *device)
if (!ehotk->eeepc_wlan_rfkill) if (!ehotk->eeepc_wlan_rfkill)
goto wlan_fail; goto wlan_fail;
rfkill_set_global_sw_state(RFKILL_TYPE_WLAN, rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill,
get_acpi(CM_ASL_WLAN) != 1); get_acpi(CM_ASL_WLAN) != 1);
result = rfkill_register(ehotk->eeepc_wlan_rfkill); result = rfkill_register(ehotk->eeepc_wlan_rfkill);
if (result) if (result)
goto wlan_fail; goto wlan_fail;
...@@ -693,8 +693,8 @@ static int eeepc_hotk_add(struct acpi_device *device) ...@@ -693,8 +693,8 @@ static int eeepc_hotk_add(struct acpi_device *device)
if (!ehotk->eeepc_bluetooth_rfkill) if (!ehotk->eeepc_bluetooth_rfkill)
goto bluetooth_fail; goto bluetooth_fail;
rfkill_set_global_sw_state(RFKILL_TYPE_BLUETOOTH, rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill,
get_acpi(CM_ASL_BLUETOOTH) != 1); get_acpi(CM_ASL_BLUETOOTH) != 1);
result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); result = rfkill_register(ehotk->eeepc_bluetooth_rfkill);
if (result) if (result)
goto bluetooth_fail; goto bluetooth_fail;
......
...@@ -422,7 +422,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -422,7 +422,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
RFKILL_TYPE_WLAN, RFKILL_TYPE_WLAN,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) 0); (void *) 0);
rfkill_set_sw_state(wifi_rfkill, hp_wmi_wifi_state());
err = rfkill_register(wifi_rfkill); err = rfkill_register(wifi_rfkill);
if (err) if (err)
goto register_wifi_error; goto register_wifi_error;
...@@ -433,8 +432,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -433,8 +432,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
RFKILL_TYPE_BLUETOOTH, RFKILL_TYPE_BLUETOOTH,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) 1); (void *) 1);
rfkill_set_sw_state(bluetooth_rfkill,
hp_wmi_bluetooth_state());
err = rfkill_register(bluetooth_rfkill); err = rfkill_register(bluetooth_rfkill);
if (err) if (err)
goto register_bluetooth_error; goto register_bluetooth_error;
...@@ -445,7 +442,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device) ...@@ -445,7 +442,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
RFKILL_TYPE_WWAN, RFKILL_TYPE_WWAN,
&hp_wmi_rfkill_ops, &hp_wmi_rfkill_ops,
(void *) 2); (void *) 2);
rfkill_set_sw_state(wwan_rfkill, hp_wmi_wwan_state());
err = rfkill_register(wwan_rfkill); err = rfkill_register(wwan_rfkill);
if (err) if (err)
goto register_wwan_err; goto register_wwan_err;
......
...@@ -1168,21 +1168,6 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, ...@@ -1168,21 +1168,6 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id,
BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]);
initial_sw_status = (tp_rfkops->get_status)();
if (initial_sw_status < 0) {
printk(TPACPI_ERR
"failed to read initial state for %s, error %d; "
"will turn radio off\n", name, initial_sw_status);
} else {
initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF);
if (set_default) {
/* try to set the initial state as the default for the
* rfkill type, since we ask the firmware to preserve
* it across S5 in NVRAM */
rfkill_set_global_sw_state(rfktype, initial_sw_state);
}
}
atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL); atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL);
if (atp_rfk) if (atp_rfk)
atp_rfk->rfkill = rfkill_alloc(name, atp_rfk->rfkill = rfkill_alloc(name,
...@@ -1200,8 +1185,20 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, ...@@ -1200,8 +1185,20 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id,
atp_rfk->id = id; atp_rfk->id = id;
atp_rfk->ops = tp_rfkops; atp_rfk->ops = tp_rfkops;
rfkill_set_states(atp_rfk->rfkill, initial_sw_state, initial_sw_status = (tp_rfkops->get_status)();
tpacpi_rfk_check_hwblock_state()); if (initial_sw_status < 0) {
printk(TPACPI_ERR
"failed to read initial state for %s, error %d\n",
name, initial_sw_status);
} else {
initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF);
if (set_default) {
/* try to keep the initial state, since we ask the
* firmware to preserve it across S5 in NVRAM */
rfkill_set_sw_state(atp_rfk->rfkill, initial_sw_state);
}
}
rfkill_set_hw_state(atp_rfk->rfkill, tpacpi_rfk_check_hwblock_state());
res = rfkill_register(atp_rfk->rfkill); res = rfkill_register(atp_rfk->rfkill);
if (res < 0) { if (res < 0) {
......
...@@ -157,8 +157,14 @@ struct rfkill * __must_check rfkill_alloc(const char *name, ...@@ -157,8 +157,14 @@ struct rfkill * __must_check rfkill_alloc(const char *name,
* @rfkill: rfkill structure to be registered * @rfkill: rfkill structure to be registered
* *
* This function should be called by the transmitter driver to register * This function should be called by the transmitter driver to register
* the rfkill structure needs to be registered. Before calling this function * the rfkill structure. Before calling this function the driver needs
* the driver needs to be ready to service method calls from rfkill. * to be ready to service method calls from rfkill.
*
* If the software blocked state is not set before registration,
* set_block will be called to initialize it to a default value.
*
* If the hardware blocked state is not set before registration,
* it is assumed to be unblocked.
*/ */
int __must_check rfkill_register(struct rfkill *rfkill); int __must_check rfkill_register(struct rfkill *rfkill);
...@@ -250,19 +256,6 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked); ...@@ -250,19 +256,6 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked);
*/ */
void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw);
/**
* rfkill_set_global_sw_state - set global sw block default
* @type: rfkill type to set default for
* @blocked: default to set
*
* This function sets the global default -- use at boot if your platform has
* an rfkill switch. If not early enough this call may be ignored.
*
* XXX: instead of ignoring -- how about just updating all currently
* registered drivers?
*/
void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked);
/** /**
* rfkill_blocked - query rfkill block * rfkill_blocked - query rfkill block
* *
...@@ -317,11 +310,6 @@ static inline void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) ...@@ -317,11 +310,6 @@ static inline void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
{ {
} }
static inline void rfkill_set_global_sw_state(const enum rfkill_type type,
bool blocked)
{
}
static inline bool rfkill_blocked(struct rfkill *rfkill) static inline bool rfkill_blocked(struct rfkill *rfkill)
{ {
return false; return false;
......
...@@ -57,6 +57,7 @@ struct rfkill { ...@@ -57,6 +57,7 @@ struct rfkill {
bool registered; bool registered;
bool suspended; bool suspended;
bool persistent;
const struct rfkill_ops *ops; const struct rfkill_ops *ops;
void *data; void *data;
...@@ -116,11 +117,9 @@ MODULE_PARM_DESC(default_state, ...@@ -116,11 +117,9 @@ MODULE_PARM_DESC(default_state,
"Default initial state for all radio types, 0 = radio off"); "Default initial state for all radio types, 0 = radio off");
static struct { static struct {
bool cur, def; bool cur, sav;
} rfkill_global_states[NUM_RFKILL_TYPES]; } rfkill_global_states[NUM_RFKILL_TYPES];
static unsigned long rfkill_states_default_locked;
static bool rfkill_epo_lock_active; static bool rfkill_epo_lock_active;
...@@ -392,7 +391,7 @@ void rfkill_epo(void) ...@@ -392,7 +391,7 @@ void rfkill_epo(void)
rfkill_set_block(rfkill, true); rfkill_set_block(rfkill, true);
for (i = 0; i < NUM_RFKILL_TYPES; i++) { for (i = 0; i < NUM_RFKILL_TYPES; i++) {
rfkill_global_states[i].def = rfkill_global_states[i].cur; rfkill_global_states[i].sav = rfkill_global_states[i].cur;
rfkill_global_states[i].cur = true; rfkill_global_states[i].cur = true;
} }
...@@ -417,7 +416,7 @@ void rfkill_restore_states(void) ...@@ -417,7 +416,7 @@ void rfkill_restore_states(void)
rfkill_epo_lock_active = false; rfkill_epo_lock_active = false;
for (i = 0; i < NUM_RFKILL_TYPES; i++) for (i = 0; i < NUM_RFKILL_TYPES; i++)
__rfkill_switch_all(i, rfkill_global_states[i].def); __rfkill_switch_all(i, rfkill_global_states[i].sav);
mutex_unlock(&rfkill_global_mutex); mutex_unlock(&rfkill_global_mutex);
} }
...@@ -464,29 +463,6 @@ bool rfkill_get_global_sw_state(const enum rfkill_type type) ...@@ -464,29 +463,6 @@ bool rfkill_get_global_sw_state(const enum rfkill_type type)
} }
#endif #endif
void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked)
{
BUG_ON(type == RFKILL_TYPE_ALL);
mutex_lock(&rfkill_global_mutex);
/* don't allow unblock when epo */
if (rfkill_epo_lock_active && !blocked)
goto out;
/* too late */
if (rfkill_states_default_locked & BIT(type))
goto out;
rfkill_states_default_locked |= BIT(type);
rfkill_global_states[type].cur = blocked;
rfkill_global_states[type].def = blocked;
out:
mutex_unlock(&rfkill_global_mutex);
}
EXPORT_SYMBOL(rfkill_set_global_sw_state);
bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked)
{ {
...@@ -532,13 +508,14 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) ...@@ -532,13 +508,14 @@ bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked)
blocked = blocked || hwblock; blocked = blocked || hwblock;
spin_unlock_irqrestore(&rfkill->lock, flags); spin_unlock_irqrestore(&rfkill->lock, flags);
if (!rfkill->registered) if (!rfkill->registered) {
return blocked; rfkill->persistent = true;
} else {
if (prev != blocked && !hwblock)
schedule_work(&rfkill->uevent_work);
if (prev != blocked && !hwblock) rfkill_led_trigger_event(rfkill);
schedule_work(&rfkill->uevent_work); }
rfkill_led_trigger_event(rfkill);
return blocked; return blocked;
} }
...@@ -563,13 +540,14 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) ...@@ -563,13 +540,14 @@ void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw)
spin_unlock_irqrestore(&rfkill->lock, flags); spin_unlock_irqrestore(&rfkill->lock, flags);
if (!rfkill->registered) if (!rfkill->registered) {
return; rfkill->persistent = true;
} else {
if (swprev != sw || hwprev != hw) if (swprev != sw || hwprev != hw)
schedule_work(&rfkill->uevent_work); schedule_work(&rfkill->uevent_work);
rfkill_led_trigger_event(rfkill); rfkill_led_trigger_event(rfkill);
}
} }
EXPORT_SYMBOL(rfkill_set_states); EXPORT_SYMBOL(rfkill_set_states);
...@@ -888,15 +866,6 @@ int __must_check rfkill_register(struct rfkill *rfkill) ...@@ -888,15 +866,6 @@ int __must_check rfkill_register(struct rfkill *rfkill)
dev_set_name(dev, "rfkill%lu", rfkill_no); dev_set_name(dev, "rfkill%lu", rfkill_no);
rfkill_no++; rfkill_no++;
if (!(rfkill_states_default_locked & BIT(rfkill->type))) {
/* first of its kind */
BUILD_BUG_ON(NUM_RFKILL_TYPES >
sizeof(rfkill_states_default_locked) * 8);
rfkill_states_default_locked |= BIT(rfkill->type);
rfkill_global_states[rfkill->type].cur =
rfkill_global_states[rfkill->type].def;
}
list_add_tail(&rfkill->node, &rfkill_list); list_add_tail(&rfkill->node, &rfkill_list);
error = device_add(dev); error = device_add(dev);
...@@ -916,7 +885,17 @@ int __must_check rfkill_register(struct rfkill *rfkill) ...@@ -916,7 +885,17 @@ int __must_check rfkill_register(struct rfkill *rfkill)
if (rfkill->ops->poll) if (rfkill->ops->poll)
schedule_delayed_work(&rfkill->poll_work, schedule_delayed_work(&rfkill->poll_work,
round_jiffies_relative(POLL_INTERVAL)); round_jiffies_relative(POLL_INTERVAL));
schedule_work(&rfkill->sync_work);
if (!rfkill->persistent || rfkill_epo_lock_active) {
schedule_work(&rfkill->sync_work);
} else {
#ifdef CONFIG_RFKILL_INPUT
bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW);
if (!atomic_read(&rfkill_input_disabled))
__rfkill_switch_all(rfkill->type, soft_blocked);
#endif
}
rfkill_send_events(rfkill, RFKILL_OP_ADD); rfkill_send_events(rfkill, RFKILL_OP_ADD);
...@@ -1193,7 +1172,7 @@ static int __init rfkill_init(void) ...@@ -1193,7 +1172,7 @@ static int __init rfkill_init(void)
int i; int i;
for (i = 0; i < NUM_RFKILL_TYPES; i++) for (i = 0; i < NUM_RFKILL_TYPES; i++)
rfkill_global_states[i].def = !rfkill_default_state; rfkill_global_states[i].cur = !rfkill_default_state;
error = class_register(&rfkill_class); error = class_register(&rfkill_class);
if (error) if (error)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册