USB: add a pl2303 device id
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / usb / serial / pl2303.c
blob2a0dd1b50dc43b8dc884f0964c4f6624bfac1921
1 /*
2 * Prolific PL2303 USB to serial adaptor driver
4 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2003 IBM Corp.
7 * Original driver for 2.2.x by anonymous
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License version
11 * 2 as published by the Free Software Foundation.
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
17 #include <linux/kernel.h>
18 #include <linux/errno.h>
19 #include <linux/init.h>
20 #include <linux/slab.h>
21 #include <linux/tty.h>
22 #include <linux/tty_driver.h>
23 #include <linux/tty_flip.h>
24 #include <linux/serial.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/spinlock.h>
28 #include <asm/uaccess.h>
29 #include <linux/usb.h>
30 #include <linux/usb/serial.h>
31 #include "pl2303.h"
34 * Version Information
36 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
38 static int debug;
40 #define PL2303_CLOSING_WAIT (30*HZ)
42 #define PL2303_BUF_SIZE 1024
43 #define PL2303_TMP_BUF_SIZE 1024
45 struct pl2303_buf {
46 unsigned int buf_size;
47 char *buf_buf;
48 char *buf_get;
49 char *buf_put;
52 static struct usb_device_id id_table [] = {
53 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
54 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
55 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
56 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
57 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
58 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
59 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
60 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
61 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
62 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
63 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
64 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
65 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
66 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
67 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
68 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
69 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
70 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
71 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
72 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
73 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
74 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
75 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
76 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
77 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
78 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
79 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
80 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
81 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
82 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
83 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
84 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
85 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
86 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
87 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
88 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
89 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
90 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
91 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
92 { USB_DEVICE(HL340_VENDOR_ID, HL340_PRODUCT_ID) },
93 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
94 { } /* Terminating entry */
97 MODULE_DEVICE_TABLE(usb, id_table);
99 static struct usb_driver pl2303_driver = {
100 .name = "pl2303",
101 .probe = usb_serial_probe,
102 .disconnect = usb_serial_disconnect,
103 .id_table = id_table,
104 .suspend = usb_serial_suspend,
105 .resume = usb_serial_resume,
106 .no_dynamic_id = 1,
107 .supports_autosuspend = 1,
110 #define SET_LINE_REQUEST_TYPE 0x21
111 #define SET_LINE_REQUEST 0x20
113 #define SET_CONTROL_REQUEST_TYPE 0x21
114 #define SET_CONTROL_REQUEST 0x22
115 #define CONTROL_DTR 0x01
116 #define CONTROL_RTS 0x02
118 #define BREAK_REQUEST_TYPE 0x21
119 #define BREAK_REQUEST 0x23
120 #define BREAK_ON 0xffff
121 #define BREAK_OFF 0x0000
123 #define GET_LINE_REQUEST_TYPE 0xa1
124 #define GET_LINE_REQUEST 0x21
126 #define VENDOR_WRITE_REQUEST_TYPE 0x40
127 #define VENDOR_WRITE_REQUEST 0x01
129 #define VENDOR_READ_REQUEST_TYPE 0xc0
130 #define VENDOR_READ_REQUEST 0x01
132 #define UART_STATE 0x08
133 #define UART_STATE_TRANSIENT_MASK 0x74
134 #define UART_DCD 0x01
135 #define UART_DSR 0x02
136 #define UART_BREAK_ERROR 0x04
137 #define UART_RING 0x08
138 #define UART_FRAME_ERROR 0x10
139 #define UART_PARITY_ERROR 0x20
140 #define UART_OVERRUN_ERROR 0x40
141 #define UART_CTS 0x80
144 enum pl2303_type {
145 type_0, /* don't know the difference between type 0 and */
146 type_1, /* type 1, until someone from prolific tells us... */
147 HX, /* HX version of the pl2303 chip */
150 struct pl2303_private {
151 spinlock_t lock;
152 struct pl2303_buf *buf;
153 int write_urb_in_use;
154 wait_queue_head_t delta_msr_wait;
155 u8 line_control;
156 u8 line_status;
157 u8 termios_initialized;
158 enum pl2303_type type;
162 * pl2303_buf_alloc
164 * Allocate a circular buffer and all associated memory.
166 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
168 struct pl2303_buf *pb;
170 if (size == 0)
171 return NULL;
173 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
174 if (pb == NULL)
175 return NULL;
177 pb->buf_buf = kmalloc(size, GFP_KERNEL);
178 if (pb->buf_buf == NULL) {
179 kfree(pb);
180 return NULL;
183 pb->buf_size = size;
184 pb->buf_get = pb->buf_put = pb->buf_buf;
186 return pb;
190 * pl2303_buf_free
192 * Free the buffer and all associated memory.
194 static void pl2303_buf_free(struct pl2303_buf *pb)
196 if (pb) {
197 kfree(pb->buf_buf);
198 kfree(pb);
203 * pl2303_buf_clear
205 * Clear out all data in the circular buffer.
207 static void pl2303_buf_clear(struct pl2303_buf *pb)
209 if (pb != NULL)
210 pb->buf_get = pb->buf_put;
211 /* equivalent to a get of all data available */
215 * pl2303_buf_data_avail
217 * Return the number of bytes of data available in the circular
218 * buffer.
220 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
222 if (pb == NULL)
223 return 0;
225 return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
229 * pl2303_buf_space_avail
231 * Return the number of bytes of space available in the circular
232 * buffer.
234 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
236 if (pb == NULL)
237 return 0;
239 return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
243 * pl2303_buf_put
245 * Copy data data from a user buffer and put it into the circular buffer.
246 * Restrict to the amount of space available.
248 * Return the number of bytes copied.
250 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
251 unsigned int count)
253 unsigned int len;
255 if (pb == NULL)
256 return 0;
258 len = pl2303_buf_space_avail(pb);
259 if (count > len)
260 count = len;
262 if (count == 0)
263 return 0;
265 len = pb->buf_buf + pb->buf_size - pb->buf_put;
266 if (count > len) {
267 memcpy(pb->buf_put, buf, len);
268 memcpy(pb->buf_buf, buf+len, count - len);
269 pb->buf_put = pb->buf_buf + count - len;
270 } else {
271 memcpy(pb->buf_put, buf, count);
272 if (count < len)
273 pb->buf_put += count;
274 else /* count == len */
275 pb->buf_put = pb->buf_buf;
278 return count;
282 * pl2303_buf_get
284 * Get data from the circular buffer and copy to the given buffer.
285 * Restrict to the amount of data available.
287 * Return the number of bytes copied.
289 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
290 unsigned int count)
292 unsigned int len;
294 if (pb == NULL)
295 return 0;
297 len = pl2303_buf_data_avail(pb);
298 if (count > len)
299 count = len;
301 if (count == 0)
302 return 0;
304 len = pb->buf_buf + pb->buf_size - pb->buf_get;
305 if (count > len) {
306 memcpy(buf, pb->buf_get, len);
307 memcpy(buf+len, pb->buf_buf, count - len);
308 pb->buf_get = pb->buf_buf + count - len;
309 } else {
310 memcpy(buf, pb->buf_get, count);
311 if (count < len)
312 pb->buf_get += count;
313 else /* count == len */
314 pb->buf_get = pb->buf_buf;
317 return count;
320 static int pl2303_vendor_read(__u16 value, __u16 index,
321 struct usb_serial *serial, unsigned char *buf)
323 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
324 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
325 value, index, buf, 1, 100);
326 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
327 VENDOR_READ_REQUEST, value, index, res, buf[0]);
328 return res;
331 static int pl2303_vendor_write(__u16 value, __u16 index,
332 struct usb_serial *serial)
334 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
335 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
336 value, index, NULL, 0, 100);
337 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
338 VENDOR_WRITE_REQUEST, value, index, res);
339 return res;
342 static int pl2303_startup(struct usb_serial *serial)
344 struct pl2303_private *priv;
345 enum pl2303_type type = type_0;
346 unsigned char *buf;
347 int i;
349 buf = kmalloc(10, GFP_KERNEL);
350 if (buf == NULL)
351 return -ENOMEM;
353 if (serial->dev->descriptor.bDeviceClass == 0x02)
354 type = type_0;
355 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
356 type = HX;
357 else if (serial->dev->descriptor.bDeviceClass == 0x00)
358 type = type_1;
359 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
360 type = type_1;
361 dbg("device type: %d", type);
363 for (i = 0; i < serial->num_ports; ++i) {
364 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
365 if (!priv)
366 goto cleanup;
367 spin_lock_init(&priv->lock);
368 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
369 if (priv->buf == NULL) {
370 kfree(priv);
371 goto cleanup;
373 init_waitqueue_head(&priv->delta_msr_wait);
374 priv->type = type;
375 usb_set_serial_port_data(serial->port[i], priv);
378 pl2303_vendor_read(0x8484, 0, serial, buf);
379 pl2303_vendor_write(0x0404, 0, serial);
380 pl2303_vendor_read(0x8484, 0, serial, buf);
381 pl2303_vendor_read(0x8383, 0, serial, buf);
382 pl2303_vendor_read(0x8484, 0, serial, buf);
383 pl2303_vendor_write(0x0404, 1, serial);
384 pl2303_vendor_read(0x8484, 0, serial, buf);
385 pl2303_vendor_read(0x8383, 0, serial, buf);
386 pl2303_vendor_write(0, 1, serial);
387 pl2303_vendor_write(1, 0, serial);
388 if (type == HX)
389 pl2303_vendor_write(2, 0x44, serial);
390 else
391 pl2303_vendor_write(2, 0x24, serial);
393 kfree(buf);
394 return 0;
396 cleanup:
397 kfree(buf);
398 for (--i; i>=0; --i) {
399 priv = usb_get_serial_port_data(serial->port[i]);
400 pl2303_buf_free(priv->buf);
401 kfree(priv);
402 usb_set_serial_port_data(serial->port[i], NULL);
404 return -ENOMEM;
407 static int set_control_lines(struct usb_device *dev, u8 value)
409 int retval;
411 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
412 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
413 value, 0, NULL, 0, 100);
414 dbg("%s - value = %d, retval = %d", __func__, value, retval);
415 return retval;
418 static void pl2303_send(struct usb_serial_port *port)
420 int count, result;
421 struct pl2303_private *priv = usb_get_serial_port_data(port);
422 unsigned long flags;
424 dbg("%s - port %d", __func__, port->number);
426 spin_lock_irqsave(&priv->lock, flags);
428 if (priv->write_urb_in_use) {
429 spin_unlock_irqrestore(&priv->lock, flags);
430 return;
433 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
434 port->bulk_out_size);
436 if (count == 0) {
437 spin_unlock_irqrestore(&priv->lock, flags);
438 return;
441 priv->write_urb_in_use = 1;
443 spin_unlock_irqrestore(&priv->lock, flags);
445 usb_serial_debug_data(debug, &port->dev, __func__, count,
446 port->write_urb->transfer_buffer);
448 port->write_urb->transfer_buffer_length = count;
449 port->write_urb->dev = port->serial->dev;
450 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
451 if (result) {
452 dev_err(&port->dev, "%s - failed submitting write urb,"
453 " error %d\n", __func__, result);
454 priv->write_urb_in_use = 0;
455 // TODO: reschedule pl2303_send
458 usb_serial_port_softint(port);
461 static int pl2303_write(struct usb_serial_port *port, const unsigned char *buf,
462 int count)
464 struct pl2303_private *priv = usb_get_serial_port_data(port);
465 unsigned long flags;
467 dbg("%s - port %d, %d bytes", __func__, port->number, count);
469 if (!count)
470 return count;
472 spin_lock_irqsave(&priv->lock, flags);
473 count = pl2303_buf_put(priv->buf, buf, count);
474 spin_unlock_irqrestore(&priv->lock, flags);
476 pl2303_send(port);
478 return count;
481 static int pl2303_write_room(struct usb_serial_port *port)
483 struct pl2303_private *priv = usb_get_serial_port_data(port);
484 int room = 0;
485 unsigned long flags;
487 dbg("%s - port %d", __func__, port->number);
489 spin_lock_irqsave(&priv->lock, flags);
490 room = pl2303_buf_space_avail(priv->buf);
491 spin_unlock_irqrestore(&priv->lock, flags);
493 dbg("%s - returns %d", __func__, room);
494 return room;
497 static int pl2303_chars_in_buffer(struct usb_serial_port *port)
499 struct pl2303_private *priv = usb_get_serial_port_data(port);
500 int chars = 0;
501 unsigned long flags;
503 dbg("%s - port %d", __func__, port->number);
505 spin_lock_irqsave(&priv->lock, flags);
506 chars = pl2303_buf_data_avail(priv->buf);
507 spin_unlock_irqrestore(&priv->lock, flags);
509 dbg("%s - returns %d", __func__, chars);
510 return chars;
513 static void pl2303_set_termios(struct usb_serial_port *port,
514 struct ktermios *old_termios)
516 struct usb_serial *serial = port->serial;
517 struct pl2303_private *priv = usb_get_serial_port_data(port);
518 unsigned long flags;
519 unsigned int cflag;
520 unsigned char *buf;
521 int baud;
522 int i;
523 u8 control;
525 dbg("%s - port %d", __func__, port->number);
527 spin_lock_irqsave(&priv->lock, flags);
528 if (!priv->termios_initialized) {
529 *(port->tty->termios) = tty_std_termios;
530 port->tty->termios->c_cflag = B9600 | CS8 | CREAD |
531 HUPCL | CLOCAL;
532 port->tty->termios->c_ispeed = 9600;
533 port->tty->termios->c_ospeed = 9600;
534 priv->termios_initialized = 1;
536 spin_unlock_irqrestore(&priv->lock, flags);
538 /* The PL2303 is reported to lose bytes if you change
539 serial settings even to the same values as before. Thus
540 we actually need to filter in this specific case */
542 if (!tty_termios_hw_change(port->tty->termios, old_termios))
543 return;
545 cflag = port->tty->termios->c_cflag;
547 buf = kzalloc(7, GFP_KERNEL);
548 if (!buf) {
549 dev_err(&port->dev, "%s - out of memory.\n", __func__);
550 /* Report back no change occurred */
551 *port->tty->termios = *old_termios;
552 return;
555 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
556 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
557 0, 0, buf, 7, 100);
558 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
559 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
561 if (cflag & CSIZE) {
562 switch (cflag & CSIZE) {
563 case CS5: buf[6] = 5; break;
564 case CS6: buf[6] = 6; break;
565 case CS7: buf[6] = 7; break;
566 default:
567 case CS8: buf[6] = 8; break;
569 dbg("%s - data bits = %d", __func__, buf[6]);
572 baud = tty_get_baud_rate(port->tty);;
573 dbg("%s - baud = %d", __func__, baud);
574 if (baud) {
575 buf[0] = baud & 0xff;
576 buf[1] = (baud >> 8) & 0xff;
577 buf[2] = (baud >> 16) & 0xff;
578 buf[3] = (baud >> 24) & 0xff;
581 /* For reference buf[4]=0 is 1 stop bits */
582 /* For reference buf[4]=1 is 1.5 stop bits */
583 /* For reference buf[4]=2 is 2 stop bits */
584 if (cflag & CSTOPB) {
585 buf[4] = 2;
586 dbg("%s - stop bits = 2", __func__);
587 } else {
588 buf[4] = 0;
589 dbg("%s - stop bits = 1", __func__);
592 if (cflag & PARENB) {
593 /* For reference buf[5]=0 is none parity */
594 /* For reference buf[5]=1 is odd parity */
595 /* For reference buf[5]=2 is even parity */
596 /* For reference buf[5]=3 is mark parity */
597 /* For reference buf[5]=4 is space parity */
598 if (cflag & PARODD) {
599 buf[5] = 1;
600 dbg("%s - parity = odd", __func__);
601 } else {
602 buf[5] = 2;
603 dbg("%s - parity = even", __func__);
605 } else {
606 buf[5] = 0;
607 dbg("%s - parity = none", __func__);
610 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
611 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
612 0, 0, buf, 7, 100);
613 dbg("0x21:0x20:0:0 %d", i);
615 /* change control lines if we are switching to or from B0 */
616 spin_lock_irqsave(&priv->lock, flags);
617 control = priv->line_control;
618 if ((cflag & CBAUD) == B0)
619 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
620 else
621 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
622 if (control != priv->line_control) {
623 control = priv->line_control;
624 spin_unlock_irqrestore(&priv->lock, flags);
625 set_control_lines(serial->dev, control);
626 } else {
627 spin_unlock_irqrestore(&priv->lock, flags);
630 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
632 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
633 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
634 0, 0, buf, 7, 100);
635 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
636 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
638 if (cflag & CRTSCTS) {
639 if (priv->type == HX)
640 pl2303_vendor_write(0x0, 0x61, serial);
641 else
642 pl2303_vendor_write(0x0, 0x41, serial);
643 } else {
644 pl2303_vendor_write(0x0, 0x0, serial);
647 /* FIXME: Need to read back resulting baud rate */
648 if (baud)
649 tty_encode_baud_rate(port->tty, baud, baud);
651 kfree(buf);
654 static void pl2303_close(struct usb_serial_port *port, struct file *filp)
656 struct pl2303_private *priv = usb_get_serial_port_data(port);
657 unsigned long flags;
658 unsigned int c_cflag;
659 int bps;
660 long timeout;
661 wait_queue_t wait;
663 dbg("%s - port %d", __func__, port->number);
665 /* wait for data to drain from the buffer */
666 spin_lock_irqsave(&priv->lock, flags);
667 timeout = PL2303_CLOSING_WAIT;
668 init_waitqueue_entry(&wait, current);
669 add_wait_queue(&port->tty->write_wait, &wait);
670 for (;;) {
671 set_current_state(TASK_INTERRUPTIBLE);
672 if (pl2303_buf_data_avail(priv->buf) == 0 ||
673 timeout == 0 || signal_pending(current) ||
674 port->serial->disconnected)
675 break;
676 spin_unlock_irqrestore(&priv->lock, flags);
677 timeout = schedule_timeout(timeout);
678 spin_lock_irqsave(&priv->lock, flags);
680 set_current_state(TASK_RUNNING);
681 remove_wait_queue(&port->tty->write_wait, &wait);
682 /* clear out any remaining data in the buffer */
683 pl2303_buf_clear(priv->buf);
684 spin_unlock_irqrestore(&priv->lock, flags);
686 /* wait for characters to drain from the device */
687 /* (this is long enough for the entire 256 byte */
688 /* pl2303 hardware buffer to drain with no flow */
689 /* control for data rates of 1200 bps or more, */
690 /* for lower rates we should really know how much */
691 /* data is in the buffer to compute a delay */
692 /* that is not unnecessarily long) */
693 bps = tty_get_baud_rate(port->tty);
694 if (bps > 1200)
695 timeout = max((HZ*2560)/bps,HZ/10);
696 else
697 timeout = 2*HZ;
698 schedule_timeout_interruptible(timeout);
700 /* shutdown our urbs */
701 dbg("%s - shutting down urbs", __func__);
702 usb_kill_urb(port->write_urb);
703 usb_kill_urb(port->read_urb);
704 usb_kill_urb(port->interrupt_in_urb);
706 if (port->tty) {
707 c_cflag = port->tty->termios->c_cflag;
708 if (c_cflag & HUPCL) {
709 /* drop DTR and RTS */
710 spin_lock_irqsave(&priv->lock, flags);
711 priv->line_control = 0;
712 spin_unlock_irqrestore(&priv->lock, flags);
713 set_control_lines(port->serial->dev, 0);
718 static int pl2303_open(struct usb_serial_port *port, struct file *filp)
720 struct ktermios tmp_termios;
721 struct usb_serial *serial = port->serial;
722 struct pl2303_private *priv = usb_get_serial_port_data(port);
723 int result;
725 dbg("%s - port %d", __func__, port->number);
727 if (priv->type != HX) {
728 usb_clear_halt(serial->dev, port->write_urb->pipe);
729 usb_clear_halt(serial->dev, port->read_urb->pipe);
730 } else {
731 /* reset upstream data pipes */
732 pl2303_vendor_write(8, 0, serial);
733 pl2303_vendor_write(9, 0, serial);
736 /* Setup termios */
737 if (port->tty) {
738 pl2303_set_termios(port, &tmp_termios);
741 //FIXME: need to assert RTS and DTR if CRTSCTS off
743 dbg("%s - submitting read urb", __func__);
744 port->read_urb->dev = serial->dev;
745 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
746 if (result) {
747 dev_err(&port->dev, "%s - failed submitting read urb,"
748 " error %d\n", __func__, result);
749 pl2303_close(port, NULL);
750 return -EPROTO;
753 dbg("%s - submitting interrupt urb", __func__);
754 port->interrupt_in_urb->dev = serial->dev;
755 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
756 if (result) {
757 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
758 " error %d\n", __func__, result);
759 pl2303_close(port, NULL);
760 return -EPROTO;
762 return 0;
765 static int pl2303_tiocmset(struct usb_serial_port *port, struct file *file,
766 unsigned int set, unsigned int clear)
768 struct pl2303_private *priv = usb_get_serial_port_data(port);
769 unsigned long flags;
770 u8 control;
772 if (!usb_get_intfdata(port->serial->interface))
773 return -ENODEV;
775 spin_lock_irqsave(&priv->lock, flags);
776 if (set & TIOCM_RTS)
777 priv->line_control |= CONTROL_RTS;
778 if (set & TIOCM_DTR)
779 priv->line_control |= CONTROL_DTR;
780 if (clear & TIOCM_RTS)
781 priv->line_control &= ~CONTROL_RTS;
782 if (clear & TIOCM_DTR)
783 priv->line_control &= ~CONTROL_DTR;
784 control = priv->line_control;
785 spin_unlock_irqrestore(&priv->lock, flags);
787 return set_control_lines(port->serial->dev, control);
790 static int pl2303_tiocmget(struct usb_serial_port *port, struct file *file)
792 struct pl2303_private *priv = usb_get_serial_port_data(port);
793 unsigned long flags;
794 unsigned int mcr;
795 unsigned int status;
796 unsigned int result;
798 dbg("%s (%d)", __func__, port->number);
800 if (!usb_get_intfdata(port->serial->interface))
801 return -ENODEV;
803 spin_lock_irqsave(&priv->lock, flags);
804 mcr = priv->line_control;
805 status = priv->line_status;
806 spin_unlock_irqrestore(&priv->lock, flags);
808 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
809 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
810 | ((status & UART_CTS) ? TIOCM_CTS : 0)
811 | ((status & UART_DSR) ? TIOCM_DSR : 0)
812 | ((status & UART_RING) ? TIOCM_RI : 0)
813 | ((status & UART_DCD) ? TIOCM_CD : 0);
815 dbg("%s - result = %x", __func__, result);
817 return result;
820 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
822 struct pl2303_private *priv = usb_get_serial_port_data(port);
823 unsigned long flags;
824 unsigned int prevstatus;
825 unsigned int status;
826 unsigned int changed;
828 spin_lock_irqsave(&priv->lock, flags);
829 prevstatus = priv->line_status;
830 spin_unlock_irqrestore(&priv->lock, flags);
832 while (1) {
833 interruptible_sleep_on(&priv->delta_msr_wait);
834 /* see if a signal did it */
835 if (signal_pending(current))
836 return -ERESTARTSYS;
838 spin_lock_irqsave(&priv->lock, flags);
839 status = priv->line_status;
840 spin_unlock_irqrestore(&priv->lock, flags);
842 changed=prevstatus^status;
844 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
845 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
846 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
847 ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
848 return 0;
850 prevstatus = status;
852 /* NOTREACHED */
853 return 0;
856 static int pl2303_ioctl(struct usb_serial_port *port, struct file *file,
857 unsigned int cmd, unsigned long arg)
859 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
861 switch (cmd) {
862 case TIOCMIWAIT:
863 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
864 return wait_modem_info(port, arg);
866 default:
867 dbg("%s not supported = 0x%04x", __func__, cmd);
868 break;
871 return -ENOIOCTLCMD;
874 static void pl2303_break_ctl(struct usb_serial_port *port, int break_state)
876 struct usb_serial *serial = port->serial;
877 u16 state;
878 int result;
880 dbg("%s - port %d", __func__, port->number);
882 if (break_state == 0)
883 state = BREAK_OFF;
884 else
885 state = BREAK_ON;
886 dbg("%s - turning break %s", __func__, state==BREAK_OFF ? "off" : "on");
888 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
889 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
890 0, NULL, 0, 100);
891 if (result)
892 dbg("%s - error sending break = %d", __func__, result);
895 static void pl2303_shutdown(struct usb_serial *serial)
897 int i;
898 struct pl2303_private *priv;
900 dbg("%s", __func__);
902 for (i = 0; i < serial->num_ports; ++i) {
903 priv = usb_get_serial_port_data(serial->port[i]);
904 if (priv) {
905 pl2303_buf_free(priv->buf);
906 kfree(priv);
907 usb_set_serial_port_data(serial->port[i], NULL);
912 static void pl2303_update_line_status(struct usb_serial_port *port,
913 unsigned char *data,
914 unsigned int actual_length)
917 struct pl2303_private *priv = usb_get_serial_port_data(port);
918 unsigned long flags;
919 u8 status_idx = UART_STATE;
920 u8 length = UART_STATE + 1;
921 u16 idv, idp;
923 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
924 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
927 if (idv == SIEMENS_VENDOR_ID) {
928 if (idp == SIEMENS_PRODUCT_ID_X65 ||
929 idp == SIEMENS_PRODUCT_ID_SX1 ||
930 idp == SIEMENS_PRODUCT_ID_X75) {
932 length = 1;
933 status_idx = 0;
937 if (actual_length < length)
938 return;
940 /* Save off the uart status for others to look at */
941 spin_lock_irqsave(&priv->lock, flags);
942 priv->line_status = data[status_idx];
943 spin_unlock_irqrestore(&priv->lock, flags);
944 wake_up_interruptible(&priv->delta_msr_wait);
947 static void pl2303_read_int_callback(struct urb *urb)
949 struct usb_serial_port *port = urb->context;
950 unsigned char *data = urb->transfer_buffer;
951 unsigned int actual_length = urb->actual_length;
952 int status = urb->status;
953 int retval;
955 dbg("%s (%d)", __func__, port->number);
957 switch (status) {
958 case 0:
959 /* success */
960 break;
961 case -ECONNRESET:
962 case -ENOENT:
963 case -ESHUTDOWN:
964 /* this urb is terminated, clean up */
965 dbg("%s - urb shutting down with status: %d", __func__,
966 status);
967 return;
968 default:
969 dbg("%s - nonzero urb status received: %d", __func__,
970 status);
971 goto exit;
974 usb_serial_debug_data(debug, &port->dev, __func__,
975 urb->actual_length, urb->transfer_buffer);
977 pl2303_update_line_status(port, data, actual_length);
979 exit:
980 retval = usb_submit_urb(urb, GFP_ATOMIC);
981 if (retval)
982 dev_err(&urb->dev->dev,
983 "%s - usb_submit_urb failed with result %d\n",
984 __func__, retval);
987 static void pl2303_read_bulk_callback(struct urb *urb)
989 struct usb_serial_port *port = urb->context;
990 struct pl2303_private *priv = usb_get_serial_port_data(port);
991 struct tty_struct *tty;
992 unsigned char *data = urb->transfer_buffer;
993 unsigned long flags;
994 int i;
995 int result;
996 int status = urb->status;
997 u8 line_status;
998 char tty_flag;
1000 dbg("%s - port %d", __func__, port->number);
1002 if (status) {
1003 dbg("%s - urb status = %d", __func__, status);
1004 if (!port->open_count) {
1005 dbg("%s - port is closed, exiting.", __func__);
1006 return;
1008 if (status == -EPROTO) {
1009 /* PL2303 mysteriously fails with -EPROTO reschedule
1010 * the read */
1011 dbg("%s - caught -EPROTO, resubmitting the urb",
1012 __func__);
1013 urb->dev = port->serial->dev;
1014 result = usb_submit_urb(urb, GFP_ATOMIC);
1015 if (result)
1016 dev_err(&urb->dev->dev, "%s - failed"
1017 " resubmitting read urb, error %d\n",
1018 __func__, result);
1019 return;
1021 dbg("%s - unable to handle the error, exiting.", __func__);
1022 return;
1025 usb_serial_debug_data(debug, &port->dev, __func__,
1026 urb->actual_length, data);
1028 /* get tty_flag from status */
1029 tty_flag = TTY_NORMAL;
1031 spin_lock_irqsave(&priv->lock, flags);
1032 line_status = priv->line_status;
1033 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1034 spin_unlock_irqrestore(&priv->lock, flags);
1035 wake_up_interruptible(&priv->delta_msr_wait);
1037 /* break takes precedence over parity, */
1038 /* which takes precedence over framing errors */
1039 if (line_status & UART_BREAK_ERROR )
1040 tty_flag = TTY_BREAK;
1041 else if (line_status & UART_PARITY_ERROR)
1042 tty_flag = TTY_PARITY;
1043 else if (line_status & UART_FRAME_ERROR)
1044 tty_flag = TTY_FRAME;
1045 dbg("%s - tty_flag = %d", __func__, tty_flag);
1047 tty = port->tty;
1048 if (tty && urb->actual_length) {
1049 tty_buffer_request_room(tty, urb->actual_length + 1);
1050 /* overrun is special, not associated with a char */
1051 if (line_status & UART_OVERRUN_ERROR)
1052 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1053 for (i = 0; i < urb->actual_length; ++i)
1054 tty_insert_flip_char(tty, data[i], tty_flag);
1055 tty_flip_buffer_push(tty);
1058 /* Schedule the next read _if_ we are still open */
1059 if (port->open_count) {
1060 urb->dev = port->serial->dev;
1061 result = usb_submit_urb(urb, GFP_ATOMIC);
1062 if (result)
1063 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1064 " read urb, error %d\n", __func__, result);
1067 return;
1070 static void pl2303_write_bulk_callback(struct urb *urb)
1072 struct usb_serial_port *port = urb->context;
1073 struct pl2303_private *priv = usb_get_serial_port_data(port);
1074 int result;
1075 int status = urb->status;
1077 dbg("%s - port %d", __func__, port->number);
1079 switch (status) {
1080 case 0:
1081 /* success */
1082 break;
1083 case -ECONNRESET:
1084 case -ENOENT:
1085 case -ESHUTDOWN:
1086 /* this urb is terminated, clean up */
1087 dbg("%s - urb shutting down with status: %d", __func__,
1088 status);
1089 priv->write_urb_in_use = 0;
1090 return;
1091 default:
1092 /* error in the urb, so we have to resubmit it */
1093 dbg("%s - Overflow in write", __func__);
1094 dbg("%s - nonzero write bulk status received: %d", __func__,
1095 status);
1096 port->write_urb->transfer_buffer_length = 1;
1097 port->write_urb->dev = port->serial->dev;
1098 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1099 if (result)
1100 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1101 " urb, error %d\n", __func__, result);
1102 else
1103 return;
1106 priv->write_urb_in_use = 0;
1108 /* send any buffered data */
1109 pl2303_send(port);
1112 /* All of the device info needed for the PL2303 SIO serial converter */
1113 static struct usb_serial_driver pl2303_device = {
1114 .driver = {
1115 .owner = THIS_MODULE,
1116 .name = "pl2303",
1118 .id_table = id_table,
1119 .usb_driver = &pl2303_driver,
1120 .num_ports = 1,
1121 .open = pl2303_open,
1122 .close = pl2303_close,
1123 .write = pl2303_write,
1124 .ioctl = pl2303_ioctl,
1125 .break_ctl = pl2303_break_ctl,
1126 .set_termios = pl2303_set_termios,
1127 .tiocmget = pl2303_tiocmget,
1128 .tiocmset = pl2303_tiocmset,
1129 .read_bulk_callback = pl2303_read_bulk_callback,
1130 .read_int_callback = pl2303_read_int_callback,
1131 .write_bulk_callback = pl2303_write_bulk_callback,
1132 .write_room = pl2303_write_room,
1133 .chars_in_buffer = pl2303_chars_in_buffer,
1134 .attach = pl2303_startup,
1135 .shutdown = pl2303_shutdown,
1138 static int __init pl2303_init(void)
1140 int retval;
1142 retval = usb_serial_register(&pl2303_device);
1143 if (retval)
1144 goto failed_usb_serial_register;
1145 retval = usb_register(&pl2303_driver);
1146 if (retval)
1147 goto failed_usb_register;
1148 info(DRIVER_DESC);
1149 return 0;
1150 failed_usb_register:
1151 usb_serial_deregister(&pl2303_device);
1152 failed_usb_serial_register:
1153 return retval;
1156 static void __exit pl2303_exit(void)
1158 usb_deregister(&pl2303_driver);
1159 usb_serial_deregister(&pl2303_device);
1162 module_init(pl2303_init);
1163 module_exit(pl2303_exit);
1165 MODULE_DESCRIPTION(DRIVER_DESC);
1166 MODULE_LICENSE("GPL");
1168 module_param(debug, bool, S_IRUGO | S_IWUSR);
1169 MODULE_PARM_DESC(debug, "Debug enabled or not");