2 * Prolific PL2303 USB to serial adaptor driver
4 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2003 IBM Corp.
7 * Original driver for 2.2.x by anonymous
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.
13 * See Documentation/usb/usb-serial.txt for more information on using this
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>
29 #include <linux/uaccess.h>
30 #include <linux/usb.h>
31 #include <linux/usb/serial.h>
37 #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
41 #define PL2303_CLOSING_WAIT (30*HZ)
43 #define PL2303_BUF_SIZE 1024
44 #define PL2303_TMP_BUF_SIZE 1024
47 unsigned int buf_size
;
53 static 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
) },
56 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_DCU11
) },
57 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_RSAQ3
) },
58 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_PHAROS
) },
59 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_ALDIGA
) },
60 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_MMX
) },
61 { USB_DEVICE(PL2303_VENDOR_ID
, PL2303_PRODUCT_ID_GPRS
) },
62 { USB_DEVICE(IODATA_VENDOR_ID
, IODATA_PRODUCT_ID
) },
63 { USB_DEVICE(IODATA_VENDOR_ID
, IODATA_PRODUCT_ID_RSAQ5
) },
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
) },
69 { USB_DEVICE(ITEGNO_VENDOR_ID
, ITEGNO_PRODUCT_ID_2080
) },
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
) },
78 { USB_DEVICE(SIEMENS_VENDOR_ID
, SIEMENS_PRODUCT_ID_SX1
) },
79 { USB_DEVICE(SIEMENS_VENDOR_ID
, SIEMENS_PRODUCT_ID_X65
) },
80 { USB_DEVICE(SIEMENS_VENDOR_ID
, SIEMENS_PRODUCT_ID_X75
) },
81 { USB_DEVICE(SIEMENS_VENDOR_ID
, SIEMENS_PRODUCT_ID_EF81
) },
82 { USB_DEVICE(BENQ_VENDOR_ID
, BENQ_PRODUCT_ID_S81
) }, /* Benq/Siemens S81 */
83 { USB_DEVICE(SYNTECH_VENDOR_ID
, SYNTECH_PRODUCT_ID
) },
84 { USB_DEVICE(NOKIA_CA42_VENDOR_ID
, NOKIA_CA42_PRODUCT_ID
) },
85 { USB_DEVICE(CA_42_CA42_VENDOR_ID
, CA_42_CA42_PRODUCT_ID
) },
86 { USB_DEVICE(SAGEM_VENDOR_ID
, SAGEM_PRODUCT_ID
) },
87 { USB_DEVICE(LEADTEK_VENDOR_ID
, LEADTEK_9531_PRODUCT_ID
) },
88 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID
, SPEEDDRAGON_PRODUCT_ID
) },
89 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID
, DATAPILOT_U2_PRODUCT_ID
) },
90 { USB_DEVICE(BELKIN_VENDOR_ID
, BELKIN_PRODUCT_ID
) },
91 { USB_DEVICE(ALCOR_VENDOR_ID
, ALCOR_PRODUCT_ID
) },
92 { USB_DEVICE(WS002IN_VENDOR_ID
, WS002IN_PRODUCT_ID
) },
93 { USB_DEVICE(COREGA_VENDOR_ID
, COREGA_PRODUCT_ID
) },
94 { USB_DEVICE(YCCABLE_VENDOR_ID
, YCCABLE_PRODUCT_ID
) },
95 { USB_DEVICE(SUPERIAL_VENDOR_ID
, SUPERIAL_PRODUCT_ID
) },
96 { USB_DEVICE(HP_VENDOR_ID
, HP_LD220_PRODUCT_ID
) },
97 { USB_DEVICE(CRESSI_VENDOR_ID
, CRESSI_EDY_PRODUCT_ID
) },
98 { USB_DEVICE(SONY_VENDOR_ID
, SONY_QN3USB_PRODUCT_ID
) },
99 { } /* Terminating entry */
102 MODULE_DEVICE_TABLE(usb
, id_table
);
104 static struct usb_driver pl2303_driver
= {
106 .probe
= usb_serial_probe
,
107 .disconnect
= usb_serial_disconnect
,
108 .id_table
= id_table
,
109 .suspend
= usb_serial_suspend
,
110 .resume
= usb_serial_resume
,
112 .supports_autosuspend
= 1,
115 #define SET_LINE_REQUEST_TYPE 0x21
116 #define SET_LINE_REQUEST 0x20
118 #define SET_CONTROL_REQUEST_TYPE 0x21
119 #define SET_CONTROL_REQUEST 0x22
120 #define CONTROL_DTR 0x01
121 #define CONTROL_RTS 0x02
123 #define BREAK_REQUEST_TYPE 0x21
124 #define BREAK_REQUEST 0x23
125 #define BREAK_ON 0xffff
126 #define BREAK_OFF 0x0000
128 #define GET_LINE_REQUEST_TYPE 0xa1
129 #define GET_LINE_REQUEST 0x21
131 #define VENDOR_WRITE_REQUEST_TYPE 0x40
132 #define VENDOR_WRITE_REQUEST 0x01
134 #define VENDOR_READ_REQUEST_TYPE 0xc0
135 #define VENDOR_READ_REQUEST 0x01
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
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 */
155 struct pl2303_private
{
157 struct pl2303_buf
*buf
;
158 int write_urb_in_use
;
159 wait_queue_head_t delta_msr_wait
;
162 enum pl2303_type type
;
168 * Allocate a circular buffer and all associated memory.
170 static struct pl2303_buf
*pl2303_buf_alloc(unsigned int size
)
172 struct pl2303_buf
*pb
;
177 pb
= kmalloc(sizeof(struct pl2303_buf
), GFP_KERNEL
);
181 pb
->buf_buf
= kmalloc(size
, GFP_KERNEL
);
182 if (pb
->buf_buf
== NULL
) {
188 pb
->buf_get
= pb
->buf_put
= pb
->buf_buf
;
196 * Free the buffer and all associated memory.
198 static void pl2303_buf_free(struct pl2303_buf
*pb
)
209 * Clear out all data in the circular buffer.
211 static void pl2303_buf_clear(struct pl2303_buf
*pb
)
214 pb
->buf_get
= pb
->buf_put
;
215 /* equivalent to a get of all data available */
219 * pl2303_buf_data_avail
221 * Return the number of bytes of data available in the circular
224 static unsigned int pl2303_buf_data_avail(struct pl2303_buf
*pb
)
229 return (pb
->buf_size
+ pb
->buf_put
- pb
->buf_get
) % pb
->buf_size
;
233 * pl2303_buf_space_avail
235 * Return the number of bytes of space available in the circular
238 static unsigned int pl2303_buf_space_avail(struct pl2303_buf
*pb
)
243 return (pb
->buf_size
+ pb
->buf_get
- pb
->buf_put
- 1) % pb
->buf_size
;
249 * Copy data data from a user buffer and put it into the circular buffer.
250 * Restrict to the amount of space available.
252 * Return the number of bytes copied.
254 static unsigned int pl2303_buf_put(struct pl2303_buf
*pb
, const char *buf
,
262 len
= pl2303_buf_space_avail(pb
);
269 len
= pb
->buf_buf
+ pb
->buf_size
- pb
->buf_put
;
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
;
275 memcpy(pb
->buf_put
, buf
, count
);
277 pb
->buf_put
+= count
;
278 else /* count == len */
279 pb
->buf_put
= pb
->buf_buf
;
288 * Get data from the circular buffer and copy to the given buffer.
289 * Restrict to the amount of data available.
291 * Return the number of bytes copied.
293 static unsigned int pl2303_buf_get(struct pl2303_buf
*pb
, char *buf
,
301 len
= pl2303_buf_data_avail(pb
);
308 len
= pb
->buf_buf
+ pb
->buf_size
- pb
->buf_get
;
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
;
314 memcpy(buf
, pb
->buf_get
, count
);
316 pb
->buf_get
+= count
;
317 else /* count == len */
318 pb
->buf_get
= pb
->buf_buf
;
324 static int pl2303_vendor_read(__u16 value
, __u16 index
,
325 struct usb_serial
*serial
, unsigned char *buf
)
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]);
335 static int pl2303_vendor_write(__u16 value
, __u16 index
,
336 struct usb_serial
*serial
)
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
);
346 static int pl2303_startup(struct usb_serial
*serial
)
348 struct pl2303_private
*priv
;
349 enum pl2303_type type
= type_0
;
353 buf
= kmalloc(10, GFP_KERNEL
);
357 if (serial
->dev
->descriptor
.bDeviceClass
== 0x02)
359 else if (serial
->dev
->descriptor
.bMaxPacketSize0
== 0x40)
361 else if (serial
->dev
->descriptor
.bDeviceClass
== 0x00)
363 else if (serial
->dev
->descriptor
.bDeviceClass
== 0xFF)
365 dbg("device type: %d", type
);
367 for (i
= 0; i
< serial
->num_ports
; ++i
) {
368 priv
= kzalloc(sizeof(struct pl2303_private
), GFP_KERNEL
);
371 spin_lock_init(&priv
->lock
);
372 priv
->buf
= pl2303_buf_alloc(PL2303_BUF_SIZE
);
373 if (priv
->buf
== NULL
) {
377 init_waitqueue_head(&priv
->delta_msr_wait
);
379 usb_set_serial_port_data(serial
->port
[i
], priv
);
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
);
393 pl2303_vendor_write(2, 0x44, serial
);
395 pl2303_vendor_write(2, 0x24, serial
);
402 for (--i
; i
>= 0; --i
) {
403 priv
= usb_get_serial_port_data(serial
->port
[i
]);
404 pl2303_buf_free(priv
->buf
);
406 usb_set_serial_port_data(serial
->port
[i
], NULL
);
411 static int set_control_lines(struct usb_device
*dev
, u8 value
)
415 retval
= usb_control_msg(dev
, usb_sndctrlpipe(dev
, 0),
416 SET_CONTROL_REQUEST
, SET_CONTROL_REQUEST_TYPE
,
417 value
, 0, NULL
, 0, 100);
418 dbg("%s - value = %d, retval = %d", __func__
, value
, retval
);
422 static void pl2303_send(struct usb_serial_port
*port
)
425 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
428 dbg("%s - port %d", __func__
, port
->number
);
430 spin_lock_irqsave(&priv
->lock
, flags
);
432 if (priv
->write_urb_in_use
) {
433 spin_unlock_irqrestore(&priv
->lock
, flags
);
437 count
= pl2303_buf_get(priv
->buf
, port
->write_urb
->transfer_buffer
,
438 port
->bulk_out_size
);
441 spin_unlock_irqrestore(&priv
->lock
, flags
);
445 priv
->write_urb_in_use
= 1;
447 spin_unlock_irqrestore(&priv
->lock
, flags
);
449 usb_serial_debug_data(debug
, &port
->dev
, __func__
, count
,
450 port
->write_urb
->transfer_buffer
);
452 port
->write_urb
->transfer_buffer_length
= count
;
453 port
->write_urb
->dev
= port
->serial
->dev
;
454 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
456 dev_err(&port
->dev
, "%s - failed submitting write urb,"
457 " error %d\n", __func__
, result
);
458 priv
->write_urb_in_use
= 0;
459 /* TODO: reschedule pl2303_send */
462 usb_serial_port_softint(port
);
465 static int pl2303_write(struct tty_struct
*tty
, struct usb_serial_port
*port
,
466 const unsigned char *buf
, int count
)
468 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
471 dbg("%s - port %d, %d bytes", __func__
, port
->number
, count
);
476 spin_lock_irqsave(&priv
->lock
, flags
);
477 count
= pl2303_buf_put(priv
->buf
, buf
, count
);
478 spin_unlock_irqrestore(&priv
->lock
, flags
);
485 static int pl2303_write_room(struct tty_struct
*tty
)
487 struct usb_serial_port
*port
= tty
->driver_data
;
488 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
492 dbg("%s - port %d", __func__
, port
->number
);
494 spin_lock_irqsave(&priv
->lock
, flags
);
495 room
= pl2303_buf_space_avail(priv
->buf
);
496 spin_unlock_irqrestore(&priv
->lock
, flags
);
498 dbg("%s - returns %d", __func__
, room
);
502 static int pl2303_chars_in_buffer(struct tty_struct
*tty
)
504 struct usb_serial_port
*port
= tty
->driver_data
;
505 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
509 dbg("%s - port %d", __func__
, port
->number
);
511 spin_lock_irqsave(&priv
->lock
, flags
);
512 chars
= pl2303_buf_data_avail(priv
->buf
);
513 spin_unlock_irqrestore(&priv
->lock
, flags
);
515 dbg("%s - returns %d", __func__
, chars
);
519 static void pl2303_set_termios(struct tty_struct
*tty
,
520 struct usb_serial_port
*port
, struct ktermios
*old_termios
)
522 struct usb_serial
*serial
= port
->serial
;
523 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
531 dbg("%s - port %d", __func__
, port
->number
);
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 */
537 if (!tty_termios_hw_change(tty
->termios
, old_termios
))
540 cflag
= tty
->termios
->c_cflag
;
542 buf
= kzalloc(7, GFP_KERNEL
);
544 dev_err(&port
->dev
, "%s - out of memory.\n", __func__
);
545 /* Report back no change occurred */
546 *tty
->termios
= *old_termios
;
550 i
= usb_control_msg(serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
551 GET_LINE_REQUEST
, GET_LINE_REQUEST_TYPE
,
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]);
557 switch (cflag
& CSIZE
) {
572 dbg("%s - data bits = %d", __func__
, buf
[6]);
575 baud
= tty_get_baud_rate(tty
);
576 dbg("%s - baud = %d", __func__
, baud
);
578 buf
[0] = baud
& 0xff;
579 buf
[1] = (baud
>> 8) & 0xff;
580 buf
[2] = (baud
>> 16) & 0xff;
581 buf
[3] = (baud
>> 24) & 0xff;
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
) {
589 dbg("%s - stop bits = 2", __func__
);
592 dbg("%s - stop bits = 1", __func__
);
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
) {
603 dbg("%s - parity = odd", __func__
);
606 dbg("%s - parity = even", __func__
);
610 dbg("%s - parity = none", __func__
);
613 i
= usb_control_msg(serial
->dev
, usb_sndctrlpipe(serial
->dev
, 0),
614 SET_LINE_REQUEST
, SET_LINE_REQUEST_TYPE
,
616 dbg("0x21:0x20:0:0 %d", i
);
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
);
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
);
630 spin_unlock_irqrestore(&priv
->lock
, flags
);
633 buf
[0] = buf
[1] = buf
[2] = buf
[3] = buf
[4] = buf
[5] = buf
[6] = 0;
635 i
= usb_control_msg(serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
636 GET_LINE_REQUEST
, GET_LINE_REQUEST_TYPE
,
638 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i
,
639 buf
[0], buf
[1], buf
[2], buf
[3], buf
[4], buf
[5], buf
[6]);
641 if (cflag
& CRTSCTS
) {
642 if (priv
->type
== HX
)
643 pl2303_vendor_write(0x0, 0x61, serial
);
645 pl2303_vendor_write(0x0, 0x41, serial
);
647 pl2303_vendor_write(0x0, 0x0, serial
);
650 /* FIXME: Need to read back resulting baud rate */
652 tty_encode_baud_rate(tty
, baud
, baud
);
657 static void pl2303_dtr_rts(struct usb_serial_port
*port
, int on
)
659 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
663 spin_lock_irqsave(&priv
->lock
, flags
);
664 /* Change DTR and RTS */
666 priv
->line_control
|= (CONTROL_DTR
| CONTROL_RTS
);
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
);
674 static void pl2303_close(struct usb_serial_port
*port
)
676 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
679 dbg("%s - port %d", __func__
, port
->number
);
681 spin_lock_irqsave(&priv
->lock
, flags
);
682 /* clear out any remaining data in the buffer */
683 pl2303_buf_clear(priv
->buf
);
684 spin_unlock_irqrestore(&priv
->lock
, flags
);
686 /* shutdown our urbs */
687 dbg("%s - shutting down urbs", __func__
);
688 usb_kill_urb(port
->write_urb
);
689 usb_kill_urb(port
->read_urb
);
690 usb_kill_urb(port
->interrupt_in_urb
);
694 static int pl2303_open(struct tty_struct
*tty
,
695 struct usb_serial_port
*port
, struct file
*filp
)
697 struct ktermios tmp_termios
;
698 struct usb_serial
*serial
= port
->serial
;
699 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
702 dbg("%s - port %d", __func__
, port
->number
);
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
);
708 /* reset upstream data pipes */
709 pl2303_vendor_write(8, 0, serial
);
710 pl2303_vendor_write(9, 0, serial
);
715 pl2303_set_termios(tty
, port
, &tmp_termios
);
717 /* FIXME: need to assert RTS and DTR if CRTSCTS off */
719 dbg("%s - submitting read urb", __func__
);
720 port
->read_urb
->dev
= serial
->dev
;
721 result
= usb_submit_urb(port
->read_urb
, GFP_KERNEL
);
723 dev_err(&port
->dev
, "%s - failed submitting read urb,"
724 " error %d\n", __func__
, result
);
729 dbg("%s - submitting interrupt urb", __func__
);
730 port
->interrupt_in_urb
->dev
= serial
->dev
;
731 result
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
733 dev_err(&port
->dev
, "%s - failed submitting interrupt urb,"
734 " error %d\n", __func__
, result
);
738 port
->port
.drain_delay
= 256;
742 static int pl2303_tiocmset(struct tty_struct
*tty
, struct file
*file
,
743 unsigned int set
, unsigned int clear
)
745 struct usb_serial_port
*port
= tty
->driver_data
;
746 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
750 if (!usb_get_intfdata(port
->serial
->interface
))
753 spin_lock_irqsave(&priv
->lock
, flags
);
755 priv
->line_control
|= CONTROL_RTS
;
757 priv
->line_control
|= CONTROL_DTR
;
758 if (clear
& TIOCM_RTS
)
759 priv
->line_control
&= ~CONTROL_RTS
;
760 if (clear
& TIOCM_DTR
)
761 priv
->line_control
&= ~CONTROL_DTR
;
762 control
= priv
->line_control
;
763 spin_unlock_irqrestore(&priv
->lock
, flags
);
765 return set_control_lines(port
->serial
->dev
, control
);
768 static int pl2303_tiocmget(struct tty_struct
*tty
, struct file
*file
)
770 struct usb_serial_port
*port
= tty
->driver_data
;
771 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
777 dbg("%s (%d)", __func__
, port
->number
);
779 if (!usb_get_intfdata(port
->serial
->interface
))
782 spin_lock_irqsave(&priv
->lock
, flags
);
783 mcr
= priv
->line_control
;
784 status
= priv
->line_status
;
785 spin_unlock_irqrestore(&priv
->lock
, flags
);
787 result
= ((mcr
& CONTROL_DTR
) ? TIOCM_DTR
: 0)
788 | ((mcr
& CONTROL_RTS
) ? TIOCM_RTS
: 0)
789 | ((status
& UART_CTS
) ? TIOCM_CTS
: 0)
790 | ((status
& UART_DSR
) ? TIOCM_DSR
: 0)
791 | ((status
& UART_RING
) ? TIOCM_RI
: 0)
792 | ((status
& UART_DCD
) ? TIOCM_CD
: 0);
794 dbg("%s - result = %x", __func__
, result
);
799 static int pl2303_carrier_raised(struct usb_serial_port
*port
)
801 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
802 if (priv
->line_status
& UART_DCD
)
807 static int wait_modem_info(struct usb_serial_port
*port
, unsigned int arg
)
809 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
811 unsigned int prevstatus
;
813 unsigned int changed
;
815 spin_lock_irqsave(&priv
->lock
, flags
);
816 prevstatus
= priv
->line_status
;
817 spin_unlock_irqrestore(&priv
->lock
, flags
);
820 interruptible_sleep_on(&priv
->delta_msr_wait
);
821 /* see if a signal did it */
822 if (signal_pending(current
))
825 spin_lock_irqsave(&priv
->lock
, flags
);
826 status
= priv
->line_status
;
827 spin_unlock_irqrestore(&priv
->lock
, flags
);
829 changed
= prevstatus
^ status
;
831 if (((arg
& TIOCM_RNG
) && (changed
& UART_RING
)) ||
832 ((arg
& TIOCM_DSR
) && (changed
& UART_DSR
)) ||
833 ((arg
& TIOCM_CD
) && (changed
& UART_DCD
)) ||
834 ((arg
& TIOCM_CTS
) && (changed
& UART_CTS
))) {
843 static int pl2303_ioctl(struct tty_struct
*tty
, struct file
*file
,
844 unsigned int cmd
, unsigned long arg
)
846 struct usb_serial_port
*port
= tty
->driver_data
;
847 dbg("%s (%d) cmd = 0x%04x", __func__
, port
->number
, cmd
);
851 dbg("%s (%d) TIOCMIWAIT", __func__
, port
->number
);
852 return wait_modem_info(port
, arg
);
854 dbg("%s not supported = 0x%04x", __func__
, cmd
);
860 static void pl2303_break_ctl(struct tty_struct
*tty
, int break_state
)
862 struct usb_serial_port
*port
= tty
->driver_data
;
863 struct usb_serial
*serial
= port
->serial
;
867 dbg("%s - port %d", __func__
, port
->number
);
869 if (break_state
== 0)
873 dbg("%s - turning break %s", __func__
,
874 state
== BREAK_OFF
? "off" : "on");
876 result
= usb_control_msg(serial
->dev
, usb_sndctrlpipe(serial
->dev
, 0),
877 BREAK_REQUEST
, BREAK_REQUEST_TYPE
, state
,
880 dbg("%s - error sending break = %d", __func__
, result
);
883 static void pl2303_release(struct usb_serial
*serial
)
886 struct pl2303_private
*priv
;
890 for (i
= 0; i
< serial
->num_ports
; ++i
) {
891 priv
= usb_get_serial_port_data(serial
->port
[i
]);
893 pl2303_buf_free(priv
->buf
);
899 static void pl2303_update_line_status(struct usb_serial_port
*port
,
901 unsigned int actual_length
)
904 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
906 u8 status_idx
= UART_STATE
;
907 u8 length
= UART_STATE
+ 1;
910 idv
= le16_to_cpu(port
->serial
->dev
->descriptor
.idVendor
);
911 idp
= le16_to_cpu(port
->serial
->dev
->descriptor
.idProduct
);
914 if (idv
== SIEMENS_VENDOR_ID
) {
915 if (idp
== SIEMENS_PRODUCT_ID_X65
||
916 idp
== SIEMENS_PRODUCT_ID_SX1
||
917 idp
== SIEMENS_PRODUCT_ID_X75
) {
924 if (actual_length
< length
)
927 /* Save off the uart status for others to look at */
928 spin_lock_irqsave(&priv
->lock
, flags
);
929 priv
->line_status
= data
[status_idx
];
930 spin_unlock_irqrestore(&priv
->lock
, flags
);
931 if (priv
->line_status
& UART_BREAK_ERROR
)
932 usb_serial_handle_break(port
);
933 wake_up_interruptible(&priv
->delta_msr_wait
);
936 static void pl2303_read_int_callback(struct urb
*urb
)
938 struct usb_serial_port
*port
= urb
->context
;
939 unsigned char *data
= urb
->transfer_buffer
;
940 unsigned int actual_length
= urb
->actual_length
;
941 int status
= urb
->status
;
944 dbg("%s (%d)", __func__
, port
->number
);
953 /* this urb is terminated, clean up */
954 dbg("%s - urb shutting down with status: %d", __func__
,
958 dbg("%s - nonzero urb status received: %d", __func__
,
963 usb_serial_debug_data(debug
, &port
->dev
, __func__
,
964 urb
->actual_length
, urb
->transfer_buffer
);
966 pl2303_update_line_status(port
, data
, actual_length
);
969 retval
= usb_submit_urb(urb
, GFP_ATOMIC
);
971 dev_err(&urb
->dev
->dev
,
972 "%s - usb_submit_urb failed with result %d\n",
976 static void pl2303_push_data(struct tty_struct
*tty
,
977 struct usb_serial_port
*port
, struct urb
*urb
,
980 unsigned char *data
= urb
->transfer_buffer
;
981 /* get tty_flag from status */
982 char tty_flag
= TTY_NORMAL
;
983 /* break takes precedence over parity, */
984 /* which takes precedence over framing errors */
985 if (line_status
& UART_BREAK_ERROR
)
986 tty_flag
= TTY_BREAK
;
987 else if (line_status
& UART_PARITY_ERROR
)
988 tty_flag
= TTY_PARITY
;
989 else if (line_status
& UART_FRAME_ERROR
)
990 tty_flag
= TTY_FRAME
;
991 dbg("%s - tty_flag = %d", __func__
, tty_flag
);
993 tty_buffer_request_room(tty
, urb
->actual_length
+ 1);
994 /* overrun is special, not associated with a char */
995 if (line_status
& UART_OVERRUN_ERROR
)
996 tty_insert_flip_char(tty
, 0, TTY_OVERRUN
);
997 if (port
->console
&& port
->sysrq
) {
999 for (i
= 0; i
< urb
->actual_length
; ++i
)
1000 if (!usb_serial_handle_sysrq_char(tty
, port
, data
[i
]))
1001 tty_insert_flip_char(tty
, data
[i
], tty_flag
);
1003 tty_insert_flip_string(tty
, data
, urb
->actual_length
);
1004 tty_flip_buffer_push(tty
);
1007 static void pl2303_read_bulk_callback(struct urb
*urb
)
1009 struct usb_serial_port
*port
= urb
->context
;
1010 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
1011 struct tty_struct
*tty
;
1012 unsigned long flags
;
1014 int status
= urb
->status
;
1017 dbg("%s - port %d", __func__
, port
->number
);
1020 dbg("%s - urb status = %d", __func__
, status
);
1021 if (!port
->port
.count
) {
1022 dbg("%s - port is closed, exiting.", __func__
);
1025 if (status
== -EPROTO
) {
1026 /* PL2303 mysteriously fails with -EPROTO reschedule
1028 dbg("%s - caught -EPROTO, resubmitting the urb",
1030 urb
->dev
= port
->serial
->dev
;
1031 result
= usb_submit_urb(urb
, GFP_ATOMIC
);
1033 dev_err(&urb
->dev
->dev
, "%s - failed"
1034 " resubmitting read urb, error %d\n",
1038 dbg("%s - unable to handle the error, exiting.", __func__
);
1042 usb_serial_debug_data(debug
, &port
->dev
, __func__
,
1043 urb
->actual_length
, urb
->transfer_buffer
);
1045 spin_lock_irqsave(&priv
->lock
, flags
);
1046 line_status
= priv
->line_status
;
1047 priv
->line_status
&= ~UART_STATE_TRANSIENT_MASK
;
1048 spin_unlock_irqrestore(&priv
->lock
, flags
);
1049 wake_up_interruptible(&priv
->delta_msr_wait
);
1051 tty
= tty_port_tty_get(&port
->port
);
1052 if (tty
&& urb
->actual_length
) {
1053 pl2303_push_data(tty
, port
, urb
, line_status
);
1056 /* Schedule the next read _if_ we are still open */
1057 if (port
->port
.count
) {
1058 urb
->dev
= port
->serial
->dev
;
1059 result
= usb_submit_urb(urb
, GFP_ATOMIC
);
1061 dev_err(&urb
->dev
->dev
, "%s - failed resubmitting"
1062 " read urb, error %d\n", __func__
, result
);
1068 static void pl2303_write_bulk_callback(struct urb
*urb
)
1070 struct usb_serial_port
*port
= urb
->context
;
1071 struct pl2303_private
*priv
= usb_get_serial_port_data(port
);
1073 int status
= urb
->status
;
1075 dbg("%s - port %d", __func__
, port
->number
);
1084 /* this urb is terminated, clean up */
1085 dbg("%s - urb shutting down with status: %d", __func__
,
1087 priv
->write_urb_in_use
= 0;
1090 /* error in the urb, so we have to resubmit it */
1091 dbg("%s - Overflow in write", __func__
);
1092 dbg("%s - nonzero write bulk status received: %d", __func__
,
1094 port
->write_urb
->transfer_buffer_length
= 1;
1095 port
->write_urb
->dev
= port
->serial
->dev
;
1096 result
= usb_submit_urb(port
->write_urb
, GFP_ATOMIC
);
1098 dev_err(&urb
->dev
->dev
, "%s - failed resubmitting write"
1099 " urb, error %d\n", __func__
, result
);
1104 priv
->write_urb_in_use
= 0;
1106 /* send any buffered data */
1110 /* All of the device info needed for the PL2303 SIO serial converter */
1111 static struct usb_serial_driver pl2303_device
= {
1113 .owner
= THIS_MODULE
,
1116 .id_table
= id_table
,
1117 .usb_driver
= &pl2303_driver
,
1119 .open
= pl2303_open
,
1120 .close
= pl2303_close
,
1121 .dtr_rts
= pl2303_dtr_rts
,
1122 .carrier_raised
= pl2303_carrier_raised
,
1123 .write
= pl2303_write
,
1124 .ioctl
= pl2303_ioctl
,
1125 .break_ctl
= pl2303_break_ctl
,
1126 .set_termios
= pl2303_set_termios
,
1127 .tiocmget
= pl2303_tiocmget
,
1128 .tiocmset
= pl2303_tiocmset
,
1129 .read_bulk_callback
= pl2303_read_bulk_callback
,
1130 .read_int_callback
= pl2303_read_int_callback
,
1131 .write_bulk_callback
= pl2303_write_bulk_callback
,
1132 .write_room
= pl2303_write_room
,
1133 .chars_in_buffer
= pl2303_chars_in_buffer
,
1134 .attach
= pl2303_startup
,
1135 .release
= pl2303_release
,
1138 static int __init
pl2303_init(void)
1142 retval
= usb_serial_register(&pl2303_device
);
1144 goto failed_usb_serial_register
;
1145 retval
= usb_register(&pl2303_driver
);
1147 goto failed_usb_register
;
1148 printk(KERN_INFO KBUILD_MODNAME
": " DRIVER_DESC
"\n");
1150 failed_usb_register
:
1151 usb_serial_deregister(&pl2303_device
);
1152 failed_usb_serial_register
:
1156 static void __exit
pl2303_exit(void)
1158 usb_deregister(&pl2303_driver
);
1159 usb_serial_deregister(&pl2303_device
);
1162 module_init(pl2303_init
);
1163 module_exit(pl2303_exit
);
1165 MODULE_DESCRIPTION(DRIVER_DESC
);
1166 MODULE_LICENSE("GPL");
1168 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
1169 MODULE_PARM_DESC(debug
, "Debug enabled or not");