Search Linux Wireless

Re: [RFC] rfkill: remove set_global_sw_state()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2009-06-08 at 11:14 +0100, Alan Jenkins wrote:
> 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.

Cool.

> 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).

How does that work?

> --- a/drivers/platform/x86/acer-wmi.c
> +++ b/drivers/platform/x86/acer-wmi.c

> @@ -996,8 +995,6 @@ static struct rfkill *acer_rfkill_register(struct device *dev,
>  				  (void *)(unsigned long)cap);
>  	if (!rfkill_dev)
>  		return ERR_PTR(-ENOMEM);
> -	get_u32(&state, cap);
> -	rfkill_set_sw_state(rfkill_dev, !state);

That does seem persistent, I'd think? get_u32 here hits ACPI iirc.

> diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
> index 8d93114..16fffe4 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)
>  					   RFKILL_TYPE_WLAN,
>  					   &hp_wmi_rfkill_ops,
>  					   (void *) 0);
> -		rfkill_set_sw_state(wifi_rfkill, hp_wmi_wifi_state());
>  		err = rfkill_register(wifi_rfkill);
>  		if (err)
>  			goto register_wifi_error;
> @@ -433,8 +432,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
>  						RFKILL_TYPE_BLUETOOTH,
>  						&hp_wmi_rfkill_ops,
>  						(void *) 1);
> -		rfkill_set_sw_state(bluetooth_rfkill,
> -				    hp_wmi_bluetooth_state());
>  		err = rfkill_register(bluetooth_rfkill);
>  		if (err)
>  			goto register_bluetooth_error;
> @@ -445,7 +442,6 @@ static int __init hp_wmi_bios_setup(struct platform_device *device)
>  					   RFKILL_TYPE_WWAN,
>  					   &hp_wmi_rfkill_ops,
>  					   (void *) 2);
> -		rfkill_set_sw_state(wwan_rfkill, hp_wmi_wwan_state());
>  		err = rfkill_register(wwan_rfkill);
>  		if (err)
>  			goto register_wwan_err;

Hmm. Anyone know anything about HP? That kinda looks persistent too.

> @@ -1200,8 +1185,20 @@ static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id,
>  	atp_rfk->id = id;
>  	atp_rfk->ops = tp_rfkops;
>  
> -	rfkill_set_states(atp_rfk->rfkill, initial_sw_state,
> -				tpacpi_rfk_check_hwblock_state());
> +	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);

That message seems wrong now, it would not turn off but impose the
current default, I think?

>  /**
> - * rfkill_set_global_sw_state - set global sw block default

There's a static inline in the !RFKILL case, please remove that too.

> @@ -916,7 +885,17 @@ int __must_check rfkill_register(struct rfkill *rfkill)
>  	if (rfkill->ops->poll)
>  		schedule_delayed_work(&rfkill->poll_work,
>  			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
> +	}

Ah, this is the quirky backward compat code you're talking about. I
guess we need it, although I don't particularly like it.

Looks good except for these few comments!

johannes

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux