pl2303.c 24.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * Prolific PL2303 USB to serial adaptor driver
 *
4
 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
L
Linus Torvalds 已提交
5 6 7 8
 * Copyright (C) 2003 IBM Corp.
 *
 * Original driver for 2.2.x by anonymous
 *
9 10 11
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License version
 *	2 as published by the Free Software Foundation.
L
Linus Torvalds 已提交
12
 *
A
Alan Cox 已提交
13 14
 * See Documentation/usb/usb-serial.txt for more information on using this
 * driver
L
Linus Torvalds 已提交
15 16 17 18 19 20 21 22 23 24 25 26
 */

#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/serial.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/spinlock.h>
A
Alan Cox 已提交
27
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
28
#include <linux/usb.h>
29
#include <linux/usb/serial.h>
30
#include <asm/unaligned.h>
L
Linus Torvalds 已提交
31 32
#include "pl2303.h"

33 34

#define PL2303_QUIRK_UART_STATE_IDX0		BIT(0)
35
#define PL2303_QUIRK_LEGACY			BIT(1)
36

37
static const struct usb_device_id id_table[] = {
L
Linus Torvalds 已提交
38 39
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
40
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
L
Linus Torvalds 已提交
41 42
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
M
Max Arnold 已提交
43
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
S
Steve Murphy 已提交
44
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
G
Greg Kroah-Hartman 已提交
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) },
L
Linus Torvalds 已提交
48
	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
49
	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
