USB: pl2303: Remove support for Samsung I330
[pandora-kernel.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 int debug;
40
41 #define PL2303_CLOSING_WAIT     (30*HZ)
42
43 static const struct usb_device_id id_table[] = {
44         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
45         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
46         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
47         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
48         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
49         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
50         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
51         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
52         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
53         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
54         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
55         { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
56         { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
57         { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
58         { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
59         { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
60         { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
61         { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
62         { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
63         { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
64         { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
65         { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
66         { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
67         { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
68         { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
69         { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
70         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
71         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
72         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
73         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
74         { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
75         { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
76         { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
77         { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
78         { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
79         { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
80         { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
81         { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
82         { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
83         { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
84         { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
85         { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
86         { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
87         { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
88         { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
89         { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
90         { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
91         { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
92         { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
93         { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
94         { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
95         { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
96         { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
97         { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
98         { }                                     /* Terminating entry */
99 };
100
101 MODULE_DEVICE_TABLE(usb, id_table);
102
103 static struct usb_driver pl2303_driver = {
104         .name =         "pl2303",
105         .probe =        usb_serial_probe,
106         .disconnect =   usb_serial_disconnect,
107         .id_table =     id_table,
108         .suspend =      usb_serial_suspend,
109         .resume =       usb_serial_resume,
110         .no_dynamic_id =        1,
111         .supports_autosuspend = 1,
112 };
113
114 #define SET_LINE_REQUEST_TYPE           0x21
115 #define SET_LINE_REQUEST                0x20
116
117 #define SET_CONTROL_REQUEST_TYPE        0x21
118 #define SET_CONTROL_REQUEST             0x22
119 #define CONTROL_DTR                     0x01
120 #define CONTROL_RTS                     0x02
121
122 #define BREAK_REQUEST_TYPE              0x21
123 #define BREAK_REQUEST                   0x23
124 #define BREAK_ON                        0xffff
125 #define BREAK_OFF                       0x0000
126
127 #define GET_LINE_REQUEST_TYPE           0xa1
128 #define GET_LINE_REQUEST                0x21
129
130 #define VENDOR_WRITE_REQUEST_TYPE       0x40
131 #define VENDOR_WRITE_REQUEST            0x01
132
133 #define VENDOR_READ_REQUEST_TYPE        0xc0
134 #define VENDOR_READ_REQUEST             0x01
135
136 #define UART_STATE                      0x08
137 #define UART_STATE_TRANSIENT_MASK       0x74
138 #define UART_DCD                        0x01
139 #define UART_DSR                        0x02
140 #define UART_BREAK_ERROR                0x04
141 #define UART_RING                       0x08
142 #define UART_FRAME_ERROR                0x10
143 #define UART_PARITY_ERROR               0x20
144 #define UART_OVERRUN_ERROR              0x40
145 #define UART_CTS                        0x80
146
147
148 enum pl2303_type {
149         type_0,         /* don't know the difference between type 0 and */
150         type_1,         /* type 1, until someone from prolific tells us... */
151         HX,             /* HX version of the pl2303 chip */
152 };
153
154 struct pl2303_private {
155         spinlock_t lock;
156         u8 line_control;
157         u8 line_status;
158         enum pl2303_type type;
159
160         u8 line_settings[7];
161 };
162
163 static int pl2303_vendor_read(__u16 value, __u16 index,
164                 struct usb_serial *serial, unsigned char *buf)
165 {
166         int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
167                         VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
168                         value, index, buf, 1, 100);
169         dbg("0x%x:0x%x:0x%x:0x%x  %d - %x", VENDOR_READ_REQUEST_TYPE,
170                         VENDOR_READ_REQUEST, value, index, res, buf[0]);
171         return res;
172 }
173
174 static int pl2303_vendor_write(__u16 value, __u16 index,
175                 struct usb_serial *serial)
176 {
177         int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
178                         VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
179                         value, index, NULL, 0, 100);
180         dbg("0x%x:0x%x:0x%x:0x%x  %d", VENDOR_WRITE_REQUEST_TYPE,
181                         VENDOR_WRITE_REQUEST, value, index, res);
182         return res;
183 }
184
185 static int pl2303_startup(struct usb_serial *serial)
186 {
187         struct pl2303_private *priv;
188         enum pl2303_type type = type_0;
189         unsigned char *buf;
190         int i;
191
192         buf = kmalloc(10, GFP_KERNEL);
193         if (buf == NULL)
194                 return -ENOMEM;
195
196         if (serial->dev->descriptor.bDeviceClass == 0x02)
197                 type = type_0;
198         else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
199                 type = HX;
200         else if (serial->dev->descriptor.bDeviceClass == 0x00)
201                 type = type_1;
202         else if (serial->dev->descriptor.bDeviceClass == 0xFF)
203                 type = type_1;
204         dbg("device type: %d", type);
205
206         for (i = 0; i < serial->num_ports; ++i) {
207                 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
208                 if (!priv)
209                         goto cleanup;
210                 spin_lock_init(&priv->lock);
211                 priv->type = type;
212                 usb_set_serial_port_data(serial->port[i], priv);
213         }
214
215         pl2303_vendor_read(0x8484, 0, serial, buf);
216         pl2303_vendor_write(0x0404, 0, serial);
217         pl2303_vendor_read(0x8484, 0, serial, buf);
218         pl2303_vendor_read(0x8383, 0, serial, buf);
219         pl2303_vendor_read(0x8484, 0, serial, buf);
220         pl2303_vendor_write(0x0404, 1, serial);
221         pl2303_vendor_read(0x8484, 0, serial, buf);
222         pl2303_vendor_read(0x8383, 0, serial, buf);
223         pl2303_vendor_write(0, 1, serial);
224         pl2303_vendor_write(1, 0, serial);
225         if (type == HX)
226                 pl2303_vendor_write(2, 0x44, serial);
227         else
228                 pl2303_vendor_write(2, 0x24, serial);
229
230         kfree(buf);
231         return 0;
232
233 cleanup:
234         kfree(buf);
235         for (--i; i >= 0; --i) {
236                 priv = usb_get_serial_port_data(serial->port[i]);
237                 kfree(priv);
238                 usb_set_serial_port_data(serial->port[i], NULL);
239         }
240         return -ENOMEM;
241 }
242
243 static int set_control_lines(struct usb_device *dev, u8 value)
244 {
245         int retval;
246
247         retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
248                                  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
249                                  value, 0, NULL, 0, 100);
250         dbg("%s - value = %d, retval = %d", __func__, value, retval);
251         return retval;
252 }
253
254 static void pl2303_set_termios(struct tty_struct *tty,
255                 struct usb_serial_port *port, struct ktermios *old_termios)
256 {
257         struct usb_serial *serial = port->serial;
258         struct pl2303_private *priv = usb_get_serial_port_data(port);
259         unsigned long flags;
260         unsigned int cflag;
261         unsigned char *buf;
262         int baud;
263         int i;
264         u8 control;
265         const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
266                                  4800, 7200, 9600, 14400, 19200, 28800, 38400,
267                                  57600, 115200, 230400, 460800, 614400,
268                                  921600, 1228800, 2457600, 3000000, 6000000 };
269         int baud_floor, baud_ceil;
270         int k;
271
272         dbg("%s -  port %d", __func__, port->number);
273
274         if (old_termios && !tty_termios_hw_change(tty->termios, old_termios))
275                 return;
276
277         cflag = tty->termios->c_cflag;
278
279         buf = kzalloc(7, GFP_KERNEL);
280         if (!buf) {
281                 dev_err(&port->dev, "%s - out of memory.\n", __func__);
282                 /* Report back no change occurred */
283                 if (old_termios)
284                         *tty->termios = *old_termios;
285                 return;
286         }
287
288         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
289                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
290                             0, 0, buf, 7, 100);
291         dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
292             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
293
294         switch (C_CSIZE(tty)) {
295         case CS5:
296                 buf[6] = 5;
297                 break;
298         case CS6:
299                 buf[6] = 6;
300                 break;
301         case CS7:
302                 buf[6] = 7;
303                 break;
304         default:
305         case CS8:
306                 buf[6] = 8;
307         }
308         dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
309
310         /* For reference buf[0]:buf[3] baud rate value */
311         /* NOTE: Only the values defined in baud_sup are supported !
312          *       => if unsupported values are set, the PL2303 seems to use
313          *          9600 baud (at least my PL2303X always does)
314          */
315         baud = tty_get_baud_rate(tty);
316         dbg("%s - baud requested = %d", __func__, baud);
317         if (baud) {
318                 /* Set baudrate to nearest supported value */
319                 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
320                         if (baud_sup[k] / baud) {
321                                 baud_ceil = baud_sup[k];
322                                 if (k==0) {
323                                         baud = baud_ceil;
324                                 } else {
325                                         baud_floor = baud_sup[k-1];
326                                         if ((baud_ceil % baud)
327                                             > (baud % baud_floor))
328                                                 baud = baud_floor;
329                                         else
330                                                 baud = baud_ceil;
331                                 }
332                                 break;
333                         }
334                 }
335                 if (baud > 1228800) {
336                         /* type_0, type_1 only support up to 1228800 baud */
337                         if (priv->type != HX)
338                                 baud = 1228800;
339                         else if (baud > 6000000)
340                                 baud = 6000000;
341                 }
342                 dbg("%s - baud set = %d", __func__, baud);
343                 if (baud <= 115200) {
344                         buf[0] = baud & 0xff;
345                         buf[1] = (baud >> 8) & 0xff;
346                         buf[2] = (baud >> 16) & 0xff;
347                         buf[3] = (baud >> 24) & 0xff;
348                 } else {
349                         /* apparently the formula for higher speeds is:
350                          * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
351                          */
352                         unsigned tmp = 12*1000*1000*32 / baud;
353                         buf[3] = 0x80;
354                         buf[2] = 0;
355                         buf[1] = (tmp >= 256);
356                         while (tmp >= 256) {
357                                 tmp >>= 2;
358                                 buf[1] <<= 1;
359                         }
360                         buf[0] = tmp;
361                 }
362         }
363
364         /* For reference buf[4]=0 is 1 stop bits */
365         /* For reference buf[4]=1 is 1.5 stop bits */
366         /* For reference buf[4]=2 is 2 stop bits */
367         if (cflag & CSTOPB) {
368                 /* NOTE: Comply with "real" UARTs / RS232:
369                  *       use 1.5 instead of 2 stop bits with 5 data bits
370                  */
371                 if ((cflag & CSIZE) == CS5) {
372                         buf[4] = 1;
373                         dbg("%s - stop bits = 1.5", __func__);
374                 } else {
375                         buf[4] = 2;
376                         dbg("%s - stop bits = 2", __func__);
377                 }
378         } else {
379                 buf[4] = 0;
380                 dbg("%s - stop bits = 1", __func__);
381         }
382
383         if (cflag & PARENB) {
384                 /* For reference buf[5]=0 is none parity */
385                 /* For reference buf[5]=1 is odd parity */
386                 /* For reference buf[5]=2 is even parity */
387                 /* For reference buf[5]=3 is mark parity */
388                 /* For reference buf[5]=4 is space parity */
389                 if (cflag & PARODD) {
390                         if (cflag & CMSPAR) {
391                                 buf[5] = 3;
392                                 dbg("%s - parity = mark", __func__);
393                         } else {
394                                 buf[5] = 1;
395                                 dbg("%s - parity = odd", __func__);
396                         }
397                 } else {
398                         if (cflag & CMSPAR) {
399                                 buf[5] = 4;
400                                 dbg("%s - parity = space", __func__);
401                         } else {
402                                 buf[5] = 2;
403                                 dbg("%s - parity = even", __func__);
404                         }
405                 }
406         } else {
407                 buf[5] = 0;
408                 dbg("%s - parity = none", __func__);
409         }
410
411         /*
412          * Some PL2303 are known to lose bytes if you change serial settings
413          * even to the same values as before. Thus we actually need to filter
414          * in this specific case.
415          *
416          * Note that the tty_termios_hw_change check above is not sufficient
417          * as a previously requested baud rate may differ from the one
418          * actually used (and stored in old_termios).
419          *
420          * NOTE: No additional locking needed for line_settings as it is
421          *       only used in set_termios, which is serialised against itself.
422          */
423         if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
424                 i = usb_control_msg(serial->dev,
425                                     usb_sndctrlpipe(serial->dev, 0),
426                                     SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
427                                     0, 0, buf, 7, 100);
428
429                 dbg("0x21:0x20:0:0  %d", i);
430
431                 if (i == 7)
432                         memcpy(priv->line_settings, buf, 7);
433         }
434
435         /* change control lines if we are switching to or from B0 */
436         spin_lock_irqsave(&priv->lock, flags);
437         control = priv->line_control;
438         if ((cflag & CBAUD) == B0)
439                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
440         else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
441                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
442         if (control != priv->line_control) {
443                 control = priv->line_control;
444                 spin_unlock_irqrestore(&priv->lock, flags);
445                 set_control_lines(serial->dev, control);
446         } else {
447                 spin_unlock_irqrestore(&priv->lock, flags);
448         }
449
450         buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
451
452         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
453                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
454                             0, 0, buf, 7, 100);
455         dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
456              buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
457
458         if (cflag & CRTSCTS) {
459                 if (priv->type == HX)
460                         pl2303_vendor_write(0x0, 0x61, serial);
461                 else
462                         pl2303_vendor_write(0x0, 0x41, serial);
463         } else {
464                 pl2303_vendor_write(0x0, 0x0, serial);
465         }
466
467         /* Save resulting baud rate */
468         if (baud)
469                 tty_encode_baud_rate(tty, baud, baud);
470
471         kfree(buf);
472 }
473
474 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
475 {
476         struct pl2303_private *priv = usb_get_serial_port_data(port);
477         unsigned long flags;
478         u8 control;
479
480         spin_lock_irqsave(&priv->lock, flags);
481         /* Change DTR and RTS */
482         if (on)
483                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
484         else
485                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
486         control = priv->line_control;
487         spin_unlock_irqrestore(&priv->lock, flags);
488         set_control_lines(port->serial->dev, control);
489 }
490
491 static void pl2303_close(struct usb_serial_port *port)
492 {
493         dbg("%s - port %d", __func__, port->number);
494
495         usb_serial_generic_close(port);
496         usb_kill_urb(port->interrupt_in_urb);
497 }
498
499 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
500 {
501         struct usb_serial *serial = port->serial;
502         struct pl2303_private *priv = usb_get_serial_port_data(port);
503         int result;
504
505         dbg("%s -  port %d", __func__, port->number);
506
507         if (priv->type != HX) {
508                 usb_clear_halt(serial->dev, port->write_urb->pipe);
509                 usb_clear_halt(serial->dev, port->read_urb->pipe);
510         } else {
511                 /* reset upstream data pipes */
512                 pl2303_vendor_write(8, 0, serial);
513                 pl2303_vendor_write(9, 0, serial);
514         }
515
516         /* Setup termios */
517         if (tty)
518                 pl2303_set_termios(tty, port, NULL);
519
520         dbg("%s - submitting read urb", __func__);
521         result = usb_serial_generic_submit_read_urb(port, GFP_KERNEL);
522         if (result) {
523                 pl2303_close(port);
524                 return -EPROTO;
525         }
526
527         dbg("%s - submitting interrupt urb", __func__);
528         result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
529         if (result) {
530                 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
531                         " error %d\n", __func__, result);
532                 pl2303_close(port);
533                 return -EPROTO;
534         }
535         port->port.drain_delay = 256;
536         return 0;
537 }
538
539 static int pl2303_tiocmset(struct tty_struct *tty,
540                            unsigned int set, unsigned int clear)
541 {
542         struct usb_serial_port *port = tty->driver_data;
543         struct pl2303_private *priv = usb_get_serial_port_data(port);
544         unsigned long flags;
545         u8 control;
546
547         if (!usb_get_intfdata(port->serial->interface))
548                 return -ENODEV;
549
550         spin_lock_irqsave(&priv->lock, flags);
551         if (set & TIOCM_RTS)
552                 priv->line_control |= CONTROL_RTS;
553         if (set & TIOCM_DTR)
554                 priv->line_control |= CONTROL_DTR;
555         if (clear & TIOCM_RTS)
556                 priv->line_control &= ~CONTROL_RTS;
557         if (clear & TIOCM_DTR)
558                 priv->line_control &= ~CONTROL_DTR;
559         control = priv->line_control;
560         spin_unlock_irqrestore(&priv->lock, flags);
561
562         return set_control_lines(port->serial->dev, control);
563 }
564
565 static int pl2303_tiocmget(struct tty_struct *tty)
566 {
567         struct usb_serial_port *port = tty->driver_data;
568         struct pl2303_private *priv = usb_get_serial_port_data(port);
569         unsigned long flags;
570         unsigned int mcr;
571         unsigned int status;
572         unsigned int result;
573
574         dbg("%s (%d)", __func__, port->number);
575
576         if (!usb_get_intfdata(port->serial->interface))
577                 return -ENODEV;
578
579         spin_lock_irqsave(&priv->lock, flags);
580         mcr = priv->line_control;
581         status = priv->line_status;
582         spin_unlock_irqrestore(&priv->lock, flags);
583
584         result = ((mcr & CONTROL_DTR)           ? TIOCM_DTR : 0)
585                   | ((mcr & CONTROL_RTS)        ? TIOCM_RTS : 0)
586                   | ((status & UART_CTS)        ? TIOCM_CTS : 0)
587                   | ((status & UART_DSR)        ? TIOCM_DSR : 0)
588                   | ((status & UART_RING)       ? TIOCM_RI  : 0)
589                   | ((status & UART_DCD)        ? TIOCM_CD  : 0);
590
591         dbg("%s - result = %x", __func__, result);
592
593         return result;
594 }
595
596 static int pl2303_carrier_raised(struct usb_serial_port *port)
597 {
598         struct pl2303_private *priv = usb_get_serial_port_data(port);
599         if (priv->line_status & UART_DCD)
600                 return 1;
601         return 0;
602 }
603
604 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
605 {
606         struct pl2303_private *priv = usb_get_serial_port_data(port);
607         unsigned long flags;
608         unsigned int prevstatus;
609         unsigned int status;
610         unsigned int changed;
611
612         spin_lock_irqsave(&priv->lock, flags);
613         prevstatus = priv->line_status;
614         spin_unlock_irqrestore(&priv->lock, flags);
615
616         while (1) {
617                 interruptible_sleep_on(&port->delta_msr_wait);
618                 /* see if a signal did it */
619                 if (signal_pending(current))
620                         return -ERESTARTSYS;
621
622                 if (port->serial->disconnected)
623                         return -EIO;
624
625                 spin_lock_irqsave(&priv->lock, flags);
626                 status = priv->line_status;
627                 spin_unlock_irqrestore(&priv->lock, flags);
628
629                 changed = prevstatus ^ status;
630
631                 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
632                     ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
633                     ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
634                     ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
635                         return 0;
636                 }
637                 prevstatus = status;
638         }
639         /* NOTREACHED */
640         return 0;
641 }
642
643 static int pl2303_ioctl(struct tty_struct *tty,
644                         unsigned int cmd, unsigned long arg)
645 {
646         struct serial_struct ser;
647         struct usb_serial_port *port = tty->driver_data;
648         dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
649
650         switch (cmd) {
651         case TIOCGSERIAL:
652                 memset(&ser, 0, sizeof ser);
653                 ser.type = PORT_16654;
654                 ser.line = port->serial->minor;
655                 ser.port = port->number;
656                 ser.baud_base = 460800;
657
658                 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
659                         return -EFAULT;
660
661                 return 0;
662
663         case TIOCMIWAIT:
664                 dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
665                 return wait_modem_info(port, arg);
666         default:
667                 dbg("%s not supported = 0x%04x", __func__, cmd);
668                 break;
669         }
670         return -ENOIOCTLCMD;
671 }
672
673 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
674 {
675         struct usb_serial_port *port = tty->driver_data;
676         struct usb_serial *serial = port->serial;
677         u16 state;
678         int result;
679
680         dbg("%s - port %d", __func__, port->number);
681
682         if (break_state == 0)
683                 state = BREAK_OFF;
684         else
685                 state = BREAK_ON;
686         dbg("%s - turning break %s", __func__,
687                         state == BREAK_OFF ? "off" : "on");
688
689         result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
690                                  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
691                                  0, NULL, 0, 100);
692         if (result)
693                 dbg("%s - error sending break = %d", __func__, result);
694 }
695
696 static void pl2303_release(struct usb_serial *serial)
697 {
698         int i;
699         struct pl2303_private *priv;
700
701         dbg("%s", __func__);
702
703         for (i = 0; i < serial->num_ports; ++i) {
704                 priv = usb_get_serial_port_data(serial->port[i]);
705                 kfree(priv);
706         }
707 }
708
709 static void pl2303_update_line_status(struct usb_serial_port *port,
710                                       unsigned char *data,
711                                       unsigned int actual_length)
712 {
713
714         struct pl2303_private *priv = usb_get_serial_port_data(port);
715         struct tty_struct *tty;
716         unsigned long flags;
717         u8 status_idx = UART_STATE;
718         u8 length = UART_STATE + 1;
719         u8 prev_line_status;
720         u16 idv, idp;
721
722         idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
723         idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
724
725
726         if (idv == SIEMENS_VENDOR_ID) {
727                 if (idp == SIEMENS_PRODUCT_ID_X65 ||
728                     idp == SIEMENS_PRODUCT_ID_SX1 ||
729                     idp == SIEMENS_PRODUCT_ID_X75) {
730
731                         length = 1;
732                         status_idx = 0;
733                 }
734         }
735
736         if (actual_length < length)
737                 return;
738
739         /* Save off the uart status for others to look at */
740         spin_lock_irqsave(&priv->lock, flags);
741         prev_line_status = priv->line_status;
742         priv->line_status = data[status_idx];
743         spin_unlock_irqrestore(&priv->lock, flags);
744         if (priv->line_status & UART_BREAK_ERROR)
745                 usb_serial_handle_break(port);
746         wake_up_interruptible(&port->delta_msr_wait);
747
748         tty = tty_port_tty_get(&port->port);
749         if (!tty)
750                 return;
751         if ((priv->line_status ^ prev_line_status) & UART_DCD)
752                 usb_serial_handle_dcd_change(port, tty,
753                                 priv->line_status & UART_DCD);
754         tty_kref_put(tty);
755 }
756
757 static void pl2303_read_int_callback(struct urb *urb)
758 {
759         struct usb_serial_port *port =  urb->context;
760         unsigned char *data = urb->transfer_buffer;
761         unsigned int actual_length = urb->actual_length;
762         int status = urb->status;
763         int retval;
764
765         dbg("%s (%d)", __func__, port->number);
766
767         switch (status) {
768         case 0:
769                 /* success */
770                 break;
771         case -ECONNRESET:
772         case -ENOENT:
773         case -ESHUTDOWN:
774                 /* this urb is terminated, clean up */
775                 dbg("%s - urb shutting down with status: %d", __func__,
776                     status);
777                 return;
778         default:
779                 dbg("%s - nonzero urb status received: %d", __func__,
780                     status);
781                 goto exit;
782         }
783
784         usb_serial_debug_data(debug, &port->dev, __func__,
785                               urb->actual_length, urb->transfer_buffer);
786
787         pl2303_update_line_status(port, data, actual_length);
788
789 exit:
790         retval = usb_submit_urb(urb, GFP_ATOMIC);
791         if (retval)
792                 dev_err(&urb->dev->dev,
793                         "%s - usb_submit_urb failed with result %d\n",
794                         __func__, retval);
795 }
796
797 static void pl2303_process_read_urb(struct urb *urb)
798 {
799         struct usb_serial_port *port = urb->context;
800         struct pl2303_private *priv = usb_get_serial_port_data(port);
801         struct tty_struct *tty;
802         unsigned char *data = urb->transfer_buffer;
803         char tty_flag = TTY_NORMAL;
804         unsigned long flags;
805         u8 line_status;
806         int i;
807
808         /* update line status */
809         spin_lock_irqsave(&priv->lock, flags);
810         line_status = priv->line_status;
811         priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
812         spin_unlock_irqrestore(&priv->lock, flags);
813         wake_up_interruptible(&port->delta_msr_wait);
814
815         if (!urb->actual_length)
816                 return;
817
818         tty = tty_port_tty_get(&port->port);
819         if (!tty)
820                 return;
821
822         /* break takes precedence over parity, */
823         /* which takes precedence over framing errors */
824         if (line_status & UART_BREAK_ERROR)
825                 tty_flag = TTY_BREAK;
826         else if (line_status & UART_PARITY_ERROR)
827                 tty_flag = TTY_PARITY;
828         else if (line_status & UART_FRAME_ERROR)
829                 tty_flag = TTY_FRAME;
830         dbg("%s - tty_flag = %d", __func__, tty_flag);
831
832         /* overrun is special, not associated with a char */
833         if (line_status & UART_OVERRUN_ERROR)
834                 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
835
836         if (port->port.console && port->sysrq) {
837                 for (i = 0; i < urb->actual_length; ++i)
838                         if (!usb_serial_handle_sysrq_char(port, data[i]))
839                                 tty_insert_flip_char(tty, data[i], tty_flag);
840         } else {
841                 tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
842                                                         urb->actual_length);
843         }
844
845         tty_flip_buffer_push(tty);
846         tty_kref_put(tty);
847 }
848
849 /* All of the device info needed for the PL2303 SIO serial converter */
850 static struct usb_serial_driver pl2303_device = {
851         .driver = {
852                 .owner =        THIS_MODULE,
853                 .name =         "pl2303",
854         },
855         .id_table =             id_table,
856         .usb_driver =           &pl2303_driver,
857         .num_ports =            1,
858         .bulk_in_size =         256,
859         .bulk_out_size =        256,
860         .open =                 pl2303_open,
861         .close =                pl2303_close,
862         .dtr_rts =              pl2303_dtr_rts,
863         .carrier_raised =       pl2303_carrier_raised,
864         .ioctl =                pl2303_ioctl,
865         .break_ctl =            pl2303_break_ctl,
866         .set_termios =          pl2303_set_termios,
867         .tiocmget =             pl2303_tiocmget,
868         .tiocmset =             pl2303_tiocmset,
869         .process_read_urb =     pl2303_process_read_urb,
870         .read_int_callback =    pl2303_read_int_callback,
871         .attach =               pl2303_startup,
872         .release =              pl2303_release,
873 };
874
875 static int __init pl2303_init(void)
876 {
877         int retval;
878
879         retval = usb_serial_register(&pl2303_device);
880         if (retval)
881                 goto failed_usb_serial_register;
882         retval = usb_register(&pl2303_driver);
883         if (retval)
884                 goto failed_usb_register;
885         printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
886         return 0;
887 failed_usb_register:
888         usb_serial_deregister(&pl2303_device);
889 failed_usb_serial_register:
890         return retval;
891 }
892
893 static void __exit pl2303_exit(void)
894 {
895         usb_deregister(&pl2303_driver);
896         usb_serial_deregister(&pl2303_device);
897 }
898
899 module_init(pl2303_init);
900 module_exit(pl2303_exit);
901
902 MODULE_DESCRIPTION(DRIVER_DESC);
903 MODULE_LICENSE("GPL");
904
905 module_param(debug, bool, S_IRUGO | S_IWUSR);
906 MODULE_PARM_DESC(debug, "Debug enabled or not");
907