pl2303.c revision 20b9d17715017ae4dd4ec87fabc36d33b9de708e
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
39static int debug;
40
41#define PL2303_CLOSING_WAIT	(30*HZ)
42
43static 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
97MODULE_DEVICE_TABLE(usb, id_table);
98
99static 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
144enum 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
150struct 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
158static 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
169static 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
180static 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
229cleanup:
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
239static 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
250static 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
442static 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
459static 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
467static 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
508static 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
534static 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
565static 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
573static 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
609static int pl2303_ioctl(struct tty_struct *tty, struct file *file,
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
639static 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
662static 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
675static 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
723static 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
755exit:
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
763static 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 */
816static 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
841static 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;
853failed_usb_register:
854	usb_serial_deregister(&pl2303_device);
855failed_usb_serial_register:
856	return retval;
857}
858
859static void __exit pl2303_exit(void)
860{
861	usb_deregister(&pl2303_driver);
862	usb_serial_deregister(&pl2303_device);
863}
864
865module_init(pl2303_init);
866module_exit(pl2303_exit);
867
868MODULE_DESCRIPTION(DRIVER_DESC);
869MODULE_LICENSE("GPL");
870
871module_param(debug, bool, S_IRUGO | S_IWUSR);
872MODULE_PARM_DESC(debug, "Debug enabled or not");
873
874