|
@@ -1437,16 +1437,6 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (xpad_device[i].xtype == XTYPE_XBOXONE &&
|
|
|
- intf->cur_altsetting->desc.bInterfaceNumber != 0) {
|
|
|
- /*
|
|
|
- * The Xbox One controller lists three interfaces all with the
|
|
|
- * same interface class, subclass and protocol. Differentiate by
|
|
|
- * interface number.
|
|
|
- */
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
|
|
|
if (!xpad)
|
|
|
return -ENOMEM;
|
|
@@ -1478,6 +1468,8 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|
|
if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
|
|
|
if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
|
|
|
xpad->xtype = XTYPE_XBOX360W;
|
|
|
+ else if (intf->cur_altsetting->desc.bInterfaceProtocol == 208)
|
|
|
+ xpad->xtype = XTYPE_XBOXONE;
|
|
|
else
|
|
|
xpad->xtype = XTYPE_XBOX360;
|
|
|
} else {
|
|
@@ -1492,6 +1484,17 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|
|
xpad->mapping |= MAP_STICKS_TO_NULL;
|
|
|
}
|
|
|
|
|
|
+ if (xpad->xtype == XTYPE_XBOXONE &&
|
|
|
+ intf->cur_altsetting->desc.bInterfaceNumber != 0) {
|
|
|
+ /*
|
|
|
+ * The Xbox One controller lists three interfaces all with the
|
|
|
+ * same interface class, subclass and protocol. Differentiate by
|
|
|
+ * interface number.
|
|
|
+ */
|
|
|
+ error = -ENODEV;
|
|
|
+ goto err_free_in_urb;
|
|
|
+ }
|
|
|
+
|
|
|
error = xpad_init_output(intf, xpad);
|
|
|
if (error)
|
|
|
goto err_free_in_urb;
|