L
Linus Torvalds 已提交
50 51 52 53 54
	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
	{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
	{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
55
	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
L
Linus Torvalds 已提交
56 57 58 59 60 61 62 63
	{ USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
	{ USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
	{ USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
	{ USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
	{ USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
	{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
	{ USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
64 65 66 67 68 69
	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1),
		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65),
		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75),
		.driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
70
	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
71
	{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
72
	{ USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
73 74
	{ USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
	{ USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
75
	{ USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
76
	{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
77
	{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
78
	{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
79
	{ USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
80
	{ USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
81
	{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
82
	{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
83
	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
M
Matthew Arnold 已提交
84
	{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
85
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
86 87 88
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
	{ USB_DEVICE(HP_VENDOR_ID, HP_LCM960_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(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
L
Linus Torvalds 已提交
95 96 97
	{ }					/* Terminating entry */
};

98
MODULE_DEVICE_TABLE(usb, id_table);
L
Linus Torvalds 已提交
99 100 101 102 103 104 105 106 107 108

#define SET_LINE_REQUEST_TYPE		0x21
#define SET_LINE_REQUEST		0x20

#define SET_CONTROL_REQUEST_TYPE	0x21
#define SET_CONTROL_REQUEST		0x22
#define CONTROL_DTR			0x01
#define CONTROL_RTS			0x02

#define BREAK_REQUEST_TYPE		0x21
A
Alan Cox 已提交
109
#define BREAK_REQUEST			0x23
L
Linus Torvalds 已提交
110 111 112 113 114 115 116 117 118 119 120 121
#define BREAK_ON			0xffff
#define BREAK_OFF			0x0000

#define GET_LINE_REQUEST_TYPE		0xa1
#define GET_LINE_REQUEST		0x21

#define VENDOR_WRITE_REQUEST_TYPE	0x40
#define VENDOR_WRITE_REQUEST		0x01

#define VENDOR_READ_REQUEST_TYPE	0xc0
#define VENDOR_READ_REQUEST		0x01

122
#define UART_STATE_INDEX		8
123
#define UART_STATE_MSR_MASK		0x8b
L
Linus Torvalds 已提交
124 125 126 127 128 129 130 131 132 133 134 135
#define UART_STATE_TRANSIENT_MASK	0x74
#define UART_DCD			0x01
#define UART_DSR			0x02
#define UART_BREAK_ERROR		0x04
#define UART_RING			0x08
#define UART_FRAME_ERROR		0x10
#define UART_PARITY_ERROR		0x20
#define UART_OVERRUN_ERROR		0x40
#define UART_CTS			0x80


enum pl2303_type {
136 137
	TYPE_01,	/* Type 0 and 1 (difference unknown) */
	TYPE_HX,	/* HX version of the pl2303 chip */
138 139 140 141 142 143
	TYPE_COUNT
};

struct pl2303_type_data {
	speed_t max_baud_rate;
	unsigned long quirks;
L
Linus Torvalds 已提交
144 145
};

146
struct pl2303_serial_private {
J
Johan Hovold 已提交
147
	const struct pl2303_type_data *type;
148
	unsigned long quirks;
149 150
};

L
Linus Torvalds 已提交
151 152 153 154
struct pl2303_private {
	spinlock_t lock;
	u8 line_control;
	u8 line_status;
155 156

	u8 line_settings[7];
L
Linus Torvalds 已提交
157 158
};

J
Johan Hovold 已提交
159
static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
160 161 162 163 164 165
	[TYPE_01] = {
		.max_baud_rate =	1228800,
		.quirks =		PL2303_QUIRK_LEGACY,
	},
};

166 167
static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
							unsigned char buf[1])
168
{
169
	struct device *dev = &serial->interface->dev;
170 171 172
	int res;

	res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
173
			VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
174 175 176 177 178 179 180 181 182
			value, 0, buf, 1, 100);
	if (res != 1) {
		dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__,
								value, res);
		if (res >= 0)
			res = -EIO;

		return res;
	}
183

184
	dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]);
185

186
	return 0;
187 188
}

189
static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
190
{
191
	struct device *dev = &serial->interface->dev;
192 193
	int res;

194 195
	dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index);

196
	res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
197 198
			VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
			value, index, NULL, 0, 100);
199 200 201 202 203
	if (res) {
		dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
								value, res);
		return res;
	}
204

205
	return 0;
206 207
}

208 209 210 211 212 213 214 215
static int pl2303_probe(struct usb_serial *serial,
					const struct usb_device_id *id)
{
	usb_set_serial_data(serial, (void *)id->driver_info);

	return 0;
}

216
static int pl2303_startup(struct usb_serial *serial)
L
Linus Torvalds 已提交
217
{
218
	struct pl2303_serial_private *spriv;
219
	enum pl2303_type type = TYPE_01;
220
	unsigned char *buf;
221 222 223 224

	spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
	if (!spriv)
		return -ENOMEM;
L
Linus Torvalds 已提交
225

226
	buf = kmalloc(1, GFP_KERNEL);
227 228
	if (!buf) {
		kfree(spriv);
229
		return -ENOMEM;
230
	}
231

232
	if (serial->dev->descriptor.bDeviceClass == 0x02)
233
		type = TYPE_01;		/* type 0 */
234
	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
235
		type = TYPE_HX;
236
	else if (serial->dev->descriptor.bDeviceClass == 0x00)
237
		type = TYPE_01;		/* type 1 */
238
	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
239
		type = TYPE_01;		/* type 1 */
240
	dev_dbg(&serial->interface->dev, "device type: %d\n", type);
L
Linus Torvalds 已提交
241

242
	spriv->type = &pl2303_type_data[type];
243
	spriv->quirks = (unsigned long)usb_get_serial_data(serial);
244
	spriv->quirks |= spriv->type->quirks;
245

246
	usb_set_serial_data(serial, spriv);
247

248 249 250 251 252 253 254 255 256 257
	pl2303_vendor_read(serial, 0x8484, buf);
	pl2303_vendor_write(serial, 0x0404, 0);
	pl2303_vendor_read(serial, 0x8484, buf);
	pl2303_vendor_read(serial, 0x8383, buf);
	pl2303_vendor_read(serial, 0x8484, buf);
	pl2303_vendor_write(serial, 0x0404, 1);
	pl2303_vendor_read(serial, 0x8484, buf);
	pl2303_vendor_read(serial, 0x8383, buf);
	pl2303_vendor_write(serial, 0, 1);
	pl2303_vendor_write(serial, 1, 0);
258
	if (spriv->quirks & PL2303_QUIRK_LEGACY)
259
		pl2303_vendor_write(serial, 2, 0x24);
260 261
	else
		pl2303_vendor_write(serial, 2, 0x44);
262 263

	kfree(buf);
264

L
Linus Torvalds 已提交
265
	return 0;
266
}
L
Linus Torvalds 已提交
267

268 269
static void pl2303_release(struct usb_serial *serial)
{
270
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

	kfree(spriv);
}

static int pl2303_port_probe(struct usb_serial_port *port)
{
	struct pl2303_private *priv;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	spin_lock_init(&priv->lock);

	usb_set_serial_port_data(port, priv);

287 288
	port->port.drain_delay = 256;

289 290 291 292 293
	return 0;
}

static int pl2303_port_remove(struct usb_serial_port *port)
{
294
	struct pl2303_private *priv = usb_get_serial_port_data(port);
295 296 297 298

	kfree(priv);

	return 0;
L
Linus Torvalds 已提交
299 300
}

301
static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
L
Linus Torvalds 已提交
302
{
303
	struct usb_device *dev = port->serial->dev;
L
Linus Torvalds 已提交
304
	int retval;
A
Alan Cox 已提交
305

306 307
	dev_dbg(&port->dev, "%s - %02x\n", __func__, value);

308 309 310
	retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
				 value, 0, NULL, 0, 100);
311 312
	if (retval)
		dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
313

L
Linus Torvalds 已提交
314 315 316
	return retval;
}

317
/*
318 319
 * Returns the nearest supported baud rate that can be set directly without
 * using divisors.
320 321
 */
static speed_t pl2303_get_supported_baud_rate(speed_t baud)
L
Linus Torvalds 已提交
322
{
323 324 325
	static const speed_t baud_sup[] = {
		75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
		14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
326
		614400, 921600, 1228800, 2457600, 3000000, 6000000
327
	};
L
Linus Torvalds 已提交
328

329
	unsigned i;
330

331 332 333 334
	for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
		if (baud_sup[i] > baud)
			break;
	}
335

336 337 338 339 340 341
	if (i == ARRAY_SIZE(baud_sup))
		baud = baud_sup[i - 1];
	else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
		baud = baud_sup[i - 1];
	else
		baud = baud_sup[i];
342

343 344 345
	return baud;
}

346 347 348 349 350 351 352 353 354 355 356 357
/*
 * NOTE: If unsupported baud rates are set directly, the PL2303 seems to
 *       use 9600 baud.
 */
static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
								speed_t baud)
{
	put_unaligned_le32(baud, buf);

	return baud;
}

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
								speed_t baud)
{
	unsigned int tmp;

	/*
	 * Apparently the formula is:
	 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
	 */
	tmp = 12000000 * 32 / baud;
	buf[3] = 0x80;
	buf[2] = 0;
	buf[1] = (tmp >= 256);
	while (tmp >= 256) {
		tmp >>= 2;
		buf[1] <<= 1;
	}
	buf[0] = tmp;

	return baud;
}

380 381 382 383 384 385
static void pl2303_encode_baud_rate(struct tty_struct *tty,
					struct usb_serial_port *port,
					u8 buf[4])
{
	struct usb_serial *serial = port->serial;
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
386
	speed_t	baud_sup;
387 388 389 390 391 392
	speed_t baud;

	baud = tty_get_baud_rate(tty);
	dev_dbg(&port->dev, "baud requested = %u\n", baud);
	if (!baud)
		return;
393 394 395

	if (spriv->type->max_baud_rate)
		baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
396 397 398 399 400 401
	/*
	 * Set baud rate to nearest supported value.
	 *
	 * NOTE: Baud rate 500k can only be set using divisors.
	 */
	baud_sup = pl2303_get_supported_baud_rate(baud);
402

403
	if (baud == 500000)
404
		baud = pl2303_encode_baud_rate_divisor(buf, baud);
405 406
	else
		baud = pl2303_encode_baud_rate_direct(buf, baud_sup);
407

408
	/* Save resulting baud rate */
409
	tty_encode_baud_rate(tty, baud, baud);
410
	dev_dbg(&port->dev, "baud set = %u\n", baud);
411 412
}

413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
static int pl2303_get_line_request(struct usb_serial_port *port,
							unsigned char buf[7])
{
	struct usb_device *udev = port->serial->dev;
	int ret;

	ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
				GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
				0, 0, buf, 7, 100);
	if (ret != 7) {
		dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);

		if (ret > 0)
			ret = -EIO;

		return ret;
	}

	dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);

	return 0;
}

static int pl2303_set_line_request(struct usb_serial_port *port,
							unsigned char buf[7])
{
	struct usb_device *udev = port->serial->dev;
	int ret;

	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
				SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
				0, 0, buf, 7, 100);
	if (ret != 7) {
		dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);

		if (ret > 0)
			ret = -EIO;

		return ret;
	}

	dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);

	return 0;
}

459 460 461 462 463 464 465 466
static void pl2303_set_termios(struct tty_struct *tty,
		struct usb_serial_port *port, struct ktermios *old_termios)
{
	struct usb_serial *serial = port->serial;
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	unsigned char *buf;
467
	int ret;
468 469 470 471 472 473 474 475 476 477 478 479 480
	u8 control;

	if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
		return;

	buf = kzalloc(7, GFP_KERNEL);
	if (!buf) {
		/* Report back no change occurred */
		if (old_termios)
			tty->termios = *old_termios;
		return;
	}

481
	pl2303_get_line_request(port, buf);
482

483 484 485 486 487 488 489 490 491 492 493 494 495
	switch (C_CSIZE(tty)) {
	case CS5:
		buf[6] = 5;
		break;
	case CS6:
		buf[6] = 6;
		break;
	case CS7:
		buf[6] = 7;
		break;
	default:
	case CS8:
		buf[6] = 8;
496
	}
497
	dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
498

499
	/* For reference buf[0]:buf[3] baud rate value */
500
	pl2303_encode_baud_rate(tty, port, &buf[0]);
501

L
Linus Torvalds 已提交
502 503 504
	/* For reference buf[4]=0 is 1 stop bits */
	/* For reference buf[4]=1 is 1.5 stop bits */
	/* For reference buf[4]=2 is 2 stop bits */
J
Johan Hovold 已提交
505 506 507
	if (C_CSTOPB(tty)) {
		/*
		 * NOTE: Comply with "real" UARTs / RS232:
508 509
		 *       use 1.5 instead of 2 stop bits with 5 data bits
		 */
J
Johan Hovold 已提交
510
		if (C_CSIZE(tty) == CS5) {
511
			buf[4] = 1;
512
			dev_dbg(&port->dev, "stop bits = 1.5\n");
513 514
		} else {
			buf[4] = 2;
515
			dev_dbg(&port->dev, "stop bits = 2\n");
516
		}
L
Linus Torvalds 已提交
517 518
	} else {
		buf[4] = 0;
519
		dev_dbg(&port->dev, "stop bits = 1\n");
L
Linus Torvalds 已提交
520 521
	}

J
Johan Hovold 已提交
522
	if (C_PARENB(tty)) {
L
Linus Torvalds 已提交
523 524 525 526 527
		/* For reference buf[5]=0 is none parity */
		/* For reference buf[5]=1 is odd parity */
		/* For reference buf[5]=2 is even parity */
		/* For reference buf[5]=3 is mark parity */
		/* For reference buf[5]=4 is space parity */
J
Johan Hovold 已提交
528
		if (C_PARODD(tty)) {
J
Johan Hovold 已提交
529
			if (C_CMSPAR(tty)) {
530
				buf[5] = 3;
531
				dev_dbg(&port->dev, "parity = mark\n");
532 533
			} else {
				buf[5] = 1;
534
				dev_dbg(&port->dev, "parity = odd\n");
535
			}
L
Linus Torvalds 已提交
536
		} else {
J
Johan Hovold 已提交
537
			if (C_CMSPAR(tty)) {
538
				buf[5] = 4;
539
				dev_dbg(&port->dev, "parity = space\n");
540 541
			} else {
				buf[5] = 2;
542
				dev_dbg(&port->dev, "parity = even\n");
543
			}
L
Linus Torvalds 已提交
544 545 546
		}
	} else {
		buf[5] = 0;
547
		dev_dbg(&port->dev, "parity = none\n");
L
Linus Torvalds 已提交
548 549
	}

550 551 552 553 554 555 556 557 558 559 560 561 562
	/*
	 * Some PL2303 are known to lose bytes if you change serial settings
	 * even to the same values as before. Thus we actually need to filter
	 * in this specific case.
	 *
	 * Note that the tty_termios_hw_change check above is not sufficient
	 * as a previously requested baud rate may differ from the one
	 * actually used (and stored in old_termios).
	 *
	 * NOTE: No additional locking needed for line_settings as it is
	 *       only used in set_termios, which is serialised against itself.
	 */
	if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
563 564
		ret = pl2303_set_line_request(port, buf);
		if (!ret)
565 566
			memcpy(priv->line_settings, buf, 7);
	}
L
Linus Torvalds 已提交
567 568 569 570

	/* change control lines if we are switching to or from B0 */
	spin_lock_irqsave(&priv->lock, flags);
	control = priv->line_control;
J
Johan Hovold 已提交
571
	if (C_BAUD(tty) == B0)
L
Linus Torvalds 已提交
572
		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
573
	else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
L
Linus Torvalds 已提交
574 575 576 577
		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
	if (control != priv->line_control) {
		control = priv->line_control;
		spin_unlock_irqrestore(&priv->lock, flags);
578
		pl2303_set_control_lines(port, control);
L
Linus Torvalds 已提交
579 580 581
	} else {
		spin_unlock_irqrestore(&priv->lock, flags);
	}
582

J
Johan Hovold 已提交
583
	if (C_CRTSCTS(tty)) {
584
		if (spriv->quirks & PL2303_QUIRK_LEGACY)
585
			pl2303_vendor_write(serial, 0x0, 0x41);
586 587
		else
			pl2303_vendor_write(serial, 0x0, 0x61);
T
t.sefzick 已提交
588
	} else {
589
		pl2303_vendor_write(serial, 0x0, 0x0);
L
Linus Torvalds 已提交
590
	}
591 592 593 594

	kfree(buf);
}

595 596 597 598 599 600 601 602 603 604 605 606 607
static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
{
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	u8 control;

	spin_lock_irqsave(&priv->lock, flags);
	if (on)
		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
	else
		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
	control = priv->line_control;
	spin_unlock_irqrestore(&priv->lock, flags);
608

609
	pl2303_set_control_lines(port, control);
610 611 612
}

static void pl2303_close(struct usb_serial_port *port)
613
{
J
Johan Hovold 已提交
614
	usb_serial_generic_close(port);
615
	usb_kill_urb(port->interrupt_in_urb);
L
Linus Torvalds 已提交
616 617
}

618
static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
L
Linus Torvalds 已提交
619 620
{
	struct usb_serial *serial = port->serial;
621
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
L
Linus Torvalds 已提交
622 623
	int result;

624
	if (spriv->quirks & PL2303_QUIRK_LEGACY) {
625 626
		usb_clear_halt(serial->dev, port->write_urb->pipe);
		usb_clear_halt(serial->dev, port->read_urb->pipe);
627
	} else {
L
Linus Torvalds 已提交
628
		/* reset upstream data pipes */
629 630
		pl2303_vendor_write(serial, 8, 0);
		pl2303_vendor_write(serial, 9, 0);
L
Linus Torvalds 已提交
631 632 633
	}

	/* Setup termios */
A
Alan Cox 已提交
634
	if (tty)
635
		pl2303_set_termios(tty, port, NULL);
L
Linus Torvalds 已提交
636

637
	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
L
Linus Torvalds 已提交
638
	if (result) {
639 640
		dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
			result);
641
		return result;
L
Linus Torvalds 已提交
642
	}
643

644
	result = usb_serial_generic_open(tty, port);
645 646 647 648 649
	if (result) {
		usb_kill_urb(port->interrupt_in_urb);
		return result;
	}

L
Linus Torvalds 已提交
650 651 652
	return 0;
}

