xref: /openbmc/linux/drivers/usb/serial/pl2303.c (revision 565d76cb)
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 	{ }					/* Terminating entry */
95 };
96 
97 MODULE_DEVICE_TABLE(usb, id_table);
98 
99 static struct usb_driver pl2303_driver = {
100 	.name =		"pl2303",
101 	.probe =	usb_serial_probe,
102 	.disconnect =	usb_serial_disconnect,
103 	.id_table =	id_table,
104 	.suspend =      usb_serial_suspend,
105 	.resume =       usb_serial_resume,
106 	.no_dynamic_id = 	1,
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 		buf[0] = baud & 0xff;
346 		buf[1] = (baud >> 8) & 0xff;
347 		buf[2] = (baud >> 16) & 0xff;
348 		buf[3] = (baud >> 24) & 0xff;
349 	}
350 
351 	/* For reference buf[4]=0 is 1 stop bits */
352 	/* For reference buf[4]=1 is 1.5 stop bits */
353 	/* For reference buf[4]=2 is 2 stop bits */
354 	if (cflag & CSTOPB) {
355 		/* NOTE: Comply with "real" UARTs / RS232:
356 		 *       use 1.5 instead of 2 stop bits with 5 data bits
357 		 */
358 		if ((cflag & CSIZE) == CS5) {
359 			buf[4] = 1;
360 			dbg("%s - stop bits = 1.5", __func__);
361 		} else {
362 			buf[4] = 2;
363 			dbg("%s - stop bits = 2", __func__);
364 		}
365 	} else {
366 		buf[4] = 0;
367 		dbg("%s - stop bits = 1", __func__);
368 	}
369 
370 	if (cflag & PARENB) {
371 		/* For reference buf[5]=0 is none parity */
372 		/* For reference buf[5]=1 is odd parity */
373 		/* For reference buf[5]=2 is even parity */
374 		/* For reference buf[5]=3 is mark parity */
375 		/* For reference buf[5]=4 is space parity */
376 		if (cflag & PARODD) {
377 			if (cflag & CMSPAR) {
378 				buf[5] = 3;
379 				dbg("%s - parity = mark", __func__);
380 			} else {
381 				buf[5] = 1;
382 				dbg("%s - parity = odd", __func__);
383 			}
384 		} else {
385 			if (cflag & CMSPAR) {
386 				buf[5] = 4;
387 				dbg("%s - parity = space", __func__);
388 			} else {
389 				buf[5] = 2;
390 				dbg("%s - parity = even", __func__);
391 			}
392 		}
393 	} else {
394 		buf[5] = 0;
395 		dbg("%s - parity = none", __func__);
396 	}
397 
398 	i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
399 			    SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
400 			    0, 0, buf, 7, 100);
401 	dbg("0x21:0x20:0:0  %d", i);
402 
403 	/* change control lines if we are switching to or from B0 */
404 	spin_lock_irqsave(&priv->lock, flags);
405 	control = priv->line_control;
406 	if ((cflag & CBAUD) == B0)
407 		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
408 	else
409 		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
410 	if (control != priv->line_control) {
411 		control = priv->line_control;
412 		spin_unlock_irqrestore(&priv->lock, flags);
413 		set_control_lines(serial->dev, control);
414 	} else {
415 		spin_unlock_irqrestore(&priv->lock, flags);
416 	}
417 
418 	buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
419 
420 	i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
421 			    GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
422 			    0, 0, buf, 7, 100);
423 	dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
424 	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
425 
426 	if (cflag & CRTSCTS) {
427 		if (priv->type == HX)
428 			pl2303_vendor_write(0x0, 0x61, serial);
429 		else
430 			pl2303_vendor_write(0x0, 0x41, serial);
431 	} else {
432 		pl2303_vendor_write(0x0, 0x0, serial);
433 	}
434 
435 	/* Save resulting baud rate */
436 	if (baud)
437 		tty_encode_baud_rate(tty, baud, baud);
438 
439 	kfree(buf);
440 }
441 
442 static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
443 {
444 	struct pl2303_private *priv = usb_get_serial_port_data(port);
445 	unsigned long flags;
446 	u8 control;
447 
448 	spin_lock_irqsave(&priv->lock, flags);
449 	/* Change DTR and RTS */
450 	if (on)
451 		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
452 	else
453 		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
454 	control = priv->line_control;
455 	spin_unlock_irqrestore(&priv->lock, flags);
456 	set_control_lines(port->serial->dev, control);
457 }
458 
459 static void pl2303_close(struct usb_serial_port *port)
460 {
461 	dbg("%s - port %d", __func__, port->number);
462 
463 	usb_serial_generic_close(port);
464 	usb_kill_urb(port->interrupt_in_urb);
465 }
466 
467 static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
468 {
469 	struct ktermios tmp_termios;
470 	struct usb_serial *serial = port->serial;
471 	struct pl2303_private *priv = usb_get_serial_port_data(port);
472 	int result;
473 
474 	dbg("%s -  port %d", __func__, port->number);
475 
476 	if (priv->type != HX) {
477 		usb_clear_halt(serial->dev, port->write_urb->pipe);
478 		usb_clear_halt(serial->dev, port->read_urb->pipe);
479 	} else {
480 		/* reset upstream data pipes */
481 		pl2303_vendor_write(8, 0, serial);
482 		pl2303_vendor_write(9, 0, serial);
483 	}
484 
485 	/* Setup termios */
486 	if (tty)
487 		pl2303_set_termios(tty, port, &tmp_termios);
488 
489 	dbg("%s - submitting read urb", __func__);
490 	result = usb_serial_generic_submit_read_urb(port, GFP_KERNEL);
491 	if (result) {
492 		pl2303_close(port);
493 		return -EPROTO;
494 	}
495 
496 	dbg("%s - submitting interrupt urb", __func__);
497 	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
498 	if (result) {
499 		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
500 			" error %d\n", __func__, result);
501 		pl2303_close(port);
502 		return -EPROTO;
503 	}
504 	port->port.drain_delay = 256;
505 	return 0;
506 }
507 
508 static int pl2303_tiocmset(struct tty_struct *tty,
509 			   unsigned int set, unsigned int clear)
510 {
511 	struct usb_serial_port *port = tty->driver_data;
512 	struct pl2303_private *priv = usb_get_serial_port_data(port);
513 	unsigned long flags;
514 	u8 control;
515 
516 	if (!usb_get_intfdata(port->serial->interface))
517 		return -ENODEV;
518 
519 	spin_lock_irqsave(&priv->lock, flags);
520 	if (set & TIOCM_RTS)
521 		priv->line_control |= CONTROL_RTS;
522 	if (set & TIOCM_DTR)
523 		priv->line_control |= CONTROL_DTR;
524 	if (clear & TIOCM_RTS)
525 		priv->line_control &= ~CONTROL_RTS;
526 	if (clear & TIOCM_DTR)
527 		priv->line_control &= ~CONTROL_DTR;
528 	control = priv->line_control;
529 	spin_unlock_irqrestore(&priv->lock, flags);
530 
531 	return set_control_lines(port->serial->dev, control);
532 }
533 
534 static int pl2303_tiocmget(struct tty_struct *tty)
535 {
536 	struct usb_serial_port *port = tty->driver_data;
537 	struct pl2303_private *priv = usb_get_serial_port_data(port);
538 	unsigned long flags;
539 	unsigned int mcr;
540 	unsigned int status;
541 	unsigned int result;
542 
543 	dbg("%s (%d)", __func__, port->number);
544 
545 	if (!usb_get_intfdata(port->serial->interface))
546 		return -ENODEV;
547 
548 	spin_lock_irqsave(&priv->lock, flags);
549 	mcr = priv->line_control;
550 	status = priv->line_status;
551 	spin_unlock_irqrestore(&priv->lock, flags);
552 
553 	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
554 		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
555 		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
556 		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
557 		  | ((status & UART_RING)	? TIOCM_RI  : 0)
558 		  | ((status & UART_DCD)	? TIOCM_CD  : 0);
559 
560 	dbg("%s - result = %x", __func__, result);
561 
562 	return result;
563 }
564 
565 static int pl2303_carrier_raised(struct usb_serial_port *port)
566 {
567 	struct pl2303_private *priv = usb_get_serial_port_data(port);
568 	if (priv->line_status & UART_DCD)
569 		return 1;
570 	return 0;
571 }
572 
573 static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
574 {
575 	struct pl2303_private *priv = usb_get_serial_port_data(port);
576 	unsigned long flags;
577 	unsigned int prevstatus;
578 	unsigned int status;
579 	unsigned int changed;
580 
581 	spin_lock_irqsave(&priv->lock, flags);
582 	prevstatus = priv->line_status;
583 	spin_unlock_irqrestore(&priv->lock, flags);
584 
585 	while (1) {
586 		interruptible_sleep_on(&priv->delta_msr_wait);
587 		/* see if a signal did it */
588 		if (signal_pending(current))
589 			return -ERESTARTSYS;
590 
591 		spin_lock_irqsave(&priv->lock, flags);
592 		status = priv->line_status;
593 		spin_unlock_irqrestore(&priv->lock, flags);
594 
595 		changed = prevstatus ^ status;
596 
597 		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
598 		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
599 		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
600 		    ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
601 			return 0;
602 		}
603 		prevstatus = status;
604 	}
605 	/* NOTREACHED */
606 	return 0;
607 }
608 
609 static int pl2303_ioctl(struct tty_struct *tty,
610 			unsigned int cmd, unsigned long arg)
611 {
612 	struct serial_struct ser;
613 	struct usb_serial_port *port = tty->driver_data;
614 	dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
615 
616 	switch (cmd) {
617 	case TIOCGSERIAL:
618 		memset(&ser, 0, sizeof ser);
619 		ser.type = PORT_16654;
620 		ser.line = port->serial->minor;
621 		ser.port = port->number;
622 		ser.baud_base = 460800;
623 
624 		if (copy_to_user((void __user *)arg, &ser, sizeof ser))
625 			return -EFAULT;
626 
627 		return 0;
628 
629 	case TIOCMIWAIT:
630 		dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
631 		return wait_modem_info(port, arg);
632 	default:
633 		dbg("%s not supported = 0x%04x", __func__, cmd);
634 		break;
635 	}
636 	return -ENOIOCTLCMD;
637 }
638 
639 static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
640 {
641 	struct usb_serial_port *port = tty->driver_data;
642 	struct usb_serial *serial = port->serial;
643 	u16 state;
644 	int result;
645 
646 	dbg("%s - port %d", __func__, port->number);
647 
648 	if (break_state == 0)
649 		state = BREAK_OFF;
650 	else
651 		state = BREAK_ON;
652 	dbg("%s - turning break %s", __func__,
653 			state == BREAK_OFF ? "off" : "on");
654 
655 	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
656 				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
657 				 0, NULL, 0, 100);
658 	if (result)
659 		dbg("%s - error sending break = %d", __func__, result);
660 }
661 
662 static void pl2303_release(struct usb_serial *serial)
663 {
664 	int i;
665 	struct pl2303_private *priv;
666 
667 	dbg("%s", __func__);
668 
669 	for (i = 0; i < serial->num_ports; ++i) {
670 		priv = usb_get_serial_port_data(serial->port[i]);
671 		kfree(priv);
672 	}
673 }
674 
675 static void pl2303_update_line_status(struct usb_serial_port *port,
676 				      unsigned char *data,
677 				      unsigned int actual_length)
678 {
679 
680 	struct pl2303_private *priv = usb_get_serial_port_data(port);
681 	struct tty_struct *tty;
682 	unsigned long flags;
683 	u8 status_idx = UART_STATE;
684 	u8 length = UART_STATE + 1;
685 	u8 prev_line_status;
686 	u16 idv, idp;
687 
688 	idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
689 	idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
690 
691 
692 	if (idv == SIEMENS_VENDOR_ID) {
693 		if (idp == SIEMENS_PRODUCT_ID_X65 ||
694 		    idp == SIEMENS_PRODUCT_ID_SX1 ||
695 		    idp == SIEMENS_PRODUCT_ID_X75) {
696 
697 			length = 1;
698 			status_idx = 0;
699 		}
700 	}
701 
702 	if (actual_length < length)
703 		return;
704 
705 	/* Save off the uart status for others to look at */
706 	spin_lock_irqsave(&priv->lock, flags);
707 	prev_line_status = priv->line_status;
708 	priv->line_status = data[status_idx];
709 	spin_unlock_irqrestore(&priv->lock, flags);
710 	if (priv->line_status & UART_BREAK_ERROR)
711 		usb_serial_handle_break(port);
712 	wake_up_interruptible(&priv->delta_msr_wait);
713 
714 	tty = tty_port_tty_get(&port->port);
715 	if (!tty)
716 		return;
717 	if ((priv->line_status ^ prev_line_status) & UART_DCD)
718 		usb_serial_handle_dcd_change(port, tty,
719 				priv->line_status & UART_DCD);
720 	tty_kref_put(tty);
721 }
722 
723 static void pl2303_read_int_callback(struct urb *urb)
724 {
725 	struct usb_serial_port *port =  urb->context;
726 	unsigned char *data = urb->transfer_buffer;
727 	unsigned int actual_length = urb->actual_length;
728 	int status = urb->status;
729 	int retval;
730 
731 	dbg("%s (%d)", __func__, port->number);
732 
733 	switch (status) {
734 	case 0:
735 		/* success */
736 		break;
737 	case -ECONNRESET:
738 	case -ENOENT:
739 	case -ESHUTDOWN:
740 		/* this urb is terminated, clean up */
741 		dbg("%s - urb shutting down with status: %d", __func__,
742 		    status);
743 		return;
744 	default:
745 		dbg("%s - nonzero urb status received: %d", __func__,
746 		    status);
747 		goto exit;
748 	}
749 
750 	usb_serial_debug_data(debug, &port->dev, __func__,
751 			      urb->actual_length, urb->transfer_buffer);
752 
753 	pl2303_update_line_status(port, data, actual_length);
754 
755 exit:
756 	retval = usb_submit_urb(urb, GFP_ATOMIC);
757 	if (retval)
758 		dev_err(&urb->dev->dev,
759 			"%s - usb_submit_urb failed with result %d\n",
760 			__func__, retval);
761 }
762 
763 static void pl2303_process_read_urb(struct urb *urb)
764 {
765 	struct usb_serial_port *port = urb->context;
766 	struct pl2303_private *priv = usb_get_serial_port_data(port);
767 	struct tty_struct *tty;
768 	unsigned char *data = urb->transfer_buffer;
769 	char tty_flag = TTY_NORMAL;
770 	unsigned long flags;
771 	u8 line_status;
772 	int i;
773 
774 	/* update line status */
775 	spin_lock_irqsave(&priv->lock, flags);
776 	line_status = priv->line_status;
777 	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
778 	spin_unlock_irqrestore(&priv->lock, flags);
779 	wake_up_interruptible(&priv->delta_msr_wait);
780 
781 	if (!urb->actual_length)
782 		return;
783 
784 	tty = tty_port_tty_get(&port->port);
785 	if (!tty)
786 		return;
787 
788 	/* break takes precedence over parity, */
789 	/* which takes precedence over framing errors */
790 	if (line_status & UART_BREAK_ERROR)
791 		tty_flag = TTY_BREAK;
792 	else if (line_status & UART_PARITY_ERROR)
793 		tty_flag = TTY_PARITY;
794 	else if (line_status & UART_FRAME_ERROR)
795 		tty_flag = TTY_FRAME;
796 	dbg("%s - tty_flag = %d", __func__, tty_flag);
797 
798 	/* overrun is special, not associated with a char */
799 	if (line_status & UART_OVERRUN_ERROR)
800 		tty_insert_flip_char(tty, 0, TTY_OVERRUN);
801 
802 	if (port->port.console && port->sysrq) {
803 		for (i = 0; i < urb->actual_length; ++i)
804 			if (!usb_serial_handle_sysrq_char(port, data[i]))
805 				tty_insert_flip_char(tty, data[i], tty_flag);
806 	} else {
807 		tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
808 							urb->actual_length);
809 	}
810 
811 	tty_flip_buffer_push(tty);
812 	tty_kref_put(tty);
813 }
814 
815 /* All of the device info needed for the PL2303 SIO serial converter */
816 static struct usb_serial_driver pl2303_device = {
817 	.driver = {
818 		.owner =	THIS_MODULE,
819 		.name =		"pl2303",
820 	},
821 	.id_table =		id_table,
822 	.usb_driver = 		&pl2303_driver,
823 	.num_ports =		1,
824 	.bulk_in_size =		256,
825 	.bulk_out_size =	256,
826 	.open =			pl2303_open,
827 	.close =		pl2303_close,
828 	.dtr_rts = 		pl2303_dtr_rts,
829 	.carrier_raised =	pl2303_carrier_raised,
830 	.ioctl =		pl2303_ioctl,
831 	.break_ctl =		pl2303_break_ctl,
832 	.set_termios =		pl2303_set_termios,
833 	.tiocmget =		pl2303_tiocmget,
834 	.tiocmset =		pl2303_tiocmset,
835 	.process_read_urb =	pl2303_process_read_urb,
836 	.read_int_callback =	pl2303_read_int_callback,
837 	.attach =		pl2303_startup,
838 	.release =		pl2303_release,
839 };
840 
841 static int __init pl2303_init(void)
842 {
843 	int retval;
844 
845 	retval = usb_serial_register(&pl2303_device);
846 	if (retval)
847 		goto failed_usb_serial_register;
848 	retval = usb_register(&pl2303_driver);
849 	if (retval)
850 		goto failed_usb_register;
851 	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
852 	return 0;
853 failed_usb_register:
854 	usb_serial_deregister(&pl2303_device);
855 failed_usb_serial_register:
856 	return retval;
857 }
858 
859 static void __exit pl2303_exit(void)
860 {
861 	usb_deregister(&pl2303_driver);
862 	usb_serial_deregister(&pl2303_device);
863 }
864 
865 module_init(pl2303_init);
866 module_exit(pl2303_exit);
867 
868 MODULE_DESCRIPTION(DRIVER_DESC);
869 MODULE_LICENSE("GPL");
870 
871 module_param(debug, bool, S_IRUGO | S_IWUSR);
872 MODULE_PARM_DESC(debug, "Debug enabled or not");
873 
874