cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xpad.c (65184B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * X-Box gamepad driver
      4 *
      5 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de>
      6 *               2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>,
      7 *                    Steven Toth <steve@toth.demon.co.uk>,
      8 *                    Franz Lehner <franz@caos.at>,
      9 *                    Ivan Hawkes <blackhawk@ivanhawkes.com>
     10 *               2005 Dominic Cerquetti <binary1230@yahoo.com>
     11 *               2006 Adam Buchbinder <adam.buchbinder@gmail.com>
     12 *               2007 Jan Kratochvil <honza@jikos.cz>
     13 *               2010 Christoph Fritz <chf.fritz@googlemail.com>
     14 *
     15 * This driver is based on:
     16 *  - information from     http://euc.jp/periphs/xbox-controller.ja.html
     17 *  - the iForce driver    drivers/char/joystick/iforce.c
     18 *  - the skeleton-driver  drivers/usb/usb-skeleton.c
     19 *  - Xbox 360 information http://www.free60.org/wiki/Gamepad
     20 *  - Xbox One information https://github.com/quantus/xbox-one-controller-protocol
     21 *
     22 * Thanks to:
     23 *  - ITO Takayuki for providing essential xpad information on his website
     24 *  - Vojtech Pavlik     - iforce driver / input subsystem
     25 *  - Greg Kroah-Hartman - usb-skeleton driver
     26 *  - XBOX Linux project - extra USB id's
     27 *  - Pekka Pöyry (quantus) - Xbox One controller reverse engineering
     28 *
     29 * TODO:
     30 *  - fine tune axes (especially trigger axes)
     31 *  - fix "analog" buttons (reported as digital now)
     32 *  - get rumble working
     33 *  - need USB IDs for other dance pads
     34 *
     35 * History:
     36 *
     37 * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller"
     38 *
     39 * 2002-07-02 - 0.0.2 : basic working version
     40 *  - all axes and 9 of the 10 buttons work (german InterAct device)
     41 *  - the black button does not work
     42 *
     43 * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik
     44 *  - indentation fixes
     45 *  - usb + input init sequence fixes
     46 *
     47 * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3
     48 *  - verified the lack of HID and report descriptors
     49 *  - verified that ALL buttons WORK
     50 *  - fixed d-pad to axes mapping
     51 *
     52 * 2002-07-17 - 0.0.5 : simplified d-pad handling
     53 *
     54 * 2004-10-02 - 0.0.6 : DDR pad support
     55 *  - borrowed from the XBOX linux kernel
     56 *  - USB id's for commonly used dance pads are present
     57 *  - dance pads will map D-PAD to buttons, not axes
     58 *  - pass the module paramater 'dpad_to_buttons' to force
     59 *    the D-PAD to map to buttons if your pad is not detected
     60 *
     61 * Later changes can be tracked in SCM.
     62 */
     63
     64#include <linux/kernel.h>
     65#include <linux/input.h>
     66#include <linux/rcupdate.h>
     67#include <linux/slab.h>
     68#include <linux/stat.h>
     69#include <linux/module.h>
     70#include <linux/usb/input.h>
     71#include <linux/usb/quirks.h>
     72
     73#define XPAD_PKT_LEN 64
     74
     75/*
     76 * xbox d-pads should map to buttons, as is required for DDR pads
     77 * but we map them to axes when possible to simplify things
     78 */
     79#define MAP_DPAD_TO_BUTTONS		(1 << 0)
     80#define MAP_TRIGGERS_TO_BUTTONS		(1 << 1)
     81#define MAP_STICKS_TO_NULL		(1 << 2)
     82#define MAP_SELECT_BUTTON		(1 << 3)
     83#define DANCEPAD_MAP_CONFIG	(MAP_DPAD_TO_BUTTONS |			\
     84				MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
     85
     86#define XTYPE_XBOX        0
     87#define XTYPE_XBOX360     1
     88#define XTYPE_XBOX360W    2
     89#define XTYPE_XBOXONE     3
     90#define XTYPE_UNKNOWN     4
     91
     92static bool dpad_to_buttons;
     93module_param(dpad_to_buttons, bool, S_IRUGO);
     94MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
     95
     96static bool triggers_to_buttons;
     97module_param(triggers_to_buttons, bool, S_IRUGO);
     98MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads");
     99
    100static bool sticks_to_null;
    101module_param(sticks_to_null, bool, S_IRUGO);
    102MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads");
    103
    104static bool auto_poweroff = true;
    105module_param(auto_poweroff, bool, S_IWUSR | S_IRUGO);
    106MODULE_PARM_DESC(auto_poweroff, "Power off wireless controllers on suspend");
    107
    108static const struct xpad_device {
    109	u16 idVendor;
    110	u16 idProduct;
    111	char *name;
    112	u8 mapping;
    113	u8 xtype;
    114} xpad_device[] = {
    115	{ 0x0079, 0x18d4, "GPD Win 2 X-Box Controller", 0, XTYPE_XBOX360 },
    116	{ 0x044f, 0x0f00, "Thrustmaster Wheel", 0, XTYPE_XBOX },
    117	{ 0x044f, 0x0f03, "Thrustmaster Wheel", 0, XTYPE_XBOX },
    118	{ 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX },
    119	{ 0x044f, 0x0f10, "Thrustmaster Modena GT Wheel", 0, XTYPE_XBOX },
    120	{ 0x044f, 0xb326, "Thrustmaster Gamepad GP XID", 0, XTYPE_XBOX360 },
    121	{ 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX },
    122	{ 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX },
    123	{ 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX },
    124	{ 0x045e, 0x0288, "Microsoft Xbox Controller S v2", 0, XTYPE_XBOX },
    125	{ 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX },
    126	{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
    127	{ 0x045e, 0x028f, "Microsoft X-Box 360 pad v2", 0, XTYPE_XBOX360 },
    128	{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
    129	{ 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE },
    130	{ 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE },
    131	{ 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", 0, XTYPE_XBOXONE },
    132	{ 0x045e, 0x02ea, "Microsoft X-Box One S pad", 0, XTYPE_XBOXONE },
    133	{ 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
    134	{ 0x045e, 0x0b12, "Microsoft Xbox Series S|X Controller", MAP_SELECT_BUTTON, XTYPE_XBOXONE },
    135	{ 0x046d, 0xc21d, "Logitech Gamepad F310", 0, XTYPE_XBOX360 },
    136	{ 0x046d, 0xc21e, "Logitech Gamepad F510", 0, XTYPE_XBOX360 },
    137	{ 0x046d, 0xc21f, "Logitech Gamepad F710", 0, XTYPE_XBOX360 },
    138	{ 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 },
    139	{ 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX },
    140	{ 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX },
    141	{ 0x046d, 0xca8a, "Logitech Precision Vibration Feedback Wheel", 0, XTYPE_XBOX },
    142	{ 0x046d, 0xcaa3, "Logitech DriveFx Racing Wheel", 0, XTYPE_XBOX360 },
    143	{ 0x056e, 0x2004, "Elecom JC-U3613M", 0, XTYPE_XBOX360 },
    144	{ 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX },
    145	{ 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX },
    146	{ 0x05fe, 0x3030, "Chic Controller", 0, XTYPE_XBOX },
    147	{ 0x05fe, 0x3031, "Chic Controller", 0, XTYPE_XBOX },
    148	{ 0x062a, 0x0020, "Logic3 Xbox GamePad", 0, XTYPE_XBOX },
    149	{ 0x062a, 0x0033, "Competition Pro Steering Wheel", 0, XTYPE_XBOX },
    150	{ 0x06a3, 0x0200, "Saitek Racing Wheel", 0, XTYPE_XBOX },
    151	{ 0x06a3, 0x0201, "Saitek Adrenalin", 0, XTYPE_XBOX },
    152	{ 0x06a3, 0xf51a, "Saitek P3600", 0, XTYPE_XBOX360 },
    153	{ 0x0738, 0x4506, "Mad Catz 4506 Wireless Controller", 0, XTYPE_XBOX },
    154	{ 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX },
    155	{ 0x0738, 0x4520, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
    156	{ 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX },
    157	{ 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX },
    158	{ 0x0738, 0x4530, "Mad Catz Universal MC2 Racing Wheel and Pedals", 0, XTYPE_XBOX },
    159	{ 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX },
    160	{ 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    161	{ 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX },
    162	{ 0x0738, 0x4586, "Mad Catz MicroCon Wireless Controller", 0, XTYPE_XBOX },
    163	{ 0x0738, 0x4588, "Mad Catz Blaster", 0, XTYPE_XBOX },
    164	{ 0x0738, 0x45ff, "Mad Catz Beat Pad (w/ Handle)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    165	{ 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
    166	{ 0x0738, 0x4718, "Mad Catz Street Fighter IV FightStick SE", 0, XTYPE_XBOX360 },
    167	{ 0x0738, 0x4726, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
    168	{ 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    169	{ 0x0738, 0x4736, "Mad Catz MicroCon Gamepad", 0, XTYPE_XBOX360 },
    170	{ 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    171	{ 0x0738, 0x4740, "Mad Catz Beat Pad", 0, XTYPE_XBOX360 },
    172	{ 0x0738, 0x4743, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    173	{ 0x0738, 0x4758, "Mad Catz Arcade Game Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    174	{ 0x0738, 0x4a01, "Mad Catz FightStick TE 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
    175	{ 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    176	{ 0x0738, 0x9871, "Mad Catz Portable Drum", 0, XTYPE_XBOX360 },
    177	{ 0x0738, 0xb726, "Mad Catz Xbox controller - MW2", 0, XTYPE_XBOX360 },
    178	{ 0x0738, 0xb738, "Mad Catz MVC2TE Stick 2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    179	{ 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 },
    180	{ 0x0738, 0xcb02, "Saitek Cyborg Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
    181	{ 0x0738, 0xcb03, "Saitek P3200 Rumble Pad - PC/Xbox 360", 0, XTYPE_XBOX360 },
    182	{ 0x0738, 0xcb29, "Saitek Aviator Stick AV8R02", 0, XTYPE_XBOX360 },
    183	{ 0x0738, 0xf738, "Super SFIV FightStick TE S", 0, XTYPE_XBOX360 },
    184	{ 0x07ff, 0xffff, "Mad Catz GamePad", 0, XTYPE_XBOX360 },
    185	{ 0x0c12, 0x0005, "Intec wireless", 0, XTYPE_XBOX },
    186	{ 0x0c12, 0x8801, "Nyko Xbox Controller", 0, XTYPE_XBOX },
    187	{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
    188	{ 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX },
    189	{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
    190	{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
    191	{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
    192	{ 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    193	{ 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX },
    194	{ 0x0e4c, 0x1103, "Radica Gamester Reflex", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX },
    195	{ 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX },
    196	{ 0x0e4c, 0x3510, "Radica Gamester", 0, XTYPE_XBOX },
    197	{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
    198	{ 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX },
    199	{ 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX },
    200	{ 0x0e6f, 0x0008, "After Glow Pro Controller", 0, XTYPE_XBOX },
    201	{ 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
    202	{ 0x0e6f, 0x0113, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
    203	{ 0x0e6f, 0x011f, "Rock Candy Gamepad Wired Controller", 0, XTYPE_XBOX360 },
    204	{ 0x0e6f, 0x0131, "PDP EA Sports Controller", 0, XTYPE_XBOX360 },
    205	{ 0x0e6f, 0x0133, "Xbox 360 Wired Controller", 0, XTYPE_XBOX360 },
    206	{ 0x0e6f, 0x0139, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
    207	{ 0x0e6f, 0x013a, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    208	{ 0x0e6f, 0x0146, "Rock Candy Wired Controller for Xbox One", 0, XTYPE_XBOXONE },
    209	{ 0x0e6f, 0x0147, "PDP Marvel Xbox One Controller", 0, XTYPE_XBOXONE },
    210	{ 0x0e6f, 0x015c, "PDP Xbox One Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
    211	{ 0x0e6f, 0x0161, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    212	{ 0x0e6f, 0x0162, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    213	{ 0x0e6f, 0x0163, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    214	{ 0x0e6f, 0x0164, "PDP Battlefield One", 0, XTYPE_XBOXONE },
    215	{ 0x0e6f, 0x0165, "PDP Titanfall 2", 0, XTYPE_XBOXONE },
    216	{ 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 },
    217	{ 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
    218	{ 0x0e6f, 0x021f, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
    219	{ 0x0e6f, 0x0246, "Rock Candy Gamepad for Xbox One 2015", 0, XTYPE_XBOXONE },
    220	{ 0x0e6f, 0x02a0, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    221	{ 0x0e6f, 0x02a1, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    222	{ 0x0e6f, 0x02a2, "PDP Wired Controller for Xbox One - Crimson Red", 0, XTYPE_XBOXONE },
    223	{ 0x0e6f, 0x02a4, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
    224	{ 0x0e6f, 0x02a6, "PDP Wired Controller for Xbox One - Camo Series", 0, XTYPE_XBOXONE },
    225	{ 0x0e6f, 0x02a7, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    226	{ 0x0e6f, 0x02a8, "PDP Xbox One Controller", 0, XTYPE_XBOXONE },
    227	{ 0x0e6f, 0x02ab, "PDP Controller for Xbox One", 0, XTYPE_XBOXONE },
    228	{ 0x0e6f, 0x02ad, "PDP Wired Controller for Xbox One - Stealth Series", 0, XTYPE_XBOXONE },
    229	{ 0x0e6f, 0x02b3, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
    230	{ 0x0e6f, 0x02b8, "Afterglow Prismatic Wired Controller", 0, XTYPE_XBOXONE },
    231	{ 0x0e6f, 0x0301, "Logic3 Controller", 0, XTYPE_XBOX360 },
    232	{ 0x0e6f, 0x0346, "Rock Candy Gamepad for Xbox One 2016", 0, XTYPE_XBOXONE },
    233	{ 0x0e6f, 0x0401, "Logic3 Controller", 0, XTYPE_XBOX360 },
    234	{ 0x0e6f, 0x0413, "Afterglow AX.1 Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
    235	{ 0x0e6f, 0x0501, "PDP Xbox 360 Controller", 0, XTYPE_XBOX360 },
    236	{ 0x0e6f, 0xf900, "PDP Afterglow AX.1", 0, XTYPE_XBOX360 },
    237	{ 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX },
    238	{ 0x0e8f, 0x3008, "Generic xbox control (dealextreme)", 0, XTYPE_XBOX },
    239	{ 0x0f0d, 0x000a, "Hori Co. DOA4 FightStick", 0, XTYPE_XBOX360 },
    240	{ 0x0f0d, 0x000c, "Hori PadEX Turbo", 0, XTYPE_XBOX360 },
    241	{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    242	{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    243	{ 0x0f0d, 0x001b, "Hori Real Arcade Pro VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    244	{ 0x0f0d, 0x0063, "Hori Real Arcade Pro Hayabusa (USA) Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
    245	{ 0x0f0d, 0x0067, "HORIPAD ONE", 0, XTYPE_XBOXONE },
    246	{ 0x0f0d, 0x0078, "Hori Real Arcade Pro V Kai Xbox One", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
    247	{ 0x0f30, 0x010b, "Philips Recoil", 0, XTYPE_XBOX },
    248	{ 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX },
    249	{ 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX },
    250	{ 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX },
    251	{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
    252	{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
    253	{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
    254	{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
    255	{ 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
    256	{ 0x12ab, 0x0301, "PDP AFTERGLOW AX.1", 0, XTYPE_XBOX360 },
    257	{ 0x12ab, 0x0303, "Mortal Kombat Klassic FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    258	{ 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    259	{ 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 },
    260	{ 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
    261	{ 0x1430, 0xf801, "RedOctane Controller", 0, XTYPE_XBOX360 },
    262	{ 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 },
    263	{ 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
    264	{ 0x1532, 0x0a00, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOXONE },
    265	{ 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
    266	{ 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
    267	{ 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
    268	{ 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
    269	{ 0x162e, 0xbeef, "Joytech Neo-Se Take2", 0, XTYPE_XBOX360 },
    270	{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", 0, XTYPE_XBOX360 },
    271	{ 0x1689, 0xfd01, "Razer Onza Classic Edition", 0, XTYPE_XBOX360 },
    272	{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
    273	{ 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
    274	{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
    275	{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
    276	{ 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
    277	{ 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 },
    278	{ 0x1bad, 0xf018, "Mad Catz Street Fighter IV SE Fighting Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    279	{ 0x1bad, 0xf019, "Mad Catz Brawlstick for Xbox 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    280	{ 0x1bad, 0xf021, "Mad Cats Ghost Recon FS GamePad", 0, XTYPE_XBOX360 },
    281	{ 0x1bad, 0xf023, "MLG Pro Circuit Controller (Xbox)", 0, XTYPE_XBOX360 },
    282	{ 0x1bad, 0xf025, "Mad Catz Call Of Duty", 0, XTYPE_XBOX360 },
    283	{ 0x1bad, 0xf027, "Mad Catz FPS Pro", 0, XTYPE_XBOX360 },
    284	{ 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 },
    285	{ 0x1bad, 0xf02e, "Mad Catz Fightpad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    286	{ 0x1bad, 0xf030, "Mad Catz Xbox 360 MC2 MicroCon Racing Wheel", 0, XTYPE_XBOX360 },
    287	{ 0x1bad, 0xf036, "Mad Catz MicroCon GamePad Pro", 0, XTYPE_XBOX360 },
    288	{ 0x1bad, 0xf038, "Street Fighter IV FightStick TE", 0, XTYPE_XBOX360 },
    289	{ 0x1bad, 0xf039, "Mad Catz MvC2 TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    290	{ 0x1bad, 0xf03a, "Mad Catz SFxT Fightstick Pro", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    291	{ 0x1bad, 0xf03d, "Street Fighter IV Arcade Stick TE - Chun Li", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    292	{ 0x1bad, 0xf03e, "Mad Catz MLG FightStick TE", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    293	{ 0x1bad, 0xf03f, "Mad Catz FightStick SoulCaliber", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    294	{ 0x1bad, 0xf042, "Mad Catz FightStick TES+", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    295	{ 0x1bad, 0xf080, "Mad Catz FightStick TE2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    296	{ 0x1bad, 0xf501, "HoriPad EX2 Turbo", 0, XTYPE_XBOX360 },
    297	{ 0x1bad, 0xf502, "Hori Real Arcade Pro.VX SA", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    298	{ 0x1bad, 0xf503, "Hori Fighting Stick VX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    299	{ 0x1bad, 0xf504, "Hori Real Arcade Pro. EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    300	{ 0x1bad, 0xf505, "Hori Fighting Stick EX2B", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    301	{ 0x1bad, 0xf506, "Hori Real Arcade Pro.EX Premium VLX", 0, XTYPE_XBOX360 },
    302	{ 0x1bad, 0xf900, "Harmonix Xbox 360 Controller", 0, XTYPE_XBOX360 },
    303	{ 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 },
    304	{ 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 },
    305	{ 0x1bad, 0xf904, "PDP Versus Fighting Pad", 0, XTYPE_XBOX360 },
    306	{ 0x1bad, 0xf906, "MortalKombat FightStick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    307	{ 0x1bad, 0xfa01, "MadCatz GamePad", 0, XTYPE_XBOX360 },
    308	{ 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
    309	{ 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
    310	{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
    311	{ 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
    312	{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
    313	{ 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
    314	{ 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    315	{ 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 },
    316	{ 0x24c6, 0x5303, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
    317	{ 0x24c6, 0x530a, "Xbox 360 Pro EX Controller", 0, XTYPE_XBOX360 },
    318	{ 0x24c6, 0x531a, "PowerA Pro Ex", 0, XTYPE_XBOX360 },
    319	{ 0x24c6, 0x5397, "FUS1ON Tournament Controller", 0, XTYPE_XBOX360 },
    320	{ 0x24c6, 0x541a, "PowerA Xbox One Mini Wired Controller", 0, XTYPE_XBOXONE },
    321	{ 0x24c6, 0x542a, "Xbox ONE spectra", 0, XTYPE_XBOXONE },
    322	{ 0x24c6, 0x543a, "PowerA Xbox One wired controller", 0, XTYPE_XBOXONE },
    323	{ 0x24c6, 0x5500, "Hori XBOX 360 EX 2 with Turbo", 0, XTYPE_XBOX360 },
    324	{ 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 },
    325	{ 0x24c6, 0x5502, "Hori Fighting Stick VX Alt", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    326	{ 0x24c6, 0x5503, "Hori Fighting Edge", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    327	{ 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 },
    328	{ 0x24c6, 0x550d, "Hori GEM Xbox controller", 0, XTYPE_XBOX360 },
    329	{ 0x24c6, 0x550e, "Hori Real Arcade Pro V Kai 360", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
    330	{ 0x24c6, 0x551a, "PowerA FUSION Pro Controller", 0, XTYPE_XBOXONE },
    331	{ 0x24c6, 0x561a, "PowerA FUSION Controller", 0, XTYPE_XBOXONE },
    332	{ 0x24c6, 0x5b00, "ThrustMaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
    333	{ 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 },
    334	{ 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 },
    335	{ 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 },
    336	{ 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
    337	{ 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
    338	{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
    339	{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
    340	{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
    341};
    342
    343/* buttons shared with xbox and xbox360 */
    344static const signed short xpad_common_btn[] = {
    345	BTN_A, BTN_B, BTN_X, BTN_Y,			/* "analog" buttons */
    346	BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR,	/* start/back/sticks */
    347	-1						/* terminating entry */
    348};
    349
    350/* original xbox controllers only */
    351static const signed short xpad_btn[] = {
    352	BTN_C, BTN_Z,		/* "analog" buttons */
    353	-1			/* terminating entry */
    354};
    355
    356/* used when dpad is mapped to buttons */
    357static const signed short xpad_btn_pad[] = {
    358	BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2,		/* d-pad left, right */
    359	BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4,		/* d-pad up, down */
    360	-1				/* terminating entry */
    361};
    362
    363/* used when triggers are mapped to buttons */
    364static const signed short xpad_btn_triggers[] = {
    365	BTN_TL2, BTN_TR2,		/* triggers left/right */
    366	-1
    367};
    368
    369static const signed short xpad360_btn[] = {  /* buttons for x360 controller */
    370	BTN_TL, BTN_TR,		/* Button LB/RB */
    371	BTN_MODE,		/* The big X button */
    372	-1
    373};
    374
    375static const signed short xpad_abs[] = {
    376	ABS_X, ABS_Y,		/* left stick */
    377	ABS_RX, ABS_RY,		/* right stick */
    378	-1			/* terminating entry */
    379};
    380
    381/* used when dpad is mapped to axes */
    382static const signed short xpad_abs_pad[] = {
    383	ABS_HAT0X, ABS_HAT0Y,	/* d-pad axes */
    384	-1			/* terminating entry */
    385};
    386
    387/* used when triggers are mapped to axes */
    388static const signed short xpad_abs_triggers[] = {
    389	ABS_Z, ABS_RZ,		/* triggers left/right */
    390	-1
    391};
    392
    393/*
    394 * Xbox 360 has a vendor-specific class, so we cannot match it with only
    395 * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we
    396 * match against vendor id as well. Wired Xbox 360 devices have protocol 1,
    397 * wireless controllers have protocol 129.
    398 */
    399#define XPAD_XBOX360_VENDOR_PROTOCOL(vend, pr) \
    400	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
    401	.idVendor = (vend), \
    402	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
    403	.bInterfaceSubClass = 93, \
    404	.bInterfaceProtocol = (pr)
    405#define XPAD_XBOX360_VENDOR(vend) \
    406	{ XPAD_XBOX360_VENDOR_PROTOCOL((vend), 1) }, \
    407	{ XPAD_XBOX360_VENDOR_PROTOCOL((vend), 129) }
    408
    409/* The Xbox One controller uses subclass 71 and protocol 208. */
    410#define XPAD_XBOXONE_VENDOR_PROTOCOL(vend, pr) \
    411	.match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \
    412	.idVendor = (vend), \
    413	.bInterfaceClass = USB_CLASS_VENDOR_SPEC, \
    414	.bInterfaceSubClass = 71, \
    415	.bInterfaceProtocol = (pr)
    416#define XPAD_XBOXONE_VENDOR(vend) \
    417	{ XPAD_XBOXONE_VENDOR_PROTOCOL((vend), 208) }
    418
    419static const struct usb_device_id xpad_table[] = {
    420	{ USB_INTERFACE_INFO('X', 'B', 0) },	/* X-Box USB-IF not approved class */
    421	XPAD_XBOX360_VENDOR(0x0079),		/* GPD Win 2 Controller */
    422	XPAD_XBOX360_VENDOR(0x044f),		/* Thrustmaster X-Box 360 controllers */
    423	XPAD_XBOX360_VENDOR(0x045e),		/* Microsoft X-Box 360 controllers */
    424	XPAD_XBOXONE_VENDOR(0x045e),		/* Microsoft X-Box One controllers */
    425	XPAD_XBOX360_VENDOR(0x046d),		/* Logitech X-Box 360 style controllers */
    426	XPAD_XBOX360_VENDOR(0x056e),		/* Elecom JC-U3613M */
    427	XPAD_XBOX360_VENDOR(0x06a3),		/* Saitek P3600 */
    428	XPAD_XBOX360_VENDOR(0x0738),		/* Mad Catz X-Box 360 controllers */
    429	{ USB_DEVICE(0x0738, 0x4540) },		/* Mad Catz Beat Pad */
    430	XPAD_XBOXONE_VENDOR(0x0738),		/* Mad Catz FightStick TE 2 */
    431	XPAD_XBOX360_VENDOR(0x07ff),		/* Mad Catz GamePad */
    432	XPAD_XBOX360_VENDOR(0x0e6f),		/* 0x0e6f X-Box 360 controllers */
    433	XPAD_XBOXONE_VENDOR(0x0e6f),		/* 0x0e6f X-Box One controllers */
    434	XPAD_XBOX360_VENDOR(0x0f0d),		/* Hori Controllers */
    435	XPAD_XBOXONE_VENDOR(0x0f0d),		/* Hori Controllers */
    436	XPAD_XBOX360_VENDOR(0x1038),		/* SteelSeries Controllers */
    437	XPAD_XBOX360_VENDOR(0x11c9),		/* Nacon GC100XF */
    438	XPAD_XBOX360_VENDOR(0x1209),		/* Ardwiino Controllers */
    439	XPAD_XBOX360_VENDOR(0x12ab),		/* X-Box 360 dance pads */
    440	XPAD_XBOX360_VENDOR(0x1430),		/* RedOctane X-Box 360 controllers */
    441	XPAD_XBOX360_VENDOR(0x146b),		/* BigBen Interactive Controllers */
    442	XPAD_XBOX360_VENDOR(0x1532),		/* Razer Sabertooth */
    443	XPAD_XBOXONE_VENDOR(0x1532),		/* Razer Wildcat */
    444	XPAD_XBOX360_VENDOR(0x15e4),		/* Numark X-Box 360 controllers */
    445	XPAD_XBOX360_VENDOR(0x162e),		/* Joytech X-Box 360 controllers */
    446	XPAD_XBOX360_VENDOR(0x1689),		/* Razer Onza */
    447	XPAD_XBOX360_VENDOR(0x1949),		/* Amazon controllers */
    448	XPAD_XBOX360_VENDOR(0x1bad),		/* Harminix Rock Band Guitar and Drums */
    449	XPAD_XBOX360_VENDOR(0x20d6),		/* PowerA Controllers */
    450	XPAD_XBOXONE_VENDOR(0x20d6),		/* PowerA Controllers */
    451	XPAD_XBOX360_VENDOR(0x24c6),		/* PowerA Controllers */
    452	XPAD_XBOXONE_VENDOR(0x24c6),		/* PowerA Controllers */
    453	XPAD_XBOXONE_VENDOR(0x2e24),		/* Hyperkin Duke X-Box One pad */
    454	XPAD_XBOX360_VENDOR(0x2f24),		/* GameSir Controllers */
    455	XPAD_XBOX360_VENDOR(0x3285),		/* Nacon GC-100 */
    456	{ }
    457};
    458
    459MODULE_DEVICE_TABLE(usb, xpad_table);
    460
    461struct xboxone_init_packet {
    462	u16 idVendor;
    463	u16 idProduct;
    464	const u8 *data;
    465	u8 len;
    466};
    467
    468#define XBOXONE_INIT_PKT(_vid, _pid, _data)		\
    469	{						\
    470		.idVendor	= (_vid),		\
    471		.idProduct	= (_pid),		\
    472		.data		= (_data),		\
    473		.len		= ARRAY_SIZE(_data),	\
    474	}
    475
    476
    477/*
    478 * This packet is required for all Xbox One pads with 2015
    479 * or later firmware installed (or present from the factory).
    480 */
    481static const u8 xboxone_fw2015_init[] = {
    482	0x05, 0x20, 0x00, 0x01, 0x00
    483};
    484
    485/*
    486 * This packet is required for Xbox One S (0x045e:0x02ea)
    487 * and Xbox One Elite Series 2 (0x045e:0x0b00) pads to
    488 * initialize the controller that was previously used in
    489 * Bluetooth mode.
    490 */
    491static const u8 xboxone_s_init[] = {
    492	0x05, 0x20, 0x00, 0x0f, 0x06
    493};
    494
    495/*
    496 * This packet is required for the Titanfall 2 Xbox One pads
    497 * (0x0e6f:0x0165) to finish initialization and for Hori pads
    498 * (0x0f0d:0x0067) to make the analog sticks work.
    499 */
    500static const u8 xboxone_hori_init[] = {
    501	0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a,
    502	0x00, 0x00, 0x00, 0x80, 0x00
    503};
    504
    505/*
    506 * This packet is required for most (all?) of the PDP pads to start
    507 * sending input reports. These pads include: (0x0e6f:0x02ab),
    508 * (0x0e6f:0x02a4), (0x0e6f:0x02a6).
    509 */
    510static const u8 xboxone_pdp_init1[] = {
    511	0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14
    512};
    513
    514/*
    515 * This packet is required for most (all?) of the PDP pads to start
    516 * sending input reports. These pads include: (0x0e6f:0x02ab),
    517 * (0x0e6f:0x02a4), (0x0e6f:0x02a6).
    518 */
    519static const u8 xboxone_pdp_init2[] = {
    520	0x06, 0x20, 0x00, 0x02, 0x01, 0x00
    521};
    522
    523/*
    524 * A specific rumble packet is required for some PowerA pads to start
    525 * sending input reports. One of those pads is (0x24c6:0x543a).
    526 */
    527static const u8 xboxone_rumblebegin_init[] = {
    528	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
    529	0x1D, 0x1D, 0xFF, 0x00, 0x00
    530};
    531
    532/*
    533 * A rumble packet with zero FF intensity will immediately
    534 * terminate the rumbling required to init PowerA pads.
    535 * This should happen fast enough that the motors don't
    536 * spin up to enough speed to actually vibrate the gamepad.
    537 */
    538static const u8 xboxone_rumbleend_init[] = {
    539	0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
    540	0x00, 0x00, 0x00, 0x00, 0x00
    541};
    542
    543/*
    544 * This specifies the selection of init packets that a gamepad
    545 * will be sent on init *and* the order in which they will be
    546 * sent. The correct sequence number will be added when the
    547 * packet is going to be sent.
    548 */
    549static const struct xboxone_init_packet xboxone_init_packets[] = {
    550	XBOXONE_INIT_PKT(0x0e6f, 0x0165, xboxone_hori_init),
    551	XBOXONE_INIT_PKT(0x0f0d, 0x0067, xboxone_hori_init),
    552	XBOXONE_INIT_PKT(0x0000, 0x0000, xboxone_fw2015_init),
    553	XBOXONE_INIT_PKT(0x045e, 0x02ea, xboxone_s_init),
    554	XBOXONE_INIT_PKT(0x045e, 0x0b00, xboxone_s_init),
    555	XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init1),
    556	XBOXONE_INIT_PKT(0x0e6f, 0x0000, xboxone_pdp_init2),
    557	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumblebegin_init),
    558	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumblebegin_init),
    559	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumblebegin_init),
    560	XBOXONE_INIT_PKT(0x24c6, 0x541a, xboxone_rumbleend_init),
    561	XBOXONE_INIT_PKT(0x24c6, 0x542a, xboxone_rumbleend_init),
    562	XBOXONE_INIT_PKT(0x24c6, 0x543a, xboxone_rumbleend_init),
    563};
    564
    565struct xpad_output_packet {
    566	u8 data[XPAD_PKT_LEN];
    567	u8 len;
    568	bool pending;
    569};
    570
    571#define XPAD_OUT_CMD_IDX	0
    572#define XPAD_OUT_FF_IDX		1
    573#define XPAD_OUT_LED_IDX	(1 + IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF))
    574#define XPAD_NUM_OUT_PACKETS	(1 + \
    575				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_FF) + \
    576				 IS_ENABLED(CONFIG_JOYSTICK_XPAD_LEDS))
    577
    578struct usb_xpad {
    579	struct input_dev *dev;		/* input device interface */
    580	struct input_dev __rcu *x360w_dev;
    581	struct usb_device *udev;	/* usb device */
    582	struct usb_interface *intf;	/* usb interface */
    583
    584	bool pad_present;
    585	bool input_created;
    586
    587	struct urb *irq_in;		/* urb for interrupt in report */
    588	unsigned char *idata;		/* input data */
    589	dma_addr_t idata_dma;
    590
    591	struct urb *irq_out;		/* urb for interrupt out report */
    592	struct usb_anchor irq_out_anchor;
    593	bool irq_out_active;		/* we must not use an active URB */
    594	u8 odata_serial;		/* serial number for xbox one protocol */
    595	unsigned char *odata;		/* output data */
    596	dma_addr_t odata_dma;
    597	spinlock_t odata_lock;
    598
    599	struct xpad_output_packet out_packets[XPAD_NUM_OUT_PACKETS];
    600	int last_out_packet;
    601	int init_seq;
    602
    603#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
    604	struct xpad_led *led;
    605#endif
    606
    607	char phys[64];			/* physical device path */
    608
    609	int mapping;			/* map d-pad to buttons or to axes */
    610	int xtype;			/* type of xbox device */
    611	int pad_nr;			/* the order x360 pads were attached */
    612	const char *name;		/* name of the device */
    613	struct work_struct work;	/* init/remove device from callback */
    614};
    615
    616static int xpad_init_input(struct usb_xpad *xpad);
    617static void xpad_deinit_input(struct usb_xpad *xpad);
    618static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
    619
    620/*
    621 *	xpad_process_packet
    622 *
    623 *	Completes a request by converting the data into events for the
    624 *	input subsystem.
    625 *
    626 *	The used report descriptor was taken from ITO Takayukis website:
    627 *	 http://euc.jp/periphs/xbox-controller.ja.html
    628 */
    629static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
    630{
    631	struct input_dev *dev = xpad->dev;
    632
    633	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
    634		/* left stick */
    635		input_report_abs(dev, ABS_X,
    636				 (__s16) le16_to_cpup((__le16 *)(data + 12)));
    637		input_report_abs(dev, ABS_Y,
    638				 ~(__s16) le16_to_cpup((__le16 *)(data + 14)));
    639
    640		/* right stick */
    641		input_report_abs(dev, ABS_RX,
    642				 (__s16) le16_to_cpup((__le16 *)(data + 16)));
    643		input_report_abs(dev, ABS_RY,
    644				 ~(__s16) le16_to_cpup((__le16 *)(data + 18)));
    645	}
    646
    647	/* triggers left/right */
    648	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
    649		input_report_key(dev, BTN_TL2, data[10]);
    650		input_report_key(dev, BTN_TR2, data[11]);
    651	} else {
    652		input_report_abs(dev, ABS_Z, data[10]);
    653		input_report_abs(dev, ABS_RZ, data[11]);
    654	}
    655
    656	/* digital pad */
    657	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
    658		/* dpad as buttons (left, right, up, down) */
    659		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
    660		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
    661		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
    662		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
    663	} else {
    664		input_report_abs(dev, ABS_HAT0X,
    665				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
    666		input_report_abs(dev, ABS_HAT0Y,
    667				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
    668	}
    669
    670	/* start/back buttons and stick press left/right */
    671	input_report_key(dev, BTN_START,  data[2] & 0x10);
    672	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
    673	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
    674	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
    675
    676	/* "analog" buttons A, B, X, Y */
    677	input_report_key(dev, BTN_A, data[4]);
    678	input_report_key(dev, BTN_B, data[5]);
    679	input_report_key(dev, BTN_X, data[6]);
    680	input_report_key(dev, BTN_Y, data[7]);
    681
    682	/* "analog" buttons black, white */
    683	input_report_key(dev, BTN_C, data[8]);
    684	input_report_key(dev, BTN_Z, data[9]);
    685
    686	input_sync(dev);
    687}
    688
    689/*
    690 *	xpad360_process_packet
    691 *
    692 *	Completes a request by converting the data into events for the
    693 *	input subsystem. It is version for xbox 360 controller
    694 *
    695 *	The used report descriptor was taken from:
    696 *		http://www.free60.org/wiki/Gamepad
    697 */
    698
    699static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
    700				   u16 cmd, unsigned char *data)
    701{
    702	/* valid pad data */
    703	if (data[0] != 0x00)
    704		return;
    705
    706	/* digital pad */
    707	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
    708		/* dpad as buttons (left, right, up, down) */
    709		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04);
    710		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08);
    711		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01);
    712		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02);
    713	}
    714
    715	/*
    716	 * This should be a simple else block. However historically
    717	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
    718	 * made no sense, but now we can not just switch back and have to
    719	 * support both behaviors.
    720	 */
    721	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
    722	    xpad->xtype == XTYPE_XBOX360W) {
    723		input_report_abs(dev, ABS_HAT0X,
    724				 !!(data[2] & 0x08) - !!(data[2] & 0x04));
    725		input_report_abs(dev, ABS_HAT0Y,
    726				 !!(data[2] & 0x02) - !!(data[2] & 0x01));
    727	}
    728
    729	/* start/back buttons */
    730	input_report_key(dev, BTN_START,  data[2] & 0x10);
    731	input_report_key(dev, BTN_SELECT, data[2] & 0x20);
    732
    733	/* stick press left/right */
    734	input_report_key(dev, BTN_THUMBL, data[2] & 0x40);
    735	input_report_key(dev, BTN_THUMBR, data[2] & 0x80);
    736
    737	/* buttons A,B,X,Y,TL,TR and MODE */
    738	input_report_key(dev, BTN_A,	data[3] & 0x10);
    739	input_report_key(dev, BTN_B,	data[3] & 0x20);
    740	input_report_key(dev, BTN_X,	data[3] & 0x40);
    741	input_report_key(dev, BTN_Y,	data[3] & 0x80);
    742	input_report_key(dev, BTN_TL,	data[3] & 0x01);
    743	input_report_key(dev, BTN_TR,	data[3] & 0x02);
    744	input_report_key(dev, BTN_MODE,	data[3] & 0x04);
    745
    746	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
    747		/* left stick */
    748		input_report_abs(dev, ABS_X,
    749				 (__s16) le16_to_cpup((__le16 *)(data + 6)));
    750		input_report_abs(dev, ABS_Y,
    751				 ~(__s16) le16_to_cpup((__le16 *)(data + 8)));
    752
    753		/* right stick */
    754		input_report_abs(dev, ABS_RX,
    755				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
    756		input_report_abs(dev, ABS_RY,
    757				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
    758	}
    759
    760	/* triggers left/right */
    761	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
    762		input_report_key(dev, BTN_TL2, data[4]);
    763		input_report_key(dev, BTN_TR2, data[5]);
    764	} else {
    765		input_report_abs(dev, ABS_Z, data[4]);
    766		input_report_abs(dev, ABS_RZ, data[5]);
    767	}
    768
    769	input_sync(dev);
    770}
    771
    772static void xpad_presence_work(struct work_struct *work)
    773{
    774	struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
    775	int error;
    776
    777	if (xpad->pad_present) {
    778		error = xpad_init_input(xpad);
    779		if (error) {
    780			/* complain only, not much else we can do here */
    781			dev_err(&xpad->dev->dev,
    782				"unable to init device: %d\n", error);
    783		} else {
    784			rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
    785		}
    786	} else {
    787		RCU_INIT_POINTER(xpad->x360w_dev, NULL);
    788		synchronize_rcu();
    789		/*
    790		 * Now that we are sure xpad360w_process_packet is not
    791		 * using input device we can get rid of it.
    792		 */
    793		xpad_deinit_input(xpad);
    794	}
    795}
    796
    797/*
    798 * xpad360w_process_packet
    799 *
    800 * Completes a request by converting the data into events for the
    801 * input subsystem. It is version for xbox 360 wireless controller.
    802 *
    803 * Byte.Bit
    804 * 00.1 - Status change: The controller or headset has connected/disconnected
    805 *                       Bits 01.7 and 01.6 are valid
    806 * 01.7 - Controller present
    807 * 01.6 - Headset present
    808 * 01.1 - Pad state (Bytes 4+) valid
    809 *
    810 */
    811static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
    812{
    813	struct input_dev *dev;
    814	bool present;
    815
    816	/* Presence change */
    817	if (data[0] & 0x08) {
    818		present = (data[1] & 0x80) != 0;
    819
    820		if (xpad->pad_present != present) {
    821			xpad->pad_present = present;
    822			schedule_work(&xpad->work);
    823		}
    824	}
    825
    826	/* Valid pad data */
    827	if (data[1] != 0x1)
    828		return;
    829
    830	rcu_read_lock();
    831	dev = rcu_dereference(xpad->x360w_dev);
    832	if (dev)
    833		xpad360_process_packet(xpad, dev, cmd, &data[4]);
    834	rcu_read_unlock();
    835}
    836
    837/*
    838 *	xpadone_process_packet
    839 *
    840 *	Completes a request by converting the data into events for the
    841 *	input subsystem. This version is for the Xbox One controller.
    842 *
    843 *	The report format was gleaned from
    844 *	https://github.com/kylelemons/xbox/blob/master/xbox.go
    845 */
    846static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
    847{
    848	struct input_dev *dev = xpad->dev;
    849
    850	/* the xbox button has its own special report */
    851	if (data[0] == 0X07) {
    852		/*
    853		 * The Xbox One S controller requires these reports to be
    854		 * acked otherwise it continues sending them forever and
    855		 * won't report further mode button events.
    856		 */
    857		if (data[1] == 0x30)
    858			xpadone_ack_mode_report(xpad, data[2]);
    859
    860		input_report_key(dev, BTN_MODE, data[4] & 0x01);
    861		input_sync(dev);
    862		return;
    863	}
    864	/* check invalid packet */
    865	else if (data[0] != 0X20)
    866		return;
    867
    868	/* menu/view buttons */
    869	input_report_key(dev, BTN_START,  data[4] & 0x04);
    870	input_report_key(dev, BTN_SELECT, data[4] & 0x08);
    871	if (xpad->mapping & MAP_SELECT_BUTTON)
    872		input_report_key(dev, KEY_RECORD, data[22] & 0x01);
    873
    874	/* buttons A,B,X,Y */
    875	input_report_key(dev, BTN_A,	data[4] & 0x10);
    876	input_report_key(dev, BTN_B,	data[4] & 0x20);
    877	input_report_key(dev, BTN_X,	data[4] & 0x40);
    878	input_report_key(dev, BTN_Y,	data[4] & 0x80);
    879
    880	/* digital pad */
    881	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
    882		/* dpad as buttons (left, right, up, down) */
    883		input_report_key(dev, BTN_TRIGGER_HAPPY1, data[5] & 0x04);
    884		input_report_key(dev, BTN_TRIGGER_HAPPY2, data[5] & 0x08);
    885		input_report_key(dev, BTN_TRIGGER_HAPPY3, data[5] & 0x01);
    886		input_report_key(dev, BTN_TRIGGER_HAPPY4, data[5] & 0x02);
    887	} else {
    888		input_report_abs(dev, ABS_HAT0X,
    889				 !!(data[5] & 0x08) - !!(data[5] & 0x04));
    890		input_report_abs(dev, ABS_HAT0Y,
    891				 !!(data[5] & 0x02) - !!(data[5] & 0x01));
    892	}
    893
    894	/* TL/TR */
    895	input_report_key(dev, BTN_TL,	data[5] & 0x10);
    896	input_report_key(dev, BTN_TR,	data[5] & 0x20);
    897
    898	/* stick press left/right */
    899	input_report_key(dev, BTN_THUMBL, data[5] & 0x40);
    900	input_report_key(dev, BTN_THUMBR, data[5] & 0x80);
    901
    902	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
    903		/* left stick */
    904		input_report_abs(dev, ABS_X,
    905				 (__s16) le16_to_cpup((__le16 *)(data + 10)));
    906		input_report_abs(dev, ABS_Y,
    907				 ~(__s16) le16_to_cpup((__le16 *)(data + 12)));
    908
    909		/* right stick */
    910		input_report_abs(dev, ABS_RX,
    911				 (__s16) le16_to_cpup((__le16 *)(data + 14)));
    912		input_report_abs(dev, ABS_RY,
    913				 ~(__s16) le16_to_cpup((__le16 *)(data + 16)));
    914	}
    915
    916	/* triggers left/right */
    917	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
    918		input_report_key(dev, BTN_TL2,
    919				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
    920		input_report_key(dev, BTN_TR2,
    921				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
    922	} else {
    923		input_report_abs(dev, ABS_Z,
    924				 (__u16) le16_to_cpup((__le16 *)(data + 6)));
    925		input_report_abs(dev, ABS_RZ,
    926				 (__u16) le16_to_cpup((__le16 *)(data + 8)));
    927	}
    928
    929	input_sync(dev);
    930}
    931
    932static void xpad_irq_in(struct urb *urb)
    933{
    934	struct usb_xpad *xpad = urb->context;
    935	struct device *dev = &xpad->intf->dev;
    936	int retval, status;
    937
    938	status = urb->status;
    939
    940	switch (status) {
    941	case 0:
    942		/* success */
    943		break;
    944	case -ECONNRESET:
    945	case -ENOENT:
    946	case -ESHUTDOWN:
    947		/* this urb is terminated, clean up */
    948		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
    949			__func__, status);
    950		return;
    951	default:
    952		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
    953			__func__, status);
    954		goto exit;
    955	}
    956
    957	switch (xpad->xtype) {
    958	case XTYPE_XBOX360:
    959		xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
    960		break;
    961	case XTYPE_XBOX360W:
    962		xpad360w_process_packet(xpad, 0, xpad->idata);
    963		break;
    964	case XTYPE_XBOXONE:
    965		xpadone_process_packet(xpad, 0, xpad->idata);
    966		break;
    967	default:
    968		xpad_process_packet(xpad, 0, xpad->idata);
    969	}
    970
    971exit:
    972	retval = usb_submit_urb(urb, GFP_ATOMIC);
    973	if (retval)
    974		dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
    975			__func__, retval);
    976}
    977
    978/* Callers must hold xpad->odata_lock spinlock */
    979static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
    980{
    981	const struct xboxone_init_packet *init_packet;
    982
    983	if (xpad->xtype != XTYPE_XBOXONE)
    984		return false;
    985
    986	/* Perform initialization sequence for Xbox One pads that require it */
    987	while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
    988		init_packet = &xboxone_init_packets[xpad->init_seq++];
    989
    990		if (init_packet->idVendor != 0 &&
    991		    init_packet->idVendor != xpad->dev->id.vendor)
    992			continue;
    993
    994		if (init_packet->idProduct != 0 &&
    995		    init_packet->idProduct != xpad->dev->id.product)
    996			continue;
    997
    998		/* This packet applies to our device, so prepare to send it */
    999		memcpy(xpad->odata, init_packet->data, init_packet->len);
   1000		xpad->irq_out->transfer_buffer_length = init_packet->len;
   1001
   1002		/* Update packet with current sequence number */
   1003		xpad->odata[2] = xpad->odata_serial++;
   1004		return true;
   1005	}
   1006
   1007	return false;
   1008}
   1009
   1010/* Callers must hold xpad->odata_lock spinlock */
   1011static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
   1012{
   1013	struct xpad_output_packet *pkt, *packet = NULL;
   1014	int i;
   1015
   1016	/* We may have init packets to send before we can send user commands */
   1017	if (xpad_prepare_next_init_packet(xpad))
   1018		return true;
   1019
   1020	for (i = 0; i < XPAD_NUM_OUT_PACKETS; i++) {
   1021		if (++xpad->last_out_packet >= XPAD_NUM_OUT_PACKETS)
   1022			xpad->last_out_packet = 0;
   1023
   1024		pkt = &xpad->out_packets[xpad->last_out_packet];
   1025		if (pkt->pending) {
   1026			dev_dbg(&xpad->intf->dev,
   1027				"%s - found pending output packet %d\n",
   1028				__func__, xpad->last_out_packet);
   1029			packet = pkt;
   1030			break;
   1031		}
   1032	}
   1033
   1034	if (packet) {
   1035		memcpy(xpad->odata, packet->data, packet->len);
   1036		xpad->irq_out->transfer_buffer_length = packet->len;
   1037		packet->pending = false;
   1038		return true;
   1039	}
   1040
   1041	return false;
   1042}
   1043
   1044/* Callers must hold xpad->odata_lock spinlock */
   1045static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)
   1046{
   1047	int error;
   1048
   1049	if (!xpad->irq_out_active && xpad_prepare_next_out_packet(xpad)) {
   1050		usb_anchor_urb(xpad->irq_out, &xpad->irq_out_anchor);
   1051		error = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
   1052		if (error) {
   1053			dev_err(&xpad->intf->dev,
   1054				"%s - usb_submit_urb failed with result %d\n",
   1055				__func__, error);
   1056			usb_unanchor_urb(xpad->irq_out);
   1057			return -EIO;
   1058		}
   1059
   1060		xpad->irq_out_active = true;
   1061	}
   1062
   1063	return 0;
   1064}
   1065
   1066static void xpad_irq_out(struct urb *urb)
   1067{
   1068	struct usb_xpad *xpad = urb->context;
   1069	struct device *dev = &xpad->intf->dev;
   1070	int status = urb->status;
   1071	int error;
   1072	unsigned long flags;
   1073
   1074	spin_lock_irqsave(&xpad->odata_lock, flags);
   1075
   1076	switch (status) {
   1077	case 0:
   1078		/* success */
   1079		xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
   1080		break;
   1081
   1082	case -ECONNRESET:
   1083	case -ENOENT:
   1084	case -ESHUTDOWN:
   1085		/* this urb is terminated, clean up */
   1086		dev_dbg(dev, "%s - urb shutting down with status: %d\n",
   1087			__func__, status);
   1088		xpad->irq_out_active = false;
   1089		break;
   1090
   1091	default:
   1092		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
   1093			__func__, status);
   1094		break;
   1095	}
   1096
   1097	if (xpad->irq_out_active) {
   1098		usb_anchor_urb(urb, &xpad->irq_out_anchor);
   1099		error = usb_submit_urb(urb, GFP_ATOMIC);
   1100		if (error) {
   1101			dev_err(dev,
   1102				"%s - usb_submit_urb failed with result %d\n",
   1103				__func__, error);
   1104			usb_unanchor_urb(urb);
   1105			xpad->irq_out_active = false;
   1106		}
   1107	}
   1108
   1109	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1110}
   1111
   1112static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad,
   1113			struct usb_endpoint_descriptor *ep_irq_out)
   1114{
   1115	int error;
   1116
   1117	if (xpad->xtype == XTYPE_UNKNOWN)
   1118		return 0;
   1119
   1120	init_usb_anchor(&xpad->irq_out_anchor);
   1121
   1122	xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
   1123					 GFP_KERNEL, &xpad->odata_dma);
   1124	if (!xpad->odata)
   1125		return -ENOMEM;
   1126
   1127	spin_lock_init(&xpad->odata_lock);
   1128
   1129	xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
   1130	if (!xpad->irq_out) {
   1131		error = -ENOMEM;
   1132		goto err_free_coherent;
   1133	}
   1134
   1135	usb_fill_int_urb(xpad->irq_out, xpad->udev,
   1136			 usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
   1137			 xpad->odata, XPAD_PKT_LEN,
   1138			 xpad_irq_out, xpad, ep_irq_out->bInterval);
   1139	xpad->irq_out->transfer_dma = xpad->odata_dma;
   1140	xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
   1141
   1142	return 0;
   1143
   1144err_free_coherent:
   1145	usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
   1146	return error;
   1147}
   1148
   1149static void xpad_stop_output(struct usb_xpad *xpad)
   1150{
   1151	if (xpad->xtype != XTYPE_UNKNOWN) {
   1152		if (!usb_wait_anchor_empty_timeout(&xpad->irq_out_anchor,
   1153						   5000)) {
   1154			dev_warn(&xpad->intf->dev,
   1155				 "timed out waiting for output URB to complete, killing\n");
   1156			usb_kill_anchored_urbs(&xpad->irq_out_anchor);
   1157		}
   1158	}
   1159}
   1160
   1161static void xpad_deinit_output(struct usb_xpad *xpad)
   1162{
   1163	if (xpad->xtype != XTYPE_UNKNOWN) {
   1164		usb_free_urb(xpad->irq_out);
   1165		usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
   1166				xpad->odata, xpad->odata_dma);
   1167	}
   1168}
   1169
   1170static int xpad_inquiry_pad_presence(struct usb_xpad *xpad)
   1171{
   1172	struct xpad_output_packet *packet =
   1173			&xpad->out_packets[XPAD_OUT_CMD_IDX];
   1174	unsigned long flags;
   1175	int retval;
   1176
   1177	spin_lock_irqsave(&xpad->odata_lock, flags);
   1178
   1179	packet->data[0] = 0x08;
   1180	packet->data[1] = 0x00;
   1181	packet->data[2] = 0x0F;
   1182	packet->data[3] = 0xC0;
   1183	packet->data[4] = 0x00;
   1184	packet->data[5] = 0x00;
   1185	packet->data[6] = 0x00;
   1186	packet->data[7] = 0x00;
   1187	packet->data[8] = 0x00;
   1188	packet->data[9] = 0x00;
   1189	packet->data[10] = 0x00;
   1190	packet->data[11] = 0x00;
   1191	packet->len = 12;
   1192	packet->pending = true;
   1193
   1194	/* Reset the sequence so we send out presence first */
   1195	xpad->last_out_packet = -1;
   1196	retval = xpad_try_sending_next_out_packet(xpad);
   1197
   1198	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1199
   1200	return retval;
   1201}
   1202
   1203static int xpad_start_xbox_one(struct usb_xpad *xpad)
   1204{
   1205	unsigned long flags;
   1206	int retval;
   1207
   1208	spin_lock_irqsave(&xpad->odata_lock, flags);
   1209
   1210	/*
   1211	 * Begin the init sequence by attempting to send a packet.
   1212	 * We will cycle through the init packet sequence before
   1213	 * sending any packets from the output ring.
   1214	 */
   1215	xpad->init_seq = 0;
   1216	retval = xpad_try_sending_next_out_packet(xpad);
   1217
   1218	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1219
   1220	return retval;
   1221}
   1222
   1223static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num)
   1224{
   1225	unsigned long flags;
   1226	struct xpad_output_packet *packet =
   1227			&xpad->out_packets[XPAD_OUT_CMD_IDX];
   1228	static const u8 mode_report_ack[] = {
   1229		0x01, 0x20, 0x00, 0x09, 0x00, 0x07, 0x20, 0x02,
   1230		0x00, 0x00, 0x00, 0x00, 0x00
   1231	};
   1232
   1233	spin_lock_irqsave(&xpad->odata_lock, flags);
   1234
   1235	packet->len = sizeof(mode_report_ack);
   1236	memcpy(packet->data, mode_report_ack, packet->len);
   1237	packet->data[2] = seq_num;
   1238	packet->pending = true;
   1239
   1240	/* Reset the sequence so we send out the ack now */
   1241	xpad->last_out_packet = -1;
   1242	xpad_try_sending_next_out_packet(xpad);
   1243
   1244	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1245}
   1246
   1247#ifdef CONFIG_JOYSTICK_XPAD_FF
   1248static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)
   1249{
   1250	struct usb_xpad *xpad = input_get_drvdata(dev);
   1251	struct xpad_output_packet *packet = &xpad->out_packets[XPAD_OUT_FF_IDX];
   1252	__u16 strong;
   1253	__u16 weak;
   1254	int retval;
   1255	unsigned long flags;
   1256
   1257	if (effect->type != FF_RUMBLE)
   1258		return 0;
   1259
   1260	strong = effect->u.rumble.strong_magnitude;
   1261	weak = effect->u.rumble.weak_magnitude;
   1262
   1263	spin_lock_irqsave(&xpad->odata_lock, flags);
   1264
   1265	switch (xpad->xtype) {
   1266	case XTYPE_XBOX:
   1267		packet->data[0] = 0x00;
   1268		packet->data[1] = 0x06;
   1269		packet->data[2] = 0x00;
   1270		packet->data[3] = strong / 256;	/* left actuator */
   1271		packet->data[4] = 0x00;
   1272		packet->data[5] = weak / 256;	/* right actuator */
   1273		packet->len = 6;
   1274		packet->pending = true;
   1275		break;
   1276
   1277	case XTYPE_XBOX360:
   1278		packet->data[0] = 0x00;
   1279		packet->data[1] = 0x08;
   1280		packet->data[2] = 0x00;
   1281		packet->data[3] = strong / 256;  /* left actuator? */
   1282		packet->data[4] = weak / 256;	/* right actuator? */
   1283		packet->data[5] = 0x00;
   1284		packet->data[6] = 0x00;
   1285		packet->data[7] = 0x00;
   1286		packet->len = 8;
   1287		packet->pending = true;
   1288		break;
   1289
   1290	case XTYPE_XBOX360W:
   1291		packet->data[0] = 0x00;
   1292		packet->data[1] = 0x01;
   1293		packet->data[2] = 0x0F;
   1294		packet->data[3] = 0xC0;
   1295		packet->data[4] = 0x00;
   1296		packet->data[5] = strong / 256;
   1297		packet->data[6] = weak / 256;
   1298		packet->data[7] = 0x00;
   1299		packet->data[8] = 0x00;
   1300		packet->data[9] = 0x00;
   1301		packet->data[10] = 0x00;
   1302		packet->data[11] = 0x00;
   1303		packet->len = 12;
   1304		packet->pending = true;
   1305		break;
   1306
   1307	case XTYPE_XBOXONE:
   1308		packet->data[0] = 0x09; /* activate rumble */
   1309		packet->data[1] = 0x00;
   1310		packet->data[2] = xpad->odata_serial++;
   1311		packet->data[3] = 0x09;
   1312		packet->data[4] = 0x00;
   1313		packet->data[5] = 0x0F;
   1314		packet->data[6] = 0x00;
   1315		packet->data[7] = 0x00;
   1316		packet->data[8] = strong / 512;	/* left actuator */
   1317		packet->data[9] = weak / 512;	/* right actuator */
   1318		packet->data[10] = 0xFF; /* on period */
   1319		packet->data[11] = 0x00; /* off period */
   1320		packet->data[12] = 0xFF; /* repeat count */
   1321		packet->len = 13;
   1322		packet->pending = true;
   1323		break;
   1324
   1325	default:
   1326		dev_dbg(&xpad->dev->dev,
   1327			"%s - rumble command sent to unsupported xpad type: %d\n",
   1328			__func__, xpad->xtype);
   1329		retval = -EINVAL;
   1330		goto out;
   1331	}
   1332
   1333	retval = xpad_try_sending_next_out_packet(xpad);
   1334
   1335out:
   1336	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1337	return retval;
   1338}
   1339
   1340static int xpad_init_ff(struct usb_xpad *xpad)
   1341{
   1342	if (xpad->xtype == XTYPE_UNKNOWN)
   1343		return 0;
   1344
   1345	input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
   1346
   1347	return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
   1348}
   1349
   1350#else
   1351static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
   1352#endif
   1353
   1354#if defined(CONFIG_JOYSTICK_XPAD_LEDS)
   1355#include <linux/leds.h>
   1356#include <linux/idr.h>
   1357
   1358static DEFINE_IDA(xpad_pad_seq);
   1359
   1360struct xpad_led {
   1361	char name[16];
   1362	struct led_classdev led_cdev;
   1363	struct usb_xpad *xpad;
   1364};
   1365
   1366/*
   1367 * set the LEDs on Xbox360 / Wireless Controllers
   1368 * @param command
   1369 *  0: off
   1370 *  1: all blink, then previous setting
   1371 *  2: 1/top-left blink, then on
   1372 *  3: 2/top-right blink, then on
   1373 *  4: 3/bottom-left blink, then on
   1374 *  5: 4/bottom-right blink, then on
   1375 *  6: 1/top-left on
   1376 *  7: 2/top-right on
   1377 *  8: 3/bottom-left on
   1378 *  9: 4/bottom-right on
   1379 * 10: rotate
   1380 * 11: blink, based on previous setting
   1381 * 12: slow blink, based on previous setting
   1382 * 13: rotate with two lights
   1383 * 14: persistent slow all blink
   1384 * 15: blink once, then previous setting
   1385 */
   1386static void xpad_send_led_command(struct usb_xpad *xpad, int command)
   1387{
   1388	struct xpad_output_packet *packet =
   1389			&xpad->out_packets[XPAD_OUT_LED_IDX];
   1390	unsigned long flags;
   1391
   1392	command %= 16;
   1393
   1394	spin_lock_irqsave(&xpad->odata_lock, flags);
   1395
   1396	switch (xpad->xtype) {
   1397	case XTYPE_XBOX360:
   1398		packet->data[0] = 0x01;
   1399		packet->data[1] = 0x03;
   1400		packet->data[2] = command;
   1401		packet->len = 3;
   1402		packet->pending = true;
   1403		break;
   1404
   1405	case XTYPE_XBOX360W:
   1406		packet->data[0] = 0x00;
   1407		packet->data[1] = 0x00;
   1408		packet->data[2] = 0x08;
   1409		packet->data[3] = 0x40 + command;
   1410		packet->data[4] = 0x00;
   1411		packet->data[5] = 0x00;
   1412		packet->data[6] = 0x00;
   1413		packet->data[7] = 0x00;
   1414		packet->data[8] = 0x00;
   1415		packet->data[9] = 0x00;
   1416		packet->data[10] = 0x00;
   1417		packet->data[11] = 0x00;
   1418		packet->len = 12;
   1419		packet->pending = true;
   1420		break;
   1421	}
   1422
   1423	xpad_try_sending_next_out_packet(xpad);
   1424
   1425	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1426}
   1427
   1428/*
   1429 * Light up the segment corresponding to the pad number on
   1430 * Xbox 360 Controllers.
   1431 */
   1432static void xpad_identify_controller(struct usb_xpad *xpad)
   1433{
   1434	led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
   1435}
   1436
   1437static void xpad_led_set(struct led_classdev *led_cdev,
   1438			 enum led_brightness value)
   1439{
   1440	struct xpad_led *xpad_led = container_of(led_cdev,
   1441						 struct xpad_led, led_cdev);
   1442
   1443	xpad_send_led_command(xpad_led->xpad, value);
   1444}
   1445
   1446static int xpad_led_probe(struct usb_xpad *xpad)
   1447{
   1448	struct xpad_led *led;
   1449	struct led_classdev *led_cdev;
   1450	int error;
   1451
   1452	if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W)
   1453		return 0;
   1454
   1455	xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
   1456	if (!led)
   1457		return -ENOMEM;
   1458
   1459	xpad->pad_nr = ida_simple_get(&xpad_pad_seq, 0, 0, GFP_KERNEL);
   1460	if (xpad->pad_nr < 0) {
   1461		error = xpad->pad_nr;
   1462		goto err_free_mem;
   1463	}
   1464
   1465	snprintf(led->name, sizeof(led->name), "xpad%d", xpad->pad_nr);
   1466	led->xpad = xpad;
   1467
   1468	led_cdev = &led->led_cdev;
   1469	led_cdev->name = led->name;
   1470	led_cdev->brightness_set = xpad_led_set;
   1471	led_cdev->flags = LED_CORE_SUSPENDRESUME;
   1472
   1473	error = led_classdev_register(&xpad->udev->dev, led_cdev);
   1474	if (error)
   1475		goto err_free_id;
   1476
   1477	xpad_identify_controller(xpad);
   1478
   1479	return 0;
   1480
   1481err_free_id:
   1482	ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
   1483err_free_mem:
   1484	kfree(led);
   1485	xpad->led = NULL;
   1486	return error;
   1487}
   1488
   1489static void xpad_led_disconnect(struct usb_xpad *xpad)
   1490{
   1491	struct xpad_led *xpad_led = xpad->led;
   1492
   1493	if (xpad_led) {
   1494		led_classdev_unregister(&xpad_led->led_cdev);
   1495		ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
   1496		kfree(xpad_led);
   1497	}
   1498}
   1499#else
   1500static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
   1501static void xpad_led_disconnect(struct usb_xpad *xpad) { }
   1502#endif
   1503
   1504static int xpad_start_input(struct usb_xpad *xpad)
   1505{
   1506	int error;
   1507
   1508	if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
   1509		return -EIO;
   1510
   1511	if (xpad->xtype == XTYPE_XBOXONE) {
   1512		error = xpad_start_xbox_one(xpad);
   1513		if (error) {
   1514			usb_kill_urb(xpad->irq_in);
   1515			return error;
   1516		}
   1517	}
   1518
   1519	return 0;
   1520}
   1521
   1522static void xpad_stop_input(struct usb_xpad *xpad)
   1523{
   1524	usb_kill_urb(xpad->irq_in);
   1525}
   1526
   1527static void xpad360w_poweroff_controller(struct usb_xpad *xpad)
   1528{
   1529	unsigned long flags;
   1530	struct xpad_output_packet *packet =
   1531			&xpad->out_packets[XPAD_OUT_CMD_IDX];
   1532
   1533	spin_lock_irqsave(&xpad->odata_lock, flags);
   1534
   1535	packet->data[0] = 0x00;
   1536	packet->data[1] = 0x00;
   1537	packet->data[2] = 0x08;
   1538	packet->data[3] = 0xC0;
   1539	packet->data[4] = 0x00;
   1540	packet->data[5] = 0x00;
   1541	packet->data[6] = 0x00;
   1542	packet->data[7] = 0x00;
   1543	packet->data[8] = 0x00;
   1544	packet->data[9] = 0x00;
   1545	packet->data[10] = 0x00;
   1546	packet->data[11] = 0x00;
   1547	packet->len = 12;
   1548	packet->pending = true;
   1549
   1550	/* Reset the sequence so we send out poweroff now */
   1551	xpad->last_out_packet = -1;
   1552	xpad_try_sending_next_out_packet(xpad);
   1553
   1554	spin_unlock_irqrestore(&xpad->odata_lock, flags);
   1555}
   1556
   1557static int xpad360w_start_input(struct usb_xpad *xpad)
   1558{
   1559	int error;
   1560
   1561	error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
   1562	if (error)
   1563		return -EIO;
   1564
   1565	/*
   1566	 * Send presence packet.
   1567	 * This will force the controller to resend connection packets.
   1568	 * This is useful in the case we activate the module after the
   1569	 * adapter has been plugged in, as it won't automatically
   1570	 * send us info about the controllers.
   1571	 */
   1572	error = xpad_inquiry_pad_presence(xpad);
   1573	if (error) {
   1574		usb_kill_urb(xpad->irq_in);
   1575		return error;
   1576	}
   1577
   1578	return 0;
   1579}
   1580
   1581static void xpad360w_stop_input(struct usb_xpad *xpad)
   1582{
   1583	usb_kill_urb(xpad->irq_in);
   1584
   1585	/* Make sure we are done with presence work if it was scheduled */
   1586	flush_work(&xpad->work);
   1587}
   1588
   1589static int xpad_open(struct input_dev *dev)
   1590{
   1591	struct usb_xpad *xpad = input_get_drvdata(dev);
   1592
   1593	return xpad_start_input(xpad);
   1594}
   1595
   1596static void xpad_close(struct input_dev *dev)
   1597{
   1598	struct usb_xpad *xpad = input_get_drvdata(dev);
   1599
   1600	xpad_stop_input(xpad);
   1601}
   1602
   1603static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs)
   1604{
   1605	struct usb_xpad *xpad = input_get_drvdata(input_dev);
   1606
   1607	switch (abs) {
   1608	case ABS_X:
   1609	case ABS_Y:
   1610	case ABS_RX:
   1611	case ABS_RY:	/* the two sticks */
   1612		input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128);
   1613		break;
   1614	case ABS_Z:
   1615	case ABS_RZ:	/* the triggers (if mapped to axes) */
   1616		if (xpad->xtype == XTYPE_XBOXONE)
   1617			input_set_abs_params(input_dev, abs, 0, 1023, 0, 0);
   1618		else
   1619			input_set_abs_params(input_dev, abs, 0, 255, 0, 0);
   1620		break;
   1621	case ABS_HAT0X:
   1622	case ABS_HAT0Y:	/* the d-pad (only if dpad is mapped to axes */
   1623		input_set_abs_params(input_dev, abs, -1, 1, 0, 0);
   1624		break;
   1625	default:
   1626		input_set_abs_params(input_dev, abs, 0, 0, 0, 0);
   1627		break;
   1628	}
   1629}
   1630
   1631static void xpad_deinit_input(struct usb_xpad *xpad)
   1632{
   1633	if (xpad->input_created) {
   1634		xpad->input_created = false;
   1635		xpad_led_disconnect(xpad);
   1636		input_unregister_device(xpad->dev);
   1637	}
   1638}
   1639
   1640static int xpad_init_input(struct usb_xpad *xpad)
   1641{
   1642	struct input_dev *input_dev;
   1643	int i, error;
   1644
   1645	input_dev = input_allocate_device();
   1646	if (!input_dev)
   1647		return -ENOMEM;
   1648
   1649	xpad->dev = input_dev;
   1650	input_dev->name = xpad->name;
   1651	input_dev->phys = xpad->phys;
   1652	usb_to_input_id(xpad->udev, &input_dev->id);
   1653
   1654	if (xpad->xtype == XTYPE_XBOX360W) {
   1655		/* x360w controllers and the receiver have different ids */
   1656		input_dev->id.product = 0x02a1;
   1657	}
   1658
   1659	input_dev->dev.parent = &xpad->intf->dev;
   1660
   1661	input_set_drvdata(input_dev, xpad);
   1662
   1663	if (xpad->xtype != XTYPE_XBOX360W) {
   1664		input_dev->open = xpad_open;
   1665		input_dev->close = xpad_close;
   1666	}
   1667
   1668	if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
   1669		/* set up axes */
   1670		for (i = 0; xpad_abs[i] >= 0; i++)
   1671			xpad_set_up_abs(input_dev, xpad_abs[i]);
   1672	}
   1673
   1674	/* set up standard buttons */
   1675	for (i = 0; xpad_common_btn[i] >= 0; i++)
   1676		input_set_capability(input_dev, EV_KEY, xpad_common_btn[i]);
   1677
   1678	/* set up model-specific ones */
   1679	if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W ||
   1680	    xpad->xtype == XTYPE_XBOXONE) {
   1681		for (i = 0; xpad360_btn[i] >= 0; i++)
   1682			input_set_capability(input_dev, EV_KEY, xpad360_btn[i]);
   1683		if (xpad->mapping & MAP_SELECT_BUTTON)
   1684			input_set_capability(input_dev, EV_KEY, KEY_RECORD);
   1685	} else {
   1686		for (i = 0; xpad_btn[i] >= 0; i++)
   1687			input_set_capability(input_dev, EV_KEY, xpad_btn[i]);
   1688	}
   1689
   1690	if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
   1691		for (i = 0; xpad_btn_pad[i] >= 0; i++)
   1692			input_set_capability(input_dev, EV_KEY,
   1693					     xpad_btn_pad[i]);
   1694	}
   1695
   1696	/*
   1697	 * This should be a simple else block. However historically
   1698	 * xbox360w has mapped DPAD to buttons while xbox360 did not. This
   1699	 * made no sense, but now we can not just switch back and have to
   1700	 * support both behaviors.
   1701	 */
   1702	if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
   1703	    xpad->xtype == XTYPE_XBOX360W) {
   1704		for (i = 0; xpad_abs_pad[i] >= 0; i++)
   1705			xpad_set_up_abs(input_dev, xpad_abs_pad[i]);
   1706	}
   1707
   1708	if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
   1709		for (i = 0; xpad_btn_triggers[i] >= 0; i++)
   1710			input_set_capability(input_dev, EV_KEY,
   1711					     xpad_btn_triggers[i]);
   1712	} else {
   1713		for (i = 0; xpad_abs_triggers[i] >= 0; i++)
   1714			xpad_set_up_abs(input_dev, xpad_abs_triggers[i]);
   1715	}
   1716
   1717	error = xpad_init_ff(xpad);
   1718	if (error)
   1719		goto err_free_input;
   1720
   1721	error = xpad_led_probe(xpad);
   1722	if (error)
   1723		goto err_destroy_ff;
   1724
   1725	error = input_register_device(xpad->dev);
   1726	if (error)
   1727		goto err_disconnect_led;
   1728
   1729	xpad->input_created = true;
   1730	return 0;
   1731
   1732err_disconnect_led:
   1733	xpad_led_disconnect(xpad);
   1734err_destroy_ff:
   1735	input_ff_destroy(input_dev);
   1736err_free_input:
   1737	input_free_device(input_dev);
   1738	return error;
   1739}
   1740
   1741static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)
   1742{
   1743	struct usb_device *udev = interface_to_usbdev(intf);
   1744	struct usb_xpad *xpad;
   1745	struct usb_endpoint_descriptor *ep_irq_in, *ep_irq_out;
   1746	int i, error;
   1747
   1748	if (intf->cur_altsetting->desc.bNumEndpoints != 2)
   1749		return -ENODEV;
   1750
   1751	for (i = 0; xpad_device[i].idVendor; i++) {
   1752		if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) &&
   1753		    (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct))
   1754			break;
   1755	}
   1756
   1757	xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
   1758	if (!xpad)
   1759		return -ENOMEM;
   1760
   1761	usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
   1762	strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
   1763
   1764	xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
   1765					 GFP_KERNEL, &xpad->idata_dma);
   1766	if (!xpad->idata) {
   1767		error = -ENOMEM;
   1768		goto err_free_mem;
   1769	}
   1770
   1771	xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
   1772	if (!xpad->irq_in) {
   1773		error = -ENOMEM;
   1774		goto err_free_idata;
   1775	}
   1776
   1777	xpad->udev = udev;
   1778	xpad->intf = intf;
   1779	xpad->mapping = xpad_device[i].mapping;
   1780	xpad->xtype = xpad_device[i].xtype;
   1781	xpad->name = xpad_device[i].name;
   1782	INIT_WORK(&xpad->work, xpad_presence_work);
   1783
   1784	if (xpad->xtype == XTYPE_UNKNOWN) {
   1785		if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
   1786			if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
   1787				xpad->xtype = XTYPE_XBOX360W;
   1788			else if (intf->cur_altsetting->desc.bInterfaceProtocol == 208)
   1789				xpad->xtype = XTYPE_XBOXONE;
   1790			else
   1791				xpad->xtype = XTYPE_XBOX360;
   1792		} else {
   1793			xpad->xtype = XTYPE_XBOX;
   1794		}
   1795
   1796		if (dpad_to_buttons)
   1797			xpad->mapping |= MAP_DPAD_TO_BUTTONS;
   1798		if (triggers_to_buttons)
   1799			xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS;
   1800		if (sticks_to_null)
   1801			xpad->mapping |= MAP_STICKS_TO_NULL;
   1802	}
   1803
   1804	if (xpad->xtype == XTYPE_XBOXONE &&
   1805	    intf->cur_altsetting->desc.bInterfaceNumber != 0) {
   1806		/*
   1807		 * The Xbox One controller lists three interfaces all with the
   1808		 * same interface class, subclass and protocol. Differentiate by
   1809		 * interface number.
   1810		 */
   1811		error = -ENODEV;
   1812		goto err_free_in_urb;
   1813	}
   1814
   1815	ep_irq_in = ep_irq_out = NULL;
   1816
   1817	for (i = 0; i < 2; i++) {
   1818		struct usb_endpoint_descriptor *ep =
   1819				&intf->cur_altsetting->endpoint[i].desc;
   1820
   1821		if (usb_endpoint_xfer_int(ep)) {
   1822			if (usb_endpoint_dir_in(ep))
   1823				ep_irq_in = ep;
   1824			else
   1825				ep_irq_out = ep;
   1826		}
   1827	}
   1828
   1829	if (!ep_irq_in || !ep_irq_out) {
   1830		error = -ENODEV;
   1831		goto err_free_in_urb;
   1832	}
   1833
   1834	error = xpad_init_output(intf, xpad, ep_irq_out);
   1835	if (error)
   1836		goto err_free_in_urb;
   1837
   1838	usb_fill_int_urb(xpad->irq_in, udev,
   1839			 usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
   1840			 xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
   1841			 xpad, ep_irq_in->bInterval);
   1842	xpad->irq_in->transfer_dma = xpad->idata_dma;
   1843	xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
   1844
   1845	usb_set_intfdata(intf, xpad);
   1846
   1847	if (xpad->xtype == XTYPE_XBOX360W) {
   1848		/*
   1849		 * Submit the int URB immediately rather than waiting for open
   1850		 * because we get status messages from the device whether
   1851		 * or not any controllers are attached.  In fact, it's
   1852		 * exactly the message that a controller has arrived that
   1853		 * we're waiting for.
   1854		 */
   1855		error = xpad360w_start_input(xpad);
   1856		if (error)
   1857			goto err_deinit_output;
   1858		/*
   1859		 * Wireless controllers require RESET_RESUME to work properly
   1860		 * after suspend. Ideally this quirk should be in usb core
   1861		 * quirk list, but we have too many vendors producing these
   1862		 * controllers and we'd need to maintain 2 identical lists
   1863		 * here in this driver and in usb core.
   1864		 */
   1865		udev->quirks |= USB_QUIRK_RESET_RESUME;
   1866	} else {
   1867		error = xpad_init_input(xpad);
   1868		if (error)
   1869			goto err_deinit_output;
   1870	}
   1871	return 0;
   1872
   1873err_deinit_output:
   1874	xpad_deinit_output(xpad);
   1875err_free_in_urb:
   1876	usb_free_urb(xpad->irq_in);
   1877err_free_idata:
   1878	usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
   1879err_free_mem:
   1880	kfree(xpad);
   1881	return error;
   1882}
   1883
   1884static void xpad_disconnect(struct usb_interface *intf)
   1885{
   1886	struct usb_xpad *xpad = usb_get_intfdata(intf);
   1887
   1888	if (xpad->xtype == XTYPE_XBOX360W)
   1889		xpad360w_stop_input(xpad);
   1890
   1891	xpad_deinit_input(xpad);
   1892
   1893	/*
   1894	 * Now that both input device and LED device are gone we can
   1895	 * stop output URB.
   1896	 */
   1897	xpad_stop_output(xpad);
   1898
   1899	xpad_deinit_output(xpad);
   1900
   1901	usb_free_urb(xpad->irq_in);
   1902	usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
   1903			xpad->idata, xpad->idata_dma);
   1904
   1905	kfree(xpad);
   1906
   1907	usb_set_intfdata(intf, NULL);
   1908}
   1909
   1910static int xpad_suspend(struct usb_interface *intf, pm_message_t message)
   1911{
   1912	struct usb_xpad *xpad = usb_get_intfdata(intf);
   1913	struct input_dev *input = xpad->dev;
   1914
   1915	if (xpad->xtype == XTYPE_XBOX360W) {
   1916		/*
   1917		 * Wireless controllers always listen to input so
   1918		 * they are notified when controller shows up
   1919		 * or goes away.
   1920		 */
   1921		xpad360w_stop_input(xpad);
   1922
   1923		/*
   1924		 * The wireless adapter is going off now, so the
   1925		 * gamepads are going to become disconnected.
   1926		 * Unless explicitly disabled, power them down
   1927		 * so they don't just sit there flashing.
   1928		 */
   1929		if (auto_poweroff && xpad->pad_present)
   1930			xpad360w_poweroff_controller(xpad);
   1931	} else {
   1932		mutex_lock(&input->mutex);
   1933		if (input_device_enabled(input))
   1934			xpad_stop_input(xpad);
   1935		mutex_unlock(&input->mutex);
   1936	}
   1937
   1938	xpad_stop_output(xpad);
   1939
   1940	return 0;
   1941}
   1942
   1943static int xpad_resume(struct usb_interface *intf)
   1944{
   1945	struct usb_xpad *xpad = usb_get_intfdata(intf);
   1946	struct input_dev *input = xpad->dev;
   1947	int retval = 0;
   1948
   1949	if (xpad->xtype == XTYPE_XBOX360W) {
   1950		retval = xpad360w_start_input(xpad);
   1951	} else {
   1952		mutex_lock(&input->mutex);
   1953		if (input_device_enabled(input)) {
   1954			retval = xpad_start_input(xpad);
   1955		} else if (xpad->xtype == XTYPE_XBOXONE) {
   1956			/*
   1957			 * Even if there are no users, we'll send Xbox One pads
   1958			 * the startup sequence so they don't sit there and
   1959			 * blink until somebody opens the input device again.
   1960			 */
   1961			retval = xpad_start_xbox_one(xpad);
   1962		}
   1963		mutex_unlock(&input->mutex);
   1964	}
   1965
   1966	return retval;
   1967}
   1968
   1969static struct usb_driver xpad_driver = {
   1970	.name		= "xpad",
   1971	.probe		= xpad_probe,
   1972	.disconnect	= xpad_disconnect,
   1973	.suspend	= xpad_suspend,
   1974	.resume		= xpad_resume,
   1975	.reset_resume	= xpad_resume,
   1976	.id_table	= xpad_table,
   1977};
   1978
   1979module_usb_driver(xpad_driver);
   1980
   1981MODULE_AUTHOR("Marko Friedemann <mfr@bmx-chemnitz.de>");
   1982MODULE_DESCRIPTION("X-Box pad driver");
   1983MODULE_LICENSE("GPL");