pl2303.c
上传用户:wangqikan
上传日期:2016-04-26
资源大小:2216k
文件大小:20k
源码类别:

通讯编程文档

开发平台:

DOS

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