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