tty: USB does not need the filp argument in the drivers
[linux-2.6.git] / drivers / usb / serial / pl2303.c
bloba63ea99936f79b46fec8a989890da0564d8fbf52
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 { } /* Terminating entry */
102 MODULE_DEVICE_TABLE(usb, id_table);
104 static struct usb_driver pl2303_driver = {
105 .name = "pl2303",
106 .probe = usb_serial_probe,
107 .disconnect = usb_serial_disconnect,
108 .id_table = id_table,
109 .suspend = usb_serial_suspend,
110 .resume = usb_serial_resume,
111 .no_dynamic_id = 1,
112 .supports_autosuspend = 1,
115 #define SET_LINE_REQUEST_TYPE 0x21
116 #define SET_LINE_REQUEST 0x20
118 #define SET_CONTROL_REQUEST_TYPE 0x21
119 #define SET_CONTROL_REQUEST 0x22
120 #define CONTROL_DTR 0x01
121 #define CONTROL_RTS 0x02
123 #define BREAK_REQUEST_TYPE 0x21
124 #define BREAK_REQUEST 0x23
125 #define BREAK_ON 0xffff
126 #define BREAK_OFF 0x0000
128 #define GET_LINE_REQUEST_TYPE 0xa1
129 #define GET_LINE_REQUEST 0x21
131 #define VENDOR_WRITE_REQUEST_TYPE 0x40
132 #define VENDOR_WRITE_REQUEST 0x01
134 #define VENDOR_READ_REQUEST_TYPE 0xc0
135 #define VENDOR_READ_REQUEST 0x01
137 #define UART_STATE 0x08
138 #define UART_STATE_TRANSIENT_MASK 0x74
139 #define UART_DCD 0x01
140 #define UART_DSR 0x02
141 #define UART_BREAK_ERROR 0x04
142 #define UART_RING 0x08
143 #define UART_FRAME_ERROR 0x10
144 #define UART_PARITY_ERROR 0x20
145 #define UART_OVERRUN_ERROR 0x40
146 #define UART_CTS 0x80
149 enum pl2303_type {
150 type_0, /* don't know the difference between type 0 and */
151 type_1, /* type 1, until someone from prolific tells us... */
152 HX, /* HX version of the pl2303 chip */
155 struct pl2303_private {
156 spinlock_t lock;
157 struct pl2303_buf *buf;
158 int write_urb_in_use;
159 wait_queue_head_t delta_msr_wait;
160 u8 line_control;
161 u8 line_status;
162 enum pl2303_type type;
166 * pl2303_buf_alloc
168 * Allocate a circular buffer and all associated memory.
170 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
172 struct pl2303_buf *pb;
174 if (size == 0)
175 return NULL;
177 pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
178 if (pb == NULL)
179 return NULL;
181 pb->buf_buf = kmalloc(size, GFP_KERNEL);
182 if (pb->buf_buf == NULL) {
183 kfree(pb);
184 return NULL;
187 pb->buf_size = size;
188 pb->buf_get = pb->buf_put = pb->buf_buf;
190 return pb;
194 * pl2303_buf_free
196 * Free the buffer and all associated memory.
198 static void pl2303_buf_free(struct pl2303_buf *pb)
200 if (pb) {
201 kfree(pb->buf_buf);
202 kfree(pb);
207 * pl2303_buf_clear
209 * Clear out all data in the circular buffer.
211 static void pl2303_buf_clear(struct pl2303_buf *pb)
213 if (pb != NULL)
214 pb->buf_get = pb->buf_put;
215 /* equivalent to a get of all data available */
219 * pl2303_buf_data_avail
221 * Return the number of bytes of data available in the circular
222 * buffer.
224 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
226 if (pb == NULL)
227 return 0;
229 return (pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size;
233 * pl2303_buf_space_avail
235 * Return the number of bytes of space available in the circular
236 * buffer.
238 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
240 if (pb == NULL)
241 return 0;
243 return (pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size;
247 * pl2303_buf_put
249 * Copy data data from a user buffer and put it into the circular buffer.
250 * Restrict to the amount of space available.
252 * Return the number of bytes copied.
254 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
255 unsigned int count)
257 unsigned int len;
259 if (pb == NULL)
260 return 0;
262 len = pl2303_buf_space_avail(pb);
263 if (count > len)
264 count = len;
266 if (count == 0)
267 return 0;
269 len = pb->buf_buf + pb->buf_size - pb->buf_put;
270 if (count > len) {
271 memcpy(pb->buf_put, buf, len);
272 memcpy(pb->buf_buf, buf+len, count - len);
273 pb->buf_put = pb->buf_buf + count - len;
274 } else {
275 memcpy(pb->buf_put, buf, count);
276 if (count < len)
277 pb->buf_put += count;
278 else /* count == len */
279 pb->buf_put = pb->buf_buf;
282 return count;
286 * pl2303_buf_get
288 * Get data from the circular buffer and copy to the given buffer.
289 * Restrict to the amount of data available.
291 * Return the number of bytes copied.
293 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
294 unsigned int count)
296 unsigned int len;
298 if (pb == NULL)
299 return 0;
301 len = pl2303_buf_data_avail(pb);
302 if (count > len)
303 count = len;
305 if (count == 0)
306 return 0;
308 len = pb->buf_buf + pb->buf_size - pb->buf_get;
309 if (count > len) {
310 memcpy(buf, pb->buf_get, len);
311 memcpy(buf+len, pb->buf_buf, count - len);
312 pb->buf_get = pb->buf_buf + count - len;
313 } else {
314 memcpy(buf, pb->buf_get, count);
315 if (count < len)
316 pb->buf_get += count;
317 else /* count == len */
318 pb->buf_get = pb->buf_buf;
321 return count;
324 static int pl2303_vendor_read(__u16 value, __u16 index,
325 struct usb_serial *serial, unsigned char *buf)
327 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
328 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
329 value, index, buf, 1, 100);
330 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
331 VENDOR_READ_REQUEST, value, index, res, buf[0]);
332 return res;
335 static int pl2303_vendor_write(__u16 value, __u16 index,
336 struct usb_serial *serial)
338 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
339 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
340 value, index, NULL, 0, 100);
341 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
342 VENDOR_WRITE_REQUEST, value, index, res);
343 return res;
346 static int pl2303_startup(struct usb_serial *serial)
348 struct pl2303_private *priv;
349 enum pl2303_type type = type_0;
350 unsigned char *buf;
351 int i;
353 buf = kmalloc(10, GFP_KERNEL);
354 if (buf == NULL)
355 return -ENOMEM;
357 if (serial->dev->descriptor.bDeviceClass == 0x02)
358 type = type_0;
359 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
360 type = HX;
361 else if (serial->dev->descriptor.bDeviceClass == 0x00)
362 type = type_1;
363 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
364 type = type_1;
365 dbg("device type: %d", type);
367 for (i = 0; i < serial->num_ports; ++i) {
368 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
369 if (!priv)
370 goto cleanup;
371 spin_lock_init(&priv->lock);
372 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
373 if (priv->buf == NULL) {
374 kfree(priv);
375 goto cleanup;
377 init_waitqueue_head(&priv->delta_msr_wait);
378 priv->type = type;
379 usb_set_serial_port_data(serial->port[i], priv);
382 pl2303_vendor_read(0x8484, 0, serial, buf);
383 pl2303_vendor_write(0x0404, 0, serial);
384 pl2303_vendor_read(0x8484, 0, serial, buf);
385 pl2303_vendor_read(0x8383, 0, serial, buf);
386 pl2303_vendor_read(0x8484, 0, serial, buf);
387 pl2303_vendor_write(0x0404, 1, serial);
388 pl2303_vendor_read(0x8484, 0, serial, buf);
389 pl2303_vendor_read(0x8383, 0, serial, buf);
390 pl2303_vendor_write(0, 1, serial);
391 pl2303_vendor_write(1, 0, serial);
392 if (type == HX)
393 pl2303_vendor_write(2, 0x44, serial);
394 else
395 pl2303_vendor_write(2, 0x24, serial);
397 kfree(buf);
398 return 0;
400 cleanup:
401 kfree(buf);
402 for (--i; i >= 0; --i) {
403 priv = usb_get_serial_port_data(serial->port[i]);
404 pl2303_buf_free(priv->buf);
405 kfree(priv);
406 usb_set_serial_port_data(serial->port[i], NULL);
408 return -ENOMEM;
411 static int set_control_lines(struct usb_device *dev, u8 value)
413 int retval;
415 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
416 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
417 value, 0, NULL, 0, 100);
418 dbg("%s - value = %d, retval = %d", __func__, value, retval);
419 return retval;
422 static void pl2303_send(struct usb_serial_port *port)
424 int count, result;
425 struct pl2303_private *priv = usb_get_serial_port_data(port);
426 unsigned long flags;
428 dbg("%s - port %d", __func__, port->number);
430 spin_lock_irqsave(&priv->lock, flags);
432 if (priv->write_urb_in_use) {
433 spin_unlock_irqrestore(&priv->lock, flags);
434 return;
437 count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
438 port->bulk_out_size);
440 if (count == 0) {
441 spin_unlock_irqrestore(&priv->lock, flags);
442 return;
445 priv->write_urb_in_use = 1;
447 spin_unlock_irqrestore(&priv->lock, flags);
449 usb_serial_debug_data(debug, &port->dev, __func__, count,
450 port->write_urb->transfer_buffer);
452 port->write_urb->transfer_buffer_length = count;
453 port->write_urb->dev = port->serial->dev;
454 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
455 if (result) {
456 dev_err(&port->dev, "%s - failed submitting write urb,"
457 " error %d\n", __func__, result);
458 priv->write_urb_in_use = 0;
459 /* TODO: reschedule pl2303_send */
462 usb_serial_port_softint(port);
465 static int pl2303_write(struct tty_struct *tty, struct usb_serial_port *port,
466 const unsigned char *buf, int count)
468 struct pl2303_private *priv = usb_get_serial_port_data(port);
469 unsigned long flags;
471 dbg("%s - port %d, %d bytes", __func__, port->number, count);
473 if (!count)
474 return count;
476 spin_lock_irqsave(&priv->lock, flags);
477 count = pl2303_buf_put(priv->buf, buf, count);
478 spin_unlock_irqrestore(&priv->lock, flags);
480 pl2303_send(port);
482 return count;
485 static int pl2303_write_room(struct tty_struct *tty)
487 struct usb_serial_port *port = tty->driver_data;
488 struct pl2303_private *priv = usb_get_serial_port_data(port);
489 int room = 0;
490 unsigned long flags;
492 dbg("%s - port %d", __func__, port->number);
494 spin_lock_irqsave(&priv->lock, flags);
495 room = pl2303_buf_space_avail(priv->buf);
496 spin_unlock_irqrestore(&priv->lock, flags);
498 dbg("%s - returns %d", __func__, room);
499 return room;
502 static int pl2303_chars_in_buffer(struct tty_struct *tty)
504 struct usb_serial_port *port = tty->driver_data;
505 struct pl2303_private *priv = usb_get_serial_port_data(port);
506 int chars = 0;
507 unsigned long flags;
509 dbg("%s - port %d", __func__, port->number);
511 spin_lock_irqsave(&priv->lock, flags);
512 chars = pl2303_buf_data_avail(priv->buf);
513 spin_unlock_irqrestore(&priv->lock, flags);
515 dbg("%s - returns %d", __func__, chars);
516 return chars;
519 static void pl2303_set_termios(struct tty_struct *tty,
520 struct usb_serial_port *port, struct ktermios *old_termios)
522 struct usb_serial *serial = port->serial;
523 struct pl2303_private *priv = usb_get_serial_port_data(port);
524 unsigned long flags;
525 unsigned int cflag;
526 unsigned char *buf;
527 int baud;
528 int i;
529 u8 control;
531 dbg("%s - port %d", __func__, port->number);
533 /* The PL2303 is reported to lose bytes if you change
534 serial settings even to the same values as before. Thus
535 we actually need to filter in this specific case */
537 if (!tty_termios_hw_change(tty->termios, old_termios))
538 return;
540 cflag = tty->termios->c_cflag;
542 buf = kzalloc(7, GFP_KERNEL);
543 if (!buf) {
544 dev_err(&port->dev, "%s - out of memory.\n", __func__);
545 /* Report back no change occurred */
546 *tty->termios = *old_termios;
547 return;
550 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
551 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
552 0, 0, buf, 7, 100);
553 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
554 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
556 if (cflag & CSIZE) {
557 switch (cflag & CSIZE) {
558 case CS5:
559 buf[6] = 5;
560 break;
561 case CS6:
562 buf[6] = 6;
563 break;
564 case CS7:
565 buf[6] = 7;
566 break;
567 default:
568 case CS8:
569 buf[6] = 8;
570 break;
572 dbg("%s - data bits = %d", __func__, buf[6]);
575 baud = tty_get_baud_rate(tty);
576 dbg("%s - baud = %d", __func__, baud);
577 if (baud) {
578 buf[0] = baud & 0xff;
579 buf[1] = (baud >> 8) & 0xff;
580 buf[2] = (baud >> 16) & 0xff;
581 buf[3] = (baud >> 24) & 0xff;
584 /* For reference buf[4]=0 is 1 stop bits */
585 /* For reference buf[4]=1 is 1.5 stop bits */
586 /* For reference buf[4]=2 is 2 stop bits */
587 if (cflag & CSTOPB) {
588 buf[4] = 2;
589 dbg("%s - stop bits = 2", __func__);
590 } else {
591 buf[4] = 0;
592 dbg("%s - stop bits = 1", __func__);
595 if (cflag & PARENB) {
596 /* For reference buf[5]=0 is none parity */
597 /* For reference buf[5]=1 is odd parity */
598 /* For reference buf[5]=2 is even parity */
599 /* For reference buf[5]=3 is mark parity */
600 /* For reference buf[5]=4 is space parity */
601 if (cflag & PARODD) {
602 buf[5] = 1;
603 dbg("%s - parity = odd", __func__);
604 } else {
605 buf[5] = 2;
606 dbg("%s - parity = even", __func__);
608 } else {
609 buf[5] = 0;
610 dbg("%s - parity = none", __func__);
613 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
614 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
615 0, 0, buf, 7, 100);
616 dbg("0x21:0x20:0:0 %d", i);
618 /* change control lines if we are switching to or from B0 */
619 spin_lock_irqsave(&priv->lock, flags);
620 control = priv->line_control;
621 if ((cflag & CBAUD) == B0)
622 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
623 else
624 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
625 if (control != priv->line_control) {
626 control = priv->line_control;
627 spin_unlock_irqrestore(&priv->lock, flags);
628 set_control_lines(serial->dev, control);
629 } else {
630 spin_unlock_irqrestore(&priv->lock, flags);
633 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
635 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
636 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
637 0, 0, buf, 7, 100);
638 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
639 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
641 if (cflag & CRTSCTS) {
642 if (priv->type == HX)
643 pl2303_vendor_write(0x0, 0x61, serial);
644 else
645 pl2303_vendor_write(0x0, 0x41, serial);
646 } else {
647 pl2303_vendor_write(0x0, 0x0, serial);
650 /* FIXME: Need to read back resulting baud rate */
651 if (baud)
652 tty_encode_baud_rate(tty, baud, baud);
654 kfree(buf);
657 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
659 struct pl2303_private *priv = usb_get_serial_port_data(port);
660 unsigned long flags;
661 u8 control;
663 spin_lock_irqsave(&priv->lock, flags);
664 /* Change DTR and RTS */
665 if (on)
666 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
667 else
668 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
669 control = priv->line_control;
670 spin_unlock_irqrestore(&priv->lock, flags);
671 set_control_lines(port->serial->dev, control);
674 static void pl2303_close(struct usb_serial_port *port)
676 struct pl2303_private *priv = usb_get_serial_port_data(port);
677 unsigned long flags;
679 dbg("%s - port %d", __func__, port->number);
681 spin_lock_irqsave(&priv->lock, flags);
682 /* clear out any remaining data in the buffer */
683 pl2303_buf_clear(priv->buf);
684 spin_unlock_irqrestore(&priv->lock, flags);
686 /* shutdown our urbs */
687 dbg("%s - shutting down urbs", __func__);
688 usb_kill_urb(port->write_urb);
689 usb_kill_urb(port->read_urb);
690 usb_kill_urb(port->interrupt_in_urb);
694 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
696 struct ktermios tmp_termios;
697 struct usb_serial *serial = port->serial;
698 struct pl2303_private *priv = usb_get_serial_port_data(port);
699 int result;
701 dbg("%s - port %d", __func__, port->number);
703 if (priv->type != HX) {
704 usb_clear_halt(serial->dev, port->write_urb->pipe);
705 usb_clear_halt(serial->dev, port->read_urb->pipe);
706 } else {
707 /* reset upstream data pipes */
708 pl2303_vendor_write(8, 0, serial);
709 pl2303_vendor_write(9, 0, serial);
712 /* Setup termios */
713 if (tty)
714 pl2303_set_termios(tty, port, &tmp_termios);
716 dbg("%s - submitting read urb", __func__);
717 port->read_urb->dev = serial->dev;
718 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
719 if (result) {
720 dev_err(&port->dev, "%s - failed submitting read urb,"
721 " error %d\n", __func__, result);
722 pl2303_close(port);
723 return -EPROTO;
726 dbg("%s - submitting interrupt urb", __func__);
727 port->interrupt_in_urb->dev = serial->dev;
728 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
729 if (result) {
730 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
731 " error %d\n", __func__, result);
732 pl2303_close(port);
733 return -EPROTO;
735 port->port.drain_delay = 256;
736 return 0;
739 static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
740 unsigned int set, unsigned int clear)
742 struct usb_serial_port *port = tty->driver_data;
743 struct pl2303_private *priv = usb_get_serial_port_data(port);
744 unsigned long flags;
745 u8 control;
747 if (!usb_get_intfdata(port->serial->interface))
748 return -ENODEV;
750 spin_lock_irqsave(&priv->lock, flags);
751 if (set & TIOCM_RTS)
752 priv->line_control |= CONTROL_RTS;
753 if (set & TIOCM_DTR)
754 priv->line_control |= CONTROL_DTR;
755 if (clear & TIOCM_RTS)
756 priv->line_control &= ~CONTROL_RTS;
757 if (clear & TIOCM_DTR)
758 priv->line_control &= ~CONTROL_DTR;
759 control = priv->line_control;
760 spin_unlock_irqrestore(&priv->lock, flags);
762 return set_control_lines(port->serial->dev, control);
765 static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
767 struct usb_serial_port *port = tty->driver_data;
768 struct pl2303_private *priv = usb_get_serial_port_data(port);
769 unsigned long flags;
770 unsigned int mcr;
771 unsigned int status;
772 unsigned int result;
774 dbg("%s (%d)", __func__, port->number);
776 if (!usb_get_intfdata(port->serial->interface))
777 return -ENODEV;
779 spin_lock_irqsave(&priv->lock, flags);
780 mcr = priv->line_control;
781 status = priv->line_status;
782 spin_unlock_irqrestore(&priv->lock, flags);
784 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
785 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
786 | ((status & UART_CTS) ? TIOCM_CTS : 0)
787 | ((status & UART_DSR) ? TIOCM_DSR : 0)
788 | ((status & UART_RING) ? TIOCM_RI : 0)
789 | ((status & UART_DCD) ? TIOCM_CD : 0);
791 dbg("%s - result = %x", __func__, result);
793 return result;
796 static int pl2303_carrier_raised(struct usb_serial_port *port)
798 struct pl2303_private *priv = usb_get_serial_port_data(port);
799 if (priv->line_status & UART_DCD)
800 return 1;
801 return 0;
804 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
806 struct pl2303_private *priv = usb_get_serial_port_data(port);
807 unsigned long flags;
808 unsigned int prevstatus;
809 unsigned int status;
810 unsigned int changed;
812 spin_lock_irqsave(&priv->lock, flags);
813 prevstatus = priv->line_status;
814 spin_unlock_irqrestore(&priv->lock, flags);
816 while (1) {
817 interruptible_sleep_on(&priv->delta_msr_wait);
818 /* see if a signal did it */
819 if (signal_pending(current))
820 return -ERESTARTSYS;
822 spin_lock_irqsave(&priv->lock, flags);
823 status = priv->line_status;
824 spin_unlock_irqrestore(&priv->lock, flags);
826 changed = prevstatus ^ status;
828 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
829 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
830 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
831 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
832 return 0;
834 prevstatus = status;
836 /* NOTREACHED */
837 return 0;
840 static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
841 unsigned int cmd, unsigned long arg)
843 struct usb_serial_port *port = tty->driver_data;
844 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
846 switch (cmd) {
847 case TIOCMIWAIT:
848 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
849 return wait_modem_info(port, arg);
850 default:
851 dbg("%s not supported = 0x%04x", __func__, cmd);
852 break;
854 return -ENOIOCTLCMD;
857 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
859 struct usb_serial_port *port = tty->driver_data;
860 struct usb_serial *serial = port->serial;
861 u16 state;
862 int result;
864 dbg("%s - port %d", __func__, port->number);
866 if (break_state == 0)
867 state = BREAK_OFF;
868 else
869 state = BREAK_ON;
870 dbg("%s - turning break %s", __func__,
871 state == BREAK_OFF ? "off" : "on");
873 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
874 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
875 0, NULL, 0, 100);
876 if (result)
877 dbg("%s - error sending break = %d", __func__, result);
880 static void pl2303_release(struct usb_serial *serial)
882 int i;
883 struct pl2303_private *priv;
885 dbg("%s", __func__);
887 for (i = 0; i < serial->num_ports; ++i) {
888 priv = usb_get_serial_port_data(serial->port[i]);
889 if (priv) {
890 pl2303_buf_free(priv->buf);
891 kfree(priv);
896 static void pl2303_update_line_status(struct usb_serial_port *port,
897 unsigned char *data,
898 unsigned int actual_length)
901 struct pl2303_private *priv = usb_get_serial_port_data(port);
902 unsigned long flags;
903 u8 status_idx = UART_STATE;
904 u8 length = UART_STATE + 1;
905 u16 idv, idp;
907 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
908 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
911 if (idv == SIEMENS_VENDOR_ID) {
912 if (idp == SIEMENS_PRODUCT_ID_X65 ||
913 idp == SIEMENS_PRODUCT_ID_SX1 ||
914 idp == SIEMENS_PRODUCT_ID_X75) {
916 length = 1;
917 status_idx = 0;
921 if (actual_length < length)
922 return;
924 /* Save off the uart status for others to look at */
925 spin_lock_irqsave(&priv->lock, flags);
926 priv->line_status = data[status_idx];
927 spin_unlock_irqrestore(&priv->lock, flags);
928 if (priv->line_status & UART_BREAK_ERROR)
929 usb_serial_handle_break(port);
930 wake_up_interruptible(&priv->delta_msr_wait);
933 static void pl2303_read_int_callback(struct urb *urb)
935 struct usb_serial_port *port = urb->context;
936 unsigned char *data = urb->transfer_buffer;
937 unsigned int actual_length = urb->actual_length;
938 int status = urb->status;
939 int retval;
941 dbg("%s (%d)", __func__, port->number);
943 switch (status) {
944 case 0:
945 /* success */
946 break;
947 case -ECONNRESET:
948 case -ENOENT:
949 case -ESHUTDOWN:
950 /* this urb is terminated, clean up */
951 dbg("%s - urb shutting down with status: %d", __func__,
952 status);
953 return;
954 default:
955 dbg("%s - nonzero urb status received: %d", __func__,
956 status);
957 goto exit;
960 usb_serial_debug_data(debug, &port->dev, __func__,
961 urb->actual_length, urb->transfer_buffer);
963 pl2303_update_line_status(port, data, actual_length);
965 exit:
966 retval = usb_submit_urb(urb, GFP_ATOMIC);
967 if (retval)
968 dev_err(&urb->dev->dev,
969 "%s - usb_submit_urb failed with result %d\n",
970 __func__, retval);
973 static void pl2303_push_data(struct tty_struct *tty,
974 struct usb_serial_port *port, struct urb *urb,
975 u8 line_status)
977 unsigned char *data = urb->transfer_buffer;
978 /* get tty_flag from status */
979 char tty_flag = TTY_NORMAL;
980 /* break takes precedence over parity, */
981 /* which takes precedence over framing errors */
982 if (line_status & UART_BREAK_ERROR)
983 tty_flag = TTY_BREAK;
984 else if (line_status & UART_PARITY_ERROR)
985 tty_flag = TTY_PARITY;
986 else if (line_status & UART_FRAME_ERROR)
987 tty_flag = TTY_FRAME;
988 dbg("%s - tty_flag = %d", __func__, tty_flag);
990 tty_buffer_request_room(tty, urb->actual_length + 1);
991 /* overrun is special, not associated with a char */
992 if (line_status & UART_OVERRUN_ERROR)
993 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
994 if (port->console && port->sysrq) {
995 int i;
996 for (i = 0; i < urb->actual_length; ++i)
997 if (!usb_serial_handle_sysrq_char(tty, port, data[i]))
998 tty_insert_flip_char(tty, data[i], tty_flag);
999 } else
1000 tty_insert_flip_string(tty, data, urb->actual_length);
1001 tty_flip_buffer_push(tty);
1004 static void pl2303_read_bulk_callback(struct urb *urb)
1006 struct usb_serial_port *port = urb->context;
1007 struct pl2303_private *priv = usb_get_serial_port_data(port);
1008 struct tty_struct *tty;
1009 unsigned long flags;
1010 int result;
1011 int status = urb->status;
1012 u8 line_status;
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, urb->transfer_buffer);
1042 spin_lock_irqsave(&priv->lock, flags);
1043 line_status = priv->line_status;
1044 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1045 spin_unlock_irqrestore(&priv->lock, flags);
1046 wake_up_interruptible(&priv->delta_msr_wait);
1048 tty = tty_port_tty_get(&port->port);
1049 if (tty && urb->actual_length) {
1050 pl2303_push_data(tty, port, urb, line_status);
1052 tty_kref_put(tty);
1053 /* Schedule the next read _if_ we are still open */
1054 if (port->port.count) {
1055 urb->dev = port->serial->dev;
1056 result = usb_submit_urb(urb, GFP_ATOMIC);
1057 if (result)
1058 dev_err(&urb->dev->dev, "%s - failed resubmitting"
1059 " read urb, error %d\n", __func__, result);
1062 return;
1065 static void pl2303_write_bulk_callback(struct urb *urb)
1067 struct usb_serial_port *port = urb->context;
1068 struct pl2303_private *priv = usb_get_serial_port_data(port);
1069 int result;
1070 int status = urb->status;
1072 dbg("%s - port %d", __func__, port->number);
1074 switch (status) {
1075 case 0:
1076 /* success */
1077 break;
1078 case -ECONNRESET:
1079 case -ENOENT:
1080 case -ESHUTDOWN:
1081 /* this urb is terminated, clean up */
1082 dbg("%s - urb shutting down with status: %d", __func__,
1083 status);
1084 priv->write_urb_in_use = 0;
1085 return;
1086 default:
1087 /* error in the urb, so we have to resubmit it */
1088 dbg("%s - Overflow in write", __func__);
1089 dbg("%s - nonzero write bulk status received: %d", __func__,
1090 status);
1091 port->write_urb->transfer_buffer_length = 1;
1092 port->write_urb->dev = port->serial->dev;
1093 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1094 if (result)
1095 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1096 " urb, error %d\n", __func__, result);
1097 else
1098 return;
1101 priv->write_urb_in_use = 0;
1103 /* send any buffered data */
1104 pl2303_send(port);
1107 /* All of the device info needed for the PL2303 SIO serial converter */
1108 static struct usb_serial_driver pl2303_device = {
1109 .driver = {
1110 .owner = THIS_MODULE,
1111 .name = "pl2303",
1113 .id_table = id_table,
1114 .usb_driver = &pl2303_driver,
1115 .num_ports = 1,
1116 .open = pl2303_open,
1117 .close = pl2303_close,
1118 .dtr_rts = pl2303_dtr_rts,
1119 .carrier_raised = pl2303_carrier_raised,
1120 .write = pl2303_write,
1121 .ioctl = pl2303_ioctl,
1122 .break_ctl = pl2303_break_ctl,
1123 .set_termios = pl2303_set_termios,
1124 .tiocmget = pl2303_tiocmget,
1125 .tiocmset = pl2303_tiocmset,
1126 .read_bulk_callback = pl2303_read_bulk_callback,
1127 .read_int_callback = pl2303_read_int_callback,
1128 .write_bulk_callback = pl2303_write_bulk_callback,
1129 .write_room = pl2303_write_room,
1130 .chars_in_buffer = pl2303_chars_in_buffer,
1131 .attach = pl2303_startup,
1132 .release = pl2303_release,
1135 static int __init pl2303_init(void)
1137 int retval;
1139 retval = usb_serial_register(&pl2303_device);
1140 if (retval)
1141 goto failed_usb_serial_register;
1142 retval = usb_register(&pl2303_driver);
1143 if (retval)
1144 goto failed_usb_register;
1145 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1146 return 0;
1147 failed_usb_register:
1148 usb_serial_deregister(&pl2303_device);
1149 failed_usb_serial_register:
1150 return retval;
1153 static void __exit pl2303_exit(void)
1155 usb_deregister(&pl2303_driver);
1156 usb_serial_deregister(&pl2303_device);
1159 module_init(pl2303_init);
1160 module_exit(pl2303_exit);
1162 MODULE_DESCRIPTION(DRIVER_DESC);
1163 MODULE_LICENSE("GPL");
1165 module_param(debug, bool, S_IRUGO | S_IWUSR);
1166 MODULE_PARM_DESC(debug, "Debug enabled or not");