653
static int pl2303_tiocmset(struct tty_struct *tty,
654
			   unsigned int set, unsigned int clear)
L
Linus Torvalds 已提交
655
{
A
Alan Cox 已提交
656
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
657 658 659
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	u8 control;
660
	int ret;
F
Flavio Leitner 已提交
661

662
	spin_lock_irqsave(&priv->lock, flags);
L
Linus Torvalds 已提交
663 664 665 666 667 668 669 670 671
	if (set & TIOCM_RTS)
		priv->line_control |= CONTROL_RTS;
	if (set & TIOCM_DTR)
		priv->line_control |= CONTROL_DTR;
	if (clear & TIOCM_RTS)
		priv->line_control &= ~CONTROL_RTS;
	if (clear & TIOCM_DTR)
		priv->line_control &= ~CONTROL_DTR;
	control = priv->line_control;
672
	spin_unlock_irqrestore(&priv->lock, flags);
L
Linus Torvalds 已提交
673

674 675 676
	ret = pl2303_set_control_lines(port, control);
	if (ret)
		return usb_translate_errors(ret);
677

678
	return 0;
L
Linus Torvalds 已提交
679 680
}

681
static int pl2303_tiocmget(struct tty_struct *tty)
L
Linus Torvalds 已提交
682
{
A
Alan Cox 已提交
683
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
684 685 686 687 688 689
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	unsigned int mcr;
	unsigned int status;
	unsigned int result;

690
	spin_lock_irqsave(&priv->lock, flags);
L
Linus Torvalds 已提交
691 692
	mcr = priv->line_control;
	status = priv->line_status;
693
	spin_unlock_irqrestore(&priv->lock, flags);
L
Linus Torvalds 已提交
694 695 696 697 698 699 700 701

	result = ((mcr & CONTROL_DTR)		? TIOCM_DTR : 0)
		  | ((mcr & CONTROL_RTS)	? TIOCM_RTS : 0)
		  | ((status & UART_CTS)	? TIOCM_CTS : 0)
		  | ((status & UART_DSR)	? TIOCM_DSR : 0)
		  | ((status & UART_RING)	? TIOCM_RI  : 0)
		  | ((status & UART_DCD)	? TIOCM_CD  : 0);

702
	dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
L
Linus Torvalds 已提交
703 704 705 706

	return result;
}

