From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Pavel Rojtberg <rojtberg@gmail.com>
Cc: linux-input@vger.kernel.org, pgriffais@valvesoftware.com,
gregkh@linuxfoundation.org
Subject: Re: [PATCH 5/8] Input: xpad: handle "present" and "gone" correctly
Date: Thu, 30 Jul 2015 00:06:29 -0700 [thread overview]
Message-ID: <20150730070629.GE35939@dtor-ws> (raw)
In-Reply-To: <1436572068-10661-6-git-send-email-rojtberg@gmail.com>
On Sat, Jul 11, 2015 at 01:47:45AM +0200, Pavel Rojtberg wrote:
> From: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
>
> Handle the "a new device is present" message properly by dynamically
> creating the input device at this point in time. This requires a
> workqueue as we are in interrupt context when we learn about this.
>
> Also properly disconnect any devices that we are told are removed.
>
> Signed-off-by: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Signed-off-by: Pavel Rojtberg <rojtberg@gmail.com>
> ---
> drivers/input/joystick/xpad.c | 43 +++++++++++++++++++++++++++++++++++--------
> 1 file changed, 35 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
> index 3349861..a9ff4c2 100644
> --- a/drivers/input/joystick/xpad.c
> +++ b/drivers/input/joystick/xpad.c
> @@ -343,8 +343,12 @@ struct usb_xpad {
> int xtype; /* type of xbox device */
> unsigned long pad_nr; /* the order x360 pads were attached */
> const char *name; /* name of the device */
> + struct work_struct work; /* init/remove device from callback */
> };
>
> +static int xpad_init_input(struct usb_xpad *xpad);
> +static void xpad_deinit_input(struct usb_xpad *xpad);
> +
> /*
> * xpad_process_packet
> *
> @@ -488,6 +492,22 @@ static void xpad360_process_packet(struct usb_xpad *xpad,
>
> static void xpad_identify_controller(struct usb_xpad *xpad);
>
> +static void presence_work_function(struct work_struct *work)
> +{
> + struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
> + int error;
> +
> + if (xpad->pad_present) {
> + error = xpad_init_input(xpad);
> + if (error) {
> + /* complain only, not much else we can do here */
> + dev_err(&xpad->dev->dev, "unable to init device\n");
> + }
> + } else {
> + xpad_deinit_input(xpad);
> + }
> +}
> +
> /*
> * xpad360w_process_packet
> *
> @@ -504,13 +524,16 @@ static void xpad_identify_controller(struct usb_xpad *xpad);
> */
> static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
> {
> + int presence;
> +
> /* Presence change */
> if (data[0] & 0x08) {
> - if (data[1] & 0x80) {
> - xpad->pad_present = 1;
> - xpad_identify_controller(xpad);
> - } else
> - xpad->pad_present = 0;
> + presence = (data[1] & 0x80) != 0;
> +
> + if (xpad->pad_present != presence) {
> + xpad->pad_present = presence;
> + schedule_work(&xpad->work);
> + }
> }
So what happens if we start without the input device, schedule it to be
added and then receive a valid pad data packet before work item had a
chance to run and input device is still not created? We are going crash
and burn :(
Thanks.
--
Dmitry
next prev parent reply other threads:[~2015-07-30 7:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-10 23:47 [PATCH 0/8] Input: xpad: fix wireless pad connection and URB out Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 1/8] Input: xpad: clarify LED enumeration Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 2/8] Input: xpad: remove bulk out URB Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 3/8] Input: xpad: move the input device creation to a new function Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 4/8] Input: xpad: query Wireless controller state at init Pavel Rojtberg
2015-07-30 6:57 ` Dmitry Torokhov
2015-07-10 23:47 ` [PATCH 5/8] Input: xpad: handle "present" and "gone" correctly Pavel Rojtberg
2015-07-30 7:06 ` Dmitry Torokhov [this message]
2015-07-10 23:47 ` [PATCH 6/8] Input: xpad: use bitmask for finding the pad_nr Pavel Rojtberg
2015-07-30 6:55 ` Dmitry Torokhov
2015-07-31 12:46 ` Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 7/8] Input: xpad: factor out URB submission in xpad_play_effect Pavel Rojtberg
2015-07-10 23:47 ` [PATCH 8/8] Input: xpad: do not submit active URBs Pavel Rojtberg
2015-07-30 6:59 ` Dmitry Torokhov
2015-07-31 13:08 ` Pavel Rojtberg
[not found] ` <CA+b0ujev6m0Bpzyj6tJ2-hjf1vudRAkfVyacMb=uV8t6ZKr0dg@mail.gmail.com>
2015-07-25 10:55 ` [PATCH 0/8] Input: xpad: fix wireless pad connection and URB out Pavel Rojtberg
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=20150730070629.GE35939@dtor-ws \
--to=dmitry.torokhov@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-input@vger.kernel.org \
--cc=pgriffais@valvesoftware.com \
--cc=rojtberg@gmail.com \
/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.