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