pl2303.c 26.9 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
#define PL2303_QUIRK_ENDPOINT_HACK		BIT(2)
37

38
static const struct usb_device_id id_table[] = {
39 40
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID),
		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
L
Linus Torvalds 已提交
41
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
42
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
L
Linus Torvalds 已提交
43 44
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
M
Max Arnold 已提交
45
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
S
Steve Murphy 已提交
46
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
G
Greg Kroah-Hartman 已提交
47
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
48
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
49
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
50
	{ USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
L
Linus Torvalds 已提交
51
	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
52
	{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
53 54
	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID),
		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
55 56
	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC485),
		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
57
	{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) },
L
Linus Torvalds 已提交
58 59 60 61
	{ 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) },
62
	{ USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
L
Linus Torvalds 已提交
63 64 65 66 67 68 69
	{ 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) },
70 71 72 73 74 75
	{ 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 },
76 77
	{ USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81),
		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
78
	{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
79
	{ USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
80 81
	{ USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
	{ USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
82
	{ USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
83
	{ USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
84
	{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
85
	{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
86
	{ USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
87 88
	{ USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID),
		.driver_info = PL2303_QUIRK_ENDPOINT_HACK },
89
	{ USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
90
	{ USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
91
	{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
M
Matthew Arnold 已提交
92
	{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
93
	{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
94 95 96
	{ 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) },
97
	{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
98
	{ USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
99
	{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
100
	{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
101
	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
102
	{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
L
Linus Torvalds 已提交
103 104 105
	{ }					/* Terminating entry */
};

106
MODULE_DEVICE_TABLE(usb, id_table);
L
Linus Torvalds 已提交
107 108 109 110 111 112 113 114 115 116

#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 已提交
117
#define BREAK_REQUEST			0x23
L
Linus Torvalds 已提交
118 119 120 121 122 123 124 125 126 127 128 129
#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

130
#define UART_STATE_INDEX		8
131
#define UART_STATE_MSR_MASK		0x8b
L
Linus Torvalds 已提交
132 133 134 135 136 137 138 139 140 141
#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

142
static void pl2303_set_break(struct usb_serial_port *port, bool enable);
L
Linus Torvalds 已提交
143 144

enum pl2303_type {
145 146
	TYPE_01,	/* Type 0 and 1 (difference unknown) */
	TYPE_HX,	/* HX version of the pl2303 chip */
147 148 149 150 151 152
	TYPE_COUNT
};

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

155
struct pl2303_serial_private {
J
Johan Hovold 已提交
156
	const struct pl2303_type_data *type;
157
	unsigned long quirks;
158 159
};

L
Linus Torvalds 已提交
160 161 162 163
struct pl2303_private {
	spinlock_t lock;
	u8 line_control;
	u8 line_status;
164 165

	u8 line_settings[7];
L
Linus Torvalds 已提交
166 167
};

J
Johan Hovold 已提交
168
static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
169 170 171 172
	[TYPE_01] = {
		.max_baud_rate =	1228800,
		.quirks =		PL2303_QUIRK_LEGACY,
	},
173 174 175
	[TYPE_HX] = {
		.max_baud_rate =	12000000,
	},
176 177
};

178 179
static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
							unsigned char buf[1])
180
{
181
	struct device *dev = &serial->interface->dev;
182 183 184
	int res;

	res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
185
			VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
186 187 188 189 190 191 192 193 194
			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;
	}
195

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

198
	return 0;
199 200
}

201
static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
202
{
203
	struct device *dev = &serial->interface->dev;
204 205
	int res;

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

208
	res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
209 210
			VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
			value, index, NULL, 0, 100);
211 212 213 214 215
	if (res) {
		dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
								value, res);
		return res;
	}
216

217
	return 0;
218 219
}

220 221 222 223 224 225 226 227
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;
}

228 229 230 231 232 233
/*
 * Use interrupt endpoint from first interface if available.
 *
 * This is needed due to the looney way its endpoints are set up.
 */
static int pl2303_endpoint_hack(struct usb_serial *serial,
234 235 236 237 238 239 240 241 242
					struct usb_serial_endpoints *epds)
{
	struct usb_interface *interface = serial->interface;
	struct usb_device *dev = serial->dev;
	struct device *ddev = &interface->dev;
	struct usb_host_interface *iface_desc;
	struct usb_endpoint_descriptor *endpoint;
	unsigned int i;

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
	if (interface == dev->actconfig->interface[0])
		return 0;

	/* check out the endpoints of the other interface */
	iface_desc = dev->actconfig->interface[0]->cur_altsetting;

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;

		if (!usb_endpoint_is_int_in(endpoint))
			continue;

		dev_dbg(ddev, "found interrupt in on separate interface\n");
		if (epds->num_interrupt_in < ARRAY_SIZE(epds->interrupt_in))
			epds->interrupt_in[epds->num_interrupt_in++] = endpoint;
	}

	return 0;
}

static int pl2303_calc_num_ports(struct usb_serial *serial,
					struct usb_serial_endpoints *epds)
{
	unsigned long quirks = (unsigned long)usb_get_serial_data(serial);
	struct device *dev = &serial->interface->dev;
	int ret;

	if (quirks & PL2303_QUIRK_ENDPOINT_HACK) {
		ret = pl2303_endpoint_hack(serial, epds);
		if (ret)
			return ret;
274 275 276
	}

	if (epds->num_interrupt_in < 1) {
277
		dev_err(dev, "required interrupt-in endpoint missing\n");
278 279 280 281 282 283
		return -ENODEV;
	}

	return 1;
}

284
static int pl2303_startup(struct usb_serial *serial)
L
Linus Torvalds 已提交
285
{
286
	struct pl2303_serial_private *spriv;
287
	enum pl2303_type type = TYPE_01;
288
	unsigned char *buf;
289 290 291 292

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

294
	buf = kmalloc(1, GFP_KERNEL);
295 296
	if (!buf) {
		kfree(spriv);
297
		return -ENOMEM;
298
	}
299

300
	if (serial->dev->descriptor.bDeviceClass == 0x02)
301
		type = TYPE_01;		/* type 0 */
302
	else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
303
		type = TYPE_HX;
304
	else if (serial->dev->descriptor.bDeviceClass == 0x00)
305
		type = TYPE_01;		/* type 1 */
306
	else if (serial->dev->descriptor.bDeviceClass == 0xFF)
307
		type = TYPE_01;		/* type 1 */
308
	dev_dbg(&serial->interface->dev, "device type: %d\n", type);
L
Linus Torvalds 已提交
309

310
	spriv->type = &pl2303_type_data[type];
311
	spriv->quirks = (unsigned long)usb_get_serial_data(serial);
312
	spriv->quirks |= spriv->type->quirks;
313

314
	usb_set_serial_data(serial, spriv);
315

316 317 318 319 320 321 322 323 324 325
	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);
326
	if (spriv->quirks & PL2303_QUIRK_LEGACY)
327
		pl2303_vendor_write(serial, 2, 0x24);
328 329
	else
		pl2303_vendor_write(serial, 2, 0x44);
330 331

	kfree(buf);
332

L
Linus Torvalds 已提交
333
	return 0;
334
}
L
Linus Torvalds 已提交
335

336 337
static void pl2303_release(struct usb_serial *serial)
{
338
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354

	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);

355 356
	port->port.drain_delay = 256;

357 358 359 360 361
	return 0;
}

static int pl2303_port_remove(struct usb_serial_port *port)
{
362
	struct pl2303_private *priv = usb_get_serial_port_data(port);
363 364 365 366

	kfree(priv);

	return 0;
L
Linus Torvalds 已提交
367 368
}

369
static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
L
Linus Torvalds 已提交
370
{
371
	struct usb_device *dev = port->serial->dev;
L
Linus Torvalds 已提交
372
	int retval;
A
Alan Cox 已提交
373

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

376 377 378
	retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
				 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
				 value, 0, NULL, 0, 100);
379 380
	if (retval)
		dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
381

L
Linus Torvalds 已提交
382 383 384
	return retval;
}

385
/*
386 387
 * Returns the nearest supported baud rate that can be set directly without
 * using divisors.
388 389
 */
static speed_t pl2303_get_supported_baud_rate(speed_t baud)
L
Linus Torvalds 已提交
390
{
391 392 393
	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,
394
		614400, 921600, 1228800, 2457600, 3000000, 6000000
395
	};
L
Linus Torvalds 已提交
396

397
	unsigned i;
398

399 400 401 402
	for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
		if (baud_sup[i] > baud)
			break;
	}
403

404 405 406 407 408 409
	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];
410

411 412 413
	return baud;
}

414 415 416 417 418 419 420 421 422 423 424 425
/*
 * 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;
}

426 427 428
static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
								speed_t baud)
{
429
	unsigned int baseline, mantissa, exponent;
430 431 432

	/*
	 * Apparently the formula is:
433 434 435 436
	 *   baudrate = 12M * 32 / (mantissa * 4^exponent)
	 * where
	 *   mantissa = buf[8:0]
	 *   exponent = buf[11:9]
437
	 */
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
	baseline = 12000000 * 32;
	mantissa = baseline / baud;
	if (mantissa == 0)
		mantissa = 1;	/* Avoid dividing by zero if baud > 32*12M. */
	exponent = 0;
	while (mantissa >= 512) {
		if (exponent < 7) {
			mantissa >>= 2;	/* divide by 4 */
			exponent++;
		} else {
			/* Exponent is maxed. Trim mantissa and leave. */
			mantissa = 511;
			break;
		}
	}

454 455
	buf[3] = 0x80;
	buf[2] = 0;
456 457 458 459 460
	buf[1] = exponent << 1 | mantissa >> 8;
	buf[0] = mantissa & 0xff;

	/* Calculate and return the exact baud rate. */
	baud = (baseline / mantissa) >> (exponent << 1);
461 462 463 464

	return baud;
}

465 466 467 468 469 470
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);
471
	speed_t	baud_sup;
472 473 474 475 476 477
	speed_t baud;

	baud = tty_get_baud_rate(tty);
	dev_dbg(&port->dev, "baud requested = %u\n", baud);
	if (!baud)
		return;
478 479 480

	if (spriv->type->max_baud_rate)
		baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
481
	/*
482
	 * Use direct method for supported baud rates, otherwise use divisors.
483 484
	 */
	baud_sup = pl2303_get_supported_baud_rate(baud);
485

486 487
	if (baud == baud_sup)
		baud = pl2303_encode_baud_rate_direct(buf, baud);
488
	else
489
		baud = pl2303_encode_baud_rate_divisor(buf, baud);
490

491
	/* Save resulting baud rate */
492
	tty_encode_baud_rate(tty, baud, baud);
493
	dev_dbg(&port->dev, "baud set = %u\n", baud);
494 495
}

