Loading...
1/*
2 * Prolific PL2303 USB to serial adaptor driver
3 *
4 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
5 * Copyright (C) 2003 IBM Corp.
6 *
7 * Original driver for 2.2.x by anonymous
8 *
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.
12 *
13 * See Documentation/usb/usb-serial.txt for more information on using this
14 * driver
15 *
16 */
17
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>
29#include <linux/uaccess.h>
30#include <linux/usb.h>
31#include <linux/usb/serial.h>
32#include "pl2303.h"
33
34/*
35 * Version Information
36 */
37#define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver"
38
39static int debug;
40
41#define PL2303_CLOSING_WAIT (30*HZ)
42
43static const struct usb_device_id id_table[] = {
44 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
45 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
46 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
47 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
48 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
49 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
50 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
51 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
52 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
53 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
54 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
55 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
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) },
61 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
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) },
70 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
71 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
72 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
73 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) },
74 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
75 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
76 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
77 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
78 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
79 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
80 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
81 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
82 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
83 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID) },
84 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
85 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
86 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
87 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
88 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
89 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
90 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
91 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
92 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
93 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
94 { USB_DEVICE(WINCHIPHEAD_VENDOR_ID, WINCHIPHEAD_USBSER_PRODUCT_ID) },
95 { } /* Terminating entry */
96};
97
98MODULE_DEVICE_TABLE(usb, id_table);
99
100static struct usb_driver pl2303_driver = {
101 .name = "pl2303",
102 .probe = usb_serial_probe,
103 .disconnect = usb_serial_disconnect,
104 .id_table = id_table,
105 .suspend = usb_serial_suspend,
106 .resume = usb_serial_resume,
107 .no_dynamic_id = 1,
108 .supports_autosuspend = 1,
109};
110
111#define SET_LINE_REQUEST_TYPE 0x21
112#define SET_LINE_REQUEST 0x20
113
114#define SET_CONTROL_REQUEST_TYPE 0x21
115#define SET_CONTROL_REQUEST 0x22
116#define CONTROL_DTR 0x01
117#define CONTROL_RTS 0x02
118
119#define BREAK_REQUEST_TYPE 0x21
120#define BREAK_REQUEST 0x23
121#define BREAK_ON 0xffff
122#define BREAK_OFF 0x0000
123
124#define GET_LINE_REQUEST_TYPE 0xa1
125#define GET_LINE_REQUEST 0x21
126
127#define VENDOR_WRITE_REQUEST_TYPE 0x40
128#define VENDOR_WRITE_REQUEST 0x01
129
130#define VENDOR_READ_REQUEST_TYPE 0xc0
131#define VENDOR_READ_REQUEST 0x01
132
133#define UART_STATE 0x08
134#define UART_STATE_TRANSIENT_MASK 0x74
135#define UART_DCD 0x01
136#define UART_DSR 0x02
137#define UART_BREAK_ERROR 0x04
138#define UART_RING 0x08
139#define UART_FRAME_ERROR 0x10
140#define UART_PARITY_ERROR 0x20
141#define UART_OVERRUN_ERROR 0x40
142#define UART_CTS 0x80
143
144
145enum pl2303_type {
146 type_0, /* don't know the difference between type 0 and */
147 type_1, /* type 1, until someone from prolific tells us... */
148 HX, /* HX version of the pl2303 chip */
149};
150
151struct pl2303_private {
152 spinlock_t lock;
153 wait_queue_head_t delta_msr_wait;
154 u8 line_control;
155 u8 line_status;
156 enum pl2303_type type;
157};
158
159static int pl2303_vendor_read(__u16 value, __u16 index,
160 struct usb_serial *serial, unsigned char *buf)
161{
162 int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
163 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
164 value, index, buf, 1, 100);
165 dbg("0x%x:0x%x:0x%x:0x%x %d - %x", VENDOR_READ_REQUEST_TYPE,
166 VENDOR_READ_REQUEST, value, index, res, buf[0]);
167 return res;
168}
169
170static int pl2303_vendor_write(__u16 value, __u16 index,
171 struct usb_serial *serial)
172{
173 int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
174 VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE,
175 value, index, NULL, 0, 100);
176 dbg("0x%x:0x%x:0x%x:0x%x %d", VENDOR_WRITE_REQUEST_TYPE,
177 VENDOR_WRITE_REQUEST, value, index, res);
178 return res;
179}
180
181static int pl2303_startup(struct usb_serial *serial)
182{
183 struct pl2303_private *priv;
184 enum pl2303_type type = type_0;
185 unsigned char *buf;
186 int i;
187
188 buf = kmalloc(10, GFP_KERNEL);
189 if (buf == NULL)
190 return -ENOMEM;
191
192 if (serial->dev->descriptor.bDeviceClass == 0x02)
193 type = type_0;
194 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
195 type = HX;
196 else if (serial->dev->descriptor.bDeviceClass == 0x00)
197 type = type_1;
198 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
199 type = type_1;
200 dbg("device type: %d", type);
201
202 for (i = 0; i < serial->num_ports; ++i) {
203 priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL);
204 if (!priv)
205 goto cleanup;
206 spin_lock_init(&priv->lock);
207 init_waitqueue_head(&priv->delta_msr_wait);
208 priv->type = type;
209 usb_set_serial_port_data(serial->port[i], priv);
210 }
211
212 pl2303_vendor_read(0x8484, 0, serial, buf);
213 pl2303_vendor_write(0x0404, 0, serial);
214 pl2303_vendor_read(0x8484, 0, serial, buf);
215 pl2303_vendor_read(0x8383, 0, serial, buf);
216 pl2303_vendor_read(0x8484, 0, serial, buf);
217 pl2303_vendor_write(0x0404, 1, serial);
218 pl2303_vendor_read(0x8484, 0, serial, buf);
219 pl2303_vendor_read(0x8383, 0, serial, buf);
220 pl2303_vendor_write(0, 1, serial);
221 pl2303_vendor_write(1, 0, serial);
222 if (type == HX)
223 pl2303_vendor_write(2, 0x44, serial);
224 else
225 pl2303_vendor_write(2, 0x24, serial);
226
227 kfree(buf);
228 return 0;
229
230cleanup:
231 kfree(buf);
232 for (--i; i >= 0; --i) {
233 priv = usb_get_serial_port_data(serial->port[i]);
234 kfree(priv);
235 usb_set_serial_port_data(serial->port[i], NULL);
236 }
237 return -ENOMEM;
238}
239
240static int set_control_lines(struct usb_device *dev, u8 value)
241{
242 int retval;
243
244 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
245 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
246 value, 0, NULL, 0, 100);
247 dbg("%s - value = %d, retval = %d", __func__, value, retval);
248 return retval;
249}
250
251static void pl2303_set_termios(struct tty_struct *tty,
252 struct usb_serial_port *port, struct ktermios *old_termios)
253{
254 struct usb_serial *serial = port->serial;
255 struct pl2303_private *priv = usb_get_serial_port_data(port);
256 unsigned long flags;
257 unsigned int cflag;
258 unsigned char *buf;
259 int baud;
260 int i;
261 u8 control;
262 const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600,
263 4800, 7200, 9600, 14400, 19200, 28800, 38400,
264 57600, 115200, 230400, 460800, 614400,
265 921600, 1228800, 2457600, 3000000, 6000000 };
266 int baud_floor, baud_ceil;
267 int k;
268
269 dbg("%s - port %d", __func__, port->number);
270
271 /* The PL2303 is reported to lose bytes if you change
272 serial settings even to the same values as before. Thus
273 we actually need to filter in this specific case */
274
275 if (!tty_termios_hw_change(tty->termios, old_termios))
276 return;
277
278 cflag = tty->termios->c_cflag;
279
280 buf = kzalloc(7, GFP_KERNEL);
281 if (!buf) {
282 dev_err(&port->dev, "%s - out of memory.\n", __func__);
283 /* Report back no change occurred */
284 *tty->termios = *old_termios;
285 return;
286 }
287
288 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
289 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
290 0, 0, buf, 7, 100);
291 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
292 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
293
294 if (cflag & CSIZE) {
295 switch (cflag & CSIZE) {
296 case CS5:
297 buf[6] = 5;
298 break;
299 case CS6:
300 buf[6] = 6;
301 break;
302 case CS7:
303 buf[6] = 7;
304 break;
305 default:
306 case CS8:
307 buf[6] = 8;
308 break;
309 }
310 dbg("%s - data bits = %d", __func__, buf[6]);
311 }
312
313 /* For reference buf[0]:buf[3] baud rate value */
314 /* NOTE: Only the values defined in baud_sup are supported !
315 * => if unsupported values are set, the PL2303 seems to use
316 * 9600 baud (at least my PL2303X always does)
317 */
318 baud = tty_get_baud_rate(tty);
319 dbg("%s - baud requested = %d", __func__, baud);
320 if (baud) {
321 /* Set baudrate to nearest supported value */
322 for (k=0; k<ARRAY_SIZE(baud_sup); k++) {
323 if (baud_sup[k] / baud) {
324 baud_ceil = baud_sup[k];
325 if (k==0) {
326 baud = baud_ceil;
327 } else {
328 baud_floor = baud_sup[k-1];
329 if ((baud_ceil % baud)
330 > (baud % baud_floor))
331 baud = baud_floor;
332 else
333 baud = baud_ceil;
334 }
335 break;
336 }
337 }
338 if (baud > 1228800) {
339 /* type_0, type_1 only support up to 1228800 baud */
340 if (priv->type != HX)
341 baud = 1228800;
342 else if (baud > 6000000)
343 baud = 6000000;
344 }
345 dbg("%s - baud set = %d", __func__, baud);
346 if (baud <= 115200) {
347 buf[0] = baud & 0xff;
348 buf[1] = (baud >> 8) & 0xff;
349 buf[2] = (baud >> 16) & 0xff;
350 buf[3] = (baud >> 24) & 0xff;
351 } else {
352 /* apparently the formula for higher speeds is:
353 * baudrate = 12M * 32 / (2^buf[1]) / buf[0]
354 */
355 unsigned tmp = 12*1000*1000*32 / baud;
356 buf[3] = 0x80;
357 buf[2] = 0;
358 buf[1] = (tmp >= 256);
359 while (tmp >= 256) {
360 tmp >>= 2;
361 buf[1] <<= 1;
362 }
363 if (tmp > 256) {
364 tmp %= 256;
365 }
366 buf[0] = tmp;
367 }
368 }
369
370 /* For reference buf[4]=0 is 1 stop bits */
371 /* For reference buf[4]=1 is 1.5 stop bits */
372 /* For reference buf[4]=2 is 2 stop bits */
373 if (cflag & CSTOPB) {
374 /* NOTE: Comply with "real" UARTs / RS232:
375 * use 1.5 instead of 2 stop bits with 5 data bits
376 */
377 if ((cflag & CSIZE) == CS5) {
378 buf[4] = 1;
379 dbg("%s - stop bits = 1.5", __func__);
380 } else {
381 buf[4] = 2;
382 dbg("%s - stop bits = 2", __func__);
383 }
384 } else {
385 buf[4] = 0;
386 dbg("%s - stop bits = 1", __func__);
387 }
388
389 if (cflag & PARENB) {
390 /* For reference buf[5]=0 is none parity */
391 /* For reference buf[5]=1 is odd parity */
392 /* For reference buf[5]=2 is even parity */
393 /* For reference buf[5]=3 is mark parity */
394 /* For reference buf[5]=4 is space parity */
395 if (cflag & PARODD) {
396 if (cflag & CMSPAR) {
397 buf[5] = 3;
398 dbg("%s - parity = mark", __func__);
399 } else {
400 buf[5] = 1;
401 dbg("%s - parity = odd", __func__);
402 }
403 } else {
404 if (cflag & CMSPAR) {
405 buf[5] = 4;
406 dbg("%s - parity = space", __func__);
407 } else {
408 buf[5] = 2;
409 dbg("%s - parity = even", __func__);
410 }
411 }
412 } else {
413 buf[5] = 0;
414 dbg("%s - parity = none", __func__);
415 }
416
417 i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
418 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
419 0, 0, buf, 7, 100);
420 dbg("0x21:0x20:0:0 %d", i);
421
422 /* change control lines if we are switching to or from B0 */
423 spin_lock_irqsave(&priv->lock, flags);
424 control = priv->line_control;
425 if ((cflag & CBAUD) == B0)
426 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
427 else
428 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
429 if (control != priv->line_control) {
430 control = priv->line_control;
431 spin_unlock_irqrestore(&priv->lock, flags);
432 set_control_lines(serial->dev, control);
433 } else {
434 spin_unlock_irqrestore(&priv->lock, flags);
435 }
436
437 buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0;
438
439 i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
440 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
441 0, 0, buf, 7, 100);
442 dbg("0xa1:0x21:0:0 %d - %x %x %x %x %x %x %x", i,
443 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
444
445 if (cflag & CRTSCTS) {
446 if (priv->type == HX)
447 pl2303_vendor_write(0x0, 0x61, serial);
448 else
449 pl2303_vendor_write(0x0, 0x41, serial);
450 } else {
451 pl2303_vendor_write(0x0, 0x0, serial);
452 }
453
454 /* Save resulting baud rate */
455 if (baud)
456 tty_encode_baud_rate(tty, baud, baud);
457
458 kfree(buf);
459}
460
461static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
462{
463 struct pl2303_private *priv = usb_get_serial_port_data(port);
464 unsigned long flags;
465 u8 control;
466
467 spin_lock_irqsave(&priv->lock, flags);
468 /* Change DTR and RTS */
469 if (on)
470 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
471 else
472 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
473 control = priv->line_control;
474 spin_unlock_irqrestore(&priv->lock, flags);
475 set_control_lines(port->serial->dev, control);
476}
477
478static void pl2303_close(struct usb_serial_port *port)
479{
480 dbg("%s - port %d", __func__, port->number);
481
482 usb_serial_generic_close(port);
483 usb_kill_urb(port->interrupt_in_urb);
484}
485
486static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
487{
488 struct ktermios tmp_termios;
489 struct usb_serial *serial = port->serial;
490 struct pl2303_private *priv = usb_get_serial_port_data(port);
491 int result;
492
493 dbg("%s - port %d", __func__, port->number);
494
495 if (priv->type != HX) {
496 usb_clear_halt(serial->dev, port->write_urb->pipe);
497 usb_clear_halt(serial->dev, port->read_urb->pipe);
498 } else {
499 /* reset upstream data pipes */
500 pl2303_vendor_write(8, 0, serial);
501 pl2303_vendor_write(9, 0, serial);
502 }
503
504 /* Setup termios */
505 if (tty)
506 pl2303_set_termios(tty, port, &tmp_termios);
507
508 dbg("%s - submitting read urb", __func__);
509 result = usb_serial_generic_submit_read_urb(port, GFP_KERNEL);
510 if (result) {
511 pl2303_close(port);
512 return -EPROTO;
513 }
514
515 dbg("%s - submitting interrupt urb", __func__);
516 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
517 if (result) {
518 dev_err(&port->dev, "%s - failed submitting interrupt urb,"
519 " error %d\n", __func__, result);
520 pl2303_close(port);
521 return -EPROTO;
522 }
523 port->port.drain_delay = 256;
524 return 0;
525}
526
527static int pl2303_tiocmset(struct tty_struct *tty,
528 unsigned int set, unsigned int clear)
529{
530 struct usb_serial_port *port = tty->driver_data;
531 struct pl2303_private *priv = usb_get_serial_port_data(port);
532 unsigned long flags;
533 u8 control;
534
535 if (!usb_get_intfdata(port->serial->interface))
536 return -ENODEV;
537
538 spin_lock_irqsave(&priv->lock, flags);
539 if (set & TIOCM_RTS)
540 priv->line_control |= CONTROL_RTS;
541 if (set & TIOCM_DTR)
542 priv->line_control |= CONTROL_DTR;
543 if (clear & TIOCM_RTS)
544 priv->line_control &= ~CONTROL_RTS;
545 if (clear & TIOCM_DTR)
546 priv->line_control &= ~CONTROL_DTR;
547 control = priv->line_control;
548 spin_unlock_irqrestore(&priv->lock, flags);
549
550 return set_control_lines(port->serial->dev, control);
551}
552
553static int pl2303_tiocmget(struct tty_struct *tty)
554{
555 struct usb_serial_port *port = tty->driver_data;
556 struct pl2303_private *priv = usb_get_serial_port_data(port);
557 unsigned long flags;
558 unsigned int mcr;
559 unsigned int status;
560 unsigned int result;
561
562 dbg("%s (%d)", __func__, port->number);
563
564 if (!usb_get_intfdata(port->serial->interface))
565 return -ENODEV;
566
567 spin_lock_irqsave(&priv->lock, flags);
568 mcr = priv->line_control;
569 status = priv->line_status;
570 spin_unlock_irqrestore(&priv->lock, flags);
571
572 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
573 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
574 | ((status & UART_CTS) ? TIOCM_CTS : 0)
575 | ((status & UART_DSR) ? TIOCM_DSR : 0)
576 | ((status & UART_RING) ? TIOCM_RI : 0)
577 | ((status & UART_DCD) ? TIOCM_CD : 0);
578
579 dbg("%s - result = %x", __func__, result);
580
581 return result;
582}
583
584static int pl2303_carrier_raised(struct usb_serial_port *port)
585{
586 struct pl2303_private *priv = usb_get_serial_port_data(port);
587 if (priv->line_status & UART_DCD)
588 return 1;
589 return 0;
590}
591
592static int wait_modem_info(struct usb_serial_port *port, unsigned int arg)
593{
594 struct pl2303_private *priv = usb_get_serial_port_data(port);
595 unsigned long flags;
596 unsigned int prevstatus;
597 unsigned int status;
598 unsigned int changed;
599
600 spin_lock_irqsave(&priv->lock, flags);
601 prevstatus = priv->line_status;
602 spin_unlock_irqrestore(&priv->lock, flags);
603
604 while (1) {
605 interruptible_sleep_on(&priv->delta_msr_wait);
606 /* see if a signal did it */
607 if (signal_pending(current))
608 return -ERESTARTSYS;
609
610 spin_lock_irqsave(&priv->lock, flags);
611 status = priv->line_status;
612 spin_unlock_irqrestore(&priv->lock, flags);
613
614 changed = prevstatus ^ status;
615
616 if (((arg & TIOCM_RNG) && (changed & UART_RING)) ||
617 ((arg & TIOCM_DSR) && (changed & UART_DSR)) ||
618 ((arg & TIOCM_CD) && (changed & UART_DCD)) ||
619 ((arg & TIOCM_CTS) && (changed & UART_CTS))) {
620 return 0;
621 }
622 prevstatus = status;
623 }
624 /* NOTREACHED */
625 return 0;
626}
627
628static int pl2303_ioctl(struct tty_struct *tty,
629 unsigned int cmd, unsigned long arg)
630{
631 struct serial_struct ser;
632 struct usb_serial_port *port = tty->driver_data;
633 dbg("%s (%d) cmd = 0x%04x", __func__, port->number, cmd);
634
635 switch (cmd) {
636 case TIOCGSERIAL:
637 memset(&ser, 0, sizeof ser);
638 ser.type = PORT_16654;
639 ser.line = port->serial->minor;
640 ser.port = port->number;
641 ser.baud_base = 460800;
642
643 if (copy_to_user((void __user *)arg, &ser, sizeof ser))
644 return -EFAULT;
645
646 return 0;
647
648 case TIOCMIWAIT:
649 dbg("%s (%d) TIOCMIWAIT", __func__, port->number);
650 return wait_modem_info(port, arg);
651 default:
652 dbg("%s not supported = 0x%04x", __func__, cmd);
653 break;
654 }
655 return -ENOIOCTLCMD;
656}
657
658static void pl2303_break_ctl(struct tty_struct *tty, int break_state)
659{
660 struct usb_serial_port *port = tty->driver_data;
661 struct usb_serial *serial = port->serial;
662 u16 state;
663 int result;
664
665 dbg("%s - port %d", __func__, port->number);
666
667 if (break_state == 0)
668 state = BREAK_OFF;
669 else
670 state = BREAK_ON;
671 dbg("%s - turning break %s", __func__,
672 state == BREAK_OFF ? "off" : "on");
673
674 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
675 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
676 0, NULL, 0, 100);
677 if (result)
678 dbg("%s - error sending break = %d", __func__, result);
679}
680
681static void pl2303_release(struct usb_serial *serial)
682{
683 int i;
684 struct pl2303_private *priv;
685
686 dbg("%s", __func__);
687
688 for (i = 0; i < serial->num_ports; ++i) {
689 priv = usb_get_serial_port_data(serial->port[i]);
690 kfree(priv);
691 }
692}
693
694static void pl2303_update_line_status(struct usb_serial_port *port,
695 unsigned char *data,
696 unsigned int actual_length)
697{
698
699 struct pl2303_private *priv = usb_get_serial_port_data(port);
700 struct tty_struct *tty;
701 unsigned long flags;
702 u8 status_idx = UART_STATE;
703 u8 length = UART_STATE + 1;
704 u8 prev_line_status;
705 u16 idv, idp;
706
707 idv = le16_to_cpu(port->serial->dev->descriptor.idVendor);
708 idp = le16_to_cpu(port->serial->dev->descriptor.idProduct);
709
710
711 if (idv == SIEMENS_VENDOR_ID) {
712 if (idp == SIEMENS_PRODUCT_ID_X65 ||
713 idp == SIEMENS_PRODUCT_ID_SX1 ||
714 idp == SIEMENS_PRODUCT_ID_X75) {
715
716 length = 1;
717 status_idx = 0;
718 }
719 }
720
721 if (actual_length < length)
722 return;
723
724 /* Save off the uart status for others to look at */
725 spin_lock_irqsave(&priv->lock, flags);
726 prev_line_status = priv->line_status;
727 priv->line_status = data[status_idx];
728 spin_unlock_irqrestore(&priv->lock, flags);
729 if (priv->line_status & UART_BREAK_ERROR)
730 usb_serial_handle_break(port);
731 wake_up_interruptible(&priv->delta_msr_wait);
732
733 tty = tty_port_tty_get(&port->port);
734 if (!tty)
735 return;
736 if ((priv->line_status ^ prev_line_status) & UART_DCD)
737 usb_serial_handle_dcd_change(port, tty,
738 priv->line_status & UART_DCD);
739 tty_kref_put(tty);
740}
741
742static void pl2303_read_int_callback(struct urb *urb)
743{
744 struct usb_serial_port *port = urb->context;
745 unsigned char *data = urb->transfer_buffer;
746 unsigned int actual_length = urb->actual_length;
747 int status = urb->status;
748 int retval;
749
750 dbg("%s (%d)", __func__, port->number);
751
752 switch (status) {
753 case 0:
754 /* success */
755 break;
756 case -ECONNRESET:
757 case -ENOENT:
758 case -ESHUTDOWN:
759 /* this urb is terminated, clean up */
760 dbg("%s - urb shutting down with status: %d", __func__,
761 status);
762 return;
763 default:
764 dbg("%s - nonzero urb status received: %d", __func__,
765 status);
766 goto exit;
767 }
768
769 usb_serial_debug_data(debug, &port->dev, __func__,
770 urb->actual_length, urb->transfer_buffer);
771
772 pl2303_update_line_status(port, data, actual_length);
773
774exit:
775 retval = usb_submit_urb(urb, GFP_ATOMIC);
776 if (retval)
777 dev_err(&urb->dev->dev,
778 "%s - usb_submit_urb failed with result %d\n",
779 __func__, retval);
780}
781
782static void pl2303_process_read_urb(struct urb *urb)
783{
784 struct usb_serial_port *port = urb->context;
785 struct pl2303_private *priv = usb_get_serial_port_data(port);
786 struct tty_struct *tty;
787 unsigned char *data = urb->transfer_buffer;
788 char tty_flag = TTY_NORMAL;
789 unsigned long flags;
790 u8 line_status;
791 int i;
792
793 /* update line status */
794 spin_lock_irqsave(&priv->lock, flags);
795 line_status = priv->line_status;
796 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
797 spin_unlock_irqrestore(&priv->lock, flags);
798 wake_up_interruptible(&priv->delta_msr_wait);
799
800 if (!urb->actual_length)
801 return;
802
803 tty = tty_port_tty_get(&port->port);
804 if (!tty)
805 return;
806
807 /* break takes precedence over parity, */
808 /* which takes precedence over framing errors */
809 if (line_status & UART_BREAK_ERROR)
810 tty_flag = TTY_BREAK;
811 else if (line_status & UART_PARITY_ERROR)
812 tty_flag = TTY_PARITY;
813 else if (line_status & UART_FRAME_ERROR)
814 tty_flag = TTY_FRAME;
815 dbg("%s - tty_flag = %d", __func__, tty_flag);
816
817 /* overrun is special, not associated with a char */
818 if (line_status & UART_OVERRUN_ERROR)
819 tty_insert_flip_char(tty, 0, TTY_OVERRUN);
820
821 if (port->port.console && port->sysrq) {
822 for (i = 0; i < urb->actual_length; ++i)
823 if (!usb_serial_handle_sysrq_char(port, data[i]))
824 tty_insert_flip_char(tty, data[i], tty_flag);
825 } else {
826 tty_insert_flip_string_fixed_flag(tty, data, tty_flag,
827 urb->actual_length);
828 }
829
830 tty_flip_buffer_push(tty);
831 tty_kref_put(tty);
832}
833
834/* All of the device info needed for the PL2303 SIO serial converter */
835static struct usb_serial_driver pl2303_device = {
836 .driver = {
837 .owner = THIS_MODULE,
838 .name = "pl2303",
839 },
840 .id_table = id_table,
841 .usb_driver = &pl2303_driver,
842 .num_ports = 1,
843 .bulk_in_size = 256,
844 .bulk_out_size = 256,
845 .open = pl2303_open,
846 .close = pl2303_close,
847 .dtr_rts = pl2303_dtr_rts,
848 .carrier_raised = pl2303_carrier_raised,
849 .ioctl = pl2303_ioctl,
850 .break_ctl = pl2303_break_ctl,
851 .set_termios = pl2303_set_termios,
852 .tiocmget = pl2303_tiocmget,
853 .tiocmset = pl2303_tiocmset,
854 .process_read_urb = pl2303_process_read_urb,
855 .read_int_callback = pl2303_read_int_callback,
856 .attach = pl2303_startup,
857 .release = pl2303_release,
858};
859
860static int __init pl2303_init(void)
861{
862 int retval;
863
864 retval = usb_serial_register(&pl2303_device);
865 if (retval)
866 goto failed_usb_serial_register;
867 retval = usb_register(&pl2303_driver);
868 if (retval)
869 goto failed_usb_register;
870 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
871 return 0;
872failed_usb_register:
873 usb_serial_deregister(&pl2303_device);
874failed_usb_serial_register:
875 return retval;
876}
877
878static void __exit pl2303_exit(void)
879{
880 usb_deregister(&pl2303_driver);
881 usb_serial_deregister(&pl2303_device);
882}
883
884module_init(pl2303_init);
885module_exit(pl2303_exit);
886
887MODULE_DESCRIPTION(DRIVER_DESC);
888MODULE_LICENSE("GPL");
889
890module_param(debug, bool, S_IRUGO | S_IWUSR);
891MODULE_PARM_DESC(debug, "Debug enabled or not");
892
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Prolific PL2303 USB to serial adaptor driver
4 *
5 * Copyright (C) 2001-2007 Greg Kroah-Hartman (greg@kroah.com)
6 * Copyright (C) 2003 IBM Corp.
7 *
8 * Original driver for 2.2.x by anonymous
9 *
10 * See Documentation/usb/usb-serial.rst for more information on using this
11 * driver
12 */
13
14#include <linux/kernel.h>
15#include <linux/errno.h>
16#include <linux/slab.h>
17#include <linux/tty.h>
18#include <linux/tty_driver.h>
19#include <linux/tty_flip.h>
20#include <linux/serial.h>
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/spinlock.h>
24#include <linux/uaccess.h>
25#include <linux/usb.h>
26#include <linux/usb/serial.h>
27#include <asm/unaligned.h>
28#include "pl2303.h"
29
30
31#define PL2303_QUIRK_UART_STATE_IDX0 BIT(0)
32#define PL2303_QUIRK_LEGACY BIT(1)
33#define PL2303_QUIRK_ENDPOINT_HACK BIT(2)
34
35static const struct usb_device_id id_table[] = {
36 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID),
37 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
38 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
39 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) },
40 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) },
41 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_CHILITAG) },
42 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) },
43 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ALDIGA) },
44 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MMX) },
45 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) },
46 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) },
47 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) },
48 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) },
49 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_TB) },
50 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GC) },
51 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GB) },
52 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GT) },
53 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GL) },
54 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GE) },
55 { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GS) },
56 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
57 { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
58 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID),
59 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
60 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC485),
61 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
62 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_UC232B),
63 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
64 { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) },
65 { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
66 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
67 { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
68 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID) },
69 { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) },
70 { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) },
71 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) },
72 { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) },
73 { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) },
74 { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) },
75 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
76 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
77 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1),
78 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
79 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65),
80 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
81 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75),
82 .driver_info = PL2303_QUIRK_UART_STATE_IDX0 },
83 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81),
84 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
85 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */
86 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
87 { USB_DEVICE(NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID) },
88 { USB_DEVICE(CA_42_CA42_VENDOR_ID, CA_42_CA42_PRODUCT_ID) },
89 { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) },
90 { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) },
91 { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
92 { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
93 { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
94 { USB_DEVICE(ALCOR_VENDOR_ID, ALCOR_PRODUCT_ID),
95 .driver_info = PL2303_QUIRK_ENDPOINT_HACK },
96 { USB_DEVICE(WS002IN_VENDOR_ID, WS002IN_PRODUCT_ID) },
97 { USB_DEVICE(COREGA_VENDOR_ID, COREGA_PRODUCT_ID) },
98 { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
99 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
100 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
101 { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) },
102 { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) },
103 { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
104 { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) },
105 { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
106 { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
107 { USB_DEVICE(HP_VENDOR_ID, HP_LM920_PRODUCT_ID) },
108 { USB_DEVICE(HP_VENDOR_ID, HP_LM940_PRODUCT_ID) },
109 { USB_DEVICE(HP_VENDOR_ID, HP_TD620_PRODUCT_ID) },
110 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
111 { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
112 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
113 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
114 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
115 { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
116 { USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
117 { } /* Terminating entry */
118};
119
120MODULE_DEVICE_TABLE(usb, id_table);
121
122#define SET_LINE_REQUEST_TYPE 0x21
123#define SET_LINE_REQUEST 0x20
124
125#define SET_CONTROL_REQUEST_TYPE 0x21
126#define SET_CONTROL_REQUEST 0x22
127#define CONTROL_DTR 0x01
128#define CONTROL_RTS 0x02
129
130#define BREAK_REQUEST_TYPE 0x21
131#define BREAK_REQUEST 0x23
132#define BREAK_ON 0xffff
133#define BREAK_OFF 0x0000
134
135#define GET_LINE_REQUEST_TYPE 0xa1
136#define GET_LINE_REQUEST 0x21
137
138#define VENDOR_WRITE_REQUEST_TYPE 0x40
139#define VENDOR_WRITE_REQUEST 0x01
140#define VENDOR_WRITE_NREQUEST 0x80
141
142#define VENDOR_READ_REQUEST_TYPE 0xc0
143#define VENDOR_READ_REQUEST 0x01
144#define VENDOR_READ_NREQUEST 0x81
145
146#define UART_STATE_INDEX 8
147#define UART_STATE_MSR_MASK 0x8b
148#define UART_STATE_TRANSIENT_MASK 0x74
149#define UART_DCD 0x01
150#define UART_DSR 0x02
151#define UART_BREAK_ERROR 0x04
152#define UART_RING 0x08
153#define UART_FRAME_ERROR 0x10
154#define UART_PARITY_ERROR 0x20
155#define UART_OVERRUN_ERROR 0x40
156#define UART_CTS 0x80
157
158#define PL2303_FLOWCTRL_MASK 0xf0
159
160#define PL2303_READ_TYPE_HX_STATUS 0x8080
161
162#define PL2303_HXN_RESET_REG 0x07
163#define PL2303_HXN_RESET_UPSTREAM_PIPE 0x02
164#define PL2303_HXN_RESET_DOWNSTREAM_PIPE 0x01
165
166#define PL2303_HXN_FLOWCTRL_REG 0x0a
167#define PL2303_HXN_FLOWCTRL_MASK 0x1c
168#define PL2303_HXN_FLOWCTRL_NONE 0x1c
169#define PL2303_HXN_FLOWCTRL_RTS_CTS 0x18
170#define PL2303_HXN_FLOWCTRL_XON_XOFF 0x0c
171
172static void pl2303_set_break(struct usb_serial_port *port, bool enable);
173
174enum pl2303_type {
175 TYPE_01, /* Type 0 and 1 (difference unknown) */
176 TYPE_HX, /* HX version of the pl2303 chip */
177 TYPE_HXN, /* HXN version of the pl2303 chip */
178 TYPE_COUNT
179};
180
181struct pl2303_type_data {
182 speed_t max_baud_rate;
183 unsigned long quirks;
184 unsigned int no_autoxonxoff:1;
185};
186
187struct pl2303_serial_private {
188 const struct pl2303_type_data *type;
189 unsigned long quirks;
190};
191
192struct pl2303_private {
193 spinlock_t lock;
194 u8 line_control;
195 u8 line_status;
196
197 u8 line_settings[7];
198};
199
200static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = {
201 [TYPE_01] = {
202 .max_baud_rate = 1228800,
203 .quirks = PL2303_QUIRK_LEGACY,
204 .no_autoxonxoff = true,
205 },
206 [TYPE_HX] = {
207 .max_baud_rate = 12000000,
208 },
209 [TYPE_HXN] = {
210 .max_baud_rate = 12000000,
211 },
212};
213
214static int pl2303_vendor_read(struct usb_serial *serial, u16 value,
215 unsigned char buf[1])
216{
217 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
218 struct device *dev = &serial->interface->dev;
219 u8 request;
220 int res;
221
222 if (spriv->type == &pl2303_type_data[TYPE_HXN])
223 request = VENDOR_READ_NREQUEST;
224 else
225 request = VENDOR_READ_REQUEST;
226
227 res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
228 request, VENDOR_READ_REQUEST_TYPE,
229 value, 0, buf, 1, 100);
230 if (res != 1) {
231 dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__,
232 value, res);
233 if (res >= 0)
234 res = -EIO;
235
236 return res;
237 }
238
239 dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]);
240
241 return 0;
242}
243
244static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index)
245{
246 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
247 struct device *dev = &serial->interface->dev;
248 u8 request;
249 int res;
250
251 dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index);
252
253 if (spriv->type == &pl2303_type_data[TYPE_HXN])
254 request = VENDOR_WRITE_NREQUEST;
255 else
256 request = VENDOR_WRITE_REQUEST;
257
258 res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
259 request, VENDOR_WRITE_REQUEST_TYPE,
260 value, index, NULL, 0, 100);
261 if (res) {
262 dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__,
263 value, res);
264 return res;
265 }
266
267 return 0;
268}
269
270static int pl2303_update_reg(struct usb_serial *serial, u8 reg, u8 mask, u8 val)
271{
272 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
273 int ret = 0;
274 u8 *buf;
275
276 buf = kmalloc(1, GFP_KERNEL);
277 if (!buf)
278 return -ENOMEM;
279
280 if (spriv->type == &pl2303_type_data[TYPE_HXN])
281 ret = pl2303_vendor_read(serial, reg, buf);
282 else
283 ret = pl2303_vendor_read(serial, reg | 0x80, buf);
284
285 if (ret)
286 goto out_free;
287
288 *buf &= ~mask;
289 *buf |= val & mask;
290
291 ret = pl2303_vendor_write(serial, reg, *buf);
292out_free:
293 kfree(buf);
294
295 return ret;
296}
297
298static int pl2303_probe(struct usb_serial *serial,
299 const struct usb_device_id *id)
300{
301 usb_set_serial_data(serial, (void *)id->driver_info);
302
303 return 0;
304}
305
306/*
307 * Use interrupt endpoint from first interface if available.
308 *
309 * This is needed due to the looney way its endpoints are set up.
310 */
311static int pl2303_endpoint_hack(struct usb_serial *serial,
312 struct usb_serial_endpoints *epds)
313{
314 struct usb_interface *interface = serial->interface;
315 struct usb_device *dev = serial->dev;
316 struct device *ddev = &interface->dev;
317 struct usb_host_interface *iface_desc;
318 struct usb_endpoint_descriptor *endpoint;
319 unsigned int i;
320
321 if (interface == dev->actconfig->interface[0])
322 return 0;
323
324 /* check out the endpoints of the other interface */
325 iface_desc = dev->actconfig->interface[0]->cur_altsetting;
326
327 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
328 endpoint = &iface_desc->endpoint[i].desc;
329
330 if (!usb_endpoint_is_int_in(endpoint))
331 continue;
332
333 dev_dbg(ddev, "found interrupt in on separate interface\n");
334 if (epds->num_interrupt_in < ARRAY_SIZE(epds->interrupt_in))
335 epds->interrupt_in[epds->num_interrupt_in++] = endpoint;
336 }
337
338 return 0;
339}
340
341static int pl2303_calc_num_ports(struct usb_serial *serial,
342 struct usb_serial_endpoints *epds)
343{
344 unsigned long quirks = (unsigned long)usb_get_serial_data(serial);
345 struct device *dev = &serial->interface->dev;
346 int ret;
347
348 if (quirks & PL2303_QUIRK_ENDPOINT_HACK) {
349 ret = pl2303_endpoint_hack(serial, epds);
350 if (ret)
351 return ret;
352 }
353
354 if (epds->num_interrupt_in < 1) {
355 dev_err(dev, "required interrupt-in endpoint missing\n");
356 return -ENODEV;
357 }
358
359 return 1;
360}
361
362static int pl2303_startup(struct usb_serial *serial)
363{
364 struct pl2303_serial_private *spriv;
365 enum pl2303_type type = TYPE_01;
366 unsigned char *buf;
367 int res;
368
369 spriv = kzalloc(sizeof(*spriv), GFP_KERNEL);
370 if (!spriv)
371 return -ENOMEM;
372
373 buf = kmalloc(1, GFP_KERNEL);
374 if (!buf) {
375 kfree(spriv);
376 return -ENOMEM;
377 }
378
379 if (serial->dev->descriptor.bDeviceClass == 0x02)
380 type = TYPE_01; /* type 0 */
381 else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40)
382 type = TYPE_HX;
383 else if (serial->dev->descriptor.bDeviceClass == 0x00)
384 type = TYPE_01; /* type 1 */
385 else if (serial->dev->descriptor.bDeviceClass == 0xFF)
386 type = TYPE_01; /* type 1 */
387 dev_dbg(&serial->interface->dev, "device type: %d\n", type);
388
389 if (type == TYPE_HX) {
390 res = usb_control_msg(serial->dev,
391 usb_rcvctrlpipe(serial->dev, 0),
392 VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE,
393 PL2303_READ_TYPE_HX_STATUS, 0, buf, 1, 100);
394 if (res != 1)
395 type = TYPE_HXN;
396 }
397
398 spriv->type = &pl2303_type_data[type];
399 spriv->quirks = (unsigned long)usb_get_serial_data(serial);
400 spriv->quirks |= spriv->type->quirks;
401
402 usb_set_serial_data(serial, spriv);
403
404 if (type != TYPE_HXN) {
405 pl2303_vendor_read(serial, 0x8484, buf);
406 pl2303_vendor_write(serial, 0x0404, 0);
407 pl2303_vendor_read(serial, 0x8484, buf);
408 pl2303_vendor_read(serial, 0x8383, buf);
409 pl2303_vendor_read(serial, 0x8484, buf);
410 pl2303_vendor_write(serial, 0x0404, 1);
411 pl2303_vendor_read(serial, 0x8484, buf);
412 pl2303_vendor_read(serial, 0x8383, buf);
413 pl2303_vendor_write(serial, 0, 1);
414 pl2303_vendor_write(serial, 1, 0);
415 if (spriv->quirks & PL2303_QUIRK_LEGACY)
416 pl2303_vendor_write(serial, 2, 0x24);
417 else
418 pl2303_vendor_write(serial, 2, 0x44);
419 }
420
421 kfree(buf);
422
423 return 0;
424}
425
426static void pl2303_release(struct usb_serial *serial)
427{
428 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
429
430 kfree(spriv);
431}
432
433static int pl2303_port_probe(struct usb_serial_port *port)
434{
435 struct pl2303_private *priv;
436
437 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
438 if (!priv)
439 return -ENOMEM;
440
441 spin_lock_init(&priv->lock);
442
443 usb_set_serial_port_data(port, priv);
444
445 port->port.drain_delay = 256;
446
447 return 0;
448}
449
450static int pl2303_port_remove(struct usb_serial_port *port)
451{
452 struct pl2303_private *priv = usb_get_serial_port_data(port);
453
454 kfree(priv);
455
456 return 0;
457}
458
459static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value)
460{
461 struct usb_device *dev = port->serial->dev;
462 int retval;
463
464 dev_dbg(&port->dev, "%s - %02x\n", __func__, value);
465
466 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
467 SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE,
468 value, 0, NULL, 0, 100);
469 if (retval)
470 dev_err(&port->dev, "%s - failed: %d\n", __func__, retval);
471
472 return retval;
473}
474
475/*
476 * Returns the nearest supported baud rate that can be set directly without
477 * using divisors.
478 */
479static speed_t pl2303_get_supported_baud_rate(speed_t baud)
480{
481 static const speed_t baud_sup[] = {
482 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,
483 14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,
484 614400, 921600, 1228800, 2457600, 3000000, 6000000
485 };
486
487 unsigned i;
488
489 for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) {
490 if (baud_sup[i] > baud)
491 break;
492 }
493
494 if (i == ARRAY_SIZE(baud_sup))
495 baud = baud_sup[i - 1];
496 else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1]))
497 baud = baud_sup[i - 1];
498 else
499 baud = baud_sup[i];
500
501 return baud;
502}
503
504/*
505 * NOTE: If unsupported baud rates are set directly, the PL2303 seems to
506 * use 9600 baud.
507 */
508static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4],
509 speed_t baud)
510{
511 put_unaligned_le32(baud, buf);
512
513 return baud;
514}
515
516static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4],
517 speed_t baud)
518{
519 unsigned int baseline, mantissa, exponent;
520
521 /*
522 * Apparently the formula is:
523 * baudrate = 12M * 32 / (mantissa * 4^exponent)
524 * where
525 * mantissa = buf[8:0]
526 * exponent = buf[11:9]
527 */
528 baseline = 12000000 * 32;
529 mantissa = baseline / baud;
530 if (mantissa == 0)
531 mantissa = 1; /* Avoid dividing by zero if baud > 32*12M. */
532 exponent = 0;
533 while (mantissa >= 512) {
534 if (exponent < 7) {
535 mantissa >>= 2; /* divide by 4 */
536 exponent++;
537 } else {
538 /* Exponent is maxed. Trim mantissa and leave. */
539 mantissa = 511;
540 break;
541 }
542 }
543
544 buf[3] = 0x80;
545 buf[2] = 0;
546 buf[1] = exponent << 1 | mantissa >> 8;
547 buf[0] = mantissa & 0xff;
548
549 /* Calculate and return the exact baud rate. */
550 baud = (baseline / mantissa) >> (exponent << 1);
551
552 return baud;
553}
554
555static void pl2303_encode_baud_rate(struct tty_struct *tty,
556 struct usb_serial_port *port,
557 u8 buf[4])
558{
559 struct usb_serial *serial = port->serial;
560 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
561 speed_t baud_sup;
562 speed_t baud;
563
564 baud = tty_get_baud_rate(tty);
565 dev_dbg(&port->dev, "baud requested = %u\n", baud);
566 if (!baud)
567 return;
568
569 if (spriv->type->max_baud_rate)
570 baud = min_t(speed_t, baud, spriv->type->max_baud_rate);
571 /*
572 * Use direct method for supported baud rates, otherwise use divisors.
573 */
574 baud_sup = pl2303_get_supported_baud_rate(baud);
575
576 if (baud == baud_sup)
577 baud = pl2303_encode_baud_rate_direct(buf, baud);
578 else
579 baud = pl2303_encode_baud_rate_divisor(buf, baud);
580
581 /* Save resulting baud rate */
582 tty_encode_baud_rate(tty, baud, baud);
583 dev_dbg(&port->dev, "baud set = %u\n", baud);
584}
585
586static int pl2303_get_line_request(struct usb_serial_port *port,
587 unsigned char buf[7])
588{
589 struct usb_device *udev = port->serial->dev;
590 int ret;
591
592 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
593 GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE,
594 0, 0, buf, 7, 100);
595 if (ret != 7) {
596 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
597
598 if (ret >= 0)
599 ret = -EIO;
600
601 return ret;
602 }
603
604 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
605
606 return 0;
607}
608
609static int pl2303_set_line_request(struct usb_serial_port *port,
610 unsigned char buf[7])
611{
612 struct usb_device *udev = port->serial->dev;
613 int ret;
614
615 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
616 SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE,
617 0, 0, buf, 7, 100);
618 if (ret < 0) {
619 dev_err(&port->dev, "%s - failed: %d\n", __func__, ret);
620 return ret;
621 }
622
623 dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf);
624
625 return 0;
626}
627
628static bool pl2303_termios_change(const struct ktermios *a, const struct ktermios *b)
629{
630 bool ixon_change;
631
632 ixon_change = ((a->c_iflag ^ b->c_iflag) & (IXON | IXANY)) ||
633 a->c_cc[VSTART] != b->c_cc[VSTART] ||
634 a->c_cc[VSTOP] != b->c_cc[VSTOP];
635
636 return tty_termios_hw_change(a, b) || ixon_change;
637}
638
639static bool pl2303_enable_xonxoff(struct tty_struct *tty, const struct pl2303_type_data *type)
640{
641 if (!I_IXON(tty) || I_IXANY(tty))
642 return false;
643
644 if (START_CHAR(tty) != 0x11 || STOP_CHAR(tty) != 0x13)
645 return false;
646
647 if (type->no_autoxonxoff)
648 return false;
649
650 return true;
651}
652
653static void pl2303_set_termios(struct tty_struct *tty,
654 struct usb_serial_port *port, struct ktermios *old_termios)
655{
656 struct usb_serial *serial = port->serial;
657 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
658 struct pl2303_private *priv = usb_get_serial_port_data(port);
659 unsigned long flags;
660 unsigned char *buf;
661 int ret;
662 u8 control;
663
664 if (old_termios && !pl2303_termios_change(&tty->termios, old_termios))
665 return;
666
667 buf = kzalloc(7, GFP_KERNEL);
668 if (!buf) {
669 /* Report back no change occurred */
670 if (old_termios)
671 tty->termios = *old_termios;
672 return;
673 }
674
675 pl2303_get_line_request(port, buf);
676
677 switch (C_CSIZE(tty)) {
678 case CS5:
679 buf[6] = 5;
680 break;
681 case CS6:
682 buf[6] = 6;
683 break;
684 case CS7:
685 buf[6] = 7;
686 break;
687 default:
688 case CS8:
689 buf[6] = 8;
690 }
691 dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
692
693 /* For reference buf[0]:buf[3] baud rate value */
694 pl2303_encode_baud_rate(tty, port, &buf[0]);
695
696 /* For reference buf[4]=0 is 1 stop bits */
697 /* For reference buf[4]=1 is 1.5 stop bits */
698 /* For reference buf[4]=2 is 2 stop bits */
699 if (C_CSTOPB(tty)) {
700 /*
701 * NOTE: Comply with "real" UARTs / RS232:
702 * use 1.5 instead of 2 stop bits with 5 data bits
703 */
704 if (C_CSIZE(tty) == CS5) {
705 buf[4] = 1;
706 dev_dbg(&port->dev, "stop bits = 1.5\n");
707 } else {
708 buf[4] = 2;
709 dev_dbg(&port->dev, "stop bits = 2\n");
710 }
711 } else {
712 buf[4] = 0;
713 dev_dbg(&port->dev, "stop bits = 1\n");
714 }
715
716 if (C_PARENB(tty)) {
717 /* For reference buf[5]=0 is none parity */
718 /* For reference buf[5]=1 is odd parity */
719 /* For reference buf[5]=2 is even parity */
720 /* For reference buf[5]=3 is mark parity */
721 /* For reference buf[5]=4 is space parity */
722 if (C_PARODD(tty)) {
723 if (C_CMSPAR(tty)) {
724 buf[5] = 3;
725 dev_dbg(&port->dev, "parity = mark\n");
726 } else {
727 buf[5] = 1;
728 dev_dbg(&port->dev, "parity = odd\n");
729 }
730 } else {
731 if (C_CMSPAR(tty)) {
732 buf[5] = 4;
733 dev_dbg(&port->dev, "parity = space\n");
734 } else {
735 buf[5] = 2;
736 dev_dbg(&port->dev, "parity = even\n");
737 }
738 }
739 } else {
740 buf[5] = 0;
741 dev_dbg(&port->dev, "parity = none\n");
742 }
743
744 /*
745 * Some PL2303 are known to lose bytes if you change serial settings
746 * even to the same values as before. Thus we actually need to filter
747 * in this specific case.
748 *
749 * Note that the tty_termios_hw_change check above is not sufficient
750 * as a previously requested baud rate may differ from the one
751 * actually used (and stored in old_termios).
752 *
753 * NOTE: No additional locking needed for line_settings as it is
754 * only used in set_termios, which is serialised against itself.
755 */
756 if (!old_termios || memcmp(buf, priv->line_settings, 7)) {
757 ret = pl2303_set_line_request(port, buf);
758 if (!ret)
759 memcpy(priv->line_settings, buf, 7);
760 }
761
762 /* change control lines if we are switching to or from B0 */
763 spin_lock_irqsave(&priv->lock, flags);
764 control = priv->line_control;
765 if (C_BAUD(tty) == B0)
766 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
767 else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
768 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
769 if (control != priv->line_control) {
770 control = priv->line_control;
771 spin_unlock_irqrestore(&priv->lock, flags);
772 pl2303_set_control_lines(port, control);
773 } else {
774 spin_unlock_irqrestore(&priv->lock, flags);
775 }
776
777 if (C_CRTSCTS(tty)) {
778 if (spriv->quirks & PL2303_QUIRK_LEGACY) {
779 pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x40);
780 } else if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
781 pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
782 PL2303_HXN_FLOWCTRL_MASK,
783 PL2303_HXN_FLOWCTRL_RTS_CTS);
784 } else {
785 pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0x60);
786 }
787 } else if (pl2303_enable_xonxoff(tty, spriv->type)) {
788 if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
789 pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
790 PL2303_HXN_FLOWCTRL_MASK,
791 PL2303_HXN_FLOWCTRL_XON_XOFF);
792 } else {
793 pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0xc0);
794 }
795 } else {
796 if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
797 pl2303_update_reg(serial, PL2303_HXN_FLOWCTRL_REG,
798 PL2303_HXN_FLOWCTRL_MASK,
799 PL2303_HXN_FLOWCTRL_NONE);
800 } else {
801 pl2303_update_reg(serial, 0, PL2303_FLOWCTRL_MASK, 0);
802 }
803 }
804
805 kfree(buf);
806}
807
808static void pl2303_dtr_rts(struct usb_serial_port *port, int on)
809{
810 struct pl2303_private *priv = usb_get_serial_port_data(port);
811 unsigned long flags;
812 u8 control;
813
814 spin_lock_irqsave(&priv->lock, flags);
815 if (on)
816 priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
817 else
818 priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
819 control = priv->line_control;
820 spin_unlock_irqrestore(&priv->lock, flags);
821
822 pl2303_set_control_lines(port, control);
823}
824
825static void pl2303_close(struct usb_serial_port *port)
826{
827 usb_serial_generic_close(port);
828 usb_kill_urb(port->interrupt_in_urb);
829 pl2303_set_break(port, false);
830}
831
832static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
833{
834 struct usb_serial *serial = port->serial;
835 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
836 int result;
837
838 if (spriv->quirks & PL2303_QUIRK_LEGACY) {
839 usb_clear_halt(serial->dev, port->write_urb->pipe);
840 usb_clear_halt(serial->dev, port->read_urb->pipe);
841 } else {
842 /* reset upstream data pipes */
843 if (spriv->type == &pl2303_type_data[TYPE_HXN]) {
844 pl2303_vendor_write(serial, PL2303_HXN_RESET_REG,
845 PL2303_HXN_RESET_UPSTREAM_PIPE |
846 PL2303_HXN_RESET_DOWNSTREAM_PIPE);
847 } else {
848 pl2303_vendor_write(serial, 8, 0);
849 pl2303_vendor_write(serial, 9, 0);
850 }
851 }
852
853 /* Setup termios */
854 if (tty)
855 pl2303_set_termios(tty, port, NULL);
856
857 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
858 if (result) {
859 dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
860 result);
861 return result;
862 }
863
864 result = usb_serial_generic_open(tty, port);
865 if (result) {
866 usb_kill_urb(port->interrupt_in_urb);
867 return result;
868 }
869
870 return 0;
871}
872
873static int pl2303_tiocmset(struct tty_struct *tty,
874 unsigned int set, unsigned int clear)
875{
876 struct usb_serial_port *port = tty->driver_data;
877 struct pl2303_private *priv = usb_get_serial_port_data(port);
878 unsigned long flags;
879 u8 control;
880 int ret;
881
882 spin_lock_irqsave(&priv->lock, flags);
883 if (set & TIOCM_RTS)
884 priv->line_control |= CONTROL_RTS;
885 if (set & TIOCM_DTR)
886 priv->line_control |= CONTROL_DTR;
887 if (clear & TIOCM_RTS)
888 priv->line_control &= ~CONTROL_RTS;
889 if (clear & TIOCM_DTR)
890 priv->line_control &= ~CONTROL_DTR;
891 control = priv->line_control;
892 spin_unlock_irqrestore(&priv->lock, flags);
893
894 ret = pl2303_set_control_lines(port, control);
895 if (ret)
896 return usb_translate_errors(ret);
897
898 return 0;
899}
900
901static int pl2303_tiocmget(struct tty_struct *tty)
902{
903 struct usb_serial_port *port = tty->driver_data;
904 struct pl2303_private *priv = usb_get_serial_port_data(port);
905 unsigned long flags;
906 unsigned int mcr;
907 unsigned int status;
908 unsigned int result;
909
910 spin_lock_irqsave(&priv->lock, flags);
911 mcr = priv->line_control;
912 status = priv->line_status;
913 spin_unlock_irqrestore(&priv->lock, flags);
914
915 result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0)
916 | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0)
917 | ((status & UART_CTS) ? TIOCM_CTS : 0)
918 | ((status & UART_DSR) ? TIOCM_DSR : 0)
919 | ((status & UART_RING) ? TIOCM_RI : 0)
920 | ((status & UART_DCD) ? TIOCM_CD : 0);
921
922 dev_dbg(&port->dev, "%s - result = %x\n", __func__, result);
923
924 return result;
925}
926
927static int pl2303_carrier_raised(struct usb_serial_port *port)
928{
929 struct pl2303_private *priv = usb_get_serial_port_data(port);
930
931 if (priv->line_status & UART_DCD)
932 return 1;
933
934 return 0;
935}
936
937static int pl2303_get_serial(struct tty_struct *tty,
938 struct serial_struct *ss)
939{
940 struct usb_serial_port *port = tty->driver_data;
941
942 ss->type = PORT_16654;
943 ss->line = port->minor;
944 ss->port = port->port_number;
945 ss->baud_base = 460800;
946 return 0;
947}
948
949static void pl2303_set_break(struct usb_serial_port *port, bool enable)
950{
951 struct usb_serial *serial = port->serial;
952 u16 state;
953 int result;
954
955 if (enable)
956 state = BREAK_ON;
957 else
958 state = BREAK_OFF;
959
960 dev_dbg(&port->dev, "%s - turning break %s\n", __func__,
961 state == BREAK_OFF ? "off" : "on");
962
963 result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
964 BREAK_REQUEST, BREAK_REQUEST_TYPE, state,
965 0, NULL, 0, 100);
966 if (result)
967 dev_err(&port->dev, "error sending break = %d\n", result);
968}
969
970static void pl2303_break_ctl(struct tty_struct *tty, int state)
971{
972 struct usb_serial_port *port = tty->driver_data;
973
974 pl2303_set_break(port, state);
975}
976
977static void pl2303_update_line_status(struct usb_serial_port *port,
978 unsigned char *data,
979 unsigned int actual_length)
980{
981 struct usb_serial *serial = port->serial;
982 struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
983 struct pl2303_private *priv = usb_get_serial_port_data(port);
984 struct tty_struct *tty;
985 unsigned long flags;
986 unsigned int status_idx = UART_STATE_INDEX;
987 u8 status;
988 u8 delta;
989
990 if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0)
991 status_idx = 0;
992
993 if (actual_length < status_idx + 1)
994 return;
995
996 status = data[status_idx];
997
998 /* Save off the uart status for others to look at */
999 spin_lock_irqsave(&priv->lock, flags);
1000 delta = priv->line_status ^ status;
1001 priv->line_status = status;
1002 spin_unlock_irqrestore(&priv->lock, flags);
1003
1004 if (status & UART_BREAK_ERROR)
1005 usb_serial_handle_break(port);
1006
1007 if (delta & UART_STATE_MSR_MASK) {
1008 if (delta & UART_CTS)
1009 port->icount.cts++;
1010 if (delta & UART_DSR)
1011 port->icount.dsr++;
1012 if (delta & UART_RING)
1013 port->icount.rng++;
1014 if (delta & UART_DCD) {
1015 port->icount.dcd++;
1016 tty = tty_port_tty_get(&port->port);
1017 if (tty) {
1018 usb_serial_handle_dcd_change(port, tty,
1019 status & UART_DCD);
1020 tty_kref_put(tty);
1021 }
1022 }
1023
1024 wake_up_interruptible(&port->port.delta_msr_wait);
1025 }
1026}
1027
1028static void pl2303_read_int_callback(struct urb *urb)
1029{
1030 struct usb_serial_port *port = urb->context;
1031 unsigned char *data = urb->transfer_buffer;
1032 unsigned int actual_length = urb->actual_length;
1033 int status = urb->status;
1034 int retval;
1035
1036 switch (status) {
1037 case 0:
1038 /* success */
1039 break;
1040 case -ECONNRESET:
1041 case -ENOENT:
1042 case -ESHUTDOWN:
1043 /* this urb is terminated, clean up */
1044 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
1045 __func__, status);
1046 return;
1047 default:
1048 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
1049 __func__, status);
1050 goto exit;
1051 }
1052
1053 usb_serial_debug_data(&port->dev, __func__,
1054 urb->actual_length, urb->transfer_buffer);
1055
1056 pl2303_update_line_status(port, data, actual_length);
1057
1058exit:
1059 retval = usb_submit_urb(urb, GFP_ATOMIC);
1060 if (retval) {
1061 dev_err(&port->dev,
1062 "%s - usb_submit_urb failed with result %d\n",
1063 __func__, retval);
1064 }
1065}
1066
1067static void pl2303_process_read_urb(struct urb *urb)
1068{
1069 struct usb_serial_port *port = urb->context;
1070 struct pl2303_private *priv = usb_get_serial_port_data(port);
1071 unsigned char *data = urb->transfer_buffer;
1072 char tty_flag = TTY_NORMAL;
1073 unsigned long flags;
1074 u8 line_status;
1075 int i;
1076
1077 /* update line status */
1078 spin_lock_irqsave(&priv->lock, flags);
1079 line_status = priv->line_status;
1080 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
1081 spin_unlock_irqrestore(&priv->lock, flags);
1082
1083 if (!urb->actual_length)
1084 return;
1085
1086 /*
1087 * Break takes precedence over parity, which takes precedence over
1088 * framing errors.
1089 */
1090 if (line_status & UART_BREAK_ERROR)
1091 tty_flag = TTY_BREAK;
1092 else if (line_status & UART_PARITY_ERROR)
1093 tty_flag = TTY_PARITY;
1094 else if (line_status & UART_FRAME_ERROR)
1095 tty_flag = TTY_FRAME;
1096
1097 if (tty_flag != TTY_NORMAL)
1098 dev_dbg(&port->dev, "%s - tty_flag = %d\n", __func__,
1099 tty_flag);
1100 /* overrun is special, not associated with a char */
1101 if (line_status & UART_OVERRUN_ERROR)
1102 tty_insert_flip_char(&port->port, 0, TTY_OVERRUN);
1103
1104 if (port->sysrq) {
1105 for (i = 0; i < urb->actual_length; ++i)
1106 if (!usb_serial_handle_sysrq_char(port, data[i]))
1107 tty_insert_flip_char(&port->port, data[i],
1108 tty_flag);
1109 } else {
1110 tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,
1111 urb->actual_length);
1112 }
1113
1114 tty_flip_buffer_push(&port->port);
1115}
1116
1117static struct usb_serial_driver pl2303_device = {
1118 .driver = {
1119 .owner = THIS_MODULE,
1120 .name = "pl2303",
1121 },
1122 .id_table = id_table,
1123 .num_bulk_in = 1,
1124 .num_bulk_out = 1,
1125 .num_interrupt_in = 0, /* see pl2303_calc_num_ports */
1126 .bulk_in_size = 256,
1127 .bulk_out_size = 256,
1128 .open = pl2303_open,
1129 .close = pl2303_close,
1130 .dtr_rts = pl2303_dtr_rts,
1131 .carrier_raised = pl2303_carrier_raised,
1132 .get_serial = pl2303_get_serial,
1133 .break_ctl = pl2303_break_ctl,
1134 .set_termios = pl2303_set_termios,
1135 .tiocmget = pl2303_tiocmget,
1136 .tiocmset = pl2303_tiocmset,
1137 .tiocmiwait = usb_serial_generic_tiocmiwait,
1138 .process_read_urb = pl2303_process_read_urb,
1139 .read_int_callback = pl2303_read_int_callback,
1140 .probe = pl2303_probe,
1141 .calc_num_ports = pl2303_calc_num_ports,
1142 .attach = pl2303_startup,
1143 .release = pl2303_release,
1144 .port_probe = pl2303_port_probe,
1145 .port_remove = pl2303_port_remove,
1146};
1147
1148static struct usb_serial_driver * const serial_drivers[] = {
1149 &pl2303_device, NULL
1150};
1151
1152module_usb_serial_driver(serial_drivers, id_table);
1153
1154MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver");
1155MODULE_LICENSE("GPL v2");