airprime.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*
  2. * AirPrime CDMA Wireless Serial USB driver
  3. *
  4. * Copyright (C) 2005-2006 Greg Kroah-Hartman <gregkh@suse.de>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License version
  8. * 2 as published by the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/tty.h>
  13. #include <linux/tty_flip.h>
  14. #include <linux/module.h>
  15. #include <linux/usb.h>
  16. #include <linux/usb/serial.h>
  17. static struct usb_device_id id_table [] = {
  18. { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
  19. { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */
  20. { USB_DEVICE(0x1410, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */
  21. { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */
  22. { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */
  23. { },
  24. };
  25. MODULE_DEVICE_TABLE(usb, id_table);
  26. #define URB_TRANSFER_BUFFER_SIZE 4096
  27. #define NUM_READ_URBS 4
  28. #define NUM_WRITE_URBS 4
  29. #define NUM_BULK_EPS 3
  30. #define MAX_BULK_EPS 6
  31. /* if overridden by the user, then use their value for the size of the
  32. * read and write urbs, and the number of endpoints */
  33. static int buffer_size = URB_TRANSFER_BUFFER_SIZE;
  34. static int endpoints = NUM_BULK_EPS;
  35. static int debug;
  36. struct airprime_private {
  37. spinlock_t lock;
  38. int outstanding_urbs;
  39. int throttled;
  40. struct urb *read_urbp[NUM_READ_URBS];
  41. };
  42. static void airprime_read_bulk_callback(struct urb *urb)
  43. {
  44. struct usb_serial_port *port = urb->context;
  45. unsigned char *data = urb->transfer_buffer;
  46. struct tty_struct *tty;
  47. int result;
  48. dbg("%s - port %d", __FUNCTION__, port->number);
  49. if (urb->status) {
  50. dbg("%s - nonzero read bulk status received: %d",
  51. __FUNCTION__, urb->status);
  52. /* something happened, so free up the memory for this urb */
  53. if (urb->transfer_buffer) {
  54. kfree (urb->transfer_buffer);
  55. urb->transfer_buffer = NULL;
  56. }
  57. return;
  58. }
  59. usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
  60. tty = port->tty;
  61. if (tty && urb->actual_length) {
  62. tty_insert_flip_string (tty, data, urb->actual_length);
  63. tty_flip_buffer_push (tty);
  64. }
  65. result = usb_submit_urb (urb, GFP_ATOMIC);
  66. if (result)
  67. dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n",
  68. __FUNCTION__, result);
  69. return;
  70. }
  71. static void airprime_write_bulk_callback(struct urb *urb)
  72. {
  73. struct usb_serial_port *port = urb->context;
  74. struct airprime_private *priv = usb_get_serial_port_data(port);
  75. unsigned long flags;
  76. dbg("%s - port %d", __FUNCTION__, port->number);
  77. /* free up the transfer buffer, as usb_free_urb() does not do this */
  78. kfree (urb->transfer_buffer);
  79. if (urb->status)
  80. dbg("%s - nonzero write bulk status received: %d",
  81. __FUNCTION__, urb->status);
  82. spin_lock_irqsave(&priv->lock, flags);
  83. --priv->outstanding_urbs;
  84. spin_unlock_irqrestore(&priv->lock, flags);
  85. usb_serial_port_softint(port);
  86. }
  87. static int airprime_open(struct usb_serial_port *port, struct file *filp)
  88. {
  89. struct airprime_private *priv = usb_get_serial_port_data(port);
  90. struct usb_serial *serial = port->serial;
  91. struct urb *urb;
  92. char *buffer = NULL;
  93. int i;
  94. int result = 0;
  95. dbg("%s - port %d", __FUNCTION__, port->number);
  96. /* initialize our private data structure if it isn't already created */
  97. if (!priv) {
  98. priv = kzalloc(sizeof(*priv), GFP_KERNEL);
  99. if (!priv) {
  100. result = -ENOMEM;
  101. goto out;
  102. }
  103. spin_lock_init(&priv->lock);
  104. usb_set_serial_port_data(port, priv);
  105. }
  106. for (i = 0; i < NUM_READ_URBS; ++i) {
  107. buffer = kmalloc(buffer_size, GFP_KERNEL);
  108. if (!buffer) {
  109. dev_err(&port->dev, "%s - out of memory.\n",
  110. __FUNCTION__);
  111. result = -ENOMEM;
  112. goto errout;
  113. }
  114. urb = usb_alloc_urb(0, GFP_KERNEL);
  115. if (!urb) {
  116. kfree(buffer);
  117. dev_err(&port->dev, "%s - no more urbs?\n",
  118. __FUNCTION__);
  119. result = -ENOMEM;
  120. goto errout;
  121. }
  122. usb_fill_bulk_urb(urb, serial->dev,
  123. usb_rcvbulkpipe(serial->dev,
  124. port->bulk_out_endpointAddress),
  125. buffer, buffer_size,
  126. airprime_read_bulk_callback, port);
  127. result = usb_submit_urb(urb, GFP_KERNEL);
  128. if (result) {
  129. dev_err(&port->dev,
  130. "%s - failed submitting read urb %d for port %d, error %d\n",
  131. __FUNCTION__, i, port->number, result);
  132. goto errout;
  133. }
  134. /* remember this urb so we can kill it when the port is closed */
  135. priv->read_urbp[i] = urb;
  136. }
  137. goto out;
  138. errout:
  139. /* some error happened, cancel any submitted urbs and clean up anything that
  140. got allocated successfully */
  141. for ( ; i >= 0; --i) {
  142. urb = priv->read_urbp[i];
  143. if (urb) {
  144. /* This urb was submitted successfully. So we have to
  145. cancel it.
  146. Unlinking the urb will invoke read_bulk_callback()
  147. with an error status, so its transfer buffer will
  148. be freed there */
  149. if (usb_unlink_urb (urb) != -EINPROGRESS) {
  150. /* comments in drivers/usb/core/urb.c say this
  151. can only happen if the urb was never submitted,
  152. or has completed already.
  153. Either way we may have to free the transfer
  154. buffer here. */
  155. if (urb->transfer_buffer) {
  156. kfree (urb->transfer_buffer);
  157. urb->transfer_buffer = NULL;
  158. }
  159. }
  160. usb_free_urb (urb);
  161. }
  162. }
  163. out:
  164. return result;
  165. }
  166. static void airprime_close(struct usb_serial_port *port, struct file * filp)
  167. {
  168. struct airprime_private *priv = usb_get_serial_port_data(port);
  169. int i;
  170. dbg("%s - port %d", __FUNCTION__, port->number);
  171. /* killing the urb will invoke read_bulk_callback() with an error status,
  172. so the transfer buffer will be freed there */
  173. for (i = 0; i < NUM_READ_URBS; ++i) {
  174. usb_kill_urb (priv->read_urbp[i]);
  175. usb_free_urb (priv->read_urbp[i]);
  176. }
  177. /* free up private structure */
  178. kfree (priv);
  179. usb_set_serial_port_data(port, NULL);
  180. }
  181. static int airprime_write(struct usb_serial_port *port,
  182. const unsigned char *buf, int count)
  183. {
  184. struct airprime_private *priv = usb_get_serial_port_data(port);
  185. struct usb_serial *serial = port->serial;
  186. struct urb *urb;
  187. unsigned char *buffer;
  188. unsigned long flags;
  189. int status;
  190. dbg("%s - port %d", __FUNCTION__, port->number);
  191. spin_lock_irqsave(&priv->lock, flags);
  192. if (priv->outstanding_urbs > NUM_WRITE_URBS) {
  193. spin_unlock_irqrestore(&priv->lock, flags);
  194. dbg("%s - write limit hit\n", __FUNCTION__);
  195. return 0;
  196. }
  197. spin_unlock_irqrestore(&priv->lock, flags);
  198. buffer = kmalloc(count, GFP_ATOMIC);
  199. if (!buffer) {
  200. dev_err(&port->dev, "out of memory\n");
  201. return -ENOMEM;
  202. }
  203. urb = usb_alloc_urb(0, GFP_ATOMIC);
  204. if (!urb) {
  205. dev_err(&port->dev, "no more free urbs\n");
  206. kfree (buffer);
  207. return -ENOMEM;
  208. }
  209. memcpy (buffer, buf, count);
  210. usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, buffer);
  211. usb_fill_bulk_urb(urb, serial->dev,
  212. usb_sndbulkpipe(serial->dev,
  213. port->bulk_out_endpointAddress),
  214. buffer, count,
  215. airprime_write_bulk_callback, port);
  216. /* send it down the pipe */
  217. status = usb_submit_urb(urb, GFP_ATOMIC);
  218. if (status) {
  219. dev_err(&port->dev,
  220. "%s - usb_submit_urb(write bulk) failed with status = %d\n",
  221. __FUNCTION__, status);
  222. count = status;
  223. kfree (buffer);
  224. } else {
  225. spin_lock_irqsave(&priv->lock, flags);
  226. ++priv->outstanding_urbs;
  227. spin_unlock_irqrestore(&priv->lock, flags);
  228. }
  229. /* we are done with this urb, so let the host driver
  230. * really free it when it is finished with it */
  231. usb_free_urb (urb);
  232. return count;
  233. }
  234. static struct usb_driver airprime_driver = {
  235. .name = "airprime",
  236. .probe = usb_serial_probe,
  237. .disconnect = usb_serial_disconnect,
  238. .id_table = id_table,
  239. .no_dynamic_id = 1,
  240. };
  241. static struct usb_serial_driver airprime_device = {
  242. .driver = {
  243. .owner = THIS_MODULE,
  244. .name = "airprime",
  245. },
  246. .id_table = id_table,
  247. .num_interrupt_in = NUM_DONT_CARE,
  248. .num_bulk_in = NUM_DONT_CARE,
  249. .num_bulk_out = NUM_DONT_CARE,
  250. .open = airprime_open,
  251. .close = airprime_close,
  252. .write = airprime_write,
  253. };
  254. static int __init airprime_init(void)
  255. {
  256. int retval;
  257. airprime_device.num_ports =
  258. (endpoints > 0 && endpoints <= MAX_BULK_EPS) ? endpoints : NUM_BULK_EPS;
  259. retval = usb_serial_register(&airprime_device);
  260. if (retval)
  261. return retval;
  262. retval = usb_register(&airprime_driver);
  263. if (retval)
  264. usb_serial_deregister(&airprime_device);
  265. return retval;
  266. }
  267. static void __exit airprime_exit(void)
  268. {
  269. dbg("%s", __FUNCTION__);
  270. usb_deregister(&airprime_driver);
  271. usb_serial_deregister(&airprime_device);
  272. }
  273. module_init(airprime_init);
  274. module_exit(airprime_exit);
  275. MODULE_LICENSE("GPL");
  276. module_param(debug, bool, S_IRUGO | S_IWUSR);
  277. MODULE_PARM_DESC(debug, "Debug enabled");
  278. module_param(buffer_size, int, 0);
  279. MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers in bytes (default 4096)");
  280. module_param(endpoints, int, 0);
  281. MODULE_PARM_DESC(endpoints, "Number of bulk EPs to configure (default 3)");