496 497 498 499 500 501 502 503 504 505 506 507
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);

508
		if (ret >= 0)
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
			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);
528
	if (ret < 0) {
529 530 531 532 533 534 535 536 537
		dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
		return ret;
	}

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

	return 0;
}

538 539 540 541 542 543 544 545
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;
546
	int ret;
547 548 549 550 551 552 553 554 555 556 557 558 559
	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;
	}

560
	pl2303_get_line_request(port, buf);
561

562 563 564 565 566 567 568 569 570 571 572 573 574
	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;
575
	}
576
	dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
577

578
	/* For reference buf[0]:buf[3] baud rate value */
579
	pl2303_encode_baud_rate(tty, port, &buf[0]);
580

L
Linus Torvalds 已提交
581 582 583
	/* 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 已提交
584 585 586
	if (C_CSTOPB(tty)) {
		/*
		 * NOTE: Comply with "real" UARTs / RS232:
587 588
		 *       use 1.5 instead of 2 stop bits with 5 data bits
		 */
J
Johan Hovold 已提交
589
		if (C_CSIZE(tty) == CS5) {
590
			buf[4] = 1;
591
			dev_dbg(&port->dev, "stop bits = 1.5\n");
592 593
		} else {
			buf[4] = 2;
594
			dev_dbg(&port->dev, "stop bits = 2\n");
595
		}