707 708 709
static int pl2303_carrier_raised(struct usb_serial_port *port)
{
	struct pl2303_private *priv = usb_get_serial_port_data(port);
710

711 712
	if (priv->line_status & UART_DCD)
		return 1;
713

714 715 716
	return 0;
}

717
static int pl2303_ioctl(struct tty_struct *tty,
718
			unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
719
{
720
	struct serial_struct ser;
A
Alan Cox 已提交
721
	struct usb_serial_port *port = tty->driver_data;
722

L
Linus Torvalds 已提交
723
	switch (cmd) {
724 725 726
	case TIOCGSERIAL:
		memset(&ser, 0, sizeof ser);
		ser.type = PORT_16654;
727
		ser.line = port->minor;
728
		ser.port = port->port_number;
729 730 731 732 733 734
		ser.baud_base = 460800;

		if (copy_to_user((void __user *)arg, &ser, sizeof ser))
			return -EFAULT;

		return 0;
A
Alan Cox 已提交
735 736
	default:
		break;
L
Linus Torvalds 已提交
737
	}
738

L
Linus Torvalds 已提交
739 740 741
	return -ENOIOCTLCMD;
}

A
Alan Cox 已提交
742
static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
L
Linus Torvalds 已提交
743
{
A
Alan Cox 已提交
744
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
745 746 747 748 749 750 751 752
	struct usb_serial *serial = port->serial;
	u16 state;
	int result;

	if (break_state == 0)
		state = BREAK_OFF;
	else
		state = BREAK_ON;
753

754
	dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
A
Alan Cox 已提交
755
			state == BREAK_OFF ? "off" : "on");
L
Linus Torvalds 已提交
756

757 758 759
	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
				 0, NULL, 0, 100);
