Re: [PATCH 8/8] rfkill: add parameter to disable radios by default
From: Ivo van Doorn
Date: Sat Apr 12 2008 - 06:36:31 EST
Hi,
> Currently, radios are always enabled when their rfkill interface is
> registered. This is not optimal, the safest state for a radio is to be
> offline unless the user turns it on.
It defaults to the current state of the switch type.
What perhaps could be done, is that during registration it either reads
the status directly from rfkill to what the device initialized it to,
or call get_status() during registration to determine the new state itself.
That way we prevent series of module parameters and initialize to the state
the driver has indicated..
> Add a module parameter that causes all radios to be disabled when their
> rfkill interface is registered. Add override parameters for each rfkill
> switch type as well, just in case the user wants the defaults to be
> different for a given radio type.
I am not a big fan of large series of module parameters, so in that aspect
I am not a fan of this patch.
> We don't change the module default, but I'd really recommed doing so in a
> future patch.
>
> The parameters are called "default_state" (global), and
> "default_<type>_state", where <type> is: "wlan", "bluetooth", "uwb",
> "wimax", or "any". Note that "any" realy is a type and does not mean every
> radio type (use the global "default_state" parameter for that.
>
> The precedence order is "most specific first".
>
> Signed-off-by: Henrique de Moraes Holschuh <hmh@xxxxxxxxxx>
> Cc: Ivo van Doorn <IvDoorn@xxxxxxxxx>
> Cc: John W. Linville <linville@xxxxxxxxxxxxx>
> Cc: Dmitry Torokhov <dtor@xxxxxxx>
> ---
> net/rfkill/rfkill.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 58 insertions(+), 1 deletions(-)
>
> diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
> index 9d3bffb..421de8c 100644
> --- a/net/rfkill/rfkill.c
> +++ b/net/rfkill/rfkill.c
> @@ -39,6 +39,34 @@ MODULE_LICENSE("GPL");
> static LIST_HEAD(rfkill_list); /* list of registered rf switches */
> static DEFINE_MUTEX(rfkill_mutex);
>
> +static unsigned int rfkill_default_state = RFKILL_STATE_ON;
> +static unsigned int rfkill_default_state_wlan = UINT_MAX;
> +static unsigned int rfkill_default_state_bluetooth = UINT_MAX;
> +static unsigned int rfkill_default_state_uwb = UINT_MAX;
> +static unsigned int rfkill_default_state_wimax = UINT_MAX;
> +static unsigned int rfkill_default_state_wwan = UINT_MAX;
> +static unsigned int rfkill_default_state_any = UINT_MAX;
> +
> +module_param_named(default_state, rfkill_default_state, uint, 0444);
> +MODULE_PARM_DESC(default_state,
> + "Default initial state for all radio types, 0 = radio off");
> +
> +#define RFKILL_RADIO_DEFAULT(__type) \
> + module_param_named(default_##__type##_state, \
> + rfkill_default_state_##__type, uint, 0444); \
> + MODULE_PARM_DESC(default_##__type##_state, \
> + "Override initial state for radios of type " \
> + #__type ", 0 = radio off");
> +
> +RFKILL_RADIO_DEFAULT(wlan)
> +RFKILL_RADIO_DEFAULT(bluetooth)
> +RFKILL_RADIO_DEFAULT(uwb)
> +RFKILL_RADIO_DEFAULT(wimax)
> +RFKILL_RADIO_DEFAULT(wwan)
> +RFKILL_RADIO_DEFAULT(any)
> +
> +#undef RFKILL_RADIO_DEFAULT
> +
> static enum rfkill_state rfkill_states[RFKILL_TYPE_MAX];
>
>
> @@ -485,6 +513,17 @@ void rfkill_unregister(struct rfkill *rfkill)
> }
> EXPORT_SYMBOL(rfkill_unregister);
>
> +static int __init rfkill_init_states(unsigned int state, enum rfkill_type type)
> +{
> + if (state == UINT_MAX)
> + return 0;
> + else if (state == RFKILL_STATE_OFF || state == RFKILL_STATE_ON) {
> + rfkill_states[type] = state;
> + return 0;
> + }
> + return 1;
> +}
> +
> /*
> * Rfkill module initialization/deinitialization.
> */
> @@ -493,8 +532,26 @@ static int __init rfkill_init(void)
> int error;
> int i;
>
> + if (rfkill_default_state != RFKILL_STATE_OFF &&
> + rfkill_default_state != RFKILL_STATE_ON)
> + return -EINVAL;
> +
> for (i = 0; i < ARRAY_SIZE(rfkill_states); i++)
> - rfkill_states[i] = RFKILL_STATE_ON;
> + rfkill_states[i] = rfkill_default_state;
> +
> + if (rfkill_init_states(rfkill_default_state_wlan,
> + RFKILL_TYPE_WLAN)
> + || rfkill_init_states(rfkill_default_state_bluetooth,
> + RFKILL_TYPE_BLUETOOTH)
> + || rfkill_init_states(rfkill_default_state_uwb,
> + RFKILL_TYPE_UWB)
> + || rfkill_init_states(rfkill_default_state_wimax,
> + RFKILL_TYPE_WIMAX)
> + || rfkill_init_states(rfkill_default_state_wwan,
> + RFKILL_TYPE_WWAN)
> + || rfkill_init_states(rfkill_default_state_any,
> + RFKILL_TYPE_ANY))
> + return -EINVAL;
>
> error = class_register(&rfkill_class);
> if (error) {
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/