L
Linus Torvalds 已提交
596 597
	} else {
		buf[4] = 0;
598
		dev_dbg(&port->dev, "stop bits = 1\n");
L
Linus Torvalds 已提交
599 600
	}

J
Johan Hovold 已提交
601
	if (C_PARENB(tty)) {
L
Linus Torvalds 已提交
602 603 604 605 606
		/* 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 已提交
607
		if (C_PARODD(tty)) {
J
Johan Hovold 已提交
608
			if (C_CMSPAR(tty)) {
609
				buf[5] = 3;
610
				dev_dbg(&port->dev, "parity = mark\n");
611 612
			} else {
				buf[5] = 1;
613
				dev_dbg(&port->dev, "parity = odd\n");
614
			}
L
Linus Torvalds 已提交
615
		} else {
J
Johan Hovold 已提交
616
			if (C_CMSPAR(tty)) {
617
				buf[5] = 4;
618
				dev_dbg(&port->dev, "parity = space\n");
619 620
			} else {
				buf[5] = 2;
621
				dev_dbg(&port->dev, "parity = even\n");
622
			}
L
Linus Torvalds 已提交
623 624 625
		}
	} else {
		buf[5] = 0;
626
		dev_dbg(&port->dev, "parity = none\n");
L
Linus Torvalds 已提交
627 628
	}

629 630 631 632 633 634 635 636 637 638 639 640 641
	/*
	 * 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)) {
642 643
		ret = pl2303_set_line_request(port, buf);
		if (!ret)
644 645
			memcpy(priv->line_settings, buf, 7);
	}
L
Linus Torvalds 已提交
646 647 648 649

	/* change control lines if we are switching to or from B0 */
	spin_lock_irqsave(&priv->lock, flags);
	control = priv->line_control;
J
Johan Hovold 已提交
650
	if (C_BAUD(tty) == B0)
L
Linus Torvalds 已提交
651
		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
652
	else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
L
Linus Torvalds 已提交
653 654 655 656
		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
	if (control != priv->line_control) {
		control = priv->line_control;
		spin_unlock_irqrestore(&priv->lock, flags);
657
		pl2303_set_control_lines(port, control);
L
Linus Torvalds 已提交
658 659 660
	} else {
		spin_unlock_irqrestore(&priv->lock, flags);
	}
661

J
Johan Hovold 已提交
662
	if (C_CRTSCTS(tty)) {
663
		if (spriv->quirks & PL2303_QUIRK_LEGACY)
664
			pl2303_vendor_write(serial, 0x0, 0x41);
665 666
		else
			pl2303_vendor_write(serial, 0x0, 0x61);
T
t.sefzick 已提交
667
	} else {
668
		pl2303_vendor_write(serial, 0x0, 0x0);
L
Linus Torvalds 已提交
669
	}
670 671 672 673

	kfree(buf);
}

