All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Williams <dcbw@redhat.com>
To: "João Paulo Rechi Vita" <jprvita@gmail.com>,
	"Johannes Berg" <johannes@sipsolutions.net>
Cc: "David S. Miller" <davem@davemloft.net>,
	"Darren Hart" <dvhart@infradead.org>,
	linux-wireless@vger.kernel.org, netdev@vger.kernel.org,
	platform-driver-x86@vger.kernel.org, linux-api@vger.kernel.org,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux@endlessm.com,
	"João Paulo Rechi Vita" <jprvita@endlessm.com>
Subject: Re: [PATCH 8/9] rfkill: Userspace control for airplane mode
Date: Mon, 08 Feb 2016 10:11:27 -0600	[thread overview]
Message-ID: <1454947887.5325.8.camel@redhat.com> (raw)
In-Reply-To: <1454946096-9752-9-git-send-email-jprvita@endlessm.com>

On Mon, 2016-02-08 at 10:41 -0500, João Paulo Rechi Vita wrote:
> Provide an interface for the airplane-mode indicator be controlled
> from
> userspace. User has to first acquire the control through
> RFKILL_OP_AIRPLANE_MODE_ACQUIRE and keep the fd open for the whole
> time
> it wants to be in control of the indicator. Closing the fd or using
> RFKILL_OP_AIRPLANE_MODE_RELEASE restores the default policy.
> 
> To change state of the indicator, the RFKILL_OP_AIRPLANE_MODE_CHANGE
> operation is used, passing the value on "struct rfkill_event.soft".
> If
> the caller has not acquired the airplane-mode control beforehand, the
> operation fails.

I'd like to clarify a bit, so tell me if I'm correct or not.  Using
RFKILL_OP_AIRPLANE_MODE_CHANGE does not actually change any device
state. It's just an indicator with no relationship to any of the
registered rfkill switches, right?

I wonder if setting RFKILL_OP_AIRPLANE_MODE_CHANGE(true) shouldn't also
softblock all switches, otherwise you can set airplane mode all day
long with RFKILL_OP_AIRPLANE_MODE_CHANGE and it doesn't actually enable
airplane mode at all?

Dan

