pl2303.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:20k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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