674 675 676 677 678 679 680 681 682 683 684 685 686
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);
687

688
	pl2303_set_control_lines(port, control);
689 690 691
}

static void pl2303_close(struct usb_serial_port *port)
692
{
J
Johan Hovold 已提交
693
	usb_serial_generic_close(port);
694
	usb_kill_urb(port->interrupt_in_urb);
695
	pl2303_set_break(port, false);
L
Linus Torvalds 已提交
696 697
}

698
static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
L
Linus Torvalds 已提交
699 700
{
	struct usb_serial *serial = port->serial;
701
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
L
Linus Torvalds 已提交
702 703
	int result;

704
	if (spriv->quirks & PL2303_QUIRK_LEGACY) {
705 706
		usb_clear_halt(serial->dev, port->write_urb->pipe);
		usb_clear_halt(serial->dev, port->read_urb->pipe);
707
	} else {
L
Linus Torvalds 已提交
708
		/* reset upstream data pipes */
709 710
		pl2303_vendor_write(serial, 8, 0);
		pl2303_vendor_write(serial, 9, 0);
L
Linus Torvalds 已提交
711 712 713
	}

	/* Setup termios */
A
Alan Cox 已提交
714
	if (tty)
715
		pl2303_set_termios(tty, port, NULL);
L
Linus Torvalds 已提交
716

717
	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
L
Linus Torvalds 已提交
718
	if (result) {
719 720
		dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
			result);
721
		return result;
L
Linus Torvalds 已提交
722
	}
723

724
	result = usb_serial_generic_open(tty, port);
725 726 727 728 729
	if (result) {
		usb_kill_urb(port->interrupt_in_urb);
		return result;
	}

L
Linus Torvalds 已提交
730 731 732
	return 0;
}

733
static int pl2303_tiocmset(struct tty_struct *tty,
734
			   unsigned int set, unsigned int clear)
L
Linus Torvalds 已提交
735
{
A
Alan Cox 已提交
736
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
737 738 739
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	u8 control;
740
	int ret;
F
Flavio Leitner 已提交
741

742
	spin_lock_irqsave(&priv->lock, flags);
L
Linus Torvalds 已提交
743 744 745 746 747 748 749 750 751
	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;
752
	spin_unlock_irqrestore(&priv->lock, flags);
L
Linus Torvalds 已提交
753

754 755 756
	ret = pl2303_set_control_lines(port, control);
	if (ret)
		return usb_translate_errors(ret);
757

758
	return 0;
L
Linus Torvalds 已提交
759 760
}