> Signed-off-by: João Paulo Rechi Vita <jprvita@endlessm.com>
> ---
>  Documentation/rfkill.txt    | 10 ++++++++++
>  include/uapi/linux/rfkill.h |  3 +++
>  net/rfkill/core.c           | 47
> ++++++++++++++++++++++++++++++++++++++++++---
>  3 files changed, 57 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt
> index b13025a..aa6e014 100644
> --- a/Documentation/rfkill.txt
> +++ b/Documentation/rfkill.txt
> @@ -87,6 +87,7 @@ RFKill provides per-switch LED triggers, which can
> be used to drive LEDs
>  according to the switch state (LED_FULL when blocked, LED_OFF
> otherwise).
>  An airplane-mode indicator LED trigger is also available, which
> triggers
>  LED_FULL when all radios known by RFKill are blocked, and LED_OFF
> otherwise.
> +The airplane-mode indicator LED trigger policy can be overridden by
> userspace.
>  
>  
>  5. Userspace support
> @@ -123,5 +124,14 @@ RFKILL_TYPE
>  The contents of these variables corresponds to the "name", "state"
> and
>  "type" sysfs files explained above.
>  
> +Userspace can also override the default airplane-mode indicator
> policy through
> +/dev/rfkill. Control of the airplane mode indicator has to be
> acquired first,
> +using RFKILL_OP_AIRPLANE_MODE_ACQUIRE, and is only available for one
> userspace
> +application at a time. Closing the fd or using
> RFKILL_OP_AIRPLANE_MODE_RELEASE
> +reverts the airplane-mode indicator back to the default kernel
> policy and makes
> +it available for other applications to take control. Changes to the
> +airplane-mode indicator state can be made using
> RFKILL_OP_AIRPLANE_MODE_CHANGE,
> +passing the new value in the 'soft' field of 'struct rfkill_event'.
> +
>  
>  For further details consult Documentation/ABI/stable/sysfs-class
> -rfkill.
> diff --git a/include/uapi/linux/rfkill.h
> b/include/uapi/linux/rfkill.h
> index 2e00dce..9cb999b 100644
> --- a/include/uapi/linux/rfkill.h
> +++ b/include/uapi/linux/rfkill.h
> @@ -67,6 +67,9 @@ enum rfkill_operation {
>  	RFKILL_OP_DEL,
>  	RFKILL_OP_CHANGE,
>  	RFKILL_OP_CHANGE_ALL,
> +	RFKILL_OP_AIRPLANE_MODE_ACQUIRE,
> +	RFKILL_OP_AIRPLANE_MODE_RELEASE,
> +	RFKILL_OP_AIRPLANE_MODE_CHANGE,
>  };
>  
>  /**
> diff --git a/net/rfkill/core.c b/net/rfkill/core.c
> index fb11547..8067701 100644
> --- a/net/rfkill/core.c
> +++ b/net/rfkill/core.c
> @@ -89,6 +89,7 @@ struct rfkill_data {
>  	struct mutex		mtx;
>  	wait_queue_head_t	read_wait;
>  	bool			input_handler;
> +	bool			is_apm_owner;
>  };
>  
>  
> @@ -123,7 +124,7 @@ static struct {
>  } rfkill_global_states[NUM_RFKILL_TYPES];
>  
>  static bool rfkill_epo_lock_active;
> -
> +static bool rfkill_apm_owned;
>  
>  #ifdef CONFIG_RFKILL_LEDS
>  static struct led_trigger rfkill_apm_led_trigger;
> @@ -350,7 +351,8 @@ static void rfkill_update_global_state(enum
> rfkill_type type, bool blocked)
>  
>  	for (i = 0; i < NUM_RFKILL_TYPES; i++)
>  		rfkill_global_states[i].cur = blocked;
> -	rfkill_apm_led_trigger_event(blocked);
> +	if (!rfkill_apm_owned)
> +		rfkill_apm_led_trigger_event(blocked);
>  }
>  
>  #ifdef CONFIG_RFKILL_INPUT
> @@ -1183,6 +1185,7 @@ static ssize_t rfkill_fop_read(struct file
> *file, char __user *buf,
>  static ssize_t rfkill_fop_write(struct file *file, const char __user
> *buf,
>  				size_t count, loff_t *pos)
>  {
> +	struct rfkill_data *data = file->private_data;
>  	struct rfkill *rfkill;
>  	struct rfkill_event ev;
>  
> @@ -1199,7 +1202,7 @@ static ssize_t rfkill_fop_write(struct file
> *file, const char __user *buf,
>  	if (copy_from_user(&ev, buf, count))
>  		return -EFAULT;
>  
> -	if (ev.op != RFKILL_OP_CHANGE && ev.op !=
> RFKILL_OP_CHANGE_ALL)
> +	if (ev.op < RFKILL_OP_CHANGE)
>  		return -EINVAL;
>  
>  	if (ev.type >= NUM_RFKILL_TYPES)
> @@ -1207,6 +1210,34 @@ static ssize_t rfkill_fop_write(struct file
> *file, const char __user *buf,
>  
>  	mutex_lock(&rfkill_global_mutex);
>  
> +	if (ev.op == RFKILL_OP_AIRPLANE_MODE_ACQUIRE) {
> +		if (rfkill_apm_owned && !data->is_apm_owner) {
> +			count = -EACCES;
> +		} else {
> +			rfkill_apm_owned = true;
> +			data->is_apm_owner = true;
> +		}
> +	}
> +
> +	if (ev.op == RFKILL_OP_AIRPLANE_MODE_RELEASE) {
> +		if (rfkill_apm_owned && !data->is_apm_owner) {
> +			count = -EACCES;
> +		} else {
> +			bool state =
> rfkill_global_states[RFKILL_TYPE_ALL].cur;
> +
> +			rfkill_apm_owned = false;
> +			data->is_apm_owner = false;
> +			rfkill_apm_led_trigger_event(state);
> +		}
> +	}
> +
> +	if (ev.op == RFKILL_OP_AIRPLANE_MODE_CHANGE) {
> +		if (rfkill_apm_owned && data->is_apm_owner)
> +			rfkill_apm_led_trigger_event(ev.soft);
> +		else
> +			count = -EACCES;
> +	}
> +
>  	if (ev.op == RFKILL_OP_CHANGE_ALL)
>  		rfkill_update_global_state(ev.type, ev.soft);
>  
> @@ -1230,7 +1261,17 @@ static int rfkill_fop_release(struct inode
> *inode, struct file *file)
>  	struct rfkill_int_event *ev, *tmp;
>  
>  	mutex_lock(&rfkill_global_mutex);
> +
> +	if (data->is_apm_owner) {
> +		bool state =
> rfkill_global_states[RFKILL_TYPE_ALL].cur;
> +
> +		rfkill_apm_owned = false;
> +		data->is_apm_owner = false;
> +		rfkill_apm_led_trigger_event(state);
> +	}
> +
>  	list_del(&data->list);
> +
>  	mutex_unlock(&rfkill_global_mutex);
>  
>  	mutex_destroy(&data->mtx);

  reply	other threads:[~2016-02-08 16:11 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-08 15:41 [PATCH 0/9] RFKill airplane-mode indicator João Paulo Rechi Vita
2016-02-08 15:41 ` [PATCH 1/9] rfkill: Improve documentation language João Paulo Rechi Vita
     [not found]   ` <1454946096-9752-2-git-send-email-jprvita-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>
2016-02-08 22:37     ` Julian Calaby
2016-02-08 22:37       ` Julian Calaby
2016-02-08 15:41 ` [PATCH 2/9] rfkill: Remove extra blank line João Paulo Rechi Vita
2016-02-08 22:38   ` Julian Calaby
2016-02-08 15:41 ` [PATCH 3/9] rfkill: Point to the correct deprecated doc location João Paulo Rechi Vita
2016-02-08 22:39   ` Julian Calaby
2016-02-08 15:41 ` [PATCH 4/9] rfkill: Move "state" sysfs file back to stable João Paulo Rechi Vita
2016-02-08 15:41 ` [PATCH 5/9] rfkill: Factor rfkill_global_states[].cur assignments João Paulo Rechi Vita
     [not found]   ` <1454946096-9752-6-git-send-email-jprvita-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>
2016-02-08 22:40     ` Julian Calaby
2016-02-08 22:40       ` Julian Calaby
2016-02-08 15:41 ` [PATCH 6/9] rfkill: Add documentation about LED triggers João Paulo Rechi Vita
2016-02-08 15:41 ` [PATCH 7/9] rfkill: Create "rfkill-airplane_mode" LED trigger João Paulo Rechi Vita
2016-02-18 20:08   ` Johannes Berg
2016-02-22 16:10     ` João Paulo Rechi Vita
     [not found] ` <1454946096-9752-1-git-send-email-jprvita-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>
2016-02-08 15:41   ` [PATCH 8/9] rfkill: Userspace control for airplane mode João Paulo Rechi Vita
2016-02-08 15:41     ` João Paulo Rechi Vita
2016-02-08 16:11     ` Dan Williams [this message]
2016-02-08 17:22       ` João Paulo Rechi Vita
     [not found]       ` <1454947887.5325.8.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-02-10 16:07         ` Johannes Berg
2016-02-10 16:07           ` Johannes Berg
2016-02-10 16:53           ` Dan Williams
2016-02-10 17:12             ` Johannes Berg
2016-02-16 15:12               ` João Paulo Rechi Vita
     [not found]     ` <1454946096-9752-9-git-send-email-jprvita-6IF/jdPJHihWk0Htik3J/w@public.gmane.org>
2016-02-08 16:20       ` Marcel Holtmann
2016-02-08 16:20         ` Marcel Holtmann
2016-02-08 17:18         ` Johannes Berg
2016-02-08 17:22         ` João Paulo Rechi Vita
2016-02-08 22:53     ` Julian Calaby
     [not found]       ` <CAGRGNgVuwrh5unUoQ0P+ow55ChOQ+qsRRjfD1bb7DC6PcrCO2g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-09 21:35         ` João Paulo Rechi Vita
2016-02-09 21:35           ` João Paulo Rechi Vita
2016-02-09 21:36           ` João Paulo Rechi Vita
2016-02-09 22:01             ` Julian Calaby
2016-02-18 20:12     ` Johannes Berg
2016-02-22 16:11       ` João Paulo Rechi Vita
2016-02-08 15:41 ` [PATCH 9/9] rfkill: Notify userspace of airplane-mode state changes João Paulo Rechi Vita

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1454947887.5325.8.camel@redhat.com \
    --to=dcbw@redhat.com \
    --cc=davem@davemloft.net \
    --cc=dvhart@infradead.org \
    --cc=johannes@sipsolutions.net \
    --cc=jprvita@endlessm.com \
    --cc=jprvita@gmail.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linux@endlessm.com \
    --cc=netdev@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.