L
Linus Torvalds 已提交
760
	if (result)
761
		dev_err(&port->dev, "error sending break = %d\n", result);
L
Linus Torvalds 已提交
762 763
}

F
Flavio Leitner 已提交
764 765 766 767
static void pl2303_update_line_status(struct usb_serial_port *port,
				      unsigned char *data,
				      unsigned int actual_length)
{
768 769
	struct usb_serial *serial = port->serial;
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
F
Flavio Leitner 已提交
770
	struct pl2303_private *priv = usb_get_serial_port_data(port);
771
	struct tty_struct *tty;
F
Flavio Leitner 已提交
772
	unsigned long flags;
773
	unsigned int status_idx = UART_STATE_INDEX;
774 775
	u8 status;
	u8 delta;
F
Flavio Leitner 已提交
776

777 778
	if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
		status_idx = 0;
F
Flavio Leitner 已提交
779

780
	if (actual_length < status_idx + 1)
781
		return;
F
Flavio Leitner 已提交
782

783 784
	status = data[status_idx];

A
Alan Cox 已提交
785
	/* Save off the uart status for others to look at */
F
Flavio Leitner 已提交
786
	spin_lock_irqsave(&priv->lock, flags);
787 788
	delta = priv->line_status ^ status;
	priv->line_status = status;
F
Flavio Leitner 已提交
789
	spin_unlock_irqrestore(&priv->lock, flags);
790

791
	if (status & UART_BREAK_ERROR)
792
		usb_serial_handle_break(port);
793

794
	if (delta & UART_STATE_MSR_MASK) {
795 796 797 798 799 800
		if (delta & UART_CTS)
			port->icount.cts++;
		if (delta & UART_DSR)
			port->icount.dsr++;
		if (delta & UART_RING)
			port->icount.rng++;
801
		if (delta & UART_DCD) {
802
			port->icount.dcd++;
803 804 805
			tty = tty_port_tty_get(&port->port);
			if (tty) {
				usb_serial_handle_dcd_change(port, tty,
806
							status & UART_DCD);
807 808
				tty_kref_put(tty);
			}
809
		}
810 811

		wake_up_interruptible(&port->port.delta_msr_wait);
812
	}
F
Flavio Leitner 已提交
813
}
L
Linus Torvalds 已提交
814

