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