761
static int pl2303_tiocmget(struct tty_struct *tty)
L
Linus Torvalds 已提交
762
{
A
Alan Cox 已提交
763
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
764 765 766 767 768 769
	struct pl2303_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	unsigned int mcr;
	unsigned int status;
	unsigned int result;

770
	spin_lock_irqsave(&priv->lock, flags);
L
Linus Torvalds 已提交
771 772
	mcr = priv->line_control;
	status = priv->line_status;
773
	spin_unlock_irqrestore(&priv->lock, flags);
L
Linus Torvalds 已提交
774 775 776 777 778 779 780 781

	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);

782
	dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
L
Linus Torvalds 已提交
783 784 785 786

	return result;
}

787 788 789
static int pl2303_carrier_raised(struct usb_serial_port *port)
{
	struct pl2303_private *priv = usb_get_serial_port_data(port);
790

791 792
	if (priv->line_status & UART_DCD)
		return 1;
793

794 795 796
	return 0;
}

797
static int pl2303_ioctl(struct tty_struct *tty,
798
			unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
799
{
800
	struct serial_struct ser;
A
Alan Cox 已提交
801
	struct usb_serial_port *port = tty->driver_data;
802

L
Linus Torvalds 已提交
803
	switch (cmd) {
804 805 806
	case TIOCGSERIAL:
		memset(&ser, 0, sizeof ser);
		ser.type = PORT_16654;
807
		ser.line = port->minor;
808
		ser.port = port->port_number;
809 810 811 812 813 814
		ser.baud_base = 460800;

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

		return 0;
A
Alan Cox 已提交
815 816
	default:
		break;
L
Linus Torvalds 已提交
817
	}
818

L
Linus Torvalds 已提交
819 820 821
	return -ENOIOCTLCMD;
}

822
static void pl2303_set_break(struct usb_serial_port *port, bool enable)
L
Linus Torvalds 已提交
823 824 825 826 827
{
	struct usb_serial *serial = port->serial;
	u16 state;
	int result;

828
	if (enable)
L
Linus Torvalds 已提交
829
		state = BREAK_ON;
830 831
	else
		state = BREAK_OFF;
832

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

836 837 838
	result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
				 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
				 0, NULL, 0, 100);
L
Linus Torvalds 已提交
839
	if (result)
840
		dev_err(&port->dev, "error sending break = %d\n", result);
L
Linus Torvalds 已提交
841 842
}

843 844 845 846 847 848 849
static void pl2303_break_ctl(struct tty_struct *tty, int state)
{
	struct usb_serial_port *port = tty->driver_data;

	pl2303_set_break(port, state);
}

F
Flavio Leitner 已提交
850 851 852 853
static void pl2303_update_line_status(struct usb_serial_port *port,
				      unsigned char *data,
				      unsigned int actual_length)
{
854 855
	struct usb_serial *serial = port->serial;
	struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
F
Flavio Leitner 已提交
856
	struct pl2303_private *priv = usb_get_serial_port_data(port);
857
	struct tty_struct *tty;
F
Flavio Leitner 已提交
858
	unsigned long flags;
859
	unsigned int status_idx = UART_STATE_INDEX;
860 861
	u8 status;
	u8 delta;
F
Flavio Leitner 已提交
862

863 864
	if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
		status_idx = 0;
F
Flavio Leitner 已提交
865

866
	if (actual_length < status_idx + 1)
867
		return;
F
Flavio Leitner 已提交
868

869 870
	status = data[status_idx];

A
Alan Cox 已提交
871
	/* Save off the uart status for others to look at */
F
Flavio Leitner 已提交
872
	spin_lock_irqsave(&priv->lock, flags);
873 874
	delta = priv->line_status ^ status;
	priv->line_status = status;
F
Flavio Leitner 已提交
875
	spin_unlock_irqrestore(&priv->lock, flags);
876

877
	if (status & UART_BREAK_ERROR)
878
		usb_serial_handle_break(port);
879

880
	if (delta & UART_STATE_MSR_MASK) {
881 882 883 884 885 886
		if (delta & UART_CTS)
			port->icount.cts++;
		if (delta & UART_DSR)
			port->icount.dsr++;
		if (delta & UART_RING)
			port->icount.rng++;
887
		if (delta & UART_DCD) {
888
			port->icount.dcd++;
889 890 891
			tty = tty_port_tty_get(&port->port);
			if (tty) {
				usb_serial_handle_dcd_change(port, tty,
892
							status & UART_DCD);
893 894
				tty_kref_put(tty);
			}
895
		}
896 897

		wake_up_interruptible(&port->port.delta_msr_wait);
898
	}
F
Flavio Leitner 已提交
899
}
L
Linus Torvalds 已提交
900

