Linux Audio

Check our new training course

Loading...
v3.1
 
  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	{ USB_DEVICE(WINCHIPHEAD_VENDOR_ID, WINCHIPHEAD_USBSER_PRODUCT_ID) },
 
 95	{ }					/* Terminating entry */
 96};
 97
 98MODULE_DEVICE_TABLE(usb, id_table);
 99
100static struct usb_driver pl2303_driver = {
101	.name =		"pl2303",
102	.probe =	usb_serial_probe,
103	.disconnect =	usb_serial_disconnect,
104	.id_table =	id_table,
105	.suspend =      usb_serial_suspend,
106	.resume =       usb_serial_resume,
107	.no_dynamic_id = 	1,
108	.supports_autosuspend =	1,
109};
110
111#define SET_LINE_REQUEST_TYPE		0x21
112#define SET_LINE_REQUEST		0x20
113
114#define SET_CONTROL_REQUEST_TYPE	0x21
115#define SET_CONTROL_REQUEST		0x22
116#define CONTROL_DTR			0x01
117#define CONTROL_RTS			0x02
118
119#define BREAK_REQUEST_TYPE		0x21
120#define BREAK_REQUEST			0x23
121#define BREAK_ON			0xffff
122#define BREAK_OFF			0x0000
123
124#define GET_LINE_REQUEST_TYPE		0xa1
125#define GET_LINE_REQUEST		0x21
126
127#define VENDOR_WRITE_REQUEST_TYPE	0x40
128#define VENDOR_WRITE_REQUEST		0x01
 
129
130#define VENDOR_READ_REQUEST_TYPE	0xc0
131#define VENDOR_READ_REQUEST		0x01
 
132
133#define UART_STATE			0x08
 
134#define UART_STATE_TRANSIENT_MASK	0x74
135#define UART_DCD			0x01
136#define UART_DSR			0x02
137#define UART_BREAK_ERROR		0x04
138#define UART_RING			0x08
139#define UART_FRAME_ERROR		0x10
140#define UART_PARITY_ERROR		0x20
141#define UART_OVERRUN_ERROR		0x40
142#define UART_CTS			0x80
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
145enum pl2303_type {
146	type_0,		/* don't know the difference between type 0 and */
147	type_1,		/* type 1, until someone from prolific tells us... */
148	HX,		/* HX version of the pl2303 chip */
 
 
 
 
 
 
 
 
 
 
 
 
149};
150
151struct pl2303_private {
152	spinlock_t lock;
153	wait_queue_head_t delta_msr_wait;
154	u8 line_control;
155	u8 line_status;
156	enum pl2303_type type;
 
157};
158
159static int pl2303_vendor_read(__u16 value, __u16 index,
160		struct usb_serial *serial, unsigned char *buf)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161{
162	int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
163			VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
164			value, index, buf, 1, 100);
165	dbg("0x%x:0x%x:0x%x:0x%x  %d - %x", VENDOR_READ_REQUEST_TYPE,
166			VENDOR_READ_REQUEST, value, index, res, buf[0]);
167	return res;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168}
169
170static int pl2303_vendor_write(__u16 value, __u16 index,
171		struct usb_serial *serial)
172{
173	int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
174			VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
 
 
 
 
 
 
 
 
 
 
 
 
175			value, index, NULL, 0, 100);
176	dbg("0x%x:0x%x:0x%x:0x%x  %d", VENDOR_WRITE_REQUEST_TYPE,
177			VENDOR_WRITE_REQUEST, value, index, res);
178	return res;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179}
180
181static int pl2303_startup(struct usb_serial *serial)
182{
183	struct pl2303_private *priv;
184	enum pl2303_type type = type_0;
185	unsigned char *buf;
186	int i;
187
188	buf = kmalloc(10, GFP_KERNEL);
189	if (buf == NULL)
190		return -ENOMEM;
191
 
 
 
 
 
 
192	if (serial->dev->descriptor.bDeviceClass == 0x02)
193		type = type_0;
194	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
195		type = HX;
196	else if (serial->dev->descriptor.bDeviceClass == 0x00)
197		type = type_1;
198	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
199		type = type_1;
200	dbg("device type: %d", type);
201
202	for (i = 0; i < serial->num_ports; ++i) {
203		priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
204		if (!priv)
205			goto cleanup;
206		spin_lock_init(&priv->lock);
207		init_waitqueue_head(&priv->delta_msr_wait);
208		priv->type = type;
209		usb_set_serial_port_data(serial->port[i], priv);
210	}
211
212	pl2303_vendor_read(0x8484, 0, serial, buf);
213	pl2303_vendor_write(0x0404, 0, serial);
214	pl2303_vendor_read(0x8484, 0, serial, buf);
215	pl2303_vendor_read(0x8383, 0, serial, buf);
216	pl2303_vendor_read(0x8484, 0, serial, buf);
217	pl2303_vendor_write(0x0404, 1, serial);
218	pl2303_vendor_read(0x8484, 0, serial, buf);
219	pl2303_vendor_read(0x8383, 0, serial, buf);
220	pl2303_vendor_write(0, 1, serial);
221	pl2303_vendor_write(1, 0, serial);
222	if (type == HX)
223		pl2303_vendor_write(2, 0x44, serial);
224	else
225		pl2303_vendor_write(2, 0x24, serial);
 
 
 
 
 
 
 
226
227	kfree(buf);
 
228	return 0;
 
229
230cleanup:
231	kfree(buf);
232	for (--i; i >= 0; --i) {
233		priv = usb_get_serial_port_data(serial->port[i]);
234		kfree(priv);
235		usb_set_serial_port_data(serial->port[i], NULL);
236	}
237	return -ENOMEM;
238}
239
240static int set_control_lines(struct usb_device *dev, u8 value)
241{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242	int retval;
243
 
 
244	retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
245				 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
246				 value, 0, NULL, 0, 100);
247	dbg("%s - value = %d, retval = %d", __func__, value, retval);
 
 
248	return retval;
249}
250
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251static void pl2303_set_termios(struct tty_struct *tty,
252		struct usb_serial_port *port, struct ktermios *old_termios)
253{
254	struct usb_serial *serial = port->serial;
 
255	struct pl2303_private *priv = usb_get_serial_port_data(port);
256	unsigned long flags;
257	unsigned int cflag;
258	unsigned char *buf;
259	int baud;
260	int i;
261	u8 control;
262	const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
263	                         4800, 7200, 9600, 14400, 19200, 28800, 38400,
264	                         57600, 115200, 230400, 460800, 614400,
265	                         921600, 1228800, 2457600, 3000000, 6000000 };
266	int baud_floor, baud_ceil;
267	int k;
268
269	dbg("%s -  port %d", __func__, port->number);
270
271	/* The PL2303 is reported to lose bytes if you change
272	   serial settings even to the same values as before. Thus
273	   we actually need to filter in this specific case */
274
275	if (!tty_termios_hw_change(tty->termios, old_termios))
276		return;
277
278	cflag = tty->termios->c_cflag;
279
280	buf = kzalloc(7, GFP_KERNEL);
281	if (!buf) {
282		dev_err(&port->dev, "%s - out of memory.\n", __func__);
283		/* Report back no change occurred */
284		*tty->termios = *old_termios;
 
285		return;
286	}
287
288	i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
289			    GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
290			    0, 0, buf, 7, 100);
291	dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
292	    buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
293
294	if (cflag & CSIZE) {
295		switch (cflag & CSIZE) {
296		case CS5:
297			buf[6] = 5;
298			break;
299		case CS6:
300			buf[6] = 6;
301			break;
302		case CS7:
303			buf[6] = 7;
304			break;
305		default:
306		case CS8:
307			buf[6] = 8;
308			break;
309		}
310		dbg("%s - data bits = %d", __func__, buf[6]);
311	}
 
