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