901
static void pl2303_read_int_callback(struct urb *urb)
L
Linus Torvalds 已提交
902
{
903
	struct usb_serial_port *port =  urb->context;
L
Linus Torvalds 已提交
904
	unsigned char *data = urb->transfer_buffer;
F
Flavio Leitner 已提交
905
	unsigned int actual_length = urb->actual_length;
906 907
	int status = urb->status;
	int retval;
L
Linus Torvalds 已提交
908

909
	switch (status) {
L
Linus Torvalds 已提交
910 911 912 913 914 915 916
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
917 918
		dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
			__func__, status);
L
Linus Torvalds 已提交
919 920
		return;
	default:
921 922
		dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
			__func__, status);
L
Linus Torvalds 已提交
923 924 925
		goto exit;
	}

926
	usb_serial_debug_data(&port->dev, __func__,
927 928
			      urb->actual_length, urb->transfer_buffer);

F
Flavio Leitner 已提交
929
	pl2303_update_line_status(port, data, actual_length);
L
Linus Torvalds 已提交
930 931

exit:
932
	retval = usb_submit_urb(urb, GFP_ATOMIC);
933
	if (retval) {
934
		dev_err(&port->dev,
935
			"%s - usb_submit_urb failed with result %d\n",
936
			__func__, retval);
937
	}
L
Linus Torvalds 已提交
938 939
}

940
static void pl2303_process_read_urb(struct urb *urb)
941
{
942 943
	struct usb_serial_port *port = urb->context;
	struct pl2303_private *priv = usb_get_serial_port_data(port);
944 945
	unsigned char *data = urb->transfer_buffer;
	char tty_flag = TTY_NORMAL;
946 947 948 949 950 951 952 953 954 955 956 957 958
	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;

959 960 961 962
	/*
	 * Break takes precedence over parity, which takes precedence over
	 * framing errors.
	 */
963 964 965 966 967 968 969
	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;

970 971 972
	if (tty_flag != TTY_NORMAL)
		dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
								tty_flag);
973 974
	/* overrun is special, not associated with a char */
	if (line_status & UART_OVERRUN_ERROR)
J
Jiri Slaby 已提交
975
		tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
976

977
	if (port->port.console && port->sysrq) {
978
		for (i = 0; i < urb->actual_length; ++i)
979
			if (!usb_serial_handle_sysrq_char(port, data[i]))
J
Jiri Slaby 已提交
980 981
				tty_insert_flip_char(&port->port, data[i],
						tty_flag);
982
	} else {
983
		tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
984
							urb->actual_length);
985
	}
L
Linus Torvalds 已提交
986

J
Jiri Slaby 已提交
987
	tty_flip_buffer_push(&port->port);
L
Linus Torvalds 已提交
988 989
}

990 991 992 993 994 995
static struct usb_serial_driver pl2303_device = {
	.driver = {
		.owner =	THIS_MODULE,
		.name =		"pl2303",
	},
	.id_table =		id_table,
996 997
	.num_bulk_in =		1,
	.num_bulk_out =		1,
998
	.num_interrupt_in =	0,	/* see pl2303_calc_num_ports */
999
	.bulk_in_size =		256,
1000
	.bulk_out_size =	256,
1001 1002
	.open =			pl2303_open,
	.close =		pl2303_close,
1003
	.dtr_rts =		pl2303_dtr_rts,
1004
	.carrier_raised =	pl2303_carrier_raised,
1005 1006 1007 1008 1009
	.ioctl =		pl2303_ioctl,
	.break_ctl =		pl2303_break_ctl,
	.set_termios =		pl2303_set_termios,
	.tiocmget =		pl2303_tiocmget,
	.tiocmset =		pl2303_tiocmset,
1010
	.tiocmiwait =		usb_serial_generic_tiocmiwait,
1011
	.process_read_urb =	pl2303_process_read_urb,
1012
	.read_int_callback =	pl2303_read_int_callback,
1013
	.probe =		pl2303_probe,
1014
	.calc_num_ports =	pl2303_calc_num_ports,
1015
	.attach =		pl2303_startup,
1016
	.release =		pl2303_release,
1017 1018
	.port_probe =		pl2303_port_probe,
	.port_remove =		pl2303_port_remove,
1019
};
L
Linus Torvalds 已提交
1020

1021 1022 1023 1024
static struct usb_serial_driver * const serial_drivers[] = {
	&pl2303_device, NULL
};

1025
module_usb_serial_driver(serial_drivers, id_table);
L
Linus Torvalds 已提交
1026

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