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