pl2303.c revision c6c27721a42b991965bb792d5c196b8331d008d5
1/*
2 * Prolific PL2303 USB to serial adaptor driver
3 *
4 * Copyright (C) 2001-2004 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 modify
10 *	it under the terms of the GNU General Public License as published by
11 *	the Free Software Foundation; either version 2 of the License.
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
14 *
15 */
16
17#include <linux/config.h>
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 <asm/uaccess.h>
30#include <linux/usb.h>
31#include "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
43#define PL2303_BUF_SIZE		1024
44#define PL2303_TMP_BUF_SIZE	1024
45
46struct pl2303_buf {
47	unsigned int	buf_size;
48	char		*buf_buf;
49	char		*buf_get;
50	char		*buf_put;
51};
52
53static struct usb_device_id id_table [] = {
54	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
55	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
56	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
57	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
58	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
59	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
60	{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
61	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
62	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
63	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
64	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
65	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
66	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
67	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
68	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
69	{ USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
70	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
71	{ USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
72	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
73	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
74	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
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	{ }					/* Terminating entry */
81};
82
83MODULE_DEVICE_TABLE (usb, id_table);
84
85static struct usb_driver pl2303_driver = {
86	.name =		"pl2303",
87	.probe =	usb_serial_probe,
88	.disconnect =	usb_serial_disconnect,
89	.id_table =	id_table,
90	.no_dynamic_id = 	1,
91};
92
93#define SET_LINE_REQUEST_TYPE		0x21
94#define SET_LINE_REQUEST		0x20
95
96#define SET_CONTROL_REQUEST_TYPE	0x21
97#define SET_CONTROL_REQUEST		0x22
98#define CONTROL_DTR			0x01
99#define CONTROL_RTS			0x02
100
101#define BREAK_REQUEST_TYPE		0x21
102#define BREAK_REQUEST			0x23
103#define BREAK_ON			0xffff
104#define BREAK_OFF			0x0000
105
106#define GET_LINE_REQUEST_TYPE		0xa1
107#define GET_LINE_REQUEST		0x21
108
109#define VENDOR_WRITE_REQUEST_TYPE	0x40
110#define VENDOR_WRITE_REQUEST		0x01
111
112#define VENDOR_READ_REQUEST_TYPE	0xc0
113#define VENDOR_READ_REQUEST		0x01
114
115#define UART_STATE			0x08
116#define UART_STATE_TRANSIENT_MASK	0x74
117#define UART_DCD			0x01
118#define UART_DSR			0x02
119#define UART_BREAK_ERROR		0x04
120#define UART_RING			0x08
121#define UART_FRAME_ERROR		0x10
122#define UART_PARITY_ERROR		0x20
123#define UART_OVERRUN_ERROR		0x40
124#define UART_CTS			0x80
125
126/* function prototypes for a PL2303 serial converter */
127static int pl2303_open (struct usb_serial_port *port, struct file *filp);
128static void pl2303_close (struct usb_serial_port *port, struct file *filp);
129static void pl2303_set_termios (struct usb_serial_port *port,
130				struct termios *old);
131static int pl2303_ioctl (struct usb_serial_port *port, struct file *file,
132			 unsigned int cmd, unsigned long arg);
133static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs);
134static void pl2303_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
135static void pl2303_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
136static int pl2303_write (struct usb_serial_port *port,
137			 const unsigned char *buf, int count);
138static void pl2303_send (struct usb_serial_port *port);
139static int pl2303_write_room(struct usb_serial_port *port);
140static int pl2303_chars_in_buffer(struct usb_serial_port *port);
141static void pl2303_break_ctl(struct usb_serial_port *port,int break_state);
142static int pl2303_tiocmget (struct usb_serial_port *port, struct file *file);
143static int pl2303_tiocmset (struct usb_serial_port *port, struct file *file,
144			    unsigned int set, unsigned int clear);
145static int pl2303_startup (struct usb_serial *serial);
146static void pl2303_shutdown (struct usb_serial *serial);
147static struct pl2303_buf *pl2303_buf_alloc(unsigned int size);
148static void pl2303_buf_free(struct pl2303_buf *pb);
149static void pl2303_buf_clear(struct pl2303_buf *pb);
150static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb);
151static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb);
152static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
153	unsigned int count);
154static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
155	unsigned int count);
156
157
158/* All of the device info needed for the PL2303 SIO serial converter */
159static struct usb_serial_driver pl2303_device = {
160	.driver = {
161		.owner =	THIS_MODULE,
162		.name =		"pl2303",
163	},
164	.id_table =		id_table,
165	.num_interrupt_in =	NUM_DONT_CARE,
166	.num_bulk_in =		1,
167	.num_bulk_out =		1,
168	.num_ports =		1,
169	.open =			pl2303_open,
170	.close =		pl2303_close,
171	.write =		pl2303_write,
172	.ioctl =		pl2303_ioctl,
173	.break_ctl =		pl2303_break_ctl,
174	.set_termios =		pl2303_set_termios,
175	.tiocmget =		pl2303_tiocmget,
176	.tiocmset =		pl2303_tiocmset,
177	.read_bulk_callback =	pl2303_read_bulk_callback,
178	.read_int_callback =	pl2303_read_int_callback,
179	.write_bulk_callback =	pl2303_write_bulk_callback,
180	.write_room =		pl2303_write_room,
181	.chars_in_buffer =	pl2303_chars_in_buffer,
182	.attach =		pl2303_startup,
183	.shutdown =		pl2303_shutdown,
184};
185
186enum pl2303_type {
187	type_0,		/* don't know the difference between type 0 and */
188	type_1,		/* type 1, until someone from prolific tells us... */
189	HX,		/* HX version of the pl2303 chip */
190};
191
192struct pl2303_private {
193	spinlock_t lock;
194	struct pl2303_buf *buf;
195	int write_urb_in_use;
196	wait_queue_head_t delta_msr_wait;
197	u8 line_control;
198	u8 line_status;
199	u8 termios_initialized;
200	enum pl2303_type type;
201};
202
203
204static int pl2303_startup (struct usb_serial *serial)
205{
206	struct pl2303_private *priv;
207	enum pl2303_type type = type_0;
208	int i;
209
210	if (serial->dev->descriptor.bDeviceClass == 0x02)
211		type = type_0;
212	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
213		type = HX;
214	else if (serial->dev->descriptor.bDeviceClass == 0x00)
215		type = type_1;
216	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
217		type = type_1;
218	dbg("device type: %d", type);
219
220	for (i = 0; i < serial->num_ports; ++i) {
221		priv = kmalloc (sizeof (struct pl2303_private), GFP_KERNEL);
222		if (!priv)
223			goto cleanup;
224		memset (priv, 0x00, sizeof (struct pl2303_private));
225		spin_lock_init(&priv->lock);
226		priv->buf = pl2303_buf_alloc(PL2303_BUF_SIZE);
227		if (priv->buf == NULL) {
228			kfree(priv);
229			goto cleanup;
230		}
231		init_waitqueue_head(&priv->delta_msr_wait);
232		priv->type = type;
233		usb_set_serial_port_data(serial->port[i], priv);
234	}
235	return 0;
236
237cleanup:
238	for (--i; i>=0; --i) {
239		priv = usb_get_serial_port_data(serial->port[i]);
240		pl2303_buf_free(priv->buf);
241		kfree(priv);
242		usb_set_serial_port_data(serial->port[i], NULL);
243	}
244	return -ENOMEM;
245}
246
247static int set_control_lines (struct usb_device *dev, u8 value)
248{
249	int retval;
250
251	retval = usb_control_msg (dev, usb_sndctrlpipe (dev, 0),
252				  SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
253				  value, 0, NULL, 0, 100);
254	dbg("%s - value = %d, retval = %d", __FUNCTION__, value, retval);
255	return retval;
256}
257
258static int pl2303_write (struct usb_serial_port *port,  const unsigned char *buf, int count)
259{
260	struct pl2303_private *priv = usb_get_serial_port_data(port);
261	unsigned long flags;
262
263	dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
264
265	if (!count)
266		return count;
267
268	spin_lock_irqsave(&priv->lock, flags);
269	count = pl2303_buf_put(priv->buf, buf, count);
270	spin_unlock_irqrestore(&priv->lock, flags);
271
272	pl2303_send(port);
273
274	return count;
275}
276
277static void pl2303_send(struct usb_serial_port *port)
278{
279	int count, result;
280	struct pl2303_private *priv = usb_get_serial_port_data(port);
281	unsigned long flags;
282
283	dbg("%s - port %d", __FUNCTION__, port->number);
284
285	spin_lock_irqsave(&priv->lock, flags);
286
287	if (priv->write_urb_in_use) {
288		spin_unlock_irqrestore(&priv->lock, flags);
289		return;
290	}
291
292	count = pl2303_buf_get(priv->buf, port->write_urb->transfer_buffer,
293		port->bulk_out_size);
294
295	if (count == 0) {
296		spin_unlock_irqrestore(&priv->lock, flags);
297		return;
298	}
299
300	priv->write_urb_in_use = 1;
301
302	spin_unlock_irqrestore(&priv->lock, flags);
303
304	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer);
305
306	port->write_urb->transfer_buffer_length = count;
307	port->write_urb->dev = port->serial->dev;
308	result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
309	if (result) {
310		dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result);
311		priv->write_urb_in_use = 0;
312		// TODO: reschedule pl2303_send
313	}
314
315	schedule_work(&port->work);
316}
317
318static int pl2303_write_room(struct usb_serial_port *port)
319{
320	struct pl2303_private *priv = usb_get_serial_port_data(port);
321	int room = 0;
322	unsigned long flags;
323
324	dbg("%s - port %d", __FUNCTION__, port->number);
325
326	spin_lock_irqsave(&priv->lock, flags);
327	room = pl2303_buf_space_avail(priv->buf);
328	spin_unlock_irqrestore(&priv->lock, flags);
329
330	dbg("%s - returns %d", __FUNCTION__, room);
331	return room;
332}
333
334static int pl2303_chars_in_buffer(struct usb_serial_port *port)
335{
336	struct pl2303_private *priv = usb_get_serial_port_data(port);
337	int chars = 0;
338	unsigned long flags;
339
340	dbg("%s - port %d", __FUNCTION__, port->number);
341
342	spin_lock_irqsave(&priv->lock, flags);
343	chars = pl2303_buf_data_avail(priv->buf);
344	spin_unlock_irqrestore(&priv->lock, flags);
345
346	dbg("%s - returns %d", __FUNCTION__, chars);
347	return chars;
348}
349
350static void pl2303_set_termios (struct usb_serial_port *port, struct termios *old_termios)
351{
352	struct usb_serial *serial = port->serial;
353	struct pl2303_private *priv = usb_get_serial_port_data(port);
354	unsigned long flags;
355	unsigned int cflag;
356	unsigned char *buf;
357	int baud;
358	int i;
359	u8 control;
360
361	dbg("%s -  port %d", __FUNCTION__, port->number);
362
363	if ((!port->tty) || (!port->tty->termios)) {
364		dbg("%s - no tty structures", __FUNCTION__);
365		return;
366	}
367
368	spin_lock_irqsave(&priv->lock, flags);
369	if (!priv->termios_initialized) {
370		*(port->tty->termios) = tty_std_termios;
371		port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
372		priv->termios_initialized = 1;
373	}
374	spin_unlock_irqrestore(&priv->lock, flags);
375
376	cflag = port->tty->termios->c_cflag;
377	/* check that they really want us to change something */
378	if (old_termios) {
379		if ((cflag == old_termios->c_cflag) &&
380		    (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
381		    dbg("%s - nothing to change...", __FUNCTION__);
382		    return;
383		}
384	}
385
386	buf = kmalloc (7, GFP_KERNEL);
387	if (!buf) {
388		dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__);
389		return;
390	}
391	memset (buf, 0x00, 0x07);
392
393	i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
394			     GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
395			     0, 0, buf, 7, 100);
396	dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
397	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
398
399
400	if (cflag & CSIZE) {
401		switch (cflag & CSIZE) {
402			case CS5:	buf[6] = 5;	break;
403			case CS6:	buf[6] = 6;	break;
404			case CS7:	buf[6] = 7;	break;
405			default:
406			case CS8:	buf[6] = 8;	break;
407		}
408		dbg("%s - data bits = %d", __FUNCTION__, buf[6]);
409	}
410
411	baud = 0;
412	switch (cflag & CBAUD) {
413		case B0:	baud = 0;	break;
414		case B75:	baud = 75;	break;
415		case B150:	baud = 150;	break;
416		case B300:	baud = 300;	break;
417		case B600:	baud = 600;	break;
418		case B1200:	baud = 1200;	break;
419		case B1800:	baud = 1800;	break;
420		case B2400:	baud = 2400;	break;
421		case B4800:	baud = 4800;	break;
422		case B9600:	baud = 9600;	break;
423		case B19200:	baud = 19200;	break;
424		case B38400:	baud = 38400;	break;
425		case B57600:	baud = 57600;	break;
426		case B115200:	baud = 115200;	break;
427		case B230400:	baud = 230400;	break;
428		case B460800:	baud = 460800;	break;
429		default:
430			dev_err(&port->dev, "pl2303 driver does not support the baudrate requested (fix it)\n");
431			break;
432	}
433	dbg("%s - baud = %d", __FUNCTION__, baud);
434	if (baud) {
435		buf[0] = baud & 0xff;
436		buf[1] = (baud >> 8) & 0xff;
437		buf[2] = (baud >> 16) & 0xff;
438		buf[3] = (baud >> 24) & 0xff;
439	}
440
441	/* For reference buf[4]=0 is 1 stop bits */
442	/* For reference buf[4]=1 is 1.5 stop bits */
443	/* For reference buf[4]=2 is 2 stop bits */
444	if (cflag & CSTOPB) {
445		buf[4] = 2;
446		dbg("%s - stop bits = 2", __FUNCTION__);
447	} else {
448		buf[4] = 0;
449		dbg("%s - stop bits = 1", __FUNCTION__);
450	}
451
452	if (cflag & PARENB) {
453		/* For reference buf[5]=0 is none parity */
454		/* For reference buf[5]=1 is odd parity */
455		/* For reference buf[5]=2 is even parity */
456		/* For reference buf[5]=3 is mark parity */
457		/* For reference buf[5]=4 is space parity */
458		if (cflag & PARODD) {
459			buf[5] = 1;
460			dbg("%s - parity = odd", __FUNCTION__);
461		} else {
462			buf[5] = 2;
463			dbg("%s - parity = even", __FUNCTION__);
464		}
465	} else {
466		buf[5] = 0;
467		dbg("%s - parity = none", __FUNCTION__);
468	}
469
470	i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
471			     SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
472			     0, 0, buf, 7, 100);
473	dbg ("0x21:0x20:0:0  %d", i);
474
475	/* change control lines if we are switching to or from B0 */
476	spin_lock_irqsave(&priv->lock, flags);
477	control = priv->line_control;
478	if ((cflag & CBAUD) == B0)
479		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
480	else
481		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
482	if (control != priv->line_control) {
483		control = priv->line_control;
484		spin_unlock_irqrestore(&priv->lock, flags);
485		set_control_lines(serial->dev, control);
486	} else {
487		spin_unlock_irqrestore(&priv->lock, flags);
488	}
489
490	buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
491
492	i = usb_control_msg (serial->dev, usb_rcvctrlpipe (serial->dev, 0),
493			     GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
494			     0, 0, buf, 7, 100);
495	dbg ("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
496	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
497
498	if (cflag & CRTSCTS) {
499		__u16 index;
500		if (priv->type == HX)
501			index = 0x61;
502		else
503			index = 0x41;
504		i = usb_control_msg(serial->dev,
505				    usb_sndctrlpipe(serial->dev, 0),
506				    VENDOR_WRITE_REQUEST,
507				    VENDOR_WRITE_REQUEST_TYPE,
508				    0x0, index, NULL, 0, 100);
509		dbg ("0x40:0x1:0x0:0x%x  %d", index, i);
510	}
511
512	kfree (buf);
513}
514
515static int pl2303_open (struct usb_serial_port *port, struct file *filp)
516{
517	struct termios tmp_termios;
518	struct usb_serial *serial = port->serial;
519	struct pl2303_private *priv = usb_get_serial_port_data(port);
520	unsigned char *buf;
521	int result;
522
523	dbg("%s -  port %d", __FUNCTION__, port->number);
524
525	if (priv->type != HX) {
526		usb_clear_halt(serial->dev, port->write_urb->pipe);
527		usb_clear_halt(serial->dev, port->read_urb->pipe);
528	}
529
530	buf = kmalloc(10, GFP_KERNEL);
531	if (buf==NULL)
532		return -ENOMEM;
533
534#define FISH(a,b,c,d)								\
535	result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0),	\
536			       b, a, c, d, buf, 1, 100);			\
537	dbg("0x%x:0x%x:0x%x:0x%x  %d - %x",a,b,c,d,result,buf[0]);
538
539#define SOUP(a,b,c,d)								\
540	result=usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev,0),	\
541			       b, a, c, d, NULL, 0, 100);			\
542	dbg("0x%x:0x%x:0x%x:0x%x  %d",a,b,c,d,result);
543
544	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
545	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 0);
546	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
547	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
548	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
549	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1);
550	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0);
551	FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0);
552	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1);
553	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0);
554
555	if (priv->type == HX) {
556		/* HX chip */
557		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x44);
558		/* reset upstream data pipes */
559          	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 8, 0);
560        	SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 9, 0);
561	} else {
562		SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 0x24);
563	}
564
565	kfree(buf);
566
567	/* Setup termios */
568	if (port->tty) {
569		pl2303_set_termios (port, &tmp_termios);
570	}
571
572	//FIXME: need to assert RTS and DTR if CRTSCTS off
573
574	dbg("%s - submitting read urb", __FUNCTION__);
575	port->read_urb->dev = serial->dev;
576	result = usb_submit_urb (port->read_urb, GFP_KERNEL);
577	if (result) {
578		dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result);
579		pl2303_close (port, NULL);
580		return -EPROTO;
581	}
582
583	dbg("%s - submitting interrupt urb", __FUNCTION__);
584	port->interrupt_in_urb->dev = serial->dev;
585	result = usb_submit_urb (port->interrupt_in_urb, GFP_KERNEL);
586	if (result) {
587		dev_err(&port->dev, "%s - failed submitting interrupt urb, error %d\n", __FUNCTION__, result);
588		pl2303_close (port, NULL);
589		return -EPROTO;
590	}
591	return 0;
592}
593
594
595static void pl2303_close (struct usb_serial_port *port, struct file *filp)
596{
597	struct pl2303_private *priv = usb_get_serial_port_data(port);
598	unsigned long flags;
599	unsigned int c_cflag;
600	int bps;
601	long timeout;
602	wait_queue_t wait;						\
603
604	dbg("%s - port %d", __FUNCTION__, port->number);
605
606	/* wait for data to drain from the buffer */
607	spin_lock_irqsave(&priv->lock, flags);
608	timeout = PL2303_CLOSING_WAIT;
609	init_waitqueue_entry(&wait, current);
610	add_wait_queue(&port->tty->write_wait, &wait);
611	for (;;) {
612		set_current_state(TASK_INTERRUPTIBLE);
613		if (pl2303_buf_data_avail(priv->buf) == 0
614		|| timeout == 0 || signal_pending(current)
615		|| !usb_get_intfdata(port->serial->interface))	/* disconnect */
616			break;
617		spin_unlock_irqrestore(&priv->lock, flags);
618		timeout = schedule_timeout(timeout);
619		spin_lock_irqsave(&priv->lock, flags);
620	}
621	set_current_state(TASK_RUNNING);
622	remove_wait_queue(&port->tty->write_wait, &wait);
623	/* clear out any remaining data in the buffer */
624	pl2303_buf_clear(priv->buf);
625	spin_unlock_irqrestore(&priv->lock, flags);
626
627	/* wait for characters to drain from the device */
628	/* (this is long enough for the entire 256 byte */
629	/* pl2303 hardware buffer to drain with no flow */
630	/* control for data rates of 1200 bps or more, */
631	/* for lower rates we should really know how much */
632	/* data is in the buffer to compute a delay */
633	/* that is not unnecessarily long) */
634	bps = tty_get_baud_rate(port->tty);
635	if (bps > 1200)
636		timeout = max((HZ*2560)/bps,HZ/10);
637	else
638		timeout = 2*HZ;
639	schedule_timeout_interruptible(timeout);
640
641	/* shutdown our urbs */
642	dbg("%s - shutting down urbs", __FUNCTION__);
643	usb_kill_urb(port->write_urb);
644	usb_kill_urb(port->read_urb);
645	usb_kill_urb(port->interrupt_in_urb);
646
647	if (port->tty) {
648		c_cflag = port->tty->termios->c_cflag;
649		if (c_cflag & HUPCL) {
650			/* drop DTR and RTS */
651			spin_lock_irqsave(&priv->lock, flags);
652			priv->line_control = 0;
653			spin_unlock_irqrestore (&priv->lock, flags);
654			set_control_lines (port->serial->dev, 0);
655		}
656	}
657}
658
659static int pl2303_tiocmset (struct usb_serial_port *port, struct file *file,
660			    unsigned int set, unsigned int clear)
661{
662	struct pl2303_private *priv = usb_get_serial_port_data(port);
663	unsigned long flags;
664	u8 control;
665
666	if (!usb_get_intfdata(port->serial->interface))
667		return -ENODEV;
668
669	spin_lock_irqsave (&priv->lock, flags);
670	if (set & TIOCM_RTS)
671		priv->line_control |= CONTROL_RTS;
672	if (set & TIOCM_DTR)
673		priv->line_control |= CONTROL_DTR;
674	if (clear & TIOCM_RTS)
675		priv->line_control &= ~CONTROL_RTS;
676	if (clear & TIOCM_DTR)
677		priv->line_control &= ~CONTROL_DTR;
678	control = priv->line_control;
679	spin_unlock_irqrestore (&priv->lock, flags);
680
681	return set_control_lines (port->serial->dev, control);
682}
683
684static int pl2303_tiocmget (struct usb_serial_port *port, struct file *file)
685{
686	struct pl2303_private *priv = usb_get_serial_port_data(port);
687	unsigned long flags;
688	unsigned int mcr;
689	unsigned int status;
690	unsigned int result;
691
692	dbg("%s (%d)", __FUNCTION__, port->number);
693
694	if (!usb_get_intfdata(port->serial->interface))
695		return -ENODEV;
696
697	spin_lock_irqsave (&priv->lock, flags);
698	mcr = priv->line_control;
699	status = priv->line_status;
700	spin_unlock_irqrestore (&priv->lock, flags);
701
702	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
703		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
704		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
705		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
706		  | ((status & UART_RING)	? TIOCM_RI  : 0)
707		  | ((status & UART_DCD)	? TIOCM_CD  : 0);
708
709	dbg("%s - result = %x", __FUNCTION__, result);
710
711	return result;
712}
713
714static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
715{
716	struct pl2303_private *priv = usb_get_serial_port_data(port);
717	unsigned long flags;
718	unsigned int prevstatus;
719	unsigned int status;
720	unsigned int changed;
721
722	spin_lock_irqsave (&priv->lock, flags);
723	prevstatus = priv->line_status;
724	spin_unlock_irqrestore (&priv->lock, flags);
725
726	while (1) {
727		interruptible_sleep_on(&priv->delta_msr_wait);
728		/* see if a signal did it */
729		if (signal_pending(current))
730			return -ERESTARTSYS;
731
732		spin_lock_irqsave (&priv->lock, flags);
733		status = priv->line_status;
734		spin_unlock_irqrestore (&priv->lock, flags);
735
736		changed=prevstatus^status;
737
738		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
739		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
740		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
741		    ((arg & TIOCM_CTS) && (changed & UART_CTS)) ) {
742			return 0;
743		}
744		prevstatus = status;
745	}
746	/* NOTREACHED */
747	return 0;
748}
749
750static int pl2303_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg)
751{
752	dbg("%s (%d) cmd = 0x%04x", __FUNCTION__, port->number, cmd);
753
754	switch (cmd) {
755		case TIOCMIWAIT:
756			dbg("%s (%d) TIOCMIWAIT", __FUNCTION__,  port->number);
757			return wait_modem_info(port, arg);
758
759		default:
760			dbg("%s not supported = 0x%04x", __FUNCTION__, cmd);
761			break;
762	}
763
764	return -ENOIOCTLCMD;
765}
766
767static void pl2303_break_ctl (struct usb_serial_port *port, int break_state)
768{
769	struct usb_serial *serial = port->serial;
770	u16 state;
771	int result;
772
773	dbg("%s - port %d", __FUNCTION__, port->number);
774
775	if (break_state == 0)
776		state = BREAK_OFF;
777	else
778		state = BREAK_ON;
779	dbg("%s - turning break %s", __FUNCTION__, state==BREAK_OFF ? "off" : "on");
780
781	result = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0),
782				  BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
783				  0, NULL, 0, 100);
784	if (result)
785		dbg("%s - error sending break = %d", __FUNCTION__, result);
786}
787
788
789static void pl2303_shutdown (struct usb_serial *serial)
790{
791	int i;
792	struct pl2303_private *priv;
793
794	dbg("%s", __FUNCTION__);
795
796	for (i = 0; i < serial->num_ports; ++i) {
797		priv = usb_get_serial_port_data(serial->port[i]);
798		if (priv) {
799			pl2303_buf_free(priv->buf);
800			kfree(priv);
801			usb_set_serial_port_data(serial->port[i], NULL);
802		}
803	}
804}
805
806static void pl2303_update_line_status(struct usb_serial_port *port,
807				      unsigned char *data,
808				      unsigned int actual_length)
809{
810
811	struct pl2303_private *priv = usb_get_serial_port_data(port);
812	unsigned long flags;
813	u8 status_idx = UART_STATE;
814	u8 length = UART_STATE + 1;
815
816	if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
817	    (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65 ||
818	     le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_SX1 ||
819	     le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X75)) {
820		length = 1;
821		status_idx = 0;
822	}
823
824	if (actual_length < length)
825		goto exit;
826
827        /* Save off the uart status for others to look at */
828	spin_lock_irqsave(&priv->lock, flags);
829	priv->line_status = data[status_idx];
830	spin_unlock_irqrestore(&priv->lock, flags);
831
832exit:
833	return;
834}
835
836static void pl2303_read_int_callback (struct urb *urb, struct pt_regs *regs)
837{
838	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
839	unsigned char *data = urb->transfer_buffer;
840	unsigned int actual_length = urb->actual_length;
841	int status;
842
843	dbg("%s (%d)", __FUNCTION__, port->number);
844
845	switch (urb->status) {
846	case 0:
847		/* success */
848		break;
849	case -ECONNRESET:
850	case -ENOENT:
851	case -ESHUTDOWN:
852		/* this urb is terminated, clean up */
853		dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
854		return;
855	default:
856		dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
857		goto exit;
858	}
859
860	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, urb->transfer_buffer);
861	pl2303_update_line_status(port, data, actual_length);
862
863exit:
864	status = usb_submit_urb (urb, GFP_ATOMIC);
865	if (status)
866		dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n",
867			__FUNCTION__, status);
868}
869
870
871static void pl2303_read_bulk_callback (struct urb *urb, struct pt_regs *regs)
872{
873	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
874	struct pl2303_private *priv = usb_get_serial_port_data(port);
875	struct tty_struct *tty;
876	unsigned char *data = urb->transfer_buffer;
877	unsigned long flags;
878	int i;
879	int result;
880	u8 status;
881	char tty_flag;
882
883	dbg("%s - port %d", __FUNCTION__, port->number);
884
885	if (urb->status) {
886		dbg("%s - urb->status = %d", __FUNCTION__, urb->status);
887		if (!port->open_count) {
888			dbg("%s - port is closed, exiting.", __FUNCTION__);
889			return;
890		}
891		if (urb->status == -EPROTO) {
892			/* PL2303 mysteriously fails with -EPROTO reschedule the read */
893			dbg("%s - caught -EPROTO, resubmitting the urb", __FUNCTION__);
894			urb->status = 0;
895			urb->dev = port->serial->dev;
896			result = usb_submit_urb(urb, GFP_ATOMIC);
897			if (result)
898				dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
899			return;
900		}
901		dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
902		return;
903	}
904
905	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);
906
907	/* get tty_flag from status */
908	tty_flag = TTY_NORMAL;
909
910	spin_lock_irqsave(&priv->lock, flags);
911	status = priv->line_status;
912	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
913	spin_unlock_irqrestore(&priv->lock, flags);
914	wake_up_interruptible (&priv->delta_msr_wait);
915
916	/* break takes precedence over parity, */
917	/* which takes precedence over framing errors */
918	if (status & UART_BREAK_ERROR )
919		tty_flag = TTY_BREAK;
920	else if (status & UART_PARITY_ERROR)
921		tty_flag = TTY_PARITY;
922	else if (status & UART_FRAME_ERROR)
923		tty_flag = TTY_FRAME;
924	dbg("%s - tty_flag = %d", __FUNCTION__, tty_flag);
925
926	tty = port->tty;
927	if (tty && urb->actual_length) {
928		tty_buffer_request_room(tty, urb->actual_length + 1);
929		/* overrun is special, not associated with a char */
930		if (status & UART_OVERRUN_ERROR)
931			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
932		for (i = 0; i < urb->actual_length; ++i)
933			tty_insert_flip_char (tty, data[i], tty_flag);
934		tty_flip_buffer_push (tty);
935	}
936
937	/* Schedule the next read _if_ we are still open */
938	if (port->open_count) {
939		urb->dev = port->serial->dev;
940		result = usb_submit_urb(urb, GFP_ATOMIC);
941		if (result)
942			dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
943	}
944
945	return;
946}
947
948
949
950static void pl2303_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
951{
952	struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
953	struct pl2303_private *priv = usb_get_serial_port_data(port);
954	int result;
955
956	dbg("%s - port %d", __FUNCTION__, port->number);
957
958	switch (urb->status) {
959	case 0:
960		/* success */
961		break;
962	case -ECONNRESET:
963	case -ENOENT:
964	case -ESHUTDOWN:
965		/* this urb is terminated, clean up */
966		dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
967		priv->write_urb_in_use = 0;
968		return;
969	default:
970		/* error in the urb, so we have to resubmit it */
971		dbg("%s - Overflow in write", __FUNCTION__);
972		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
973		port->write_urb->transfer_buffer_length = 1;
974		port->write_urb->dev = port->serial->dev;
975		result = usb_submit_urb (port->write_urb, GFP_ATOMIC);
976		if (result)
977			dev_err(&urb->dev->dev, "%s - failed resubmitting write urb, error %d\n", __FUNCTION__, result);
978		else
979			return;
980	}
981
982	priv->write_urb_in_use = 0;
983
984	/* send any buffered data */
985	pl2303_send(port);
986}
987
988
989/*
990 * pl2303_buf_alloc
991 *
992 * Allocate a circular buffer and all associated memory.
993 */
994
995static struct pl2303_buf *pl2303_buf_alloc(unsigned int size)
996{
997
998	struct pl2303_buf *pb;
999
1000
1001	if (size == 0)
1002		return NULL;
1003
1004	pb = (struct pl2303_buf *)kmalloc(sizeof(struct pl2303_buf), GFP_KERNEL);
1005	if (pb == NULL)
1006		return NULL;
1007
1008	pb->buf_buf = kmalloc(size, GFP_KERNEL);
1009	if (pb->buf_buf == NULL) {
1010		kfree(pb);
1011		return NULL;
1012	}
1013
1014	pb->buf_size = size;
1015	pb->buf_get = pb->buf_put = pb->buf_buf;
1016
1017	return pb;
1018
1019}
1020
1021
1022/*
1023 * pl2303_buf_free
1024 *
1025 * Free the buffer and all associated memory.
1026 */
1027
1028static void pl2303_buf_free(struct pl2303_buf *pb)
1029{
1030	if (pb) {
1031		kfree(pb->buf_buf);
1032		kfree(pb);
1033	}
1034}
1035
1036
1037/*
1038 * pl2303_buf_clear
1039 *
1040 * Clear out all data in the circular buffer.
1041 */
1042
1043static void pl2303_buf_clear(struct pl2303_buf *pb)
1044{
1045	if (pb != NULL)
1046		pb->buf_get = pb->buf_put;
1047		/* equivalent to a get of all data available */
1048}
1049
1050
1051/*
1052 * pl2303_buf_data_avail
1053 *
1054 * Return the number of bytes of data available in the circular
1055 * buffer.
1056 */
1057
1058static unsigned int pl2303_buf_data_avail(struct pl2303_buf *pb)
1059{
1060	if (pb != NULL)
1061		return ((pb->buf_size + pb->buf_put - pb->buf_get) % pb->buf_size);
1062	else
1063		return 0;
1064}
1065
1066
1067/*
1068 * pl2303_buf_space_avail
1069 *
1070 * Return the number of bytes of space available in the circular
1071 * buffer.
1072 */
1073
1074static unsigned int pl2303_buf_space_avail(struct pl2303_buf *pb)
1075{
1076	if (pb != NULL)
1077		return ((pb->buf_size + pb->buf_get - pb->buf_put - 1) % pb->buf_size);
1078	else
1079		return 0;
1080}
1081
1082
1083/*
1084 * pl2303_buf_put
1085 *
1086 * Copy data data from a user buffer and put it into the circular buffer.
1087 * Restrict to the amount of space available.
1088 *
1089 * Return the number of bytes copied.
1090 */
1091
1092static unsigned int pl2303_buf_put(struct pl2303_buf *pb, const char *buf,
1093	unsigned int count)
1094{
1095
1096	unsigned int len;
1097
1098
1099	if (pb == NULL)
1100		return 0;
1101
1102	len  = pl2303_buf_space_avail(pb);
1103	if (count > len)
1104		count = len;
1105
1106	if (count == 0)
1107		return 0;
1108
1109	len = pb->buf_buf + pb->buf_size - pb->buf_put;
1110	if (count > len) {
1111		memcpy(pb->buf_put, buf, len);
1112		memcpy(pb->buf_buf, buf+len, count - len);
1113		pb->buf_put = pb->buf_buf + count - len;
1114	} else {
1115		memcpy(pb->buf_put, buf, count);
1116		if (count < len)
1117			pb->buf_put += count;
1118		else /* count == len */
1119			pb->buf_put = pb->buf_buf;
1120	}
1121
1122	return count;
1123
1124}
1125
1126
1127/*
1128 * pl2303_buf_get
1129 *
1130 * Get data from the circular buffer and copy to the given buffer.
1131 * Restrict to the amount of data available.
1132 *
1133 * Return the number of bytes copied.
1134 */
1135
1136static unsigned int pl2303_buf_get(struct pl2303_buf *pb, char *buf,
1137	unsigned int count)
1138{
1139
1140	unsigned int len;
1141
1142
1143	if (pb == NULL)
1144		return 0;
1145
1146	len = pl2303_buf_data_avail(pb);
1147	if (count > len)
1148		count = len;
1149
1150	if (count == 0)
1151		return 0;
1152
1153	len = pb->buf_buf + pb->buf_size - pb->buf_get;
1154	if (count > len) {
1155		memcpy(buf, pb->buf_get, len);
1156		memcpy(buf+len, pb->buf_buf, count - len);
1157		pb->buf_get = pb->buf_buf + count - len;
1158	} else {
1159		memcpy(buf, pb->buf_get, count);
1160		if (count < len)
1161			pb->buf_get += count;
1162		else /* count == len */
1163			pb->buf_get = pb->buf_buf;
1164	}
1165
1166	return count;
1167
1168}
1169
1170static int __init pl2303_init (void)
1171{
1172	int retval;
1173	retval = usb_serial_register(&pl2303_device);
1174	if (retval)
1175		goto failed_usb_serial_register;
1176	retval = usb_register(&pl2303_driver);
1177	if (retval)
1178		goto failed_usb_register;
1179	info(DRIVER_DESC);
1180	return 0;
1181failed_usb_register:
1182	usb_serial_deregister(&pl2303_device);
1183failed_usb_serial_register:
1184	return retval;
1185}
1186
1187
1188static void __exit pl2303_exit (void)
1189{
1190	usb_deregister (&pl2303_driver);
1191	usb_serial_deregister (&pl2303_device);
1192}
1193
1194
1195module_init(pl2303_init);
1196module_exit(pl2303_exit);
1197
1198MODULE_DESCRIPTION(DRIVER_DESC);
1199MODULE_LICENSE("GPL");
1200
1201module_param(debug, bool, S_IRUGO | S_IWUSR);
1202MODULE_PARM_DESC(debug, "Debug enabled or not");
1203
1204