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