312
313	/* For reference buf[0]:buf[3] baud rate value */
314	/* NOTE: Only the values defined in baud_sup are supported !
315	 *       => if unsupported values are set, the PL2303 seems to use
316	 *          9600 baud (at least my PL2303X always does)
317	 */
318	baud = tty_get_baud_rate(tty);
319	dbg("%s - baud requested = %d", __func__, baud);
320	if (baud) {
321		/* Set baudrate to nearest supported value */
322		for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
323			if (baud_sup[k] / baud) {
324				baud_ceil = baud_sup[k];
325				if (k==0) {
326					baud = baud_ceil;
327				} else {
328					baud_floor = baud_sup[k-1];
329					if ((baud_ceil % baud)
330					    > (baud % baud_floor))
331						baud = baud_floor;
332					else
333						baud = baud_ceil;
334				}
335				break;
336			}
337		}
338		if (baud > 1228800) {
339			/* type_0, type_1 only support up to 1228800 baud */
340			if (priv->type != HX)
341				baud = 1228800;
342			else if (baud > 6000000)
343				baud = 6000000;
344		}
345		dbg("%s - baud set = %d", __func__, baud);
346		if (baud <= 115200) {
347			buf[0] = baud & 0xff;
348			buf[1] = (baud >> 8) & 0xff;
349			buf[2] = (baud >> 16) & 0xff;
350			buf[3] = (baud >> 24) & 0xff;
351		} else {
352			/* apparently the formula for higher speeds is:
353			 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
354			 */
355			unsigned tmp = 12*1000*1000*32 / baud;
356			buf[3] = 0x80;
357			buf[2] = 0;
358			buf[1] = (tmp >= 256);
359			while (tmp >= 256) {
360				tmp >>= 2;
361				buf[1] <<= 1;
362			}
363			if (tmp > 256) {
364				tmp %= 256;
365			}
366			buf[0] = tmp;
367		}
368	}
369
370	/* For reference buf[4]=0 is 1 stop bits */
371	/* For reference buf[4]=1 is 1.5 stop bits */
372	/* For reference buf[4]=2 is 2 stop bits */
373	if (cflag & CSTOPB) {
374		/* NOTE: Comply with "real" UARTs / RS232:
 
375		 *       use 1.5 instead of 2 stop bits with 5 data bits
376		 */
377		if ((cflag & CSIZE) == CS5) {
378			buf[4] = 1;
379			dbg("%s - stop bits = 1.5", __func__);
380		} else {
381			buf[4] = 2;
382			dbg("%s - stop bits = 2", __func__);
383		}
384	} else {
385		buf[4] = 0;
386		dbg("%s - stop bits = 1", __func__);
387	}
388
389	if (cflag & PARENB) {
390		/* For reference buf[5]=0 is none parity */
391		/* For reference buf[5]=1 is odd parity */
392		/* For reference buf[5]=2 is even parity */
393		/* For reference buf[5]=3 is mark parity */
394		/* For reference buf[5]=4 is space parity */
395		if (cflag & PARODD) {
396			if (cflag & CMSPAR) {
397				buf[5] = 3;
398				dbg("%s - parity = mark", __func__);
399			} else {
400				buf[5] = 1;
401				dbg("%s - parity = odd", __func__);
402			}
403		} else {
404			if (cflag & CMSPAR) {
405				buf[5] = 4;
406				dbg("%s - parity = space", __func__);
407			} else {
408				buf[5] = 2;
409				dbg("%s - parity = even", __func__);
410			}
411		}
412	} else {
413		buf[5] = 0;
414		dbg("%s - parity = none", __func__);
415	}
416
417	i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
418			    SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
419			    0, 0, buf, 7, 100);
420	dbg("0x21:0x20:0:0  %d", i);
 
 
 
 
 
 
 
 
 
 
 
 
 
