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