]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/usb/serial/pl2303.c
Merge tag 'iio-fixes-for-3.9a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[karo-tx-linux.git] / drivers / usb / serial / pl2303.c
1 /*
2  * Prolific PL2303 USB to serial adaptor driver
3  *
4  * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
5  * Copyright (C) 2003 IBM Corp.
6  *
7  * Original driver for 2.2.x by anonymous
8  *
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.
12  *
13  * See Documentation/usb/usb-serial.txt for more information on using this
14  * driver
15  *
16  */
17
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"
33
34 /*
35  * Version Information
36  */
37 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
38
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 */
92 };
93
94 MODULE_DEVICE_TABLE(usb, id_table);
95
96 #define SET_LINE_REQUEST_TYPE           0x21
97 #define SET_LINE_REQUEST                0x20
98
99 #define SET_CONTROL_REQUEST_TYPE        0x21
100 #define SET_CONTROL_REQUEST             0x22
101 #define CONTROL_DTR                     0x01
102 #define CONTROL_RTS                     0x02
103
104 #define BREAK_REQUEST_TYPE              0x21
105 #define BREAK_REQUEST                   0x23
106 #define BREAK_ON                        0xffff
107 #define BREAK_OFF                       0x0000
108
109 #define GET_LINE_REQUEST_TYPE           0xa1
110 #define GET_LINE_REQUEST                0x21
111
112 #define VENDOR_WRITE_REQUEST_TYPE       0x40
113 #define VENDOR_WRITE_REQUEST            0x01
114
115 #define VENDOR_READ_REQUEST_TYPE        0xc0
116 #define VENDOR_READ_REQUEST             0x01
117
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
128
129
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 */
134 };
135
136 struct pl2303_serial_private {
137         enum pl2303_type type;
138 };
139
140 struct pl2303_private {
141         spinlock_t lock;
142         wait_queue_head_t delta_msr_wait;
143         u8 line_control;
144         u8 line_status;
145 };
146
147 static int pl2303_vendor_read(__u16 value, __u16 index,
148                 struct usb_serial *serial, unsigned char *buf)
149 {
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->dev->dev, "0x%x:0x%x:0x%x:0x%x  %d - %x\n",
154                 VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, value, index,
155                 res, buf[0]);
156         return res;
157 }
158
159 static int pl2303_vendor_write(__u16 value, __u16 index,
160                 struct usb_serial *serial)
161 {
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->dev->dev, "0x%x:0x%x:0x%x:0x%x  %d\n",
166                 VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, value, index,
167                 res);
168         return res;
169 }
170
171 static int pl2303_startup(struct usb_serial *serial)
172 {
173         struct pl2303_serial_private *spriv;
174         enum pl2303_type type = type_0;
175         unsigned char *buf;
176
177         spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
178         if (!spriv)
179                 return -ENOMEM;
180
181         buf = kmalloc(10, GFP_KERNEL);
182         if (!buf) {
183                 kfree(spriv);
184                 return -ENOMEM;
185         }
186
187         if (serial->dev->descriptor.bDeviceClass == 0x02)
188                 type = type_0;
189         else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
190                 type = HX;
191         else if (serial->dev->descriptor.bDeviceClass == 0x00)
192                 type = type_1;
193         else if (serial->dev->descriptor.bDeviceClass == 0xFF)
194                 type = type_1;
195         dev_dbg(&serial->interface->dev, "device type: %d\n", type);
196
197         spriv->type = type;
198         usb_set_serial_data(serial, spriv);
199
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);
210         if (type == HX)
211                 pl2303_vendor_write(2, 0x44, serial);
212         else
213                 pl2303_vendor_write(2, 0x24, serial);
214
215         kfree(buf);
216         return 0;
217 }
218
219 static void pl2303_release(struct usb_serial *serial)
220 {
221         struct pl2303_serial_private *spriv;
222
223         spriv = usb_get_serial_data(serial);
224         kfree(spriv);
225 }
226
227 static int pl2303_port_probe(struct usb_serial_port *port)
228 {
229         struct pl2303_private *priv;
230
231         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
232         if (!priv)
233                 return -ENOMEM;
234
235         spin_lock_init(&priv->lock);
236         init_waitqueue_head(&priv->delta_msr_wait);
237
238         usb_set_serial_port_data(port, priv);
239
240         return 0;
241 }
242
243 static int pl2303_port_remove(struct usb_serial_port *port)
244 {
245         struct pl2303_private *priv;
246
247         priv = usb_get_serial_port_data(port);
248         kfree(priv);
249
250         return 0;
251 }
252
253 static int set_control_lines(struct usb_device *dev, u8 value)
254 {
255         int retval;
256
257         retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
258                                  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
259                                  value, 0, NULL, 0, 100);
260         dev_dbg(&dev->dev, "%s - value = %d, retval = %d\n", __func__,
261                 value, retval);
262         return retval;
263 }
264
265 static void pl2303_set_termios(struct tty_struct *tty,
266                 struct usb_serial_port *port, struct ktermios *old_termios)
267 {
268         struct usb_serial *serial = port->serial;
269         struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
270         struct pl2303_private *priv = usb_get_serial_port_data(port);
271         unsigned long flags;
272         unsigned int cflag;
273         unsigned char *buf;
274         int baud;
275         int i;
276         u8 control;
277         const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
278                                  4800, 7200, 9600, 14400, 19200, 28800, 38400,
279                                  57600, 115200, 230400, 460800, 614400,
280                                  921600, 1228800, 2457600, 3000000, 6000000 };
281         int baud_floor, baud_ceil;
282         int k;
283
284         /* The PL2303 is reported to lose bytes if you change
285            serial settings even to the same values as before. Thus
286            we actually need to filter in this specific case */
287
288         if (!tty_termios_hw_change(&tty->termios, old_termios))
289                 return;
290
291         cflag = tty->termios.c_cflag;
292
293         buf = kzalloc(7, GFP_KERNEL);
294         if (!buf) {
295                 dev_err(&port->dev, "%s - out of memory.\n", __func__);
296                 /* Report back no change occurred */
297                 tty->termios = *old_termios;
298                 return;
299         }
300
301         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
302                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
303                             0, 0, buf, 7, 100);
304         dev_dbg(&port->dev, "0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x\n", i,
305             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
306
307         if (cflag & CSIZE) {
308                 switch (cflag & CSIZE) {
309                 case CS5:
310                         buf[6] = 5;
311                         break;
312                 case CS6:
313                         buf[6] = 6;
314                         break;
315                 case CS7:
316                         buf[6] = 7;
317                         break;
318                 default:
319                 case CS8:
320                         buf[6] = 8;
321                         break;
322                 }
323                 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
324         }
325
326         /* For reference buf[0]:buf[3] baud rate value */
327         /* NOTE: Only the values defined in baud_sup are supported !
328          *       => if unsupported values are set, the PL2303 seems to use
329          *          9600 baud (at least my PL2303X always does)
330          */
331         baud = tty_get_baud_rate(tty);
332         dev_dbg(&port->dev, "baud requested = %d\n", baud);
333         if (baud) {
334                 /* Set baudrate to nearest supported value */
335                 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
336                         if (baud_sup[k] / baud) {
337                                 baud_ceil = baud_sup[k];
338                                 if (k==0) {
339                                         baud = baud_ceil;
340                                 } else {
341                                         baud_floor = baud_sup[k-1];
342                                         if ((baud_ceil % baud)
343                                             > (baud % baud_floor))
344                                                 baud = baud_floor;
345                                         else
346                                                 baud = baud_ceil;
347                                 }
348                                 break;
349                         }
350                 }
351                 if (baud > 1228800) {
352                         /* type_0, type_1 only support up to 1228800 baud */
353                         if (spriv->type != HX)
354                                 baud = 1228800;
355                         else if (baud > 6000000)
356                                 baud = 6000000;
357                 }
358                 dev_dbg(&port->dev, "baud set = %d\n", baud);
359                 if (baud <= 115200) {
360                         buf[0] = baud & 0xff;
361                         buf[1] = (baud >> 8) & 0xff;
362                         buf[2] = (baud >> 16) & 0xff;
363                         buf[3] = (baud >> 24) & 0xff;
364                 } else {
365                         /* apparently the formula for higher speeds is:
366                          * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
367                          */
368                         unsigned tmp = 12*1000*1000*32 / baud;
369                         buf[3] = 0x80;
370                         buf[2] = 0;
371                         buf[1] = (tmp >= 256);
372                         while (tmp >= 256) {
373                                 tmp >>= 2;
374                                 buf[1] <<= 1;
375                         }
376                         buf[0] = tmp;
377                 }
378         }
379
380         /* For reference buf[4]=0 is 1 stop bits */
381         /* For reference buf[4]=1 is 1.5 stop bits */
382         /* For reference buf[4]=2 is 2 stop bits */
383         if (cflag & CSTOPB) {
384                 /* NOTE: Comply with "real" UARTs / RS232:
385                  *       use 1.5 instead of 2 stop bits with 5 data bits
386                  */
387                 if ((cflag & CSIZE) == CS5) {
388                         buf[4] = 1;
389                         dev_dbg(&port->dev, "stop bits = 1.5\n");
390                 } else {
391                         buf[4] = 2;
392                         dev_dbg(&port->dev, "stop bits = 2\n");
393                 }
394         } else {
395                 buf[4] = 0;
396                 dev_dbg(&port->dev, "stop bits = 1\n");
397         }
398
399         if (cflag & PARENB) {
400                 /* For reference buf[5]=0 is none parity */
401                 /* For reference buf[5]=1 is odd parity */
402                 /* For reference buf[5]=2 is even parity */
403                 /* For reference buf[5]=3 is mark parity */
404                 /* For reference buf[5]=4 is space parity */
405                 if (cflag & PARODD) {
406                         if (cflag & CMSPAR) {
407                                 buf[5] = 3;
408                                 dev_dbg(&port->dev, "parity = mark\n");
409                         } else {
410                                 buf[5] = 1;
411                                 dev_dbg(&port->dev, "parity = odd\n");
412                         }
413                 } else {
414                         if (cflag & CMSPAR) {
415                                 buf[5] = 4;
416                                 dev_dbg(&port->dev, "parity = space\n");
417                         } else {
418                                 buf[5] = 2;
419                                 dev_dbg(&port->dev, "parity = even\n");
420                         }
421                 }
422         } else {
423                 buf[5] = 0;
424                 dev_dbg(&port->dev, "parity = none\n");
425         }
426
427         i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
428                             SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
429                             0, 0, buf, 7, 100);
430         dev_dbg(&port->dev, "0x21:0x20:0:0  %d\n", i);
431
432         /* change control lines if we are switching to or from B0 */
433         spin_lock_irqsave(&priv->lock, flags);
434         control = priv->line_control;
435         if ((cflag & CBAUD) == B0)
436                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
437         else if ((old_termios->c_cflag & CBAUD) == B0)
438                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
439         if (control != priv->line_control) {
440                 control = priv->line_control;
441                 spin_unlock_irqrestore(&priv->lock, flags);
442                 set_control_lines(serial->dev, control);
443         } else {
444                 spin_unlock_irqrestore(&priv->lock, flags);
445         }
446
447         buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
448
449         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
450                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
451                             0, 0, buf, 7, 100);
452         dev_dbg(&port->dev, "0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x\n", i,
453              buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
454
455         if (cflag & CRTSCTS) {
456                 if (spriv->type == HX)
457                         pl2303_vendor_write(0x0, 0x61, serial);
458                 else
459                         pl2303_vendor_write(0x0, 0x41, serial);
460         } else {
461                 pl2303_vendor_write(0x0, 0x0, serial);
462         }
463
464         /* Save resulting baud rate */
465         if (baud)
466                 tty_encode_baud_rate(tty, baud, baud);
467
468         kfree(buf);
469 }
470
471 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
472 {
473         struct pl2303_private *priv = usb_get_serial_port_data(port);
474         unsigned long flags;
475         u8 control;
476
477         spin_lock_irqsave(&priv->lock, flags);
478         /* Change DTR and RTS */
479         if (on)
480                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
481         else
482                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
483         control = priv->line_control;
484         spin_unlock_irqrestore(&priv->lock, flags);
485         set_control_lines(port->serial->dev, control);
486 }
487
488 static void pl2303_close(struct usb_serial_port *port)
489 {
490         usb_serial_generic_close(port);
491         usb_kill_urb(port->interrupt_in_urb);
492 }
493
494 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
495 {
496         struct ktermios tmp_termios;
497         struct usb_serial *serial = port->serial;
498         struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
499         int result;
500
501         if (spriv->type != HX) {
502                 usb_clear_halt(serial->dev, port->write_urb->pipe);
503                 usb_clear_halt(serial->dev, port->read_urb->pipe);
504         } else {
505                 /* reset upstream data pipes */
506                 pl2303_vendor_write(8, 0, serial);
507                 pl2303_vendor_write(9, 0, serial);
508         }
509
510         /* Setup termios */
511         if (tty)
512                 pl2303_set_termios(tty, port, &tmp_termios);
513
514         result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
515         if (result) {
516                 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
517                         " error %d\n", __func__, result);
518                 return result;
519         }
520
521         result = usb_serial_generic_open(tty, port);
522         if (result) {
523                 usb_kill_urb(port->interrupt_in_urb);
524                 return result;
525         }
526
527         port->port.drain_delay = 256;
528         return 0;
529 }
530
531 static int pl2303_tiocmset(struct tty_struct *tty,
532                            unsigned int set, unsigned int clear)
533 {
534         struct usb_serial_port *port = tty->driver_data;
535         struct usb_serial *serial = port->serial;
536         struct pl2303_private *priv = usb_get_serial_port_data(port);
537         unsigned long flags;
538         u8 control;
539         int ret;
540
541         spin_lock_irqsave(&priv->lock, flags);
542         if (set & TIOCM_RTS)
543                 priv->line_control |= CONTROL_RTS;
544         if (set & TIOCM_DTR)
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);
552
553         mutex_lock(&serial->disc_mutex);
554         if (!serial->disconnected)
555                 ret = set_control_lines(serial->dev, control);
556         else
557                 ret = -ENODEV;
558         mutex_unlock(&serial->disc_mutex);
559
560         return ret;
561 }
562
563 static int pl2303_tiocmget(struct tty_struct *tty)
564 {
565         struct usb_serial_port *port = tty->driver_data;
566         struct pl2303_private *priv = usb_get_serial_port_data(port);
567         unsigned long flags;
568         unsigned int mcr;
569         unsigned int status;
570         unsigned int result;
571
572         spin_lock_irqsave(&priv->lock, flags);
573         mcr = priv->line_control;
574         status = priv->line_status;
575         spin_unlock_irqrestore(&priv->lock, flags);
576
577         result = ((mcr & CONTROL_DTR)           ? TIOCM_DTR : 0)
578                   | ((mcr & CONTROL_RTS)        ? TIOCM_RTS : 0)
579                   | ((status & UART_CTS)        ? TIOCM_CTS : 0)
580                   | ((status & UART_DSR)        ? TIOCM_DSR : 0)
581                   | ((status & UART_RING)       ? TIOCM_RI  : 0)
582                   | ((status & UART_DCD)        ? TIOCM_CD  : 0);
583
584         dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
585
586         return result;
587 }
588
589 static int pl2303_carrier_raised(struct usb_serial_port *port)
590 {
591         struct pl2303_private *priv = usb_get_serial_port_data(port);
592         if (priv->line_status & UART_DCD)
593                 return 1;
594         return 0;
595 }
596
597 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
598 {
599         struct pl2303_private *priv = usb_get_serial_port_data(port);
600         unsigned long flags;
601         unsigned int prevstatus;
602         unsigned int status;
603         unsigned int changed;
604
605         spin_lock_irqsave(&priv->lock, flags);
606         prevstatus = priv->line_status;
607         spin_unlock_irqrestore(&priv->lock, flags);
608
609         while (1) {
610                 interruptible_sleep_on(&priv->delta_msr_wait);
611                 /* see if a signal did it */
612                 if (signal_pending(current))
613                         return -ERESTARTSYS;
614
615                 spin_lock_irqsave(&priv->lock, flags);
616                 status = priv->line_status;
617                 spin_unlock_irqrestore(&priv->lock, flags);
618
619                 changed = prevstatus ^ status;
620
621                 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
622                     ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
623                     ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
624                     ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
625                         return 0;
626                 }
627                 prevstatus = status;
628         }
629         /* NOTREACHED */
630         return 0;
631 }
632
633 static int pl2303_ioctl(struct tty_struct *tty,
634                         unsigned int cmd, unsigned long arg)
635 {
636         struct serial_struct ser;
637         struct usb_serial_port *port = tty->driver_data;
638
639         dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd);
640
641         switch (cmd) {
642         case TIOCGSERIAL:
643                 memset(&ser, 0, sizeof ser);
644                 ser.type = PORT_16654;
645                 ser.line = port->serial->minor;
646                 ser.port = port->number;
647                 ser.baud_base = 460800;
648
649                 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
650                         return -EFAULT;
651
652                 return 0;
653
654         case TIOCMIWAIT:
655                 dev_dbg(&port->dev, "%s TIOCMIWAIT\n", __func__);
656                 return wait_modem_info(port, arg);
657         default:
658                 dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd);
659                 break;
660         }
661         return -ENOIOCTLCMD;
662 }
663
664 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
665 {
666         struct usb_serial_port *port = tty->driver_data;
667         struct usb_serial *serial = port->serial;
668         u16 state;
669         int result;
670
671         if (break_state == 0)
672                 state = BREAK_OFF;
673         else
674                 state = BREAK_ON;
675         dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
676                         state == BREAK_OFF ? "off" : "on");
677
678         result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
679                                  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
680                                  0, NULL, 0, 100);
681         if (result)
682                 dev_err(&port->dev, "error sending break = %d\n", result);
683 }
684
685 static void pl2303_update_line_status(struct usb_serial_port *port,
686                                       unsigned char *data,
687                                       unsigned int actual_length)
688 {
689
690         struct pl2303_private *priv = usb_get_serial_port_data(port);
691         struct tty_struct *tty;
692         unsigned long flags;
693         u8 status_idx = UART_STATE;
694         u8 length = UART_STATE + 1;
695         u8 prev_line_status;
696         u16 idv, idp;
697
698         idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
699         idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
700
701
702         if (idv == SIEMENS_VENDOR_ID) {
703                 if (idp == SIEMENS_PRODUCT_ID_X65 ||
704                     idp == SIEMENS_PRODUCT_ID_SX1 ||
705                     idp == SIEMENS_PRODUCT_ID_X75) {
706
707                         length = 1;
708                         status_idx = 0;
709                 }
710         }
711
712         if (actual_length < length)
713                 return;
714
715         /* Save off the uart status for others to look at */
716         spin_lock_irqsave(&priv->lock, flags);
717         prev_line_status = priv->line_status;
718         priv->line_status = data[status_idx];
719         spin_unlock_irqrestore(&priv->lock, flags);
720         if (priv->line_status & UART_BREAK_ERROR)
721                 usb_serial_handle_break(port);
722         wake_up_interruptible(&priv->delta_msr_wait);
723
724         tty = tty_port_tty_get(&port->port);
725         if (!tty)
726                 return;
727         if ((priv->line_status ^ prev_line_status) & UART_DCD)
728                 usb_serial_handle_dcd_change(port, tty,
729                                 priv->line_status & UART_DCD);
730         tty_kref_put(tty);
731 }
732
733 static void pl2303_read_int_callback(struct urb *urb)
734 {
735         struct usb_serial_port *port =  urb->context;
736         unsigned char *data = urb->transfer_buffer;
737         unsigned int actual_length = urb->actual_length;
738         int status = urb->status;
739         int retval;
740
741         switch (status) {
742         case 0:
743                 /* success */
744                 break;
745         case -ECONNRESET:
746         case -ENOENT:
747         case -ESHUTDOWN:
748                 /* this urb is terminated, clean up */
749                 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
750                         __func__, status);
751                 return;
752         default:
753                 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
754                         __func__, status);
755                 goto exit;
756         }
757
758         usb_serial_debug_data(&port->dev, __func__,
759                               urb->actual_length, urb->transfer_buffer);
760
761         pl2303_update_line_status(port, data, actual_length);
762
763 exit:
764         retval = usb_submit_urb(urb, GFP_ATOMIC);
765         if (retval)
766                 dev_err(&port->dev,
767                         "%s - usb_submit_urb failed with result %d\n",
768                         __func__, retval);
769 }
770
771 static void pl2303_process_read_urb(struct urb *urb)
772 {
773         struct usb_serial_port *port = urb->context;
774         struct pl2303_private *priv = usb_get_serial_port_data(port);
775         unsigned char *data = urb->transfer_buffer;
776         char tty_flag = TTY_NORMAL;
777         unsigned long flags;
778         u8 line_status;
779         int i;
780
781         /* update line status */
782         spin_lock_irqsave(&priv->lock, flags);
783         line_status = priv->line_status;
784         priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
785         spin_unlock_irqrestore(&priv->lock, flags);
786         wake_up_interruptible(&priv->delta_msr_wait);
787
788         if (!urb->actual_length)
789                 return;
790
791         /* break takes precedence over parity, */
792         /* which takes precedence over framing errors */
793         if (line_status & UART_BREAK_ERROR)
794                 tty_flag = TTY_BREAK;
795         else if (line_status & UART_PARITY_ERROR)
796                 tty_flag = TTY_PARITY;
797         else if (line_status & UART_FRAME_ERROR)
798                 tty_flag = TTY_FRAME;
799         dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__, tty_flag);
800
801         /* overrun is special, not associated with a char */
802         if (line_status & UART_OVERRUN_ERROR)
803                 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
804
805         if (port->port.console && port->sysrq) {
806                 for (i = 0; i < urb->actual_length; ++i)
807                         if (!usb_serial_handle_sysrq_char(port, data[i]))
808                                 tty_insert_flip_char(&port->port, data[i],
809                                                 tty_flag);
810         } else {
811                 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
812                                                         urb->actual_length);
813         }
814
815         tty_flip_buffer_push(&port->port);
816 }
817
818 /* All of the device info needed for the PL2303 SIO serial converter */
819 static struct usb_serial_driver pl2303_device = {
820         .driver = {
821                 .owner =        THIS_MODULE,
822                 .name =         "pl2303",
823         },
824         .id_table =             id_table,
825         .num_ports =            1,
826         .bulk_in_size =         256,
827         .bulk_out_size =        256,
828         .open =                 pl2303_open,
829         .close =                pl2303_close,
830         .dtr_rts =              pl2303_dtr_rts,
831         .carrier_raised =       pl2303_carrier_raised,
832         .ioctl =                pl2303_ioctl,
833         .break_ctl =            pl2303_break_ctl,
834         .set_termios =          pl2303_set_termios,
835         .tiocmget =             pl2303_tiocmget,
836         .tiocmset =             pl2303_tiocmset,
837         .process_read_urb =     pl2303_process_read_urb,
838         .read_int_callback =    pl2303_read_int_callback,
839         .attach =               pl2303_startup,
840         .release =              pl2303_release,
841         .port_probe =           pl2303_port_probe,
842         .port_remove =          pl2303_port_remove,
843 };
844
845 static struct usb_serial_driver * const serial_drivers[] = {
846         &pl2303_device, NULL
847 };
848
849 module_usb_serial_driver(serial_drivers, id_table);
850
851 MODULE_DESCRIPTION(DRIVER_DESC);
852 MODULE_LICENSE("GPL");