]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/usb/serial/pl2303.c
USB: cp210x: fix port-data memory leak
[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 15 *
1da177e4
LT
16 */
17
1da177e4
LT
18#include <linux/kernel.h>
19#include <linux/errno.h>
20#include <linux/init.h>
21#include <linux/slab.h>
22#include <linux/tty.h>
23#include <linux/tty_driver.h>
24#include <linux/tty_flip.h>
25#include <linux/serial.h>
26#include <linux/module.h>
27#include <linux/moduleparam.h>
28#include <linux/spinlock.h>
3a0f43e9 29#include <linux/uaccess.h>
1da177e4 30#include <linux/usb.h>
a969888c 31#include <linux/usb/serial.h>
1da177e4
LT
32#include "pl2303.h"
33
34/*
35 * Version Information
36 */
1da177e4
LT
37#define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
38
7d40d7e8 39static const struct usb_device_id id_table[] = {
1da177e4
LT
40 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
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) },
1da177e4 50 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
8a28dea3 51 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
1da177e4
LT
52 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
53 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
54 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
55 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
56 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
58381719 57 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
1da177e4
LT
58 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
59 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
60 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
61 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
62 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
63 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
64 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
65 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
a8310f3b 66 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
1da177e4 67 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
a8310f3b 68 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
e7beb667 69 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
912299f6 70 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
acbb36f1 71 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
c6c27721
CL
72 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
73 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
6cceb05f 74 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
c6c27721 75 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
491b04ce 76 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
3b928474 77 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
b7aa94b6 78 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
8fd80133 79 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
2d94b981 80 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
9e3285db 81 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
cc311ee7 82 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
7c992001 83 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
af4b8514 84 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
8540d666 85 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
f36ecd5d 86 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
49276560 87 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
35904e6b 88 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
9a61d726 89 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
598f0b70 90 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
1da177e4
LT
91 { } /* Terminating entry */
92};
93
372db8a7 94MODULE_DEVICE_TABLE(usb, id_table);
1da177e4 95
1da177e4
LT
96#define SET_LINE_REQUEST_TYPE 0x21
97#define SET_LINE_REQUEST 0x20
98
99#define SET_CONTROL_REQUEST_TYPE 0x21
100#define SET_CONTROL_REQUEST 0x22
101#define CONTROL_DTR 0x01
102#define CONTROL_RTS 0x02
103
104#define BREAK_REQUEST_TYPE 0x21
3a0f43e9 105#define BREAK_REQUEST 0x23
1da177e4
LT
106#define BREAK_ON 0xffff
107#define BREAK_OFF 0x0000
108
109#define GET_LINE_REQUEST_TYPE 0xa1
110#define GET_LINE_REQUEST 0x21
111
112#define VENDOR_WRITE_REQUEST_TYPE 0x40
113#define VENDOR_WRITE_REQUEST 0x01
114
115#define VENDOR_READ_REQUEST_TYPE 0xc0
116#define VENDOR_READ_REQUEST 0x01
117
118#define UART_STATE 0x08
119#define UART_STATE_TRANSIENT_MASK 0x74
120#define UART_DCD 0x01
121#define UART_DSR 0x02
122#define UART_BREAK_ERROR 0x04
123#define UART_RING 0x08
124#define UART_FRAME_ERROR 0x10
125#define UART_PARITY_ERROR 0x20
126#define UART_OVERRUN_ERROR 0x40
127#define UART_CTS 0x80
128
1da177e4
LT
129
130enum pl2303_type {
131 type_0, /* don't know the difference between type 0 and */
132 type_1, /* type 1, until someone from prolific tells us... */
133 HX, /* HX version of the pl2303 chip */
134};
135
136struct pl2303_private {
137 spinlock_t lock;
1da177e4
LT
138 wait_queue_head_t delta_msr_wait;
139 u8 line_control;
140 u8 line_status;
1da177e4
LT
141 enum pl2303_type type;
142};
143
eb44da0b
SS
144static int pl2303_vendor_read(__u16 value, __u16 index,
145 struct usb_serial *serial, unsigned char *buf)
146{
147 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
148 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
149 value, index, buf, 1, 100);
d8789b2b
GKH
150 dev_dbg(&serial->dev->dev, "0x%x:0x%x:0x%x:0x%x %d - %x\n",
151 VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, value, index,
152 res, buf[0]);
eb44da0b
SS
153 return res;
154}
155
156static int pl2303_vendor_write(__u16 value, __u16 index,
157 struct usb_serial *serial)
158{
159 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
160 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
161 value, index, NULL, 0, 100);
d8789b2b
GKH
162 dev_dbg(&serial->dev->dev, "0x%x:0x%x:0x%x:0x%x %d\n",
163 VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, value, index,
164 res);
eb44da0b
SS
165 return res;
166}
167
372db8a7 168static int pl2303_startup(struct usb_serial *serial)
1da177e4
LT
169{
170 struct pl2303_private *priv;
171 enum pl2303_type type = type_0;
3e152505 172 unsigned char *buf;
1da177e4
LT
173 int i;
174
3e152505
SS
175 buf = kmalloc(10, GFP_KERNEL);
176 if (buf == NULL)
177 return -ENOMEM;
178
1da177e4
LT
179 if (serial->dev->descriptor.bDeviceClass == 0x02)
180 type = type_0;
181 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
182 type = HX;
183 else if (serial->dev->descriptor.bDeviceClass == 0x00)
184 type = type_1;
185 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
186 type = type_1;
d8789b2b 187 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
1da177e4
LT
188
189 for (i = 0; i < serial->num_ports; ++i) {
80b6ca48 190 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
1da177e4
LT
191 if (!priv)
192 goto cleanup;
1da177e4 193 spin_lock_init(&priv->lock);
1da177e4
LT
194 init_waitqueue_head(&priv->delta_msr_wait);
195 priv->type = type;
196 usb_set_serial_port_data(serial->port[i], priv);
197 }
3e152505
SS
198
199 pl2303_vendor_read(0x8484, 0, serial, buf);
200 pl2303_vendor_write(0x0404, 0, serial);
201 pl2303_vendor_read(0x8484, 0, serial, buf);
202 pl2303_vendor_read(0x8383, 0, serial, buf);
203 pl2303_vendor_read(0x8484, 0, serial, buf);
204 pl2303_vendor_write(0x0404, 1, serial);
205 pl2303_vendor_read(0x8484, 0, serial, buf);
206 pl2303_vendor_read(0x8383, 0, serial, buf);
207 pl2303_vendor_write(0, 1, serial);
208 pl2303_vendor_write(1, 0, serial);
209 if (type == HX)
210 pl2303_vendor_write(2, 0x44, serial);
211 else
212 pl2303_vendor_write(2, 0x24, serial);
213
214 kfree(buf);
1da177e4
LT
215 return 0;
216
217cleanup:
3e152505 218 kfree(buf);
3a0f43e9 219 for (--i; i >= 0; --i) {
1da177e4 220 priv = usb_get_serial_port_data(serial->port[i]);
1da177e4
LT
221 kfree(priv);
222 usb_set_serial_port_data(serial->port[i], NULL);
223 }
224 return -ENOMEM;
225}
226
372db8a7 227static int set_control_lines(struct usb_device *dev, u8 value)
1da177e4
LT
228{
229 int retval;
3a0f43e9 230
372db8a7
TG
231 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
232 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
233 value, 0, NULL, 0, 100);
d8789b2b
GKH
234 dev_dbg(&dev->dev, "%s - value = %d, retval = %d\n", __func__,
235 value, retval);
1da177e4
LT
236 return retval;
237}
238
95da310e
AC
239static void pl2303_set_termios(struct tty_struct *tty,
240 struct usb_serial_port *port, struct ktermios *old_termios)
1da177e4
LT
241{
242 struct usb_serial *serial = port->serial;
243 struct pl2303_private *priv = usb_get_serial_port_data(port);
244 unsigned long flags;
245 unsigned int cflag;
246 unsigned char *buf;
247 int baud;
248 int i;
249 u8 control;
25b82868
FS
250 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
251 4800, 7200, 9600, 14400, 19200, 28800, 38400,
252 57600, 115200, 230400, 460800, 614400,
253 921600, 1228800, 2457600, 3000000, 6000000 };
254 int baud_floor, baud_ceil;
255 int k;
1da177e4 256
bf5e5834
AC
257 /* The PL2303 is reported to lose bytes if you change
258 serial settings even to the same values as before. Thus
259 we actually need to filter in this specific case */
260
adc8d746 261 if (!tty_termios_hw_change(&tty->termios, old_termios))
bf5e5834
AC
262 return;
263
adc8d746 264 cflag = tty->termios.c_cflag;
1da177e4 265
372db8a7 266 buf = kzalloc(7, GFP_KERNEL);
1da177e4 267 if (!buf) {
441b62c1 268 dev_err(&port->dev, "%s - out of memory.\n", __func__);
a5b6f60c 269 /* Report back no change occurred */
adc8d746 270 tty->termios = *old_termios;
1da177e4
LT
271 return;
272 }
1da177e4 273
372db8a7
TG
274 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
275 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
276 0, 0, buf, 7, 100);
d8789b2b 277 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x\n", i,
372db8a7 278 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
1da177e4
LT
279
280 if (cflag & CSIZE) {
281 switch (cflag & CSIZE) {
3a0f43e9
AC
282 case CS5:
283 buf[6] = 5;
284 break;
285 case CS6:
286 buf[6] = 6;
287 break;
288 case CS7:
289 buf[6] = 7;
290 break;
291 default:
292 case CS8:
293 buf[6] = 8;
294 break;
1da177e4 295 }
d8789b2b 296 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
1da177e4
LT
297 }
298
25b82868
FS
299 /* For reference buf[0]:buf[3] baud rate value */
300 /* NOTE: Only the values defined in baud_sup are supported !
301 * => if unsupported values are set, the PL2303 seems to use
302 * 9600 baud (at least my PL2303X always does)
303 */
95da310e 304 baud = tty_get_baud_rate(tty);
d8789b2b 305 dev_dbg(&port->dev, "baud requested = %d\n", baud);
1da177e4 306 if (baud) {
25b82868
FS
307 /* Set baudrate to nearest supported value */
308 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
309 if (baud_sup[k] / baud) {
310 baud_ceil = baud_sup[k];
311 if (k==0) {
312 baud = baud_ceil;
313 } else {
314 baud_floor = baud_sup[k-1];
315 if ((baud_ceil % baud)
316 > (baud % baud_floor))
317 baud = baud_floor;
318 else
319 baud = baud_ceil;
320 }
321 break;
322 }
323 }
324 if (baud > 1228800) {
325 /* type_0, type_1 only support up to 1228800 baud */
326 if (priv->type != HX)
327 baud = 1228800;
328 else if (baud > 6000000)
329 baud = 6000000;
330 }
d8789b2b 331 dev_dbg(&port->dev, "baud set = %d\n", baud);
8d48fdf6
MS
332 if (baud <= 115200) {
333 buf[0] = baud & 0xff;
334 buf[1] = (baud >> 8) & 0xff;
335 buf[2] = (baud >> 16) & 0xff;
336 buf[3] = (baud >> 24) & 0xff;
337 } else {
338 /* apparently the formula for higher speeds is:
339 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
340 */
341 unsigned tmp = 12*1000*1000*32 / baud;
342 buf[3] = 0x80;
343 buf[2] = 0;
344 buf[1] = (tmp >= 256);
345 while (tmp >= 256) {
346 tmp >>= 2;
347 buf[1] <<= 1;
348 }
8d48fdf6
MS
349 buf[0] = tmp;
350 }
1da177e4
LT
351 }
352
353 /* For reference buf[4]=0 is 1 stop bits */
354 /* For reference buf[4]=1 is 1.5 stop bits */
355 /* For reference buf[4]=2 is 2 stop bits */
356 if (cflag & CSTOPB) {
29cf1b72
FS
357 /* NOTE: Comply with "real" UARTs / RS232:
358 * use 1.5 instead of 2 stop bits with 5 data bits
359 */
360 if ((cflag & CSIZE) == CS5) {
361 buf[4] = 1;
d8789b2b 362 dev_dbg(&port->dev, "stop bits = 1.5\n");
29cf1b72
FS
363 } else {
364 buf[4] = 2;
d8789b2b 365 dev_dbg(&port->dev, "stop bits = 2\n");
29cf1b72 366 }
1da177e4
LT
367 } else {
368 buf[4] = 0;
d8789b2b 369 dev_dbg(&port->dev, "stop bits = 1\n");
1da177e4
LT
370 }
371
372 if (cflag & PARENB) {
373 /* For reference buf[5]=0 is none parity */
374 /* For reference buf[5]=1 is odd parity */
375 /* For reference buf[5]=2 is even parity */
376 /* For reference buf[5]=3 is mark parity */
377 /* For reference buf[5]=4 is space parity */
378 if (cflag & PARODD) {
6dd81b45
FS
379 if (cflag & CMSPAR) {
380 buf[5] = 3;
d8789b2b 381 dev_dbg(&port->dev, "parity = mark\n");
6dd81b45
FS
382 } else {
383 buf[5] = 1;
d8789b2b 384 dev_dbg(&port->dev, "parity = odd\n");
6dd81b45 385 }
1da177e4 386 } else {
6dd81b45
FS
387 if (cflag & CMSPAR) {
388 buf[5] = 4;
d8789b2b 389 dev_dbg(&port->dev, "parity = space\n");
6dd81b45
FS
390 } else {
391 buf[5] = 2;
d8789b2b 392 dev_dbg(&port->dev, "parity = even\n");
6dd81b45 393 }
1da177e4
LT
394 }
395 } else {
396 buf[5] = 0;
d8789b2b 397 dev_dbg(&port->dev, "parity = none\n");
1da177e4
LT
398 }
399
372db8a7
TG
400 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
401 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
402 0, 0, buf, 7, 100);
d8789b2b 403 dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i);
1da177e4
LT
404
405 /* change control lines if we are switching to or from B0 */
406 spin_lock_irqsave(&priv->lock, flags);
407 control = priv->line_control;
408 if ((cflag & CBAUD) == B0)
409 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
ce5c9851 410 else if ((old_termios->c_cflag & CBAUD) == B0)
1da177e4
LT
411 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
412 if (control != priv->line_control) {
413 control = priv->line_control;
414 spin_unlock_irqrestore(&priv->lock, flags);
415 set_control_lines(serial->dev, control);
416 } else {
417 spin_unlock_irqrestore(&priv->lock, flags);
418 }
372db8a7 419
1da177e4
LT
420 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
421
372db8a7
TG
422 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
423 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
424 0, 0, buf, 7, 100);
d8789b2b 425 dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x\n", i,
1da177e4
LT
426 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
427
428 if (cflag & CRTSCTS) {
1da177e4 429 if (priv->type == HX)
eb44da0b 430 pl2303_vendor_write(0x0, 0x61, serial);
1da177e4 431 else
eb44da0b 432 pl2303_vendor_write(0x0, 0x41, serial);
715f9527 433 } else {
eb44da0b 434 pl2303_vendor_write(0x0, 0x0, serial);
1da177e4 435 }
572d3138 436
25b82868 437 /* Save resulting baud rate */
df64c471 438 if (baud)
95da310e 439 tty_encode_baud_rate(tty, baud, baud);
df64c471 440
572d3138
TG
441 kfree(buf);
442}
443
335f8514
AC
444static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
445{
446 struct pl2303_private *priv = usb_get_serial_port_data(port);
447 unsigned long flags;
448 u8 control;
449
450 spin_lock_irqsave(&priv->lock, flags);
451 /* Change DTR and RTS */
452 if (on)
453 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
454 else
455 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
456 control = priv->line_control;
457 spin_unlock_irqrestore(&priv->lock, flags);
458 set_control_lines(port->serial->dev, control);
459}
460
461static void pl2303_close(struct usb_serial_port *port)
572d3138 462{
8b0127b2 463 usb_serial_generic_close(port);
572d3138 464 usb_kill_urb(port->interrupt_in_urb);
1da177e4
LT
465}
466
a509a7e4 467static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
1da177e4 468{
606d099c 469 struct ktermios tmp_termios;
1da177e4
LT
470 struct usb_serial *serial = port->serial;
471 struct pl2303_private *priv = usb_get_serial_port_data(port);
1da177e4
LT
472 int result;
473
1694899f
D
474 if (priv->type != HX) {
475 usb_clear_halt(serial->dev, port->write_urb->pipe);
476 usb_clear_halt(serial->dev, port->read_urb->pipe);
3e152505 477 } else {
1da177e4 478 /* reset upstream data pipes */
eb44da0b
SS
479 pl2303_vendor_write(8, 0, serial);
480 pl2303_vendor_write(9, 0, serial);
1da177e4
LT
481 }
482
1da177e4 483 /* Setup termios */
95da310e
AC
484 if (tty)
485 pl2303_set_termios(tty, port, &tmp_termios);
1da177e4 486
372db8a7 487 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
1da177e4 488 if (result) {
372db8a7 489 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
441b62c1 490 " error %d\n", __func__, result);
db6e9186 491 return result;
1da177e4 492 }
d4691c3f 493
f5230a53 494 result = usb_serial_generic_open(tty, port);
d4691c3f
JH
495 if (result) {
496 usb_kill_urb(port->interrupt_in_urb);
497 return result;
498 }
499
335f8514 500 port->port.drain_delay = 256;
1da177e4
LT
501 return 0;
502}
503
20b9d177 504static int pl2303_tiocmset(struct tty_struct *tty,
372db8a7 505 unsigned int set, unsigned int clear)
1da177e4 506{
95da310e 507 struct usb_serial_port *port = tty->driver_data;
6f1efd6c 508 struct usb_serial *serial = port->serial;
1da177e4
LT
509 struct pl2303_private *priv = usb_get_serial_port_data(port);
510 unsigned long flags;
511 u8 control;
6f1efd6c 512 int ret;
6fdd8e8e 513
372db8a7 514 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
515 if (set & TIOCM_RTS)
516 priv->line_control |= CONTROL_RTS;
517 if (set & TIOCM_DTR)
518 priv->line_control |= CONTROL_DTR;
519 if (clear & TIOCM_RTS)
520 priv->line_control &= ~CONTROL_RTS;
521 if (clear & TIOCM_DTR)
522 priv->line_control &= ~CONTROL_DTR;
523 control = priv->line_control;
372db8a7 524 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4 525
6f1efd6c
JH
526 mutex_lock(&serial->disc_mutex);
527 if (!serial->disconnected)
528 ret = set_control_lines(serial->dev, control);
529 else
530 ret = -ENODEV;
531 mutex_unlock(&serial->disc_mutex);
532
533 return ret;
1da177e4
LT
534}
535
60b33c13 536static int pl2303_tiocmget(struct tty_struct *tty)
1da177e4 537{
95da310e 538 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
539 struct pl2303_private *priv = usb_get_serial_port_data(port);
540 unsigned long flags;
541 unsigned int mcr;
542 unsigned int status;
543 unsigned int result;
544
372db8a7 545 spin_lock_irqsave(&priv->lock, flags);
1da177e4
LT
546 mcr = priv->line_control;
547 status = priv->line_status;
372db8a7 548 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
549
550 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
551 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
552 | ((status & UART_CTS) ? TIOCM_CTS : 0)
553 | ((status & UART_DSR) ? TIOCM_DSR : 0)
554 | ((status & UART_RING) ? TIOCM_RI : 0)
555 | ((status & UART_DCD) ? TIOCM_CD : 0);
556
d8789b2b 557 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
1da177e4
LT
558
559 return result;
560}
561
335f8514
AC
562static int pl2303_carrier_raised(struct usb_serial_port *port)
563{
564 struct pl2303_private *priv = usb_get_serial_port_data(port);
565 if (priv->line_status & UART_DCD)
566 return 1;
567 return 0;
568}
569
1da177e4
LT
570static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
571{
572 struct pl2303_private *priv = usb_get_serial_port_data(port);
573 unsigned long flags;
574 unsigned int prevstatus;
575 unsigned int status;
576 unsigned int changed;
577
372db8a7 578 spin_lock_irqsave(&priv->lock, flags);
1da177e4 579 prevstatus = priv->line_status;
372db8a7 580 spin_unlock_irqrestore(&priv->lock, flags);
1da177e4
LT
581
582 while (1) {
583 interruptible_sleep_on(&priv->delta_msr_wait);
584 /* see if a signal did it */
585 if (signal_pending(current))
586 return -ERESTARTSYS;
372db8a7
TG
587
588 spin_lock_irqsave(&priv->lock, flags);
1da177e4 589 status = priv->line_status;
372db8a7
TG
590 spin_unlock_irqrestore(&priv->lock, flags);
591
3a0f43e9 592 changed = prevstatus ^ status;
372db8a7 593
1da177e4
LT
594 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
595 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
596 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
3a0f43e9 597 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
1da177e4
LT
598 return 0;
599 }
600 prevstatus = status;
601 }
602 /* NOTREACHED */
603 return 0;
604}
605
00a0d0d6 606static int pl2303_ioctl(struct tty_struct *tty,
372db8a7 607 unsigned int cmd, unsigned long arg)
1da177e4 608{
67b9946d 609 struct serial_struct ser;
95da310e 610 struct usb_serial_port *port = tty->driver_data;
d8789b2b
GKH
611
612 dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd);
1da177e4
LT
613
614 switch (cmd) {
67b9946d
JT
615 case TIOCGSERIAL:
616 memset(&ser, 0, sizeof ser);
617 ser.type = PORT_16654;
618 ser.line = port->serial->minor;
619 ser.port = port->number;
620 ser.baud_base = 460800;
621
622 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
623 return -EFAULT;
624
625 return 0;
626
3a0f43e9 627 case TIOCMIWAIT:
d8789b2b 628 dev_dbg(&port->dev, "%s TIOCMIWAIT\n", __func__);
3a0f43e9
AC
629 return wait_modem_info(port, arg);
630 default:
d8789b2b 631 dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd);
3a0f43e9 632 break;
1da177e4 633 }
1da177e4
LT
634 return -ENOIOCTLCMD;
635}
636
95da310e 637static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
1da177e4 638{
95da310e 639 struct usb_serial_port *port = tty->driver_data;
1da177e4
LT
640 struct usb_serial *serial = port->serial;
641 u16 state;
642 int result;
643
1da177e4
LT
644 if (break_state == 0)
645 state = BREAK_OFF;
646 else
647 state = BREAK_ON;
d8789b2b 648 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
3a0f43e9 649 state == BREAK_OFF ? "off" : "on");
1da177e4 650
372db8a7
TG
651 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
652 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
653 0, NULL, 0, 100);
1da177e4 654 if (result)
d8789b2b 655 dev_err(&port->dev, "error sending break = %d\n", result);
1da177e4
LT
656}
657
f9c99bb8 658static void pl2303_release(struct usb_serial *serial)
1da177e4
LT
659{
660 int i;
661 struct pl2303_private *priv;
662
1da177e4
LT
663 for (i = 0; i < serial->num_ports; ++i) {
664 priv = usb_get_serial_port_data(serial->port[i]);
684c6e30 665 kfree(priv);
372db8a7 666 }
1da177e4
LT
667}
668
97bb13ec
FL
669static void pl2303_update_line_status(struct usb_serial_port *port,
670 unsigned char *data,
671 unsigned int actual_length)
672{
673
674 struct pl2303_private *priv = usb_get_serial_port_data(port);
d14fc1a7 675 struct tty_struct *tty;
97bb13ec
FL
676 unsigned long flags;
677 u8 status_idx = UART_STATE;
95f209f9 678 u8 length = UART_STATE + 1;
d14fc1a7 679 u8 prev_line_status;
9c537616 680 u16 idv, idp;
97bb13ec 681
9c537616
TG
682 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
683 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
684
685
686 if (idv == SIEMENS_VENDOR_ID) {
687 if (idp == SIEMENS_PRODUCT_ID_X65 ||
688 idp == SIEMENS_PRODUCT_ID_SX1 ||
689 idp == SIEMENS_PRODUCT_ID_X75) {
690
691 length = 1;
692 status_idx = 0;
693 }
97bb13ec
FL
694 }
695
696 if (actual_length < length)
a009b75a 697 return;
97bb13ec 698
3a0f43e9 699 /* Save off the uart status for others to look at */
97bb13ec 700 spin_lock_irqsave(&priv->lock, flags);
d14fc1a7 701 prev_line_status = priv->line_status;
97bb13ec
FL
702 priv->line_status = data[status_idx];
703 spin_unlock_irqrestore(&priv->lock, flags);
430eb0d2
JW
704 if (priv->line_status & UART_BREAK_ERROR)
705 usb_serial_handle_break(port);
372db8a7 706 wake_up_interruptible(&priv->delta_msr_wait);
d14fc1a7
LP
707
708 tty = tty_port_tty_get(&port->port);
709 if (!tty)
710 return;
711 if ((priv->line_status ^ prev_line_status) & UART_DCD)
712 usb_serial_handle_dcd_change(port, tty,
713 priv->line_status & UART_DCD);
714 tty_kref_put(tty);
97bb13ec 715}
1da177e4 716
7d12e780 717static void pl2303_read_int_callback(struct urb *urb)
1da177e4 718{
cdc97792 719 struct usb_serial_port *port = urb->context;
1da177e4 720 unsigned char *data = urb->transfer_buffer;
97bb13ec 721 unsigned int actual_length = urb->actual_length;
461d696a
GKH
722 int status = urb->status;
723 int retval;
1da177e4 724
461d696a 725 switch (status) {
1da177e4
LT
726 case 0:
727 /* success */
728 break;
729 case -ECONNRESET:
730 case -ENOENT:
731 case -ESHUTDOWN:
732 /* this urb is terminated, clean up */
d8789b2b
GKH
733 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
734 __func__, status);
1da177e4
LT
735 return;
736 default:
d8789b2b
GKH
737 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
738 __func__, status);
1da177e4
LT
739 goto exit;
740 }
741
59d33f2f 742 usb_serial_debug_data(&port->dev, __func__,
372db8a7
TG
743 urb->actual_length, urb->transfer_buffer);
744
97bb13ec 745 pl2303_update_line_status(port, data, actual_length);
1da177e4 746
1da177e4 747exit:
461d696a
GKH
748 retval = usb_submit_urb(urb, GFP_ATOMIC);
749 if (retval)
d8789b2b 750 dev_err(&port->dev,
372db8a7 751 "%s - usb_submit_urb failed with result %d\n",
441b62c1 752 __func__, retval);
1da177e4
LT
753}
754
f08e07ac 755static void pl2303_process_read_urb(struct urb *urb)
d4fc4a7b 756{
f08e07ac
JH
757 struct usb_serial_port *port = urb->context;
758 struct pl2303_private *priv = usb_get_serial_port_data(port);
759 struct tty_struct *tty;
d4fc4a7b 760 unsigned char *data = urb->transfer_buffer;
d4fc4a7b 761 char tty_flag = TTY_NORMAL;
f08e07ac
JH
762 unsigned long flags;
763 u8 line_status;
764 int i;
765
766 /* update line status */
767 spin_lock_irqsave(&priv->lock, flags);
768 line_status = priv->line_status;
769 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
770 spin_unlock_irqrestore(&priv->lock, flags);
771 wake_up_interruptible(&priv->delta_msr_wait);
772
773 if (!urb->actual_length)
774 return;
775
776 tty = tty_port_tty_get(&port->port);
777 if (!tty)
778 return;
779
d4fc4a7b
AC
780 /* break takes precedence over parity, */
781 /* which takes precedence over framing errors */
782 if (line_status & UART_BREAK_ERROR)
783 tty_flag = TTY_BREAK;
784 else if (line_status & UART_PARITY_ERROR)
785 tty_flag = TTY_PARITY;
786 else if (line_status & UART_FRAME_ERROR)
787 tty_flag = TTY_FRAME;
d8789b2b 788 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__, tty_flag);
d4fc4a7b 789
d4fc4a7b
AC
790 /* overrun is special, not associated with a char */
791 if (line_status & UART_OVERRUN_ERROR)
792 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
9388e2e7 793
d45cc8df 794 if (port->port.console && port->sysrq) {
d4fc4a7b 795 for (i = 0; i < urb->actual_length; ++i)
6ee9f4b4 796 if (!usb_serial_handle_sysrq_char(port, data[i]))
d4fc4a7b 797 tty_insert_flip_char(tty, data[i], tty_flag);
d45cc8df
JH
798 } else {
799 tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
800 urb->actual_length);
9388e2e7 801 }
1da177e4 802
f08e07ac 803 tty_flip_buffer_push(tty);
4a90f09b 804 tty_kref_put(tty);
1da177e4
LT
805}
806
572d3138
TG
807/* All of the device info needed for the PL2303 SIO serial converter */
808static struct usb_serial_driver pl2303_device = {
809 .driver = {
810 .owner = THIS_MODULE,
811 .name = "pl2303",
812 },
813 .id_table = id_table,
572d3138 814 .num_ports = 1,
7919c2fd 815 .bulk_in_size = 256,
3efeaff6 816 .bulk_out_size = 256,
572d3138
TG
817 .open = pl2303_open,
818 .close = pl2303_close,
335f8514
AC
819 .dtr_rts = pl2303_dtr_rts,
820 .carrier_raised = pl2303_carrier_raised,
572d3138
TG
821 .ioctl = pl2303_ioctl,
822 .break_ctl = pl2303_break_ctl,
823 .set_termios = pl2303_set_termios,
824 .tiocmget = pl2303_tiocmget,
825 .tiocmset = pl2303_tiocmset,
f08e07ac 826 .process_read_urb = pl2303_process_read_urb,
572d3138 827 .read_int_callback = pl2303_read_int_callback,
572d3138 828 .attach = pl2303_startup,
f9c99bb8 829 .release = pl2303_release,
572d3138 830};
1da177e4 831
f667ddad
AS
832static struct usb_serial_driver * const serial_drivers[] = {
833 &pl2303_device, NULL
834};
835
68e24113 836module_usb_serial_driver(serial_drivers, id_table);
1da177e4
LT
837
838MODULE_DESCRIPTION(DRIVER_DESC);
1da177e4 839MODULE_LICENSE("GPL");