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