]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/usb/serial/pl2303.c
USB: serial: ftdi_sio: Fix broken URL in comment
[mirror_ubuntu-bionic-kernel.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{
365 unsigned int tmp;
366
367 /*
368 * Apparently the formula is:
369 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
370 */
371 tmp = 12000000 * 32 / baud;
372 buf[3] = 0x80;
373 buf[2] = 0;
374 buf[1] = (tmp >= 256);
375 while (tmp >= 256) {
376 tmp >>= 2;
377 buf[1] <<= 1;
378 }
379 buf[0] = tmp;
380
381 return baud;
382}
383
59afe10e
JH
384static void pl2303_encode_baud_rate(struct tty_struct *tty,
385 struct usb_serial_port *port,
386 u8 buf[4])
387{
388 struct usb_serial *serial = port->serial;
389 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
5d85045f 390 speed_t baud_sup;
59afe10e
JH
391 speed_t baud;
392
393 baud = tty_get_baud_rate(tty);
394 dev_dbg(&port->dev, "baud requested = %u\n", baud);
395 if (!baud)
396 return;
871996ed
JH
397
398 if (spriv->type->max_baud_rate)
399 baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
5d85045f 400 /*
399aa9a7 401 * Use direct method for supported baud rates, otherwise use divisors.
5d85045f
JH
402 */
403 baud_sup = pl2303_get_supported_baud_rate(baud);
20b4c787 404
399aa9a7
LH
405 if (baud == baud_sup)
406 baud = pl2303_encode_baud_rate_direct(buf, baud);
5d85045f 407 else
399aa9a7 408 baud = pl2303_encode_baud_rate_divisor(buf, baud);
692ed4dd 409
15e7cead 410 /* Save resulting baud rate */
b2d6d98f 411 tty_encode_baud_rate(tty, baud, baud);
f84ee3b2 412 dev_dbg(&port->dev, "baud set = %u\n", baud);
15e7cead
JH
413}
414
383d19c5
JH
415static int pl2303_get_line_request(struct usb_serial_port *port,
416 unsigned char buf[7])
417{
418 struct usb_device *udev = port->serial->dev;
419 int ret;
420
421 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
422 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
423 0, 0, buf, 7, 100);
424 if (ret != 7) {
425 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
426
427 if (ret > 0)
428 ret = -EIO;
429
430 return ret;
431 }
432
433 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
434
435 return 0;
436}
437
438static int pl2303_set_line_request(struct usb_serial_port *port,
439 unsigned char buf[7])
440{
441 struct usb_device *udev = port->serial->dev;
442 int ret;
443
444 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
445 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
446 0, 0, buf, 7, 100);
447 if (ret != 7) {
448 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
449
450 if (ret > 0)
451 ret = -EIO;
452
453 return ret;
454 }
455
456 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
457
458 return 0;
459}
460
15e7cead
JH
461static void pl2303_set_termios(struct tty_struct *tty,
462 struct usb_serial_port *port, struct ktermios *old_termios)
463{
464 struct usb_serial *serial = port->serial;
465 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
466 struct pl2303_private *priv = usb_get_serial_port_data(port);
467 unsigned long flags;
15e7cead 468 unsigned char *buf;
383d19c5 469 int ret;
15e7cead
JH
470 u8 control;
471
15e7cead
JH
472 if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
473 return;
474
15e7cead
JH
475 buf = kzalloc(7, GFP_KERNEL);
476 if (!buf) {
15e7cead
JH
477 /* Report back no change occurred */
478 if (old_termios)
479 tty->termios = *old_termios;
480 return;
481 }
482
383d19c5 483 pl2303_get_line_request(port, buf);
15e7cead 484
a3132499
CL
485 switch (C_CSIZE(tty)) {
486 case CS5:
487 buf[6] = 5;
488 break;
489 case CS6:
490 buf[6] = 6;
491 break;
492 case CS7:
493 buf[6] = 7;
494 break;
495 default:
496 case CS8:
497 buf[6] = 8;
15e7cead 498 }
a3132499 499 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
15e7cead 500
692ed4dd 501 /* For reference buf[0]:buf[3] baud rate value */
79816824 502 pl2303_encode_baud_rate(tty, port, &buf[0]);
15e7cead 503
1da177e4
LT
504 /* For reference buf[4]=0 is 1 stop bits */
505 /* For reference buf[4]=1 is 1.5 stop bits */
506 /* For reference buf[4]=2 is 2 stop bits */
87265b45
JH
507 if (C_CSTOPB(tty)) {
508 /*
509 * NOTE: Comply with "real" UARTs / RS232:
29cf1b72
FS
510 * use 1.5 instead of 2 stop bits with 5 data bits
511 */
87265b45 512 if (C_CSIZE(tty) == CS5) {
29cf1b72 513 buf[4] = 1;
d8789b2b 514 dev_dbg(&port->dev, "stop bits = 1.5\n");
29cf1b72
FS
515 } else {
516 buf[4] = 2;
d8789b2b 517 dev_dbg(&port->dev, "stop bits = 2\n");
29cf1b72 518 }
1da177e4
LT
519 } else {
520 buf[4] = 0;
d8789b2b 521 dev_dbg(&port->dev, "stop bits = 1\n");
1da177e4
LT
522 }
523
87265b45 524 if (C_PARENB(tty)) {
1da177e4
LT
525 /* For reference buf[5]=0 is none parity */
526 /* For reference buf[5]=1 is odd parity */
527 /* For reference buf[5]=2 is even parity */
528 /* For reference buf[5]=3 is mark parity */
529 /* For reference buf[5]=4 is space parity */
87265b45 530 if (C_PARODD(tty)) {
619c4354 531 if (C_CMSPAR(tty)) {
6dd81b45 532 buf[5] = 3;
d8789b2b 533 dev_dbg(&port->dev, "parity = mark\n");
6dd81b45
FS
534 } else {
535 buf[5] = 1;
d8789b2b 536 dev_dbg(&port->dev, "parity = odd\n");
6dd81b45 537 }
1da177e4 538 } else {
619c4354 539 if (C_CMSPAR(tty)) {
6dd81b45 540 buf[5] = 4;
d8789b2b 541 dev_dbg(&port->dev, "parity = space\n");
6dd81b45
FS
542 } else {
543 buf[5] = 2;
d8789b2b 544 dev_dbg(&port->dev, "parity = even\n");
6dd81b45 545 }
1da177e4
LT
546 }
547 } else {
548 buf[5] = 0;
d8789b2b 549 dev_dbg(&port->dev, "parity = none\n");
1da177e4
LT
550 }
551
623c8263
JH
552 /*
553 * Some PL2303 are known to lose bytes if you change serial settings
554 * even to the same values as before. Thus we actually need to filter
555 * in this specific case.
556 *
557 * Note that the tty_termios_hw_change check above is not sufficient
558 * as a previously requested baud rate may differ from the one
559 * actually used (and stored in old_termios).
560 *
561 * NOTE: No additional locking needed for line_settings as it is
562 * only used in set_termios, which is serialised against itself.
563 */
564 if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
383d19c5
JH
565 ret = pl2303_set_line_request(port, buf);
566 if (!ret)
623c8263
JH
567 memcpy(priv->line_settings, buf, 7);
568 }
1da177e4
LT
569
570 /* change control lines if we are switching to or from B0 */
571 spin_lock_irqsave(&priv->lock, flags);
572 control = priv->line_control;
87265b45 573 if (C_BAUD(tty) == B0)
1da177e4 574 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
2d8f4447 575 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
1da177e4
LT
576 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
577 if (control != priv->line_control) {
578 control = priv->line_control;
579 spin_unlock_irqrestore(&priv->lock, flags);
f45d0a5a 580 pl2303_set_control_lines(port, control);
1da177e4
LT
581 } else {
582 spin_unlock_irqrestore(&priv->lock, flags);
583 }
372db8a7 584
87265b45 585 if (C_CRTSCTS(tty)) {
23c6acb9 586 if (spriv->quirks & PL2303_QUIRK_LEGACY)
362eb026 587 pl2303_vendor_write(serial, 0x0, 0x41);
7f966ac7
JH
588 else
589 pl2303_vendor_write(serial, 0x0, 0x61);
715f9527 590 } else {
362eb026 591 pl2303_vendor_write(serial, 0x0, 0x0);
1da177e4 592 }
572d3138
TG
593
594 kfree(buf);
595}
596
335f8514
AC
597static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
598{
599 struct pl2303_private *priv = usb_get_serial_port_data(port);
600 unsigned long flags;
601 u8 control;
602
603 spin_lock_irqsave(&priv->lock, flags);
335f8514
AC
604 if (on)
605 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
606 else
607 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
608 control = priv->line_control;
609 spin_unlock_irqrestore(&priv->lock, flags);
ccfe8188 610
f45d0a5a 611 pl2303_set_control_lines(port, control);
335f8514
AC
612}
613
614static void pl2303_close(struct usb_serial_port *port)
572d3138 615{
8b0127b2 616 usb_serial_generic_close(port);
572d3138 617 usb_kill_urb(port->interrupt_in_urb);
52772a7f 618 pl2303_set_break(port, false);
1da177e4
LT
619}
620
a509a7e4 621static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
1da177e4 622{
1da177e4 623 struct usb_serial *serial = port->serial;
8bf769eb 624 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
1da177e4
LT
625 int result;
626
23c6acb9 627 if (spriv->quirks & PL2303_QUIRK_LEGACY) {
1694899f
D
628 usb_clear_halt(serial->dev, port->write_urb->pipe);
629 usb_clear_halt(serial->dev, port->read_urb->pipe);
3e152505 630 } else {
1da177e4 631 /* reset upstream data pipes */
362eb026
JH
632 pl2303_vendor_write(serial, 8, 0);
633 pl2303_vendor_write(serial, 9, 0);
1da177e4
LT
634 }
635
1da177e4 636 /* Setup termios */
95da310e 637 if (tty)
2d8f4447 638 pl2303_set_termios(tty, port, NULL);
1da177e4 639
372db8a7 640 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1da177e4 641 if (result) {
ccfe8188
JH
642 dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
643 result);
db6e9186 644 return result;
1da177e4 645 }
d4691c3f 646
f5230a53 647 result = usb_serial_generic_open(tty, port);
d4691c3f
JH
648 if (result) {
649 usb_kill_urb(port->interrupt_in_urb);
650 return result;
651 }
652
1da177e4
LT
653 return 0;
654}
655
20b9d177 656static int pl2303_tiocmset(struct tty_struct *tty,
372db8a7 657 unsigned int set, unsigned int clear)
1da177e4 658{
95da310e 659 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
660 struct pl2303_private *priv = usb_get_serial_port_data(port);
661 unsigned long flags;
662 u8 control;
6f1efd6c 663 int ret;
6fdd8e8e 664
372db8a7 665 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
666 if (set & TIOCM_RTS)
667 priv->line_control |= CONTROL_RTS;
668 if (set & TIOCM_DTR)
669 priv->line_control |= CONTROL_DTR;
670 if (clear & TIOCM_RTS)
671 priv->line_control &= ~CONTROL_RTS;
672 if (clear & TIOCM_DTR)
673 priv->line_control &= ~CONTROL_DTR;
674 control = priv->line_control;
372db8a7 675 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4 676
5ddbb26b
JH
677 ret = pl2303_set_control_lines(port, control);
678 if (ret)
679 return usb_translate_errors(ret);
6f1efd6c 680
5ddbb26b 681 return 0;
1da177e4
LT
682}
683
60b33c13 684static int pl2303_tiocmget(struct tty_struct *tty)
1da177e4 685{
95da310e 686 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
687 struct pl2303_private *priv = usb_get_serial_port_data(port);
688 unsigned long flags;
689 unsigned int mcr;
690 unsigned int status;
691 unsigned int result;
692
372db8a7 693 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
694 mcr = priv->line_control;
695 status = priv->line_status;
372db8a7 696 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
697
698 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
699 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
700 | ((status & UART_CTS) ? TIOCM_CTS : 0)
701 | ((status & UART_DSR) ? TIOCM_DSR : 0)
702 | ((status & UART_RING) ? TIOCM_RI : 0)
703 | ((status & UART_DCD) ? TIOCM_CD : 0);
704
d8789b2b 705 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
1da177e4
LT
706
707 return result;
708}
709
335f8514
AC
710static int pl2303_carrier_raised(struct usb_serial_port *port)
711{
712 struct pl2303_private *priv = usb_get_serial_port_data(port);
ccfe8188 713
335f8514
AC
714 if (priv->line_status & UART_DCD)
715 return 1;
ccfe8188 716
335f8514
AC
717 return 0;
718}
719
00a0d0d6 720static int pl2303_ioctl(struct tty_struct *tty,
372db8a7 721 unsigned int cmd, unsigned long arg)
1da177e4 722{
67b9946d 723 struct serial_struct ser;
95da310e 724 struct usb_serial_port *port = tty->driver_data;
d8789b2b 725
1da177e4 726 switch (cmd) {
67b9946d
JT
727 case TIOCGSERIAL:
728 memset(&ser, 0, sizeof ser);
729 ser.type = PORT_16654;
e5b1e206 730 ser.line = port->minor;
1143832e 731 ser.port = port->port_number;
67b9946d
JT
732 ser.baud_base = 460800;
733
734 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
735 return -EFAULT;
736
737 return 0;
3a0f43e9 738 default:
3a0f43e9 739 break;
1da177e4 740 }
ccfe8188 741
1da177e4
LT
742 return -ENOIOCTLCMD;
743}
744
52772a7f 745static void pl2303_set_break(struct usb_serial_port *port, bool enable)
1da177e4
LT
746{
747 struct usb_serial *serial = port->serial;
748 u16 state;
749 int result;
750
52772a7f 751 if (enable)
1da177e4 752 state = BREAK_ON;
52772a7f
JH
753 else
754 state = BREAK_OFF;
ccfe8188 755
d8789b2b 756 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
3a0f43e9 757 state == BREAK_OFF ? "off" : "on");
1da177e4 758
372db8a7
TG
759 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
760 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
761 0, NULL, 0, 100);
1da177e4 762 if (result)
d8789b2b 763 dev_err(&port->dev, "error sending break = %d\n", result);
1da177e4
LT
764}
765
52772a7f
JH
766static void pl2303_break_ctl(struct tty_struct *tty, int state)
767{
768 struct usb_serial_port *port = tty->driver_data;
769
770 pl2303_set_break(port, state);
771}
772
97bb13ec
FL
773static void pl2303_update_line_status(struct usb_serial_port *port,
774 unsigned char *data,
775 unsigned int actual_length)
776{
228e4105
JH
777 struct usb_serial *serial = port->serial;
778 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
97bb13ec 779 struct pl2303_private *priv = usb_get_serial_port_data(port);
d14fc1a7 780 struct tty_struct *tty;
97bb13ec 781 unsigned long flags;
228e4105 782 unsigned int status_idx = UART_STATE_INDEX;
6020c3be
JH
783 u8 status;
784 u8 delta;
97bb13ec 785
228e4105
JH
786 if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
787 status_idx = 0;
97bb13ec 788
228e4105 789 if (actual_length < status_idx + 1)
a009b75a 790 return;
97bb13ec 791
6020c3be
JH
792 status = data[status_idx];
793
3a0f43e9 794 /* Save off the uart status for others to look at */
97bb13ec 795 spin_lock_irqsave(&priv->lock, flags);
6020c3be
JH
796 delta = priv->line_status ^ status;
797 priv->line_status = status;
97bb13ec 798 spin_unlock_irqrestore(&priv->lock, flags);
ccfe8188 799
6020c3be 800 if (status & UART_BREAK_ERROR)
430eb0d2 801 usb_serial_handle_break(port);
ccfe8188 802
dbfd2866 803 if (delta & UART_STATE_MSR_MASK) {
a4bcb294
JH
804 if (delta & UART_CTS)
805 port->icount.cts++;
806 if (delta & UART_DSR)
807 port->icount.dsr++;
808 if (delta & UART_RING)
809 port->icount.rng++;
dbfd2866 810 if (delta & UART_DCD) {
a4bcb294 811 port->icount.dcd++;
dbfd2866
JH
812 tty = tty_port_tty_get(&port->port);
813 if (tty) {
814 usb_serial_handle_dcd_change(port, tty,
6020c3be 815 status & UART_DCD);
dbfd2866
JH
816 tty_kref_put(tty);
817 }
6020c3be 818 }
dbfd2866
JH
819
820 wake_up_interruptible(&port->port.delta_msr_wait);
6020c3be 821 }
97bb13ec 822}
1da177e4 823
7d12e780 824static void pl2303_read_int_callback(struct urb *urb)
1da177e4 825{
cdc97792 826 struct usb_serial_port *port = urb->context;
1da177e4 827 unsigned char *data = urb->transfer_buffer;
97bb13ec 828 unsigned int actual_length = urb->actual_length;
461d696a
GKH
829 int status = urb->status;
830 int retval;
1da177e4 831
461d696a 832 switch (status) {
1da177e4
LT
833 case 0:
834 /* success */
835 break;
836 case -ECONNRESET:
837 case -ENOENT:
838 case -ESHUTDOWN:
839 /* this urb is terminated, clean up */
d8789b2b
GKH
840 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
841 __func__, status);
1da177e4
LT
842 return;
843 default:
d8789b2b
GKH
844 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
845 __func__, status);
1da177e4
LT
846 goto exit;
847 }
848
59d33f2f 849 usb_serial_debug_data(&port->dev, __func__,
372db8a7
TG
850 urb->actual_length, urb->transfer_buffer);
851
97bb13ec 852 pl2303_update_line_status(port, data, actual_length);
1da177e4 853
1da177e4 854exit:
461d696a 855 retval = usb_submit_urb(urb, GFP_ATOMIC);
ccfe8188 856 if (retval) {
d8789b2b 857 dev_err(&port->dev,
372db8a7 858 "%s - usb_submit_urb failed with result %d\n",
441b62c1 859 __func__, retval);
ccfe8188 860 }
1da177e4
LT
861}
862
f08e07ac 863static void pl2303_process_read_urb(struct urb *urb)
d4fc4a7b 864{
f08e07ac
JH
865 struct usb_serial_port *port = urb->context;
866 struct pl2303_private *priv = usb_get_serial_port_data(port);
d4fc4a7b 867 unsigned char *data = urb->transfer_buffer;
d4fc4a7b 868 char tty_flag = TTY_NORMAL;
f08e07ac
JH
869 unsigned long flags;
870 u8 line_status;
871 int i;
872
873 /* update line status */
874 spin_lock_irqsave(&priv->lock, flags);
875 line_status = priv->line_status;
876 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
877 spin_unlock_irqrestore(&priv->lock, flags);
f08e07ac
JH
878
879 if (!urb->actual_length)
880 return;
881
ccfe8188
JH
882 /*
883 * Break takes precedence over parity, which takes precedence over
884 * framing errors.
885 */
d4fc4a7b
AC
886 if (line_status & UART_BREAK_ERROR)
887 tty_flag = TTY_BREAK;
888 else if (line_status & UART_PARITY_ERROR)
889 tty_flag = TTY_PARITY;
890 else if (line_status & UART_FRAME_ERROR)
891 tty_flag = TTY_FRAME;
d4fc4a7b 892
3ba19fe3
JH
893 if (tty_flag != TTY_NORMAL)
894 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
895 tty_flag);
d4fc4a7b
AC
896 /* overrun is special, not associated with a char */
897 if (line_status & UART_OVERRUN_ERROR)
92a19f9c 898 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
9388e2e7 899
d45cc8df 900 if (port->port.console && port->sysrq) {
d4fc4a7b 901 for (i = 0; i < urb->actual_length; ++i)
6ee9f4b4 902 if (!usb_serial_handle_sysrq_char(port, data[i]))
92a19f9c
JS
903 tty_insert_flip_char(&port->port, data[i],
904 tty_flag);
d45cc8df 905 } else {
2f693357 906 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
d45cc8df 907 urb->actual_length);
9388e2e7 908 }
1da177e4 909
2e124b4a 910 tty_flip_buffer_push(&port->port);
1da177e4
LT
911}
912
572d3138
TG
913static struct usb_serial_driver pl2303_device = {
914 .driver = {
915 .owner = THIS_MODULE,
916 .name = "pl2303",
917 },
918 .id_table = id_table,
572d3138 919 .num_ports = 1,
7919c2fd 920 .bulk_in_size = 256,
3efeaff6 921 .bulk_out_size = 256,
572d3138
TG
922 .open = pl2303_open,
923 .close = pl2303_close,
ccfe8188 924 .dtr_rts = pl2303_dtr_rts,
335f8514 925 .carrier_raised = pl2303_carrier_raised,
572d3138
TG
926 .ioctl = pl2303_ioctl,
927 .break_ctl = pl2303_break_ctl,
928 .set_termios = pl2303_set_termios,
929 .tiocmget = pl2303_tiocmget,
930 .tiocmset = pl2303_tiocmset,
a4bcb294 931 .tiocmiwait = usb_serial_generic_tiocmiwait,
f08e07ac 932 .process_read_urb = pl2303_process_read_urb,
572d3138 933 .read_int_callback = pl2303_read_int_callback,
228e4105 934 .probe = pl2303_probe,
572d3138 935 .attach = pl2303_startup,
f9c99bb8 936 .release = pl2303_release,
8bf769eb
JH
937 .port_probe = pl2303_port_probe,
938 .port_remove = pl2303_port_remove,
572d3138 939};
1da177e4 940
f667ddad
AS
941static struct usb_serial_driver * const serial_drivers[] = {
942 &pl2303_device, NULL
943};
944
68e24113 945module_usb_serial_driver(serial_drivers, id_table);
1da177e4 946
ccfe8188 947MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
1da177e4 948MODULE_LICENSE("GPL");