xpad.c (404c3bc30cb1361e1b3533643326ab472d24a618) xpad.c (3ffb62cb9ac2430c2504c6ff9727d0f2476ef0bd)
1/*
2 * X-Box gamepad driver
3 *
4 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de>
5 * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>,
6 * Steven Toth <steve@toth.demon.co.uk>,
7 * Franz Lehner <franz@caos.at>,
8 * Ivan Hawkes <blackhawk@ivanhawkes.com>

--- 224 unchanged lines hidden (view full) ---

233 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
234 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
235
236static struct usb_device_id xpad_table [] = {
237 { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */
238 XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */
239 XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */
240 XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */
1/*
2 * X-Box gamepad driver
3 *
4 * Copyright (c) 2002 Marko Friedemann <mfr@bmx-chemnitz.de>
5 * 2004 Oliver Schwartz <Oliver.Schwartz@gmx.de>,
6 * Steven Toth <steve@toth.demon.co.uk>,
7 * Franz Lehner <franz@caos.at>,
8 * Ivan Hawkes <blackhawk@ivanhawkes.com>

--- 224 unchanged lines hidden (view full) ---

233 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \
234 { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) }
235
236static struct usb_device_id xpad_table [] = {
237 { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */
238 XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */
239 XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */
240 XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */
241 { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */
241 XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */
242 XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */
243 XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */
244 XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */
245 XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
246 XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
247 { }
248};
249
250MODULE_DEVICE_TABLE (usb, xpad_table);
251
252struct usb_xpad {
253 struct input_dev *dev; /* input device interface */
254 struct usb_device *udev; /* usb device */
242 XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */
243 XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */
244 XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */
245 XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */
246 XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
247 XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
248 { }
249};
250
251MODULE_DEVICE_TABLE (usb, xpad_table);
252
253struct usb_xpad {
254 struct input_dev *dev; /* input device interface */
255 struct usb_device *udev; /* usb device */
255 struct usb_interface *intf; /* usb interface */
256
257 int pad_present;
258
259 struct urb *irq_in; /* urb for interrupt in report */
260 unsigned char *idata; /* input data */
261 dma_addr_t idata_dma;
262
263 struct urb *bulk_out;

--- 189 unchanged lines hidden (view full) ---

453 return;
454
455 xpad360_process_packet(xpad, cmd, &data[4]);
456}
457
458static void xpad_irq_in(struct urb *urb)
459{
460 struct usb_xpad *xpad = urb->context;
256
257 int pad_present;
258
259 struct urb *irq_in; /* urb for interrupt in report */
260 unsigned char *idata; /* input data */
261 dma_addr_t idata_dma;
262
263 struct urb *bulk_out;

--- 189 unchanged lines hidden (view full) ---

453 return;
454
455 xpad360_process_packet(xpad, cmd, &data[4]);
456}
457
458static void xpad_irq_in(struct urb *urb)
459{
460 struct usb_xpad *xpad = urb->context;
461 struct device *dev = &xpad->intf->dev;
462 int retval, status;
463
464 status = urb->status;
465
466 switch (status) {
467 case 0:
468 /* success */
469 break;
470 case -ECONNRESET:
471 case -ENOENT:
472 case -ESHUTDOWN:
473 /* this urb is terminated, clean up */
461 int retval, status;
462
463 status = urb->status;
464
465 switch (status) {
466 case 0:
467 /* success */
468 break;
469 case -ECONNRESET:
470 case -ENOENT:
471 case -ESHUTDOWN:
472 /* this urb is terminated, clean up */
474 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
473 dbg("%s - urb shutting down with status: %d",
475 __func__, status);
476 return;
477 default:
474 __func__, status);
475 return;
476 default:
478 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
477 dbg("%s - nonzero urb status received: %d",
479 __func__, status);
480 goto exit;
481 }
482
483 switch (xpad->xtype) {
484 case XTYPE_XBOX360:
485 xpad360_process_packet(xpad, 0, xpad->idata);
486 break;
487 case XTYPE_XBOX360W:
488 xpad360w_process_packet(xpad, 0, xpad->idata);
489 break;
490 default:
491 xpad_process_packet(xpad, 0, xpad->idata);
492 }
493
494exit:
495 retval = usb_submit_urb(urb, GFP_ATOMIC);
496 if (retval)
478 __func__, status);
479 goto exit;
480 }
481
482 switch (xpad->xtype) {
483 case XTYPE_XBOX360:
484 xpad360_process_packet(xpad, 0, xpad->idata);
485 break;
486 case XTYPE_XBOX360W:
487 xpad360w_process_packet(xpad, 0, xpad->idata);
488 break;
489 default:
490 xpad_process_packet(xpad, 0, xpad->idata);
491 }
492
493exit:
494 retval = usb_submit_urb(urb, GFP_ATOMIC);
495 if (retval)
497 dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
498 __func__, retval);
496 err ("%s - usb_submit_urb failed with result %d",
497 __func__, retval);
499}
500
501static void xpad_bulk_out(struct urb *urb)
502{
498}
499
500static void xpad_bulk_out(struct urb *urb)
501{
503 struct usb_xpad *xpad = urb->context;
504 struct device *dev = &xpad->intf->dev;
505
506 switch (urb->status) {
507 case 0:
508 /* success */
509 break;
510 case -ECONNRESET:
511 case -ENOENT:
512 case -ESHUTDOWN:
513 /* this urb is terminated, clean up */
502 switch (urb->status) {
503 case 0:
504 /* success */
505 break;
506 case -ECONNRESET:
507 case -ENOENT:
508 case -ESHUTDOWN:
509 /* this urb is terminated, clean up */
514 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
515 __func__, urb->status);
510 dbg("%s - urb shutting down with status: %d", __func__, urb->status);
516 break;
517 default:
511 break;
512 default:
518 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
519 __func__, urb->status);
513 dbg("%s - nonzero urb status received: %d", __func__, urb->status);
520 }
521}
522
523#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
524static void xpad_irq_out(struct urb *urb)
525{
514 }
515}
516
517#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS)
518static void xpad_irq_out(struct urb *urb)
519{
526 struct usb_xpad *xpad = urb->context;
527 struct device *dev = &xpad->intf->dev;
528 int retval, status;
529
530 status = urb->status;
531
532 switch (status) {
533 case 0:
534 /* success */
535 return;
536
537 case -ECONNRESET:
538 case -ENOENT:
539 case -ESHUTDOWN:
540 /* this urb is terminated, clean up */
520 int retval, status;
521
522 status = urb->status;
523
524 switch (status) {
525 case 0:
526 /* success */
527 return;
528
529 case -ECONNRESET:
530 case -ENOENT:
531 case -ESHUTDOWN:
532 /* this urb is terminated, clean up */
541 dev_dbg(dev, "%s - urb shutting down with status: %d\n",
542 __func__, status);
533 dbg("%s - urb shutting down with status: %d", __func__, status);
543 return;
544
545 default:
534 return;
535
536 default:
546 dev_dbg(dev, "%s - nonzero urb status received: %d\n",
547 __func__, status);
537 dbg("%s - nonzero urb status received: %d", __func__, status);
548 goto exit;
549 }
550
551exit:
552 retval = usb_submit_urb(urb, GFP_ATOMIC);
553 if (retval)
538 goto exit;
539 }
540
541exit:
542 retval = usb_submit_urb(urb, GFP_ATOMIC);
543 if (retval)
554 dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
555 __func__, retval);
544 err("%s - usb_submit_urb failed with result %d",
545 __func__, retval);
556}
557
558static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
559{
560 struct usb_endpoint_descriptor *ep_irq_out;
561 int error;
562
563 if (xpad->xtype == XTYPE_UNKNOWN)

--- 96 unchanged lines hidden (view full) ---

660 xpad->odata[9] = 0x00;
661 xpad->odata[10] = 0x00;
662 xpad->odata[11] = 0x00;
663 xpad->irq_out->transfer_buffer_length = 12;
664
665 return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
666
667 default:
546}
547
548static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
549{
550 struct usb_endpoint_descriptor *ep_irq_out;
551 int error;
552
553 if (xpad->xtype == XTYPE_UNKNOWN)

--- 96 unchanged lines hidden (view full) ---

650 xpad->odata[9] = 0x00;
651 xpad->odata[10] = 0x00;
652 xpad->odata[11] = 0x00;
653 xpad->irq_out->transfer_buffer_length = 12;
654
655 return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
656
657 default:
668 dev_dbg(&xpad->dev->dev,
669 "%s - rumble command sent to unsupported xpad type: %d\n",
658 dbg("%s - rumble command sent to unsupported xpad type: %d",
670 __func__, xpad->xtype);
671 return -1;
672 }
673 }
674
675 return 0;
676}
677

