Merge remote-tracking branch 'lsk/v3.10/topic/pe-wq' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.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         u8 line_control;
143         u8 line_status;
144 };
145
146 static int pl2303_vendor_read(__u16 value, __u16 index,
147                 struct usb_serial *serial, unsigned char *buf)
148 {
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->interface->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;
156 }
157
158 static int pl2303_vendor_write(__u16 value, __u16 index,
159                 struct usb_serial *serial)
160 {
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->interface->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;
168 }
169
170 static int pl2303_startup(struct usb_serial *serial)
171 {
172         struct pl2303_serial_private *spriv;
173         enum pl2303_type type = type_0;
174         unsigned char *buf;
175
176         spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
177         if (!spriv)
178                 return -ENOMEM;
179
180         buf = kmalloc(10, GFP_KERNEL);
181         if (!buf) {
182                 kfree(spriv);
183                 return -ENOMEM;
184         }
185
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);
195
196         spriv->type = type;
197         usb_set_serial_data(serial, spriv);
198
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);
213
214         kfree(buf);
215         return 0;
216 }
217
218 static void pl2303_release(struct usb_serial *serial)
219 {
220         struct pl2303_serial_private *spriv;
221
222         spriv = usb_get_serial_data(serial);
223         kfree(spriv);
224 }
225
226 static int pl2303_port_probe(struct usb_serial_port *port)
227 {
228         struct pl2303_private *priv;
229
230         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
231         if (!priv)
232                 return -ENOMEM;
233
234         spin_lock_init(&priv->lock);
235
236         usb_set_serial_port_data(port, priv);
237
238         return 0;
239 }
240
241 static int pl2303_port_remove(struct usb_serial_port *port)
242 {
243         struct pl2303_private *priv;
244
245         priv = usb_get_serial_port_data(port);
246         kfree(priv);
247
248         return 0;
249 }
250
251 static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
252 {
253         struct usb_device *dev = port->serial->dev;
254         int retval;
255
256         retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
257                                  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
258                                  value, 0, NULL, 0, 100);
259         dev_dbg(&port->dev, "%s - value = %d, retval = %d\n", __func__,
260                 value, retval);
261         return retval;
262 }
263
264 static void pl2303_set_termios(struct tty_struct *tty,
265                 struct usb_serial_port *port, struct ktermios *old_termios)
266 {
267         struct usb_serial *serial = port->serial;
268         struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
269         struct pl2303_private *priv = usb_get_serial_port_data(port);
270         unsigned long flags;
271         unsigned int cflag;
272         unsigned char *buf;
273         int baud;
274         int i;
275         u8 control;
276         const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
277                                  4800, 7200, 9600, 14400, 19200, 28800, 38400,
278                                  57600, 115200, 230400, 460800, 614400,
279                                  921600, 1228800, 2457600, 3000000, 6000000 };
280         int baud_floor, baud_ceil;
281         int k;
282
283         /* The PL2303 is reported to lose bytes if you change
284            serial settings even to the same values as before. Thus
285            we actually need to filter in this specific case */
286
287         if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
288                 return;
289
290         cflag = tty->termios.c_cflag;
291
292         buf = kzalloc(7, GFP_KERNEL);
293         if (!buf) {
294                 dev_err(&port->dev, "%s - out of memory.\n", __func__);
295                 /* Report back no change occurred */
296                 if (old_termios)
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         switch (cflag & CSIZE) {
308         case CS5:
309                 buf[6] = 5;
310                 break;
311         case CS6:
312                 buf[6] = 6;
313                 break;
314         case CS7:
315                 buf[6] = 7;
316                 break;
317         default:
318         case CS8:
319                 buf[6] = 8;
320                 break;
321         }
322         dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
323
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)
328          */
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;
345                                 }
346                                 break;
347                         }
348                 }
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;
355                 }
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]
365                          */
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;
373                         }
374                         buf[0] = tmp;
375                 }
376         }
377
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
384                  */
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");
391                 }
392         } else {
393                 buf[4] = 0;
394                 dev_dbg(&port->dev, "stop bits = 1\n");
395         }
396
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");
410                         }
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");
418                         }
419                 }
420         } else {
421                 buf[5] = 0;
422                 dev_dbg(&port->dev, "parity = none\n");
423         }
424
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);
429
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 && (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                 pl2303_set_control_lines(port, control);
441         } else {
442                 spin_unlock_irqrestore(&priv->lock, flags);
443         }
444
445         buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
446
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]);
452
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);
460         }
461
462         /* Save resulting baud rate */
463         if (baud)
464                 tty_encode_baud_rate(tty, baud, baud);
465
466         kfree(buf);
467 }
468
469 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
470 {
471         struct pl2303_private *priv = usb_get_serial_port_data(port);
472         unsigned long flags;
473         u8 control;
474
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         pl2303_set_control_lines(port, control);
484 }
485
486 static void pl2303_close(struct usb_serial_port *port)
487 {
488         usb_serial_generic_close(port);
489         usb_kill_urb(port->interrupt_in_urb);
490 }
491
492 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
493 {
494         struct usb_serial *serial = port->serial;
495         struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
496         int result;
497
498         if (spriv->type != HX) {
499                 usb_clear_halt(serial->dev, port->write_urb->pipe);
500                 usb_clear_halt(serial->dev, port->read_urb->pipe);
501         } else {
502                 /* reset upstream data pipes */
503                 pl2303_vendor_write(8, 0, serial);
504                 pl2303_vendor_write(9, 0, serial);
505         }
506
507         /* Setup termios */
508         if (tty)
509                 pl2303_set_termios(tty, port, NULL);
510
511         result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
512         if (result) {
513                 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
514                         " error %d\n", __func__, result);
515                 return result;
516         }
517
518         result = usb_serial_generic_open(tty, port);
519         if (result) {
520                 usb_kill_urb(port->interrupt_in_urb);
521                 return result;
522         }
523
524         port->port.drain_delay = 256;
525         return 0;
526 }
527
528 static int pl2303_tiocmset(struct tty_struct *tty,
529                            unsigned int set, unsigned int clear)
530 {
531         struct usb_serial_port *port = tty->driver_data;
532         struct pl2303_private *priv = usb_get_serial_port_data(port);
533         unsigned long flags;
534         u8 control;
535         int ret;
536
537         spin_lock_irqsave(&priv->lock, flags);
538         if (set & TIOCM_RTS)
539                 priv->line_control |= CONTROL_RTS;
540         if (set & TIOCM_DTR)
541                 priv->line_control |= CONTROL_DTR;
542         if (clear & TIOCM_RTS)
543                 priv->line_control &= ~CONTROL_RTS;
544         if (clear & TIOCM_DTR)
545                 priv->line_control &= ~CONTROL_DTR;
546         control = priv->line_control;
547         spin_unlock_irqrestore(&priv->lock, flags);
548
549         ret = pl2303_set_control_lines(port, control);
550         if (ret)
551                 return usb_translate_errors(ret);
552
553         return 0;
554 }
555
556 static int pl2303_tiocmget(struct tty_struct *tty)
557 {
558         struct usb_serial_port *port = tty->driver_data;
559         struct pl2303_private *priv = usb_get_serial_port_data(port);
560         unsigned long flags;
561         unsigned int mcr;
562         unsigned int status;
563         unsigned int result;
564
565         spin_lock_irqsave(&priv->lock, flags);
566         mcr = priv->line_control;
567         status = priv->line_status;
568         spin_unlock_irqrestore(&priv->lock, flags);
569
570         result = ((mcr & CONTROL_DTR)           ? TIOCM_DTR : 0)
571                   | ((mcr & CONTROL_RTS)        ? TIOCM_RTS : 0)
572                   | ((status & UART_CTS)        ? TIOCM_CTS : 0)
573                   | ((status & UART_DSR)        ? TIOCM_DSR : 0)
574                   | ((status & UART_RING)       ? TIOCM_RI  : 0)
575                   | ((status & UART_DCD)        ? TIOCM_CD  : 0);
576
577         dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
578
579         return result;
580 }
581
582 static int pl2303_carrier_raised(struct usb_serial_port *port)
583 {
584         struct pl2303_private *priv = usb_get_serial_port_data(port);
585         if (priv->line_status & UART_DCD)
586                 return 1;
587         return 0;
588 }
589
590 static int pl2303_tiocmiwait(struct tty_struct *tty, unsigned long arg)
591 {
592         struct usb_serial_port *port = tty->driver_data;
593         struct pl2303_private *priv = usb_get_serial_port_data(port);
594         unsigned long flags;
595         unsigned int prevstatus;
596         unsigned int status;
597         unsigned int changed;
598
599         spin_lock_irqsave(&priv->lock, flags);
600         prevstatus = priv->line_status;
601         spin_unlock_irqrestore(&priv->lock, flags);
602
603         while (1) {
604                 interruptible_sleep_on(&port->port.delta_msr_wait);
605                 /* see if a signal did it */
606                 if (signal_pending(current))
607                         return -ERESTARTSYS;
608
609                 if (port->serial->disconnected)
610                         return -EIO;
611
612                 spin_lock_irqsave(&priv->lock, flags);
613                 status = priv->line_status;
614                 spin_unlock_irqrestore(&priv->lock, flags);
615
616                 changed = prevstatus ^ status;
617
618                 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
619                     ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
620                     ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
621                     ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
622                         return 0;
623                 }
624                 prevstatus = status;
625         }
626         /* NOTREACHED */
627         return 0;
628 }
629
630 static int pl2303_ioctl(struct tty_struct *tty,
631                         unsigned int cmd, unsigned long arg)
632 {
633         struct serial_struct ser;
634         struct usb_serial_port *port = tty->driver_data;
635
636         dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd);
637
638         switch (cmd) {
639         case TIOCGSERIAL:
640                 memset(&ser, 0, sizeof ser);
641                 ser.type = PORT_16654;
642                 ser.line = port->serial->minor;
643                 ser.port = port->number;
644                 ser.baud_base = 460800;
645
646                 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
647                         return -EFAULT;
648
649                 return 0;
650         default:
651                 dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd);
652                 break;
653         }
654         return -ENOIOCTLCMD;
655 }
656
657 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
658 {
659         struct usb_serial_port *port = tty->driver_data;
660         struct usb_serial *serial = port->serial;
661         u16 state;
662         int result;
663
664         if (break_state == 0)
665                 state = BREAK_OFF;
666         else
667                 state = BREAK_ON;
668         dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
669                         state == BREAK_OFF ? "off" : "on");
670
671         result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
672                                  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
673                                  0, NULL, 0, 100);
674         if (result)
675                 dev_err(&port->dev, "error sending break = %d\n", result);
676 }
677
678 static void pl2303_update_line_status(struct usb_serial_port *port,
679                                       unsigned char *data,
680                                       unsigned int actual_length)
681 {
682
683         struct pl2303_private *priv = usb_get_serial_port_data(port);
684         struct tty_struct *tty;
685         unsigned long flags;
686         u8 status_idx = UART_STATE;
687         u8 length = UART_STATE + 1;
688         u8 prev_line_status;
689         u16 idv, idp;
690
691         idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
692         idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
693
694
695         if (idv == SIEMENS_VENDOR_ID) {
696                 if (idp == SIEMENS_PRODUCT_ID_X65 ||
697                     idp == SIEMENS_PRODUCT_ID_SX1 ||
698                     idp == SIEMENS_PRODUCT_ID_X75) {
699
700                         length = 1;
701                         status_idx = 0;
702                 }
703         }
704
705         if (actual_length < length)
706                 return;
707
708         /* Save off the uart status for others to look at */
709         spin_lock_irqsave(&priv->lock, flags);
710         prev_line_status = priv->line_status;
711         priv->line_status = data[status_idx];
712         spin_unlock_irqrestore(&priv->lock, flags);
713         if (priv->line_status & UART_BREAK_ERROR)
714                 usb_serial_handle_break(port);
715         wake_up_interruptible(&port->port.delta_msr_wait);
716
717         tty = tty_port_tty_get(&port->port);
718         if (!tty)
719                 return;
720         if ((priv->line_status ^ prev_line_status) & UART_DCD)
721                 usb_serial_handle_dcd_change(port, tty,
722                                 priv->line_status & UART_DCD);
723         tty_kref_put(tty);
724 }
725
726 static void pl2303_read_int_callback(struct urb *urb)
727 {
728         struct usb_serial_port *port =  urb->context;
729         unsigned char *data = urb->transfer_buffer;
730         unsigned int actual_length = urb->actual_length;
731         int status = urb->status;
732         int retval;
733
734         switch (status) {
735         case 0:
736                 /* success */
737                 break;
738         case -ECONNRESET:
739         case -ENOENT:
740         case -ESHUTDOWN:
741                 /* this urb is terminated, clean up */
742                 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
743                         __func__, status);
744                 return;
745         default:
746                 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
747                         __func__, status);
748                 goto exit;
749         }
750
751         usb_serial_debug_data(&port->dev, __func__,
752                               urb->actual_length, urb->transfer_buffer);
753
754         pl2303_update_line_status(port, data, actual_length);
755
756 exit:
757         retval = usb_submit_urb(urb, GFP_ATOMIC);
758         if (retval)
759                 dev_err(&port->dev,
760                         "%s - usb_submit_urb failed with result %d\n",
761                         __func__, retval);
762 }
763
764 static void pl2303_process_read_urb(struct urb *urb)
765 {
766         struct usb_serial_port *port = urb->context;
767         struct pl2303_private *priv = usb_get_serial_port_data(port);
768         unsigned char *data = urb->transfer_buffer;
769         char tty_flag = TTY_NORMAL;
770         unsigned long flags;
771         u8 line_status;
772         int i;
773
774         /* update line status */
775         spin_lock_irqsave(&priv->lock, flags);
776         line_status = priv->line_status;
777         priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
778         spin_unlock_irqrestore(&priv->lock, flags);
779         wake_up_interruptible(&port->port.delta_msr_wait);
780
781         if (!urb->actual_length)
782                 return;
783
784         /* break takes precedence over parity, */
785         /* which takes precedence over framing errors */
786         if (line_status & UART_BREAK_ERROR)
787                 tty_flag = TTY_BREAK;
788         else if (line_status & UART_PARITY_ERROR)
789                 tty_flag = TTY_PARITY;
790         else if (line_status & UART_FRAME_ERROR)
791                 tty_flag = TTY_FRAME;
792         dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__, tty_flag);
793
794         /* overrun is special, not associated with a char */
795         if (line_status & UART_OVERRUN_ERROR)
796                 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
797
798         if (port->port.console && port->sysrq) {
799                 for (i = 0; i < urb->actual_length; ++i)
800                         if (!usb_serial_handle_sysrq_char(port, data[i]))
801                                 tty_insert_flip_char(&port->port, data[i],
802                                                 tty_flag);
803         } else {
804                 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
805                                                         urb->actual_length);
806         }
807
808         tty_flip_buffer_push(&port->port);
809 }
810
811 /* All of the device info needed for the PL2303 SIO serial converter */
812 static struct usb_serial_driver pl2303_device = {
813         .driver = {
814                 .owner =        THIS_MODULE,
815                 .name =         "pl2303",
816         },
817         .id_table =             id_table,
818         .num_ports =            1,
819         .bulk_in_size =         256,
820         .bulk_out_size =        256,
821         .open =                 pl2303_open,
822         .close =                pl2303_close,
823         .dtr_rts =              pl2303_dtr_rts,
824         .carrier_raised =       pl2303_carrier_raised,
825         .ioctl =                pl2303_ioctl,
826         .break_ctl =            pl2303_break_ctl,
827         .set_termios =          pl2303_set_termios,
828         .tiocmget =             pl2303_tiocmget,
829         .tiocmset =             pl2303_tiocmset,
830         .tiocmiwait =           pl2303_tiocmiwait,
831         .process_read_urb =     pl2303_process_read_urb,
832         .read_int_callback =    pl2303_read_int_callback,
833         .attach =               pl2303_startup,
834         .release =              pl2303_release,
835         .port_probe =           pl2303_port_probe,
836         .port_remove =          pl2303_port_remove,
837 };
838
839 static struct usb_serial_driver * const serial_drivers[] = {
840         &pl2303_device, NULL
841 };
842
843 module_usb_serial_driver(serial_drivers, id_table);
844
845 MODULE_DESCRIPTION(DRIVER_DESC);
846 MODULE_LICENSE("GPL");