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