815
static void pl2303_read_int_callback(struct urb *urb)
L
Linus Torvalds 已提交
816
{
817
	struct usb_serial_port *port =  urb->context;
L
Linus Torvalds 已提交
818
	unsigned char *data = urb->transfer_buffer;
F
Flavio Leitner 已提交
819
	unsigned int actual_length = urb->actual_length;
820 821
	int status = urb->status;
	int retval;
L
Linus Torvalds 已提交
822

823
	switch (status) {
L
Linus Torvalds 已提交
824 825 826 827 828 829 830
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
831 832
		dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
			__func__, status);
L
Linus Torvalds 已提交
833 834
		return;
	default:
835 836
		dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
			__func__, status);
L
Linus Torvalds 已提交
837 838 839
		goto exit;
	}

840
	usb_serial_debug_data(&port->dev, __func__,
841 842
			      urb->actual_length, urb->transfer_buffer);

F
Flavio Leitner 已提交
843
	pl2303_update_line_status(port, data, actual_length);
L
Linus Torvalds 已提交
844 845

exit:
846
	retval = usb_submit_urb(urb, GFP_ATOMIC);
847
	if (retval) {
848
		dev_err(&port->dev,
849
			"%s - usb_submit_urb failed with result %d\n",
850
			__func__, retval);
851
	}
