thermal: Fix compiler warning
[linux-2.6/btrfs-unstable.git] / drivers / usb / serial / pl2303.c
blob3b10018d89a34e44e03b5ffb5562c34c7e4e6b85
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 const struct usb_device_id id_table[] = {
40 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
41 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
42 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
43 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
44 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
45 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
46 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
47 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
48 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
49 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
50 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
51 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
52 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
53 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
54 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
55 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
56 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
57 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
58 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
59 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
60 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
61 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
62 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
63 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
64 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
65 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
66 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
67 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
68 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
69 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
70 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
71 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
72 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
73 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
74 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
75 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
76 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
77 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
78 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
79 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
80 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
81 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
82 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
83 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
84 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
85 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
86 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
87 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
88 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
89 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
90 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
91 { } /* Terminating entry */
94 MODULE_DEVICE_TABLE(usb, id_table);
96 #define SET_LINE_REQUEST_TYPE 0x21
97 #define SET_LINE_REQUEST 0x20
99 #define SET_CONTROL_REQUEST_TYPE 0x21
100 #define SET_CONTROL_REQUEST 0x22
101 #define CONTROL_DTR 0x01
102 #define CONTROL_RTS 0x02
104 #define BREAK_REQUEST_TYPE 0x21
105 #define BREAK_REQUEST 0x23
106 #define BREAK_ON 0xffff
107 #define BREAK_OFF 0x0000
109 #define GET_LINE_REQUEST_TYPE 0xa1
110 #define GET_LINE_REQUEST 0x21
112 #define VENDOR_WRITE_REQUEST_TYPE 0x40
113 #define VENDOR_WRITE_REQUEST 0x01
115 #define VENDOR_READ_REQUEST_TYPE 0xc0
116 #define VENDOR_READ_REQUEST 0x01
118 #define UART_STATE 0x08
119 #define UART_STATE_TRANSIENT_MASK 0x74
120 #define UART_DCD 0x01
121 #define UART_DSR 0x02
122 #define UART_BREAK_ERROR 0x04
123 #define UART_RING 0x08
124 #define UART_FRAME_ERROR 0x10
125 #define UART_PARITY_ERROR 0x20
126 #define UART_OVERRUN_ERROR 0x40
127 #define UART_CTS 0x80
130 enum pl2303_type {
131 type_0, /* don't know the difference between type 0 and */
132 type_1, /* type 1, until someone from prolific tells us... */
133 HX, /* HX version of the pl2303 chip */
136 struct pl2303_serial_private {
137 enum pl2303_type type;
140 struct pl2303_private {
141 spinlock_t lock;
142 u8 line_control;
143 u8 line_status;
146 static int pl2303_vendor_read(__u16 value, __u16 index,
147 struct usb_serial *serial, unsigned char *buf)
149 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
150 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
151 value, index, buf, 1, 100);
152 dev_dbg(&serial->dev->dev, "0x%x:0x%x:0x%x:0x%x %d - %x\n",
153 VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, value, index,
154 res, buf[0]);
155 return res;
158 static int pl2303_vendor_write(__u16 value, __u16 index,
159 struct usb_serial *serial)
161 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
162 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
163 value, index, NULL, 0, 100);
164 dev_dbg(&serial->dev->dev, "0x%x:0x%x:0x%x:0x%x %d\n",
165 VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, value, index,
166 res);
167 return res;
170 static int pl2303_startup(struct usb_serial *serial)
172 struct pl2303_serial_private *spriv;
173 enum pl2303_type type = type_0;
174 unsigned char *buf;
176 spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
177 if (!spriv)
178 return -ENOMEM;
180 buf = kmalloc(10, GFP_KERNEL);
181 if (!buf) {
182 kfree(spriv);
183 return -ENOMEM;
186 if (serial->dev->descriptor.bDeviceClass == 0x02)
187 type = type_0;
188 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
189 type = HX;
190 else if (serial->dev->descriptor.bDeviceClass == 0x00)
191 type = type_1;
192 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
193 type = type_1;
194 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
196 spriv->type = type;
197 usb_set_serial_data(serial, spriv);
199 pl2303_vendor_read(0x8484, 0, serial, buf);
200 pl2303_vendor_write(0x0404, 0, serial);
201 pl2303_vendor_read(0x8484, 0, serial, buf);
202 pl2303_vendor_read(0x8383, 0, serial, buf);
203 pl2303_vendor_read(0x8484, 0, serial, buf);
204 pl2303_vendor_write(0x0404, 1, serial);
205 pl2303_vendor_read(0x8484, 0, serial, buf);
206 pl2303_vendor_read(0x8383, 0, serial, buf);
207 pl2303_vendor_write(0, 1, serial);
208 pl2303_vendor_write(1, 0, serial);
209 if (type == HX)
210 pl2303_vendor_write(2, 0x44, serial);
211 else
212 pl2303_vendor_write(2, 0x24, serial);
214 kfree(buf);
215 return 0;
218 static void pl2303_release(struct usb_serial *serial)
220 struct pl2303_serial_private *spriv;
222 spriv = usb_get_serial_data(serial);
223 kfree(spriv);
226 static int pl2303_port_probe(struct usb_serial_port *port)
228 struct pl2303_private *priv;
230 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
231 if (!priv)
232 return -ENOMEM;
234 spin_lock_init(&priv->lock);
236 usb_set_serial_port_data(port, priv);
238 return 0;
241 static int pl2303_port_remove(struct usb_serial_port *port)
243 struct pl2303_private *priv;
245 priv = usb_get_serial_port_data(port);
246 kfree(priv);
248 return 0;
251 static int set_control_lines(struct usb_device *dev, u8 value)
253 int retval;
255 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
256 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
257 value, 0, NULL, 0, 100);
258 dev_dbg(&dev->dev, "%s - value = %d, retval = %d\n", __func__,
259 value, retval);
260 return retval;
263 static void pl2303_set_termios(struct tty_struct *tty,
264 struct usb_serial_port *port, struct ktermios *old_termios)
266 struct usb_serial *serial = port->serial;
267 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
268 struct pl2303_private *priv = usb_get_serial_port_data(port);
269 unsigned long flags;
270 unsigned int cflag;
271 unsigned char *buf;
272 int baud;
273 int i;
274 u8 control;
275 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
276 4800, 7200, 9600, 14400, 19200, 28800, 38400,
277 57600, 115200, 230400, 460800, 614400,
278 921600, 1228800, 2457600, 3000000, 6000000 };
279 int baud_floor, baud_ceil;
280 int k;
282 /* The PL2303 is reported to lose bytes if you change
283 serial settings even to the same values as before. Thus
284 we actually need to filter in this specific case */
286 if (!tty_termios_hw_change(&tty->termios, old_termios))
287 return;
289 cflag = tty->termios.c_cflag;
291 buf = kzalloc(7, GFP_KERNEL);
292 if (!buf) {
293 dev_err(&port->dev, "%s - out of memory.\n", __func__);
294 /* Report back no change occurred */
295 tty->termios = *old_termios;
296 return;
299 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
300 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
301 0, 0, buf, 7, 100);
302 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x\n", i,
303 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
305 if (cflag & CSIZE) {
306 switch (cflag & CSIZE) {
307 case CS5:
308 buf[6] = 5;
309 break;
310 case CS6:
311 buf[6] = 6;
312 break;
313 case CS7:
314 buf[6] = 7;
315 break;
316 default:
317 case CS8:
318 buf[6] = 8;
319 break;
321 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
324 /* For reference buf[0]:buf[3] baud rate value */
325 /* NOTE: Only the values defined in baud_sup are supported !
326 * => if unsupported values are set, the PL2303 seems to use
327 * 9600 baud (at least my PL2303X always does)
329 baud = tty_get_baud_rate(tty);
330 dev_dbg(&port->dev, "baud requested = %d\n", baud);
331 if (baud) {
332 /* Set baudrate to nearest supported value */
333 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
334 if (baud_sup[k] / baud) {
335 baud_ceil = baud_sup[k];
336 if (k==0) {
337 baud = baud_ceil;
338 } else {
339 baud_floor = baud_sup[k-1];
340 if ((baud_ceil % baud)
341 > (baud % baud_floor))
342 baud = baud_floor;
343 else
344 baud = baud_ceil;
346 break;
349 if (baud > 1228800) {
350 /* type_0, type_1 only support up to 1228800 baud */
351 if (spriv->type != HX)
352 baud = 1228800;
353 else if (baud > 6000000)
354 baud = 6000000;
356 dev_dbg(&port->dev, "baud set = %d\n", baud);
357 if (baud <= 115200) {
358 buf[0] = baud & 0xff;
359 buf[1] = (baud >> 8) & 0xff;
360 buf[2] = (baud >> 16) & 0xff;
361 buf[3] = (baud >> 24) & 0xff;
362 } else {
363 /* apparently the formula for higher speeds is:
364 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
366 unsigned tmp = 12*1000*1000*32 / baud;
367 buf[3] = 0x80;
368 buf[2] = 0;
369 buf[1] = (tmp >= 256);
370 while (tmp >= 256) {
371 tmp >>= 2;
372 buf[1] <<= 1;
374 buf[0] = tmp;
378 /* For reference buf[4]=0 is 1 stop bits */
379 /* For reference buf[4]=1 is 1.5 stop bits */
380 /* For reference buf[4]=2 is 2 stop bits */
381 if (cflag & CSTOPB) {
382 /* NOTE: Comply with "real" UARTs / RS232:
383 * use 1.5 instead of 2 stop bits with 5 data bits
385 if ((cflag & CSIZE) == CS5) {
386 buf[4] = 1;
387 dev_dbg(&port->dev, "stop bits = 1.5\n");
388 } else {
389 buf[4] = 2;
390 dev_dbg(&port->dev, "stop bits = 2\n");
392 } else {
393 buf[4] = 0;
394 dev_dbg(&port->dev, "stop bits = 1\n");
397 if (cflag & PARENB) {
398 /* For reference buf[5]=0 is none parity */
399 /* For reference buf[5]=1 is odd parity */
400 /* For reference buf[5]=2 is even parity */
401 /* For reference buf[5]=3 is mark parity */
402 /* For reference buf[5]=4 is space parity */
403 if (cflag & PARODD) {
404 if (cflag & CMSPAR) {
405 buf[5] = 3;
406 dev_dbg(&port->dev, "parity = mark\n");
407 } else {
408 buf[5] = 1;
409 dev_dbg(&port->dev, "parity = odd\n");
411 } else {
412 if (cflag & CMSPAR) {
413 buf[5] = 4;
414 dev_dbg(&port->dev, "parity = space\n");
415 } else {
416 buf[5] = 2;
417 dev_dbg(&port->dev, "parity = even\n");
420 } else {
421 buf[5] = 0;
422 dev_dbg(&port->dev, "parity = none\n");
425 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
426 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
427 0, 0, buf, 7, 100);
428 dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
430 /* change control lines if we are switching to or from B0 */
431 spin_lock_irqsave(&priv->lock, flags);
432 control = priv->line_control;
433 if ((cflag & CBAUD) == B0)
434 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
435 else if ((old_termios->c_cflag & CBAUD) == B0)
436 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
437 if (control != priv->line_control) {
438 control = priv->line_control;
439 spin_unlock_irqrestore(&priv->lock, flags);
440 set_control_lines(serial->dev, control);
441 } else {
442 spin_unlock_irqrestore(&priv->lock, flags);
445 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
447 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
448 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
449 0, 0, buf, 7, 100);
450 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x\n", i,
451 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
453 if (cflag & CRTSCTS) {
454 if (spriv->type == HX)
455 pl2303_vendor_write(0x0, 0x61, serial);
456 else
457 pl2303_vendor_write(0x0, 0x41, serial);
458 } else {
459 pl2303_vendor_write(0x0, 0x0, serial);
462 /* Save resulting baud rate */
463 if (baud)
464 tty_encode_baud_rate(tty, baud, baud);
466 kfree(buf);
469 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
471 struct pl2303_private *priv = usb_get_serial_port_data(port);
472 unsigned long flags;
473 u8 control;
475 spin_lock_irqsave(&priv->lock, flags);
476 /* Change DTR and RTS */
477 if (on)
478 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
479 else
480 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
481 control = priv->line_control;
482 spin_unlock_irqrestore(&priv->lock, flags);
483 set_control_lines(port->serial->dev, control);
486 static void pl2303_close(struct usb_serial_port *port)
488 usb_serial_generic_close(port);
489 usb_kill_urb(port->interrupt_in_urb);
492 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
494 struct ktermios tmp_termios;
495 struct usb_serial *serial = port->serial;
496 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
497 int result;
499 if (spriv->type != HX) {
500 usb_clear_halt(serial->dev, port->write_urb->pipe);
501 usb_clear_halt(serial->dev, port->read_urb->pipe);
502 } else {
503 /* reset upstream data pipes */
504 pl2303_vendor_write(8, 0, serial);
505 pl2303_vendor_write(9, 0, serial);
508 /* Setup termios */
509 if (tty)
510 pl2303_set_termios(tty, port, &tmp_termios);
512 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
513 if (result) {
514 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
515 " error %d\n", __func__, result);
516 return result;
519 result = usb_serial_generic_open(tty, port);
520 if (result) {
521 usb_kill_urb(port->interrupt_in_urb);
522 return result;
525 port->port.drain_delay = 256;
526 return 0;
529 static int pl2303_tiocmset(struct tty_struct *tty,
530 unsigned int set, unsigned int clear)
532 struct usb_serial_port *port = tty->driver_data;
533 struct usb_serial *serial = port->serial;
534 struct pl2303_private *priv = usb_get_serial_port_data(port);
535 unsigned long flags;
536 u8 control;
537 int ret;
539 spin_lock_irqsave(&priv->lock, flags);
540 if (set & TIOCM_RTS)
541 priv->line_control |= CONTROL_RTS;
542 if (set & TIOCM_DTR)
543 priv->line_control |= CONTROL_DTR;
544 if (clear & TIOCM_RTS)
545 priv->line_control &= ~CONTROL_RTS;
546 if (clear & TIOCM_DTR)
547 priv->line_control &= ~CONTROL_DTR;
548 control = priv->line_control;
549 spin_unlock_irqrestore(&priv->lock, flags);
551 mutex_lock(&serial->disc_mutex);
552 if (!serial->disconnected)
553 ret = set_control_lines(serial->dev, control);
554 else
555 ret = -ENODEV;
556 mutex_unlock(&serial->disc_mutex);
558 return ret;
561 static int pl2303_tiocmget(struct tty_struct *tty)
563 struct usb_serial_port *port = tty->driver_data;
564 struct pl2303_private *priv = usb_get_serial_port_data(port);
565 unsigned long flags;
566 unsigned int mcr;
567 unsigned int status;
568 unsigned int result;
570 spin_lock_irqsave(&priv->lock, flags);
571 mcr = priv->line_control;
572 status = priv->line_status;
573 spin_unlock_irqrestore(&priv->lock, flags);
575 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
576 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
577 | ((status & UART_CTS) ? TIOCM_CTS : 0)
578 | ((status & UART_DSR) ? TIOCM_DSR : 0)
579 | ((status & UART_RING) ? TIOCM_RI : 0)
580 | ((status & UART_DCD) ? TIOCM_CD : 0);
582 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
584 return result;
587 static int pl2303_carrier_raised(struct usb_serial_port *port)
589 struct pl2303_private *priv = usb_get_serial_port_data(port);
590 if (priv->line_status & UART_DCD)
591 return 1;
592 return 0;
595 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
597 struct pl2303_private *priv = usb_get_serial_port_data(port);
598 unsigned long flags;
599 unsigned int prevstatus;
600 unsigned int status;
601 unsigned int changed;
603 spin_lock_irqsave(&priv->lock, flags);
604 prevstatus = priv->line_status;
605 spin_unlock_irqrestore(&priv->lock, flags);
607 while (1) {
608 interruptible_sleep_on(&port->delta_msr_wait);
609 /* see if a signal did it */
610 if (signal_pending(current))
611 return -ERESTARTSYS;
613 if (port->serial->disconnected)
614 return -EIO;
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))) {
626 return 0;
628 prevstatus = status;
630 /* NOTREACHED */
631 return 0;
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);
642 switch (cmd) {
643 case TIOCGSERIAL:
644 memset(&ser, 0, sizeof ser);
645 ser.type = PORT_16654;
646 ser.line = port->serial->minor;
647 ser.port = port->number;
648 ser.baud_base = 460800;
650 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
651 return -EFAULT;
653 return 0;
655 case TIOCMIWAIT:
656 dev_dbg(&port->dev, "%s TIOCMIWAIT\n", __func__);
657 return wait_modem_info(port, arg);
658 default:
659 dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd);
660 break;
662 return -ENOIOCTLCMD;
665 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
667 struct usb_serial_port *port = tty->driver_data;
668 struct usb_serial *serial = port->serial;
669 u16 state;
670 int result;
672 if (break_state == 0)
673 state = BREAK_OFF;
674 else
675 state = BREAK_ON;
676 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
677 state == BREAK_OFF ? "off" : "on");
679 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
680 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
681 0, NULL, 0, 100);
682 if (result)
683 dev_err(&port->dev, "error sending break = %d\n", result);
686 static void pl2303_update_line_status(struct usb_serial_port *port,
687 unsigned char *data,
688 unsigned int actual_length)
691 struct pl2303_private *priv = usb_get_serial_port_data(port);
692 struct tty_struct *tty;
693 unsigned long flags;
694 u8 status_idx = UART_STATE;
695 u8 length = UART_STATE + 1;
696 u8 prev_line_status;
697 u16 idv, idp;
699 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
700 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
703 if (idv == SIEMENS_VENDOR_ID) {
704 if (idp == SIEMENS_PRODUCT_ID_X65 ||
705 idp == SIEMENS_PRODUCT_ID_SX1 ||
706 idp == SIEMENS_PRODUCT_ID_X75) {
708 length = 1;
709 status_idx = 0;
713 if (actual_length < length)
714 return;
716 /* Save off the uart status for others to look at */
717 spin_lock_irqsave(&priv->lock, flags);
718 prev_line_status = priv->line_status;
719 priv->line_status = data[status_idx];
720 spin_unlock_irqrestore(&priv->lock, flags);
721 if (priv->line_status & UART_BREAK_ERROR)
722 usb_serial_handle_break(port);
723 wake_up_interruptible(&port->delta_msr_wait);
725 tty = tty_port_tty_get(&port->port);
726 if (!tty)
727 return;
728 if ((priv->line_status ^ prev_line_status) & UART_DCD)
729 usb_serial_handle_dcd_change(port, tty,
730 priv->line_status & UART_DCD);
731 tty_kref_put(tty);
734 static void pl2303_read_int_callback(struct urb *urb)
736 struct usb_serial_port *port = urb->context;
737 unsigned char *data = urb->transfer_buffer;
738 unsigned int actual_length = urb->actual_length;
739 int status = urb->status;
740 int retval;
742 switch (status) {
743 case 0:
744 /* success */
745 break;
746 case -ECONNRESET:
747 case -ENOENT:
748 case -ESHUTDOWN:
749 /* this urb is terminated, clean up */
750 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
751 __func__, status);
752 return;
753 default:
754 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
755 __func__, status);
756 goto exit;
759 usb_serial_debug_data(&port->dev, __func__,
760 urb->actual_length, urb->transfer_buffer);
762 pl2303_update_line_status(port, data, actual_length);
764 exit:
765 retval = usb_submit_urb(urb, GFP_ATOMIC);
766 if (retval)
767 dev_err(&port->dev,
768 "%s - usb_submit_urb failed with result %d\n",
769 __func__, retval);
772 static void pl2303_process_read_urb(struct urb *urb)
774 struct usb_serial_port *port = urb->context;
775 struct pl2303_private *priv = usb_get_serial_port_data(port);
776 unsigned char *data = urb->transfer_buffer;
777 char tty_flag = TTY_NORMAL;
778 unsigned long flags;
779 u8 line_status;
780 int i;
782 /* update line status */
783 spin_lock_irqsave(&priv->lock, flags);
784 line_status = priv->line_status;
785 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
786 spin_unlock_irqrestore(&priv->lock, flags);
787 wake_up_interruptible(&port->delta_msr_wait);
789 if (!urb->actual_length)
790 return;
792 /* break takes precedence over parity, */
793 /* which takes precedence over framing errors */
794 if (line_status & UART_BREAK_ERROR)
795 tty_flag = TTY_BREAK;
796 else if (line_status & UART_PARITY_ERROR)
797 tty_flag = TTY_PARITY;
798 else if (line_status & UART_FRAME_ERROR)
799 tty_flag = TTY_FRAME;
800 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__, tty_flag);
802 /* overrun is special, not associated with a char */
803 if (line_status & UART_OVERRUN_ERROR)
804 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
806 if (port->port.console && port->sysrq) {
807 for (i = 0; i < urb->actual_length; ++i)
808 if (!usb_serial_handle_sysrq_char(port, data[i]))
809 tty_insert_flip_char(&port->port, data[i],
810 tty_flag);
811 } else {
812 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
813 urb->actual_length);
816 tty_flip_buffer_push(&port->port);
819 /* All of the device info needed for the PL2303 SIO serial converter */
820 static struct usb_serial_driver pl2303_device = {
821 .driver = {
822 .owner = THIS_MODULE,
823 .name = "pl2303",
825 .id_table = id_table,
826 .num_ports = 1,
827 .bulk_in_size = 256,
828 .bulk_out_size = 256,
829 .open = pl2303_open,
830 .close = pl2303_close,
831 .dtr_rts = pl2303_dtr_rts,
832 .carrier_raised = pl2303_carrier_raised,
833 .ioctl = pl2303_ioctl,
834 .break_ctl = pl2303_break_ctl,
835 .set_termios = pl2303_set_termios,
836 .tiocmget = pl2303_tiocmget,
837 .tiocmset = pl2303_tiocmset,
838 .process_read_urb = pl2303_process_read_urb,
839 .read_int_callback = pl2303_read_int_callback,
840 .attach = pl2303_startup,
841 .release = pl2303_release,
842 .port_probe = pl2303_port_probe,
843 .port_remove = pl2303_port_remove,
846 static struct usb_serial_driver * const serial_drivers[] = {
847 &pl2303_device, NULL
850 module_usb_serial_driver(serial_drivers, id_table);
852 MODULE_DESCRIPTION(DRIVER_DESC);
853 MODULE_LICENSE("GPL");