PM: OMAP3: Removed a couple of unused variables from DVFS code
[linux-ginger.git] / drivers / usb / serial / pl2303.c
blob9ec1a49e23622a6787d93ec3280f62ce14aac93e
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(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
83 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
84 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
85 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
86 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
87 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
88 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
89 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
90 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
91 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
92 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
93 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
94 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
95 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
96 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
97 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
98 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
99 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
100 { } /* Terminating entry */
103 MODULE_DEVICE_TABLE(usb, id_table);
105 static struct usb_driver pl2303_driver = {
106 .name = "pl2303",
107 .probe = usb_serial_probe,
108 .disconnect = usb_serial_disconnect,
109 .id_table = id_table,
110 .suspend = usb_serial_suspend,
111 .resume = usb_serial_resume,
112 .no_dynamic_id = 1,
113 .supports_autosuspend = 1,
116 #define SET_LINE_REQUEST_TYPE 0x21
117 #define SET_LINE_REQUEST 0x20
119 #define SET_CONTROL_REQUEST_TYPE 0x21
120 #define SET_CONTROL_REQUEST 0x22
121 #define CONTROL_DTR 0x01
122 #define CONTROL_RTS 0x02
124 #define BREAK_REQUEST_TYPE 0x21
125 #define BREAK_REQUEST 0x23
126 #define BREAK_ON 0xffff
127 #define BREAK_OFF 0x0000
129 #define GET_LINE_REQUEST_TYPE 0xa1
130 #define GET_LINE_REQUEST 0x21
132 #define VENDOR_WRITE_REQUEST_TYPE 0x40
133 #define VENDOR_WRITE_REQUEST 0x01
135 #define VENDOR_READ_REQUEST_TYPE 0xc0
136 #define VENDOR_READ_REQUEST 0x01
138 #define UART_STATE 0x08
139 #define UART_STATE_TRANSIENT_MASK 0x74
140 #define UART_DCD 0x01
141 #define UART_DSR 0x02
142 #define UART_BREAK_ERROR 0x04
143 #define UART_RING 0x08
144 #define UART_FRAME_ERROR 0x10
145 #define UART_PARITY_ERROR 0x20
146 #define UART_OVERRUN_ERROR 0x40
147 #define UART_CTS 0x80
150 enum pl2303_type {
151 type_0, /* don't know the difference between type 0 and */
152 type_1, /* type 1, until someone from prolific tells us... */
153 HX, /* HX version of the pl2303 chip */
156 struct pl2303_private {
157 spinlock_t lock;
158 struct pl2303_buf *buf;
159 int write_urb_in_use;
160 wait_queue_head_t delta_msr_wait;
161 u8 line_control;
162 u8 line_status;
163 enum pl2303_type type;
167 * pl2303_buf_alloc
169 * Allocate a circular buffer and all associated memory.
171 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
173 struct pl2303_buf *pb;
175 if (size == 0)
176 return NULL;
178 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
179 if (pb == NULL)
180 return NULL;
182 pb->buf_buf = kmalloc(size, GFP_KERNEL);
183 if (pb->buf_buf == NULL) {
184 kfree(pb);
185 return NULL;
188 pb->buf_size = size;
189 pb->buf_get = pb->buf_put = pb->buf_buf;
191 return pb;
195 * pl2303_buf_free
197 * Free the buffer and all associated memory.
199 static void pl2303_buf_free(struct pl2303_buf *pb)
201 if (pb) {
202 kfree(pb->buf_buf);
203 kfree(pb);
208 * pl2303_buf_clear
210 * Clear out all data in the circular buffer.
212 static void pl2303_buf_clear(struct pl2303_buf *pb)
214 if (pb != NULL)
215 pb->buf_get = pb->buf_put;
216 /* equivalent to a get of all data available */
220 * pl2303_buf_data_avail
222 * Return the number of bytes of data available in the circular
223 * buffer.
225 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
227 if (pb == NULL)
228 return 0;
230 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
234 * pl2303_buf_space_avail
236 * Return the number of bytes of space available in the circular
237 * buffer.
239 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
241 if (pb == NULL)
242 return 0;
244 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
248 * pl2303_buf_put
250 * Copy data data from a user buffer and put it into the circular buffer.
251 * Restrict to the amount of space available.
253 * Return the number of bytes copied.
255 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
256 unsigned int count)
258 unsigned int len;
260 if (pb == NULL)
261 return 0;
263 len = pl2303_buf_space_avail(pb);
264 if (count > len)
265 count = len;
267 if (count == 0)
268 return 0;
270 len = pb->buf_buf + pb->buf_size - pb->buf_put;
271 if (count > len) {
272 memcpy(pb->buf_put, buf, len);
273 memcpy(pb->buf_buf, buf+len, count - len);
274 pb->buf_put = pb->buf_buf + count - len;
275 } else {
276 memcpy(pb->buf_put, buf, count);
277 if (count < len)
278 pb->buf_put += count;
279 else /* count == len */
280 pb->buf_put = pb->buf_buf;
283 return count;
287 * pl2303_buf_get
289 * Get data from the circular buffer and copy to the given buffer.
290 * Restrict to the amount of data available.
292 * Return the number of bytes copied.
294 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
295 unsigned int count)
297 unsigned int len;
299 if (pb == NULL)
300 return 0;
302 len = pl2303_buf_data_avail(pb);
303 if (count > len)
304 count = len;
306 if (count == 0)
307 return 0;
309 len = pb->buf_buf + pb->buf_size - pb->buf_get;
310 if (count > len) {
311 memcpy(buf, pb->buf_get, len);
312 memcpy(buf+len, pb->buf_buf, count - len);
313 pb->buf_get = pb->buf_buf + count - len;
314 } else {
315 memcpy(buf, pb->buf_get, count);
316 if (count < len)
317 pb->buf_get += count;
318 else /* count == len */
319 pb->buf_get = pb->buf_buf;
322 return count;
325 static int pl2303_vendor_read(__u16 value, __u16 index,
326 struct usb_serial *serial, unsigned char *buf)
328 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
329 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
330 value, index, buf, 1, 100);
331 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
332 VENDOR_READ_REQUEST, value, index, res, buf[0]);
333 return res;
336 static int pl2303_vendor_write(__u16 value, __u16 index,
337 struct usb_serial *serial)
339 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
340 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
341 value, index, NULL, 0, 100);
342 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
343 VENDOR_WRITE_REQUEST, value, index, res);
344 return res;
347 static int pl2303_startup(struct usb_serial *serial)
349 struct pl2303_private *priv;
350 enum pl2303_type type = type_0;
351 unsigned char *buf;
352 int i;
354 buf = kmalloc(10, GFP_KERNEL);
355 if (buf == NULL)
356 return -ENOMEM;
358 if (serial->dev->descriptor.bDeviceClass == 0x02)
359 type = type_0;
360 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
361 type = HX;
362 else if (serial->dev->descriptor.bDeviceClass == 0x00)
363 type = type_1;
364 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
365 type = type_1;
366 dbg("device type: %d", type);
368 for (i = 0; i < serial->num_ports; ++i) {
369 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
370 if (!priv)
371 goto cleanup;
372 spin_lock_init(&priv->lock);
373 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
374 if (priv->buf == NULL) {
375 kfree(priv);
376 goto cleanup;
378 init_waitqueue_head(&priv->delta_msr_wait);
379 priv->type = type;
380 usb_set_serial_port_data(serial->port[i], priv);
383 pl2303_vendor_read(0x8484, 0, serial, buf);
384 pl2303_vendor_write(0x0404, 0, serial);
385 pl2303_vendor_read(0x8484, 0, serial, buf);
386 pl2303_vendor_read(0x8383, 0, serial, buf);
387 pl2303_vendor_read(0x8484, 0, serial, buf);
388 pl2303_vendor_write(0x0404, 1, serial);
389 pl2303_vendor_read(0x8484, 0, serial, buf);
390 pl2303_vendor_read(0x8383, 0, serial, buf);
391 pl2303_vendor_write(0, 1, serial);
392 pl2303_vendor_write(1, 0, serial);
393 if (type == HX)
394 pl2303_vendor_write(2, 0x44, serial);
395 else
396 pl2303_vendor_write(2, 0x24, serial);
398 kfree(buf);
399 return 0;
401 cleanup:
402 kfree(buf);
403 for (--i; i >= 0; --i) {
404 priv = usb_get_serial_port_data(serial->port[i]);
405 pl2303_buf_free(priv->buf);
406 kfree(priv);
407 usb_set_serial_port_data(serial->port[i], NULL);
409 return -ENOMEM;
412 static int set_control_lines(struct usb_device *dev, u8 value)
414 int retval;
416 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
417 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
418 value, 0, NULL, 0, 100);
419 dbg("%s - value = %d, retval = %d", __func__, value, retval);
420 return retval;
423 static void pl2303_send(struct usb_serial_port *port)
425 int count, result;
426 struct pl2303_private *priv = usb_get_serial_port_data(port);
427 unsigned long flags;
429 dbg("%s - port %d", __func__, port->number);
431 spin_lock_irqsave(&priv->lock, flags);
433 if (priv->write_urb_in_use) {
434 spin_unlock_irqrestore(&priv->lock, flags);
435 return;
438 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
439 port->bulk_out_size);
441 if (count == 0) {
442 spin_unlock_irqrestore(&priv->lock, flags);
443 return;
446 priv->write_urb_in_use = 1;
448 spin_unlock_irqrestore(&priv->lock, flags);
450 usb_serial_debug_data(debug, &port->dev, __func__, count,
451 port->write_urb->transfer_buffer);
453 port->write_urb->transfer_buffer_length = count;
454 port->write_urb->dev = port->serial->dev;
455 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
456 if (result) {
457 dev_err(&port->dev, "%s - failed submitting write urb,"
458 " error %d\n", __func__, result);
459 priv->write_urb_in_use = 0;
460 /* TODO: reschedule pl2303_send */
463 usb_serial_port_softint(port);
466 static int pl2303_write(struct tty_struct *tty, struct usb_serial_port *port,
467 const unsigned char *buf, int count)
469 struct pl2303_private *priv = usb_get_serial_port_data(port);
470 unsigned long flags;
472 dbg("%s - port %d, %d bytes", __func__, port->number, count);
474 if (!count)
475 return count;
477 spin_lock_irqsave(&priv->lock, flags);
478 count = pl2303_buf_put(priv->buf, buf, count);
479 spin_unlock_irqrestore(&priv->lock, flags);
481 pl2303_send(port);
483 return count;
486 static int pl2303_write_room(struct tty_struct *tty)
488 struct usb_serial_port *port = tty->driver_data;
489 struct pl2303_private *priv = usb_get_serial_port_data(port);
490 int room = 0;
491 unsigned long flags;
493 dbg("%s - port %d", __func__, port->number);
495 spin_lock_irqsave(&priv->lock, flags);
496 room = pl2303_buf_space_avail(priv->buf);
497 spin_unlock_irqrestore(&priv->lock, flags);
499 dbg("%s - returns %d", __func__, room);
500 return room;
503 static int pl2303_chars_in_buffer(struct tty_struct *tty)
505 struct usb_serial_port *port = tty->driver_data;
506 struct pl2303_private *priv = usb_get_serial_port_data(port);
507 int chars = 0;
508 unsigned long flags;
510 dbg("%s - port %d", __func__, port->number);
512 spin_lock_irqsave(&priv->lock, flags);
513 chars = pl2303_buf_data_avail(priv->buf);
514 spin_unlock_irqrestore(&priv->lock, flags);
516 dbg("%s - returns %d", __func__, chars);
517 return chars;
520 static void pl2303_set_termios(struct tty_struct *tty,
521 struct usb_serial_port *port, struct ktermios *old_termios)
523 struct usb_serial *serial = port->serial;
524 struct pl2303_private *priv = usb_get_serial_port_data(port);
525 unsigned long flags;
526 unsigned int cflag;
527 unsigned char *buf;
528 int baud;
529 int i;
530 u8 control;
531 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
532 4800, 7200, 9600, 14400, 19200, 28800, 38400,
533 57600, 115200, 230400, 460800, 614400,
534 921600, 1228800, 2457600, 3000000, 6000000 };
535 int baud_floor, baud_ceil;
536 int k;
538 dbg("%s - port %d", __func__, port->number);
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 /* For reference buf[0]:buf[3] baud rate value */
583 /* NOTE: Only the values defined in baud_sup are supported !
584 * => if unsupported values are set, the PL2303 seems to use
585 * 9600 baud (at least my PL2303X always does)
587 baud = tty_get_baud_rate(tty);
588 dbg("%s - baud requested = %d", __func__, baud);
589 if (baud) {
590 /* Set baudrate to nearest supported value */
591 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
592 if (baud_sup[k] / baud) {
593 baud_ceil = baud_sup[k];
594 if (k==0) {
595 baud = baud_ceil;
596 } else {
597 baud_floor = baud_sup[k-1];
598 if ((baud_ceil % baud)
599 > (baud % baud_floor))
600 baud = baud_floor;
601 else
602 baud = baud_ceil;
604 break;
607 if (baud > 1228800) {
608 /* type_0, type_1 only support up to 1228800 baud */
609 if (priv->type != HX)
610 baud = 1228800;
611 else if (baud > 6000000)
612 baud = 6000000;
614 dbg("%s - baud set = %d", __func__, baud);
615 buf[0] = baud & 0xff;
616 buf[1] = (baud >> 8) & 0xff;
617 buf[2] = (baud >> 16) & 0xff;
618 buf[3] = (baud >> 24) & 0xff;
621 /* For reference buf[4]=0 is 1 stop bits */
622 /* For reference buf[4]=1 is 1.5 stop bits */
623 /* For reference buf[4]=2 is 2 stop bits */
624 if (cflag & CSTOPB) {
625 /* NOTE: Comply with "real" UARTs / RS232:
626 * use 1.5 instead of 2 stop bits with 5 data bits
628 if ((cflag & CSIZE) == CS5) {
629 buf[4] = 1;
630 dbg("%s - stop bits = 1.5", __func__);
631 } else {
632 buf[4] = 2;
633 dbg("%s - stop bits = 2", __func__);
635 } else {
636 buf[4] = 0;
637 dbg("%s - stop bits = 1", __func__);
640 if (cflag & PARENB) {
641 /* For reference buf[5]=0 is none parity */
642 /* For reference buf[5]=1 is odd parity */
643 /* For reference buf[5]=2 is even parity */
644 /* For reference buf[5]=3 is mark parity */
645 /* For reference buf[5]=4 is space parity */
646 if (cflag & PARODD) {
647 if (cflag & CMSPAR) {
648 buf[5] = 3;
649 dbg("%s - parity = mark", __func__);
650 } else {
651 buf[5] = 1;
652 dbg("%s - parity = odd", __func__);
654 } else {
655 if (cflag & CMSPAR) {
656 buf[5] = 4;
657 dbg("%s - parity = space", __func__);
658 } else {
659 buf[5] = 2;
660 dbg("%s - parity = even", __func__);
663 } else {
664 buf[5] = 0;
665 dbg("%s - parity = none", __func__);
668 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
669 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
670 0, 0, buf, 7, 100);
671 dbg("0x21:0x20:0:0 %d", i);
673 /* change control lines if we are switching to or from B0 */
674 spin_lock_irqsave(&priv->lock, flags);
675 control = priv->line_control;
676 if ((cflag & CBAUD) == B0)
677 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
678 else
679 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
680 if (control != priv->line_control) {
681 control = priv->line_control;
682 spin_unlock_irqrestore(&priv->lock, flags);
683 set_control_lines(serial->dev, control);
684 } else {
685 spin_unlock_irqrestore(&priv->lock, flags);
688 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
690 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
691 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
692 0, 0, buf, 7, 100);
693 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
694 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
696 if (cflag & CRTSCTS) {
697 if (priv->type == HX)
698 pl2303_vendor_write(0x0, 0x61, serial);
699 else
700 pl2303_vendor_write(0x0, 0x41, serial);
701 } else {
702 pl2303_vendor_write(0x0, 0x0, serial);
705 /* Save resulting baud rate */
706 if (baud)
707 tty_encode_baud_rate(tty, baud, baud);
709 kfree(buf);
712 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
714 struct pl2303_private *priv = usb_get_serial_port_data(port);
715 unsigned long flags;
716 u8 control;
718 spin_lock_irqsave(&priv->lock, flags);
719 /* Change DTR and RTS */
720 if (on)
721 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
722 else
723 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
724 control = priv->line_control;
725 spin_unlock_irqrestore(&priv->lock, flags);
726 set_control_lines(port->serial->dev, control);
729 static void pl2303_close(struct usb_serial_port *port)
731 struct pl2303_private *priv = usb_get_serial_port_data(port);
732 unsigned long flags;
734 dbg("%s - port %d", __func__, port->number);
736 spin_lock_irqsave(&priv->lock, flags);
737 /* clear out any remaining data in the buffer */
738 pl2303_buf_clear(priv->buf);
739 spin_unlock_irqrestore(&priv->lock, flags);
741 /* shutdown our urbs */
742 dbg("%s - shutting down urbs", __func__);
743 usb_kill_urb(port->write_urb);
744 usb_kill_urb(port->read_urb);
745 usb_kill_urb(port->interrupt_in_urb);
749 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
751 struct ktermios tmp_termios;
752 struct usb_serial *serial = port->serial;
753 struct pl2303_private *priv = usb_get_serial_port_data(port);
754 int result;
756 dbg("%s - port %d", __func__, port->number);
758 if (priv->type != HX) {
759 usb_clear_halt(serial->dev, port->write_urb->pipe);
760 usb_clear_halt(serial->dev, port->read_urb->pipe);
761 } else {
762 /* reset upstream data pipes */
763 pl2303_vendor_write(8, 0, serial);
764 pl2303_vendor_write(9, 0, serial);
767 /* Setup termios */
768 if (tty)
769 pl2303_set_termios(tty, port, &tmp_termios);
771 dbg("%s - submitting read urb", __func__);
772 port->read_urb->dev = serial->dev;
773 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
774 if (result) {
775 dev_err(&port->dev, "%s - failed submitting read urb,"
776 " error %d\n", __func__, result);
777 pl2303_close(port);
778 return -EPROTO;
781 dbg("%s - submitting interrupt urb", __func__);
782 port->interrupt_in_urb->dev = serial->dev;
783 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
784 if (result) {
785 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
786 " error %d\n", __func__, result);
787 pl2303_close(port);
788 return -EPROTO;
790 port->port.drain_delay = 256;
791 return 0;
794 static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
795 unsigned int set, unsigned int clear)
797 struct usb_serial_port *port = tty->driver_data;
798 struct pl2303_private *priv = usb_get_serial_port_data(port);
799 unsigned long flags;
800 u8 control;
802 if (!usb_get_intfdata(port->serial->interface))
803 return -ENODEV;
805 spin_lock_irqsave(&priv->lock, flags);
806 if (set & TIOCM_RTS)
807 priv->line_control |= CONTROL_RTS;
808 if (set & TIOCM_DTR)
809 priv->line_control |= CONTROL_DTR;
810 if (clear & TIOCM_RTS)
811 priv->line_control &= ~CONTROL_RTS;
812 if (clear & TIOCM_DTR)
813 priv->line_control &= ~CONTROL_DTR;
814 control = priv->line_control;
815 spin_unlock_irqrestore(&priv->lock, flags);
817 return set_control_lines(port->serial->dev, control);
820 static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
822 struct usb_serial_port *port = tty->driver_data;
823 struct pl2303_private *priv = usb_get_serial_port_data(port);
824 unsigned long flags;
825 unsigned int mcr;
826 unsigned int status;
827 unsigned int result;
829 dbg("%s (%d)", __func__, port->number);
831 if (!usb_get_intfdata(port->serial->interface))
832 return -ENODEV;
834 spin_lock_irqsave(&priv->lock, flags);
835 mcr = priv->line_control;
836 status = priv->line_status;
837 spin_unlock_irqrestore(&priv->lock, flags);
839 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
840 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
841 | ((status & UART_CTS) ? TIOCM_CTS : 0)
842 | ((status & UART_DSR) ? TIOCM_DSR : 0)
843 | ((status & UART_RING) ? TIOCM_RI : 0)
844 | ((status & UART_DCD) ? TIOCM_CD : 0);
846 dbg("%s - result = %x", __func__, result);
848 return result;
851 static int pl2303_carrier_raised(struct usb_serial_port *port)
853 struct pl2303_private *priv = usb_get_serial_port_data(port);
854 if (priv->line_status & UART_DCD)
855 return 1;
856 return 0;
859 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
861 struct pl2303_private *priv = usb_get_serial_port_data(port);
862 unsigned long flags;
863 unsigned int prevstatus;
864 unsigned int status;
865 unsigned int changed;
867 spin_lock_irqsave(&priv->lock, flags);
868 prevstatus = priv->line_status;
869 spin_unlock_irqrestore(&priv->lock, flags);
871 while (1) {
872 interruptible_sleep_on(&priv->delta_msr_wait);
873 /* see if a signal did it */
874 if (signal_pending(current))
875 return -ERESTARTSYS;
877 spin_lock_irqsave(&priv->lock, flags);
878 status = priv->line_status;
879 spin_unlock_irqrestore(&priv->lock, flags);
881 changed = prevstatus ^ status;
883 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
884 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
885 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
886 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
887 return 0;
889 prevstatus = status;
891 /* NOTREACHED */
892 return 0;
895 static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
896 unsigned int cmd, unsigned long arg)
898 struct usb_serial_port *port = tty->driver_data;
899 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
901 switch (cmd) {
902 case TIOCMIWAIT:
903 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
904 return wait_modem_info(port, arg);
905 default:
906 dbg("%s not supported = 0x%04x", __func__, cmd);
907 break;
909 return -ENOIOCTLCMD;
912 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
914 struct usb_serial_port *port = tty->driver_data;
915 struct usb_serial *serial = port->serial;
916 u16 state;
917 int result;
919 dbg("%s - port %d", __func__, port->number);
921 if (break_state == 0)
922 state = BREAK_OFF;
923 else
924 state = BREAK_ON;
925 dbg("%s - turning break %s", __func__,
926 state == BREAK_OFF ? "off" : "on");
928 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
929 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
930 0, NULL, 0, 100);
931 if (result)
932 dbg("%s - error sending break = %d", __func__, result);
935 static void pl2303_release(struct usb_serial *serial)
937 int i;
938 struct pl2303_private *priv;
940 dbg("%s", __func__);
942 for (i = 0; i < serial->num_ports; ++i) {
943 priv = usb_get_serial_port_data(serial->port[i]);
944 if (priv) {
945 pl2303_buf_free(priv->buf);
946 kfree(priv);
951 static void pl2303_update_line_status(struct usb_serial_port *port,
952 unsigned char *data,
953 unsigned int actual_length)
956 struct pl2303_private *priv = usb_get_serial_port_data(port);
957 unsigned long flags;
958 u8 status_idx = UART_STATE;
959 u8 length = UART_STATE + 1;
960 u16 idv, idp;
962 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
963 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
966 if (idv == SIEMENS_VENDOR_ID) {
967 if (idp == SIEMENS_PRODUCT_ID_X65 ||
968 idp == SIEMENS_PRODUCT_ID_SX1 ||
969 idp == SIEMENS_PRODUCT_ID_X75) {
971 length = 1;
972 status_idx = 0;
976 if (actual_length < length)
977 return;
979 /* Save off the uart status for others to look at */
980 spin_lock_irqsave(&priv->lock, flags);
981 priv->line_status = data[status_idx];
982 spin_unlock_irqrestore(&priv->lock, flags);
983 if (priv->line_status & UART_BREAK_ERROR)
984 usb_serial_handle_break(port);
985 wake_up_interruptible(&priv->delta_msr_wait);
988 static void pl2303_read_int_callback(struct urb *urb)
990 struct usb_serial_port *port = urb->context;
991 unsigned char *data = urb->transfer_buffer;
992 unsigned int actual_length = urb->actual_length;
993 int status = urb->status;
994 int retval;
996 dbg("%s (%d)", __func__, port->number);
998 switch (status) {
999 case 0:
1000 /* success */
1001 break;
1002 case -ECONNRESET:
1003 case -ENOENT:
1004 case -ESHUTDOWN:
1005 /* this urb is terminated, clean up */
1006 dbg("%s - urb shutting down with status: %d", __func__,
1007 status);
1008 return;
1009 default:
1010 dbg("%s - nonzero urb status received: %d", __func__,
1011 status);
1012 goto exit;
1015 usb_serial_debug_data(debug, &port->dev, __func__,
1016 urb->actual_length, urb->transfer_buffer);
1018 pl2303_update_line_status(port, data, actual_length);
1020 exit:
1021 retval = usb_submit_urb(urb, GFP_ATOMIC);
1022 if (retval)
1023 dev_err(&urb->dev->dev,
1024 "%s - usb_submit_urb failed with result %d\n",
1025 __func__, retval);
1028 static void pl2303_push_data(struct tty_struct *tty,
1029 struct usb_serial_port *port, struct urb *urb,
1030 u8 line_status)
1032 unsigned char *data = urb->transfer_buffer;
1033 /* get tty_flag from status */
1034 char tty_flag = TTY_NORMAL;
1035 /* break takes precedence over parity, */
1036 /* which takes precedence over framing errors */
1037 if (line_status & UART_BREAK_ERROR)
1038 tty_flag = TTY_BREAK;
1039 else if (line_status & UART_PARITY_ERROR)
1040 tty_flag = TTY_PARITY;
1041 else if (line_status & UART_FRAME_ERROR)
1042 tty_flag = TTY_FRAME;
1043 dbg("%s - tty_flag = %d", __func__, tty_flag);
1045 tty_buffer_request_room(tty, urb->actual_length + 1);
1046 /* overrun is special, not associated with a char */
1047 if (line_status & UART_OVERRUN_ERROR)
1048 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1050 if (tty_flag == TTY_NORMAL && !(port->console && port->sysrq))
1051 tty_insert_flip_string(tty, data, urb->actual_length);
1052 else {
1053 int i;
1054 for (i = 0; i < urb->actual_length; ++i)
1055 if (!usb_serial_handle_sysrq_char(tty, port, data[i]))
1056 tty_insert_flip_char(tty, data[i], tty_flag);
1058 tty_flip_buffer_push(tty);
1061 static void pl2303_read_bulk_callback(struct urb *urb)
1063 struct usb_serial_port *port = urb->context;
1064 struct pl2303_private *priv = usb_get_serial_port_data(port);
1065 struct tty_struct *tty;
1066 unsigned long flags;
1067 int result;
1068 int status = urb->status;
1069 u8 line_status;
1071 dbg("%s - port %d", __func__, port->number);
1073 if (status) {
1074 dbg("%s - urb status = %d", __func__, status);
1075 if (!port->port.count) {
1076 dbg("%s - port is closed, exiting.", __func__);
1077 return;
1079 if (status == -EPROTO) {
1080 /* PL2303 mysteriously fails with -EPROTO reschedule
1081 * the read */
1082 dbg("%s - caught -EPROTO, resubmitting the urb",
1083 __func__);
1084 urb->dev = port->serial->dev;
1085 result = usb_submit_urb(urb, GFP_ATOMIC);
1086 if (result)
1087 dev_err(&urb->dev->dev, "%s - failed"
1088 " resubmitting read urb, error %d\n",
1089 __func__, result);
1090 return;
1092 dbg("%s - unable to handle the error, exiting.", __func__);
1093 return;
1096 usb_serial_debug_data(debug, &port->dev, __func__,
1097 urb->actual_length, urb->transfer_buffer);
1099 spin_lock_irqsave(&priv->lock, flags);
1100 line_status = priv->line_status;
1101 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1102 spin_unlock_irqrestore(&priv->lock, flags);
1103 wake_up_interruptible(&priv->delta_msr_wait);
1105 tty = tty_port_tty_get(&port->port);
1106 if (tty && urb->actual_length) {
1107 pl2303_push_data(tty, port, urb, line_status);
1109 tty_kref_put(tty);
1110 /* Schedule the next read _if_ we are still open */
1111 if (port->port.count) {
1112 urb->dev = port->serial->dev;
1113 result = usb_submit_urb(urb, GFP_ATOMIC);
1114 if (result)
1115 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1116 " read urb, error %d\n", __func__, result);
1119 return;
1122 static void pl2303_write_bulk_callback(struct urb *urb)
1124 struct usb_serial_port *port = urb->context;
1125 struct pl2303_private *priv = usb_get_serial_port_data(port);
1126 int result;
1127 int status = urb->status;
1129 dbg("%s - port %d", __func__, port->number);
1131 switch (status) {
1132 case 0:
1133 /* success */
1134 break;
1135 case -ECONNRESET:
1136 case -ENOENT:
1137 case -ESHUTDOWN:
1138 /* this urb is terminated, clean up */
1139 dbg("%s - urb shutting down with status: %d", __func__,
1140 status);
1141 priv->write_urb_in_use = 0;
1142 return;
1143 default:
1144 /* error in the urb, so we have to resubmit it */
1145 dbg("%s - Overflow in write", __func__);
1146 dbg("%s - nonzero write bulk status received: %d", __func__,
1147 status);
1148 port->write_urb->transfer_buffer_length = 1;
1149 port->write_urb->dev = port->serial->dev;
1150 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1151 if (result)
1152 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1153 " urb, error %d\n", __func__, result);
1154 else
1155 return;
1158 priv->write_urb_in_use = 0;
1160 /* send any buffered data */
1161 pl2303_send(port);
1164 /* All of the device info needed for the PL2303 SIO serial converter */
1165 static struct usb_serial_driver pl2303_device = {
1166 .driver = {
1167 .owner = THIS_MODULE,
1168 .name = "pl2303",
1170 .id_table = id_table,
1171 .usb_driver = &pl2303_driver,
1172 .num_ports = 1,
1173 .open = pl2303_open,
1174 .close = pl2303_close,
1175 .dtr_rts = pl2303_dtr_rts,
1176 .carrier_raised = pl2303_carrier_raised,
1177 .write = pl2303_write,
1178 .ioctl = pl2303_ioctl,
1179 .break_ctl = pl2303_break_ctl,
1180 .set_termios = pl2303_set_termios,
1181 .tiocmget = pl2303_tiocmget,
1182 .tiocmset = pl2303_tiocmset,
1183 .read_bulk_callback = pl2303_read_bulk_callback,
1184 .read_int_callback = pl2303_read_int_callback,
1185 .write_bulk_callback = pl2303_write_bulk_callback,
1186 .write_room = pl2303_write_room,
1187 .chars_in_buffer = pl2303_chars_in_buffer,
1188 .attach = pl2303_startup,
1189 .release = pl2303_release,
1192 static int __init pl2303_init(void)
1194 int retval;
1196 retval = usb_serial_register(&pl2303_device);
1197 if (retval)
1198 goto failed_usb_serial_register;
1199 retval = usb_register(&pl2303_driver);
1200 if (retval)
1201 goto failed_usb_register;
1202 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1203 return 0;
1204 failed_usb_register:
1205 usb_serial_deregister(&pl2303_device);
1206 failed_usb_serial_register:
1207 return retval;
1210 static void __exit pl2303_exit(void)
1212 usb_deregister(&pl2303_driver);
1213 usb_serial_deregister(&pl2303_device);
1216 module_init(pl2303_init);
1217 module_exit(pl2303_exit);
1219 MODULE_DESCRIPTION(DRIVER_DESC);
1220 MODULE_LICENSE("GPL");
1222 module_param(debug, bool, S_IRUGO | S_IWUSR);
1223 MODULE_PARM_DESC(debug, "Debug enabled or not");