MERGE-master-patchset-edits
[linux-2.6/openmoko-kernel.git] / drivers / usb / serial / pl2303.c
blob1aed584be5eb9a528d904b3b3209afef29f40383
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
14 * driver
18 #include <linux/kernel.h>
19 #include <linux/errno.h>
20 #include <linux/init.h>
21 #include <linux/slab.h>
22 #include <linux/tty.h>
23 #include <linux/tty_driver.h>
24 #include <linux/tty_flip.h>
25 #include <linux/serial.h>
26 #include <linux/module.h>
27 #include <linux/moduleparam.h>
28 #include <linux/spinlock.h>
29 #include <linux/uaccess.h>
30 #include <linux/usb.h>
31 #include <linux/usb/serial.h>
32 #include "pl2303.h"
35 * Version Information
37 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
39 static int debug;
41 #define PL2303_CLOSING_WAIT (30*HZ)
43 #define PL2303_BUF_SIZE 1024
44 #define PL2303_TMP_BUF_SIZE 1024
46 struct pl2303_buf {
47 unsigned int buf_size;
48 char *buf_buf;
49 char *buf_get;
50 char *buf_put;
53 static struct usb_device_id id_table [] = {
54 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
55 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
56 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
57 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
58 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
59 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
60 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
61 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
62 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
63 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
64 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
65 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
66 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
67 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
68 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
69 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
70 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
71 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
72 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
73 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
74 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
75 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
76 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
77 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
78 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
79 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
80 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
81 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
82 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
83 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
84 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
85 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
86 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
87 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
88 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
89 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
90 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
91 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
92 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
93 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
94 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
95 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
96 { } /* Terminating entry */
99 MODULE_DEVICE_TABLE(usb, id_table);
101 static struct usb_driver pl2303_driver = {
102 .name = "pl2303",
103 .probe = usb_serial_probe,
104 .disconnect = usb_serial_disconnect,
105 .id_table = id_table,
106 .suspend = usb_serial_suspend,
107 .resume = usb_serial_resume,
108 .no_dynamic_id = 1,
109 .supports_autosuspend = 1,
112 #define SET_LINE_REQUEST_TYPE 0x21
113 #define SET_LINE_REQUEST 0x20
115 #define SET_CONTROL_REQUEST_TYPE 0x21
116 #define SET_CONTROL_REQUEST 0x22
117 #define CONTROL_DTR 0x01
118 #define CONTROL_RTS 0x02
120 #define BREAK_REQUEST_TYPE 0x21
121 #define BREAK_REQUEST 0x23
122 #define BREAK_ON 0xffff
123 #define BREAK_OFF 0x0000
125 #define GET_LINE_REQUEST_TYPE 0xa1
126 #define GET_LINE_REQUEST 0x21
128 #define VENDOR_WRITE_REQUEST_TYPE 0x40
129 #define VENDOR_WRITE_REQUEST 0x01
131 #define VENDOR_READ_REQUEST_TYPE 0xc0
132 #define VENDOR_READ_REQUEST 0x01
134 #define UART_STATE 0x08
135 #define UART_STATE_TRANSIENT_MASK 0x74
136 #define UART_DCD 0x01
137 #define UART_DSR 0x02
138 #define UART_BREAK_ERROR 0x04
139 #define UART_RING 0x08
140 #define UART_FRAME_ERROR 0x10
141 #define UART_PARITY_ERROR 0x20
142 #define UART_OVERRUN_ERROR 0x40
143 #define UART_CTS 0x80
146 enum pl2303_type {
147 type_0, /* don't know the difference between type 0 and */
148 type_1, /* type 1, until someone from prolific tells us... */
149 HX, /* HX version of the pl2303 chip */
152 struct pl2303_private {
153 spinlock_t lock;
154 struct pl2303_buf *buf;
155 int write_urb_in_use;
156 wait_queue_head_t delta_msr_wait;
157 u8 line_control;
158 u8 line_status;
159 enum pl2303_type type;
163 * pl2303_buf_alloc
165 * Allocate a circular buffer and all associated memory.
167 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
169 struct pl2303_buf *pb;
171 if (size == 0)
172 return NULL;
174 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
175 if (pb == NULL)
176 return NULL;
178 pb->buf_buf = kmalloc(size, GFP_KERNEL);
179 if (pb->buf_buf == NULL) {
180 kfree(pb);
181 return NULL;
184 pb->buf_size = size;
185 pb->buf_get = pb->buf_put = pb->buf_buf;
187 return pb;
191 * pl2303_buf_free
193 * Free the buffer and all associated memory.
195 static void pl2303_buf_free(struct pl2303_buf *pb)
197 if (pb) {
198 kfree(pb->buf_buf);
199 kfree(pb);
204 * pl2303_buf_clear
206 * Clear out all data in the circular buffer.
208 static void pl2303_buf_clear(struct pl2303_buf *pb)
210 if (pb != NULL)
211 pb->buf_get = pb->buf_put;
212 /* equivalent to a get of all data available */
216 * pl2303_buf_data_avail
218 * Return the number of bytes of data available in the circular
219 * buffer.
221 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
223 if (pb == NULL)
224 return 0;
226 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
230 * pl2303_buf_space_avail
232 * Return the number of bytes of space available in the circular
233 * buffer.
235 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
237 if (pb == NULL)
238 return 0;
240 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
244 * pl2303_buf_put
246 * Copy data data from a user buffer and put it into the circular buffer.
247 * Restrict to the amount of space available.
249 * Return the number of bytes copied.
251 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
252 unsigned int count)
254 unsigned int len;
256 if (pb == NULL)
257 return 0;
259 len = pl2303_buf_space_avail(pb);
260 if (count > len)
261 count = len;
263 if (count == 0)
264 return 0;
266 len = pb->buf_buf + pb->buf_size - pb->buf_put;
267 if (count > len) {
268 memcpy(pb->buf_put, buf, len);
269 memcpy(pb->buf_buf, buf+len, count - len);
270 pb->buf_put = pb->buf_buf + count - len;
271 } else {
272 memcpy(pb->buf_put, buf, count);
273 if (count < len)
274 pb->buf_put += count;
275 else /* count == len */
276 pb->buf_put = pb->buf_buf;
279 return count;
283 * pl2303_buf_get
285 * Get data from the circular buffer and copy to the given buffer.
286 * Restrict to the amount of data available.
288 * Return the number of bytes copied.
290 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
291 unsigned int count)
293 unsigned int len;
295 if (pb == NULL)
296 return 0;
298 len = pl2303_buf_data_avail(pb);
299 if (count > len)
300 count = len;
302 if (count == 0)
303 return 0;
305 len = pb->buf_buf + pb->buf_size - pb->buf_get;
306 if (count > len) {
307 memcpy(buf, pb->buf_get, len);
308 memcpy(buf+len, pb->buf_buf, count - len);
309 pb->buf_get = pb->buf_buf + count - len;
310 } else {
311 memcpy(buf, pb->buf_get, count);
312 if (count < len)
313 pb->buf_get += count;
314 else /* count == len */
315 pb->buf_get = pb->buf_buf;
318 return count;
321 static int pl2303_vendor_read(__u16 value, __u16 index,
322 struct usb_serial *serial, unsigned char *buf)
324 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
325 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
326 value, index, buf, 1, 100);
327 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
328 VENDOR_READ_REQUEST, value, index, res, buf[0]);
329 return res;
332 static int pl2303_vendor_write(__u16 value, __u16 index,
333 struct usb_serial *serial)
335 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
336 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
337 value, index, NULL, 0, 100);
338 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
339 VENDOR_WRITE_REQUEST, value, index, res);
340 return res;
343 static int pl2303_startup(struct usb_serial *serial)
345 struct pl2303_private *priv;
346 enum pl2303_type type = type_0;
347 unsigned char *buf;
348 int i;
350 buf = kmalloc(10, GFP_KERNEL);
351 if (buf == NULL)
352 return -ENOMEM;
354 if (serial->dev->descriptor.bDeviceClass == 0x02)
355 type = type_0;
356 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
357 type = HX;
358 else if (serial->dev->descriptor.bDeviceClass == 0x00)
359 type = type_1;
360 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
361 type = type_1;
362 dbg("device type: %d", type);
364 for (i = 0; i < serial->num_ports; ++i) {
365 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
366 if (!priv)
367 goto cleanup;
368 spin_lock_init(&priv->lock);
369 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
370 if (priv->buf == NULL) {
371 kfree(priv);
372 goto cleanup;
374 init_waitqueue_head(&priv->delta_msr_wait);
375 priv->type = type;
376 usb_set_serial_port_data(serial->port[i], priv);
379 pl2303_vendor_read(0x8484, 0, serial, buf);
380 pl2303_vendor_write(0x0404, 0, serial);
381 pl2303_vendor_read(0x8484, 0, serial, buf);
382 pl2303_vendor_read(0x8383, 0, serial, buf);
383 pl2303_vendor_read(0x8484, 0, serial, buf);
384 pl2303_vendor_write(0x0404, 1, serial);
385 pl2303_vendor_read(0x8484, 0, serial, buf);
386 pl2303_vendor_read(0x8383, 0, serial, buf);
387 pl2303_vendor_write(0, 1, serial);
388 pl2303_vendor_write(1, 0, serial);
389 if (type == HX)
390 pl2303_vendor_write(2, 0x44, serial);
391 else
392 pl2303_vendor_write(2, 0x24, serial);
394 kfree(buf);
395 return 0;
397 cleanup:
398 kfree(buf);
399 for (--i; i >= 0; --i) {
400 priv = usb_get_serial_port_data(serial->port[i]);
401 pl2303_buf_free(priv->buf);
402 kfree(priv);
403 usb_set_serial_port_data(serial->port[i], NULL);
405 return -ENOMEM;
408 static int set_control_lines(struct usb_device *dev, u8 value)
410 int retval;
412 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
413 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
414 value, 0, NULL, 0, 100);
415 dbg("%s - value = %d, retval = %d", __func__, value, retval);
416 return retval;
419 static void pl2303_send(struct usb_serial_port *port)
421 int count, result;
422 struct pl2303_private *priv = usb_get_serial_port_data(port);
423 unsigned long flags;
425 dbg("%s - port %d", __func__, port->number);
427 spin_lock_irqsave(&priv->lock, flags);
429 if (priv->write_urb_in_use) {
430 spin_unlock_irqrestore(&priv->lock, flags);
431 return;
434 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
435 port->bulk_out_size);
437 if (count == 0) {
438 spin_unlock_irqrestore(&priv->lock, flags);
439 return;
442 priv->write_urb_in_use = 1;
444 spin_unlock_irqrestore(&priv->lock, flags);
446 usb_serial_debug_data(debug, &port->dev, __func__, count,
447 port->write_urb->transfer_buffer);
449 port->write_urb->transfer_buffer_length = count;
450 port->write_urb->dev = port->serial->dev;
451 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
452 if (result) {
453 dev_err(&port->dev, "%s - failed submitting write urb,"
454 " error %d\n", __func__, result);
455 priv->write_urb_in_use = 0;
456 /* TODO: reschedule pl2303_send */
459 usb_serial_port_softint(port);
462 static int pl2303_write(struct tty_struct *tty, struct usb_serial_port *port,
463 const unsigned char *buf, int count)
465 struct pl2303_private *priv = usb_get_serial_port_data(port);
466 unsigned long flags;
468 dbg("%s - port %d, %d bytes", __func__, port->number, count);
470 if (!count)
471 return count;
473 spin_lock_irqsave(&priv->lock, flags);
474 count = pl2303_buf_put(priv->buf, buf, count);
475 spin_unlock_irqrestore(&priv->lock, flags);
477 pl2303_send(port);
479 return count;
482 static int pl2303_write_room(struct tty_struct *tty)
484 struct usb_serial_port *port = tty->driver_data;
485 struct pl2303_private *priv = usb_get_serial_port_data(port);
486 int room = 0;
487 unsigned long flags;
489 dbg("%s - port %d", __func__, port->number);
491 spin_lock_irqsave(&priv->lock, flags);
492 room = pl2303_buf_space_avail(priv->buf);
493 spin_unlock_irqrestore(&priv->lock, flags);
495 dbg("%s - returns %d", __func__, room);
496 return room;
499 static int pl2303_chars_in_buffer(struct tty_struct *tty)
501 struct usb_serial_port *port = tty->driver_data;
502 struct pl2303_private *priv = usb_get_serial_port_data(port);
503 int chars = 0;
504 unsigned long flags;
506 dbg("%s - port %d", __func__, port->number);
508 spin_lock_irqsave(&priv->lock, flags);
509 chars = pl2303_buf_data_avail(priv->buf);
510 spin_unlock_irqrestore(&priv->lock, flags);
512 dbg("%s - returns %d", __func__, chars);
513 return chars;
516 static void pl2303_set_termios(struct tty_struct *tty,
517 struct usb_serial_port *port, struct ktermios *old_termios)
519 struct usb_serial *serial = port->serial;
520 struct pl2303_private *priv = usb_get_serial_port_data(port);
521 unsigned long flags;
522 unsigned int cflag;
523 unsigned char *buf;
524 int baud;
525 int i;
526 u8 control;
528 dbg("%s - port %d", __func__, port->number);
530 /* The PL2303 is reported to lose bytes if you change
531 serial settings even to the same values as before. Thus
532 we actually need to filter in this specific case */
534 if (!tty_termios_hw_change(tty->termios, old_termios))
535 return;
537 cflag = tty->termios->c_cflag;
539 buf = kzalloc(7, GFP_KERNEL);
540 if (!buf) {
541 dev_err(&port->dev, "%s - out of memory.\n", __func__);
542 /* Report back no change occurred */
543 *tty->termios = *old_termios;
544 return;
547 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
548 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
549 0, 0, buf, 7, 100);
550 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
551 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
553 if (cflag & CSIZE) {
554 switch (cflag & CSIZE) {
555 case CS5:
556 buf[6] = 5;
557 break;
558 case CS6:
559 buf[6] = 6;
560 break;
561 case CS7:
562 buf[6] = 7;
563 break;
564 default:
565 case CS8:
566 buf[6] = 8;
567 break;
569 dbg("%s - data bits = %d", __func__, buf[6]);
572 baud = tty_get_baud_rate(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(tty, baud, baud);
651 kfree(buf);
654 static void pl2303_close(struct tty_struct *tty,
655 struct usb_serial_port *port, struct file *filp)
657 struct pl2303_private *priv = usb_get_serial_port_data(port);
658 unsigned long flags;
659 unsigned int c_cflag;
660 int bps;
661 long timeout;
662 wait_queue_t wait;
664 dbg("%s - port %d", __func__, port->number);
666 /* wait for data to drain from the buffer */
667 spin_lock_irqsave(&priv->lock, flags);
668 timeout = PL2303_CLOSING_WAIT;
669 init_waitqueue_entry(&wait, current);
670 add_wait_queue(&tty->write_wait, &wait);
671 for (;;) {
672 set_current_state(TASK_INTERRUPTIBLE);
673 if (pl2303_buf_data_avail(priv->buf) == 0 ||
674 timeout == 0 || signal_pending(current) ||
675 port->serial->disconnected)
676 break;
677 spin_unlock_irqrestore(&priv->lock, flags);
678 timeout = schedule_timeout(timeout);
679 spin_lock_irqsave(&priv->lock, flags);
681 set_current_state(TASK_RUNNING);
682 remove_wait_queue(&tty->write_wait, &wait);
683 /* clear out any remaining data in the buffer */
684 pl2303_buf_clear(priv->buf);
685 spin_unlock_irqrestore(&priv->lock, flags);
687 /* wait for characters to drain from the device */
688 /* (this is long enough for the entire 256 byte */
689 /* pl2303 hardware buffer to drain with no flow */
690 /* control for data rates of 1200 bps or more, */
691 /* for lower rates we should really know how much */
692 /* data is in the buffer to compute a delay */
693 /* that is not unnecessarily long) */
694 bps = tty_get_baud_rate(tty);
695 if (bps > 1200)
696 timeout = max((HZ*2560)/bps, HZ/10);
697 else
698 timeout = 2*HZ;
699 schedule_timeout_interruptible(timeout);
701 /* shutdown our urbs */
702 dbg("%s - shutting down urbs", __func__);
703 usb_kill_urb(port->write_urb);
704 usb_kill_urb(port->read_urb);
705 usb_kill_urb(port->interrupt_in_urb);
707 if (tty) {
708 c_cflag = tty->termios->c_cflag;
709 if (c_cflag & HUPCL) {
710 /* drop DTR and RTS */
711 spin_lock_irqsave(&priv->lock, flags);
712 priv->line_control = 0;
713 spin_unlock_irqrestore(&priv->lock, flags);
714 set_control_lines(port->serial->dev, 0);
719 static int pl2303_open(struct tty_struct *tty,
720 struct usb_serial_port *port, struct file *filp)
722 struct ktermios tmp_termios;
723 struct usb_serial *serial = port->serial;
724 struct pl2303_private *priv = usb_get_serial_port_data(port);
725 int result;
727 dbg("%s - port %d", __func__, port->number);
729 if (priv->type != HX) {
730 usb_clear_halt(serial->dev, port->write_urb->pipe);
731 usb_clear_halt(serial->dev, port->read_urb->pipe);
732 } else {
733 /* reset upstream data pipes */
734 pl2303_vendor_write(8, 0, serial);
735 pl2303_vendor_write(9, 0, serial);
738 /* Setup termios */
739 if (tty)
740 pl2303_set_termios(tty, port, &tmp_termios);
742 /* FIXME: need to assert RTS and DTR if CRTSCTS off */
744 dbg("%s - submitting read urb", __func__);
745 port->read_urb->dev = serial->dev;
746 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
747 if (result) {
748 dev_err(&port->dev, "%s - failed submitting read urb,"
749 " error %d\n", __func__, result);
750 pl2303_close(tty, port, NULL);
751 return -EPROTO;
754 dbg("%s - submitting interrupt urb", __func__);
755 port->interrupt_in_urb->dev = serial->dev;
756 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
757 if (result) {
758 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
759 " error %d\n", __func__, result);
760 pl2303_close(tty, port, NULL);
761 return -EPROTO;
763 return 0;
766 static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
767 unsigned int set, unsigned int clear)
769 struct usb_serial_port *port = tty->driver_data;
770 struct pl2303_private *priv = usb_get_serial_port_data(port);
771 unsigned long flags;
772 u8 control;
774 if (!usb_get_intfdata(port->serial->interface))
775 return -ENODEV;
777 spin_lock_irqsave(&priv->lock, flags);
778 if (set & TIOCM_RTS)
779 priv->line_control |= CONTROL_RTS;
780 if (set & TIOCM_DTR)
781 priv->line_control |= CONTROL_DTR;
782 if (clear & TIOCM_RTS)
783 priv->line_control &= ~CONTROL_RTS;
784 if (clear & TIOCM_DTR)
785 priv->line_control &= ~CONTROL_DTR;
786 control = priv->line_control;
787 spin_unlock_irqrestore(&priv->lock, flags);
789 return set_control_lines(port->serial->dev, control);
792 static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
794 struct usb_serial_port *port = tty->driver_data;
795 struct pl2303_private *priv = usb_get_serial_port_data(port);
796 unsigned long flags;
797 unsigned int mcr;
798 unsigned int status;
799 unsigned int result;
801 dbg("%s (%d)", __func__, port->number);
803 if (!usb_get_intfdata(port->serial->interface))
804 return -ENODEV;
806 spin_lock_irqsave(&priv->lock, flags);
807 mcr = priv->line_control;
808 status = priv->line_status;
809 spin_unlock_irqrestore(&priv->lock, flags);
811 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
812 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
813 | ((status & UART_CTS) ? TIOCM_CTS : 0)
814 | ((status & UART_DSR) ? TIOCM_DSR : 0)
815 | ((status & UART_RING) ? TIOCM_RI : 0)
816 | ((status & UART_DCD) ? TIOCM_CD : 0);
818 dbg("%s - result = %x", __func__, result);
820 return result;
823 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
825 struct pl2303_private *priv = usb_get_serial_port_data(port);
826 unsigned long flags;
827 unsigned int prevstatus;
828 unsigned int status;
829 unsigned int changed;
831 spin_lock_irqsave(&priv->lock, flags);
832 prevstatus = priv->line_status;
833 spin_unlock_irqrestore(&priv->lock, flags);
835 while (1) {
836 interruptible_sleep_on(&priv->delta_msr_wait);
837 /* see if a signal did it */
838 if (signal_pending(current))
839 return -ERESTARTSYS;
841 spin_lock_irqsave(&priv->lock, flags);
842 status = priv->line_status;
843 spin_unlock_irqrestore(&priv->lock, flags);
845 changed = prevstatus ^ status;
847 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
848 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
849 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
850 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
851 return 0;
853 prevstatus = status;
855 /* NOTREACHED */
856 return 0;
859 static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
860 unsigned int cmd, unsigned long arg)
862 struct usb_serial_port *port = tty->driver_data;
863 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
865 switch (cmd) {
866 case TIOCMIWAIT:
867 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
868 return wait_modem_info(port, arg);
869 default:
870 dbg("%s not supported = 0x%04x", __func__, cmd);
871 break;
873 return -ENOIOCTLCMD;
876 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
878 struct usb_serial_port *port = tty->driver_data;
879 struct usb_serial *serial = port->serial;
880 u16 state;
881 int result;
883 dbg("%s - port %d", __func__, port->number);
885 if (break_state == 0)
886 state = BREAK_OFF;
887 else
888 state = BREAK_ON;
889 dbg("%s - turning break %s", __func__,
890 state == BREAK_OFF ? "off" : "on");
892 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
893 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
894 0, NULL, 0, 100);
895 if (result)
896 dbg("%s - error sending break = %d", __func__, result);
899 static void pl2303_shutdown(struct usb_serial *serial)
901 int i;
902 struct pl2303_private *priv;
904 dbg("%s", __func__);
906 for (i = 0; i < serial->num_ports; ++i) {
907 priv = usb_get_serial_port_data(serial->port[i]);
908 if (priv) {
909 pl2303_buf_free(priv->buf);
910 kfree(priv);
911 usb_set_serial_port_data(serial->port[i], NULL);
916 static void pl2303_update_line_status(struct usb_serial_port *port,
917 unsigned char *data,
918 unsigned int actual_length)
921 struct pl2303_private *priv = usb_get_serial_port_data(port);
922 unsigned long flags;
923 u8 status_idx = UART_STATE;
924 u8 length = UART_STATE + 1;
925 u16 idv, idp;
927 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
928 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
931 if (idv == SIEMENS_VENDOR_ID) {
932 if (idp == SIEMENS_PRODUCT_ID_X65 ||
933 idp == SIEMENS_PRODUCT_ID_SX1 ||
934 idp == SIEMENS_PRODUCT_ID_X75) {
936 length = 1;
937 status_idx = 0;
941 if (actual_length < length)
942 return;
944 /* Save off the uart status for others to look at */
945 spin_lock_irqsave(&priv->lock, flags);
946 priv->line_status = data[status_idx];
947 spin_unlock_irqrestore(&priv->lock, flags);
948 wake_up_interruptible(&priv->delta_msr_wait);
951 static void pl2303_read_int_callback(struct urb *urb)
953 struct usb_serial_port *port = urb->context;
954 unsigned char *data = urb->transfer_buffer;
955 unsigned int actual_length = urb->actual_length;
956 int status = urb->status;
957 int retval;
959 dbg("%s (%d)", __func__, port->number);
961 switch (status) {
962 case 0:
963 /* success */
964 break;
965 case -ECONNRESET:
966 case -ENOENT:
967 case -ESHUTDOWN:
968 /* this urb is terminated, clean up */
969 dbg("%s - urb shutting down with status: %d", __func__,
970 status);
971 return;
972 default:
973 dbg("%s - nonzero urb status received: %d", __func__,
974 status);
975 goto exit;
978 usb_serial_debug_data(debug, &port->dev, __func__,
979 urb->actual_length, urb->transfer_buffer);
981 pl2303_update_line_status(port, data, actual_length);
983 exit:
984 retval = usb_submit_urb(urb, GFP_ATOMIC);
985 if (retval)
986 dev_err(&urb->dev->dev,
987 "%s - usb_submit_urb failed with result %d\n",
988 __func__, retval);
991 static void pl2303_read_bulk_callback(struct urb *urb)
993 struct usb_serial_port *port = urb->context;
994 struct pl2303_private *priv = usb_get_serial_port_data(port);
995 struct tty_struct *tty;
996 unsigned char *data = urb->transfer_buffer;
997 unsigned long flags;
998 int i;
999 int result;
1000 int status = urb->status;
1001 u8 line_status;
1002 char tty_flag;
1004 dbg("%s - port %d", __func__, port->number);
1006 if (status) {
1007 dbg("%s - urb status = %d", __func__, status);
1008 if (!port->port.count) {
1009 dbg("%s - port is closed, exiting.", __func__);
1010 return;
1012 if (status == -EPROTO) {
1013 /* PL2303 mysteriously fails with -EPROTO reschedule
1014 * the read */
1015 dbg("%s - caught -EPROTO, resubmitting the urb",
1016 __func__);
1017 urb->dev = port->serial->dev;
1018 result = usb_submit_urb(urb, GFP_ATOMIC);
1019 if (result)
1020 dev_err(&urb->dev->dev, "%s - failed"
1021 " resubmitting read urb, error %d\n",
1022 __func__, result);
1023 return;
1025 dbg("%s - unable to handle the error, exiting.", __func__);
1026 return;
1029 usb_serial_debug_data(debug, &port->dev, __func__,
1030 urb->actual_length, data);
1032 /* get tty_flag from status */
1033 tty_flag = TTY_NORMAL;
1035 spin_lock_irqsave(&priv->lock, flags);
1036 line_status = priv->line_status;
1037 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1038 spin_unlock_irqrestore(&priv->lock, flags);
1039 wake_up_interruptible(&priv->delta_msr_wait);
1041 /* break takes precedence over parity, */
1042 /* which takes precedence over framing errors */
1043 if (line_status & UART_BREAK_ERROR)
1044 tty_flag = TTY_BREAK;
1045 else if (line_status & UART_PARITY_ERROR)
1046 tty_flag = TTY_PARITY;
1047 else if (line_status & UART_FRAME_ERROR)
1048 tty_flag = TTY_FRAME;
1049 dbg("%s - tty_flag = %d", __func__, tty_flag);
1051 tty = tty_port_tty_get(&port->port);
1052 if (tty && urb->actual_length) {
1053 tty_buffer_request_room(tty, urb->actual_length + 1);
1054 /* overrun is special, not associated with a char */
1055 if (line_status & UART_OVERRUN_ERROR)
1056 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1057 for (i = 0; i < urb->actual_length; ++i)
1058 tty_insert_flip_char(tty, data[i], tty_flag);
1059 tty_flip_buffer_push(tty);
1061 tty_kref_put(tty);
1062 /* Schedule the next read _if_ we are still open */
1063 if (port->port.count) {
1064 urb->dev = port->serial->dev;
1065 result = usb_submit_urb(urb, GFP_ATOMIC);
1066 if (result)
1067 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1068 " read urb, error %d\n", __func__, result);
1071 return;
1074 static void pl2303_write_bulk_callback(struct urb *urb)
1076 struct usb_serial_port *port = urb->context;
1077 struct pl2303_private *priv = usb_get_serial_port_data(port);
1078 int result;
1079 int status = urb->status;
1081 dbg("%s - port %d", __func__, port->number);
1083 switch (status) {
1084 case 0:
1085 /* success */
1086 break;
1087 case -ECONNRESET:
1088 case -ENOENT:
1089 case -ESHUTDOWN:
1090 /* this urb is terminated, clean up */
1091 dbg("%s - urb shutting down with status: %d", __func__,
1092 status);
1093 priv->write_urb_in_use = 0;
1094 return;
1095 default:
1096 /* error in the urb, so we have to resubmit it */
1097 dbg("%s - Overflow in write", __func__);
1098 dbg("%s - nonzero write bulk status received: %d", __func__,
1099 status);
1100 port->write_urb->transfer_buffer_length = 1;
1101 port->write_urb->dev = port->serial->dev;
1102 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1103 if (result)
1104 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1105 " urb, error %d\n", __func__, result);
1106 else
1107 return;
1110 priv->write_urb_in_use = 0;
1112 /* send any buffered data */
1113 pl2303_send(port);
1116 /* All of the device info needed for the PL2303 SIO serial converter */
1117 static struct usb_serial_driver pl2303_device = {
1118 .driver = {
1119 .owner = THIS_MODULE,
1120 .name = "pl2303",
1122 .id_table = id_table,
1123 .usb_driver = &pl2303_driver,
1124 .num_ports = 1,
1125 .open = pl2303_open,
1126 .close = pl2303_close,
1127 .write = pl2303_write,
1128 .ioctl = pl2303_ioctl,
1129 .break_ctl = pl2303_break_ctl,
1130 .set_termios = pl2303_set_termios,
1131 .tiocmget = pl2303_tiocmget,
1132 .tiocmset = pl2303_tiocmset,
1133 .read_bulk_callback = pl2303_read_bulk_callback,
1134 .read_int_callback = pl2303_read_int_callback,
1135 .write_bulk_callback = pl2303_write_bulk_callback,
1136 .write_room = pl2303_write_room,
1137 .chars_in_buffer = pl2303_chars_in_buffer,
1138 .attach = pl2303_startup,
1139 .shutdown = pl2303_shutdown,
1142 static int __init pl2303_init(void)
1144 int retval;
1146 retval = usb_serial_register(&pl2303_device);
1147 if (retval)
1148 goto failed_usb_serial_register;
1149 retval = usb_register(&pl2303_driver);
1150 if (retval)
1151 goto failed_usb_register;
1152 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1153 return 0;
1154 failed_usb_register:
1155 usb_serial_deregister(&pl2303_device);
1156 failed_usb_serial_register:
1157 return retval;
1160 static void __exit pl2303_exit(void)
1162 usb_deregister(&pl2303_driver);
1163 usb_serial_deregister(&pl2303_device);
1166 module_init(pl2303_init);
1167 module_exit(pl2303_exit);
1169 MODULE_DESCRIPTION(DRIVER_DESC);
1170 MODULE_LICENSE("GPL");
1172 module_param(debug, bool, S_IRUGO | S_IWUSR);
1173 MODULE_PARM_DESC(debug, "Debug enabled or not");