L
Linus Torvalds 已提交
852 853
}

854
static void pl2303_process_read_urb(struct urb *urb)
855
{
856 857
	struct usb_serial_port *port = urb->context;
	struct pl2303_private *priv = usb_get_serial_port_data(port);
858 859
	unsigned char *data = urb->transfer_buffer;
	char tty_flag = TTY_NORMAL;
860 861 862 863 864 865 866 867 868 869 870 871 872
	unsigned long flags;
	u8 line_status;
	int i;

	/* update line status */
	spin_lock_irqsave(&priv->lock, flags);
	line_status = priv->line_status;
	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
	spin_unlock_irqrestore(&priv->lock, flags);

	if (!urb->actual_length)
		return;

873 874 875 876
	/*
	 * Break takes precedence over parity, which takes precedence over
	 * framing errors.
	 */
877 878 879 880 881 882 883
	if (line_status & UART_BREAK_ERROR)
		tty_flag = TTY_BREAK;
	else if (line_status & UART_PARITY_ERROR)
		tty_flag = TTY_PARITY;
	else if (line_status & UART_FRAME_ERROR)
		tty_flag = TTY_FRAME;

884 885 886
	if (tty_flag != TTY_NORMAL)
		dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
								tty_flag);
887 888
	/* overrun is special, not associated with a char */
	if (line_status & UART_OVERRUN_ERROR)
