]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/usb/serial/pl2303.c
USB: serial: pl2303: new hardware support - sanwa multimeter
[mirror_ubuntu-bionic-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) },
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;
531
441b62c1 532 dbg("%s - port %d", __func__, port->number);
1da177e4 533
bf5e5834
AC
534 /* The PL2303 is reported to lose bytes if you change
535 serial settings even to the same values as before. Thus
536 we actually need to filter in this specific case */
537
95da310e 538 if (!tty_termios_hw_change(tty->termios, old_termios))
bf5e5834
AC
539 return;
540
95da310e 541 cflag = tty->termios->c_cflag;
1da177e4 542
372db8a7 543 buf = kzalloc(7, GFP_KERNEL);
1da177e4 544 if (!buf) {
441b62c1 545 dev_err(&port->dev, "%s - out of memory.\n", __func__);
a5b6f60c 546 /* Report back no change occurred */
95da310e 547 *tty->termios = *old_termios;
1da177e4
LT
548 return;
549 }
1da177e4 550
372db8a7
TG
551 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
552 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
553 0, 0, buf, 7, 100);
554 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
555 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
1da177e4
LT
556
557 if (cflag & CSIZE) {
558 switch (cflag & CSIZE) {
3a0f43e9
AC
559 case CS5:
560 buf[6] = 5;
561 break;
562 case CS6:
563 buf[6] = 6;
564 break;
565 case CS7:
566 buf[6] = 7;
567 break;
568 default:
569 case CS8:
570 buf[6] = 8;
571 break;
1da177e4 572 }
441b62c1 573 dbg("%s - data bits = %d", __func__, buf[6]);
1da177e4
LT
574 }
575
95da310e 576 baud = tty_get_baud_rate(tty);
441b62c1 577 dbg("%s - baud = %d", __func__, baud);
1da177e4
LT
578 if (baud) {
579 buf[0] = baud & 0xff;
580 buf[1] = (baud >> 8) & 0xff;
581 buf[2] = (baud >> 16) & 0xff;
582 buf[3] = (baud >> 24) & 0xff;
583 }
584
585 /* For reference buf[4]=0 is 1 stop bits */
586 /* For reference buf[4]=1 is 1.5 stop bits */
587 /* For reference buf[4]=2 is 2 stop bits */
588 if (cflag & CSTOPB) {
589 buf[4] = 2;
441b62c1 590 dbg("%s - stop bits = 2", __func__);
1da177e4
LT
591 } else {
592 buf[4] = 0;
441b62c1 593 dbg("%s - stop bits = 1", __func__);
1da177e4
LT
594 }
595
596 if (cflag & PARENB) {
597 /* For reference buf[5]=0 is none parity */
598 /* For reference buf[5]=1 is odd parity */
599 /* For reference buf[5]=2 is even parity */
600 /* For reference buf[5]=3 is mark parity */
601 /* For reference buf[5]=4 is space parity */
602 if (cflag & PARODD) {
603 buf[5] = 1;
441b62c1 604 dbg("%s - parity = odd", __func__);
1da177e4
LT
605 } else {
606 buf[5] = 2;
441b62c1 607 dbg("%s - parity = even", __func__);
1da177e4
LT
608 }
609 } else {
610 buf[5] = 0;
441b62c1 611 dbg("%s - parity = none", __func__);
1da177e4
LT
612 }
613
372db8a7
TG
614 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
615 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
616 0, 0, buf, 7, 100);
617 dbg("0x21:0x20:0:0 %d", i);
1da177e4
LT
618
619 /* change control lines if we are switching to or from B0 */
620 spin_lock_irqsave(&priv->lock, flags);
621 control = priv->line_control;
622 if ((cflag & CBAUD) == B0)
623 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
624 else
625 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
626 if (control != priv->line_control) {
627 control = priv->line_control;
628 spin_unlock_irqrestore(&priv->lock, flags);
629 set_control_lines(serial->dev, control);
630 } else {
631 spin_unlock_irqrestore(&priv->lock, flags);
632 }
372db8a7 633
1da177e4
LT
634 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
635
372db8a7
TG
636 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
637 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
638 0, 0, buf, 7, 100);
639 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
1da177e4
LT
640 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
641
642 if (cflag & CRTSCTS) {
1da177e4 643 if (priv->type == HX)
eb44da0b 644 pl2303_vendor_write(0x0, 0x61, serial);
1da177e4 645 else
eb44da0b 646 pl2303_vendor_write(0x0, 0x41, serial);
715f9527 647 } else {
eb44da0b 648 pl2303_vendor_write(0x0, 0x0, serial);
1da177e4 649 }
572d3138 650
df64c471
AC
651 /* FIXME: Need to read back resulting baud rate */
652 if (baud)
95da310e 653 tty_encode_baud_rate(tty, baud, baud);
df64c471 654
572d3138
TG
655 kfree(buf);
656}
657
335f8514
AC
658static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
659{
660 struct pl2303_private *priv = usb_get_serial_port_data(port);
661 unsigned long flags;
662 u8 control;
663
664 spin_lock_irqsave(&priv->lock, flags);
665 /* Change DTR and RTS */
666 if (on)
667 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
668 else
669 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
670 control = priv->line_control;
671 spin_unlock_irqrestore(&priv->lock, flags);
672 set_control_lines(port->serial->dev, control);
673}
674
675static void pl2303_close(struct usb_serial_port *port)
572d3138
TG
676{
677 struct pl2303_private *priv = usb_get_serial_port_data(port);
678 unsigned long flags;
572d3138 679
441b62c1 680 dbg("%s - port %d", __func__, port->number);
572d3138 681
572d3138 682 spin_lock_irqsave(&priv->lock, flags);
572d3138
TG
683 /* clear out any remaining data in the buffer */
684 pl2303_buf_clear(priv->buf);
685 spin_unlock_irqrestore(&priv->lock, flags);
686
572d3138 687 /* shutdown our urbs */
441b62c1 688 dbg("%s - shutting down urbs", __func__);
572d3138
TG
689 usb_kill_urb(port->write_urb);
690 usb_kill_urb(port->read_urb);
691 usb_kill_urb(port->interrupt_in_urb);
692
1da177e4
LT
693}
694
a509a7e4 695static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
1da177e4 696{
606d099c 697 struct ktermios tmp_termios;
1da177e4
LT
698 struct usb_serial *serial = port->serial;
699 struct pl2303_private *priv = usb_get_serial_port_data(port);
1da177e4
LT
700 int result;
701
441b62c1 702 dbg("%s - port %d", __func__, port->number);
1da177e4 703
1694899f
D
704 if (priv->type != HX) {
705 usb_clear_halt(serial->dev, port->write_urb->pipe);
706 usb_clear_halt(serial->dev, port->read_urb->pipe);
3e152505 707 } else {
1da177e4 708 /* reset upstream data pipes */
eb44da0b
SS
709 pl2303_vendor_write(8, 0, serial);
710 pl2303_vendor_write(9, 0, serial);
1da177e4
LT
711 }
712
1da177e4 713 /* Setup termios */
95da310e
AC
714 if (tty)
715 pl2303_set_termios(tty, port, &tmp_termios);
1da177e4 716
441b62c1 717 dbg("%s - submitting read urb", __func__);
1da177e4 718 port->read_urb->dev = serial->dev;
372db8a7 719 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
1da177e4 720 if (result) {
372db8a7 721 dev_err(&port->dev, "%s - failed submitting read urb,"
441b62c1 722 " error %d\n", __func__, result);
335f8514 723 pl2303_close(port);
1da177e4
LT
724 return -EPROTO;
725 }
726
441b62c1 727 dbg("%s - submitting interrupt urb", __func__);
1da177e4 728 port->interrupt_in_urb->dev = serial->dev;
372db8a7 729 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1da177e4 730 if (result) {
372db8a7 731 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
441b62c1 732 " error %d\n", __func__, result);
335f8514 733 pl2303_close(port);
1da177e4
LT
734 return -EPROTO;
735 }
335f8514 736 port->port.drain_delay = 256;
1da177e4
LT
737 return 0;
738}
739
95da310e 740static int pl2303_tiocmset(struct tty_struct *tty, struct file *file,
372db8a7 741 unsigned int set, unsigned int clear)
1da177e4 742{
95da310e 743 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
744 struct pl2303_private *priv = usb_get_serial_port_data(port);
745 unsigned long flags;
746 u8 control;
747
6fdd8e8e
FL
748 if (!usb_get_intfdata(port->serial->interface))
749 return -ENODEV;
750
372db8a7 751 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
752 if (set & TIOCM_RTS)
753 priv->line_control |= CONTROL_RTS;
754 if (set & TIOCM_DTR)
755 priv->line_control |= CONTROL_DTR;
756 if (clear & TIOCM_RTS)
757 priv->line_control &= ~CONTROL_RTS;
758 if (clear & TIOCM_DTR)
759 priv->line_control &= ~CONTROL_DTR;
760 control = priv->line_control;
372db8a7 761 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4 762
372db8a7 763 return set_control_lines(port->serial->dev, control);
1da177e4
LT
764}
765
95da310e 766static int pl2303_tiocmget(struct tty_struct *tty, struct file *file)
1da177e4 767{
95da310e 768 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
769 struct pl2303_private *priv = usb_get_serial_port_data(port);
770 unsigned long flags;
771 unsigned int mcr;
772 unsigned int status;
773 unsigned int result;
774
441b62c1 775 dbg("%s (%d)", __func__, port->number);
1da177e4 776
6fdd8e8e
FL
777 if (!usb_get_intfdata(port->serial->interface))
778 return -ENODEV;
779
372db8a7 780 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
781 mcr = priv->line_control;
782 status = priv->line_status;
372db8a7 783 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
784
785 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
786 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
787 | ((status & UART_CTS) ? TIOCM_CTS : 0)
788 | ((status & UART_DSR) ? TIOCM_DSR : 0)
789 | ((status & UART_RING) ? TIOCM_RI : 0)
790 | ((status & UART_DCD) ? TIOCM_CD : 0);
791
441b62c1 792 dbg("%s - result = %x", __func__, result);
1da177e4
LT
793
794 return result;
795}
796
335f8514
AC
797static int pl2303_carrier_raised(struct usb_serial_port *port)
798{
799 struct pl2303_private *priv = usb_get_serial_port_data(port);
800 if (priv->line_status & UART_DCD)
801 return 1;
802 return 0;
803}
804
1da177e4
LT
805static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
806{
807 struct pl2303_private *priv = usb_get_serial_port_data(port);
808 unsigned long flags;
809 unsigned int prevstatus;
810 unsigned int status;
811 unsigned int changed;
812
372db8a7 813 spin_lock_irqsave(&priv->lock, flags);
1da177e4 814 prevstatus = priv->line_status;
372db8a7 815 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
816
817 while (1) {
818 interruptible_sleep_on(&priv->delta_msr_wait);
819 /* see if a signal did it */
820 if (signal_pending(current))
821 return -ERESTARTSYS;
372db8a7
TG
822
823 spin_lock_irqsave(&priv->lock, flags);
1da177e4 824 status = priv->line_status;
372db8a7
TG
825 spin_unlock_irqrestore(&priv->lock, flags);
826
3a0f43e9 827 changed = prevstatus ^ status;
372db8a7 828
1da177e4
LT
829 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
830 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
831 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
3a0f43e9 832 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
1da177e4
LT
833 return 0;
834 }
835 prevstatus = status;
836 }
837 /* NOTREACHED */
838 return 0;
839}
840
95da310e 841static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
372db8a7 842 unsigned int cmd, unsigned long arg)
1da177e4 843{
95da310e 844 struct usb_serial_port *port = tty->driver_data;
441b62c1 845 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
1da177e4
LT
846
847 switch (cmd) {
3a0f43e9
AC
848 case TIOCMIWAIT:
849 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
850 return wait_modem_info(port, arg);
851 default:
852 dbg("%s not supported = 0x%04x", __func__, cmd);
853 break;
1da177e4 854 }
1da177e4
LT
855 return -ENOIOCTLCMD;
856}
857
95da310e 858static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
1da177e4 859{
95da310e 860 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
861 struct usb_serial *serial = port->serial;
862 u16 state;
863 int result;
864
441b62c1 865 dbg("%s - port %d", __func__, port->number);
1da177e4
LT
866
867 if (break_state == 0)
868 state = BREAK_OFF;
869 else
870 state = BREAK_ON;
3a0f43e9
AC
871 dbg("%s - turning break %s", __func__,
872 state == BREAK_OFF ? "off" : "on");
1da177e4 873
372db8a7
TG
874 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
875 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
876 0, NULL, 0, 100);
1da177e4 877 if (result)
441b62c1 878 dbg("%s - error sending break = %d", __func__, result);
1da177e4
LT
879}
880
f9c99bb8 881static void pl2303_release(struct usb_serial *serial)
1da177e4
LT
882{
883 int i;
884 struct pl2303_private *priv;
885
441b62c1 886 dbg("%s", __func__);
1da177e4
LT
887
888 for (i = 0; i < serial->num_ports; ++i) {
889 priv = usb_get_serial_port_data(serial->port[i]);
890 if (priv) {
891 pl2303_buf_free(priv->buf);
892 kfree(priv);
1da177e4 893 }
372db8a7 894 }
1da177e4
LT
895}
896
97bb13ec
FL
897static void pl2303_update_line_status(struct usb_serial_port *port,
898 unsigned char *data,
899 unsigned int actual_length)
900{
901
902 struct pl2303_private *priv = usb_get_serial_port_data(port);
903 unsigned long flags;
904 u8 status_idx = UART_STATE;
95f209f9 905 u8 length = UART_STATE + 1;
9c537616 906 u16 idv, idp;
97bb13ec 907
9c537616
TG
908 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
909 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
910
911
912 if (idv == SIEMENS_VENDOR_ID) {
913 if (idp == SIEMENS_PRODUCT_ID_X65 ||
914 idp == SIEMENS_PRODUCT_ID_SX1 ||
915 idp == SIEMENS_PRODUCT_ID_X75) {
916
917 length = 1;
918 status_idx = 0;
919 }
97bb13ec
FL
920 }
921
922 if (actual_length < length)
a009b75a 923 return;
97bb13ec 924
3a0f43e9 925 /* Save off the uart status for others to look at */
97bb13ec
FL
926 spin_lock_irqsave(&priv->lock, flags);
927 priv->line_status = data[status_idx];
928 spin_unlock_irqrestore(&priv->lock, flags);
430eb0d2
JW
929 if (priv->line_status & UART_BREAK_ERROR)
930 usb_serial_handle_break(port);
372db8a7 931 wake_up_interruptible(&priv->delta_msr_wait);
97bb13ec 932}
1da177e4 933
7d12e780 934static void pl2303_read_int_callback(struct urb *urb)
1da177e4 935{
cdc97792 936 struct usb_serial_port *port = urb->context;
1da177e4 937 unsigned char *data = urb->transfer_buffer;
97bb13ec 938 unsigned int actual_length = urb->actual_length;
461d696a
GKH
939 int status = urb->status;
940 int retval;
1da177e4 941
441b62c1 942 dbg("%s (%d)", __func__, port->number);
1da177e4 943
461d696a 944 switch (status) {
1da177e4
LT
945 case 0:
946 /* success */
947 break;
948 case -ECONNRESET:
949 case -ENOENT:
950 case -ESHUTDOWN:
951 /* this urb is terminated, clean up */
441b62c1 952 dbg("%s - urb shutting down with status: %d", __func__,
461d696a 953 status);
1da177e4
LT
954 return;
955 default:
441b62c1 956 dbg("%s - nonzero urb status received: %d", __func__,
461d696a 957 status);
1da177e4
LT
958 goto exit;
959 }
960
441b62c1 961 usb_serial_debug_data(debug, &port->dev, __func__,
372db8a7
TG
962 urb->actual_length, urb->transfer_buffer);
963
97bb13ec 964 pl2303_update_line_status(port, data, actual_length);
1da177e4 965
1da177e4 966exit:
461d696a
GKH
967 retval = usb_submit_urb(urb, GFP_ATOMIC);
968 if (retval)
372db8a7
TG
969 dev_err(&urb->dev->dev,
970 "%s - usb_submit_urb failed with result %d\n",
441b62c1 971 __func__, retval);
1da177e4
LT
972}
973
d4fc4a7b
AC
974static void pl2303_push_data(struct tty_struct *tty,
975 struct usb_serial_port *port, struct urb *urb,
976 u8 line_status)
977{
978 unsigned char *data = urb->transfer_buffer;
979 /* get tty_flag from status */
980 char tty_flag = TTY_NORMAL;
981 /* break takes precedence over parity, */
982 /* which takes precedence over framing errors */
983 if (line_status & UART_BREAK_ERROR)
984 tty_flag = TTY_BREAK;
985 else if (line_status & UART_PARITY_ERROR)
986 tty_flag = TTY_PARITY;
987 else if (line_status & UART_FRAME_ERROR)
988 tty_flag = TTY_FRAME;
989 dbg("%s - tty_flag = %d", __func__, tty_flag);
990
991 tty_buffer_request_room(tty, urb->actual_length + 1);
992 /* overrun is special, not associated with a char */
993 if (line_status & UART_OVERRUN_ERROR)
994 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
995 if (port->console && port->sysrq) {
996 int i;
997 for (i = 0; i < urb->actual_length; ++i)
998 if (!usb_serial_handle_sysrq_char(tty, port, data[i]))
999 tty_insert_flip_char(tty, data[i], tty_flag);
1000 } else
1001 tty_insert_flip_string(tty, data, urb->actual_length);
1002 tty_flip_buffer_push(tty);
1003}
1004
7d12e780 1005static void pl2303_read_bulk_callback(struct urb *urb)
1da177e4 1006{
cdc97792 1007 struct usb_serial_port *port = urb->context;
1da177e4
LT
1008 struct pl2303_private *priv = usb_get_serial_port_data(port);
1009 struct tty_struct *tty;
1da177e4 1010 unsigned long flags;
1da177e4 1011 int result;
461d696a
GKH
1012 int status = urb->status;
1013 u8 line_status;
1da177e4 1014
441b62c1 1015 dbg("%s - port %d", __func__, port->number);
1da177e4 1016
461d696a 1017 if (status) {
441b62c1 1018 dbg("%s - urb status = %d", __func__, status);
95da310e 1019 if (!port->port.count) {
441b62c1 1020 dbg("%s - port is closed, exiting.", __func__);
1da177e4
LT
1021 return;
1022 }
461d696a 1023 if (status == -EPROTO) {
372db8a7
TG
1024 /* PL2303 mysteriously fails with -EPROTO reschedule
1025 * the read */
1026 dbg("%s - caught -EPROTO, resubmitting the urb",
441b62c1 1027 __func__);
1da177e4
LT
1028 urb->dev = port->serial->dev;
1029 result = usb_submit_urb(urb, GFP_ATOMIC);
1030 if (result)
372db8a7
TG
1031 dev_err(&urb->dev->dev, "%s - failed"
1032 " resubmitting read urb, error %d\n",
441b62c1 1033 __func__, result);
1da177e4
LT
1034 return;
1035 }
441b62c1 1036 dbg("%s - unable to handle the error, exiting.", __func__);
1da177e4
LT
1037 return;
1038 }
1039
441b62c1 1040 usb_serial_debug_data(debug, &port->dev, __func__,
d4fc4a7b 1041 urb->actual_length, urb->transfer_buffer);
1da177e4
LT
1042
1043 spin_lock_irqsave(&priv->lock, flags);
461d696a 1044 line_status = priv->line_status;
1da177e4
LT
1045 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1046 spin_unlock_irqrestore(&priv->lock, flags);
372db8a7 1047 wake_up_interruptible(&priv->delta_msr_wait);
1da177e4 1048
4a90f09b 1049 tty = tty_port_tty_get(&port->port);
1da177e4 1050 if (tty && urb->actual_length) {
d4fc4a7b 1051 pl2303_push_data(tty, port, urb, line_status);
1da177e4 1052 }
4a90f09b 1053 tty_kref_put(tty);
1da177e4 1054 /* Schedule the next read _if_ we are still open */
95da310e 1055 if (port->port.count) {
1da177e4
LT
1056 urb->dev = port->serial->dev;
1057 result = usb_submit_urb(urb, GFP_ATOMIC);
1058 if (result)
372db8a7 1059 dev_err(&urb->dev->dev, "%s - failed resubmitting"
441b62c1 1060 " read urb, error %d\n", __func__, result);
1da177e4
LT
1061 }
1062
1063 return;
1064}
1065
7d12e780 1066static void pl2303_write_bulk_callback(struct urb *urb)
1da177e4 1067{
cdc97792 1068 struct usb_serial_port *port = urb->context;
1da177e4
LT
1069 struct pl2303_private *priv = usb_get_serial_port_data(port);
1070 int result;
461d696a 1071 int status = urb->status;
1da177e4 1072
441b62c1 1073 dbg("%s - port %d", __func__, port->number);
1da177e4 1074
461d696a 1075 switch (status) {
1da177e4
LT
1076 case 0:
1077 /* success */
1078 break;
1079 case -ECONNRESET:
1080 case -ENOENT:
1081 case -ESHUTDOWN:
1082 /* this urb is terminated, clean up */
441b62c1 1083 dbg("%s - urb shutting down with status: %d", __func__,
461d696a 1084 status);
1da177e4
LT
1085 priv->write_urb_in_use = 0;
1086 return;
1087 default:
1088 /* error in the urb, so we have to resubmit it */
441b62c1
HH
1089 dbg("%s - Overflow in write", __func__);
1090 dbg("%s - nonzero write bulk status received: %d", __func__,
461d696a 1091 status);
1da177e4
LT
1092 port->write_urb->transfer_buffer_length = 1;
1093 port->write_urb->dev = port->serial->dev;
372db8a7 1094 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
1da177e4 1095 if (result)
372db8a7 1096 dev_err(&urb->dev->dev, "%s - failed resubmitting write"
441b62c1 1097 " urb, error %d\n", __func__, result);
1da177e4
LT
1098 else
1099 return;
1100 }
1101
1102 priv->write_urb_in_use = 0;
1103
1104 /* send any buffered data */
1105 pl2303_send(port);
1106}
1107
572d3138
TG
1108/* All of the device info needed for the PL2303 SIO serial converter */
1109static struct usb_serial_driver pl2303_device = {
1110 .driver = {
1111 .owner = THIS_MODULE,
1112 .name = "pl2303",
1113 },
1114 .id_table = id_table,
d9b1b787 1115 .usb_driver = &pl2303_driver,
572d3138
TG
1116 .num_ports = 1,
1117 .open = pl2303_open,
1118 .close = pl2303_close,
335f8514
AC
1119 .dtr_rts = pl2303_dtr_rts,
1120 .carrier_raised = pl2303_carrier_raised,
572d3138
TG
1121 .write = pl2303_write,
1122 .ioctl = pl2303_ioctl,
1123 .break_ctl = pl2303_break_ctl,
1124 .set_termios = pl2303_set_termios,
1125 .tiocmget = pl2303_tiocmget,
1126 .tiocmset = pl2303_tiocmset,
1127 .read_bulk_callback = pl2303_read_bulk_callback,
1128 .read_int_callback = pl2303_read_int_callback,
1129 .write_bulk_callback = pl2303_write_bulk_callback,
1130 .write_room = pl2303_write_room,
1131 .chars_in_buffer = pl2303_chars_in_buffer,
1132 .attach = pl2303_startup,
f9c99bb8 1133 .release = pl2303_release,
572d3138 1134};
1da177e4 1135
372db8a7 1136static int __init pl2303_init(void)
1da177e4
LT
1137{
1138 int retval;
372db8a7 1139
1da177e4
LT
1140 retval = usb_serial_register(&pl2303_device);
1141 if (retval)
1142 goto failed_usb_serial_register;
1143 retval = usb_register(&pl2303_driver);
1144 if (retval)
1145 goto failed_usb_register;
c197a8db 1146 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
1da177e4
LT
1147 return 0;
1148failed_usb_register:
1149 usb_serial_deregister(&pl2303_device);
1150failed_usb_serial_register:
1151 return retval;
1152}
1153
372db8a7 1154static void __exit pl2303_exit(void)
1da177e4 1155{
372db8a7
TG
1156 usb_deregister(&pl2303_driver);
1157 usb_serial_deregister(&pl2303_device);
1da177e4
LT
1158}
1159
1da177e4
LT
1160module_init(pl2303_init);
1161module_exit(pl2303_exit);
1162
1163MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4
LT
1164MODULE_LICENSE("GPL");
1165
1166module_param(debug, bool, S_IRUGO | S_IWUSR);
1167MODULE_PARM_DESC(debug, "Debug enabled or not");
1168