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
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 <asm/unaligned.h>
38 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
40 static const struct usb_device_id id_table[] = {
41 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
42 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
43 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
44 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
45 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
46 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
47 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
48 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
49 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
50 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
51 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
52 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
53 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
54 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
55 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
56 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
57 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
58 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
59 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
60 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
61 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
62 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
63 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
64 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
65 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
66 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
67 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
68 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
69 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
70 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
71 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
72 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
73 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
74 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
75 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
76 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
77 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
78 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
79 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
80 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
81 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
82 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
83 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
84 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
85 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
86 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
87 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
88 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
89 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
90 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
91 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
92 { } /* Terminating entry */
95 MODULE_DEVICE_TABLE(usb, id_table);
97 #define SET_LINE_REQUEST_TYPE 0x21
98 #define SET_LINE_REQUEST 0x20
100 #define SET_CONTROL_REQUEST_TYPE 0x21
101 #define SET_CONTROL_REQUEST 0x22
102 #define CONTROL_DTR 0x01
103 #define CONTROL_RTS 0x02
105 #define BREAK_REQUEST_TYPE 0x21
106 #define BREAK_REQUEST 0x23
107 #define BREAK_ON 0xffff
108 #define BREAK_OFF 0x0000
110 #define GET_LINE_REQUEST_TYPE 0xa1
111 #define GET_LINE_REQUEST 0x21
113 #define VENDOR_WRITE_REQUEST_TYPE 0x40
114 #define VENDOR_WRITE_REQUEST 0x01
116 #define VENDOR_READ_REQUEST_TYPE 0xc0
117 #define VENDOR_READ_REQUEST 0x01
119 #define UART_STATE 0x08
120 #define UART_STATE_TRANSIENT_MASK 0x74
121 #define UART_DCD 0x01
122 #define UART_DSR 0x02
123 #define UART_BREAK_ERROR 0x04
124 #define UART_RING 0x08
125 #define UART_FRAME_ERROR 0x10
126 #define UART_PARITY_ERROR 0x20
127 #define UART_OVERRUN_ERROR 0x40
128 #define UART_CTS 0x80
132 type_0, /* don't know the difference between type 0 and */
133 type_1, /* type 1, until someone from prolific tells us... */
134 HX, /* HX version of the pl2303 chip */
137 struct pl2303_serial_private {
138 enum pl2303_type type;
141 struct pl2303_private {
147 static int pl2303_vendor_read(__u16 value, __u16 index,
148 struct usb_serial *serial, unsigned char *buf)
150 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
151 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
152 value, index, buf, 1, 100);
153 dev_dbg(&serial->interface->dev, "0x%x:0x%x:0x%x:0x%x %d - %x\n",
154 VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, value, index,
159 static int pl2303_vendor_write(__u16 value, __u16 index,
160 struct usb_serial *serial)
162 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
163 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
164 value, index, NULL, 0, 100);
165 dev_dbg(&serial->interface->dev, "0x%x:0x%x:0x%x:0x%x %d\n",
166 VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, value, index,
171 static int pl2303_startup(struct usb_serial *serial)
173 struct pl2303_serial_private *spriv;
174 enum pl2303_type type = type_0;
177 spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
181 buf = kmalloc(10, GFP_KERNEL);
187 if (serial->dev->descriptor.bDeviceClass == 0x02)
189 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
191 else if (serial->dev->descriptor.bDeviceClass == 0x00)
193 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
195 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
198 usb_set_serial_data(serial, spriv);
200 pl2303_vendor_read(0x8484, 0, serial, buf);
201 pl2303_vendor_write(0x0404, 0, serial);
202 pl2303_vendor_read(0x8484, 0, serial, buf);
203 pl2303_vendor_read(0x8383, 0, serial, buf);
204 pl2303_vendor_read(0x8484, 0, serial, buf);
205 pl2303_vendor_write(0x0404, 1, serial);
206 pl2303_vendor_read(0x8484, 0, serial, buf);
207 pl2303_vendor_read(0x8383, 0, serial, buf);
208 pl2303_vendor_write(0, 1, serial);
209 pl2303_vendor_write(1, 0, serial);
211 pl2303_vendor_write(2, 0x44, serial);
213 pl2303_vendor_write(2, 0x24, serial);
219 static void pl2303_release(struct usb_serial *serial)
221 struct pl2303_serial_private *spriv;
223 spriv = usb_get_serial_data(serial);
227 static int pl2303_port_probe(struct usb_serial_port *port)
229 struct pl2303_private *priv;
231 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
235 spin_lock_init(&priv->lock);
237 usb_set_serial_port_data(port, priv);
239 port->port.drain_delay = 256;
244 static int pl2303_port_remove(struct usb_serial_port *port)
246 struct pl2303_private *priv;
248 priv = usb_get_serial_port_data(port);
254 static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
256 struct usb_device *dev = port->serial->dev;
259 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
260 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
261 value, 0, NULL, 0, 100);
262 dev_dbg(&port->dev, "%s - value = %d, retval = %d\n", __func__,
267 static void pl2303_encode_baudrate(struct tty_struct *tty,
268 struct usb_serial_port *port,
271 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
272 4800, 7200, 9600, 14400, 19200, 28800, 38400,
273 57600, 115200, 230400, 460800, 500000, 614400,
274 921600, 1228800, 2457600, 3000000, 6000000 };
276 struct usb_serial *serial = port->serial;
277 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
282 * NOTE: Only the values defined in baud_sup are supported!
283 * => if unsupported values are set, the PL2303 seems to use
284 * 9600 baud (at least my PL2303X always does)
286 baud = tty_get_baud_rate(tty);
287 dev_dbg(&port->dev, "baud requested = %d\n", baud);
291 /* Set baudrate to nearest supported value */
292 for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
293 if (baud_sup[i] > baud)
297 if (i == ARRAY_SIZE(baud_sup))
298 baud = baud_sup[i - 1];
299 else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
300 baud = baud_sup[i - 1];
304 /* type_0, type_1 only support up to 1228800 baud */
305 if (spriv->type != HX)
306 baud = max_t(int, baud, 1228800);
308 if (baud <= 115200) {
309 put_unaligned_le32(baud, buf);
312 * Apparently the formula for higher speeds is:
313 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
315 unsigned tmp = 12000000 * 32 / baud;
318 buf[1] = (tmp >= 256);
326 /* Save resulting baud rate */
327 tty_encode_baud_rate(tty, baud, baud);
328 dev_dbg(&port->dev, "baud set = %d\n", baud);
331 static void pl2303_set_termios(struct tty_struct *tty,
332 struct usb_serial_port *port, struct ktermios *old_termios)
334 struct usb_serial *serial = port->serial;
335 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
336 struct pl2303_private *priv = usb_get_serial_port_data(port);
343 /* The PL2303 is reported to lose bytes if you change
344 serial settings even to the same values as before. Thus
345 we actually need to filter in this specific case */
347 if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
350 cflag = tty->termios.c_cflag;
352 buf = kzalloc(7, GFP_KERNEL);
354 dev_err(&port->dev, "%s - out of memory.\n", __func__);
355 /* Report back no change occurred */
357 tty->termios = *old_termios;
361 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
362 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
364 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf);
367 switch (cflag & CSIZE) {
382 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
385 /* For reference buf[0]:buf[3] baud rate value */
386 pl2303_encode_baudrate(tty, port, &buf[0]);
388 /* For reference buf[4]=0 is 1 stop bits */
389 /* For reference buf[4]=1 is 1.5 stop bits */
390 /* For reference buf[4]=2 is 2 stop bits */
391 if (cflag & CSTOPB) {
392 /* NOTE: Comply with "real" UARTs / RS232:
393 * use 1.5 instead of 2 stop bits with 5 data bits
395 if ((cflag & CSIZE) == CS5) {
397 dev_dbg(&port->dev, "stop bits = 1.5\n");
400 dev_dbg(&port->dev, "stop bits = 2\n");
404 dev_dbg(&port->dev, "stop bits = 1\n");
407 if (cflag & PARENB) {
408 /* For reference buf[5]=0 is none parity */
409 /* For reference buf[5]=1 is odd parity */
410 /* For reference buf[5]=2 is even parity */
411 /* For reference buf[5]=3 is mark parity */
412 /* For reference buf[5]=4 is space parity */
413 if (cflag & PARODD) {
414 if (cflag & CMSPAR) {
416 dev_dbg(&port->dev, "parity = mark\n");
419 dev_dbg(&port->dev, "parity = odd\n");
422 if (cflag & CMSPAR) {
424 dev_dbg(&port->dev, "parity = space\n");
427 dev_dbg(&port->dev, "parity = even\n");
432 dev_dbg(&port->dev, "parity = none\n");
435 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
436 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
438 dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
440 /* change control lines if we are switching to or from B0 */
441 spin_lock_irqsave(&priv->lock, flags);
442 control = priv->line_control;
443 if ((cflag & CBAUD) == B0)
444 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
445 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
446 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
447 if (control != priv->line_control) {
448 control = priv->line_control;
449 spin_unlock_irqrestore(&priv->lock, flags);
450 pl2303_set_control_lines(port, control);
452 spin_unlock_irqrestore(&priv->lock, flags);
455 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
457 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
458 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
460 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf);
462 if (cflag & CRTSCTS) {
463 if (spriv->type == HX)
464 pl2303_vendor_write(0x0, 0x61, serial);
466 pl2303_vendor_write(0x0, 0x41, serial);
468 pl2303_vendor_write(0x0, 0x0, serial);
474 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
476 struct pl2303_private *priv = usb_get_serial_port_data(port);
480 spin_lock_irqsave(&priv->lock, flags);
481 /* Change DTR and RTS */
483 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
485 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
486 control = priv->line_control;
487 spin_unlock_irqrestore(&priv->lock, flags);
488 pl2303_set_control_lines(port, control);
491 static void pl2303_close(struct usb_serial_port *port)
493 usb_serial_generic_close(port);
494 usb_kill_urb(port->interrupt_in_urb);
497 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
499 struct usb_serial *serial = port->serial;
500 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
503 if (spriv->type != HX) {
504 usb_clear_halt(serial->dev, port->write_urb->pipe);
505 usb_clear_halt(serial->dev, port->read_urb->pipe);
507 /* reset upstream data pipes */
508 pl2303_vendor_write(8, 0, serial);
509 pl2303_vendor_write(9, 0, serial);
514 pl2303_set_termios(tty, port, NULL);
516 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
518 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
519 " error %d\n", __func__, result);
523 result = usb_serial_generic_open(tty, port);
525 usb_kill_urb(port->interrupt_in_urb);
532 static int pl2303_tiocmset(struct tty_struct *tty,
533 unsigned int set, unsigned int clear)
535 struct usb_serial_port *port = tty->driver_data;
536 struct pl2303_private *priv = usb_get_serial_port_data(port);
541 spin_lock_irqsave(&priv->lock, flags);
543 priv->line_control |= CONTROL_RTS;
545 priv->line_control |= CONTROL_DTR;
546 if (clear & TIOCM_RTS)
547 priv->line_control &= ~CONTROL_RTS;
548 if (clear & TIOCM_DTR)
549 priv->line_control &= ~CONTROL_DTR;
550 control = priv->line_control;
551 spin_unlock_irqrestore(&priv->lock, flags);
553 ret = pl2303_set_control_lines(port, control);
555 return usb_translate_errors(ret);
560 static int pl2303_tiocmget(struct tty_struct *tty)
562 struct usb_serial_port *port = tty->driver_data;
563 struct pl2303_private *priv = usb_get_serial_port_data(port);
569 spin_lock_irqsave(&priv->lock, flags);
570 mcr = priv->line_control;
571 status = priv->line_status;
572 spin_unlock_irqrestore(&priv->lock, flags);
574 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
575 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
576 | ((status & UART_CTS) ? TIOCM_CTS : 0)
577 | ((status & UART_DSR) ? TIOCM_DSR : 0)
578 | ((status & UART_RING) ? TIOCM_RI : 0)
579 | ((status & UART_DCD) ? TIOCM_CD : 0);
581 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
586 static int pl2303_carrier_raised(struct usb_serial_port *port)
588 struct pl2303_private *priv = usb_get_serial_port_data(port);
589 if (priv->line_status & UART_DCD)
594 static int pl2303_tiocmiwait(struct tty_struct *tty, unsigned long arg)
596 struct usb_serial_port *port = tty->driver_data;
597 struct pl2303_private *priv = usb_get_serial_port_data(port);
599 unsigned int prevstatus;
601 unsigned int changed;
603 spin_lock_irqsave(&priv->lock, flags);
604 prevstatus = priv->line_status;
605 spin_unlock_irqrestore(&priv->lock, flags);
608 interruptible_sleep_on(&port->port.delta_msr_wait);
609 /* see if a signal did it */
610 if (signal_pending(current))
613 if (port->serial->disconnected)
616 spin_lock_irqsave(&priv->lock, flags);
617 status = priv->line_status;
618 spin_unlock_irqrestore(&priv->lock, flags);
620 changed = prevstatus ^ status;
622 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
623 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
624 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
625 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
634 static int pl2303_ioctl(struct tty_struct *tty,
635 unsigned int cmd, unsigned long arg)
637 struct serial_struct ser;
638 struct usb_serial_port *port = tty->driver_data;
640 dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd);
644 memset(&ser, 0, sizeof ser);
645 ser.type = PORT_16654;
646 ser.line = port->minor;
647 ser.port = port->port_number;
648 ser.baud_base = 460800;
650 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
655 dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd);
661 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
663 struct usb_serial_port *port = tty->driver_data;
664 struct usb_serial *serial = port->serial;
668 if (break_state == 0)
672 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
673 state == BREAK_OFF ? "off" : "on");
675 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
676 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
679 dev_err(&port->dev, "error sending break = %d\n", result);
682 static void pl2303_update_line_status(struct usb_serial_port *port,
684 unsigned int actual_length)
687 struct pl2303_private *priv = usb_get_serial_port_data(port);
688 struct tty_struct *tty;
690 u8 status_idx = UART_STATE;
691 u8 length = UART_STATE + 1;
695 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
696 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
699 if (idv == SIEMENS_VENDOR_ID) {
700 if (idp == SIEMENS_PRODUCT_ID_X65 ||
701 idp == SIEMENS_PRODUCT_ID_SX1 ||
702 idp == SIEMENS_PRODUCT_ID_X75) {
709 if (actual_length < length)
712 /* Save off the uart status for others to look at */
713 spin_lock_irqsave(&priv->lock, flags);
714 prev_line_status = priv->line_status;
715 priv->line_status = data[status_idx];
716 spin_unlock_irqrestore(&priv->lock, flags);
717 if (priv->line_status & UART_BREAK_ERROR)
718 usb_serial_handle_break(port);
719 wake_up_interruptible(&port->port.delta_msr_wait);
721 tty = tty_port_tty_get(&port->port);
724 if ((priv->line_status ^ prev_line_status) & UART_DCD)
725 usb_serial_handle_dcd_change(port, tty,
726 priv->line_status & UART_DCD);
730 static void pl2303_read_int_callback(struct urb *urb)
732 struct usb_serial_port *port = urb->context;
733 unsigned char *data = urb->transfer_buffer;
734 unsigned int actual_length = urb->actual_length;
735 int status = urb->status;
745 /* this urb is terminated, clean up */
746 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
750 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
755 usb_serial_debug_data(&port->dev, __func__,
756 urb->actual_length, urb->transfer_buffer);
758 pl2303_update_line_status(port, data, actual_length);
761 retval = usb_submit_urb(urb, GFP_ATOMIC);
764 "%s - usb_submit_urb failed with result %d\n",
768 static void pl2303_process_read_urb(struct urb *urb)
770 struct usb_serial_port *port = urb->context;
771 struct pl2303_private *priv = usb_get_serial_port_data(port);
772 unsigned char *data = urb->transfer_buffer;
773 char tty_flag = TTY_NORMAL;
778 /* update line status */
779 spin_lock_irqsave(&priv->lock, flags);
780 line_status = priv->line_status;
781 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
782 spin_unlock_irqrestore(&priv->lock, flags);
783 wake_up_interruptible(&port->port.delta_msr_wait);
785 if (!urb->actual_length)
788 /* break takes precedence over parity, */
789 /* which takes precedence over framing errors */
790 if (line_status & UART_BREAK_ERROR)
791 tty_flag = TTY_BREAK;
792 else if (line_status & UART_PARITY_ERROR)
793 tty_flag = TTY_PARITY;
794 else if (line_status & UART_FRAME_ERROR)
795 tty_flag = TTY_FRAME;
796 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__, tty_flag);
798 /* overrun is special, not associated with a char */
799 if (line_status & UART_OVERRUN_ERROR)
800 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
802 if (port->port.console && port->sysrq) {
803 for (i = 0; i < urb->actual_length; ++i)
804 if (!usb_serial_handle_sysrq_char(port, data[i]))
805 tty_insert_flip_char(&port->port, data[i],
808 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
812 tty_flip_buffer_push(&port->port);
815 /* All of the device info needed for the PL2303 SIO serial converter */
816 static struct usb_serial_driver pl2303_device = {
818 .owner = THIS_MODULE,
821 .id_table = id_table,
824 .bulk_out_size = 256,
826 .close = pl2303_close,
827 .dtr_rts = pl2303_dtr_rts,
828 .carrier_raised = pl2303_carrier_raised,
829 .ioctl = pl2303_ioctl,
830 .break_ctl = pl2303_break_ctl,
831 .set_termios = pl2303_set_termios,
832 .tiocmget = pl2303_tiocmget,
833 .tiocmset = pl2303_tiocmset,
834 .tiocmiwait = pl2303_tiocmiwait,
835 .process_read_urb = pl2303_process_read_urb,
836 .read_int_callback = pl2303_read_int_callback,
837 .attach = pl2303_startup,
838 .release = pl2303_release,
839 .port_probe = pl2303_port_probe,
840 .port_remove = pl2303_port_remove,
843 static struct usb_serial_driver * const serial_drivers[] = {
847 module_usb_serial_driver(serial_drivers, id_table);
849 MODULE_DESCRIPTION(DRIVER_DESC);
850 MODULE_LICENSE("GPL");