Input: xpad - use LED API when identifying wireless controllers
Subsystems (2)
Dmitry Torokhov
maintainerPATCH 1/1 Input: xpad - use LED API when identifying wireless controllers
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.
---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/joystick/xpad.c +1 -1
@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct usb_xpad *xpad, int command)*/ static void xpad_identify_controller (struct usb_xpad *xpad) { -xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) +2 ); } static void xpad_led_set(struct led_classdev *led_cdev,
Signature · 5 lines
2.6.0.rc2.230.g3dd15c0 -- Dmitry
Quoted 22 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){
drivers/input/joystick/xpad.c static void xpad_send_led_command(struct usb_xpad *xpad, int command) · line 1124
Quoted 5 lines
drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); } static void xpad_led_set(struct led_classdev *led_cdev,
Hi Dimitri,
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.
Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the /sys/class/leds/xpad0/brigthness sysfs entry does not work.
Best regards,
Clement
Dmitry Torokhov
maintainerQuoted 29 lines · Clement Calmels
Quoted 26 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); }
Quoted 3 lines
Quoted 1 line
static void xpad_led_set(struct
led_classdev*led_cdev,Hi Dimitri,
Hi Clement,
Quoted 12 lines
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Quoted 7 lines
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the
/sys/class/leds/xpad0/brigthnesssysfs entry does not work.
OK, so the patch does work (the device is still correctly identified), but resume requires additional patches. Could you try 'xpad' branch of my tree on kernel.org [1] and let me know if it works for you?
Thanks!
Signature · 3 lines
Dmitry [1] git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
2015-12-20 8:55 GMT+01:00 Dmitry Torokhov <[email protected]>:
Quoted 51 lines · Clement Calmels
Quoted 29 lines
Quoted 26 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); }Quoted 3 lines
Quoted 1 line
static void xpad_led_set(struct
led_classdev*led_cdev,Hi Dimitri,
Hi Clement,
Quoted 15 lines
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
Quoted 8 lines
Quoted 4 lines
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the
/sys/class/leds/xpad0/brigthnesssysfs entry does not work.OK, so the patch does work (the device is still correctly identified), but resume requires additional patches. Could you try 'xpad' branch of my tree on kernel.org [1] and let me know if it works for you?
at least on my machine your follow up patch was also required which I merged at:
https://github.com/paroj/xpad/tree/dtor
with this patch the controllers still continue blinking after resume, however the URB
will still work so they respond to subsequent LED commands triggered via sysfs (or if they are powered off and on).
I also verified that a LED command is triggered upon resume - however the controller ignores that.
Maybe it is sent too early/ in the wrong order.
Quoted 7 lines
Thanks!
--
Dmitry[1]
git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
Dmitry Torokhov
maintainerQuoted 63 lines · Pavel Rojtberg
2015-12-20 8:55 GMT+01:00 Dmitry Torokhov <[email protected]>:
Quoted 51 lines · Clement Calmels
Quoted 29 lines
Quoted 26 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); }Quoted 3 lines
Quoted 1 line
static void xpad_led_set(struct
led_classdev*led_cdev,Hi Dimitri,
Hi Clement,
Quoted 15 lines
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
Quoted 8 lines
Quoted 4 lines
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the
/sys/class/leds/xpad0/brigthnesssysfs entry does not work.OK, so the patch does work (the device is still correctly identified), but resume requires additional patches. Could you try 'xpad' branch of my tree on kernel.org [1] and let me know if it works for you?
at least on my machine your follow up patch was also required which I merged at:
https://github.com/paroj/xpad/tree/dtor
Quoted 8 lines
with this patch the controllers still continue blinking after resume, however the URB
will still work so they respond to subsequent LED commands triggered via sysfs (or if they are powered off and on).I also verified that a LED command is triggered upon resume - however the controller ignores that.
Maybe it is sent too early/ in the wrong order.
I wonder if below helps this.
Signature · 11 lines
Dmitry Input: xpad - try waiting for output URB to complete From: Dmitry Torokhov <[email protected]> Signed-off-by: Dmitry Torokhov <[email protected]> --- drivers/input/joystick/xpad.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-)
drivers/input/joystick/xpad.c +33 -8
@@ -346,9 +346,10 @@ struct usb_xpad {dma_addr_t idata_dma;struct urb *irq_out;/* urb for interrupt out report */ +struct usb_anchor irq_out_anchor;bool irq_out_active;/* we must not use an active URB */ -unsigned char *odata;/* output data */ u8 odata_serial;/* serial number for xbox one protocol */ +unsigned char *odata;/* output data */ dma_addr_t odata_dma;spinlock_t odata_lock;
@@ -764,11 +765,13 @@ static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)int error;if (!xpad->irq_out_active &&xpad_prepare_next_out_packet (xpad)) { +usb_anchor_urb (xpad->irq_out, &xpad->irq_out_anchor); error =usb_submit_urb (xpad->irq_out,GFP_ATOMIC );if (error) {dev_err (&xpad->intf->dev,"%s - usb_submit_urb failed with result %d\n" , __func__, error); +usb_unanchor_urb (xpad->irq_out);return -EIO ; }
@@ -811,11 +814,13 @@ static void xpad_irq_out(struct urb *urb) }if (xpad->irq_out_active) { +usb_anchor_urb (urb, &xpad->irq_out_anchor); error =usb_submit_urb (urb,GFP_ATOMIC );if (error) {dev_err (dev,"%s - usb_submit_urb failed with result %d\n" , __func__, error); +usb_unanchor_urb (urb); xpad->irq_out_active = false; } }
@@ -832,6 +837,8 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)if (xpad->xtype ==XTYPE_UNKNOWN )return 0 ; +init_usb_anchor (&xpad->irq_out_anchor); + xpad->odata =usb_alloc_coherent (xpad->udev,XPAD_PKT_LEN ,GFP_KERNEL , &xpad->odata_dma);if (!xpad->odata) {
@@ -864,6 +871,18 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) fail1:return error; } +static void xpad_stop_output (struct usb_xpad *xpad) +{ +if (xpad->xtype !=XTYPE_UNKNOWN ) { +if (!usb_wait_anchor_empty_timeout (&xpad->irq_out_anchor, +5000 )) { +dev_warn (&xpad->intf->dev, +"timed out waiting for output URB to complete, killing\n" ); +usb_kill_anchored_urbs (&xpad->irq_out_anchor); + } + } +} +static void xpad_deinit_output (struct usb_xpad *xpad) {if (xpad->xtype !=XTYPE_UNKNOWN ) {
@@ -924,7 +943,15 @@ static int xpad_start_xbox_one(struct usb_xpad *xpad) packet->len =5 ; packet->pending = true; - retval =usb_submit_urb (xpad->irq_out,GFP_KERNEL ) ? -EIO :0 ; +usb_anchor_urb (xpad->irq_out, &xpad->irq_out_anchor); + retval =usb_submit_urb (xpad->irq_out,GFP_KERNEL ); +if (retval) { +dev_err (&xpad->intf->dev, +"%s - usb_submit_urb failed with result %d\n" , + __func__, retval); +usb_unanchor_urb (xpad->irq_out); + retval = -EIO ; + }spin_unlock_irqrestore (&xpad->odata_lock, flags);
@@ -1514,15 +1541,14 @@ static void xpad_disconnect(struct usb_interface *intf)* Now that both input device and LED device are gone we can * stop output URB. */ -if (xpad->xtype ==XTYPE_XBOX360W ) -usb_kill_urb (xpad->irq_out); +xpad_stop_output (xpad); + +xpad_deinit_output (xpad);usb_free_urb (xpad->irq_in);usb_free_coherent (xpad->udev,XPAD_PKT_LEN , xpad->idata, xpad->idata_dma); -xpad_deinit_output (xpad); -kfree (xpad);usb_set_intfdata (intf,NULL );
@@ -1548,8 +1574,7 @@ static int xpad_suspend(struct usb_interface *intf, pm_message_t message)mutex_unlock (&input->mutex); } -if (xpad->xtype !=XTYPE_UNKNOWN ) -usb_kill_urb (xpad->irq_out); +xpad_stop_output (xpad);return 0 ; }
Quoted 72 lines · On Mon, 21 Dec 2015 12:06:50 -0800 Dmitry Torokhov <[email protected]>…
Quoted 71 lines · Pavel Rojtberg
2015-12-20 8:55 GMT+01:00 Dmitry Torokhov
<[email protected]>:Quoted 57 lines · Clement Calmels
Quoted 29 lines
Quoted 26 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); }Quoted 3 lines
Quoted 1 line
static void xpad_led_set(struct
led_classdev*led_cdev,Hi Dimitri,
Hi Clement,
Quoted 12 lines
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Quoted 8 lines
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the
/sys/class/leds/xpad0/brigthnesssysfs entry does not work.Quoted 4 lines
OK, so the patch does work (the device is still correctly identified), but resume requires additional patches. Could you try 'xpad' branch of my tree on kernel.org [1] and let me know if it works for you?
at least on my machine your follow up patch was also required which I merged at:
with this patch the controllers still continue blinking after resume, however the URB
will still work so they respond to subsequent LED commands triggered via sysfs (or if they are powered off and on).
Quoted 6 lines
Quoted 3 lines
I also verified that a LED command is triggered upon resume - however the controller ignores that.
Maybe it is sent too early/ in the wrong order.I wonder if below helps this.
Tried this patch above on top https://github.com/paroj/xpad/tree/dtor
branch xpad but this does not help. The leds are still blinking at resume but at least the sysfs entry is working.
c.
2015-12-21 21:06 GMT+01:00 Dmitry Torokhov <[email protected]>:
Quoted 69 lines · Pavel Rojtberg
Quoted 68 lines
2015-12-20 8:55 GMT+01:00 Dmitry Torokhov <[email protected]>:
Quoted 51 lines · Clement Calmels
Quoted 29 lines
Quoted 26 lines · On Wed, 16 Dec 2015 14:44:08 -0800 Dmitry Torokhov <[email protected]>…
When lighting up the segment identifying wireless controller, Instead of sending command directly to the controller, let's do it via LED API (usinf
led_set_brightness) so that LED object state is in sync with controller state and we'll light up the correct segment on resume as well.Signed-off-by Dmitry Torokhov <[email protected]>---
I do not have the hardware so please try this out.
drivers/input/joystick/xpad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)(quoted diff) +0
-0
b/drivers/input/joystick/xpad.cindex 36328b3..00a766b 100644drivers/input/joystick/xpad.c +0
-0@@ -1118,7 +1118,7 @@ static void xpad_send_led_command(struct
usb_xpad*xpad, int command) */
static voidxpad_identify_controller(struct usb_xpad *xpad){drivers/input/joystick/xpad.c +2
-1-xpad_send_led_command (xpad, (xpad->pad_nr %4 ) +2 ); +led_set_brightness (&xpad->led->led_cdev, (xpad->pad_nr %4 ) + 2); }Quoted 3 lines
Quoted 1 line
static void xpad_led_set(struct
led_classdev*led_cdev,Hi Dimitri,
Hi Clement,
Quoted 15 lines
My hardware: two wireless xpad 360 using a single usb receiver.
Power on the first gamepad => light the "1" led.
Power on the second gamepad => light the "2" led.Suspend the PC (systemctl suspend): the two gamepads are "disconnected" => blinking circle.
Resume the PC, the two gamepads keep blinking but are working (tested with jstest).
Power off and on the gamepad => still blinking. Reload (rmmod/modprobe) the xpad module => still blinking.
Quoted 8 lines
Quoted 4 lines
That said, without your patch, the behavior is exactly the same. It seems that the suspend/resume broke the led feature. Even using the
/sys/class/leds/xpad0/brigthnesssysfs entry does not work.OK, so the patch does work (the device is still correctly identified), but resume requires additional patches. Could you try 'xpad' branch of my tree on kernel.org [1] and let me know if it works for you?
at least on my machine your follow up patch was also required which I merged at:
https://github.com/paroj/xpad/tree/dtorwith this patch the controllers still continue blinking after resume, however the URB
will still work so they respond to subsequent LED commands triggered via sysfs (or if they are powered off and on).
Quoted 5 lines
Quoted 3 lines
I also verified that a LED command is triggered upon resume - however the controller ignores that.
Maybe it is sent too early/ in the wrong order.I wonder if below helps this.
for me this one did the trick. The correct LED lights up after resume.
Integrated it here (master):
https://github.com/paroj/xpad
@Clemens:
could you try it again with the master branch from my repro? (it has debug outputs enabled)
If it still does not work, please report back with the dmesg output.
BTW: merry Christmas everyone
Pavel
Quoted 132 lines
--
DmitryInput: xpad - try waiting for output URB to complete
From: Dmitry Torokhov <[email protected]>
Signed-off-by Dmitry Torokhov <[email protected]>--- drivers/input/joystick/xpad.c | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-)drivers/input/joystick/xpad.c +33
-8@@ -346,9 +346,10 @@ struct usb_xpad {dma_addr_t idata_dma;struct urb *irq_out;/* urb for interrupt out report */ +struct usb_anchor irq_out_anchor;bool irq_out_active;/* we must not use an active URB */ -unsigned char *odata;/* output data */ u8 odata_serial;/* serial number for xbox one protocol */ +unsigned char *odata;/* output data */ dma_addr_t odata_dma;spinlock_t odata_lock;@@ -764,11 +765,13 @@ static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)int error;if (!xpad->irq_out_active &&xpad_prepare_next_out_packet (xpad)) { +usb_anchor_urb (xpad->irq_out, &xpad->irq_out_anchor); error =usb_submit_urb (xpad->irq_out,GFP_ATOMIC );if (error) {dev_err (&xpad->intf->dev,"%s - usb_submit_urb failed with result %d\n" , __func__, error); +usb_unanchor_urb (xpad->irq_out);return -EIO ; }@@ -811,11 +814,13 @@ static void xpad_irq_out(struct urb *urb) }if (xpad->irq_out_active) { +usb_anchor_urb (urb, &xpad->irq_out_anchor); error =usb_submit_urb (urb,GFP_ATOMIC );if (error) {dev_err (dev,"%s - usb_submit_urb failed with result %d\n" , __func__, error); +usb_unanchor_urb (urb); xpad->irq_out_active = false; } }@@ -832,6 +837,8 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)if (xpad->xtype ==XTYPE_UNKNOWN )return 0 ; +init_usb_anchor (&xpad->irq_out_anchor); + xpad->odata =usb_alloc_coherent (xpad->udev,XPAD_PKT_LEN ,GFP_KERNEL , &xpad->odata_dma);if (!xpad->odata) {@@ -864,6 +871,18 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) fail1:return error; } +static void xpad_stop_output (struct usb_xpad *xpad) +{ +if (xpad->xtype !=XTYPE_UNKNOWN ) { +if (!usb_wait_anchor_empty_timeout (&xpad->irq_out_anchor, +5000 )) { +dev_warn (&xpad->intf->dev, +"timed out waiting for output URB to complete, killing\n" ); +usb_kill_anchored_urbs (&xpad->irq_out_anchor); + } + } +} +static void xpad_deinit_output (struct usb_xpad *xpad) {if (xpad->xtype !=XTYPE_UNKNOWN ) {@@ -924,7 +943,15 @@ static int xpad_start_xbox_one(struct usb_xpad *xpad) packet->len =5 ; packet->pending = true; - retval =usb_submit_urb (xpad->irq_out,GFP_KERNEL ) ? -EIO :0 ; +usb_anchor_urb (xpad->irq_out, &xpad->irq_out_anchor); + retval =usb_submit_urb (xpad->irq_out,GFP_KERNEL ); +if (retval) { +dev_err (&xpad->intf->dev, +"%s - usb_submit_urb failed with result %d\n" , + __func__, retval); +usb_unanchor_urb (xpad->irq_out); + retval = -EIO ; + }spin_unlock_irqrestore (&xpad->odata_lock, flags);@@ -1514,15 +1541,14 @@ static void xpad_disconnect(struct usb_interface *intf)* Now that both input device and LED device are gone we can * stop output URB. */ -if (xpad->xtype ==XTYPE_XBOX360W ) -usb_kill_urb (xpad->irq_out); +xpad_stop_output (xpad); + +xpad_deinit_output (xpad);usb_free_urb (xpad->irq_in);usb_free_coherent (xpad->udev,XPAD_PKT_LEN , xpad->idata, xpad->idata_dma); -xpad_deinit_output (xpad); -kfree (xpad);usb_set_intfdata (intf,NULL );@@ -1548,8 +1574,7 @@ static int xpad_suspend(struct usb_interface *intf, pm_message_t message)mutex_unlock (&input->mutex); } -if (xpad->xtype !=XTYPE_UNKNOWN ) -usb_kill_urb (xpad->irq_out); +xpad_stop_output (xpad);return 0 ; }
Dmitry Torokhov
maintainerQuoted 5 lines · Pavel Rojtberg
for me this one did the trick. The correct LED lights up after resume.
Integrated it here (master):
https://github.com/paroj/xpad
Pavel, I refreshed my xpad branch on kernel.org folding the reset_resume and anchor changes into your original suspend/resume patch. Could you please try it out so that I can send it to mainline in the upcoming merge window?
Thanks!
Signature · 1 line
Dmitry
Dmitry Torokhov
maintainerQuoted 11 lines · Dmitry Torokhov
Quoted 5 lines · Pavel Rojtberg
for me this one did the trick. The correct LED lights up after resume.
Integrated it here (master):
https://github.com/paroj/xpadPavel, I refreshed my xpad branch on kernel.org folding the
reset_resumeand anchor changes into your original suspend/resume patch. Could you please try it out so that I can send it to mainline in the upcoming merge window?
Gentle ping. I can still fit it in my 2nd pull request but time is running out...
Thanks.
Signature · 1 line
Dmitry
Quoted 14 lines · On Tue, 12 Jan 2016 10:04:51 -0800 Dmitry Torokhov <[email protected]>…
Quoted 5 lines · Dmitry Torokhov
Quoted 4 lines · Pavel Rojtberg
for me this one did the trick. The correct LED lights up after resume.
Quoted 7 lines
Quoted 2 lines
Integrated it here (master):
https://github.com/paroj/xpadPavel, I refreshed my xpad branch on kernel.org folding the
reset_resumeand anchor changes into your original suspend/resume patch. Could you please try it out so that I can send it to mainline in the upcoming merge window?
Quoted 5 lines
Gentle ping. I can still fit it in my 2nd pull request but time is running out...
Thanks.
Hi Dimitry,
Source code fromgit://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git, branch xpad, head d9be398afb2c3333716324352d062c50112e4e86.
After suspend (systemctl suspend) my xpad wireless controller is still blinking. Tried "echo 2 > /sys/class/leds/xpad0/brightness" but it did not work.
That said, I also tried the same xpad code but built for my current kernel (4.3.0 from debian/sid): led is still blinking after resume but this time the sysfs file is functional.
Hopefully I did not make a mistake in the build process...
Best regards,
Clement