Merge branch 'mymd/for-next' into mymd/for-linus
[deliverable/linux.git] / drivers / usb / serial / pl2303.c
CommitLineData
1da177e4
LT
1/*
2 * Prolific PL2303 USB to serial adaptor driver
3 *
4d0dce3e 4 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
1da177e4
LT
5 * Copyright (C) 2003 IBM Corp.
6 *
7 * Original driver for 2.2.x by anonymous
8 *
4d0dce3e
GKH
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.
1da177e4 12 *
3a0f43e9
AC
13 * See Documentation/usb/usb-serial.txt for more information on using this
14 * driver
1da177e4
LT
15 */
16
1da177e4
LT
17#include <linux/kernel.h>
18#include <linux/errno.h>
1da177e4
LT
19#include <linux/slab.h>
20#include <linux/tty.h>
21#include <linux/tty_driver.h>
22#include <linux/tty_flip.h>
23#include <linux/serial.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/spinlock.h>
3a0f43e9 27#include <linux/uaccess.h>
1da177e4 28#include <linux/usb.h>
a969888c 29#include <linux/usb/serial.h>
b2d6d98f 30#include <asm/unaligned.h>
1da177e4
LT
31#include "pl2303.h"
32
228e4105
JH
33
34#define PL2303_QUIRK_UART_STATE_IDX0 BIT(0)
23c6acb9 35#define PL2303_QUIRK_LEGACY BIT(1)
228e4105 36
7d40d7e8 37static const struct usb_device_id id_table[] = {
1da177e4
LT
38 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
39 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
3d861494 40 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
1da177e4
LT
41 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
42 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
b483b6aa 43 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
4be2fa18 44 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
727df356 45 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
18344a1c 46 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
96a3e79e 47 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
91fcb1ce 48 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
1da177e4 49 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
8a28dea3 50 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
1da177e4
LT
51 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
52 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
53 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
54 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
55 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
58381719 56 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
1da177e4
LT
57 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
58 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
59 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
60 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
61 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
62 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
63 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
228e4105
JH
64 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1),
65 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
66 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65),
67 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
68 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75),
69 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
e7beb667 70 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
912299f6 71 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
acbb36f1 72 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
c6c27721
CL
73 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
74 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
6cceb05f 75 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
c6c27721 76 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
491b04ce 77 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
3b928474 78 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
b7aa94b6 79 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
8fd80133 80 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
2d94b981 81 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
9e3285db 82 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
cc311ee7 83 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
7c992001 84 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
af4b8514 85 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
b16c02fb
AS
86 { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
87 { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
88 { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
8540d666 89 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
f36ecd5d 90 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
49276560 91 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
35904e6b 92 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
9a61d726 93 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
598f0b70 94 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
1da177e4
LT
95 { } /* Terminating entry */
96};
97
372db8a7 98MODULE_DEVICE_TABLE(usb, id_table);
1da177e4 99
1da177e4
LT
100#define SET_LINE_REQUEST_TYPE 0x21
101#define SET_LINE_REQUEST 0x20
102
103#define SET_CONTROL_REQUEST_TYPE 0x21
104#define SET_CONTROL_REQUEST 0x22
105#define CONTROL_DTR 0x01
106#define CONTROL_RTS 0x02
107
108#define BREAK_REQUEST_TYPE 0x21
3a0f43e9 109#define BREAK_REQUEST 0x23
1da177e4
LT
110#define BREAK_ON 0xffff
111#define BREAK_OFF 0x0000
112
113#define GET_LINE_REQUEST_TYPE 0xa1
114#define GET_LINE_REQUEST 0x21
115
116#define VENDOR_WRITE_REQUEST_TYPE 0x40
117#define VENDOR_WRITE_REQUEST 0x01
118
119#define VENDOR_READ_REQUEST_TYPE 0xc0
120#define VENDOR_READ_REQUEST 0x01
121
228e4105 122#define UART_STATE_INDEX 8
dbfd2866 123#define UART_STATE_MSR_MASK 0x8b
1da177e4
LT
124#define UART_STATE_TRANSIENT_MASK 0x74
125#define UART_DCD 0x01
126#define UART_DSR 0x02
127#define UART_BREAK_ERROR 0x04
128#define UART_RING 0x08
129#define UART_FRAME_ERROR 0x10
130#define UART_PARITY_ERROR 0x20
131#define UART_OVERRUN_ERROR 0x40
132#define UART_CTS 0x80
133
52772a7f 134static void pl2303_set_break(struct usb_serial_port *port, bool enable);
1da177e4
LT
135
136enum pl2303_type {
7f966ac7
JH
137 TYPE_01, /* Type 0 and 1 (difference unknown) */
138 TYPE_HX, /* HX version of the pl2303 chip */
359defda
JH
139 TYPE_COUNT
140};
141
142struct pl2303_type_data {
143 speed_t max_baud_rate;
144 unsigned long quirks;
1da177e4
LT
145};
146
8bf769eb 147struct pl2303_serial_private {
b6934681 148 const struct pl2303_type_data *type;
228e4105 149 unsigned long quirks;
8bf769eb
JH
150};
151
1da177e4
LT
152struct pl2303_private {
153 spinlock_t lock;
1da177e4
LT
154 u8 line_control;
155 u8 line_status;
623c8263
JH
156
157 u8 line_settings[7];
1da177e4
LT
158};
159
b6934681 160static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
359defda
JH
161 [TYPE_01] = {
162 .max_baud_rate = 1228800,
163 .quirks = PL2303_QUIRK_LEGACY,
164 },
399aa9a7
LH
165 [TYPE_HX] = {
166 .max_baud_rate = 12000000,
167 },
359defda
JH
168};
169
362eb026
JH
170static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
171 unsigned char buf[1])
eb44da0b 172{
362eb026 173 struct device *dev = &serial->interface->dev;
ccfe8188
JH
174 int res;
175
176 res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
eb44da0b 177 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
362eb026
JH
178 value, 0, buf, 1, 100);
179 if (res != 1) {
180 dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__,
181 value, res);
182 if (res >= 0)
183 res = -EIO;
184
185 return res;
186 }
ccfe8188 187
362eb026 188 dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]);
ccfe8188 189
362eb026 190 return 0;
eb44da0b
SS
191}
192
362eb026 193static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
eb44da0b 194{
362eb026 195 struct device *dev = &serial->interface->dev;
ccfe8188
JH
196 int res;
197
362eb026
JH
198 dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index);
199
ccfe8188 200 res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
eb44da0b
SS
201 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
202 value, index, NULL, 0, 100);
362eb026
JH
203 if (res) {
204 dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
205 value, res);
206 return res;
207 }
ccfe8188 208
362eb026 209 return 0;
eb44da0b
SS
210}
211
228e4105
JH
212static int pl2303_probe(struct usb_serial *serial,
213 const struct usb_device_id *id)
214{
215 usb_set_serial_data(serial, (void *)id->driver_info);
216
217 return 0;
218}
219
372db8a7 220static int pl2303_startup(struct usb_serial *serial)
1da177e4 221{
8bf769eb 222 struct pl2303_serial_private *spriv;
7f966ac7 223 enum pl2303_type type = TYPE_01;
3e152505 224 unsigned char *buf;
8bf769eb
JH
225
226 spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
227 if (!spriv)
228 return -ENOMEM;
1da177e4 229
362eb026 230 buf = kmalloc(1, GFP_KERNEL);
8bf769eb
JH
231 if (!buf) {
232 kfree(spriv);
3e152505 233 return -ENOMEM;
8bf769eb 234 }
3e152505 235
b52e1113 236 if (serial->dev->descriptor.bDeviceClass == 0x02)
7f966ac7 237 type = TYPE_01; /* type 0 */
b52e1113 238 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
7f966ac7 239 type = TYPE_HX;
281393ad 240 else if (serial->dev->descriptor.bDeviceClass == 0x00)
7f966ac7 241 type = TYPE_01; /* type 1 */
281393ad 242 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
7f966ac7 243 type = TYPE_01; /* type 1 */
b52e1113 244 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
1da177e4 245
359defda 246 spriv->type = &pl2303_type_data[type];
228e4105 247 spriv->quirks = (unsigned long)usb_get_serial_data(serial);
359defda 248 spriv->quirks |= spriv->type->quirks;
228e4105 249
8bf769eb 250 usb_set_serial_data(serial, spriv);
3e152505 251
362eb026
JH
252 pl2303_vendor_read(serial, 0x8484, buf);
253 pl2303_vendor_write(serial, 0x0404, 0);
254 pl2303_vendor_read(serial, 0x8484, buf);
255 pl2303_vendor_read(serial, 0x8383, buf);
256 pl2303_vendor_read(serial, 0x8484, buf);
257 pl2303_vendor_write(serial, 0x0404, 1);
258 pl2303_vendor_read(serial, 0x8484, buf);
259 pl2303_vendor_read(serial, 0x8383, buf);
260 pl2303_vendor_write(serial, 0, 1);
261 pl2303_vendor_write(serial, 1, 0);
23c6acb9 262 if (spriv->quirks & PL2303_QUIRK_LEGACY)
362eb026 263 pl2303_vendor_write(serial, 2, 0x24);
7f966ac7
JH
264 else
265 pl2303_vendor_write(serial, 2, 0x44);
3e152505
SS
266
267 kfree(buf);
ccfe8188 268
1da177e4 269 return 0;
8bf769eb 270}
1da177e4 271
8bf769eb
JH
272static void pl2303_release(struct usb_serial *serial)
273{
ccfe8188 274 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
8bf769eb 275
8bf769eb
JH
276 kfree(spriv);
277}
278
279static int pl2303_port_probe(struct usb_serial_port *port)
280{
281 struct pl2303_private *priv;
282
283 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
284 if (!priv)
285 return -ENOMEM;
286
287 spin_lock_init(&priv->lock);
8bf769eb
JH
288
289 usb_set_serial_port_data(port, priv);
290
d7be6221
JH
291 port->port.drain_delay = 256;
292
8bf769eb
JH
293 return 0;
294}
295
296static int pl2303_port_remove(struct usb_serial_port *port)
297{
ccfe8188 298 struct pl2303_private *priv = usb_get_serial_port_data(port);
8bf769eb 299
8bf769eb
JH
300 kfree(priv);
301
302 return 0;
1da177e4
LT
303}
304
f45d0a5a 305static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
1da177e4 306{
f45d0a5a 307 struct usb_device *dev = port->serial->dev;
1da177e4 308 int retval;
3a0f43e9 309
a6ec8245
JH
310 dev_dbg(&port->dev, "%s - %02x\n", __func__, value);
311
372db8a7
TG
312 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
313 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
314 value, 0, NULL, 0, 100);
a6ec8245
JH
315 if (retval)
316 dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
ccfe8188 317
1da177e4
LT
318 return retval;
319}
320
59afe10e 321/*
5d85045f
JH
322 * Returns the nearest supported baud rate that can be set directly without
323 * using divisors.
59afe10e
JH
324 */
325static speed_t pl2303_get_supported_baud_rate(speed_t baud)
1da177e4 326{
59afe10e
JH
327 static const speed_t baud_sup[] = {
328 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
329 14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
5d85045f 330 614400, 921600, 1228800, 2457600, 3000000, 6000000
59afe10e 331 };
1da177e4 332
59afe10e 333 unsigned i;
692ed4dd 334
7e12a6fc
GKH
335 for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
336 if (baud_sup[i] > baud)
337 break;
338 }
692ed4dd 339
7e12a6fc
GKH
340 if (i == ARRAY_SIZE(baud_sup))
341 baud = baud_sup[i - 1];
342 else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
343 baud = baud_sup[i - 1];
344 else
345 baud = baud_sup[i];
692ed4dd 346
59afe10e
JH
347 return baud;
348}
349
20b4c787
JH
350/*
351 * NOTE: If unsupported baud rates are set directly, the PL2303 seems to
352 * use 9600 baud.
353 */
354static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
355 speed_t baud)
356{
357 put_unaligned_le32(baud, buf);
358
359 return baud;
360}
361
c82c6d45
JH
362static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
363 speed_t baud)
364{
49bda212 365 unsigned int baseline, mantissa, exponent;
c82c6d45
JH
366
367 /*
368 * Apparently the formula is:
49bda212
MP
369 * baudrate = 12M * 32 / (mantissa * 4^exponent)
370 * where
371 * mantissa = buf[8:0]
372 * exponent = buf[11:9]
c82c6d45 373 */
49bda212
MP
374 baseline = 12000000 * 32;
375 mantissa = baseline / baud;
376 if (mantissa == 0)
377 mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */
378 exponent = 0;
379 while (mantissa >= 512) {
380 if (exponent < 7) {
381 mantissa >>= 2; /* divide by 4 */
382 exponent++;
383 } else {
384 /* Exponent is maxed. Trim mantissa and leave. */
385 mantissa = 511;
386 break;
387 }
388 }
389
c82c6d45
JH
390 buf[3] = 0x80;
391 buf[2] = 0;
49bda212
MP
392 buf[1] = exponent << 1 | mantissa >> 8;
393 buf[0] = mantissa & 0xff;
394
395 /* Calculate and return the exact baud rate. */
396 baud = (baseline / mantissa) >> (exponent << 1);
c82c6d45
JH
397
398 return baud;
399}
400
59afe10e
JH
401static void pl2303_encode_baud_rate(struct tty_struct *tty,
402 struct usb_serial_port *port,
403 u8 buf[4])
404{
405 struct usb_serial *serial = port->serial;
406 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
5d85045f 407 speed_t baud_sup;
59afe10e
JH
408 speed_t baud;
409
410 baud = tty_get_baud_rate(tty);
411 dev_dbg(&port->dev, "baud requested = %u\n", baud);
412 if (!baud)
413 return;
871996ed
JH
414
415 if (spriv->type->max_baud_rate)
416 baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
5d85045f 417 /*
399aa9a7 418 * Use direct method for supported baud rates, otherwise use divisors.
5d85045f
JH
419 */
420 baud_sup = pl2303_get_supported_baud_rate(baud);
20b4c787 421
399aa9a7
LH
422 if (baud == baud_sup)
423 baud = pl2303_encode_baud_rate_direct(buf, baud);
5d85045f 424 else
399aa9a7 425 baud = pl2303_encode_baud_rate_divisor(buf, baud);
692ed4dd 426
15e7cead 427 /* Save resulting baud rate */
b2d6d98f 428 tty_encode_baud_rate(tty, baud, baud);
f84ee3b2 429 dev_dbg(&port->dev, "baud set = %u\n", baud);
15e7cead
JH
430}
431
383d19c5
JH
432static int pl2303_get_line_request(struct usb_serial_port *port,
433 unsigned char buf[7])
434{
435 struct usb_device *udev = port->serial->dev;
436 int ret;
437
438 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
439 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
440 0, 0, buf, 7, 100);
441 if (ret != 7) {
442 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
443
444 if (ret > 0)
445 ret = -EIO;
446
447 return ret;
448 }
449
450 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
451
452 return 0;
453}
454
455static int pl2303_set_line_request(struct usb_serial_port *port,
456 unsigned char buf[7])
457{
458 struct usb_device *udev = port->serial->dev;
459 int ret;
460
461 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
462 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
463 0, 0, buf, 7, 100);
464 if (ret != 7) {
465 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
466
467 if (ret > 0)
468 ret = -EIO;
469
470 return ret;
471 }
472
473 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
474
475 return 0;
476}
477
15e7cead
JH
478static void pl2303_set_termios(struct tty_struct *tty,
479 struct usb_serial_port *port, struct ktermios *old_termios)
480{
481 struct usb_serial *serial = port->serial;
482 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
483 struct pl2303_private *priv = usb_get_serial_port_data(port);
484 unsigned long flags;
15e7cead 485 unsigned char *buf;
383d19c5 486 int ret;
15e7cead
JH
487 u8 control;
488
15e7cead
JH
489 if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
490 return;
491
15e7cead
JH
492 buf = kzalloc(7, GFP_KERNEL);
493 if (!buf) {
15e7cead
JH
494 /* Report back no change occurred */
495 if (old_termios)
496 tty->termios = *old_termios;
497 return;
498 }
499
383d19c5 500 pl2303_get_line_request(port, buf);
15e7cead 501
a3132499
CL
502 switch (C_CSIZE(tty)) {
503 case CS5:
504 buf[6] = 5;
505 break;
506 case CS6:
507 buf[6] = 6;
508 break;
509 case CS7:
510 buf[6] = 7;
511 break;
512 default:
513 case CS8:
514 buf[6] = 8;
15e7cead 515 }
a3132499 516 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
15e7cead 517
692ed4dd 518 /* For reference buf[0]:buf[3] baud rate value */
79816824 519 pl2303_encode_baud_rate(tty, port, &buf[0]);
15e7cead 520
1da177e4
LT
521 /* For reference buf[4]=0 is 1 stop bits */
522 /* For reference buf[4]=1 is 1.5 stop bits */
523 /* For reference buf[4]=2 is 2 stop bits */
87265b45
JH
524 if (C_CSTOPB(tty)) {
525 /*
526 * NOTE: Comply with "real" UARTs / RS232:
29cf1b72
FS
527 * use 1.5 instead of 2 stop bits with 5 data bits
528 */
87265b45 529 if (C_CSIZE(tty) == CS5) {
29cf1b72 530 buf[4] = 1;
d8789b2b 531 dev_dbg(&port->dev, "stop bits = 1.5\n");
29cf1b72
FS
532 } else {
533 buf[4] = 2;
d8789b2b 534 dev_dbg(&port->dev, "stop bits = 2\n");
29cf1b72 535 }
1da177e4
LT
536 } else {
537 buf[4] = 0;
d8789b2b 538 dev_dbg(&port->dev, "stop bits = 1\n");
1da177e4
LT
539 }
540
87265b45 541 if (C_PARENB(tty)) {
1da177e4
LT
542 /* For reference buf[5]=0 is none parity */
543 /* For reference buf[5]=1 is odd parity */
544 /* For reference buf[5]=2 is even parity */
545 /* For reference buf[5]=3 is mark parity */
546 /* For reference buf[5]=4 is space parity */
87265b45 547 if (C_PARODD(tty)) {
619c4354 548 if (C_CMSPAR(tty)) {
6dd81b45 549 buf[5] = 3;
d8789b2b 550 dev_dbg(&port->dev, "parity = mark\n");
6dd81b45
FS
551 } else {
552 buf[5] = 1;
d8789b2b 553 dev_dbg(&port->dev, "parity = odd\n");
6dd81b45 554 }
1da177e4 555 } else {
619c4354 556 if (C_CMSPAR(tty)) {
6dd81b45 557 buf[5] = 4;
d8789b2b 558 dev_dbg(&port->dev, "parity = space\n");
6dd81b45
FS
559 } else {
560 buf[5] = 2;
d8789b2b 561 dev_dbg(&port->dev, "parity = even\n");
6dd81b45 562 }
1da177e4
LT
563 }
564 } else {
565 buf[5] = 0;
d8789b2b 566 dev_dbg(&port->dev, "parity = none\n");
1da177e4
LT
567 }
568
623c8263
JH
569 /*
570 * Some PL2303 are known to lose bytes if you change serial settings
571 * even to the same values as before. Thus we actually need to filter
572 * in this specific case.
573 *
574 * Note that the tty_termios_hw_change check above is not sufficient
575 * as a previously requested baud rate may differ from the one
576 * actually used (and stored in old_termios).
577 *
578 * NOTE: No additional locking needed for line_settings as it is
579 * only used in set_termios, which is serialised against itself.
580 */
581 if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
383d19c5
JH
582 ret = pl2303_set_line_request(port, buf);
583 if (!ret)
623c8263
JH
584 memcpy(priv->line_settings, buf, 7);
585 }
1da177e4
LT
586
587 /* change control lines if we are switching to or from B0 */
588 spin_lock_irqsave(&priv->lock, flags);
589 control = priv->line_control;
87265b45 590 if (C_BAUD(tty) == B0)
1da177e4 591 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
2d8f4447 592 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
1da177e4
LT
593 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
594 if (control != priv->line_control) {
595 control = priv->line_control;
596 spin_unlock_irqrestore(&priv->lock, flags);
f45d0a5a 597 pl2303_set_control_lines(port, control);
1da177e4
LT
598 } else {
599 spin_unlock_irqrestore(&priv->lock, flags);
600 }
372db8a7 601
87265b45 602 if (C_CRTSCTS(tty)) {
23c6acb9 603 if (spriv->quirks & PL2303_QUIRK_LEGACY)
362eb026 604 pl2303_vendor_write(serial, 0x0, 0x41);
7f966ac7
JH
605 else
606 pl2303_vendor_write(serial, 0x0, 0x61);
715f9527 607 } else {
362eb026 608 pl2303_vendor_write(serial, 0x0, 0x0);
1da177e4 609 }
572d3138
TG
610
611 kfree(buf);
612}
613
335f8514
AC
614static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
615{
616 struct pl2303_private *priv = usb_get_serial_port_data(port);
617 unsigned long flags;
618 u8 control;
619
620 spin_lock_irqsave(&priv->lock, flags);
335f8514
AC
621 if (on)
622 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
623 else
624 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
625 control = priv->line_control;
626 spin_unlock_irqrestore(&priv->lock, flags);
ccfe8188 627
f45d0a5a 628 pl2303_set_control_lines(port, control);
335f8514
AC
629}
630
631static void pl2303_close(struct usb_serial_port *port)
572d3138 632{
8b0127b2 633 usb_serial_generic_close(port);
572d3138 634 usb_kill_urb(port->interrupt_in_urb);
52772a7f 635 pl2303_set_break(port, false);
1da177e4
LT
636}
637
a509a7e4 638static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
1da177e4 639{
1da177e4 640 struct usb_serial *serial = port->serial;
8bf769eb 641 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
1da177e4
LT
642 int result;
643
23c6acb9 644 if (spriv->quirks & PL2303_QUIRK_LEGACY) {
1694899f
D
645 usb_clear_halt(serial->dev, port->write_urb->pipe);
646 usb_clear_halt(serial->dev, port->read_urb->pipe);
3e152505 647 } else {
1da177e4 648 /* reset upstream data pipes */
362eb026
JH
649 pl2303_vendor_write(serial, 8, 0);
650 pl2303_vendor_write(serial, 9, 0);
1da177e4
LT
651 }
652
1da177e4 653 /* Setup termios */
95da310e 654 if (tty)
2d8f4447 655 pl2303_set_termios(tty, port, NULL);
1da177e4 656
372db8a7 657 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1da177e4 658 if (result) {
ccfe8188
JH
659 dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
660 result);
db6e9186 661 return result;
1da177e4 662 }
d4691c3f 663
f5230a53 664 result = usb_serial_generic_open(tty, port);
d4691c3f
JH
665 if (result) {
666 usb_kill_urb(port->interrupt_in_urb);
667 return result;
668 }
669
1da177e4
LT
670 return 0;
671}
672
20b9d177 673static int pl2303_tiocmset(struct tty_struct *tty,
372db8a7 674 unsigned int set, unsigned int clear)
1da177e4 675{
95da310e 676 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
677 struct pl2303_private *priv = usb_get_serial_port_data(port);
678 unsigned long flags;
679 u8 control;
6f1efd6c 680 int ret;
6fdd8e8e 681
372db8a7 682 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
683 if (set & TIOCM_RTS)
684 priv->line_control |= CONTROL_RTS;
685 if (set & TIOCM_DTR)
686 priv->line_control |= CONTROL_DTR;
687 if (clear & TIOCM_RTS)
688 priv->line_control &= ~CONTROL_RTS;
689 if (clear & TIOCM_DTR)
690 priv->line_control &= ~CONTROL_DTR;
691 control = priv->line_control;
372db8a7 692 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4 693
5ddbb26b
JH
694 ret = pl2303_set_control_lines(port, control);
695 if (ret)
696 return usb_translate_errors(ret);
6f1efd6c 697
5ddbb26b 698 return 0;
1da177e4
LT
699}
700
60b33c13 701static int pl2303_tiocmget(struct tty_struct *tty)
1da177e4 702{
95da310e 703 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
704 struct pl2303_private *priv = usb_get_serial_port_data(port);
705 unsigned long flags;
706 unsigned int mcr;
707 unsigned int status;
708 unsigned int result;
709
372db8a7 710 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
711 mcr = priv->line_control;
712 status = priv->line_status;
372db8a7 713 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
714
715 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
716 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
717 | ((status & UART_CTS) ? TIOCM_CTS : 0)
718 | ((status & UART_DSR) ? TIOCM_DSR : 0)
719 | ((status & UART_RING) ? TIOCM_RI : 0)
720 | ((status & UART_DCD) ? TIOCM_CD : 0);
721
d8789b2b 722 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
1da177e4
LT
723
724 return result;
725}
726
335f8514
AC
727static int pl2303_carrier_raised(struct usb_serial_port *port)
728{
729 struct pl2303_private *priv = usb_get_serial_port_data(port);
ccfe8188 730
335f8514
AC
731 if (priv->line_status & UART_DCD)
732 return 1;
ccfe8188 733
335f8514
AC
734 return 0;
735}
736
00a0d0d6 737static int pl2303_ioctl(struct tty_struct *tty,
372db8a7 738 unsigned int cmd, unsigned long arg)
1da177e4 739{
67b9946d 740 struct serial_struct ser;
95da310e 741 struct usb_serial_port *port = tty->driver_data;
d8789b2b 742
1da177e4 743 switch (cmd) {
67b9946d
JT
744 case TIOCGSERIAL:
745 memset(&ser, 0, sizeof ser);
746 ser.type = PORT_16654;
e5b1e206 747 ser.line = port->minor;
1143832e 748 ser.port = port->port_number;
67b9946d
JT
749 ser.baud_base = 460800;
750
751 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
752 return -EFAULT;
753
754 return 0;
3a0f43e9 755 default:
3a0f43e9 756 break;
1da177e4 757 }
ccfe8188 758
1da177e4
LT
759 return -ENOIOCTLCMD;
760}
761
52772a7f 762static void pl2303_set_break(struct usb_serial_port *port, bool enable)
1da177e4
LT
763{
764 struct usb_serial *serial = port->serial;
765 u16 state;
766 int result;
767
52772a7f 768 if (enable)
1da177e4 769 state = BREAK_ON;
52772a7f
JH
770 else
771 state = BREAK_OFF;
ccfe8188 772
d8789b2b 773 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
3a0f43e9 774 state == BREAK_OFF ? "off" : "on");
1da177e4 775
372db8a7
TG
776 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
777 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
778 0, NULL, 0, 100);
1da177e4 779 if (result)
d8789b2b 780 dev_err(&port->dev, "error sending break = %d\n", result);
1da177e4
LT
781}
782
52772a7f
JH
783static void pl2303_break_ctl(struct tty_struct *tty, int state)
784{
785 struct usb_serial_port *port = tty->driver_data;
786
787 pl2303_set_break(port, state);
788}
789
97bb13ec
FL
790static void pl2303_update_line_status(struct usb_serial_port *port,
791 unsigned char *data,
792 unsigned int actual_length)
793{
228e4105
JH
794 struct usb_serial *serial = port->serial;
795 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
97bb13ec 796 struct pl2303_private *priv = usb_get_serial_port_data(port);
d14fc1a7 797 struct tty_struct *tty;
97bb13ec 798 unsigned long flags;
228e4105 799 unsigned int status_idx = UART_STATE_INDEX;
6020c3be
JH
800 u8 status;
801 u8 delta;
97bb13ec 802
228e4105
JH
803 if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
804 status_idx = 0;
97bb13ec 805
228e4105 806 if (actual_length < status_idx + 1)
a009b75a 807 return;
97bb13ec 808
6020c3be
JH
809 status = data[status_idx];
810
3a0f43e9 811 /* Save off the uart status for others to look at */
97bb13ec 812 spin_lock_irqsave(&priv->lock, flags);
6020c3be
JH
813 delta = priv->line_status ^ status;
814 priv->line_status = status;
97bb13ec 815 spin_unlock_irqrestore(&priv->lock, flags);
ccfe8188 816
6020c3be 817 if (status & UART_BREAK_ERROR)
430eb0d2 818 usb_serial_handle_break(port);
ccfe8188 819
dbfd2866 820 if (delta & UART_STATE_MSR_MASK) {
a4bcb294
JH
821 if (delta & UART_CTS)
822 port->icount.cts++;
823 if (delta & UART_DSR)
824 port->icount.dsr++;
825 if (delta & UART_RING)
826 port->icount.rng++;
dbfd2866 827 if (delta & UART_DCD) {
a4bcb294 828 port->icount.dcd++;
dbfd2866
JH
829 tty = tty_port_tty_get(&port->port);
830 if (tty) {
831 usb_serial_handle_dcd_change(port, tty,
6020c3be 832 status & UART_DCD);
dbfd2866
JH
833 tty_kref_put(tty);
834 }
6020c3be 835 }
dbfd2866
JH
836
837 wake_up_interruptible(&port->port.delta_msr_wait);
6020c3be 838 }
97bb13ec 839}
1da177e4 840
7d12e780 841static void pl2303_read_int_callback(struct urb *urb)
1da177e4 842{
cdc97792 843 struct usb_serial_port *port = urb->context;
1da177e4 844 unsigned char *data = urb->transfer_buffer;
97bb13ec 845 unsigned int actual_length = urb->actual_length;
461d696a
GKH
846 int status = urb->status;
847 int retval;
1da177e4 848
461d696a 849 switch (status) {
1da177e4
LT
850 case 0:
851 /* success */
852 break;
853 case -ECONNRESET:
854 case -ENOENT:
855 case -ESHUTDOWN:
856 /* this urb is terminated, clean up */
d8789b2b
GKH
857 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
858 __func__, status);
1da177e4
LT
859 return;
860 default:
d8789b2b
GKH
861 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
862 __func__, status);
1da177e4
LT
863 goto exit;
864 }
865
59d33f2f 866 usb_serial_debug_data(&port->dev, __func__,
372db8a7
TG
867 urb->actual_length, urb->transfer_buffer);
868
97bb13ec 869 pl2303_update_line_status(port, data, actual_length);
1da177e4 870
1da177e4 871exit:
461d696a 872 retval = usb_submit_urb(urb, GFP_ATOMIC);
ccfe8188 873 if (retval) {
d8789b2b 874 dev_err(&port->dev,
372db8a7 875 "%s - usb_submit_urb failed with result %d\n",
441b62c1 876 __func__, retval);
ccfe8188 877 }
1da177e4
LT
878}
879
f08e07ac 880static void pl2303_process_read_urb(struct urb *urb)
d4fc4a7b 881{
f08e07ac
JH
882 struct usb_serial_port *port = urb->context;
883 struct pl2303_private *priv = usb_get_serial_port_data(port);
d4fc4a7b 884 unsigned char *data = urb->transfer_buffer;
d4fc4a7b 885 char tty_flag = TTY_NORMAL;
f08e07ac
JH
886 unsigned long flags;
887 u8 line_status;
888 int i;
889
890 /* update line status */
891 spin_lock_irqsave(&priv->lock, flags);
892 line_status = priv->line_status;
893 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
894 spin_unlock_irqrestore(&priv->lock, flags);
f08e07ac
JH
895
896 if (!urb->actual_length)
897 return;
898
ccfe8188
JH
899 /*
900 * Break takes precedence over parity, which takes precedence over
901 * framing errors.
902 */
d4fc4a7b
AC
903 if (line_status & UART_BREAK_ERROR)
904 tty_flag = TTY_BREAK;
905 else if (line_status & UART_PARITY_ERROR)
906 tty_flag = TTY_PARITY;
907 else if (line_status & UART_FRAME_ERROR)
908 tty_flag = TTY_FRAME;
d4fc4a7b 909
3ba19fe3
JH
910 if (tty_flag != TTY_NORMAL)
911 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
912 tty_flag);
d4fc4a7b
AC
913 /* overrun is special, not associated with a char */
914 if (line_status & UART_OVERRUN_ERROR)
92a19f9c 915 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
9388e2e7 916
d45cc8df 917 if (port->port.console && port->sysrq) {
d4fc4a7b 918 for (i = 0; i < urb->actual_length; ++i)
6ee9f4b4 919 if (!usb_serial_handle_sysrq_char(port, data[i]))
92a19f9c
JS
920 tty_insert_flip_char(&port->port, data[i],
921 tty_flag);
d45cc8df 922 } else {
2f693357 923 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
d45cc8df 924 urb->actual_length);
9388e2e7 925 }
1da177e4 926
2e124b4a 927 tty_flip_buffer_push(&port->port);
1da177e4
LT
928}
929
572d3138
TG
930static struct usb_serial_driver pl2303_device = {
931 .driver = {
932 .owner = THIS_MODULE,
933 .name = "pl2303",
934 },
935 .id_table = id_table,
572d3138 936 .num_ports = 1,
7919c2fd 937 .bulk_in_size = 256,
3efeaff6 938 .bulk_out_size = 256,
572d3138
TG
939 .open = pl2303_open,
940 .close = pl2303_close,
ccfe8188 941 .dtr_rts = pl2303_dtr_rts,
335f8514 942 .carrier_raised = pl2303_carrier_raised,
572d3138
TG
943 .ioctl = pl2303_ioctl,
944 .break_ctl = pl2303_break_ctl,
945 .set_termios = pl2303_set_termios,
946 .tiocmget = pl2303_tiocmget,
947 .tiocmset = pl2303_tiocmset,
a4bcb294 948 .tiocmiwait = usb_serial_generic_tiocmiwait,
f08e07ac 949 .process_read_urb = pl2303_process_read_urb,
572d3138 950 .read_int_callback = pl2303_read_int_callback,
228e4105 951 .probe = pl2303_probe,
572d3138 952 .attach = pl2303_startup,
f9c99bb8 953 .release = pl2303_release,
8bf769eb
JH
954 .port_probe = pl2303_port_probe,
955 .port_remove = pl2303_port_remove,
572d3138 956};
1da177e4 957
f667ddad
AS
958static struct usb_serial_driver * const serial_drivers[] = {
959 &pl2303_device, NULL
960};
961
68e24113 962module_usb_serial_driver(serial_drivers, id_table);
1da177e4 963
ccfe8188 964MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
1da177e4 965MODULE_LICENSE("GPL");
This page took 1.052018 seconds and 5 git commands to generate.