421
422	/* change control lines if we are switching to or from B0 */
423	spin_lock_irqsave(&priv->lock, flags);
424	control = priv->line_control;
425	if ((cflag & CBAUD) == B0)
426		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
427	else
428		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
429	if (control != priv->line_control) {
430		control = priv->line_control;
431		spin_unlock_irqrestore(&priv->lock, flags);
432		set_control_lines(serial->dev, control);
433	} else {
434		spin_unlock_irqrestore(&priv->lock, flags);
435	}
436
437	buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
438
439	i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
440			    GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
441			    0, 0, buf, 7, 100);
442	dbg("0xa1:0x21:0:0  %d - %x %x %x %x %x %x %x", i,
443	     buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
444
445	if (cflag & CRTSCTS) {
446		if (priv->type == HX)
447			pl2303_vendor_write(0x0, 0x61, serial);
448		else
449			pl2303_vendor_write(0x0, 0x41, serial);
 
 
 
 
 
450	} else {
451		pl2303_vendor_write(0x0, 0x0, serial);
 
 
 
 
 
 
452	}
453
454	/* Save resulting baud rate */
455	if (baud)
456		tty_encode_baud_rate(tty, baud, baud);
457
458	kfree(buf);
459}
460
461static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
462{
463	struct pl2303_private *priv = usb_get_serial_port_data(port);
464	unsigned long flags;
465	u8 control;
466
467	spin_lock_irqsave(&priv->lock, flags);
468	/* Change DTR and RTS */
469	if (on)
470		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
471	else
472		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
473	control = priv->line_control;
474	spin_unlock_irqrestore(&priv->lock, flags);
475	set_control_lines(port->serial->dev, control);
 
476}
477
478static void pl2303_close(struct usb_serial_port *port)
479{
480	dbg("%s - port %d", __func__, port->number);
481
482	usb_serial_generic_close(port);
483	usb_kill_urb(port->interrupt_in_urb);
 
484}
485
486static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
487{
488	struct ktermios tmp_termios;
489	struct usb_serial *serial = port->serial;
490	struct pl2303_private *priv = usb_get_serial_port_data(port);
491	int result;
492
493	dbg("%s -  port %d", __func__, port->number);
494
495	if (priv->type != HX) {
496		usb_clear_halt(serial->dev, port->write_urb->pipe);
497		usb_clear_halt(serial->dev, port->read_urb->pipe);
498	} else {
499		/* reset upstream data pipes */
500		pl2303_vendor_write(8, 0, serial);
501		pl2303_vendor_write(9, 0, serial);
 
 
 
 
 
 
502	}
503
504	/* Setup termios */
505	if (tty)
506		pl2303_set_termios(tty, port, &tmp_termios);
507
508	dbg("%s - submitting read urb", __func__);
509	result = usb_serial_generic_submit_read_urb(port, GFP_KERNEL);
510	if (result) {
511		pl2303_close(port);
512		return -EPROTO;
 
513	}
514
515	dbg("%s - submitting interrupt urb", __func__);
516	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
517	if (result) {
518		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
519			" error %d\n", __func__, result);
520		pl2303_close(port);
521		return -EPROTO;
522	}
523	port->port.drain_delay = 256;
524	return 0;
525}
526
527static int pl2303_tiocmset(struct tty_struct *tty,
528			   unsigned int set, unsigned int clear)
529{
530	struct usb_serial_port *port = tty->driver_data;
531	struct pl2303_private *priv = usb_get_serial_port_data(port);
532	unsigned long flags;
533	u8 control;
534
535	if (!usb_get_intfdata(port->serial->interface))
536		return -ENODEV;
537
538	spin_lock_irqsave(&priv->lock, flags);
539	if (set & TIOCM_RTS)
540		priv->line_control |= CONTROL_RTS;
541	if (set & TIOCM_DTR)
542		priv->line_control |= CONTROL_DTR;
543	if (clear & TIOCM_RTS)
544		priv->line_control &= ~CONTROL_RTS;
545	if (clear & TIOCM_DTR)
546		priv->line_control &= ~CONTROL_DTR;
547	control = priv->line_control;
548	spin_unlock_irqrestore(&priv->lock, flags);
549
550	return set_control_lines(port->serial->dev, control);
 
 
 
 
551}
552
553static int pl2303_tiocmget(struct tty_struct *tty)
554{
555	struct usb_serial_port *port = tty->driver_data;
556	struct pl2303_private *priv = usb_get_serial_port_data(port);
557	unsigned long flags;
558	unsigned int mcr;
559	unsigned int status;
560	unsigned int result;
561
562	dbg("%s (%d)", __func__, port->number);
563
564	if (!usb_get_intfdata(port->serial->interface))
565		return -ENODEV;
566
567	spin_lock_irqsave(&priv->lock, flags);
568	mcr = priv->line_control;
569	status = priv->line_status;
570	spin_unlock_irqrestore(&priv->lock, flags);
571
572	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
573		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
574		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
575		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
576		  | ((status & UART_RING)	? TIOCM_RI  : 0)
577		  | ((status & UART_DCD)	? TIOCM_CD  : 0);
578
579	dbg("%s - result = %x", __func__, result);
580
581	return result;
582}
583
584static int pl2303_carrier_raised(struct usb_serial_port *port)
585{
586	struct pl2303_private *priv = usb_get_serial_port_data(port);
 
587	if (priv->line_status & UART_DCD)
588		return 1;
589	return 0;
590}
591
592static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
593{
594	struct pl2303_private *priv = usb_get_serial_port_data(port);
595	unsigned long flags;
596	unsigned int prevstatus;
597	unsigned int status;
598	unsigned int changed;
599
600	spin_lock_irqsave(&priv->lock, flags);
601	prevstatus = priv->line_status;
602	spin_unlock_irqrestore(&priv->lock, flags);
603
604	while (1) {
605		interruptible_sleep_on(&priv->delta_msr_wait);
606		/* see if a signal did it */
607		if (signal_pending(current))
608			return -ERESTARTSYS;
609
610		spin_lock_irqsave(&priv->lock, flags);
611		status = priv->line_status;
612		spin_unlock_irqrestore(&priv->lock, flags);
613
614		changed = prevstatus ^ status;
615
616		if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
617		    ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
618		    ((arg & TIOCM_CD)  && (changed & UART_DCD)) ||
619		    ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
620			return 0;
621		}
622		prevstatus = status;
623	}
624	/* NOTREACHED */
625	return 0;
626}
627
628static int pl2303_ioctl(struct tty_struct *tty,
629			unsigned int cmd, unsigned long arg)
630{
631	struct serial_struct ser;
632	struct usb_serial_port *port = tty->driver_data;
633	dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
634
635	switch (cmd) {
636	case TIOCGSERIAL:
637		memset(&ser, 0, sizeof ser);
638		ser.type = PORT_16654;
639		ser.line = port->serial->minor;
640		ser.port = port->number;
641		ser.baud_base = 460800;
642
643		if (copy_to_user((void __user *)arg, &ser, sizeof ser))
644			return -EFAULT;
645
646		return 0;
647
648	case TIOCMIWAIT:
649		dbg("%s (%d) TIOCMIWAIT", __func__,  port->number);
650		return wait_modem_info(port, arg);
651	default:
652		dbg("%s not supported = 0x%04x", __func__, cmd);
653		break;
654	}
655	return -ENOIOCTLCMD;
656}
657
658static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
659{
660	struct usb_serial_port *port = tty->driver_data;
661	struct usb_serial *serial = port->serial;
662	u16 state;
663	int result;
664
665	dbg("%s - port %d", __func__, port->number);
666
667	if (break_state == 0)
668		state = BREAK_OFF;
669	else
670		state = BREAK_ON;
671	dbg("%s - turning break %s", __func__,
 
 
 
672			state == BREAK_OFF ? "off" : "on");
673
674	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
675				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
676				 0, NULL, 0, 100);
677	if (result)
678		dbg("%s - error sending break = %d", __func__, result);
679}
680
681static void pl2303_release(struct usb_serial *serial)
682{
683	int i;
684	struct pl2303_private *priv;
685
686	dbg("%s", __func__);
687
688	for (i = 0; i < serial->num_ports; ++i) {
689		priv = usb_get_serial_port_data(serial->port[i]);
690		kfree(priv);
691	}
692}
693
694static void pl2303_update_line_status(struct usb_serial_port *port,
695				      unsigned char *data,
696				      unsigned int actual_length)
697{
698
 
699	struct pl2303_private *priv = usb_get_serial_port_data(port);
700	struct tty_struct *tty;
701	unsigned long flags;
702	u8 status_idx = UART_STATE;
703	u8 length = UART_STATE + 1;
704	u8 prev_line_status;
705	u16 idv, idp;
706
707	idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
708	idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
709
710
711	if (idv == SIEMENS_VENDOR_ID) {
712		if (idp == SIEMENS_PRODUCT_ID_X65 ||
713		    idp == SIEMENS_PRODUCT_ID_SX1 ||
714		    idp == SIEMENS_PRODUCT_ID_X75) {
715
716			length = 1;
717			status_idx = 0;
718		}
719	}
720
721	if (actual_length < length)
722		return;
723
 
 
724	/* Save off the uart status for others to look at */
725	spin_lock_irqsave(&priv->lock, flags);
726	prev_line_status = priv->line_status;
727	priv->line_status = data[status_idx];
728	spin_unlock_irqrestore(&priv->lock, flags);
729	if (priv->line_status & UART_BREAK_ERROR)
 
730		usb_serial_handle_break(port);
731	wake_up_interruptible(&priv->delta_msr_wait);
732
733	tty = tty_port_tty_get(&port->port);
734	if (!tty)
735		return;
736	if ((priv->line_status ^ prev_line_status) & UART_DCD)
737		usb_serial_handle_dcd_change(port, tty,
738				priv->line_status & UART_DCD);
739	tty_kref_put(tty);
 
 
 
 
 
 
 
 
 
 
 
 
740}
741
742static void pl2303_read_int_callback(struct urb *urb)
743{
744	struct usb_serial_port *port =  urb->context;
745	unsigned char *data = urb->transfer_buffer;
746	unsigned int actual_length = urb->actual_length;
747	int status = urb->status;
748	int retval;
749
750	dbg("%s (%d)", __func__, port->number);
751
752	switch (status) {
753	case 0:
754		/* success */
755		break;
756	case -ECONNRESET:
757	case -ENOENT:
758	case -ESHUTDOWN:
759		/* this urb is terminated, clean up */
760		dbg("%s - urb shutting down with status: %d", __func__,
761		    status);
762		return;
763	default:
764		dbg("%s - nonzero urb status received: %d", __func__,
765		    status);
766		goto exit;
767	}
768
769	usb_serial_debug_data(debug, &port->dev, __func__,
770			      urb->actual_length, urb->transfer_buffer);
771
772	pl2303_update_line_status(port, data, actual_length);
773
774exit:
775	retval = usb_submit_urb(urb, GFP_ATOMIC);
776	if (retval)
777		dev_err(&urb->dev->dev,
778			"%s - usb_submit_urb failed with result %d\n",
779			__func__, retval);
 
780}
781
782static void pl2303_process_read_urb(struct urb *urb)
783{
784	struct usb_serial_port *port = urb->context;
785	struct pl2303_private *priv = usb_get_serial_port_data(port);
786	struct tty_struct *tty;
787	unsigned char *data = urb->transfer_buffer;
788	char tty_flag = TTY_NORMAL;
789	unsigned long flags;
790	u8 line_status;
791	int i;
792
793	/* update line status */
794	spin_lock_irqsave(&priv->lock, flags);
795	line_status = priv->line_status;
796	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
797	spin_unlock_irqrestore(&priv->lock, flags);
798	wake_up_interruptible(&priv->delta_msr_wait);
799
800	if (!urb->actual_length)
801		return;
802
803	tty = tty_port_tty_get(&port->port);
804	if (!tty)
805		return;
806
807	/* break takes precedence over parity, */
808	/* which takes precedence over framing errors */
809	if (line_status & UART_BREAK_ERROR)
810		tty_flag = TTY_BREAK;
811	else if (line_status & UART_PARITY_ERROR)
812		tty_flag = TTY_PARITY;
813	else if (line_status & UART_FRAME_ERROR)
814		tty_flag = TTY_FRAME;
815	dbg("%s - tty_flag = %d", __func__, tty_flag);
816
 
 
 
817	/* overrun is special, not associated with a char */
818	if (line_status & UART_OVERRUN_ERROR)
819		tty_insert_flip_char(tty, 0, TTY_OVERRUN);
820
821	if (port->port.console && port->sysrq) {
822		for (i = 0; i < urb->actual_length; ++i)
823			if (!usb_serial_handle_sysrq_char(port, data[i]))
824				tty_insert_flip_char(tty, data[i], tty_flag);
 
825	} else {
826		tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
827							urb->actual_length);
828	}
829
830	tty_flip_buffer_push(tty);
831	tty_kref_put(tty);
832}
833
834/* All of the device info needed for the PL2303 SIO serial converter */
835static struct usb_serial_driver pl2303_device = {
836	.driver = {
837		.owner =	THIS_MODULE,
838		.name =		"pl2303",
839	},
840	.id_table =		id_table,
841	.usb_driver = 		&pl2303_driver,
842	.num_ports =		1,
 
843	.bulk_in_size =		256,
844	.bulk_out_size =	256,
845	.open =			pl2303_open,
846	.close =		pl2303_close,
847	.dtr_rts = 		pl2303_dtr_rts,
848	.carrier_raised =	pl2303_carrier_raised,
849	.ioctl =		pl2303_ioctl,
850	.break_ctl =		pl2303_break_ctl,
851	.set_termios =		pl2303_set_termios,
852	.tiocmget =		pl2303_tiocmget,
853	.tiocmset =		pl2303_tiocmset,
 
854	.process_read_urb =	pl2303_process_read_urb,
855	.read_int_callback =	pl2303_read_int_callback,
 
 
856	.attach =		pl2303_startup,
857	.release =		pl2303_release,
 
 
858};
859
860static int __init pl2303_init(void)
861{
862	int retval;
863
864	retval = usb_serial_register(&pl2303_device);
865	if (retval)
866		goto failed_usb_serial_register;
867	retval = usb_register(&pl2303_driver);
868	if (retval)
869		goto failed_usb_register;
870	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
871	return 0;
872failed_usb_register:
873	usb_serial_deregister(&pl2303_device);
874failed_usb_serial_register:
875	return retval;
876}
877
878static void __exit pl2303_exit(void)
879{
880	usb_deregister(&pl2303_driver);
881	usb_serial_deregister(&pl2303_device);
882}
883
884module_init(pl2303_init);
885module_exit(pl2303_exit);
886
887MODULE_DESCRIPTION(DRIVER_DESC);
888MODULE_LICENSE("GPL");
889
890module_param(debug, bool, S_IRUGO | S_IWUSR);
891MODULE_PARM_DESC(debug, "Debug enabled or not");
892
v5.9
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Prolific PL2303 USB to serial adaptor driver
   4 *
   5 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
   6 * Copyright (C) 2003 IBM Corp.
   7 *
   8 * Original driver for 2.2.x by anonymous
   9 *
  10 * See Documentation/usb/usb-serial.rst for more information on using this
 
 
 
 
  11 * driver
 
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/errno.h>
 
  16#include <linux/slab.h>
  17#include <linux/tty.h>
  18#include <linux/tty_driver.h>
  19#include <linux/tty_flip.h>
  20#include <linux/serial.h>
  21#include <linux/module.h>
  22#include <linux/moduleparam.h>
  23#include <linux/spinlock.h>
  24#include <linux/uaccess.h>
  25#include <linux/usb.h>
  26#include <linux/usb/serial.h>
  27#include <asm/unaligned.h>
  28#include "pl2303.h"
  29
 
 
 
 
 
 
  30
  31#define PL2303_QUIRK_UART_STATE_IDX0		BIT(0)
  32#define PL2303_QUIRK_LEGACY			BIT(1)
  33#define PL2303_QUIRK_ENDPOINT_HACK		BIT(2)
  34
  35static const struct usb_device_id id_table[] = {
  36	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID),
  37		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  38	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
  39	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
  40	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
  41	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_CHILITAG) },
  42	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
  43	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
  44	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
  45	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
  46	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
  47	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
  48	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
  49	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_TB) },
  50	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GC) },
  51	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GB) },
  52	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GT) },
  53	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GL) },
  54	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GE) },
  55	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GS) },
  56	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
  57	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
  58	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID),
  59		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  60	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC485),
  61		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  62	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC232B),
  63		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  64	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) },
  65	{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
  66	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
  67	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
  68	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
  69	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
  70	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
  71	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
  72	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
  73	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
  74	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
  75	{ USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
  76	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
  77	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1),
  78		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
  79	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65),
  80		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
  81	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75),
  82		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
  83	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81),
  84		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  85	{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
  86	{ USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
  87	{ USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
  88	{ USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
  89	{ USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
  90	{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
  91	{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
  92	{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
  93	{ USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
  94	{ USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID),
  95		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
  96	{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
  97	{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
  98	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
  99	{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
 100	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
 101	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
 102	{ USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) },
 103	{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
 104	{ USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
 105	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
 106	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
 107	{ USB_DEVICE(HP_VENDOR_ID, HP_LM920_PRODUCT_ID) },
 108	{ USB_DEVICE(HP_VENDOR_ID, HP_LM940_PRODUCT_ID) },
 109	{ USB_DEVICE(HP_VENDOR_ID, HP_TD620_PRODUCT_ID) },
 110	{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
 111	{ USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
 112	{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
 113	{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
 114	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
 115	{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
 116	{ USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
 117	{ }					/* Terminating entry */
 118};
 119
 120MODULE_DEVICE_TABLE(usb, id_table);
 121
 
 
 
 
 
 
 
 
 
 
 
 122#define SET_LINE_REQUEST_TYPE		0x21
 123#define SET_LINE_REQUEST		0x20
 124
 125#define SET_CONTROL_REQUEST_TYPE	0x21
 126#define SET_CONTROL_REQUEST		0x22
 127#define CONTROL_DTR			0x01
 128#define CONTROL_RTS			0x02
 129
 130#define BREAK_REQUEST_TYPE		0x21
 131#define BREAK_REQUEST			0x23
 132#define BREAK_ON			0xffff
 133#define BREAK_OFF			0x0000
 134
 135#define GET_LINE_REQUEST_TYPE		0xa1
 136#define GET_LINE_REQUEST		0x21
 137
 138#define VENDOR_WRITE_REQUEST_TYPE	0x40
 139#define VENDOR_WRITE_REQUEST		0x01
 140#define VENDOR_WRITE_NREQUEST		0x80
 141
 142#define VENDOR_READ_REQUEST_TYPE	0xc0
 143#define VENDOR_READ_REQUEST		0x01
 144#define VENDOR_READ_NREQUEST		0x81
 145
 146#define UART_STATE_INDEX		8
 147#define UART_STATE_MSR_MASK		0x8b
 148#define UART_STATE_TRANSIENT_MASK	0x74
 149#define UART_DCD			0x01
 150#define UART_DSR			0x02
 151#define UART_BREAK_ERROR		0x04
 152#define UART_RING			0x08
 153#define UART_FRAME_ERROR		0x10
 154#define UART_PARITY_ERROR		0x20
 155#define UART_OVERRUN_ERROR		0x40
 156#define UART_CTS			0x80
 157
 158#define PL2303_FLOWCTRL_MASK		0xf0
 159
 160#define PL2303_READ_TYPE_HX_STATUS	0x8080
 161
 162#define PL2303_HXN_RESET_REG		0x07
 163#define PL2303_HXN_RESET_UPSTREAM_PIPE	0x02
 164#define PL2303_HXN_RESET_DOWNSTREAM_PIPE	0x01
 165
 166#define PL2303_HXN_FLOWCTRL_REG		0x0a
 167#define PL2303_HXN_FLOWCTRL_MASK	0x1c
 168#define PL2303_HXN_FLOWCTRL_NONE	0x1c
 169#define PL2303_HXN_FLOWCTRL_RTS_CTS	0x18
 170#define PL2303_HXN_FLOWCTRL_XON_XOFF	0x0c
 171
 172static void pl2303_set_break(struct usb_serial_port *port, bool enable);
 173
 174enum pl2303_type {
 175	TYPE_01,	/* Type 0 and 1 (difference unknown) */
 176	TYPE_HX,	/* HX version of the pl2303 chip */
 177	TYPE_HXN,	/* HXN version of the pl2303 chip */
 178	TYPE_COUNT
 179};
 180
 181struct pl2303_type_data {
 182	speed_t max_baud_rate;
 183	unsigned long quirks;
 184	unsigned int no_autoxonxoff:1;
 185};
 186
 187struct pl2303_serial_private {
 188	const struct pl2303_type_data *type;
 189	unsigned long quirks;
 190};
 191
 192struct pl2303_private {
 193	spinlock_t lock;
 
 194	u8 line_control;
 195	u8 line_status;
 196
 197	u8 line_settings[7];
 198};
 199
 200static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
 201	[TYPE_01] = {
 202		.max_baud_rate		= 1228800,
 203		.quirks			= PL2303_QUIRK_LEGACY,
 204		.no_autoxonxoff		= true,
 205	},
 206	[TYPE_HX] = {
 207		.max_baud_rate		= 12000000,
 208	},
 209	[TYPE_HXN] = {
 210		.max_baud_rate		= 12000000,
 211	},
 212};
 213
 214static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
 215							unsigned char buf[1])
 216{
 217	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 218	struct device *dev = &serial->interface->dev;
 219	u8 request;
 220	int res;
 221
 222	if (spriv->type == &pl2303_type_data[TYPE_HXN])
 223		request = VENDOR_READ_NREQUEST;
 224	else
 225		request = VENDOR_READ_REQUEST;
 226
 227	res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
 228			request, VENDOR_READ_REQUEST_TYPE,
 229			value, 0, buf, 1, 100);
 230	if (res != 1) {
 231		dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__,
 232								value, res);
 233		if (res >= 0)
 234			res = -EIO;
 235
 236		return res;
 237	}
 238
 239	dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]);
 240
 241	return 0;
 242}
 243
 244static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
 
 245{
 246	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 247	struct device *dev = &serial->interface->dev;
 248	u8 request;
 249	int res;
 250
 251	dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index);
 252
 253	if (spriv->type == &pl2303_type_data[TYPE_HXN])
 254		request = VENDOR_WRITE_NREQUEST;
 255	else
 256		request = VENDOR_WRITE_REQUEST;
 257
 258	res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 259			request, VENDOR_WRITE_REQUEST_TYPE,
 260			value, index, NULL, 0, 100);
 261	if (res) {
 262		dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
 263								value, res);
 264		return res;
 265	}
 266
 267	return 0;
 268}
 269
 270static int pl2303_update_reg(struct usb_serial *serial, u8 reg, u8 mask, u8 val)
 271{
 272	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 273	int ret = 0;
 274	u8 *buf;
 275
 276	buf = kmalloc(1, GFP_KERNEL);
 277	if (!buf)
 278		return -ENOMEM;
 279
 280	if (spriv->type == &pl2303_type_data[TYPE_HXN])
 281		ret = pl2303_vendor_read(serial, reg, buf);
 282	else
 283		ret = pl2303_vendor_read(serial, reg | 0x80, buf);
 284
 285	if (ret)
 286		goto out_free;
 287
 288	*buf &= ~mask;
 289	*buf |= val & mask;
 290
 291	ret = pl2303_vendor_write(serial, reg, *buf);
 292out_free:
 293	kfree(buf);
 294
 295	return ret;
 296}
 297
 298static int pl2303_probe(struct usb_serial *serial,
 299					const struct usb_device_id *id)
 300{
 301	usb_set_serial_data(serial, (void *)id->driver_info);
 302
 303	return 0;
 304}
 305
 306/*
 307 * Use interrupt endpoint from first interface if available.
 308 *
 309 * This is needed due to the looney way its endpoints are set up.
 310 */
 311static int pl2303_endpoint_hack(struct usb_serial *serial,
 312					struct usb_serial_endpoints *epds)
 313{
 314	struct usb_interface *interface = serial->interface;
 315	struct usb_device *dev = serial->dev;
 316	struct device *ddev = &interface->dev;
 317	struct usb_host_interface *iface_desc;
 318	struct usb_endpoint_descriptor *endpoint;
 319	unsigned int i;
 320
 321	if (interface == dev->actconfig->interface[0])
 322		return 0;
 323
 324	/* check out the endpoints of the other interface */
 325	iface_desc = dev->actconfig->interface[0]->cur_altsetting;
 326
 327	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 328		endpoint = &iface_desc->endpoint[i].desc;
 329
 330		if (!usb_endpoint_is_int_in(endpoint))
 331			continue;
 332
 333		dev_dbg(ddev, "found interrupt in on separate interface\n");
 334		if (epds->num_interrupt_in < ARRAY_SIZE(epds->interrupt_in))
 335			epds->interrupt_in[epds->num_interrupt_in++] = endpoint;
 336	}
 337
 338	return 0;
 339}
 340
 341static int pl2303_calc_num_ports(struct usb_serial *serial,
 342					struct usb_serial_endpoints *epds)
 343{
 344	unsigned long quirks = (unsigned long)usb_get_serial_data(serial);
 345	struct device *dev = &serial->interface->dev;
 346	int ret;
 347
 348	if (quirks & PL2303_QUIRK_ENDPOINT_HACK) {
 349		ret = pl2303_endpoint_hack(serial, epds);
 350		if (ret)
 351			return ret;
 352	}
 353
 354	if (epds->num_interrupt_in < 1) {
 355		dev_err(dev, "required interrupt-in endpoint missing\n");
 356		return -ENODEV;
 357	}
 358
 359	return 1;
 360}
 361
 362static int pl2303_startup(struct usb_serial *serial)
 363{
 364	struct pl2303_serial_private *spriv;
 365	enum pl2303_type type = TYPE_01;
 366	unsigned char *buf;
 367	int res;
 368
 369	spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
 370	if (!spriv)
 371		return -ENOMEM;
 372
 373	buf = kmalloc(1, GFP_KERNEL);
 374	if (!buf) {
 375		kfree(spriv);
 376		return -ENOMEM;
 377	}
 378
 379	if (serial->dev->descriptor.bDeviceClass == 0x02)
 380		type = TYPE_01;		/* type 0 */
 381	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
 382		type = TYPE_HX;
 383	else if (serial->dev->descriptor.bDeviceClass == 0x00)
 384		type = TYPE_01;		/* type 1 */
 385	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
 386		type = TYPE_01;		/* type 1 */
 387	dev_dbg(&serial->interface->dev, "device type: %d\n", type);
 388
 389	if (type == TYPE_HX) {
 390		res = usb_control_msg(serial->dev,
 391				usb_rcvctrlpipe(serial->dev, 0),
 392				VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
 393				PL2303_READ_TYPE_HX_STATUS, 0, buf, 1, 100);
 394		if (res != 1)
 395			type = TYPE_HXN;
 396	}
 397
 398	spriv->type = &pl2303_type_data[type];
 399	spriv->quirks = (unsigned long)usb_get_serial_data(serial);
 400	spriv->quirks |= spriv->type->quirks;
 401
 402	usb_set_serial_data(serial, spriv);
 403
 404	if (type != TYPE_HXN) {
 405		pl2303_vendor_read(serial, 0x8484, buf);
 406		pl2303_vendor_write(serial, 0x0404, 0);
 407		pl2303_vendor_read(serial, 0x8484, buf);
 408		pl2303_vendor_read(serial, 0x8383, buf);
 409		pl2303_vendor_read(serial, 0x8484, buf);
 410		pl2303_vendor_write(serial, 0x0404, 1);
 411		pl2303_vendor_read(serial, 0x8484, buf);
 412		pl2303_vendor_read(serial, 0x8383, buf);
 413		pl2303_vendor_write(serial, 0, 1);
 414		pl2303_vendor_write(serial, 1, 0);
 415		if (spriv->quirks & PL2303_QUIRK_LEGACY)
 416			pl2303_vendor_write(serial, 2, 0x24);
 417		else
 418			pl2303_vendor_write(serial, 2, 0x44);
 419	}
 420
 421	kfree(buf);
 422
 423	return 0;
 424}
 425
 426static void pl2303_release(struct usb_serial *serial)
 427{
 428	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 429
 430	kfree(spriv);
 
 
 
 431}
 432
 433static int pl2303_port_probe(struct usb_serial_port *port)
 434{
 435	struct pl2303_private *priv;
 436
 437	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 438	if (!priv)
 439		return -ENOMEM;
 440
 441	spin_lock_init(&priv->lock);
 442
 443	usb_set_serial_port_data(port, priv);
 444
 445	port->port.drain_delay = 256;
 446
 447	return 0;
 448}
 449
 450static int pl2303_port_remove(struct usb_serial_port *port)
 451{
 452	struct pl2303_private *priv = usb_get_serial_port_data(port);
 453
 454	kfree(priv);
 455
 456	return 0;
 457}
 458
 459static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
 460{
 461	struct usb_device *dev = port->serial->dev;
 462	int retval;
 463
 464	dev_dbg(&port->dev, "%s - %02x\n", __func__, value);
 465
 466	retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
 467				 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
 468				 value, 0, NULL, 0, 100);
 469	if (retval)
 470		dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
 471
 472	return retval;
 473}
 474
 475/*
 476 * Returns the nearest supported baud rate that can be set directly without
 477 * using divisors.
 478 */
 479static speed_t pl2303_get_supported_baud_rate(speed_t baud)
 480{
 481	static const speed_t baud_sup[] = {
 482		75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
 483		14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
 484		614400, 921600, 1228800, 2457600, 3000000, 6000000
 485	};
 486
 487	unsigned i;
 488
 489	for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
 490		if (baud_sup[i] > baud)
 491			break;
 492	}
 493
 494	if (i == ARRAY_SIZE(baud_sup))
 495		baud = baud_sup[i - 1];
 496	else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
 497		baud = baud_sup[i - 1];
 498	else
 499		baud = baud_sup[i];
 500
 501	return baud;
 502}
 503
 504/*
 505 * NOTE: If unsupported baud rates are set directly, the PL2303 seems to
 506 *       use 9600 baud.
 507 */
 508static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
 509								speed_t baud)
 510{
 511	put_unaligned_le32(baud, buf);
 512
 513	return baud;
 514}
 515
 516static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
 517								speed_t baud)
 518{
 519	unsigned int baseline, mantissa, exponent;
 520
 521	/*
 522	 * Apparently the formula is:
 523	 *   baudrate = 12M * 32 / (mantissa * 4^exponent)
 524	 * where
 525	 *   mantissa = buf[8:0]
 526	 *   exponent = buf[11:9]
 527	 */
 528	baseline = 12000000 * 32;
 529	mantissa = baseline / baud;
 530	if (mantissa == 0)
 531		mantissa = 1;	/* Avoid dividing by zero if baud > 32*12M. */
 532	exponent = 0;
 533	while (mantissa >= 512) {
 534		if (exponent < 7) {
 535			mantissa >>= 2;	/* divide by 4 */
 536			exponent++;
 537		} else {
 538			/* Exponent is maxed. Trim mantissa and leave. */
 539			mantissa = 511;
 540			break;
 541		}
 542	}
 543
 544	buf[3] = 0x80;
 545	buf[2] = 0;
 546	buf[1] = exponent << 1 | mantissa >> 8;
 547	buf[0] = mantissa & 0xff;
 548
 549	/* Calculate and return the exact baud rate. */
 550	baud = (baseline / mantissa) >> (exponent << 1);
 551
 552	return baud;
 553}
 554
 555static void pl2303_encode_baud_rate(struct tty_struct *tty,
 556					struct usb_serial_port *port,
 557					u8 buf[4])
 558{
 559	struct usb_serial *serial = port->serial;
 560	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 561	speed_t	baud_sup;
 562	speed_t baud;
 563
 564	baud = tty_get_baud_rate(tty);
 565	dev_dbg(&port->dev, "baud requested = %u\n", baud);
 566	if (!baud)
 567		return;
 568
 569	if (spriv->type->max_baud_rate)
 570		baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
 571	/*
 572	 * Use direct method for supported baud rates, otherwise use divisors.
 573	 */
 574	baud_sup = pl2303_get_supported_baud_rate(baud);
 575
 576	if (baud == baud_sup)
 577		baud = pl2303_encode_baud_rate_direct(buf, baud);
 578	else
 579		baud = pl2303_encode_baud_rate_divisor(buf, baud);
 580
 581	/* Save resulting baud rate */
 582	tty_encode_baud_rate(tty, baud, baud);
 583	dev_dbg(&port->dev, "baud set = %u\n", baud);
 584}
 585
 586static int pl2303_get_line_request(struct usb_serial_port *port,
 587							unsigned char buf[7])
 588{
 589	struct usb_device *udev = port->serial->dev;
 590	int ret;
 591
 592	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 593				GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
 594				0, 0, buf, 7, 100);
 595	if (ret != 7) {
 596		dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
 597
 598		if (ret >= 0)
 599			ret = -EIO;
 600
 601		return ret;
 602	}
 603
 604	dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
 605
 606	return 0;
 607}
 608
 609static int pl2303_set_line_request(struct usb_serial_port *port,
 610							unsigned char buf[7])
 611{
 612	struct usb_device *udev = port->serial->dev;
 613	int ret;
 614
 615	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 616				SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
 617				0, 0, buf, 7, 100);
 618	if (ret < 0) {
 619		dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
 620		return ret;
 621	}
 622
 623	dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
 624
 625	return 0;
 626}
 627
 628static bool pl2303_termios_change(const struct ktermios *a, const struct ktermios *b)
 629{
 630	bool ixon_change;
 631
 632	ixon_change = ((a->c_iflag ^ b->c_iflag) & (IXON | IXANY)) ||
 633			a->c_cc[VSTART] != b->c_cc[VSTART] ||
 634			a->c_cc[VSTOP] != b->c_cc[VSTOP];
 635
 636	return tty_termios_hw_change(a, b) || ixon_change;
 637}
 638
 639static bool pl2303_enable_xonxoff(struct tty_struct *tty, const struct pl2303_type_data *type)
 640{
 641	if (!I_IXON(tty) || I_IXANY(tty))
 642		return false;
 643
 644	if (START_CHAR(tty) != 0x11 || STOP_CHAR(tty) != 0x13)
 645		return false;
 646
 647	if (type->no_autoxonxoff)
 648		return false;
 649
 650	return true;
 651}
 652
 653static void pl2303_set_termios(struct tty_struct *tty,
 654		struct usb_serial_port *port, struct ktermios *old_termios)
 655{
 656	struct usb_serial *serial = port->serial;
 657	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 658	struct pl2303_private *priv = usb_get_serial_port_data(port);
 659	unsigned long flags;
 
 660	unsigned char *buf;
 661	int ret;
 
 662	u8 control;
 
 
 
 
 
 
 
 
 
 
 
 
 663
 664	if (old_termios && !pl2303_termios_change(&tty->termios, old_termios))
 665		return;
 666
 
 
 667	buf = kzalloc(7, GFP_KERNEL);
 668	if (!buf) {
 
 669		/* Report back no change occurred */
 670		if (old_termios)
 671			tty->termios = *old_termios;
 672		return;
 673	}
 674
 675	pl2303_get_line_request(port, buf);
 676
 677	switch (C_CSIZE(tty)) {
 678	case CS5:
 679		buf[6] = 5;
 680		break;
 681	case CS6:
 682		buf[6] = 6;
 683		break;
 684	case CS7:
 685		buf[6] = 7;
 686		break;
 687	default:
 688	case CS8:
 689		buf[6] = 8;
 
 
 
 
 
 
 
 
 690	}
 691	dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
 692
 693	/* For reference buf[0]:buf[3] baud rate value */
 694	pl2303_encode_baud_rate(tty, port, &buf[0]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 695
 696	/* For reference buf[4]=0 is 1 stop bits */
 697	/* For reference buf[4]=1 is 1.5 stop bits */
 698	/* For reference buf[4]=2 is 2 stop bits */
 699	if (C_CSTOPB(tty)) {
 700		/*
 701		 * NOTE: Comply with "real" UARTs / RS232:
 702		 *       use 1.5 instead of 2 stop bits with 5 data bits
 703		 */
 704		if (C_CSIZE(tty) == CS5) {
 705			buf[4] = 1;
 706			dev_dbg(&port->dev, "stop bits = 1.5\n");
 707		} else {
 708			buf[4] = 2;
 709			dev_dbg(&port->dev, "stop bits = 2\n");
 710		}
 711	} else {
 712		buf[4] = 0;
 713		dev_dbg(&port->dev, "stop bits = 1\n");
 714	}
 715
 716	if (C_PARENB(tty)) {
 717		/* For reference buf[5]=0 is none parity */
 718		/* For reference buf[5]=1 is odd parity */
 719		/* For reference buf[5]=2 is even parity */
 720		/* For reference buf[5]=3 is mark parity */
 721		/* For reference buf[5]=4 is space parity */
 722		if (C_PARODD(tty)) {
 723			if (C_CMSPAR(tty)) {
 724				buf[5] = 3;
 725				dev_dbg(&port->dev, "parity = mark\n");
 726			} else {
 727				buf[5] = 1;
 728				dev_dbg(&port->dev, "parity = odd\n");
 729			}
 730		} else {
 731			if (C_CMSPAR(tty)) {
 732				buf[5] = 4;
 733				dev_dbg(&port->dev, "parity = space\n");
 734			} else {
 735				buf[5] = 2;
 736				dev_dbg(&port->dev, "parity = even\n");
 737			}
 738		}
 739	} else {
 740		buf[5] = 0;
 741		dev_dbg(&port->dev, "parity = none\n");
 742	}
 743
 744	/*
 745	 * Some PL2303 are known to lose bytes if you change serial settings
 746	 * even to the same values as before. Thus we actually need to filter
 747	 * in this specific case.
 748	 *
 749	 * Note that the tty_termios_hw_change check above is not sufficient
 750	 * as a previously requested baud rate may differ from the one
 751	 * actually used (and stored in old_termios).
 752	 *
 753	 * NOTE: No additional locking needed for line_settings as it is
 754	 *       only used in set_termios, which is serialised against itself.
 755	 */
 756	if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
 757		ret = pl2303_set_line_request(port, buf);
 758		if (!ret)
 759			memcpy(priv->line_settings, buf, 7);
 760	}
 761
 762	/* change control lines if we are switching to or from B0 */
 763	spin_lock_irqsave(&priv->lock, flags);
 764	control = priv->line_control;
 765	if (C_BAUD(tty) == B0)
 766		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
 767	else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
 768		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
 769	if (control != priv->line_control) {
 770		control = priv->line_control;
 771		spin_unlock_irqrestore(&priv->lock, flags);
 772		pl2303_set_control_lines(port, control);
 773	} else {
 774		spin_unlock_irqrestore(&priv->lock, flags);
 775	}
 776
 777	if (C_CRTSCTS(tty)) {
 778		if (spriv->quirks & PL2303_QUIRK_LEGACY) {
 779			pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x40);
 780		} else if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
 781			pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
 782					PL2303_HXN_FLOWCTRL_MASK,
 783					PL2303_HXN_FLOWCTRL_RTS_CTS);
 784		} else {
 785			pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x60);
 786		}
 787	} else if (pl2303_enable_xonxoff(tty, spriv->type)) {
 788		if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
 789			pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
 790					PL2303_HXN_FLOWCTRL_MASK,
 791					PL2303_HXN_FLOWCTRL_XON_XOFF);
 792		} else {
 793			pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0xc0);
 794		}
 795	} else {
 796		if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
 797			pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
 798					PL2303_HXN_FLOWCTRL_MASK,
 799					PL2303_HXN_FLOWCTRL_NONE);
 800		} else {
 801			pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0);
 802		}
 803	}
 804
 
 
 
 
 805	kfree(buf);
 806}
 807
 808static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
 809{
 810	struct pl2303_private *priv = usb_get_serial_port_data(port);
 811	unsigned long flags;
 812	u8 control;
 813
 814	spin_lock_irqsave(&priv->lock, flags);
 
 815	if (on)
 816		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
 817	else
 818		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
 819	control = priv->line_control;
 820	spin_unlock_irqrestore(&priv->lock, flags);
 821
 822	pl2303_set_control_lines(port, control);
 823}
 824
 825static void pl2303_close(struct usb_serial_port *port)
 826{
 
 
 827	usb_serial_generic_close(port);
 828	usb_kill_urb(port->interrupt_in_urb);
 829	pl2303_set_break(port, false);
 830}
 831
 832static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
 833{
 
 834	struct usb_serial *serial = port->serial;
 835	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 836	int result;
 837
 838	if (spriv->quirks & PL2303_QUIRK_LEGACY) {
 
 
 839		usb_clear_halt(serial->dev, port->write_urb->pipe);
 840		usb_clear_halt(serial->dev, port->read_urb->pipe);
 841	} else {
 842		/* reset upstream data pipes */
 843		if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
 844			pl2303_vendor_write(serial, PL2303_HXN_RESET_REG,
 845					PL2303_HXN_RESET_UPSTREAM_PIPE |
 846					PL2303_HXN_RESET_DOWNSTREAM_PIPE);
 847		} else {
 848			pl2303_vendor_write(serial, 8, 0);
 849			pl2303_vendor_write(serial, 9, 0);
 850		}
 851	}
 852
 853	/* Setup termios */
 854	if (tty)
 855		pl2303_set_termios(tty, port, NULL);
 856
 857	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
 
 858	if (result) {
 859		dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
 860			result);
 861		return result;
 862	}
 863
 864	result = usb_serial_generic_open(tty, port);
 
 865	if (result) {
 866		usb_kill_urb(port->interrupt_in_urb);
 867		return result;
 
 
 868	}
 869
 870	return 0;
 871}
 872
 873static int pl2303_tiocmset(struct tty_struct *tty,
 874			   unsigned int set, unsigned int clear)
 875{
 876	struct usb_serial_port *port = tty->driver_data;
 877	struct pl2303_private *priv = usb_get_serial_port_data(port);
 878	unsigned long flags;
 879	u8 control;
 880	int ret;
 
 
 881
 882	spin_lock_irqsave(&priv->lock, flags);
 883	if (set & TIOCM_RTS)
 884		priv->line_control |= CONTROL_RTS;
 885	if (set & TIOCM_DTR)
 886		priv->line_control |= CONTROL_DTR;
 887	if (clear & TIOCM_RTS)
 888		priv->line_control &= ~CONTROL_RTS;
 889	if (clear & TIOCM_DTR)
 890		priv->line_control &= ~CONTROL_DTR;
 891	control = priv->line_control;
 892	spin_unlock_irqrestore(&priv->lock, flags);
 893
 894	ret = pl2303_set_control_lines(port, control);
 895	if (ret)
 896		return usb_translate_errors(ret);
 897
 898	return 0;
 899}
 900
 901static int pl2303_tiocmget(struct tty_struct *tty)
 902{
 903	struct usb_serial_port *port = tty->driver_data;
 904	struct pl2303_private *priv = usb_get_serial_port_data(port);
 905	unsigned long flags;
 906	unsigned int mcr;
 907	unsigned int status;
 908	unsigned int result;
 909
 
 
 
 
 
 910	spin_lock_irqsave(&priv->lock, flags);
 911	mcr = priv->line_control;
 912	status = priv->line_status;
 913	spin_unlock_irqrestore(&priv->lock, flags);
 914
 915	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
 916		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
 917		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
 918		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
 919		  | ((status & UART_RING)	? TIOCM_RI  : 0)
 920		  | ((status & UART_DCD)	? TIOCM_CD  : 0);
 921
 922	dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
 923
 924	return result;
 925}
 926
 927static int pl2303_carrier_raised(struct usb_serial_port *port)
 928{
 929	struct pl2303_private *priv = usb_get_serial_port_data(port);
 930
 931	if (priv->line_status & UART_DCD)
 932		return 1;
 
 
 933
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 934	return 0;
 935}
 936
 937static int pl2303_get_serial(struct tty_struct *tty,
 938			struct serial_struct *ss)
 939{
 
 940	struct usb_serial_port *port = tty->driver_data;
 
 
 
 
 
 
 
 
 
 941
 942	ss->type = PORT_16654;
 943	ss->line = port->minor;
 944	ss->port = port->port_number;
 945	ss->baud_base = 460800;
 946	return 0;
 
 
 
 
 
 
 
 
 947}
 948
 949static void pl2303_set_break(struct usb_serial_port *port, bool enable)
 950{
 
 951	struct usb_serial *serial = port->serial;
 952	u16 state;
 953	int result;
 954
 955	if (enable)
 
 
 
 
 956		state = BREAK_ON;
 957	else
 958		state = BREAK_OFF;
 959
 960	dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
 961			state == BREAK_OFF ? "off" : "on");
 962
 963	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
 964				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
 965				 0, NULL, 0, 100);
 966	if (result)
 967		dev_err(&port->dev, "error sending break = %d\n", result);
 968}
 969
 970static void pl2303_break_ctl(struct tty_struct *tty, int state)
 971{
 972	struct usb_serial_port *port = tty->driver_data;
 
 
 
 973
 974	pl2303_set_break(port, state);
 
 
 
 975}
 976
 977static void pl2303_update_line_status(struct usb_serial_port *port,
 978				      unsigned char *data,
 979				      unsigned int actual_length)
 980{
 981	struct usb_serial *serial = port->serial;
 982	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
 983	struct pl2303_private *priv = usb_get_serial_port_data(port);
 984	struct tty_struct *tty;
 985	unsigned long flags;
 986	unsigned int status_idx = UART_STATE_INDEX;
 987	u8 status;
 988	u8 delta;
 
 
 
 
 
 
 
 
 
 
 989
 990	if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
 991		status_idx = 0;
 
 
 992
 993	if (actual_length < status_idx + 1)
 994		return;
 995
 996	status = data[status_idx];
 997
 998	/* Save off the uart status for others to look at */
 999	spin_lock_irqsave(&priv->lock, flags);
1000	delta = priv->line_status ^ status;
1001	priv->line_status = status;
1002	spin_unlock_irqrestore(&priv->lock, flags);
1003
1004	if (status & UART_BREAK_ERROR)
1005		usb_serial_handle_break(port);
 
1006
1007	if (delta & UART_STATE_MSR_MASK) {
1008		if (delta & UART_CTS)
1009			port->icount.cts++;
1010		if (delta & UART_DSR)
1011			port->icount.dsr++;
1012		if (delta & UART_RING)
1013			port->icount.rng++;
1014		if (delta & UART_DCD) {
1015			port->icount.dcd++;
1016			tty = tty_port_tty_get(&port->port);
1017			if (tty) {
1018				usb_serial_handle_dcd_change(port, tty,
1019							status & UART_DCD);
1020				tty_kref_put(tty);
1021			}
1022		}
1023
1024		wake_up_interruptible(&port->port.delta_msr_wait);
1025	}
1026}
1027
1028static void pl2303_read_int_callback(struct urb *urb)
1029{
1030	struct usb_serial_port *port =  urb->context;
1031	unsigned char *data = urb->transfer_buffer;
1032	unsigned int actual_length = urb->actual_length;
1033	int status = urb->status;
1034	int retval;
1035
 
 
1036	switch (status) {
1037	case 0:
1038		/* success */
1039		break;
1040	case -ECONNRESET:
1041	case -ENOENT:
1042	case -ESHUTDOWN:
1043		/* this urb is terminated, clean up */
1044		dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
1045			__func__, status);
1046		return;
1047	default:
1048		dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
1049			__func__, status);
1050		goto exit;
1051	}
1052
1053	usb_serial_debug_data(&port->dev, __func__,
1054			      urb->actual_length, urb->transfer_buffer);
1055
1056	pl2303_update_line_status(port, data, actual_length);
1057
1058exit:
1059	retval = usb_submit_urb(urb, GFP_ATOMIC);
1060	if (retval) {
1061		dev_err(&port->dev,
1062			"%s - usb_submit_urb failed with result %d\n",
1063			__func__, retval);
1064	}
1065}
1066
1067static void pl2303_process_read_urb(struct urb *urb)
1068{
1069	struct usb_serial_port *port = urb->context;
1070	struct pl2303_private *priv = usb_get_serial_port_data(port);
 
1071	unsigned char *data = urb->transfer_buffer;
1072	char tty_flag = TTY_NORMAL;
1073	unsigned long flags;
1074	u8 line_status;
1075	int i;
1076
1077	/* update line status */
1078	spin_lock_irqsave(&priv->lock, flags);
1079	line_status = priv->line_status;
1080	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1081	spin_unlock_irqrestore(&priv->lock, flags);
 
1082
1083	if (!urb->actual_length)
1084		return;
1085
1086	/*
1087	 * Break takes precedence over parity, which takes precedence over
1088	 * framing errors.
1089	 */
 
 
1090	if (line_status & UART_BREAK_ERROR)
1091		tty_flag = TTY_BREAK;
1092	else if (line_status & UART_PARITY_ERROR)
1093		tty_flag = TTY_PARITY;
1094	else if (line_status & UART_FRAME_ERROR)
1095		tty_flag = TTY_FRAME;
 
1096
1097	if (tty_flag != TTY_NORMAL)
1098		dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
1099								tty_flag);
1100	/* overrun is special, not associated with a char */
1101	if (line_status & UART_OVERRUN_ERROR)
1102		tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
1103
1104	if (port->sysrq) {
1105		for (i = 0; i < urb->actual_length; ++i)
1106			if (!usb_serial_handle_sysrq_char(port, data[i]))
1107				tty_insert_flip_char(&port->port, data[i],
1108						tty_flag);
1109	} else {
1110		tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
1111							urb->actual_length);
1112	}
1113
1114	tty_flip_buffer_push(&port->port);
 
