drivers/*: mark variables with uninitialized_var()
[linux-2.6] / 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 driver
14  *
15  */
16
17 #include <linux/kernel.h>
18 #include <linux/errno.h>
19 #include <linux/init.h>
20 #include <linux/slab.h>
21 #include <linux/tty.h>
22 #include <linux/tty_driver.h>
23 #include <linux/tty_flip.h>
24 #include <linux/serial.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/spinlock.h>
28 #include <asm/uaccess.h>
29 #include <linux/usb.h>
30 #include <linux/usb/serial.h>
31 #include "pl2303.h"
32
33 /*
34  * Version Information
35  */
36 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
37
38 static int debug;
39
40 #define PL2303_CLOSING_WAIT     (30*HZ)
41
42 #define PL2303_BUF_SIZE         1024
43 #define PL2303_TMP_BUF_SIZE     1024
44
45 struct pl2303_buf {
46         unsigned int    buf_size;
47         char            *buf_buf;
48         char            *buf_get;
49         char            *buf_put;
50 };
51
52 static struct usb_device_id id_table [] = {
53         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
54         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
55         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
56         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
57         { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
58         { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
59         { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
60         { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
61         { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
62         { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
63         { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
64         { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
65         { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
66         { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
67         { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
68         { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
69         { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
70         { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
71         { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
72         { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
73         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
74         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
75         { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
76         { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
77         { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
78         { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
79         { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
80         { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
81         { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
82         { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
83         { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
84         { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
85         { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ID) },
86         { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
87         { }                                     /* Terminating entry */
88 };
89
90 MODULE_DEVICE_TABLE(usb, id_table);
91
92 static struct usb_driver pl2303_driver = {
93         .name =         "pl2303",
94         .probe =        usb_serial_probe,
95         .disconnect =   usb_serial_disconnect,
96         .id_table =     id_table,
97         .no_dynamic_id =        1,
98 };
99
100 #define SET_LINE_REQUEST_TYPE           0x21
101 #define SET_LINE_REQUEST                0x20
102
103 #define SET_CONTROL_REQUEST_TYPE        0x21
104 #define SET_CONTROL_REQUEST             0x22
105 #define CONTROL_DTR                     0x01
106 #define CONTROL_RTS                     0x02
107
108 #define BREAK_REQUEST_TYPE              0x21
109 #define BREAK_REQUEST                   0x23    
110 #define BREAK_ON                        0xffff
111 #define BREAK_OFF                       0x0000
112
113 #define GET_LINE_REQUEST_TYPE           0xa1
114 #define GET_LINE_REQUEST                0x21
115
116 #define VENDOR_WRITE_REQUEST_TYPE       0x40
117 #define VENDOR_WRITE_REQUEST            0x01
118
119 #define VENDOR_READ_REQUEST_TYPE        0xc0
120 #define VENDOR_READ_REQUEST             0x01
121
122 #define UART_STATE                      0x08
123 #define UART_STATE_TRANSIENT_MASK       0x74
124 #define UART_DCD                        0x01
125 #define UART_DSR                        0x02
126 #define UART_BREAK_ERROR                0x04
127 #define UART_RING                       0x08
128 #define UART_FRAME_ERROR                0x10
129 #define UART_PARITY_ERROR               0x20
130 #define UART_OVERRUN_ERROR              0x40
131 #define UART_CTS                        0x80
132
133
134 enum pl2303_type {
135         type_0,         /* don't know the difference between type 0 and */
136         type_1,         /* type 1, until someone from prolific tells us... */
137         HX,             /* HX version of the pl2303 chip */
138 };
139
140 struct pl2303_private {
141         spinlock_t lock;
142         struct pl2303_buf *buf;
143         int write_urb_in_use;
144         wait_queue_head_t delta_msr_wait;
145         u8 line_control;
146         u8 line_status;
147         u8 termios_initialized;
148         enum pl2303_type type;
149 };
150
151 /*
152  * pl2303_buf_alloc
153  *
154  * Allocate a circular buffer and all associated memory.
155  */
156 static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
157 {
158         struct pl2303_buf *pb;
159
160         if (size == 0)
161                 return NULL;
162
163         pb = kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
164         if (pb == NULL)
165                 return NULL;
166
167         pb->buf_buf = kmalloc(size, GFP_KERNEL);
168         if (pb->buf_buf == NULL) {
169                 kfree(pb);
170                 return NULL;
171         }
172
173         pb->buf_size = size;
174         pb->buf_get = pb->buf_put = pb->buf_buf;
175
176         return pb;
177 }
178
179 /*
180  * pl2303_buf_free
181  *
182  * Free the buffer and all associated memory.
183  */
184 static void pl2303_buf_free(struct pl2303_buf *pb)
185 {
186         if (pb) {
187                 kfree(pb->buf_buf);
188                 kfree(pb);
189         }
190 }
191
192 /*
193  * pl2303_buf_clear
194  *
195  * Clear out all data in the circular buffer.
196  */
197 static void pl2303_buf_clear(struct pl2303_buf *pb)
198 {
199         if (pb != NULL)
200                 pb->buf_get = pb->buf_put;
201                 /* equivalent to a get of all data available */
202 }
203
204 /*
205  * pl2303_buf_data_avail
206  *
207  * Return the number of bytes of data available in the circular
208  * buffer.
209  */
210 static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
211 {
212         if (pb == NULL)
213                 return 0;
214
215         return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
216 }
217
218 /*
219  * pl2303_buf_space_avail
220  *
221  * Return the number of bytes of space available in the circular
222  * buffer.
223  */
224 static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
225 {
226         if (pb == NULL)
227                 return 0;
228
229         return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
230 }
231
232 /*
233  * pl2303_buf_put
234  *
235  * Copy data data from a user buffer and put it into the circular buffer.
236  * Restrict to the amount of space available.
237  *
238  * Return the number of bytes copied.
239  */
240 static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
241                                    unsigned int count)
242 {
243         unsigned int len;
244
245         if (pb == NULL)
246                 return 0;
247
248         len  = pl2303_buf_space_avail(pb);
249         if (count > len)
250                 count = len;
251
252         if (count == 0)
253                 return 0;
254
255         len = pb->buf_buf + pb->buf_size - pb->buf_put;
256         if (count > len) {
257                 memcpy(pb->buf_put, buf, len);
258                 memcpy(pb->buf_buf, buf+len, count - len);
259                 pb->buf_put = pb->buf_buf + count - len;
260         } else {
261                 memcpy(pb->buf_put, buf, count);
262                 if (count < len)
263                         pb->buf_put += count;
264                 else /* count == len */
265                         pb->buf_put = pb->buf_buf;
266         }
267
268         return count;
269 }
270
271 /*
272  * pl2303_buf_get
273  *
274  * Get data from the circular buffer and copy to the given buffer.
275  * Restrict to the amount of data available.
276  *
277  * Return the number of bytes copied.
278  */
279 static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
280                                    unsigned int count)
281 {
282         unsigned int len;
283
284         if (pb == NULL)
285                 return 0;
286
287         len = pl2303_buf_data_avail(pb);
288         if (count > len)
289                 count = len;
290
291         if (count == 0)
292                 return 0;
293
294         len = pb->buf_buf + pb->buf_size - pb->buf_get;
295         if (count > len) {
296                 memcpy(buf, pb->buf_get, len);
297                 memcpy(buf+len, pb->buf_buf, count - len);
298                 pb->buf_get = pb->buf_buf + count - len;
299         } else {
300                 memcpy(buf, pb->buf_get, count);
301                 if (count < len)
302                         pb->buf_get += count;
303                 else /* count == len */
304                         pb->buf_get = pb->buf_buf;
305         }
306
307         return count;
308 }
309
310 static int pl2303_startup(struct usb_serial *serial)
311 {
312         struct pl2303_private *priv;
313         enum pl2303_type type = type_0;
314         int i;
315
316         if (serial->dev->descriptor.bDeviceClass == 0x02)
317                 type = type_0;
318         else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
319                 type = HX;
320         else if (serial->dev->descriptor.bDeviceClass == 0x00)
321                 type = type_1;
322         else if (serial->dev->descriptor.bDeviceClass == 0xFF)
323                 type = type_1;
324         dbg("device type: %d", type);
325
326         for (i = 0; i < serial->num_ports; ++i) {
327                 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
328                 if (!priv)
329                         goto cleanup;
330                 spin_lock_init(&priv->lock);
331                 priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
332                 if (priv->buf == NULL) {
333                         kfree(priv);
334                         goto cleanup;
335                 }
336                 init_waitqueue_head(&priv->delta_msr_wait);
337                 priv->type = type;
338                 usb_set_serial_port_data(serial->port[i], priv);
339         }
340         return 0;
341
342 cleanup:
343         for (--i; i>=0; --i) {
344                 priv = usb_get_serial_port_data(serial->port[i]);
345                 pl2303_buf_free(priv->buf);
346                 kfree(priv);
347                 usb_set_serial_port_data(serial->port[i], NULL);
348         }
349         return -ENOMEM;
350 }
351
352 static int set_control_lines(struct usb_device *dev, u8 value)
353 {
354         int retval;
355         
356         retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
357                                  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
358                                  value, 0, NULL, 0, 100);
359         dbg("%s - value = %d, retval = %d", __FUNCTION__, value, retval);
360         return retval;
361 }
362
363 static void pl2303_send(struct usb_serial_port *port)
364 {
365         int count, result;
366         struct pl2303_private *priv = usb_get_serial_port_data(port);
367         unsigned long flags;
368
369         dbg("%s - port %d", __FUNCTION__, port->number);
370
371         spin_lock_irqsave(&priv->lock, flags);
372
373         if (priv->write_urb_in_use) {
374                 spin_unlock_irqrestore(&priv->lock, flags);
375                 return;
376         }
377
378         count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
379                                port->bulk_out_size);
380
381         if (count == 0) {
382                 spin_unlock_irqrestore(&priv->lock, flags);
383                 return;
384         }
385
386         priv->write_urb_in_use = 1;
387
388         spin_unlock_irqrestore(&priv->lock, flags);
389
390         usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count,
391                               port->write_urb->transfer_buffer);
392
393         port->write_urb->transfer_buffer_length = count;
394         port->write_urb->dev = port->serial->dev;
395         result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
396         if (result) {
397                 dev_err(&port->dev, "%s - failed submitting write urb,"
398                         " error %d\n", __FUNCTION__, result);
399                 priv->write_urb_in_use = 0;
400                 // TODO: reschedule pl2303_send
401         }
402
403         usb_serial_port_softint(port);
404 }
405
406 static int pl2303_write(struct usb_serial_port *port, const unsigned char *buf,
407                         int count)
408 {
409         struct pl2303_private *priv = usb_get_serial_port_data(port);
410         unsigned long flags;
411
412         dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
413
414         if (!count)
415                 return count;
416
417         spin_lock_irqsave(&priv->lock, flags);
418         count = pl2303_buf_put(priv->buf, buf, count);
419         spin_unlock_irqrestore(&priv->lock, flags);
420
421         pl2303_send(port);
422
423         return count;
424 }
425
426 static int pl2303_write_room(struct usb_serial_port *port)
427 {
428         struct pl2303_private *priv = usb_get_serial_port_data(port);
429         int room = 0;
430         unsigned long flags;
431
432         dbg("%s - port %d", __FUNCTION__, port->number);
433
434         spin_lock_irqsave(&priv->lock, flags);
435         room = pl2303_buf_space_avail(priv->buf);
436         spin_unlock_irqrestore(&priv->lock, flags);
437
438         dbg("%s - returns %d", __FUNCTION__, room);
439         return room;
440 }
441
442 static int pl2303_chars_in_buffer(struct usb_serial_port *port)
443 {
444         struct pl2303_private *priv = usb_get_serial_port_data(port);
445         int chars = 0;
446         unsigned long flags;
447
448         dbg("%s - port %d", __FUNCTION__, port->number);
449
450         spin_lock_irqsave(&priv->lock, flags);
451         chars = pl2303_buf_data_avail(priv->buf);
452         spin_unlock_irqrestore(&priv->lock, flags);
453
454         dbg("%s - returns %d", __FUNCTION__, chars);
455         return chars;
456 }
457
458 static void pl2303_set_termios(struct usb_serial_port *port,
459                                struct ktermios *old_termios)
460 {
461         struct usb_serial *serial = port->serial;
462         struct pl2303_private *priv = usb_get_serial_port_data(port);
463         unsigned long flags;
464         unsigned int cflag;
465         unsigned char *buf;
466         int baud;
467         int i;
468         u8 control;
469
470         dbg("%s -  port %d", __FUNCTION__, port->number);
471
472         if ((!port->tty) || (!port->tty->termios)) {
473                 dbg("%s - no tty structures", __FUNCTION__);
474                 return;
475         }
476
477         spin_lock_irqsave(&priv->lock, flags);
478         if (!priv->termios_initialized) {
479                 *(port->tty->termios) = tty_std_termios;
480                 port->tty->termios->c_cflag = B9600 | CS8 | CREAD |
481                                               HUPCL | CLOCAL;
482                 priv->termios_initialized = 1;
483         }
484         spin_unlock_irqrestore(&priv->lock, flags);
485
486         cflag = port->tty->termios->c_cflag;
487
488         buf = kzalloc(7, GFP_KERNEL);
489         if (!buf) {
490                 dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__);
491                 return;
492         }
493
494         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
495                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
496                             0, 0, buf, 7, 100);
497         dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
498             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
499
500         if (cflag & CSIZE) {
501                 switch (cflag & CSIZE) {
502                         case CS5:       buf[6] = 5;     break;
503                         case CS6:       buf[6] = 6;     break;
504                         case CS7:       buf[6] = 7;     break;
505                         default:
506                         case CS8:       buf[6] = 8;     break;
507                 }
508                 dbg("%s - data bits = %d", __FUNCTION__, buf[6]);
509         }
510
511         baud = tty_get_baud_rate(port->tty);;
512         dbg("%s - baud = %d", __FUNCTION__, baud);
513         if (baud) {
514                 buf[0] = baud & 0xff;
515                 buf[1] = (baud >> 8) & 0xff;
516                 buf[2] = (baud >> 16) & 0xff;
517                 buf[3] = (baud >> 24) & 0xff;
518         }
519
520         /* For reference buf[4]=0 is 1 stop bits */
521         /* For reference buf[4]=1 is 1.5 stop bits */
522         /* For reference buf[4]=2 is 2 stop bits */
523         if (cflag & CSTOPB) {
524                 buf[4] = 2;
525                 dbg("%s - stop bits = 2", __FUNCTION__);
526         } else {
527                 buf[4] = 0;
528                 dbg("%s - stop bits = 1", __FUNCTION__);
529         }
530
531         if (cflag & PARENB) {
532                 /* For reference buf[5]=0 is none parity */
533                 /* For reference buf[5]=1 is odd parity */
534                 /* For reference buf[5]=2 is even parity */
535                 /* For reference buf[5]=3 is mark parity */
536                 /* For reference buf[5]=4 is space parity */
537                 if (cflag & PARODD) {
538                         buf[5] = 1;
539                         dbg("%s - parity = odd", __FUNCTION__);
540                 } else {
541                         buf[5] = 2;
542                         dbg("%s - parity = even", __FUNCTION__);
543                 }
544         } else {
545                 buf[5] = 0;
546                 dbg("%s - parity = none", __FUNCTION__);
547         }
548
549         i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
550                             SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
551                             0, 0, buf, 7, 100);
552         dbg("0x21:0x20:0:0  %d", i);
553
554         /* change control lines if we are switching to or from B0 */
555         spin_lock_irqsave(&priv->lock, flags);
556         control = priv->line_control;
557         if ((cflag & CBAUD) == B0)
558                 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
559         else
560                 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
561         if (control != priv->line_control) {
562                 control = priv->line_control;
563                 spin_unlock_irqrestore(&priv->lock, flags);
564                 set_control_lines(serial->dev, control);
565         } else {
566                 spin_unlock_irqrestore(&priv->lock, flags);
567         }
568
569         buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
570
571         i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
572                             GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
573                             0, 0, buf, 7, 100);
574         dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
575              buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
576
577         if (cflag & CRTSCTS) {
578                 __u16 index;
579                 if (priv->type == HX)
580                         index = 0x61;
581                 else
582                         index = 0x41;
583                 i = usb_control_msg(serial->dev,
584                                     usb_sndctrlpipe(serial->dev, 0),
585                                     VENDOR_WRITE_REQUEST,
586                                     VENDOR_WRITE_REQUEST_TYPE,
587                                     0x0, index, NULL, 0, 100);
588                 dbg("0x40:0x1:0x0:0x%x  %d", index, i);
589         } else {
590                 i = usb_control_msg(serial->dev,
591                                     usb_sndctrlpipe(serial->dev, 0),
592                                     VENDOR_WRITE_REQUEST,
593                                     VENDOR_WRITE_REQUEST_TYPE,
594                                     0x0, 0x0, NULL, 0, 100);
595                 dbg ("0x40:0x1:0x0:0x0  %d", i);
596         }
597
598         kfree(buf);
599 }
600
601 static void pl2303_close(struct usb_serial_port *port, struct file *filp)
602 {
603         struct pl2303_private *priv = usb_get_serial_port_data(port);
604         unsigned long flags;
605         unsigned int c_cflag;
606         int bps;
607         long timeout;
608         wait_queue_t wait;
609
610         dbg("%s - port %d", __FUNCTION__, port->number);
611
612         /* wait for data to drain from the buffer */
613         spin_lock_irqsave(&priv->lock, flags);
614         timeout = PL2303_CLOSING_WAIT;
615         init_waitqueue_entry(&wait, current);
616         add_wait_queue(&port->tty->write_wait, &wait);
617         for (;;) {
618                 set_current_state(TASK_INTERRUPTIBLE);
619                 if (pl2303_buf_data_avail(priv->buf) == 0 ||
620                     timeout == 0 || signal_pending(current) ||
621                     !usb_get_intfdata(port->serial->interface)) /* disconnect */
622                         break;
623                 spin_unlock_irqrestore(&priv->lock, flags);
624                 timeout = schedule_timeout(timeout);
625                 spin_lock_irqsave(&priv->lock, flags);
626         }
627         set_current_state(TASK_RUNNING);
628         remove_wait_queue(&port->tty->write_wait, &wait);
629         /* clear out any remaining data in the buffer */
630         pl2303_buf_clear(priv->buf);
631         spin_unlock_irqrestore(&priv->lock, flags);
632
633         /* wait for characters to drain from the device */
634         /* (this is long enough for the entire 256 byte */
635         /* pl2303 hardware buffer to drain with no flow */
636         /* control for data rates of 1200 bps or more, */
637         /* for lower rates we should really know how much */
638         /* data is in the buffer to compute a delay */
639         /* that is not unnecessarily long) */
640         bps = tty_get_baud_rate(port->tty);
641         if (bps > 1200)
642                 timeout = max((HZ*2560)/bps,HZ/10);
643         else
644                 timeout = 2*HZ;
645         schedule_timeout_interruptible(timeout);
646
647         /* shutdown our urbs */
648         dbg("%s - shutting down urbs", __FUNCTION__);
649         usb_kill_urb(port->write_urb);
650         usb_kill_urb(port->read_urb);
651         usb_kill_urb(port->interrupt_in_urb);
652
653         if (port->tty) {
654                 c_cflag = port->tty->termios->c_cflag;
655                 if (c_cflag & HUPCL) {
656                         /* drop DTR and RTS */
657                         spin_lock_irqsave(&priv->lock, flags);
658                         priv->line_control = 0;
659                         spin_unlock_irqrestore(&priv->lock, flags);
660                         set_control_lines(port->serial->dev, 0);
661                 }
662         }
663 }
664
665 static int pl2303_open(struct usb_serial_port *port, struct file *filp)
666 {
667         struct ktermios tmp_termios;
668         struct usb_serial *serial = port->serial;
669         struct pl2303_private *priv = usb_get_serial_port_data(port);
670         unsigned char *buf;
671         int result;
672
673         dbg("%s -  port %d", __FUNCTION__, port->number);
674
675         if (priv->type != HX) {
676                 usb_clear_halt(serial->dev, port->write_urb->pipe);
677                 usb_clear_halt(serial->dev, port->read_urb->pipe);
678         }
679
680         buf = kmalloc(10, GFP_KERNEL);
681         if (buf==NULL)
682                 return -ENOMEM;
683
684 #define FISH(a,b,c,d)                                                           \
685         result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),     \
686                                b, a, c, d, buf, 1, 100);                        \
687         dbg("0x%x:0x%x:0x%x:0x%x  %d - %x",a,b,c,d,result,buf[0]);
688
689 #define SOUP(a,b,c,d)                                                           \
690         result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),     \
691                                b, a, c, d, NULL, 0, 100);                       \
692         dbg("0x%x:0x%x:0x%x:0x%x  %d",a,b,c,d,result);
693
694         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
695         SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
696         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
697         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
698         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
699         SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
700         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
701         FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
702         SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
703         SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
704
705         if (priv->type == HX) {
706                 /* HX chip */
707                 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x44);
708                 /* reset upstream data pipes */
709                 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 8, 0);
710                 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 9, 0);
711         } else {
712                 SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x24);
713         }
714
715         kfree(buf);
716
717         /* Setup termios */
718         if (port->tty) {
719                 pl2303_set_termios(port, &tmp_termios);
720         }
721
722         //FIXME: need to assert RTS and DTR if CRTSCTS off
723
724         dbg("%s - submitting read urb", __FUNCTION__);
725         port->read_urb->dev = serial->dev;
726         result = usb_submit_urb(port->read_urb, GFP_KERNEL);
727         if (result) {
728                 dev_err(&port->dev, "%s - failed submitting read urb,"
729                         " error %d\n", __FUNCTION__, result);
730                 pl2303_close(port, NULL);
731                 return -EPROTO;
732         }
733
734         dbg("%s - submitting interrupt urb", __FUNCTION__);
735         port->interrupt_in_urb->dev = serial->dev;
736         result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
737         if (result) {
738                 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
739                         " error %d\n", __FUNCTION__, result);
740                 pl2303_close(port, NULL);
741                 return -EPROTO;
742         }
743         return 0;
744 }
745
746 static int pl2303_tiocmset(struct usb_serial_port *port, struct file *file,
747                            unsigned int set, unsigned int clear)
748 {
749         struct pl2303_private *priv = usb_get_serial_port_data(port);
750         unsigned long flags;
751         u8 control;
752
753         if (!usb_get_intfdata(port->serial->interface))
754                 return -ENODEV;
755
756         spin_lock_irqsave(&priv->lock, flags);
757         if (set & TIOCM_RTS)
758                 priv->line_control |= CONTROL_RTS;
759         if (set & TIOCM_DTR)
760                 priv->line_control |= CONTROL_DTR;
761         if (clear & TIOCM_RTS)
762                 priv->line_control &= ~CONTROL_RTS;
763         if (clear & TIOCM_DTR)
764                 priv->line_control &= ~CONTROL_DTR;
765         control = priv->line_control;
766         spin_unlock_irqrestore(&priv->lock, flags);
767
768         return set_control_lines(port->serial->dev, control);
769 }
770
771 static int pl2303_tiocmget(struct usb_serial_port *port, struct file *file)
772 {
773         struct pl2303_private *priv = usb_get_serial_port_data(port);
774         unsigned long flags;
775         unsigned int mcr;
776         unsigned int status;
777         unsigned int result;
778
779         dbg("%s (%d)", __FUNCTION__, port->number);
780
781         if (!usb_get_intfdata(port->serial->interface))
782                 return -ENODEV;
783
784         spin_lock_irqsave(&priv->lock, flags);
785         mcr = priv->line_control;
786         status = priv->line_status;
787         spin_unlock_irqrestore(&priv->lock, flags);
788
789         result = ((mcr & CONTROL_DTR)           ? TIOCM_DTR : 0)
790                   | ((mcr & CONTROL_RTS)        ? TIOCM_RTS : 0)
791                   | ((status & UART_CTS)        ? TIOCM_CTS : 0)
792                   | ((status & UART_DSR)        ? TIOCM_DSR : 0)
793                   | ((status & UART_RING)       ? TIOCM_RI  : 0)
794                   | ((status & UART_DCD)        ? TIOCM_CD  : 0);
795
796         dbg("%s - result = %x", __FUNCTION__, result);
797
798         return result;
799 }
800
801 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
802 {
803         struct pl2303_private *priv = usb_get_serial_port_data(port);
804         unsigned long flags;
805         unsigned int prevstatus;
806         unsigned int status;
807         unsigned int changed;
808
809         spin_lock_irqsave(&priv->lock, flags);
810         prevstatus = priv->line_status;
811         spin_unlock_irqrestore(&priv->lock, flags);
812
813         while (1) {
814                 interruptible_sleep_on(&priv->delta_msr_wait);
815                 /* see if a signal did it */
816                 if (signal_pending(current))
817                         return -ERESTARTSYS;
818
819                 spin_lock_irqsave(&priv->lock, flags);
820                 status = priv->line_status;
821                 spin_unlock_irqrestore(&priv->lock, flags);
822
823                 changed=prevstatus^status;
824
825                 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
826                     ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
827                     ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
828                     ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
829                         return 0;
830                 }
831                 prevstatus = status;
832         }
833         /* NOTREACHED */
834         return 0;
835 }
836
837 static int pl2303_ioctl(struct usb_serial_port *port, struct file *file,
838                         unsigned int cmd, unsigned long arg)
839 {
840         dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
841
842         switch (cmd) {
843                 case TIOCMIWAIT:
844                         dbg("%s (%d) TIOCMIWAIT", __FUNCTION__,  port->number);
845                         return wait_modem_info(port, arg);
846
847                 default:
848                         dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
849                         break;
850         }
851
852         return -ENOIOCTLCMD;
853 }
854
855 static void pl2303_break_ctl(struct usb_serial_port *port, int break_state)
856 {
857         struct usb_serial *serial = port->serial;
858         u16 state;
859         int result;
860
861         dbg("%s - port %d", __FUNCTION__, port->number);
862
863         if (break_state == 0)
864                 state = BREAK_OFF;
865         else
866                 state = BREAK_ON;
867         dbg("%s - turning break %s", __FUNCTION__, state==BREAK_OFF ? "off" : "on");
868
869         result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
870                                  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
871                                  0, NULL, 0, 100);
872         if (result)
873                 dbg("%s - error sending break = %d", __FUNCTION__, result);
874 }
875
876 static void pl2303_shutdown(struct usb_serial *serial)
877 {
878         int i;
879         struct pl2303_private *priv;
880
881         dbg("%s", __FUNCTION__);
882
883         for (i = 0; i < serial->num_ports; ++i) {
884                 priv = usb_get_serial_port_data(serial->port[i]);
885                 if (priv) {
886                         pl2303_buf_free(priv->buf);
887                         kfree(priv);
888                         usb_set_serial_port_data(serial->port[i], NULL);
889                 }
890         }
891 }
892
893 static void pl2303_update_line_status(struct usb_serial_port *port,
894                                       unsigned char *data,
895                                       unsigned int actual_length)
896 {
897
898         struct pl2303_private *priv = usb_get_serial_port_data(port);
899         unsigned long flags;
900         u8 status_idx = UART_STATE;
901         u8 length = UART_STATE + 1;
902         u16 idv, idp;
903
904         idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
905         idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
906
907
908         if (idv == SIEMENS_VENDOR_ID) {
909                 if (idp == SIEMENS_PRODUCT_ID_X65 ||
910                     idp == SIEMENS_PRODUCT_ID_SX1 ||
911                     idp == SIEMENS_PRODUCT_ID_X75) {
912
913                         length = 1;
914                         status_idx = 0;
915                 }
916         }
917
918         if (actual_length < length)
919                 return;
920
921         /* Save off the uart status for others to look at */
922         spin_lock_irqsave(&priv->lock, flags);
923         priv->line_status = data[status_idx];
924         spin_unlock_irqrestore(&priv->lock, flags);
925         wake_up_interruptible(&priv->delta_msr_wait);
926 }
927
928 static void pl2303_read_int_callback(struct urb *urb)
929 {
930         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
931         unsigned char *data = urb->transfer_buffer;
932         unsigned int actual_length = urb->actual_length;
933         int status = urb->status;
934         int retval;
935
936         dbg("%s (%d)", __FUNCTION__, port->number);
937
938         switch (status) {
939         case 0:
940                 /* success */
941                 break;
942         case -ECONNRESET:
943         case -ENOENT:
944         case -ESHUTDOWN:
945                 /* this urb is terminated, clean up */
946                 dbg("%s - urb shutting down with status: %d", __FUNCTION__,
947                     status);
948                 return;
949         default:
950                 dbg("%s - nonzero urb status received: %d", __FUNCTION__,
951                     status);
952                 goto exit;
953         }
954
955         usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
956                               urb->actual_length, urb->transfer_buffer);
957
958         pl2303_update_line_status(port, data, actual_length);
959
960 exit:
961         retval = usb_submit_urb(urb, GFP_ATOMIC);
962         if (retval)
963                 dev_err(&urb->dev->dev,
964                         "%s - usb_submit_urb failed with result %d\n",
965                         __FUNCTION__, retval);
966 }
967
968 static void pl2303_read_bulk_callback(struct urb *urb)
969 {
970         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
971         struct pl2303_private *priv = usb_get_serial_port_data(port);
972         struct tty_struct *tty;
973         unsigned char *data = urb->transfer_buffer;
974         unsigned long flags;
975         int i;
976         int result;
977         int status = urb->status;
978         u8 line_status;
979         char tty_flag;
980
981         dbg("%s - port %d", __FUNCTION__, port->number);
982
983         if (status) {
984                 dbg("%s - urb status = %d", __FUNCTION__, status);
985                 if (!port->open_count) {
986                         dbg("%s - port is closed, exiting.", __FUNCTION__);
987                         return;
988                 }
989                 if (status == -EPROTO) {
990                         /* PL2303 mysteriously fails with -EPROTO reschedule
991                          * the read */
992                         dbg("%s - caught -EPROTO, resubmitting the urb",
993                             __FUNCTION__);
994                         urb->dev = port->serial->dev;
995                         result = usb_submit_urb(urb, GFP_ATOMIC);
996                         if (result)
997                                 dev_err(&urb->dev->dev, "%s - failed"
998                                         " resubmitting read urb, error %d\n",
999                                         __FUNCTION__, result);
1000                         return;
1001                 }
1002                 dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
1003                 return;
1004         }
1005
1006         usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
1007                               urb->actual_length, data);
1008
1009         /* get tty_flag from status */
1010         tty_flag = TTY_NORMAL;
1011
1012         spin_lock_irqsave(&priv->lock, flags);
1013         line_status = priv->line_status;
1014         priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1015         spin_unlock_irqrestore(&priv->lock, flags);
1016         wake_up_interruptible(&priv->delta_msr_wait);
1017
1018         /* break takes precedence over parity, */
1019         /* which takes precedence over framing errors */
1020         if (line_status & UART_BREAK_ERROR )
1021                 tty_flag = TTY_BREAK;
1022         else if (line_status & UART_PARITY_ERROR)
1023                 tty_flag = TTY_PARITY;
1024         else if (line_status & UART_FRAME_ERROR)
1025                 tty_flag = TTY_FRAME;
1026         dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
1027
1028         tty = port->tty;
1029         if (tty && urb->actual_length) {
1030                 tty_buffer_request_room(tty, urb->actual_length + 1);
1031                 /* overrun is special, not associated with a char */
1032                 if (line_status & UART_OVERRUN_ERROR)
1033                         tty_insert_flip_char(tty, 0, TTY_OVERRUN);
1034                 for (i = 0; i < urb->actual_length; ++i)
1035                         tty_insert_flip_char(tty, data[i], tty_flag);
1036                 tty_flip_buffer_push(tty);
1037         }
1038
1039         /* Schedule the next read _if_ we are still open */
1040         if (port->open_count) {
1041                 urb->dev = port->serial->dev;
1042                 result = usb_submit_urb(urb, GFP_ATOMIC);
1043                 if (result)
1044                         dev_err(&urb->dev->dev, "%s - failed resubmitting"
1045                                 " read urb, error %d\n", __FUNCTION__, result);
1046         }
1047
1048         return;
1049 }
1050
1051 static void pl2303_write_bulk_callback(struct urb *urb)
1052 {
1053         struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
1054         struct pl2303_private *priv = usb_get_serial_port_data(port);
1055         int result;
1056         int status = urb->status;
1057
1058         dbg("%s - port %d", __FUNCTION__, port->number);
1059
1060         switch (status) {
1061         case 0:
1062                 /* success */
1063                 break;
1064         case -ECONNRESET:
1065         case -ENOENT:
1066         case -ESHUTDOWN:
1067                 /* this urb is terminated, clean up */
1068                 dbg("%s - urb shutting down with status: %d", __FUNCTION__,
1069                     status);
1070                 priv->write_urb_in_use = 0;
1071                 return;
1072         default:
1073                 /* error in the urb, so we have to resubmit it */
1074                 dbg("%s - Overflow in write", __FUNCTION__);
1075                 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__,
1076                     status);
1077                 port->write_urb->transfer_buffer_length = 1;
1078                 port->write_urb->dev = port->serial->dev;
1079                 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1080                 if (result)
1081                         dev_err(&urb->dev->dev, "%s - failed resubmitting write"
1082                                 " urb, error %d\n", __FUNCTION__, result);
1083                 else
1084                         return;
1085         }
1086
1087         priv->write_urb_in_use = 0;
1088
1089         /* send any buffered data */
1090         pl2303_send(port);
1091 }
1092
1093 /* All of the device info needed for the PL2303 SIO serial converter */
1094 static struct usb_serial_driver pl2303_device = {
1095         .driver = {
1096                 .owner =        THIS_MODULE,
1097                 .name =         "pl2303",
1098         },
1099         .id_table =             id_table,
1100         .usb_driver =           &pl2303_driver,
1101         .num_interrupt_in =     NUM_DONT_CARE,
1102         .num_bulk_in =          1,
1103         .num_bulk_out =         1,
1104         .num_ports =            1,
1105         .open =                 pl2303_open,
1106         .close =                pl2303_close,
1107         .write =                pl2303_write,
1108         .ioctl =                pl2303_ioctl,
1109         .break_ctl =            pl2303_break_ctl,
1110         .set_termios =          pl2303_set_termios,
1111         .tiocmget =             pl2303_tiocmget,
1112         .tiocmset =             pl2303_tiocmset,
1113         .read_bulk_callback =   pl2303_read_bulk_callback,
1114         .read_int_callback =    pl2303_read_int_callback,
1115         .write_bulk_callback =  pl2303_write_bulk_callback,
1116         .write_room =           pl2303_write_room,
1117         .chars_in_buffer =      pl2303_chars_in_buffer,
1118         .attach =               pl2303_startup,
1119         .shutdown =             pl2303_shutdown,
1120 };
1121
1122 static int __init pl2303_init(void)
1123 {
1124         int retval;
1125
1126         retval = usb_serial_register(&pl2303_device);
1127         if (retval)
1128                 goto failed_usb_serial_register;
1129         retval = usb_register(&pl2303_driver);
1130         if (retval)
1131                 goto failed_usb_register;
1132         info(DRIVER_DESC);
1133         return 0;
1134 failed_usb_register:
1135         usb_serial_deregister(&pl2303_device);
1136 failed_usb_serial_register:
1137         return retval;
1138 }
1139
1140 static void __exit pl2303_exit(void)
1141 {
1142         usb_deregister(&pl2303_driver);
1143         usb_serial_deregister(&pl2303_device);
1144 }
1145
1146 module_init(pl2303_init);
1147 module_exit(pl2303_exit);
1148
1149 MODULE_DESCRIPTION(DRIVER_DESC);
1150 MODULE_LICENSE("GPL");
1151
1152 module_param(debug, bool, S_IRUGO | S_IWUSR);
1153 MODULE_PARM_DESC(debug, "Debug enabled or not");
1154