J
Jiri Slaby 已提交
889
		tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
890

891
	if (port->port.console && port->sysrq) {
892
		for (i = 0; i < urb->actual_length; ++i)
893
			if (!usb_serial_handle_sysrq_char(port, data[i]))
J
Jiri Slaby 已提交
894 895
				tty_insert_flip_char(&port->port, data[i],
						tty_flag);
896
	} else {
897
		tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
898
							urb->actual_length);
899
	}
L
Linus Torvalds 已提交
900

J
Jiri Slaby 已提交
901
	tty_flip_buffer_push(&port->port);
L
Linus Torvalds 已提交
902 903
}

904 905 906 907 908 909 910
static struct usb_serial_driver pl2303_device = {
	.driver = {
		.owner =	THIS_MODULE,
		.name =		"pl2303",
	},
	.id_table =		id_table,
	.num_ports =		1,
911
	.bulk_in_size =		256,
912
	.bulk_out_size =	256,
913 914
	.open =			pl2303_open,
	.close =		pl2303_close,
915
	.dtr_rts =		pl2303_dtr_rts,
916
	.carrier_raised =	pl2303_carrier_raised,
917 918 919 920 921
	.ioctl =		pl2303_ioctl,
	.break_ctl =		pl2303_break_ctl,
	.set_termios =		pl2303_set_termios,
	.tiocmget =		pl2303_tiocmget,
	.tiocmset =		pl2303_tiocmset,
922
	.tiocmiwait =		usb_serial_generic_tiocmiwait,
923
	.process_read_urb =	pl2303_process_read_urb,
924
	.read_int_callback =	pl2303_read_int_callback,
925
	.probe =		pl2303_probe,
926
	.attach =		pl2303_startup,
927
	.release =		pl2303_release,
928 929
	.port_probe =		pl2303_port_probe,
	.port_remove =		pl2303_port_remove,
930
};
L
Linus Torvalds 已提交
931

932 933 934 935
static struct usb_serial_driver * const serial_drivers[] = {
	&pl2303_device, NULL
};

936
module_usb_serial_driver(serial_drivers, id_table);
L
Linus Torvalds 已提交
937

938
MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
L
Linus Torvalds 已提交
939
MODULE_LICENSE("GPL");