iforce-usb.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2000-2002 Vojtech Pavlik <vojtech@ucw.cz>
  4. * Copyright (c) 2001-2002, 2007 Johann Deneux <johann.deneux@gmail.com>
  5. *
  6. * USB/RS232 I-Force joysticks and wheels.
  7. */
  8. #include <linux/usb.h>
  9. #include "iforce.h"
  10. struct iforce_usb {
  11. struct iforce iforce;
  12. struct usb_device *usbdev;
  13. struct usb_interface *intf;
  14. struct urb *irq, *out;
  15. u8 data_in[IFORCE_MAX_LENGTH] ____cacheline_aligned;
  16. u8 data_out[IFORCE_MAX_LENGTH] ____cacheline_aligned;
  17. };
  18. static void __iforce_usb_xmit(struct iforce *iforce)
  19. {
  20. struct iforce_usb *iforce_usb = container_of(iforce, struct iforce_usb,
  21. iforce);
  22. int n, c;
  23. unsigned long flags;
  24. spin_lock_irqsave(&iforce->xmit_lock, flags);
  25. if (iforce->xmit.head == iforce->xmit.tail) {
  26. iforce_clear_xmit_and_wake(iforce);
  27. spin_unlock_irqrestore(&iforce->xmit_lock, flags);
  28. return;
  29. }
  30. ((char *)iforce_usb->out->transfer_buffer)[0] = iforce->xmit.buf[iforce->xmit.tail];
  31. XMIT_INC(iforce->xmit.tail, 1);
  32. n = iforce->xmit.buf[iforce->xmit.tail];
  33. XMIT_INC(iforce->xmit.tail, 1);
  34. iforce_usb->out->transfer_buffer_length = n + 1;
  35. iforce_usb->out->dev = iforce_usb->usbdev;
  36. /* Copy rest of data then */
  37. c = CIRC_CNT_TO_END(iforce->xmit.head, iforce->xmit.tail, XMIT_SIZE);
  38. if (n < c) c=n;
  39. memcpy(iforce_usb->out->transfer_buffer + 1,
  40. &iforce->xmit.buf[iforce->xmit.tail],
  41. c);
  42. if (n != c) {
  43. memcpy(iforce_usb->out->transfer_buffer + 1 + c,
  44. &iforce->xmit.buf[0],
  45. n-c);
  46. }
  47. XMIT_INC(iforce->xmit.tail, n);
  48. if ( (n=usb_submit_urb(iforce_usb->out, GFP_ATOMIC)) ) {
  49. dev_warn(&iforce_usb->intf->dev,
  50. "usb_submit_urb failed %d\n", n);
  51. iforce_clear_xmit_and_wake(iforce);
  52. }
  53. /* The IFORCE_XMIT_RUNNING bit is not cleared here. That's intended.
  54. * As long as the urb completion handler is not called, the transmiting
  55. * is considered to be running */
  56. spin_unlock_irqrestore(&iforce->xmit_lock, flags);
  57. }
  58. static void iforce_usb_xmit(struct iforce *iforce)
  59. {
  60. if (!test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags))
  61. __iforce_usb_xmit(iforce);
  62. }
  63. static int iforce_usb_get_id(struct iforce *iforce, u8 id,
  64. u8 *response_data, size_t *response_len)
  65. {
  66. struct iforce_usb *iforce_usb = container_of(iforce, struct iforce_usb,
  67. iforce);
  68. u8 *buf;
  69. int status;
  70. buf = kmalloc(IFORCE_MAX_LENGTH, GFP_KERNEL);
  71. if (!buf)
  72. return -ENOMEM;
  73. status = usb_control_msg(iforce_usb->usbdev,
  74. usb_rcvctrlpipe(iforce_usb->usbdev, 0),
  75. id,
  76. USB_TYPE_VENDOR | USB_DIR_IN |
  77. USB_RECIP_INTERFACE,
  78. 0, 0, buf, IFORCE_MAX_LENGTH, 1000);
  79. if (status < 0) {
  80. dev_err(&iforce_usb->intf->dev,
  81. "usb_submit_urb failed: %d\n", status);
  82. } else if (buf[0] != id) {
  83. status = -EIO;
  84. } else {
  85. memcpy(response_data, buf, status);
  86. *response_len = status;
  87. status = 0;
  88. }
  89. kfree(buf);
  90. return status;
  91. }
  92. static int iforce_usb_start_io(struct iforce *iforce)
  93. {
  94. struct iforce_usb *iforce_usb = container_of(iforce, struct iforce_usb,
  95. iforce);
  96. if (usb_submit_urb(iforce_usb->irq, GFP_KERNEL))
  97. return -EIO;
  98. return 0;
  99. }
  100. static void iforce_usb_stop_io(struct iforce *iforce)
  101. {
  102. struct iforce_usb *iforce_usb = container_of(iforce, struct iforce_usb,
  103. iforce);
  104. usb_kill_urb(iforce_usb->irq);
  105. usb_kill_urb(iforce_usb->out);
  106. }
  107. static const struct iforce_xport_ops iforce_usb_xport_ops = {
  108. .xmit = iforce_usb_xmit,
  109. .get_id = iforce_usb_get_id,
  110. .start_io = iforce_usb_start_io,
  111. .stop_io = iforce_usb_stop_io,
  112. };
  113. static void iforce_usb_irq(struct urb *urb)
  114. {
  115. struct iforce_usb *iforce_usb = urb->context;
  116. struct iforce *iforce = &iforce_usb->iforce;
  117. struct device *dev = &iforce_usb->intf->dev;
  118. int status;
  119. switch (urb->status) {
  120. case 0:
  121. /* success */
  122. break;
  123. case -ECONNRESET:
  124. case -ENOENT:
  125. case -ESHUTDOWN:
  126. /* this urb is terminated, clean up */
  127. dev_dbg(dev, "%s - urb shutting down with status: %d\n",
  128. __func__, urb->status);
  129. return;
  130. default:
  131. dev_dbg(dev, "%s - urb has status of: %d\n",
  132. __func__, urb->status);
  133. goto exit;
  134. }
  135. iforce_process_packet(iforce, iforce_usb->data_in[0],
  136. iforce_usb->data_in + 1, urb->actual_length - 1);
  137. exit:
  138. status = usb_submit_urb(urb, GFP_ATOMIC);
  139. if (status)
  140. dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
  141. __func__, status);
  142. }
  143. static void iforce_usb_out(struct urb *urb)
  144. {
  145. struct iforce_usb *iforce_usb = urb->context;
  146. struct iforce *iforce = &iforce_usb->iforce;
  147. if (urb->status) {
  148. dev_dbg(&iforce_usb->intf->dev, "urb->status %d, exiting\n",
  149. urb->status);
  150. iforce_clear_xmit_and_wake(iforce);
  151. return;
  152. }
  153. __iforce_usb_xmit(iforce);
  154. wake_up_all(&iforce->wait);
  155. }
  156. static int iforce_usb_probe(struct usb_interface *intf,
  157. const struct usb_device_id *id)
  158. {
  159. struct usb_device *dev = interface_to_usbdev(intf);
  160. struct usb_host_interface *interface;
  161. struct usb_endpoint_descriptor *epirq, *epout;
  162. struct iforce_usb *iforce_usb;
  163. int err = -ENOMEM;
  164. interface = intf->cur_altsetting;
  165. if (interface->desc.bNumEndpoints < 2)
  166. return -ENODEV;
  167. epirq = &interface->endpoint[0].desc;
  168. if (!usb_endpoint_is_int_in(epirq))
  169. return -ENODEV;
  170. epout = &interface->endpoint[1].desc;
  171. if (!usb_endpoint_is_int_out(epout))
  172. return -ENODEV;
  173. iforce_usb = kzalloc(sizeof(*iforce_usb), GFP_KERNEL);
  174. if (!iforce_usb)
  175. goto fail;
  176. iforce_usb->irq = usb_alloc_urb(0, GFP_KERNEL);
  177. if (!iforce_usb->irq)
  178. goto fail;
  179. iforce_usb->out = usb_alloc_urb(0, GFP_KERNEL);
  180. if (!iforce_usb->out)
  181. goto fail;
  182. iforce_usb->iforce.xport_ops = &iforce_usb_xport_ops;
  183. iforce_usb->usbdev = dev;
  184. iforce_usb->intf = intf;
  185. usb_fill_int_urb(iforce_usb->irq, dev,
  186. usb_rcvintpipe(dev, epirq->bEndpointAddress),
  187. iforce_usb->data_in, sizeof(iforce_usb->data_in),
  188. iforce_usb_irq, iforce_usb, epirq->bInterval);
  189. usb_fill_int_urb(iforce_usb->out, dev,
  190. usb_sndintpipe(dev, epout->bEndpointAddress),
  191. iforce_usb->data_out, sizeof(iforce_usb->data_out),
  192. iforce_usb_out, iforce_usb, epout->bInterval);
  193. err = iforce_init_device(&intf->dev, BUS_USB, &iforce_usb->iforce);
  194. if (err)
  195. goto fail;
  196. usb_set_intfdata(intf, iforce_usb);
  197. return 0;
  198. fail:
  199. if (iforce_usb) {
  200. usb_free_urb(iforce_usb->irq);
  201. usb_free_urb(iforce_usb->out);
  202. kfree(iforce_usb);
  203. }
  204. return err;
  205. }
  206. static void iforce_usb_disconnect(struct usb_interface *intf)
  207. {
  208. struct iforce_usb *iforce_usb = usb_get_intfdata(intf);
  209. usb_set_intfdata(intf, NULL);
  210. input_unregister_device(iforce_usb->iforce.dev);
  211. usb_free_urb(iforce_usb->irq);
  212. usb_free_urb(iforce_usb->out);
  213. kfree(iforce_usb);
  214. }
  215. static const struct usb_device_id iforce_usb_ids[] = {
  216. { USB_DEVICE(0x044f, 0xa01c) }, /* Thrustmaster Motor Sport GT */
  217. { USB_DEVICE(0x046d, 0xc281) }, /* Logitech WingMan Force */
  218. { USB_DEVICE(0x046d, 0xc291) }, /* Logitech WingMan Formula Force */
  219. { USB_DEVICE(0x05ef, 0x020a) }, /* AVB Top Shot Pegasus */
  220. { USB_DEVICE(0x05ef, 0x8884) }, /* AVB Mag Turbo Force */
  221. { USB_DEVICE(0x05ef, 0x8888) }, /* AVB Top Shot FFB Racing Wheel */
  222. { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */
  223. { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */
  224. { USB_DEVICE(0x06a3, 0xff04) }, /* Saitek R440 Force Wheel */
  225. { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */
  226. { USB_DEVICE(0x06f8, 0x0003) }, /* Guillemot Jet Leader Force Feedback */
  227. { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */
  228. { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */
  229. { } /* Terminating entry */
  230. };
  231. MODULE_DEVICE_TABLE (usb, iforce_usb_ids);
  232. struct usb_driver iforce_usb_driver = {
  233. .name = "iforce",
  234. .probe = iforce_usb_probe,
  235. .disconnect = iforce_usb_disconnect,
  236. .id_table = iforce_usb_ids,
  237. };
  238. module_usb_driver(iforce_usb_driver);
  239. MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>, Johann Deneux <johann.deneux@gmail.com>");
  240. MODULE_DESCRIPTION("USB I-Force joysticks and wheels driver");
  241. MODULE_LICENSE("GPL");