m68knommu: Add Coldfire DMA Timer support
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / usb / serial / pl2303.c
blob2c9c446ad625ded55144ad36955abc6bef07ddfa
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(HL340_VENDOR_ID, HL340_PRODUCT_ID) },
94 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
95 { } /* Terminating entry */
98 MODULE_DEVICE_TABLE(usb, id_table);
100 static struct usb_driver pl2303_driver = {
101 .name = "pl2303",
102 .probe = usb_serial_probe,
103 .disconnect = usb_serial_disconnect,
104 .id_table = id_table,
105 .suspend = usb_serial_suspend,
106 .resume = usb_serial_resume,
107 .no_dynamic_id = 1,
108 .supports_autosuspend = 1,
111 #define SET_LINE_REQUEST_TYPE 0x21
112 #define SET_LINE_REQUEST 0x20
114 #define SET_CONTROL_REQUEST_TYPE 0x21
115 #define SET_CONTROL_REQUEST 0x22
116 #define CONTROL_DTR 0x01
117 #define CONTROL_RTS 0x02
119 #define BREAK_REQUEST_TYPE 0x21
120 #define BREAK_REQUEST 0x23
121 #define BREAK_ON 0xffff
122 #define BREAK_OFF 0x0000
124 #define GET_LINE_REQUEST_TYPE 0xa1
125 #define GET_LINE_REQUEST 0x21
127 #define VENDOR_WRITE_REQUEST_TYPE 0x40
128 #define VENDOR_WRITE_REQUEST 0x01
130 #define VENDOR_READ_REQUEST_TYPE 0xc0
131 #define VENDOR_READ_REQUEST 0x01
133 #define UART_STATE 0x08
134 #define UART_STATE_TRANSIENT_MASK 0x74
135 #define UART_DCD 0x01
136 #define UART_DSR 0x02
137 #define UART_BREAK_ERROR 0x04
138 #define UART_RING 0x08
139 #define UART_FRAME_ERROR 0x10
140 #define UART_PARITY_ERROR 0x20
141 #define UART_OVERRUN_ERROR 0x40
142 #define UART_CTS 0x80
145 enum pl2303_type {
146 type_0, /* don't know the difference between type 0 and */
147 type_1, /* type 1, until someone from prolific tells us... */
148 HX, /* HX version of the pl2303 chip */
151 struct pl2303_private {
152 spinlock_t lock;
153 struct pl2303_buf *buf;
154 int write_urb_in_use;
155 wait_queue_head_t delta_msr_wait;
156 u8 line_control;
157 u8 line_status;
158 u8 termios_initialized;
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 spin_lock_irqsave(&priv->lock, flags);
531 if (!priv->termios_initialized) {
532 *(tty->termios) = tty_std_termios;
533 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
534 tty->termios->c_ispeed = 9600;
535 tty->termios->c_ospeed = 9600;
536 priv->termios_initialized = 1;
538 spin_unlock_irqrestore(&priv->lock, flags);
540 /* The PL2303 is reported to lose bytes if you change
541 serial settings even to the same values as before. Thus
542 we actually need to filter in this specific case */
544 if (!tty_termios_hw_change(tty->termios, old_termios))
545 return;
547 cflag = tty->termios->c_cflag;
549 buf = kzalloc(7, GFP_KERNEL);
550 if (!buf) {
551 dev_err(&port->dev, "%s - out of memory.\n", __func__);
552 /* Report back no change occurred */
553 *tty->termios = *old_termios;
554 return;
557 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
558 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
559 0, 0, buf, 7, 100);
560 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
561 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
563 if (cflag & CSIZE) {
564 switch (cflag & CSIZE) {
565 case CS5:
566 buf[6] = 5;
567 break;
568 case CS6:
569 buf[6] = 6;
570 break;
571 case CS7:
572 buf[6] = 7;
573 break;
574 default:
575 case CS8:
576 buf[6] = 8;
577 break;
579 dbg("%s - data bits = %d", __func__, buf[6]);
582 baud = tty_get_baud_rate(tty);
583 dbg("%s - baud = %d", __func__, baud);
584 if (baud) {
585 buf[0] = baud & 0xff;
586 buf[1] = (baud >> 8) & 0xff;
587 buf[2] = (baud >> 16) & 0xff;
588 buf[3] = (baud >> 24) & 0xff;
591 /* For reference buf[4]=0 is 1 stop bits */
592 /* For reference buf[4]=1 is 1.5 stop bits */
593 /* For reference buf[4]=2 is 2 stop bits */
594 if (cflag & CSTOPB) {
595 buf[4] = 2;
596 dbg("%s - stop bits = 2", __func__);
597 } else {
598 buf[4] = 0;
599 dbg("%s - stop bits = 1", __func__);
602 if (cflag & PARENB) {
603 /* For reference buf[5]=0 is none parity */
604 /* For reference buf[5]=1 is odd parity */
605 /* For reference buf[5]=2 is even parity */
606 /* For reference buf[5]=3 is mark parity */
607 /* For reference buf[5]=4 is space parity */
608 if (cflag & PARODD) {
609 buf[5] = 1;
610 dbg("%s - parity = odd", __func__);
611 } else {
612 buf[5] = 2;
613 dbg("%s - parity = even", __func__);
615 } else {
616 buf[5] = 0;
617 dbg("%s - parity = none", __func__);
620 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
621 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
622 0, 0, buf, 7, 100);
623 dbg("0x21:0x20:0:0 %d", i);
625 /* change control lines if we are switching to or from B0 */
626 spin_lock_irqsave(&priv->lock, flags);
627 control = priv->line_control;
628 if ((cflag & CBAUD) == B0)
629 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
630 else
631 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
632 if (control != priv->line_control) {
633 control = priv->line_control;
634 spin_unlock_irqrestore(&priv->lock, flags);
635 set_control_lines(serial->dev, control);
636 } else {
637 spin_unlock_irqrestore(&priv->lock, flags);
640 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
642 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
643 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
644 0, 0, buf, 7, 100);
645 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
646 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
648 if (cflag & CRTSCTS) {
649 if (priv->type == HX)
650 pl2303_vendor_write(0x0, 0x61, serial);
651 else
652 pl2303_vendor_write(0x0, 0x41, serial);
653 } else {
654 pl2303_vendor_write(0x0, 0x0, serial);
657 /* FIXME: Need to read back resulting baud rate */
658 if (baud)
659 tty_encode_baud_rate(tty, baud, baud);
661 kfree(buf);
664 static void pl2303_close(struct tty_struct *tty,
665 struct usb_serial_port *port, struct file *filp)
667 struct pl2303_private *priv = usb_get_serial_port_data(port);
668 unsigned long flags;
669 unsigned int c_cflag;
670 int bps;
671 long timeout;
672 wait_queue_t wait;
674 dbg("%s - port %d", __func__, port->number);
676 /* wait for data to drain from the buffer */
677 spin_lock_irqsave(&priv->lock, flags);
678 timeout = PL2303_CLOSING_WAIT;
679 init_waitqueue_entry(&wait, current);
680 add_wait_queue(&tty->write_wait, &wait);
681 for (;;) {
682 set_current_state(TASK_INTERRUPTIBLE);
683 if (pl2303_buf_data_avail(priv->buf) == 0 ||
684 timeout == 0 || signal_pending(current) ||
685 port->serial->disconnected)
686 break;
687 spin_unlock_irqrestore(&priv->lock, flags);
688 timeout = schedule_timeout(timeout);
689 spin_lock_irqsave(&priv->lock, flags);
691 set_current_state(TASK_RUNNING);
692 remove_wait_queue(&tty->write_wait, &wait);
693 /* clear out any remaining data in the buffer */
694 pl2303_buf_clear(priv->buf);
695 spin_unlock_irqrestore(&priv->lock, flags);
697 /* wait for characters to drain from the device */
698 /* (this is long enough for the entire 256 byte */
699 /* pl2303 hardware buffer to drain with no flow */
700 /* control for data rates of 1200 bps or more, */
701 /* for lower rates we should really know how much */
702 /* data is in the buffer to compute a delay */
703 /* that is not unnecessarily long) */
704 bps = tty_get_baud_rate(tty);
705 if (bps > 1200)
706 timeout = max((HZ*2560)/bps, HZ/10);
707 else
708 timeout = 2*HZ;
709 schedule_timeout_interruptible(timeout);
711 /* shutdown our urbs */
712 dbg("%s - shutting down urbs", __func__);
713 usb_kill_urb(port->write_urb);
714 usb_kill_urb(port->read_urb);
715 usb_kill_urb(port->interrupt_in_urb);
717 if (tty) {
718 c_cflag = tty->termios->c_cflag;
719 if (c_cflag & HUPCL) {
720 /* drop DTR and RTS */
721 spin_lock_irqsave(&priv->lock, flags);
722 priv->line_control = 0;
723 spin_unlock_irqrestore(&priv->lock, flags);
724 set_control_lines(port->serial->dev, 0);
729 static int pl2303_open(struct tty_struct *tty,
730 struct usb_serial_port *port, struct file *filp)
732 struct ktermios tmp_termios;
733 struct usb_serial *serial = port->serial;
734 struct pl2303_private *priv = usb_get_serial_port_data(port);
735 int result;
737 dbg("%s - port %d", __func__, port->number);
739 if (priv->type != HX) {
740 usb_clear_halt(serial->dev, port->write_urb->pipe);
741 usb_clear_halt(serial->dev, port->read_urb->pipe);
742 } else {
743 /* reset upstream data pipes */
744 pl2303_vendor_write(8, 0, serial);
745 pl2303_vendor_write(9, 0, serial);
748 /* Setup termios */
749 if (tty)
750 pl2303_set_termios(tty, port, &tmp_termios);
752 /* FIXME: need to assert RTS and DTR if CRTSCTS off */
754 dbg("%s - submitting read urb", __func__);
755 port->read_urb->dev = serial->dev;
756 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
757 if (result) {
758 dev_err(&port->dev, "%s - failed submitting read urb,"
759 " error %d\n", __func__, result);
760 pl2303_close(tty, port, NULL);
761 return -EPROTO;
764 dbg("%s - submitting interrupt urb", __func__);
765 port->interrupt_in_urb->dev = serial->dev;
766 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
767 if (result) {
768 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
769 " error %d\n", __func__, result);
770 pl2303_close(tty, port, NULL);
771 return -EPROTO;
773 return 0;
776 static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
777 unsigned int set, unsigned int clear)
779 struct usb_serial_port *port = tty->driver_data;
780 struct pl2303_private *priv = usb_get_serial_port_data(port);
781 unsigned long flags;
782 u8 control;
784 if (!usb_get_intfdata(port->serial->interface))
785 return -ENODEV;
787 spin_lock_irqsave(&priv->lock, flags);
788 if (set & TIOCM_RTS)
789 priv->line_control |= CONTROL_RTS;
790 if (set & TIOCM_DTR)
791 priv->line_control |= CONTROL_DTR;
792 if (clear & TIOCM_RTS)
793 priv->line_control &= ~CONTROL_RTS;
794 if (clear & TIOCM_DTR)
795 priv->line_control &= ~CONTROL_DTR;
796 control = priv->line_control;
797 spin_unlock_irqrestore(&priv->lock, flags);
799 return set_control_lines(port->serial->dev, control);
802 static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
804 struct usb_serial_port *port = tty->driver_data;
805 struct pl2303_private *priv = usb_get_serial_port_data(port);
806 unsigned long flags;
807 unsigned int mcr;
808 unsigned int status;
809 unsigned int result;
811 dbg("%s (%d)", __func__, port->number);
813 if (!usb_get_intfdata(port->serial->interface))
814 return -ENODEV;
816 spin_lock_irqsave(&priv->lock, flags);
817 mcr = priv->line_control;
818 status = priv->line_status;
819 spin_unlock_irqrestore(&priv->lock, flags);
821 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
822 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
823 | ((status & UART_CTS) ? TIOCM_CTS : 0)
824 | ((status & UART_DSR) ? TIOCM_DSR : 0)
825 | ((status & UART_RING) ? TIOCM_RI : 0)
826 | ((status & UART_DCD) ? TIOCM_CD : 0);
828 dbg("%s - result = %x", __func__, result);
830 return result;
833 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
835 struct pl2303_private *priv = usb_get_serial_port_data(port);
836 unsigned long flags;
837 unsigned int prevstatus;
838 unsigned int status;
839 unsigned int changed;
841 spin_lock_irqsave(&priv->lock, flags);
842 prevstatus = priv->line_status;
843 spin_unlock_irqrestore(&priv->lock, flags);
845 while (1) {
846 interruptible_sleep_on(&priv->delta_msr_wait);
847 /* see if a signal did it */
848 if (signal_pending(current))
849 return -ERESTARTSYS;
851 spin_lock_irqsave(&priv->lock, flags);
852 status = priv->line_status;
853 spin_unlock_irqrestore(&priv->lock, flags);
855 changed = prevstatus ^ status;
857 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
858 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
859 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
860 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
861 return 0;
863 prevstatus = status;
865 /* NOTREACHED */
866 return 0;
869 static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
870 unsigned int cmd, unsigned long arg)
872 struct usb_serial_port *port = tty->driver_data;
873 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
875 switch (cmd) {
876 case TIOCMIWAIT:
877 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
878 return wait_modem_info(port, arg);
879 default:
880 dbg("%s not supported = 0x%04x", __func__, cmd);
881 break;
883 return -ENOIOCTLCMD;
886 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
888 struct usb_serial_port *port = tty->driver_data;
889 struct usb_serial *serial = port->serial;
890 u16 state;
891 int result;
893 dbg("%s - port %d", __func__, port->number);
895 if (break_state == 0)
896 state = BREAK_OFF;
897 else
898 state = BREAK_ON;
899 dbg("%s - turning break %s", __func__,
900 state == BREAK_OFF ? "off" : "on");
902 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
903 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
904 0, NULL, 0, 100);
905 if (result)
906 dbg("%s - error sending break = %d", __func__, result);
909 static void pl2303_shutdown(struct usb_serial *serial)
911 int i;
912 struct pl2303_private *priv;
914 dbg("%s", __func__);
916 for (i = 0; i < serial->num_ports; ++i) {
917 priv = usb_get_serial_port_data(serial->port[i]);
918 if (priv) {
919 pl2303_buf_free(priv->buf);
920 kfree(priv);
921 usb_set_serial_port_data(serial->port[i], NULL);
926 static void pl2303_update_line_status(struct usb_serial_port *port,
927 unsigned char *data,
928 unsigned int actual_length)
931 struct pl2303_private *priv = usb_get_serial_port_data(port);
932 unsigned long flags;
933 u8 status_idx = UART_STATE;
934 u8 length = UART_STATE + 1;
935 u16 idv, idp;
937 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
938 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
941 if (idv == SIEMENS_VENDOR_ID) {
942 if (idp == SIEMENS_PRODUCT_ID_X65 ||
943 idp == SIEMENS_PRODUCT_ID_SX1 ||
944 idp == SIEMENS_PRODUCT_ID_X75) {
946 length = 1;
947 status_idx = 0;
951 if (actual_length < length)
952 return;
954 /* Save off the uart status for others to look at */
955 spin_lock_irqsave(&priv->lock, flags);
956 priv->line_status = data[status_idx];
957 spin_unlock_irqrestore(&priv->lock, flags);
958 wake_up_interruptible(&priv->delta_msr_wait);
961 static void pl2303_read_int_callback(struct urb *urb)
963 struct usb_serial_port *port = urb->context;
964 unsigned char *data = urb->transfer_buffer;
965 unsigned int actual_length = urb->actual_length;
966 int status = urb->status;
967 int retval;
969 dbg("%s (%d)", __func__, port->number);
971 switch (status) {
972 case 0:
973 /* success */
974 break;
975 case -ECONNRESET:
976 case -ENOENT:
977 case -ESHUTDOWN:
978 /* this urb is terminated, clean up */
979 dbg("%s - urb shutting down with status: %d", __func__,
980 status);
981 return;
982 default:
983 dbg("%s - nonzero urb status received: %d", __func__,
984 status);
985 goto exit;
988 usb_serial_debug_data(debug, &port->dev, __func__,
989 urb->actual_length, urb->transfer_buffer);
991 pl2303_update_line_status(port, data, actual_length);
993 exit:
994 retval = usb_submit_urb(urb, GFP_ATOMIC);
995 if (retval)
996 dev_err(&urb->dev->dev,
997 "%s - usb_submit_urb failed with result %d\n",
998 __func__, retval);
1001 static void pl2303_read_bulk_callback(struct urb *urb)
1003 struct usb_serial_port *port = urb->context;
1004 struct pl2303_private *priv = usb_get_serial_port_data(port);
1005 struct tty_struct *tty;
1006 unsigned char *data = urb->transfer_buffer;
1007 unsigned long flags;
1008 int i;
1009 int result;
1010 int status = urb->status;
1011 u8 line_status;
1012 char tty_flag;
1014 dbg("%s - port %d", __func__, port->number);
1016 if (status) {
1017 dbg("%s - urb status = %d", __func__, status);
1018 if (!port->port.count) {
1019 dbg("%s - port is closed, exiting.", __func__);
1020 return;
1022 if (status == -EPROTO) {
1023 /* PL2303 mysteriously fails with -EPROTO reschedule
1024 * the read */
1025 dbg("%s - caught -EPROTO, resubmitting the urb",
1026 __func__);
1027 urb->dev = port->serial->dev;
1028 result = usb_submit_urb(urb, GFP_ATOMIC);
1029 if (result)
1030 dev_err(&urb->dev->dev, "%s - failed"
1031 " resubmitting read urb, error %d\n",
1032 __func__, result);
1033 return;
1035 dbg("%s - unable to handle the error, exiting.", __func__);
1036 return;
1039 usb_serial_debug_data(debug, &port->dev, __func__,
1040 urb->actual_length, data);
1042 /* get tty_flag from status */
1043 tty_flag = TTY_NORMAL;
1045 spin_lock_irqsave(&priv->lock, flags);
1046 line_status = priv->line_status;
1047 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1048 spin_unlock_irqrestore(&priv->lock, flags);
1049 wake_up_interruptible(&priv->delta_msr_wait);
1051 /* break takes precedence over parity, */
1052 /* which takes precedence over framing errors */
1053 if (line_status & UART_BREAK_ERROR)
1054 tty_flag = TTY_BREAK;
1055 else if (line_status & UART_PARITY_ERROR)
1056 tty_flag = TTY_PARITY;
1057 else if (line_status & UART_FRAME_ERROR)
1058 tty_flag = TTY_FRAME;
1059 dbg("%s - tty_flag = %d", __func__, tty_flag);
1061 tty = port->port.tty;
1062 if (tty && urb->actual_length) {
1063 tty_buffer_request_room(tty, urb->actual_length + 1);
1064 /* overrun is special, not associated with a char */
1065 if (line_status & UART_OVERRUN_ERROR)
1066 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1067 for (i = 0; i < urb->actual_length; ++i)
1068 tty_insert_flip_char(tty, data[i], tty_flag);
1069 tty_flip_buffer_push(tty);
1072 /* Schedule the next read _if_ we are still open */
1073 if (port->port.count) {
1074 urb->dev = port->serial->dev;
1075 result = usb_submit_urb(urb, GFP_ATOMIC);
1076 if (result)
1077 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1078 " read urb, error %d\n", __func__, result);
1081 return;
1084 static void pl2303_write_bulk_callback(struct urb *urb)
1086 struct usb_serial_port *port = urb->context;
1087 struct pl2303_private *priv = usb_get_serial_port_data(port);
1088 int result;
1089 int status = urb->status;
1091 dbg("%s - port %d", __func__, port->number);
1093 switch (status) {
1094 case 0:
1095 /* success */
1096 break;
1097 case -ECONNRESET:
1098 case -ENOENT:
1099 case -ESHUTDOWN:
1100 /* this urb is terminated, clean up */
1101 dbg("%s - urb shutting down with status: %d", __func__,
1102 status);
1103 priv->write_urb_in_use = 0;
1104 return;
1105 default:
1106 /* error in the urb, so we have to resubmit it */
1107 dbg("%s - Overflow in write", __func__);
1108 dbg("%s - nonzero write bulk status received: %d", __func__,
1109 status);
1110 port->write_urb->transfer_buffer_length = 1;
1111 port->write_urb->dev = port->serial->dev;
1112 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1113 if (result)
1114 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1115 " urb, error %d\n", __func__, result);
1116 else
1117 return;
1120 priv->write_urb_in_use = 0;
1122 /* send any buffered data */
1123 pl2303_send(port);
1126 /* All of the device info needed for the PL2303 SIO serial converter */
1127 static struct usb_serial_driver pl2303_device = {
1128 .driver = {
1129 .owner = THIS_MODULE,
1130 .name = "pl2303",
1132 .id_table = id_table,
1133 .usb_driver = &pl2303_driver,
1134 .num_ports = 1,
1135 .open = pl2303_open,
1136 .close = pl2303_close,
1137 .write = pl2303_write,
1138 .ioctl = pl2303_ioctl,
1139 .break_ctl = pl2303_break_ctl,
1140 .set_termios = pl2303_set_termios,
1141 .tiocmget = pl2303_tiocmget,
1142 .tiocmset = pl2303_tiocmset,
1143 .read_bulk_callback = pl2303_read_bulk_callback,
1144 .read_int_callback = pl2303_read_int_callback,
1145 .write_bulk_callback = pl2303_write_bulk_callback,
1146 .write_room = pl2303_write_room,
1147 .chars_in_buffer = pl2303_chars_in_buffer,
1148 .attach = pl2303_startup,
1149 .shutdown = pl2303_shutdown,
1152 static int __init pl2303_init(void)
1154 int retval;
1156 retval = usb_serial_register(&pl2303_device);
1157 if (retval)
1158 goto failed_usb_serial_register;
1159 retval = usb_register(&pl2303_driver);
1160 if (retval)
1161 goto failed_usb_register;
1162 info(DRIVER_DESC);
1163 return 0;
1164 failed_usb_register:
1165 usb_serial_deregister(&pl2303_device);
1166 failed_usb_serial_register:
1167 return retval;
1170 static void __exit pl2303_exit(void)
1172 usb_deregister(&pl2303_driver);
1173 usb_serial_deregister(&pl2303_device);
1176 module_init(pl2303_init);
1177 module_exit(pl2303_exit);
1179 MODULE_DESCRIPTION(DRIVER_DESC);
1180 MODULE_LICENSE("GPL");
1182 module_param(debug, bool, S_IRUGO | S_IWUSR);
1183 MODULE_PARM_DESC(debug, "Debug enabled or not");