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