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 09/15] Input: xpad: handle "present" and "gone" correctly
Date: Sat, 10 Oct 2015 09:42:38 -0700 [thread overview]
Message-ID: <20151010164238.GA39573@dtor-ws> (raw)
In-Reply-To: <1443733046-29610-10-git-send-email-rojtberg@gmail.com>
Hi Pavel,
On Thu, Oct 01, 2015 at 10:57:20PM +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 means we now do
> not "preallocate" all 4 devices when a single
> wireless base station is seen. 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 | 52 ++++++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 40 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
> index 7d66d77..31bcd78 100644
> --- a/drivers/input/joystick/xpad.c
> +++ b/drivers/input/joystick/xpad.c
> @@ -344,8 +344,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
> *
> @@ -496,6 +500,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
> *
> @@ -512,13 +532,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);
> + }
> }
>
> /* Valid pad data */
> @@ -965,8 +988,6 @@ static int xpad_led_probe(struct usb_xpad *xpad)
> return error;
> }
>
> - xpad_identify_controller(xpad);
> -
> return 0;
> }
>
> @@ -1123,6 +1144,8 @@ static int xpad_init_input(struct usb_xpad *xpad)
> if (error)
> goto fail_input_register;
>
> + xpad_identify_controller(xpad);
> +
> return 0;
>
> fail_input_register:
> @@ -1187,6 +1210,7 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
> xpad->mapping = xpad_device[i].mapping;
> xpad->xtype = xpad_device[i].xtype;
> xpad->name = xpad_device[i].name;
> + INIT_WORK(&xpad->work, presence_work_function);
>
> if (xpad->xtype == XTYPE_UNKNOWN) {
> if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
> @@ -1260,11 +1284,12 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
> xpad->irq_out->transfer_buffer_length = 12;
> usb_submit_urb(xpad->irq_out, GFP_KERNEL);
> mutex_unlock(&xpad->odata_mutex);
> + } else {
> + xpad->pad_present = 1;
> + error = xpad_init_input(xpad);
> + if (error)
> + goto fail4;
> }
> - xpad->pad_present = 1;
> - error = xpad_init_input(xpad);
> - if (error)
> - goto fail4;
>
> return 0;
>
> @@ -1286,7 +1311,8 @@ static void xpad_disconnect(struct usb_interface *intf)
> {
> struct usb_xpad *xpad = usb_get_intfdata (intf);
>
> - xpad_deinit_input(xpad);
> + if (xpad->pad_present)
> + xpad_deinit_input(xpad);
> xpad_deinit_output(xpad);
>
> if (xpad->xtype == XTYPE_XBOX360W) {
> @@ -1297,6 +1323,8 @@ static void xpad_disconnect(struct usb_interface *intf)
> usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
> xpad->idata, xpad->idata_dma);
>
> + cancel_work_sync(&xpad->work);
> +
This is too late. You need to stop the IO, then cancel the work and then
see if input device is created or not and destroy it if it is present.
BTW current logic for X360W is broken in this regard as well.
> kfree(xpad);
>
> usb_set_intfdata(intf, NULL);
> --
> 1.9.1
>
Thanks.
--
Dmitry
next prev parent reply other threads:[~2015-10-10 16:42 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-01 20:57 [PATCH 00/15] Input: xpad: updates Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 01/15] Input: xpad: add Covert Forces edition of the Xbox One controller Pavel Rojtberg
2015-10-10 16:42 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 02/15] Input: xpad: fix Razer Atrox Arcade Stick button mapping Pavel Rojtberg
2015-10-10 16:43 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 03/15] Input: xpad: clarify LED enumeration Pavel Rojtberg
2015-10-10 16:44 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 04/15] Input: xpad: remove needless bulk out URB used for LED setup Pavel Rojtberg
2015-10-10 16:45 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 05/15] Input: xpad: factor out URB submission in xpad_play_effect Pavel Rojtberg
2015-10-10 16:45 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 06/15] Input: xpad: x360w: report dpad as buttons and axes Pavel Rojtberg
2015-10-10 16:45 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 07/15] Input: xpad: move the input device creation to a new function Pavel Rojtberg
2015-10-10 18:00 ` Dmitry Torokhov
2015-10-15 19:19 ` Pavel Rojtberg
2015-10-17 16:49 ` Dmitry Torokhov
2015-10-17 18:08 ` Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 08/15] Input: xpad: query Wireless controller state at init Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 09/15] Input: xpad: handle "present" and "gone" correctly Pavel Rojtberg
2015-10-10 16:42 ` Dmitry Torokhov [this message]
2015-10-01 20:57 ` [PATCH 10/15] Input: xpad: use ida() for finding the pad_nr Pavel Rojtberg
2015-10-01 22:53 ` Pavel Rojtberg
2015-10-10 17:06 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 11/15] Input: xpad: do not submit active URBs Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 12/15] Input: xpad: replace mutex by spinlock Pavel Rojtberg
2015-10-10 18:10 ` Dmitry Torokhov
2015-10-01 20:57 ` [PATCH 13/15] Input: xpad: re-submit pending ff and led requests Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 14/15] Input: xpad: workaround dead irq_out after suspend/ resume Pavel Rojtberg
2015-10-01 20:57 ` [PATCH 15/15] Input: xpad: update Xbox One Force Feedback Support 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=20151010164238.GA39573@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).