pl2303.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Prolific PL2303 USB to serial adaptor driver
  3.  *
  4.  * Copyright (C) 2001-2002 Greg Kroah-Hartman (greg@kroah.com)
  5.  *
  6.  * Original driver for 2.2.x by anonymous
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * See Documentation/usb/usb-serial.txt for more information on using this driver
  14.  *
  15.  * 2001_Oct_06 gkh
  16.  * Added RTS and DTR line control.  Thanks to joe@bndlg.de for parts of it.
  17.  *
  18.  * 2001_Sep_19 gkh
  19.  * Added break support.
  20.  *
  21.  * 2001_Aug_30 gkh
  22.  * fixed oops in write_bulk_callback.
  23.  *
  24.  * 2001_Aug_28 gkh
  25.  * reworked buffer logic to be like other usb-serial drivers.  Hopefully
  26.  * removing some reported problems.
  27.  *
  28.  * 2001_Jun_06 gkh
  29.  * finished porting to 2.4 format.
  30.  * 
  31.  */
  32. #include <linux/config.h>
  33. #include <linux/kernel.h>
  34. #include <linux/errno.h>
  35. #include <linux/init.h>
  36. #include <linux/slab.h>
  37. #include <linux/tty.h>
  38. #include <linux/tty_driver.h>
  39. #include <linux/tty_flip.h>
  40. #include <linux/serial.h>
  41. #include <linux/module.h>
  42. #include <linux/spinlock.h>
  43. #include <asm/uaccess.h>
  44. #include <linux/usb.h>
  45. #ifdef CONFIG_USB_SERIAL_DEBUG
  46. static int debug = 1;
  47. #else
  48. static int debug;
  49. #endif
  50. #include "usb-serial.h"
  51. #include "pl2303.h"
  52. /*
  53.  * Version Information
  54.  */
  55. #define DRIVER_VERSION "v0.9"
  56. #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
  57. static struct usb_device_id id_table [] = {
  58. { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
  59. { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
  60. { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
  61. { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
  62. { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
  63. { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
  64. { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
  65. { } /* Terminating entry */
  66. };
  67. MODULE_DEVICE_TABLE (usb, id_table);
  68. #define SET_LINE_REQUEST_TYPE 0x21
  69. #define SET_LINE_REQUEST 0x20
  70. #define SET_CONTROL_REQUEST_TYPE 0x21
  71. #define SET_CONTROL_REQUEST 0x22
  72. #define CONTROL_DTR 0x01
  73. #define CONTROL_RTS 0x02
  74. #define BREAK_REQUEST_TYPE 0x21
  75. #define BREAK_REQUEST 0x23
  76. #define BREAK_ON 0xffff
  77. #define BREAK_OFF 0x0000
  78. #define GET_LINE_REQUEST_TYPE 0xa1
  79. #define GET_LINE_REQUEST 0x21
  80. #define VENDOR_WRITE_REQUEST_TYPE 0x40
  81. #define VENDOR_WRITE_REQUEST 0x01
  82. #define VENDOR_READ_REQUEST_TYPE 0xc0
  83. #define VENDOR_READ_REQUEST 0x01
  84. /* function prototypes for a PL2303 serial converter */
  85. static int pl2303_open (struct usb_serial_port *port, struct file *filp);
  86. static void pl2303_close (struct usb_serial_port *port, struct file *filp);
  87. static void pl2303_set_termios (struct usb_serial_port *port,
  88. struct termios *old);
  89. static int pl2303_ioctl (struct usb_serial_port *port, struct file *file,
  90.  unsigned int cmd, unsigned long arg);
  91. static void pl2303_read_int_callback (struct urb *urb);
  92. static void pl2303_read_bulk_callback (struct urb *urb);
  93. static void pl2303_write_bulk_callback (struct urb *urb);
  94. static int pl2303_write (struct usb_serial_port *port, int from_user,
  95.  const unsigned char *buf, int count);
  96. static void pl2303_break_ctl(struct usb_serial_port *port,int break_state);
  97. static int pl2303_startup (struct usb_serial *serial);
  98. static void pl2303_shutdown (struct usb_serial *serial);
  99. /* All of the device info needed for the PL2303 SIO serial converter */
  100. static struct usb_serial_device_type pl2303_device = {
  101. .owner = THIS_MODULE,
  102. .name = "PL-2303",
  103. .id_table = id_table,
  104. .num_interrupt_in = NUM_DONT_CARE,
  105. .num_bulk_in = 1,
  106. .num_bulk_out = 1,
  107. .num_ports = 1,
  108. .open = pl2303_open,
  109. .close = pl2303_close,
  110. .write = pl2303_write,
  111. .ioctl = pl2303_ioctl,
  112. .break_ctl = pl2303_break_ctl,
  113. .set_termios = pl2303_set_termios,
  114. .read_bulk_callback = pl2303_read_bulk_callback,
  115. .read_int_callback = pl2303_read_int_callback,
  116. .write_bulk_callback = pl2303_write_bulk_callback,
  117. .startup = pl2303_startup,
  118. .shutdown = pl2303_shutdown,
  119. };
  120. struct pl2303_private { 
  121. u8 line_control;
  122. u8 termios_initialized;
  123. };
  124. static int pl2303_startup (struct usb_serial *serial)
  125. {
  126. struct pl2303_private *priv;
  127. int i;
  128. for (i = 0; i < serial->num_ports; ++i) {
  129. priv = kmalloc (sizeof (struct pl2303_private), GFP_KERNEL);
  130. if (!priv)
  131. return -ENOMEM;
  132. memset (priv, 0x00, sizeof (struct pl2303_private));
  133. serial->port[i].private = priv;
  134. }
  135. return 0;
  136. }
  137. static int set_control_lines (struct usb_device *dev, u8 value)
  138. {
  139. int retval;
  140. retval = usb_control_msg (dev, usb_sndctrlpipe (dev, 0),
  141.   SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
  142.   value, 0, NULL, 0, 100);
  143. dbg("%s - value = %d, retval = %d", __FUNCTION__, value, retval);
  144. return retval;
  145. }
  146. static int pl2303_write (struct usb_serial_port *port, int from_user,  const unsigned char *buf, int count)
  147. {
  148. int result;
  149. dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
  150. if (port->write_urb->status == -EINPROGRESS) {
  151. dbg("%s - already writing", __FUNCTION__);
  152. return 0;
  153. }
  154. count = (count > port->bulk_out_size) ? port->bulk_out_size : count;
  155. if (from_user) {
  156. if (copy_from_user (port->write_urb->transfer_buffer, buf, count))
  157. return -EFAULT;
  158. } else {
  159. memcpy (port->write_urb->transfer_buffer, buf, count);
  160. }
  161. usb_serial_debug_data (__FILE__, __FUNCTION__, count, port->write_urb->transfer_buffer);
  162. port->write_urb->transfer_buffer_length = count;
  163. port->write_urb->dev = port->serial->dev;
  164. result = usb_submit_urb (port->write_urb);
  165. if (result)
  166. err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
  167. else
  168. result = count;
  169. return result;
  170. }
  171. static void pl2303_set_termios (struct usb_serial_port *port, struct termios *old_termios)
  172. {
  173. struct usb_serial *serial = port->serial;
  174. struct pl2303_private *priv;
  175. unsigned int cflag;
  176. unsigned char *buf;
  177. int baud;
  178. int i;
  179. dbg("%s -  port %d, initialized = %d", __FUNCTION__, port->number, 
  180.      ((struct pl2303_private *) port->private)->termios_initialized);
  181. if ((!port->tty) || (!port->tty->termios)) {
  182. dbg("%s - no tty structures", __FUNCTION__);
  183. return;
  184. }
  185. if (!(((struct pl2303_private *) port->private)->termios_initialized)) {
  186. *(port->tty->termios) = tty_std_termios;
  187. port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  188. ((struct pl2303_private *) port->private)->termios_initialized = 1;
  189. }
  190. cflag = port->tty->termios->c_cflag;
  191. /* check that they really want us to change something */
  192. if (old_termios) {
  193. if ((cflag == old_termios->c_cflag) &&
  194.     (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
  195.     dbg("%s - nothing to change...", __FUNCTION__);
  196.     return;
  197. }
  198. }
  199. buf = kmalloc (7, GFP_KERNEL);
  200. if (!buf) {
  201. err("%s - out of memory.", __FUNCTION__);
  202. return;
  203. }
  204. memset (buf, 0x00, 0x07);
  205. i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  206.      GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
  207.      0, 0, buf, 7, 100);
  208. dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
  209.      buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
  210. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  211.      VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
  212.      0, 1, NULL, 0, 100);
  213. dbg ("0x40:1:0:1  %d", i);
  214. if (cflag & CSIZE) {
  215. switch (cflag & CSIZE) {
  216. case CS5: buf[6] = 5; break;
  217. case CS6: buf[6] = 6; break;
  218. case CS7: buf[6] = 7; break;
  219. default:
  220. case CS8: buf[6] = 8; break;
  221. }
  222. dbg("%s - data bits = %d", __FUNCTION__, buf[6]);
  223. }
  224. baud = 0;
  225. switch (cflag & CBAUD) {
  226. case B0: baud = 0; break;
  227. case B75: baud = 75; break;
  228. case B150: baud = 150; break;
  229. case B300: baud = 300; break;
  230. case B600: baud = 600; break;
  231. case B1200: baud = 1200; break;
  232. case B1800: baud = 1800; break;
  233. case B2400: baud = 2400; break;
  234. case B4800: baud = 4800; break;
  235. case B9600: baud = 9600; break;
  236. case B19200: baud = 19200; break;
  237. case B38400: baud = 38400; break;
  238. case B57600: baud = 57600; break;
  239. case B115200: baud = 115200; break;
  240. case B230400: baud = 230400; break;
  241. case B460800: baud = 460800; break;
  242. default:
  243. err ("pl2303 driver does not support the baudrate requested (fix it)");
  244. break;
  245. }
  246. dbg("%s - baud = %d", __FUNCTION__, baud);
  247. if (baud) {
  248. buf[0] = baud & 0xff;
  249. buf[1] = (baud >> 8) & 0xff;
  250. buf[2] = (baud >> 16) & 0xff;
  251. buf[3] = (baud >> 24) & 0xff;
  252. }
  253. /* For reference buf[4]=0 is 1 stop bits */
  254. /* For reference buf[4]=1 is 1.5 stop bits */
  255. /* For reference buf[4]=2 is 2 stop bits */
  256. if (cflag & CSTOPB) {
  257. buf[4] = 2;
  258. dbg("%s - stop bits = 2", __FUNCTION__);
  259. } else {
  260. buf[4] = 0;
  261. dbg("%s - stop bits = 1", __FUNCTION__);
  262. }
  263. if (cflag & PARENB) {
  264. /* For reference buf[5]=0 is none parity */
  265. /* For reference buf[5]=1 is odd parity */
  266. /* For reference buf[5]=2 is even parity */
  267. /* For reference buf[5]=3 is mark parity */
  268. /* For reference buf[5]=4 is space parity */
  269. if (cflag & PARODD) {
  270. buf[5] = 1;
  271. dbg("%s - parity = odd", __FUNCTION__);
  272. } else {
  273. buf[5] = 2;
  274. dbg("%s - parity = even", __FUNCTION__);
  275. }
  276. } else {
  277. buf[5] = 0;
  278. dbg("%s - parity = none", __FUNCTION__);
  279. }
  280. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  281.      SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE, 
  282.      0, 0, buf, 7, 100);
  283. dbg ("0x21:0x20:0:0  %d", i);
  284. if (cflag && CBAUD) {
  285. priv = port->private;
  286. if ((cflag && CBAUD) == B0)
  287. priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
  288. else
  289. priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
  290. set_control_lines (serial->dev, priv->line_control);
  291. }
  292. buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
  293. i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  294.      GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
  295.      0, 0, buf, 7, 100);
  296. dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
  297.      buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
  298. if (cflag & CRTSCTS) {
  299. i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
  300.      VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
  301.      0x0, 0x41, NULL, 0, 100);
  302. dbg ("0x40:0x1:0x0:0x41  %d", i);
  303. }
  304. kfree (buf);
  305. }       
  306. static int pl2303_open (struct usb_serial_port *port, struct file *filp)
  307. {
  308. struct termios tmp_termios;
  309. struct usb_serial *serial = port->serial;
  310. unsigned char buf[10];
  311. int result;
  312. if (port_paranoia_check (port, __FUNCTION__))
  313. return -ENODEV;
  314. dbg("%s -  port %d", __FUNCTION__, port->number);
  315. #define FISH(a,b,c,d)
  316. result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),
  317.        b, a, c, d, buf, 1, 100);
  318. dbg("0x%x:0x%x:0x%x:0x%x  %d - %x",a,b,c,d,result,buf[0]);
  319. #define SOUP(a,b,c,d)
  320. result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),
  321.        b, a, c, d, NULL, 0, 100);
  322. dbg("0x%x:0x%x:0x%x:0x%x  %d",a,b,c,d,result);
  323. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  324. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
  325. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  326. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
  327. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  328. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
  329. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
  330. FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
  331. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
  332. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0xc0);
  333. SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 4);
  334. /* Setup termios */
  335. if (port->tty) {
  336. pl2303_set_termios (port, &tmp_termios);
  337. }
  338. //FIXME: need to assert RTS and DTR if CRTSCTS off
  339. dbg("%s - submitting read urb", __FUNCTION__);
  340. port->read_urb->dev = serial->dev;
  341. result = usb_submit_urb (port->read_urb);
  342. if (result) {
  343. err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
  344. pl2303_close (port, NULL);
  345. return -EPROTO;
  346. }
  347. dbg("%s - submitting interrupt urb", __FUNCTION__);
  348. port->interrupt_in_urb->dev = serial->dev;
  349. result = usb_submit_urb (port->interrupt_in_urb);
  350. if (result) {
  351. err("%s - failed submitting interrupt urb, error %d", __FUNCTION__, result);
  352. pl2303_close (port, NULL);
  353. return -EPROTO;
  354. }
  355. return 0;
  356. }
  357. static void pl2303_close (struct usb_serial_port *port, struct file *filp)
  358. {
  359. struct usb_serial *serial;
  360. struct pl2303_private *priv;
  361. unsigned int c_cflag;
  362. int result;
  363. if (port_paranoia_check (port, __FUNCTION__))
  364. return;
  365. serial = get_usb_serial (port, __FUNCTION__);
  366. if (!serial)
  367. return;
  368. dbg("%s - port %d", __FUNCTION__, port->number);
  369. if (serial->dev) {
  370. if (port->tty) {
  371. c_cflag = port->tty->termios->c_cflag;
  372. if (c_cflag & HUPCL) {
  373. /* drop DTR and RTS */
  374. priv = port->private;
  375. priv->line_control = 0;
  376. set_control_lines (port->serial->dev,
  377.    priv->line_control);
  378. }
  379. }
  380. /* shutdown our urbs */
  381. dbg("%s - shutting down urbs", __FUNCTION__);
  382. result = usb_unlink_urb (port->write_urb);
  383. if (result)
  384. dbg("%s - usb_unlink_urb (write_urb)"
  385.     " failed with reason: %d", __FUNCTION__,
  386.      result);
  387. result = usb_unlink_urb (port->read_urb);
  388. if (result)
  389. dbg("%s - usb_unlink_urb (read_urb) "
  390.     "failed with reason: %d", __FUNCTION__,
  391.      result);
  392. result = usb_unlink_urb (port->interrupt_in_urb);
  393. if (result)
  394. dbg("%s - usb_unlink_urb (interrupt_in_urb)"
  395.     " failed with reason: %d", __FUNCTION__,
  396.      result);
  397. }
  398. }
  399. static int set_modem_info (struct usb_serial_port *port, unsigned int cmd, unsigned int *value)
  400. {
  401. struct pl2303_private *priv = port->private;
  402. unsigned int arg;
  403. if (copy_from_user(&arg, value, sizeof(int)))
  404. return -EFAULT;
  405. switch (cmd) {
  406. case TIOCMBIS:
  407. if (arg & TIOCM_RTS)
  408. priv->line_control |= CONTROL_RTS;
  409. if (arg & TIOCM_DTR)
  410. priv->line_control |= CONTROL_DTR;
  411. break;
  412. case TIOCMBIC:
  413. if (arg & TIOCM_RTS)
  414. priv->line_control &= ~CONTROL_RTS;
  415. if (arg & TIOCM_DTR)
  416. priv->line_control &= ~CONTROL_DTR;
  417. break;
  418. case TIOCMSET:
  419. /* turn off RTS and DTR and then only turn
  420.    on what was asked to */
  421. priv->line_control &= ~(CONTROL_RTS | CONTROL_DTR);
  422. priv->line_control |= ((arg & TIOCM_RTS) ? CONTROL_RTS : 0);
  423. priv->line_control |= ((arg & TIOCM_DTR) ? CONTROL_DTR : 0);
  424. break;
  425. }
  426. return set_control_lines (port->serial->dev, priv->line_control);
  427. }
  428. static int get_modem_info (struct usb_serial_port *port, unsigned int *value)
  429. {
  430. struct pl2303_private *priv = port->private;
  431. unsigned int mcr = priv->line_control;
  432. unsigned int result;
  433. result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
  434.   | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0);
  435. dbg("%s - result = %x", __FUNCTION__, result);
  436. if (copy_to_user(value, &result, sizeof(int)))
  437. return -EFAULT;
  438. return 0;
  439. }
  440. static int pl2303_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
  441. {
  442. dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
  443. switch (cmd) {
  444. case TIOCMGET:
  445. dbg("%s (%d) TIOCMGET", __FUNCTION__, port->number);
  446. return get_modem_info (port, (unsigned int *)arg);
  447. case TIOCMBIS:
  448. case TIOCMBIC:
  449. case TIOCMSET:
  450. dbg("%s (%d) TIOCMSET/TIOCMBIC/TIOCMSET", __FUNCTION__,  port->number);
  451. return set_modem_info(port, cmd, (unsigned int *) arg);
  452. default:
  453. dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
  454. break;
  455. }
  456. return -ENOIOCTLCMD;
  457. }
  458. static void pl2303_break_ctl (struct usb_serial_port *port, int break_state)
  459. {
  460. struct usb_serial *serial = port->serial;
  461. u16 state;
  462. int result;
  463. dbg("%s - port %d", __FUNCTION__, port->number);
  464. if (break_state == 0)
  465. state = BREAK_OFF;
  466. else
  467. state = BREAK_ON;
  468. dbg("%s - turning break %s", state==BREAK_OFF ? "off" : "on", __FUNCTION__);
  469. result = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
  470.   BREAK_REQUEST, BREAK_REQUEST_TYPE, state, 
  471.   0, NULL, 0, 100);
  472. if (result)
  473. dbg("%s - error sending break = %d", __FUNCTION__, result);
  474. }
  475. static void pl2303_shutdown (struct usb_serial *serial)
  476. {
  477. int i;
  478. dbg("%s", __FUNCTION__);
  479. for (i = 0; i < serial->num_ports; ++i)
  480. kfree (serial->port[i].private);
  481. }
  482. static void pl2303_read_int_callback (struct urb *urb)
  483. {
  484. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  485. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  486. //unsigned char *data = urb->transfer_buffer;
  487. //int i;
  488. //ints auto restart...
  489. if (!serial) {
  490. return;
  491. }
  492. if (urb->status) {
  493. urb->status = 0;
  494. return;
  495. }
  496. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer);
  497. #if 0
  498. //FIXME need to update state of terminal lines variable
  499. #endif
  500. return;
  501. }
  502. static void pl2303_read_bulk_callback (struct urb *urb)
  503. {
  504. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  505. struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
  506. struct tty_struct *tty;
  507. unsigned char *data = urb->transfer_buffer;
  508. int i;
  509. int result;
  510. if (port_paranoia_check (port, __FUNCTION__))
  511. return;
  512. dbg("%s - port %d", __FUNCTION__, port->number);
  513. if (!serial) {
  514. dbg("%s - bad serial pointer, exiting", __FUNCTION__);
  515. return;
  516. }
  517. if (urb->status) {
  518. dbg("%s - urb->status = %d", __FUNCTION__, urb->status);
  519. if (!port->open_count) {
  520. dbg("%s - port is closed, exiting.", __FUNCTION__);
  521. return;
  522. }
  523. if (urb->status == -EPROTO) {
  524. /* PL2303 mysteriously fails with -EPROTO reschedule the read */
  525. dbg("%s - caught -EPROTO, resubmitting the urb", __FUNCTION__);
  526. urb->status = 0;
  527. urb->dev = serial->dev;
  528. result = usb_submit_urb(urb);
  529. if (result)
  530. err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
  531. return;
  532. }
  533. dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
  534. return;
  535. }
  536. usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
  537. tty = port->tty;
  538. if (tty && urb->actual_length) {
  539. for (i = 0; i < urb->actual_length; ++i) {
  540. if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
  541. tty_flip_buffer_push(tty);
  542. }
  543. tty_insert_flip_char (tty, data[i], 0);
  544. }
  545. tty_flip_buffer_push (tty);
  546. }
  547. /* Schedule the next read _if_ we are still open */
  548. if (port->open_count) {
  549. urb->dev = serial->dev;
  550. result = usb_submit_urb(urb);
  551. if (result)
  552. err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
  553. }
  554. return;
  555. }
  556. static void pl2303_write_bulk_callback (struct urb *urb)
  557. {
  558. struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
  559. int result;
  560. if (port_paranoia_check (port, __FUNCTION__))
  561. return;
  562. dbg("%s - port %d", __FUNCTION__, port->number);
  563. if (urb->status) {
  564. /* error in the urb, so we have to resubmit it */
  565. if (serial_paranoia_check (port->serial, __FUNCTION__)) {
  566. return;
  567. }
  568. dbg("%s - Overflow in write", __FUNCTION__);
  569. dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
  570. port->write_urb->transfer_buffer_length = 1;
  571. port->write_urb->dev = port->serial->dev;
  572. result = usb_submit_urb (port->write_urb);
  573. if (result)
  574. err("%s - failed resubmitting write urb, error %d", __FUNCTION__, result);
  575. return;
  576. }
  577. queue_task(&port->tqueue, &tq_immediate);
  578. mark_bh(IMMEDIATE_BH);
  579. return;
  580. }
  581. static int __init pl2303_init (void)
  582. {
  583. usb_serial_register (&pl2303_device);
  584. info(DRIVER_DESC " " DRIVER_VERSION);
  585. return 0;
  586. }
  587. static void __exit pl2303_exit (void)
  588. {
  589. usb_serial_deregister (&pl2303_device);
  590. }
  591. module_init(pl2303_init);
  592. module_exit(pl2303_exit);
  593. MODULE_DESCRIPTION(DRIVER_DESC);
  594. MODULE_LICENSE("GPL");
  595. MODULE_PARM(debug, "i");
  596. MODULE_PARM_DESC(debug, "Debug enabled or not");