csvt.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /* Copyright (c) 2012, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/slab.h>
  14. #include <linux/tty.h>
  15. #include <linux/serial.h>
  16. #include <linux/tty_flip.h>
  17. #include <linux/uaccess.h>
  18. #include <linux/usb.h>
  19. #include <linux/usb/ch9.h>
  20. #include <linux/usb/cdc.h>
  21. #include <linux/usb/serial.h>
  22. #include <asm/unaligned.h>
  23. /* output control lines*/
  24. #define CSVT_CTRL_DTR 0x01
  25. #define CSVT_CTRL_RTS 0x02
  26. /* input control lines*/
  27. #define CSVT_CTRL_CTS 0x01
  28. #define CSVT_CTRL_DSR 0x02
  29. #define CSVT_CTRL_RI 0x04
  30. #define CSVT_CTRL_CD 0x08
  31. static int debug;
  32. module_param(debug, int, S_IRUGO | S_IWUSR);
  33. struct csvt_ctrl_dev {
  34. struct mutex dev_lock;
  35. /* input control lines (DSR, CTS, CD, RI) */
  36. unsigned int cbits_tolocal;
  37. /* output control lines (DTR, RTS) */
  38. unsigned int cbits_tomdm;
  39. };
  40. static const struct usb_device_id id_table[] = {
  41. { USB_DEVICE_AND_INTERFACE_INFO(0x05c6 , 0x904c, 0xff, 0xfe, 0xff)},
  42. { USB_DEVICE_AND_INTERFACE_INFO(0x05c6 , 0x9075, 0xff, 0xfe, 0xff)},
  43. {}, /* terminating entry */
  44. };
  45. MODULE_DEVICE_TABLE(usb, id_table);
  46. static struct usb_driver csvt_driver = {
  47. .name = "qc_csvt",
  48. .probe = usb_serial_probe,
  49. .disconnect = usb_serial_disconnect,
  50. .id_table = id_table,
  51. .suspend = usb_serial_suspend,
  52. .resume = usb_serial_resume,
  53. .supports_autosuspend = true,
  54. };
  55. #define CSVT_IFC_NUM 4
  56. static int csvt_probe(struct usb_serial *serial, const struct usb_device_id *id)
  57. {
  58. struct usb_host_interface *intf =
  59. serial->interface->cur_altsetting;
  60. pr_debug("%s:\n", __func__);
  61. if (intf->desc.bInterfaceNumber != CSVT_IFC_NUM)
  62. return -ENODEV;
  63. usb_enable_autosuspend(serial->dev);
  64. return 0;
  65. }
  66. static int csvt_ctrl_write_cmd(struct csvt_ctrl_dev *dev,
  67. struct usb_serial_port *port)
  68. {
  69. struct usb_device *udev = port->serial->dev;
  70. struct usb_interface *iface = port->serial->interface;
  71. unsigned int iface_num;
  72. int retval = 0;
  73. retval = usb_autopm_get_interface(iface);
  74. if (retval < 0) {
  75. dev_err(&port->dev, "%s: Unable to resume interface: %d\n",
  76. __func__, retval);
  77. return retval;
  78. }
  79. dev_dbg(&port->dev, "%s: cbits to mdm 0x%x\n", __func__,
  80. dev->cbits_tomdm);
  81. iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
  82. retval = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
  83. USB_CDC_REQ_SET_CONTROL_LINE_STATE,
  84. (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE),
  85. dev->cbits_tomdm,
  86. iface_num,
  87. NULL, 0, USB_CTRL_SET_TIMEOUT);
  88. usb_autopm_put_interface(iface);
  89. return retval;
  90. }
  91. static void csvt_ctrl_dtr_rts(struct usb_serial_port *port, int on)
  92. {
  93. struct csvt_ctrl_dev *dev = usb_get_serial_port_data(port);
  94. if (!dev)
  95. return;
  96. dev_dbg(&port->dev, "%s", __func__);
  97. mutex_lock(&dev->dev_lock);
  98. if (on) {
  99. dev->cbits_tomdm |= CSVT_CTRL_DTR;
  100. dev->cbits_tomdm |= CSVT_CTRL_RTS;
  101. } else {
  102. dev->cbits_tomdm &= ~CSVT_CTRL_DTR;
  103. dev->cbits_tomdm &= ~CSVT_CTRL_RTS;
  104. }
  105. mutex_unlock(&dev->dev_lock);
  106. csvt_ctrl_write_cmd(dev, port);
  107. }
  108. static int get_serial_info(struct usb_serial_port *port,
  109. struct serial_struct __user *retinfo)
  110. {
  111. struct serial_struct tmp;
  112. if (!retinfo)
  113. return -EFAULT;
  114. memset(&tmp, 0, sizeof(tmp));
  115. tmp.line = port->serial->minor;
  116. tmp.port = port->number;
  117. tmp.baud_base = tty_get_baud_rate(port->port.tty);
  118. tmp.close_delay = port->port.close_delay / 10;
  119. tmp.closing_wait =
  120. port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
  121. ASYNC_CLOSING_WAIT_NONE :
  122. port->port.closing_wait / 10;
  123. if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
  124. return -EFAULT;
  125. return 0;
  126. }
  127. static int set_serial_info(struct usb_serial_port *port,
  128. struct serial_struct __user *newinfo)
  129. {
  130. struct serial_struct new_serial;
  131. unsigned int closing_wait;
  132. unsigned int close_delay;
  133. int retval = 0;
  134. if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
  135. return -EFAULT;
  136. close_delay = new_serial.close_delay * 10;
  137. closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
  138. ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
  139. mutex_lock(&port->port.mutex);
  140. if (!capable(CAP_SYS_ADMIN)) {
  141. if ((close_delay != port->port.close_delay) ||
  142. (closing_wait != port->port.closing_wait))
  143. retval = -EPERM;
  144. else
  145. retval = -EOPNOTSUPP;
  146. } else {
  147. port->port.close_delay = close_delay;
  148. port->port.closing_wait = closing_wait;
  149. }
  150. mutex_unlock(&port->port.mutex);
  151. return retval;
  152. }
  153. static int csvt_ctrl_ioctl(struct tty_struct *tty, unsigned int cmd,
  154. unsigned long arg)
  155. {
  156. struct usb_serial_port *port = tty->driver_data;
  157. dev_dbg(&port->dev, "%s cmd 0x%04x", __func__, cmd);
  158. switch (cmd) {
  159. case TIOCGSERIAL:
  160. return get_serial_info(port,
  161. (struct serial_struct __user *) arg);
  162. case TIOCSSERIAL:
  163. return set_serial_info(port,
  164. (struct serial_struct __user *) arg);
  165. default:
  166. break;
  167. }
  168. dev_err(&port->dev, "%s arg not supported", __func__);
  169. return -ENOIOCTLCMD;
  170. }
  171. static int csvt_ctrl_tiocmget(struct tty_struct *tty)
  172. {
  173. struct usb_serial_port *port = tty->driver_data;
  174. struct csvt_ctrl_dev *dev = usb_get_serial_port_data(port);
  175. unsigned int control_state = 0;
  176. if (!dev)
  177. return -ENODEV;
  178. mutex_lock(&dev->dev_lock);
  179. control_state = (dev->cbits_tomdm & CSVT_CTRL_DTR ? TIOCM_DTR : 0) |
  180. (dev->cbits_tomdm & CSVT_CTRL_RTS ? TIOCM_RTS : 0) |
  181. (dev->cbits_tolocal & CSVT_CTRL_DSR ? TIOCM_DSR : 0) |
  182. (dev->cbits_tolocal & CSVT_CTRL_RI ? TIOCM_RI : 0) |
  183. (dev->cbits_tolocal & CSVT_CTRL_CD ? TIOCM_CD : 0) |
  184. (dev->cbits_tolocal & CSVT_CTRL_CTS ? TIOCM_CTS : 0);
  185. mutex_unlock(&dev->dev_lock);
  186. dev_dbg(&port->dev, "%s -- %x", __func__, control_state);
  187. return control_state;
  188. }
  189. static int csvt_ctrl_tiocmset(struct tty_struct *tty,
  190. unsigned int set, unsigned int clear)
  191. {
  192. struct usb_serial_port *port = tty->driver_data;
  193. struct csvt_ctrl_dev *dev = usb_get_serial_port_data(port);
  194. if (!dev)
  195. return -ENODEV;
  196. dev_dbg(&port->dev, "%s\n", __func__);
  197. mutex_lock(&dev->dev_lock);
  198. if (set & CSVT_CTRL_DTR)
  199. dev->cbits_tomdm |= TIOCM_DTR;
  200. if (set & CSVT_CTRL_RTS)
  201. dev->cbits_tomdm |= TIOCM_RTS;
  202. if (clear & CSVT_CTRL_DTR)
  203. dev->cbits_tomdm &= ~TIOCM_DTR;
  204. if (clear & CSVT_CTRL_RTS)
  205. dev->cbits_tomdm &= ~TIOCM_RTS;
  206. mutex_unlock(&dev->dev_lock);
  207. return csvt_ctrl_write_cmd(dev, port);
  208. }
  209. static void csvt_ctrl_set_termios(struct tty_struct *tty,
  210. struct usb_serial_port *port,
  211. struct ktermios *old_termios)
  212. {
  213. struct csvt_ctrl_dev *dev = usb_get_serial_port_data(port);
  214. if (!dev)
  215. return;
  216. dev_dbg(&port->dev, "%s", __func__);
  217. /* Doesn't support option setting */
  218. tty_termios_copy_hw(tty->termios, old_termios);
  219. csvt_ctrl_write_cmd(dev, port);
  220. }
  221. static void csvt_ctrl_int_cb(struct urb *urb)
  222. {
  223. int status;
  224. struct usb_cdc_notification *ctrl;
  225. struct usb_serial_port *port = urb->context;
  226. struct csvt_ctrl_dev *dev;
  227. unsigned int ctrl_bits;
  228. unsigned char *data;
  229. switch (urb->status) {
  230. case 0:
  231. /*success*/
  232. break;
  233. case -ESHUTDOWN:
  234. case -ENOENT:
  235. case -ECONNRESET:
  236. case -EPROTO:
  237. /* unplug */
  238. return;
  239. case -EPIPE:
  240. dev_err(&port->dev, "%s: stall on int endpoint\n", __func__);
  241. /* TBD : halt to be cleared in work */
  242. case -EOVERFLOW:
  243. default:
  244. pr_debug_ratelimited("%s: non zero urb status = %d\n",
  245. __func__, urb->status);
  246. goto resubmit_int_urb;
  247. }
  248. dev = usb_get_serial_port_data(port);
  249. if (!dev)
  250. return;
  251. ctrl = urb->transfer_buffer;
  252. data = (unsigned char *)(ctrl + 1);
  253. usb_serial_debug_data(debug, &port->dev, __func__,
  254. urb->actual_length, data);
  255. switch (ctrl->bNotificationType) {
  256. case USB_CDC_NOTIFY_NETWORK_CONNECTION:
  257. dev_dbg(&port->dev, "%s network\n", ctrl->wValue ?
  258. "connected to" : "disconnected from");
  259. break;
  260. case USB_CDC_NOTIFY_SERIAL_STATE:
  261. ctrl_bits = get_unaligned_le16(data);
  262. dev_dbg(&port->dev, "serial state: %d\n", ctrl_bits);
  263. dev->cbits_tolocal = ctrl_bits;
  264. break;
  265. default:
  266. dev_err(&port->dev, "%s: unknown notification %d received:"
  267. "index %d len %d data0 %d data1 %d",
  268. __func__, ctrl->bNotificationType, ctrl->wIndex,
  269. ctrl->wLength, data[0], data[1]);
  270. }
  271. resubmit_int_urb:
  272. status = usb_submit_urb(urb, GFP_ATOMIC);
  273. if (status)
  274. dev_err(&port->dev, "%s: Error re-submitting Int URB %d\n",
  275. __func__, status);
  276. }
  277. static int csvt_ctrl_open(struct tty_struct *tty,
  278. struct usb_serial_port *port)
  279. {
  280. int retval;
  281. dev_dbg(&port->dev, "%s port %d", __func__, port->number);
  282. retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
  283. if (retval) {
  284. dev_err(&port->dev, "usb_submit_urb(read int) failed\n");
  285. return retval;
  286. }
  287. retval = usb_serial_generic_open(tty, port);
  288. if (retval)
  289. usb_kill_urb(port->interrupt_in_urb);
  290. return retval;
  291. }
  292. static void csvt_ctrl_close(struct usb_serial_port *port)
  293. {
  294. dev_dbg(&port->dev, "%s port %d", __func__, port->number);
  295. usb_serial_generic_close(port);
  296. usb_kill_urb(port->interrupt_in_urb);
  297. }
  298. static int csvt_ctrl_attach(struct usb_serial *serial)
  299. {
  300. struct csvt_ctrl_dev *dev;
  301. dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  302. if (!dev)
  303. return -ENOMEM;
  304. mutex_init(&dev->dev_lock);
  305. usb_set_serial_port_data(serial->port[0], dev);
  306. return 0;
  307. }
  308. static void csvt_ctrl_release(struct usb_serial *serial)
  309. {
  310. struct usb_serial_port *port = serial->port[0];
  311. struct csvt_ctrl_dev *dev = usb_get_serial_port_data(port);
  312. dev_dbg(&port->dev, "%s", __func__);
  313. kfree(dev);
  314. usb_set_serial_port_data(port, NULL);
  315. }
  316. static struct usb_serial_driver csvt_device = {
  317. .driver = {
  318. .owner = THIS_MODULE,
  319. .name = "qc_csvt",
  320. },
  321. .description = "qc_csvt",
  322. .id_table = id_table,
  323. .num_ports = 1,
  324. .open = csvt_ctrl_open,
  325. .close = csvt_ctrl_close,
  326. .probe = csvt_probe,
  327. .dtr_rts = csvt_ctrl_dtr_rts,
  328. .tiocmget = csvt_ctrl_tiocmget,
  329. .tiocmset = csvt_ctrl_tiocmset,
  330. .ioctl = csvt_ctrl_ioctl,
  331. .set_termios = csvt_ctrl_set_termios,
  332. .read_int_callback = csvt_ctrl_int_cb,
  333. .attach = csvt_ctrl_attach,
  334. .release = csvt_ctrl_release,
  335. };
  336. static struct usb_serial_driver * const serial_drivers[] = {
  337. &csvt_device,
  338. NULL,
  339. };
  340. static int __init csvt_init(void)
  341. {
  342. int retval;
  343. retval = usb_serial_register_drivers(&csvt_driver, serial_drivers);
  344. if (retval) {
  345. err("%s: usb serial register failed\n", __func__);
  346. return retval;
  347. }
  348. return 0;
  349. }
  350. static void __exit csvt_exit(void)
  351. {
  352. usb_serial_deregister_drivers(&csvt_driver, serial_drivers);
  353. }
  354. module_init(csvt_init);
  355. module_exit(csvt_exit);
  356. MODULE_LICENSE("GPL v2");