xref: /linux/drivers/usb/serial/pl2303.c (revision 9e8ba5f3ec35cba4fd8a8bebda548c4db2651e40)
1 /*
2  * Prolific PL2303 USB to serial adaptor driver
3  *
4  * Copyright (C) 2001-2007 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
10  *	modify it under the terms of the GNU General Public License version
11  *	2 as published by the Free Software Foundation.
12  *
13  * See Documentation/usb/usb-serial.txt for more information on using this
14  * driver
15  *
16  */
17 
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>
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 static const struct usb_device_id id_table[] = {
44 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
45 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
46 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
47 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
48 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
49 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
50 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
51 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
52 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
53 	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
54 	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
55 	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
56 	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
57 	{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
58 	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
59 	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
60 	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
61 	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
62 	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
63 	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
64 	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
65 	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
66 	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
67 	{ USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
68 	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
69 	{ USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
70 	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
71 	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
72 	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
73 	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
74 	{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
75 	{ USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
76 	{ USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
77 	{ USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
78 	{ USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
79 	{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
80 	{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
81 	{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
82 	{ USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
83 	{ USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
84 	{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
85 	{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
86 	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
87 	{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
88 	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
89 	{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
90 	{ USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
91 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
92 	{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
93 	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
94 	{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
95 	{ }					/* Terminating entry */
96 };
97 
98 MODULE_DEVICE_TABLE(usb, id_table);
99 
100 static struct usb_driver pl2303_driver = {
101 	.name =		"pl2303",
102 	.probe =	usb_serial_probe,
103 	.disconnect =	usb_serial_disconnect,
104 	.id_table =	id_table,
105 	.suspend =      usb_serial_suspend,
106 	.resume =       usb_serial_resume,
107 	.no_dynamic_id = 	1,
108 	.supports_autosuspend =	1,
109 };
110 
111 #define SET_LINE_REQUEST_TYPE		0x21
112 #define SET_LINE_REQUEST		0x20
113 
114 #define SET_CONTROL_REQUEST_TYPE	0x21
115 #define SET_CONTROL_REQUEST		0x22
116 #define CONTROL_DTR			0x01
117 #define CONTROL_RTS			0x02
118 
119 #define BREAK_REQUEST_TYPE		0x21
120 #define BREAK_REQUEST			0x23
121 #define BREAK_ON			0xffff
122 #define BREAK_OFF			0x0000
123 
124 #define GET_LINE_REQUEST_TYPE		0xa1
125 #define GET_LINE_REQUEST		0x21
126 
127 #define VENDOR_WRITE_REQUEST_TYPE	0x40
128 #define VENDOR_WRITE_REQUEST		0x01
129 
130 #define VENDOR_READ_REQUEST_TYPE	0xc0
131 #define VENDOR_READ_REQUEST		0x01
132 
133 #define UART_STATE			0x08
134 #define UART_STATE_TRANSIENT_MASK	0x74
135 #define UART_DCD			0x01
136 #define UART_DSR			0x02
137 #define UART_BREAK_ERROR		0x04
138 #define UART_RING			0x08
139 #define UART_FRAME_ERROR		0x10
140 #define UART_PARITY_ERROR		0x20
141 #define UART_OVERRUN_ERROR		0x40
142 #define UART_CTS			0x80
143 
144 
145 enum pl2303_type {
146 	type_0,		/* don't know the difference between type 0 and */
147 	type_1,		/* type 1, until someone from prolific tells us... */
148 	HX,		/* HX version of the pl2303 chip */
149 };
150 
151 struct pl2303_private {
152 	spinlock_t lock;
153 	wait_queue_head_t delta_msr_wait;
154 	u8 line_control;
155 	u8 line_status;
156 	enum pl2303_type type;
157 };
158 
159 static int pl2303_vendor_read(__u16 value, __u16 index,
160 		struct usb_serial *serial, unsigned char *buf)
161 {
162 	int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
163 			VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
164 			value, index, buf, 1, 100);
165 	dbg("0x%x:0x%x:0x%x:0x%x  %d - %x", VENDOR_READ_REQUEST_TYPE,
166 			VENDOR_READ_REQUEST, value, index, res, buf[0]);
167 	return res;
168 }
169 
170 static int pl2303_vendor_write(__u16 value, __u16 index,
171 		struct usb_serial *serial)
172 {
173 	int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
174 			VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
175 			value, index, NULL, 0, 100);
176 	dbg("0x%x:0x%x:0x%x:0x%x  %d", VENDOR_WRITE_REQUEST_TYPE,
177 			VENDOR_WRITE_REQUEST, value, index, res);
178 	return res;
179 }
180 
181 static int pl2303_startup(struct usb_serial *serial)
182 {
183 	struct pl2303_private *priv;
184 	enum pl2303_type type = type_0;
185 	unsigned char *buf;
186 	int i;
187 
188 	buf = kmalloc(10, GFP_KERNEL);
189 	if (buf == NULL)
190 		return -ENOMEM;
191 
192 	if (serial->dev->descriptor.bDeviceClass == 0x02)
193 		type = type_0;
194 	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
195 		type = HX;
196 	else if (serial->dev->descriptor.bDeviceClass == 0x00)
197 		type = type_1;
198 	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
199 		type = type_1;
200 	dbg("device type: %d", type);
201 
202 	for (i = 0; i < serial->num_ports; ++i) {
203 		priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
204 		if (!priv)
205 			goto cleanup;
206 		spin_lock_init(&priv->lock);
207 		init_waitqueue_head(&priv->delta_msr_wait);
208 		priv->type = type;
209 		usb_set_serial_port_data(serial->port[i], priv);
210 	}
211 
212 	pl2303_vendor_read(0x8484, 0, serial, buf);
213 	pl2303_vendor_write(0x0404, 0, serial);
214 	pl2303_vendor_read(0x8484, 0, serial, buf);
215 	pl2303_vendor_read(0x8383, 0, serial, buf);
216 	pl2303_vendor_read(0x8484, 0, serial, buf);
217 	pl2303_vendor_write(0x0404, 1, serial);
218 	pl2303_vendor_read(0x8484, 0, serial, buf);
219 	pl2303_vendor_read(0x8383, 0, serial, buf);
220 	pl2303_vendor_write(0, 1, serial);
221 	pl2303_vendor_write(1, 0, serial);
222 	if (type == HX)
223 		pl2303_vendor_write(2, 0x44, serial);
224 	else
225 		pl2303_vendor_write(2, 0x24, serial);
226 
227 	kfree(buf);
228 	return 0;
229 
230 cleanup:
231 	kfree(buf);
232 	for (--i; i >= 0; --i) {
233 		priv = usb_get_serial_port_data(serial->port[i]);
234 		kfree(priv);
235 		usb_set_serial_port_data(serial->port[i], NULL);
236 	}
237 	return -ENOMEM;
238 }
239 
240 static int set_control_lines(struct usb_device *dev, u8 value)
241 {
242 	int retval;
243 
244 	retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
245 				 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
246 				 value, 0, NULL, 0, 100);
247 	dbg("%s - value = %d, retval = %d", __func__, value, retval);
248 	return retval;
249 }
250 
251 static void pl2303_set_termios(struct tty_struct *tty,
252 		struct usb_serial_port *port, struct ktermios *old_termios)
253 {
254 	struct usb_serial *serial = port->serial;
255 	struct pl2303_private *priv = usb_get_serial_port_data(port);
256 	unsigned long flags;
257 	unsigned int cflag;
258 	unsigned char *buf;
259 	int baud;
260 	int i;
261 	u8 control;
262 	const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
263 	                         4800, 7200, 9600, 14400, 19200, 28800, 38400,
264 	                         57600, 115200, 230400, 460800, 614400,
265 	                         921600, 1228800, 2457600, 3000000, 6000000 };
266 	int baud_floor, baud_ceil;
267 	int k;
268 
269 	dbg("%s -  port %d", __func__, port->number);
270 
271 	/* The PL2303 is reported to lose bytes if you change
272 	   serial settings even to the same values as before. Thus
273 	   we actually need to filter in this specific case */
274 
275 	if (!tty_termios_hw_change(tty->termios, old_termios))
276 		return;
277 
278 	cflag = tty->termios->c_cflag;
279 
280 	buf = kzalloc(7, GFP_KERNEL);
281 	if (!buf) {
282 		dev_err(&port->dev, "%s - out of memory.\n", __func__);
283 		/* Report back no change occurred */
284 		*tty->termios = *old_termios;
285 		return;
286 	}
287 
288 	i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
289 			    GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
290 			    0, 0, buf, 7, 100);
291 	dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
292 	    buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
293 
294 	if (cflag & CSIZE) {
295 		switch (cflag & CSIZE) {
296 		case CS5:
297 			buf[6] = 5;
298 			break;
299 		case CS6:
300 			buf[6] = 6;
301 			break;
302 		case CS7:
303 			buf[6] = 7;
304 			break;
305 		default:
306 		case CS8:
307 			buf[6] = 8;
308 			break;
309 		}
310 		dbg("%s - data bits = %d", __func__, buf[6]);
311 	}
312 
313 	/* For reference buf[0]:buf[3] baud rate value */
314 	/* NOTE: Only the values defined in baud_sup are supported !
315 	 *       => if unsupported values are set, the PL2303 seems to use
316 	 *          9600 baud (at least my PL2303X always does)
317 	 */
318 	baud = tty_get_baud_rate(tty);
319 	dbg("%s - baud requested = %d", __func__, baud);
320 	if (baud) {
321 		/* Set baudrate to nearest supported value */
322 		for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
323 			if (baud_sup[k] / baud) {
324 				baud_ceil = baud_sup[k];
325 				if (k==0) {
326 					baud = baud_ceil;
327 				} else {
328 					baud_floor = baud_sup[k-1];
329 					if ((baud_ceil % baud)
330 					    > (baud % baud_floor))
331 						baud = baud_floor;
332 					else
333 						baud = baud_ceil;
334 				}
335 				break;
336 			}
337 		}
338 		if (baud > 1228800) {
339 			/* type_0, type_1 only support up to 1228800 baud */
340 			if (priv->type != HX)
341 				baud = 1228800;
342 			else if (baud > 6000000)
343 				baud = 6000000;
344 		}
345 		dbg("%s - baud set = %d", __func__, baud);
346 		if (baud <= 115200) {
347 			buf[0] = baud & 0xff;
348 			buf[1] = (baud >> 8) & 0xff;
349 			buf[2] = (baud >> 16) & 0xff;
350 			buf[3] = (baud >> 24) & 0xff;
351 		} else {
352 			/* apparently the formula for higher speeds is:
353 			 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
354 			 */
355 			unsigned tmp = 12*1000*1000*32 / baud;
356 			buf[3] = 0x80;
357 			buf[2] = 0;
358 			buf[1] = (tmp >= 256);
359 			while (tmp >= 256) {
360 				tmp >>= 2;
361 				buf[1] <<= 1;
362 			}
363 			buf[0] = tmp;
364 		}
365 	}
366 
367 	/* For reference buf[4]=0 is 1 stop bits */
368 	/* For reference buf[4]=1 is 1.5 stop bits */
369 	/* For reference buf[4]=2 is 2 stop bits */
370 	if (cflag & CSTOPB) {
371 		/* NOTE: Comply with "real" UARTs / RS232:
372 		 *       use 1.5 instead of 2 stop bits with 5 data bits
373 		 */
374 		if ((cflag & CSIZE) == CS5) {
375 			buf[4] = 1;
376 			dbg("%s - stop bits = 1.5", __func__);
377 		} else {
378 			buf[4] = 2;
379 			dbg("%s - stop bits = 2", __func__);
380 		}
381 	} else {
382 		buf[4] = 0;
383 		dbg("%s - stop bits = 1", __func__);
384 	}
385 
386 	if (cflag & PARENB) {
387 		/* For reference buf[5]=0 is none parity */
388 		/* For reference buf[5]=1 is odd parity */
389 		/* For reference buf[5]=2 is even parity */
390 		/* For reference buf[5]=3 is mark parity */
391 		/* For reference buf[5]=4 is space parity */
392 		if (cflag & PARODD) {
393 			if (cflag & CMSPAR) {
394 				buf[5] = 3;
395 				dbg("%s - parity = mark", __func__);
396 			} else {
397 				buf[5] = 1;
398 				dbg("%s - parity = odd", __func__);
399 			}
400 		} else {
401 			if (cflag & CMSPAR) {
402 				buf[5] = 4;
403 				dbg("%s - parity = space", __func__);
404 			} else {
405 				buf[5] = 2;
406 				dbg("%s - parity = even", __func__);
407 			}
408 		}
409 	} else {
410 		buf[5] = 0;
411 		dbg("%s - parity = none", __func__);
412 	}
413 
414 	i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
415 			    SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
416 			    0, 0, buf, 7, 100);
417 	dbg("0x21:0x20:0:0  %d", i);
418 
419 	/* change control lines if we are switching to or from B0 */
420 	spin_lock_irqsave(&priv->lock, flags);
421 	control = priv->line_control;
422 	if ((cflag & CBAUD) == B0)
423 		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
424 	else
425 		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
426 	if (control != priv->line_control) {
427 		control = priv->line_control;
428 		spin_unlock_irqrestore(&priv->lock, flags);
429 		set_control_lines(serial->dev, control);
430 	} else {
431 		spin_unlock_irqrestore(&priv->lock, flags);
432 	}
433 
434 	buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
435 
436 	i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
437 			    GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
438 			    0, 0, buf, 7, 100);
439 	dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
440 	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
441 
442 	if (cflag & CRTSCTS) {
443 		if (priv->type == HX)
444 			pl2303_vendor_write(0x0, 0x61, serial);
445 		else
446 			pl2303_vendor_write(0x0, 0x41, serial);
447 	} else {
448 		pl2303_vendor_write(0x0, 0x0, serial);
449 	}
450 
451 	/* Save resulting baud rate */
452 	if (baud)
453 		tty_encode_baud_rate(tty, baud, baud);
454 
455 	kfree(buf);
456 }
457 
458 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
459 {
460 	struct pl2303_private *priv = usb_get_serial_port_data(port);
461 	unsigned long flags;
462 	u8 control;
463 
464 	spin_lock_irqsave(&priv->lock, flags);
465 	/* Change DTR and RTS */
466 	if (on)
467 		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
468 	else
469 		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
470 	control = priv->line_control;
471 	spin_unlock_irqrestore(&priv->lock, flags);
472 	set_control_lines(port->serial->dev, control);
473 }
474 
475 static void pl2303_close(struct usb_serial_port *port)
476 {
477 	dbg("%s - port %d", __func__, port->number);
478 
479 	usb_serial_generic_close(port);
480 	usb_kill_urb(port->interrupt_in_urb);
481 }
482 
483 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
484 {
485 	struct ktermios tmp_termios;
486 	struct usb_serial *serial = port->serial;
487 	struct pl2303_private *priv = usb_get_serial_port_data(port);
488 	int result;
489 
490 	dbg("%s -  port %d", __func__, port->number);
491 
492 	if (priv->type != HX) {
493 		usb_clear_halt(serial->dev, port->write_urb->pipe);
494 		usb_clear_halt(serial->dev, port->read_urb->pipe);
495 	} else {
496 		/* reset upstream data pipes */
497 		pl2303_vendor_write(8, 0, serial);
498 		pl2303_vendor_write(9, 0, serial);
499 	}
500 
501 	/* Setup termios */
502 	if (tty)
503 		pl2303_set_termios(tty, port, &tmp_termios);
504 
505 	dbg("%s - submitting read urb", __func__);
506 	result = usb_serial_generic_submit_read_urb(port, GFP_KERNEL);
507 	if (result) {
508 		pl2303_close(port);
509 		return -EPROTO;
510 	}
511 
512 	dbg("%s - submitting interrupt urb", __func__);
513 	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
514 	if (result) {
515 		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
516 			" error %d\n", __func__, result);
517 		pl2303_close(port);
518 		return -EPROTO;
519 	}
520 	port->port.drain_delay = 256;
521 	return 0;
522 }
523 
524 static int pl2303_tiocmset(struct tty_struct *tty,
525 			   unsigned int set, unsigned int clear)
526 {
527 	struct usb_serial_port *port = tty->driver_data;
528 	struct pl2303_private *priv = usb_get_serial_port_data(port);
529 	unsigned long flags;
530 	u8 control;
531 
532 	if (!usb_get_intfdata(port->serial->interface))
533 		return -ENODEV;
534 
535 	spin_lock_irqsave(&priv->lock, flags);
536 	if (set & TIOCM_RTS)
537 		priv->line_control |= CONTROL_RTS;
538 	if (set & TIOCM_DTR)
539 		priv->line_control |= CONTROL_DTR;
540 	if (clear & TIOCM_RTS)
541 		priv->line_control &= ~CONTROL_RTS;
542 	if (clear & TIOCM_DTR)
543 		priv->line_control &= ~CONTROL_DTR;
544 	control = priv->line_control;
545 	spin_unlock_irqrestore(&priv->lock, flags);
546 
547 	return set_control_lines(port->serial->dev, control);
548 }
549 
550 static int pl2303_tiocmget(struct tty_struct *tty)
551 {
552 	struct usb_serial_port *port = tty->driver_data;
553 	struct pl2303_private *priv = usb_get_serial_port_data(port);
554 	unsigned long flags;
555 	unsigned int mcr;
556 	unsigned int status;
557 	unsigned int result;
558 
559 	dbg("%s (%d)", __func__, port->number);
560 
561 	if (!usb_get_intfdata(port->serial->interface))
562 		return -ENODEV;
563 
564 	spin_lock_irqsave(&priv->lock, flags);
565 	mcr = priv->line_control;
566 	status = priv->line_status;
567 	spin_unlock_irqrestore(&priv->lock, flags);
568 
569 	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
570 		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
571 		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
572 		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
573 		  | ((status & UART_RING)	? TIOCM_RI  : 0)
574 		  | ((status & UART_DCD)	? TIOCM_CD  : 0);
575 
576 	dbg("%s - result = %x", __func__, result);
577 
578 	return result;
579 }
580 
581 static int pl2303_carrier_raised(struct usb_serial_port *port)
582 {
583 	struct pl2303_private *priv = usb_get_serial_port_data(port);
584 	if (priv->line_status & UART_DCD)
585 		return 1;
586 	return 0;
587 }
588 
589 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
590 {
591 	struct pl2303_private *priv = usb_get_serial_port_data(port);
592 	unsigned long flags;
593 	unsigned int prevstatus;
594 	unsigned int status;
595 	unsigned int changed;
596 
597 	spin_lock_irqsave(&priv->lock, flags);
598 	prevstatus = priv->line_status;
599 	spin_unlock_irqrestore(&priv->lock, flags);
600 
601 	while (1) {
602 		interruptible_sleep_on(&priv->delta_msr_wait);
603 		/* see if a signal did it */
604 		if (signal_pending(current))
605 			return -ERESTARTSYS;
606 
607 		spin_lock_irqsave(&priv->lock, flags);
608 		status = priv->line_status;
609 		spin_unlock_irqrestore(&priv->lock, flags);
610 
611 		changed = prevstatus ^ status;
612 
613 		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
614 		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
615 		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
616 		    ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
617 			return 0;
618 		}
619 		prevstatus = status;
620 	}
621 	/* NOTREACHED */
622 	return 0;
623 }
624 
625 static int pl2303_ioctl(struct tty_struct *tty,
626 			unsigned int cmd, unsigned long arg)
627 {
628 	struct serial_struct ser;
629 	struct usb_serial_port *port = tty->driver_data;
630 	dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
631 
632 	switch (cmd) {
633 	case TIOCGSERIAL:
634 		memset(&ser, 0, sizeof ser);
635 		ser.type = PORT_16654;
636 		ser.line = port->serial->minor;
637 		ser.port = port->number;
638 		ser.baud_base = 460800;
639 
640 		if (copy_to_user((void __user *)arg, &ser, sizeof ser))
641 			return -EFAULT;
642 
643 		return 0;
644 
645 	case TIOCMIWAIT:
646 		dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
647 		return wait_modem_info(port, arg);
648 	default:
649 		dbg("%s not supported = 0x%04x", __func__, cmd);
650 		break;
651 	}
652 	return -ENOIOCTLCMD;
653 }
654 
655 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
656 {
657 	struct usb_serial_port *port = tty->driver_data;
658 	struct usb_serial *serial = port->serial;
659 	u16 state;
660 	int result;
661 
662 	dbg("%s - port %d", __func__, port->number);
663 
664 	if (break_state == 0)
665 		state = BREAK_OFF;
666 	else
667 		state = BREAK_ON;
668 	dbg("%s - turning break %s", __func__,
669 			state == BREAK_OFF ? "off" : "on");
670 
671 	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
672 				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
673 				 0, NULL, 0, 100);
674 	if (result)
675 		dbg("%s - error sending break = %d", __func__, result);
676 }
677 
678 static void pl2303_release(struct usb_serial *serial)
679 {
680 	int i;
681 	struct pl2303_private *priv;
682 
683 	dbg("%s", __func__);
684 
685 	for (i = 0; i < serial->num_ports; ++i) {
686 		priv = usb_get_serial_port_data(serial->port[i]);
687 		kfree(priv);
688 	}
689 }
690 
691 static void pl2303_update_line_status(struct usb_serial_port *port,
692 				      unsigned char *data,
693 				      unsigned int actual_length)
694 {
695 
696 	struct pl2303_private *priv = usb_get_serial_port_data(port);
697 	struct tty_struct *tty;
698 	unsigned long flags;
699 	u8 status_idx = UART_STATE;
700 	u8 length = UART_STATE + 1;
701 	u8 prev_line_status;
702 	u16 idv, idp;
703 
704 	idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
705 	idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
706 
707 
708 	if (idv == SIEMENS_VENDOR_ID) {
709 		if (idp == SIEMENS_PRODUCT_ID_X65 ||
710 		    idp == SIEMENS_PRODUCT_ID_SX1 ||
711 		    idp == SIEMENS_PRODUCT_ID_X75) {
712 
713 			length = 1;
714 			status_idx = 0;
715 		}
716 	}
717 
718 	if (actual_length < length)
719 		return;
720 
721 	/* Save off the uart status for others to look at */
722 	spin_lock_irqsave(&priv->lock, flags);
723 	prev_line_status = priv->line_status;
724 	priv->line_status = data[status_idx];
725 	spin_unlock_irqrestore(&priv->lock, flags);
726 	if (priv->line_status & UART_BREAK_ERROR)
727 		usb_serial_handle_break(port);
728 	wake_up_interruptible(&priv->delta_msr_wait);
729 
730 	tty = tty_port_tty_get(&port->port);
731 	if (!tty)
732 		return;
733 	if ((priv->line_status ^ prev_line_status) & UART_DCD)
734 		usb_serial_handle_dcd_change(port, tty,
735 				priv->line_status & UART_DCD);
736 	tty_kref_put(tty);
737 }
738 
739 static void pl2303_read_int_callback(struct urb *urb)
740 {
741 	struct usb_serial_port *port =  urb->context;
742 	unsigned char *data = urb->transfer_buffer;
743 	unsigned int actual_length = urb->actual_length;
744 	int status = urb->status;
745 	int retval;
746 
747 	dbg("%s (%d)", __func__, port->number);
748 
749 	switch (status) {
750 	case 0:
751 		/* success */
752 		break;
753 	case -ECONNRESET:
754 	case -ENOENT:
755 	case -ESHUTDOWN:
756 		/* this urb is terminated, clean up */
757 		dbg("%s - urb shutting down with status: %d", __func__,
758 		    status);
759 		return;
760 	default:
761 		dbg("%s - nonzero urb status received: %d", __func__,
762 		    status);
763 		goto exit;
764 	}
765 
766 	usb_serial_debug_data(debug, &port->dev, __func__,
767 			      urb->actual_length, urb->transfer_buffer);
768 
769 	pl2303_update_line_status(port, data, actual_length);
770 
771 exit:
772 	retval = usb_submit_urb(urb, GFP_ATOMIC);
773 	if (retval)
774 		dev_err(&urb->dev->dev,
775 			"%s - usb_submit_urb failed with result %d\n",
776 			__func__, retval);
777 }
778 
779 static void pl2303_process_read_urb(struct urb *urb)
780 {
781 	struct usb_serial_port *port = urb->context;
782 	struct pl2303_private *priv = usb_get_serial_port_data(port);
783 	struct tty_struct *tty;
784 	unsigned char *data = urb->transfer_buffer;
785 	char tty_flag = TTY_NORMAL;
786 	unsigned long flags;
787 	u8 line_status;
788 	int i;
789 
790 	/* update line status */
791 	spin_lock_irqsave(&priv->lock, flags);
792 	line_status = priv->line_status;
793 	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
794 	spin_unlock_irqrestore(&priv->lock, flags);
795 	wake_up_interruptible(&priv->delta_msr_wait);
796 
797 	if (!urb->actual_length)
798 		return;
799 
800 	tty = tty_port_tty_get(&port->port);
801 	if (!tty)
802 		return;
803 
804 	/* break takes precedence over parity, */
805 	/* which takes precedence over framing errors */
806 	if (line_status & UART_BREAK_ERROR)
807 		tty_flag = TTY_BREAK;
808 	else if (line_status & UART_PARITY_ERROR)
809 		tty_flag = TTY_PARITY;
810 	else if (line_status & UART_FRAME_ERROR)
811 		tty_flag = TTY_FRAME;
812 	dbg("%s - tty_flag = %d", __func__, tty_flag);
813 
814 	/* overrun is special, not associated with a char */
815 	if (line_status & UART_OVERRUN_ERROR)
816 		tty_insert_flip_char(tty, 0, TTY_OVERRUN);
817 
818 	if (port->port.console && port->sysrq) {
819 		for (i = 0; i < urb->actual_length; ++i)
820 			if (!usb_serial_handle_sysrq_char(port, data[i]))
821 				tty_insert_flip_char(tty, data[i], tty_flag);
822 	} else {
823 		tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
824 							urb->actual_length);
825 	}
826 
827 	tty_flip_buffer_push(tty);
828 	tty_kref_put(tty);
829 }
830 
831 /* All of the device info needed for the PL2303 SIO serial converter */
832 static struct usb_serial_driver pl2303_device = {
833 	.driver = {
834 		.owner =	THIS_MODULE,
835 		.name =		"pl2303",
836 	},
837 	.id_table =		id_table,
838 	.usb_driver = 		&pl2303_driver,
839 	.num_ports =		1,
840 	.bulk_in_size =		256,
841 	.bulk_out_size =	256,
842 	.open =			pl2303_open,
843 	.close =		pl2303_close,
844 	.dtr_rts = 		pl2303_dtr_rts,
845 	.carrier_raised =	pl2303_carrier_raised,
846 	.ioctl =		pl2303_ioctl,
847 	.break_ctl =		pl2303_break_ctl,
848 	.set_termios =		pl2303_set_termios,
849 	.tiocmget =		pl2303_tiocmget,
850 	.tiocmset =		pl2303_tiocmset,
851 	.process_read_urb =	pl2303_process_read_urb,
852 	.read_int_callback =	pl2303_read_int_callback,
853 	.attach =		pl2303_startup,
854 	.release =		pl2303_release,
855 };
856 
857 static int __init pl2303_init(void)
858 {
859 	int retval;
860 
861 	retval = usb_serial_register(&pl2303_device);
862 	if (retval)
863 		goto failed_usb_serial_register;
864 	retval = usb_register(&pl2303_driver);
865 	if (retval)
866 		goto failed_usb_register;
867 	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
868 	return 0;
869 failed_usb_register:
870 	usb_serial_deregister(&pl2303_device);
871 failed_usb_serial_register:
872 	return retval;
873 }
874 
875 static void __exit pl2303_exit(void)
876 {
877 	usb_deregister(&pl2303_driver);
878 	usb_serial_deregister(&pl2303_device);
879 }
880 
881 module_init(pl2303_init);
882 module_exit(pl2303_exit);
883 
884 MODULE_DESCRIPTION(DRIVER_DESC);
885 MODULE_LICENSE("GPL");
886 
887 module_param(debug, bool, S_IRUGO | S_IWUSR);
888 MODULE_PARM_DESC(debug, "Debug enabled or not");
889 
890