| From f49bb423dda48d7191f682a7fc795f2d434a0ddd Mon Sep 17 00:00:00 2001 |
| From: Cameron Gutman <aicommander@gmail.com> |
| Date: Fri, 27 May 2016 16:23:50 -0700 |
| Subject: Input: xpad - prevent spurious input from wired Xbox 360 controllers |
| |
| [ Upstream commit 1ff5fa3c6732f08e01ae12f12286d4728c9e4d86 ] |
| |
| After initially connecting a wired Xbox 360 controller or sending it |
| a command to change LEDs, a status/response packet is interpreted as |
| controller input. This causes the state of buttons represented in |
| byte 2 of the controller data packet to be incorrect until the next |
| valid input packet. Wireless Xbox 360 controllers are not affected. |
| |
| Writing a new value to the LED device while holding the Start button |
| and running jstest is sufficient to reproduce this bug. An event will |
| come through with the Start button released. |
| |
| Xboxdrv also won't attempt to read controller input from a packet |
| where byte 0 is non-zero. It also checks that byte 1 is 0x14, but |
| that value differs between wired and wireless controllers and this |
| code is shared by both. I think just checking byte 0 is enough to |
| eliminate unwanted packets. |
| |
| The following are some examples of 3-byte status packets I saw: |
| 01 03 02 |
| 02 03 00 |
| 03 03 03 |
| 08 03 00 |
| |
| Signed-off-by: Cameron Gutman <aicommander@gmail.com> |
| Signed-off-by: Pavel Rojtberg <rojtberg@gmail.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/input/joystick/xpad.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c |
| index 5f47e062cada..a49be8bc5819 100644 |
| --- a/drivers/input/joystick/xpad.c |
| +++ b/drivers/input/joystick/xpad.c |
| @@ -459,6 +459,10 @@ static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *d |
| static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev, |
| u16 cmd, unsigned char *data) |
| { |
| + /* valid pad data */ |
| + if (data[0] != 0x00) |
| + return; |
| + |
| /* digital pad */ |
| if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { |
| /* dpad as buttons (left, right, up, down) */ |
| -- |
| 2.17.1 |
| |