--- 173 unchanged lines hidden (view full) ---

851
852 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
853 if (!xpad->irq_in) {
854 error = -ENOMEM;
855 goto fail2;
856 }
857
858 xpad->udev = udev;
659 __func__, xpad->xtype);
660 return -1;
661 }
662 }
663
664 return 0;
665}
666

--- 173 unchanged lines hidden (view full) ---

840
841 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
842 if (!xpad->irq_in) {
843 error = -ENOMEM;
844 goto fail2;
845 }
846
847 xpad->udev = udev;
859 xpad->intf = intf;
860 xpad->mapping = xpad_device[i].mapping;
861 xpad->xtype = xpad_device[i].xtype;
862
863 if (xpad->xtype == XTYPE_UNKNOWN) {
864 if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
865 if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
866 xpad->xtype = XTYPE_XBOX360W;
867 else

--- 194 unchanged lines hidden ---
848 xpad->mapping = xpad_device[i].mapping;
849 xpad->xtype = xpad_device[i].xtype;
850
851 if (xpad->xtype == XTYPE_UNKNOWN) {
852 if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
853 if (intf->cur_altsetting->desc.bInterfaceProtocol == 129)
854 xpad->xtype = XTYPE_XBOX360W;
855 else

--- 194 unchanged lines hidden ---