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