1115}
1116
 
1117static struct usb_serial_driver pl2303_device = {
1118	.driver = {
1119		.owner =	THIS_MODULE,
1120		.name =		"pl2303",
1121	},
1122	.id_table =		id_table,
1123	.num_bulk_in =		1,
1124	.num_bulk_out =		1,
1125	.num_interrupt_in =	0,	/* see pl2303_calc_num_ports */
1126	.bulk_in_size =		256,
1127	.bulk_out_size =	256,
1128	.open =			pl2303_open,
1129	.close =		pl2303_close,
1130	.dtr_rts =		pl2303_dtr_rts,
1131	.carrier_raised =	pl2303_carrier_raised,
1132	.get_serial =		pl2303_get_serial,
1133	.break_ctl =		pl2303_break_ctl,
1134	.set_termios =		pl2303_set_termios,
1135	.tiocmget =		pl2303_tiocmget,
1136	.tiocmset =		pl2303_tiocmset,
1137	.tiocmiwait =		usb_serial_generic_tiocmiwait,
1138	.process_read_urb =	pl2303_process_read_urb,
1139	.read_int_callback =	pl2303_read_int_callback,
1140	.probe =		pl2303_probe,
1141	.calc_num_ports =	pl2303_calc_num_ports,
1142	.attach =		pl2303_startup,
1143	.release =		pl2303_release,
1144	.port_probe =		pl2303_port_probe,
1145	.port_remove =		pl2303_port_remove,
1146};
1147
1148static struct usb_serial_driver * const serial_drivers[] = {
1149	&pl2303_device, NULL
1150};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1151
1152module_usb_serial_driver(serial_drivers, id_table);
 
1153
1154MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
1155MODULE_LICENSE("GPL v2");