USB: omninet: fix write_room
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / usb / serial / pl2303.c
blob9f89940e9936ce2cabd477338dac4f9de9424151
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(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
63 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
64 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
65 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
66 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
67 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
68 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
69 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
70 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
71 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
72 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
73 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
74 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
75 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
76 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
77 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
78 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
79 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
80 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
81 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
82 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
83 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
84 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
85 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
86 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
87 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
88 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
89 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
90 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
91 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
92 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
93 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
94 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
95 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
96 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
97 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
98 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
99 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
100 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
101 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
102 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
103 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
104 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
105 { } /* Terminating entry */
108 MODULE_DEVICE_TABLE(usb, id_table);
110 static struct usb_driver pl2303_driver = {
111 .name = "pl2303",
112 .probe = usb_serial_probe,
113 .disconnect = usb_serial_disconnect,
114 .id_table = id_table,
115 .suspend = usb_serial_suspend,
116 .resume = usb_serial_resume,
117 .no_dynamic_id = 1,
118 .supports_autosuspend = 1,
121 #define SET_LINE_REQUEST_TYPE 0x21
122 #define SET_LINE_REQUEST 0x20
124 #define SET_CONTROL_REQUEST_TYPE 0x21
125 #define SET_CONTROL_REQUEST 0x22
126 #define CONTROL_DTR 0x01
127 #define CONTROL_RTS 0x02
129 #define BREAK_REQUEST_TYPE 0x21
130 #define BREAK_REQUEST 0x23
131 #define BREAK_ON 0xffff
132 #define BREAK_OFF 0x0000
134 #define GET_LINE_REQUEST_TYPE 0xa1
135 #define GET_LINE_REQUEST 0x21
137 #define VENDOR_WRITE_REQUEST_TYPE 0x40
138 #define VENDOR_WRITE_REQUEST 0x01
140 #define VENDOR_READ_REQUEST_TYPE 0xc0
141 #define VENDOR_READ_REQUEST 0x01
143 #define UART_STATE 0x08
144 #define UART_STATE_TRANSIENT_MASK 0x74
145 #define UART_DCD 0x01
146 #define UART_DSR 0x02
147 #define UART_BREAK_ERROR 0x04
148 #define UART_RING 0x08
149 #define UART_FRAME_ERROR 0x10
150 #define UART_PARITY_ERROR 0x20
151 #define UART_OVERRUN_ERROR 0x40
152 #define UART_CTS 0x80
155 enum pl2303_type {
156 type_0, /* don't know the difference between type 0 and */
157 type_1, /* type 1, until someone from prolific tells us... */
158 HX, /* HX version of the pl2303 chip */
161 struct pl2303_private {
162 spinlock_t lock;
163 struct pl2303_buf *buf;
164 int write_urb_in_use;
165 wait_queue_head_t delta_msr_wait;
166 u8 line_control;
167 u8 line_status;
168 enum pl2303_type type;
172 * pl2303_buf_alloc
174 * Allocate a circular buffer and all associated memory.
176 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
178 struct pl2303_buf *pb;
180 if (size == 0)
181 return NULL;
183 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
184 if (pb == NULL)
185 return NULL;
187 pb->buf_buf = kmalloc(size, GFP_KERNEL);
188 if (pb->buf_buf == NULL) {
189 kfree(pb);
190 return NULL;
193 pb->buf_size = size;
194 pb->buf_get = pb->buf_put = pb->buf_buf;
196 return pb;
200 * pl2303_buf_free
202 * Free the buffer and all associated memory.
204 static void pl2303_buf_free(struct pl2303_buf *pb)
206 if (pb) {
207 kfree(pb->buf_buf);
208 kfree(pb);
213 * pl2303_buf_clear
215 * Clear out all data in the circular buffer.
217 static void pl2303_buf_clear(struct pl2303_buf *pb)
219 if (pb != NULL)
220 pb->buf_get = pb->buf_put;
221 /* equivalent to a get of all data available */
225 * pl2303_buf_data_avail
227 * Return the number of bytes of data available in the circular
228 * buffer.
230 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
232 if (pb == NULL)
233 return 0;
235 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
239 * pl2303_buf_space_avail
241 * Return the number of bytes of space available in the circular
242 * buffer.
244 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
246 if (pb == NULL)
247 return 0;
249 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
253 * pl2303_buf_put
255 * Copy data data from a user buffer and put it into the circular buffer.
256 * Restrict to the amount of space available.
258 * Return the number of bytes copied.
260 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
261 unsigned int count)
263 unsigned int len;
265 if (pb == NULL)
266 return 0;
268 len = pl2303_buf_space_avail(pb);
269 if (count > len)
270 count = len;
272 if (count == 0)
273 return 0;
275 len = pb->buf_buf + pb->buf_size - pb->buf_put;
276 if (count > len) {
277 memcpy(pb->buf_put, buf, len);
278 memcpy(pb->buf_buf, buf+len, count - len);
279 pb->buf_put = pb->buf_buf + count - len;
280 } else {
281 memcpy(pb->buf_put, buf, count);
282 if (count < len)
283 pb->buf_put += count;
284 else /* count == len */
285 pb->buf_put = pb->buf_buf;
288 return count;
292 * pl2303_buf_get
294 * Get data from the circular buffer and copy to the given buffer.
295 * Restrict to the amount of data available.
297 * Return the number of bytes copied.
299 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
300 unsigned int count)
302 unsigned int len;
304 if (pb == NULL)
305 return 0;
307 len = pl2303_buf_data_avail(pb);
308 if (count > len)
309 count = len;
311 if (count == 0)
312 return 0;
314 len = pb->buf_buf + pb->buf_size - pb->buf_get;
315 if (count > len) {
316 memcpy(buf, pb->buf_get, len);
317 memcpy(buf+len, pb->buf_buf, count - len);
318 pb->buf_get = pb->buf_buf + count - len;
319 } else {
320 memcpy(buf, pb->buf_get, count);
321 if (count < len)
322 pb->buf_get += count;
323 else /* count == len */
324 pb->buf_get = pb->buf_buf;
327 return count;
330 static int pl2303_vendor_read(__u16 value, __u16 index,
331 struct usb_serial *serial, unsigned char *buf)
333 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
334 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
335 value, index, buf, 1, 100);
336 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
337 VENDOR_READ_REQUEST, value, index, res, buf[0]);
338 return res;
341 static int pl2303_vendor_write(__u16 value, __u16 index,
342 struct usb_serial *serial)
344 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
345 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
346 value, index, NULL, 0, 100);
347 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
348 VENDOR_WRITE_REQUEST, value, index, res);
349 return res;
352 static int pl2303_startup(struct usb_serial *serial)
354 struct pl2303_private *priv;
355 enum pl2303_type type = type_0;
356 unsigned char *buf;
357 int i;
359 buf = kmalloc(10, GFP_KERNEL);
360 if (buf == NULL)
361 return -ENOMEM;
363 if (serial->dev->descriptor.bDeviceClass == 0x02)
364 type = type_0;
365 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
366 type = HX;
367 else if (serial->dev->descriptor.bDeviceClass == 0x00)
368 type = type_1;
369 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
370 type = type_1;
371 dbg("device type: %d", type);
373 for (i = 0; i < serial->num_ports; ++i) {
374 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
375 if (!priv)
376 goto cleanup;
377 spin_lock_init(&priv->lock);
378 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
379 if (priv->buf == NULL) {
380 kfree(priv);
381 goto cleanup;
383 init_waitqueue_head(&priv->delta_msr_wait);
384 priv->type = type;
385 usb_set_serial_port_data(serial->port[i], priv);
388 pl2303_vendor_read(0x8484, 0, serial, buf);
389 pl2303_vendor_write(0x0404, 0, serial);
390 pl2303_vendor_read(0x8484, 0, serial, buf);
391 pl2303_vendor_read(0x8383, 0, serial, buf);
392 pl2303_vendor_read(0x8484, 0, serial, buf);
393 pl2303_vendor_write(0x0404, 1, serial);
394 pl2303_vendor_read(0x8484, 0, serial, buf);
395 pl2303_vendor_read(0x8383, 0, serial, buf);
396 pl2303_vendor_write(0, 1, serial);
397 pl2303_vendor_write(1, 0, serial);
398 if (type == HX)
399 pl2303_vendor_write(2, 0x44, serial);
400 else
401 pl2303_vendor_write(2, 0x24, serial);
403 kfree(buf);
404 return 0;
406 cleanup:
407 kfree(buf);
408 for (--i; i >= 0; --i) {
409 priv = usb_get_serial_port_data(serial->port[i]);
410 pl2303_buf_free(priv->buf);
411 kfree(priv);
412 usb_set_serial_port_data(serial->port[i], NULL);
414 return -ENOMEM;
417 static int set_control_lines(struct usb_device *dev, u8 value)
419 int retval;
421 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
422 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
423 value, 0, NULL, 0, 100);
424 dbg("%s - value = %d, retval = %d", __func__, value, retval);
425 return retval;
428 static void pl2303_send(struct usb_serial_port *port)
430 int count, result;
431 struct pl2303_private *priv = usb_get_serial_port_data(port);
432 unsigned long flags;
434 dbg("%s - port %d", __func__, port->number);
436 spin_lock_irqsave(&priv->lock, flags);
438 if (priv->write_urb_in_use) {
439 spin_unlock_irqrestore(&priv->lock, flags);
440 return;
443 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
444 port->bulk_out_size);
446 if (count == 0) {
447 spin_unlock_irqrestore(&priv->lock, flags);
448 return;
451 priv->write_urb_in_use = 1;
453 spin_unlock_irqrestore(&priv->lock, flags);
455 usb_serial_debug_data(debug, &port->dev, __func__, count,
456 port->write_urb->transfer_buffer);
458 port->write_urb->transfer_buffer_length = count;
459 port->write_urb->dev = port->serial->dev;
460 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
461 if (result) {
462 dev_err(&port->dev, "%s - failed submitting write urb,"
463 " error %d\n", __func__, result);
464 priv->write_urb_in_use = 0;
465 /* TODO: reschedule pl2303_send */
468 usb_serial_port_softint(port);
471 static int pl2303_write(struct tty_struct *tty, struct usb_serial_port *port,
472 const unsigned char *buf, int count)
474 struct pl2303_private *priv = usb_get_serial_port_data(port);
475 unsigned long flags;
477 dbg("%s - port %d, %d bytes", __func__, port->number, count);
479 if (!count)
480 return count;
482 spin_lock_irqsave(&priv->lock, flags);
483 count = pl2303_buf_put(priv->buf, buf, count);
484 spin_unlock_irqrestore(&priv->lock, flags);
486 pl2303_send(port);
488 return count;
491 static int pl2303_write_room(struct tty_struct *tty)
493 struct usb_serial_port *port = tty->driver_data;
494 struct pl2303_private *priv = usb_get_serial_port_data(port);
495 int room = 0;
496 unsigned long flags;
498 dbg("%s - port %d", __func__, port->number);
500 spin_lock_irqsave(&priv->lock, flags);
501 room = pl2303_buf_space_avail(priv->buf);
502 spin_unlock_irqrestore(&priv->lock, flags);
504 dbg("%s - returns %d", __func__, room);
505 return room;
508 static int pl2303_chars_in_buffer(struct tty_struct *tty)
510 struct usb_serial_port *port = tty->driver_data;
511 struct pl2303_private *priv = usb_get_serial_port_data(port);
512 int chars = 0;
513 unsigned long flags;
515 dbg("%s - port %d", __func__, port->number);
517 spin_lock_irqsave(&priv->lock, flags);
518 chars = pl2303_buf_data_avail(priv->buf);
519 spin_unlock_irqrestore(&priv->lock, flags);
521 dbg("%s - returns %d", __func__, chars);
522 return chars;
525 static void pl2303_set_termios(struct tty_struct *tty,
526 struct usb_serial_port *port, struct ktermios *old_termios)
528 struct usb_serial *serial = port->serial;
529 struct pl2303_private *priv = usb_get_serial_port_data(port);
530 unsigned long flags;
531 unsigned int cflag;
532 unsigned char *buf;
533 int baud;
534 int i;
535 u8 control;
536 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
537 4800, 7200, 9600, 14400, 19200, 28800, 38400,
538 57600, 115200, 230400, 460800, 614400,
539 921600, 1228800, 2457600, 3000000, 6000000 };
540 int baud_floor, baud_ceil;
541 int k;
543 dbg("%s - port %d", __func__, port->number);
545 /* The PL2303 is reported to lose bytes if you change
546 serial settings even to the same values as before. Thus
547 we actually need to filter in this specific case */
549 if (!tty_termios_hw_change(tty->termios, old_termios))
550 return;
552 cflag = tty->termios->c_cflag;
554 buf = kzalloc(7, GFP_KERNEL);
555 if (!buf) {
556 dev_err(&port->dev, "%s - out of memory.\n", __func__);
557 /* Report back no change occurred */
558 *tty->termios = *old_termios;
559 return;
562 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
563 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
564 0, 0, buf, 7, 100);
565 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
566 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
568 if (cflag & CSIZE) {
569 switch (cflag & CSIZE) {
570 case CS5:
571 buf[6] = 5;
572 break;
573 case CS6:
574 buf[6] = 6;
575 break;
576 case CS7:
577 buf[6] = 7;
578 break;
579 default:
580 case CS8:
581 buf[6] = 8;
582 break;
584 dbg("%s - data bits = %d", __func__, buf[6]);
587 /* For reference buf[0]:buf[3] baud rate value */
588 /* NOTE: Only the values defined in baud_sup are supported !
589 * => if unsupported values are set, the PL2303 seems to use
590 * 9600 baud (at least my PL2303X always does)
592 baud = tty_get_baud_rate(tty);
593 dbg("%s - baud requested = %d", __func__, baud);
594 if (baud) {
595 /* Set baudrate to nearest supported value */
596 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
597 if (baud_sup[k] / baud) {
598 baud_ceil = baud_sup[k];
599 if (k==0) {
600 baud = baud_ceil;
601 } else {
602 baud_floor = baud_sup[k-1];
603 if ((baud_ceil % baud)
604 > (baud % baud_floor))
605 baud = baud_floor;
606 else
607 baud = baud_ceil;
609 break;
612 if (baud > 1228800) {
613 /* type_0, type_1 only support up to 1228800 baud */
614 if (priv->type != HX)
615 baud = 1228800;
616 else if (baud > 6000000)
617 baud = 6000000;
619 dbg("%s - baud set = %d", __func__, baud);
620 if (baud <= 115200) {
621 buf[0] = baud & 0xff;
622 buf[1] = (baud >> 8) & 0xff;
623 buf[2] = (baud >> 16) & 0xff;
624 buf[3] = (baud >> 24) & 0xff;
625 } else {
626 /* apparently the formula for higher speeds is:
627 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
629 unsigned tmp = 12*1000*1000*32 / baud;
630 buf[3] = 0x80;
631 buf[2] = 0;
632 buf[1] = (tmp >= 256);
633 while (tmp >= 256) {
634 tmp >>= 2;
635 buf[1] <<= 1;
637 if (tmp > 256) {
638 tmp %= 256;
640 buf[0] = tmp;
644 /* For reference buf[4]=0 is 1 stop bits */
645 /* For reference buf[4]=1 is 1.5 stop bits */
646 /* For reference buf[4]=2 is 2 stop bits */
647 if (cflag & CSTOPB) {
648 /* NOTE: Comply with "real" UARTs / RS232:
649 * use 1.5 instead of 2 stop bits with 5 data bits
651 if ((cflag & CSIZE) == CS5) {
652 buf[4] = 1;
653 dbg("%s - stop bits = 1.5", __func__);
654 } else {
655 buf[4] = 2;
656 dbg("%s - stop bits = 2", __func__);
658 } else {
659 buf[4] = 0;
660 dbg("%s - stop bits = 1", __func__);
663 if (cflag & PARENB) {
664 /* For reference buf[5]=0 is none parity */
665 /* For reference buf[5]=1 is odd parity */
666 /* For reference buf[5]=2 is even parity */
667 /* For reference buf[5]=3 is mark parity */
668 /* For reference buf[5]=4 is space parity */
669 if (cflag & PARODD) {
670 if (cflag & CMSPAR) {
671 buf[5] = 3;
672 dbg("%s - parity = mark", __func__);
673 } else {
674 buf[5] = 1;
675 dbg("%s - parity = odd", __func__);
677 } else {
678 if (cflag & CMSPAR) {
679 buf[5] = 4;
680 dbg("%s - parity = space", __func__);
681 } else {
682 buf[5] = 2;
683 dbg("%s - parity = even", __func__);
686 } else {
687 buf[5] = 0;
688 dbg("%s - parity = none", __func__);
691 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
692 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
693 0, 0, buf, 7, 100);
694 dbg("0x21:0x20:0:0 %d", i);
696 /* change control lines if we are switching to or from B0 */
697 spin_lock_irqsave(&priv->lock, flags);
698 control = priv->line_control;
699 if ((cflag & CBAUD) == B0)
700 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
701 else
702 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
703 if (control != priv->line_control) {
704 control = priv->line_control;
705 spin_unlock_irqrestore(&priv->lock, flags);
706 set_control_lines(serial->dev, control);
707 } else {
708 spin_unlock_irqrestore(&priv->lock, flags);
711 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
713 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
714 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
715 0, 0, buf, 7, 100);
716 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
717 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
719 if (cflag & CRTSCTS) {
720 if (priv->type == HX)
721 pl2303_vendor_write(0x0, 0x61, serial);
722 else
723 pl2303_vendor_write(0x0, 0x41, serial);
724 } else {
725 pl2303_vendor_write(0x0, 0x0, serial);
728 /* Save resulting baud rate */
729 if (baud)
730 tty_encode_baud_rate(tty, baud, baud);
732 kfree(buf);
735 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
737 struct pl2303_private *priv = usb_get_serial_port_data(port);
738 unsigned long flags;
739 u8 control;
741 spin_lock_irqsave(&priv->lock, flags);
742 /* Change DTR and RTS */
743 if (on)
744 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
745 else
746 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
747 control = priv->line_control;
748 spin_unlock_irqrestore(&priv->lock, flags);
749 set_control_lines(port->serial->dev, control);
752 static void pl2303_close(struct usb_serial_port *port)
754 struct pl2303_private *priv = usb_get_serial_port_data(port);
755 unsigned long flags;
757 dbg("%s - port %d", __func__, port->number);
759 spin_lock_irqsave(&priv->lock, flags);
760 /* clear out any remaining data in the buffer */
761 pl2303_buf_clear(priv->buf);
762 spin_unlock_irqrestore(&priv->lock, flags);
764 /* shutdown our urbs */
765 dbg("%s - shutting down urbs", __func__);
766 usb_kill_urb(port->write_urb);
767 usb_kill_urb(port->read_urb);
768 usb_kill_urb(port->interrupt_in_urb);
772 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
774 struct ktermios tmp_termios;
775 struct usb_serial *serial = port->serial;
776 struct pl2303_private *priv = usb_get_serial_port_data(port);
777 int result;
779 dbg("%s - port %d", __func__, port->number);
781 if (priv->type != HX) {
782 usb_clear_halt(serial->dev, port->write_urb->pipe);
783 usb_clear_halt(serial->dev, port->read_urb->pipe);
784 } else {
785 /* reset upstream data pipes */
786 pl2303_vendor_write(8, 0, serial);
787 pl2303_vendor_write(9, 0, serial);
790 /* Setup termios */
791 if (tty)
792 pl2303_set_termios(tty, port, &tmp_termios);
794 dbg("%s - submitting read urb", __func__);
795 port->read_urb->dev = serial->dev;
796 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
797 if (result) {
798 dev_err(&port->dev, "%s - failed submitting read urb,"
799 " error %d\n", __func__, result);
800 pl2303_close(port);
801 return -EPROTO;
804 dbg("%s - submitting interrupt urb", __func__);
805 port->interrupt_in_urb->dev = serial->dev;
806 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
807 if (result) {
808 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
809 " error %d\n", __func__, result);
810 pl2303_close(port);
811 return -EPROTO;
813 port->port.drain_delay = 256;
814 return 0;
817 static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
818 unsigned int set, unsigned int clear)
820 struct usb_serial_port *port = tty->driver_data;
821 struct pl2303_private *priv = usb_get_serial_port_data(port);
822 unsigned long flags;
823 u8 control;
825 if (!usb_get_intfdata(port->serial->interface))
826 return -ENODEV;
828 spin_lock_irqsave(&priv->lock, flags);
829 if (set & TIOCM_RTS)
830 priv->line_control |= CONTROL_RTS;
831 if (set & TIOCM_DTR)
832 priv->line_control |= CONTROL_DTR;
833 if (clear & TIOCM_RTS)
834 priv->line_control &= ~CONTROL_RTS;
835 if (clear & TIOCM_DTR)
836 priv->line_control &= ~CONTROL_DTR;
837 control = priv->line_control;
838 spin_unlock_irqrestore(&priv->lock, flags);
840 return set_control_lines(port->serial->dev, control);
843 static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
845 struct usb_serial_port *port = tty->driver_data;
846 struct pl2303_private *priv = usb_get_serial_port_data(port);
847 unsigned long flags;
848 unsigned int mcr;
849 unsigned int status;
850 unsigned int result;
852 dbg("%s (%d)", __func__, port->number);
854 if (!usb_get_intfdata(port->serial->interface))
855 return -ENODEV;
857 spin_lock_irqsave(&priv->lock, flags);
858 mcr = priv->line_control;
859 status = priv->line_status;
860 spin_unlock_irqrestore(&priv->lock, flags);
862 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
863 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
864 | ((status & UART_CTS) ? TIOCM_CTS : 0)
865 | ((status & UART_DSR) ? TIOCM_DSR : 0)
866 | ((status & UART_RING) ? TIOCM_RI : 0)
867 | ((status & UART_DCD) ? TIOCM_CD : 0);
869 dbg("%s - result = %x", __func__, result);
871 return result;
874 static int pl2303_carrier_raised(struct usb_serial_port *port)
876 struct pl2303_private *priv = usb_get_serial_port_data(port);
877 if (priv->line_status & UART_DCD)
878 return 1;
879 return 0;
882 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
884 struct pl2303_private *priv = usb_get_serial_port_data(port);
885 unsigned long flags;
886 unsigned int prevstatus;
887 unsigned int status;
888 unsigned int changed;
890 spin_lock_irqsave(&priv->lock, flags);
891 prevstatus = priv->line_status;
892 spin_unlock_irqrestore(&priv->lock, flags);
894 while (1) {
895 interruptible_sleep_on(&priv->delta_msr_wait);
896 /* see if a signal did it */
897 if (signal_pending(current))
898 return -ERESTARTSYS;
900 spin_lock_irqsave(&priv->lock, flags);
901 status = priv->line_status;
902 spin_unlock_irqrestore(&priv->lock, flags);
904 changed = prevstatus ^ status;
906 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
907 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
908 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
909 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
910 return 0;
912 prevstatus = status;
914 /* NOTREACHED */
915 return 0;
918 static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
919 unsigned int cmd, unsigned long arg)
921 struct usb_serial_port *port = tty->driver_data;
922 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
924 switch (cmd) {
925 case TIOCMIWAIT:
926 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
927 return wait_modem_info(port, arg);
928 default:
929 dbg("%s not supported = 0x%04x", __func__, cmd);
930 break;
932 return -ENOIOCTLCMD;
935 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
937 struct usb_serial_port *port = tty->driver_data;
938 struct usb_serial *serial = port->serial;
939 u16 state;
940 int result;
942 dbg("%s - port %d", __func__, port->number);
944 if (break_state == 0)
945 state = BREAK_OFF;
946 else
947 state = BREAK_ON;
948 dbg("%s - turning break %s", __func__,
949 state == BREAK_OFF ? "off" : "on");
951 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
952 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
953 0, NULL, 0, 100);
954 if (result)
955 dbg("%s - error sending break = %d", __func__, result);
958 static void pl2303_release(struct usb_serial *serial)
960 int i;
961 struct pl2303_private *priv;
963 dbg("%s", __func__);
965 for (i = 0; i < serial->num_ports; ++i) {
966 priv = usb_get_serial_port_data(serial->port[i]);
967 if (priv) {
968 pl2303_buf_free(priv->buf);
969 kfree(priv);
974 static void pl2303_update_line_status(struct usb_serial_port *port,
975 unsigned char *data,
976 unsigned int actual_length)
979 struct pl2303_private *priv = usb_get_serial_port_data(port);
980 struct tty_struct *tty;
981 unsigned long flags;
982 u8 status_idx = UART_STATE;
983 u8 length = UART_STATE + 1;
984 u8 prev_line_status;
985 u16 idv, idp;
987 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
988 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
991 if (idv == SIEMENS_VENDOR_ID) {
992 if (idp == SIEMENS_PRODUCT_ID_X65 ||
993 idp == SIEMENS_PRODUCT_ID_SX1 ||
994 idp == SIEMENS_PRODUCT_ID_X75) {
996 length = 1;
997 status_idx = 0;
1001 if (actual_length < length)
1002 return;
1004 /* Save off the uart status for others to look at */
1005 spin_lock_irqsave(&priv->lock, flags);
1006 prev_line_status = priv->line_status;
1007 priv->line_status = data[status_idx];
1008 spin_unlock_irqrestore(&priv->lock, flags);
1009 if (priv->line_status & UART_BREAK_ERROR)
1010 usb_serial_handle_break(port);
1011 wake_up_interruptible(&priv->delta_msr_wait);
1013 tty = tty_port_tty_get(&port->port);
1014 if (!tty)
1015 return;
1016 if ((priv->line_status ^ prev_line_status) & UART_DCD)
1017 usb_serial_handle_dcd_change(port, tty,
1018 priv->line_status & UART_DCD);
1019 tty_kref_put(tty);
1022 static void pl2303_read_int_callback(struct urb *urb)
1024 struct usb_serial_port *port = urb->context;
1025 unsigned char *data = urb->transfer_buffer;
1026 unsigned int actual_length = urb->actual_length;
1027 int status = urb->status;
1028 int retval;
1030 dbg("%s (%d)", __func__, port->number);
1032 switch (status) {
1033 case 0:
1034 /* success */
1035 break;
1036 case -ECONNRESET:
1037 case -ENOENT:
1038 case -ESHUTDOWN:
1039 /* this urb is terminated, clean up */
1040 dbg("%s - urb shutting down with status: %d", __func__,
1041 status);
1042 return;
1043 default:
1044 dbg("%s - nonzero urb status received: %d", __func__,
1045 status);
1046 goto exit;
1049 usb_serial_debug_data(debug, &port->dev, __func__,
1050 urb->actual_length, urb->transfer_buffer);
1052 pl2303_update_line_status(port, data, actual_length);
1054 exit:
1055 retval = usb_submit_urb(urb, GFP_ATOMIC);
1056 if (retval)
1057 dev_err(&urb->dev->dev,
1058 "%s - usb_submit_urb failed with result %d\n",
1059 __func__, retval);
1062 static void pl2303_push_data(struct tty_struct *tty,
1063 struct usb_serial_port *port, struct urb *urb,
1064 u8 line_status)
1066 unsigned char *data = urb->transfer_buffer;
1067 /* get tty_flag from status */
1068 char tty_flag = TTY_NORMAL;
1069 /* break takes precedence over parity, */
1070 /* which takes precedence over framing errors */
1071 if (line_status & UART_BREAK_ERROR)
1072 tty_flag = TTY_BREAK;
1073 else if (line_status & UART_PARITY_ERROR)
1074 tty_flag = TTY_PARITY;
1075 else if (line_status & UART_FRAME_ERROR)
1076 tty_flag = TTY_FRAME;
1077 dbg("%s - tty_flag = %d", __func__, tty_flag);
1079 tty_buffer_request_room(tty, urb->actual_length + 1);
1080 /* overrun is special, not associated with a char */
1081 if (line_status & UART_OVERRUN_ERROR)
1082 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1084 if (tty_flag == TTY_NORMAL && !(port->console && port->sysrq))
1085 tty_insert_flip_string(tty, data, urb->actual_length);
1086 else {
1087 int i;
1088 for (i = 0; i < urb->actual_length; ++i)
1089 if (!usb_serial_handle_sysrq_char(tty, port, data[i]))
1090 tty_insert_flip_char(tty, data[i], tty_flag);
1092 tty_flip_buffer_push(tty);
1095 static void pl2303_read_bulk_callback(struct urb *urb)
1097 struct usb_serial_port *port = urb->context;
1098 struct pl2303_private *priv = usb_get_serial_port_data(port);
1099 struct tty_struct *tty;
1100 unsigned long flags;
1101 int result;
1102 int status = urb->status;
1103 u8 line_status;
1105 dbg("%s - port %d", __func__, port->number);
1107 if (status) {
1108 dbg("%s - urb status = %d", __func__, status);
1109 if (!port->port.count) {
1110 dbg("%s - port is closed, exiting.", __func__);
1111 return;
1113 if (status == -EPROTO) {
1114 /* PL2303 mysteriously fails with -EPROTO reschedule
1115 * the read */
1116 dbg("%s - caught -EPROTO, resubmitting the urb",
1117 __func__);
1118 urb->dev = port->serial->dev;
1119 result = usb_submit_urb(urb, GFP_ATOMIC);
1120 if (result)
1121 dev_err(&urb->dev->dev, "%s - failed"
1122 " resubmitting read urb, error %d\n",
1123 __func__, result);
1124 return;
1126 dbg("%s - unable to handle the error, exiting.", __func__);
1127 return;
1130 usb_serial_debug_data(debug, &port->dev, __func__,
1131 urb->actual_length, urb->transfer_buffer);
1133 spin_lock_irqsave(&priv->lock, flags);
1134 line_status = priv->line_status;
1135 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1136 spin_unlock_irqrestore(&priv->lock, flags);
1137 wake_up_interruptible(&priv->delta_msr_wait);
1139 tty = tty_port_tty_get(&port->port);
1140 if (tty && urb->actual_length) {
1141 pl2303_push_data(tty, port, urb, line_status);
1143 tty_kref_put(tty);
1144 /* Schedule the next read _if_ we are still open */
1145 if (port->port.count) {
1146 urb->dev = port->serial->dev;
1147 result = usb_submit_urb(urb, GFP_ATOMIC);
1148 if (result)
1149 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1150 " read urb, error %d\n", __func__, result);
1153 return;
1156 static void pl2303_write_bulk_callback(struct urb *urb)
1158 struct usb_serial_port *port = urb->context;
1159 struct pl2303_private *priv = usb_get_serial_port_data(port);
1160 int result;
1161 int status = urb->status;
1163 dbg("%s - port %d", __func__, port->number);
1165 switch (status) {
1166 case 0:
1167 /* success */
1168 break;
1169 case -ECONNRESET:
1170 case -ENOENT:
1171 case -ESHUTDOWN:
1172 /* this urb is terminated, clean up */
1173 dbg("%s - urb shutting down with status: %d", __func__,
1174 status);
1175 priv->write_urb_in_use = 0;
1176 return;
1177 default:
1178 /* error in the urb, so we have to resubmit it */
1179 dbg("%s - Overflow in write", __func__);
1180 dbg("%s - nonzero write bulk status received: %d", __func__,
1181 status);
1182 port->write_urb->transfer_buffer_length = 1;
1183 port->write_urb->dev = port->serial->dev;
1184 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1185 if (result)
1186 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1187 " urb, error %d\n", __func__, result);
1188 else
1189 return;
1192 priv->write_urb_in_use = 0;
1194 /* send any buffered data */
1195 pl2303_send(port);
1198 /* All of the device info needed for the PL2303 SIO serial converter */
1199 static struct usb_serial_driver pl2303_device = {
1200 .driver = {
1201 .owner = THIS_MODULE,
1202 .name = "pl2303",
1204 .id_table = id_table,
1205 .usb_driver = &pl2303_driver,
1206 .num_ports = 1,
1207 .open = pl2303_open,
1208 .close = pl2303_close,
1209 .dtr_rts = pl2303_dtr_rts,
1210 .carrier_raised = pl2303_carrier_raised,
1211 .write = pl2303_write,
1212 .ioctl = pl2303_ioctl,
1213 .break_ctl = pl2303_break_ctl,
1214 .set_termios = pl2303_set_termios,
1215 .tiocmget = pl2303_tiocmget,
1216 .tiocmset = pl2303_tiocmset,
1217 .read_bulk_callback = pl2303_read_bulk_callback,
1218 .read_int_callback = pl2303_read_int_callback,
1219 .write_bulk_callback = pl2303_write_bulk_callback,
1220 .write_room = pl2303_write_room,
1221 .chars_in_buffer = pl2303_chars_in_buffer,
1222 .attach = pl2303_startup,
1223 .release = pl2303_release,
1226 static int __init pl2303_init(void)
1228 int retval;
1230 retval = usb_serial_register(&pl2303_device);
1231 if (retval)
1232 goto failed_usb_serial_register;
1233 retval = usb_register(&pl2303_driver);
1234 if (retval)
1235 goto failed_usb_register;
1236 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1237 return 0;
1238 failed_usb_register:
1239 usb_serial_deregister(&pl2303_device);
1240 failed_usb_serial_register:
1241 return retval;
1244 static void __exit pl2303_exit(void)
1246 usb_deregister(&pl2303_driver);
1247 usb_serial_deregister(&pl2303_device);
1250 module_init(pl2303_init);
1251 module_exit(pl2303_exit);
1253 MODULE_DESCRIPTION(DRIVER_DESC);
1254 MODULE_LICENSE("GPL");
1256 module_param(debug, bool, S_IRUGO | S_IWUSR);
1257 MODULE_PARM_DESC(debug, "Debug enabled or not");