USB: serial: remove debug parameter from usb_serial_debug_data()
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / serial / mct_u232.c
1 /*
2 * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver
3 *
4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is largely derived from the Belkin USB Serial Adapter Driver
12 * (see belkin_sa.[ch]). All of the information about the device was acquired
13 * by using SniffUSB on Windows98. For technical details see mct_u232.h.
14 *
15 * William G. Greathouse and Greg Kroah-Hartman provided great help on how to
16 * do the reverse engineering and how to write a USB serial device driver.
17 *
18 * TO BE DONE, TO BE CHECKED:
19 * DTR/RTS signal handling may be incomplete or incorrect. I have mainly
20 * implemented what I have seen with SniffUSB or found in belkin_sa.c.
21 * For further TODOs check also belkin_sa.c.
22 */
23
24 #include <linux/kernel.h>
25 #include <linux/errno.h>
26 #include <linux/init.h>
27 #include <linux/slab.h>
28 #include <linux/tty.h>
29 #include <linux/tty_driver.h>
30 #include <linux/tty_flip.h>
31 #include <linux/module.h>
32 #include <linux/spinlock.h>
33 #include <linux/uaccess.h>
34 #include <asm/unaligned.h>
35 #include <linux/usb.h>
36 #include <linux/usb/serial.h>
37 #include <linux/serial.h>
38 #include <linux/ioctl.h>
39 #include "mct_u232.h"
40
41 /*
42 * Version Information
43 */
44 #define DRIVER_VERSION "z2.1" /* Linux in-kernel version */
45 #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
46 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
47
48 static bool debug;
49
50 /*
51 * Function prototypes
52 */
53 static int mct_u232_startup(struct usb_serial *serial);
54 static void mct_u232_release(struct usb_serial *serial);
55 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port);
56 static void mct_u232_close(struct usb_serial_port *port);
57 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on);
58 static void mct_u232_read_int_callback(struct urb *urb);
59 static void mct_u232_set_termios(struct tty_struct *tty,
60 struct usb_serial_port *port, struct ktermios *old);
61 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state);
62 static int mct_u232_tiocmget(struct tty_struct *tty);
63 static int mct_u232_tiocmset(struct tty_struct *tty,
64 unsigned int set, unsigned int clear);
65 static int mct_u232_ioctl(struct tty_struct *tty,
66 unsigned int cmd, unsigned long arg);
67 static int mct_u232_get_icount(struct tty_struct *tty,
68 struct serial_icounter_struct *icount);
69 static void mct_u232_throttle(struct tty_struct *tty);
70 static void mct_u232_unthrottle(struct tty_struct *tty);
71
72
73 /*
74 * All of the device info needed for the MCT USB-RS232 converter.
75 */
76 static const struct usb_device_id id_table[] = {
77 { USB_DEVICE(MCT_U232_VID, MCT_U232_PID) },
78 { USB_DEVICE(MCT_U232_VID, MCT_U232_SITECOM_PID) },
79 { USB_DEVICE(MCT_U232_VID, MCT_U232_DU_H3SP_PID) },
80 { USB_DEVICE(MCT_U232_BELKIN_F5U109_VID, MCT_U232_BELKIN_F5U109_PID) },
81 { } /* Terminating entry */
82 };
83 MODULE_DEVICE_TABLE(usb, id_table);
84
85 static struct usb_serial_driver mct_u232_device = {
86 .driver = {
87 .owner = THIS_MODULE,
88 .name = "mct_u232",
89 },
90 .description = "MCT U232",
91 .id_table = id_table,
92 .num_ports = 1,
93 .open = mct_u232_open,
94 .close = mct_u232_close,
95 .dtr_rts = mct_u232_dtr_rts,
96 .throttle = mct_u232_throttle,
97 .unthrottle = mct_u232_unthrottle,
98 .read_int_callback = mct_u232_read_int_callback,
99 .set_termios = mct_u232_set_termios,
100 .break_ctl = mct_u232_break_ctl,
101 .tiocmget = mct_u232_tiocmget,
102 .tiocmset = mct_u232_tiocmset,
103 .attach = mct_u232_startup,
104 .release = mct_u232_release,
105 .ioctl = mct_u232_ioctl,
106 .get_icount = mct_u232_get_icount,
107 };
108
109 static struct usb_serial_driver * const serial_drivers[] = {
110 &mct_u232_device, NULL
111 };
112
113 struct mct_u232_private {
114 spinlock_t lock;
115 unsigned int control_state; /* Modem Line Setting (TIOCM) */
116 unsigned char last_lcr; /* Line Control Register */
117 unsigned char last_lsr; /* Line Status Register */
118 unsigned char last_msr; /* Modem Status Register */
119 unsigned int rx_flags; /* Throttling flags */
120 struct async_icount icount;
121 wait_queue_head_t msr_wait; /* for handling sleeping while waiting
122 for msr change to happen */
123 };
124
125 #define THROTTLED 0x01
126
127 /*
128 * Handle vendor specific USB requests
129 */
130
131 #define WDR_TIMEOUT 5000 /* default urb timeout */
132
133 /*
134 * Later day 2.6.0-test kernels have new baud rates like B230400 which
135 * we do not know how to support. We ignore them for the moment.
136 */
137 static int mct_u232_calculate_baud_rate(struct usb_serial *serial,
138 speed_t value, speed_t *result)
139 {
140 *result = value;
141
142 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
143 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
144 switch (value) {
145 case 300:
146 return 0x01;
147 case 600:
148 return 0x02; /* this one not tested */
149 case 1200:
150 return 0x03;
151 case 2400:
152 return 0x04;
153 case 4800:
154 return 0x06;
155 case 9600:
156 return 0x08;
157 case 19200:
158 return 0x09;
159 case 38400:
160 return 0x0a;
161 case 57600:
162 return 0x0b;
163 case 115200:
164 return 0x0c;
165 default:
166 *result = 9600;
167 return 0x08;
168 }
169 } else {
170 /* FIXME: Can we use any divider - should we do
171 divider = 115200/value;
172 real baud = 115200/divider */
173 switch (value) {
174 case 300: break;
175 case 600: break;
176 case 1200: break;
177 case 2400: break;
178 case 4800: break;
179 case 9600: break;
180 case 19200: break;
181 case 38400: break;
182 case 57600: break;
183 case 115200: break;
184 default:
185 value = 9600;
186 *result = 9600;
187 }
188 return 115200/value;
189 }
190 }
191
192 static int mct_u232_set_baud_rate(struct tty_struct *tty,
193 struct usb_serial *serial, struct usb_serial_port *port, speed_t value)
194 {
195 unsigned int divisor;
196 int rc;
197 unsigned char *buf;
198 unsigned char cts_enable_byte = 0;
199 speed_t speed;
200
201 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
202 if (buf == NULL)
203 return -ENOMEM;
204
205 divisor = mct_u232_calculate_baud_rate(serial, value, &speed);
206 put_unaligned_le32(cpu_to_le32(divisor), buf);
207 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
208 MCT_U232_SET_BAUD_RATE_REQUEST,
209 MCT_U232_SET_REQUEST_TYPE,
210 0, 0, buf, MCT_U232_SET_BAUD_RATE_SIZE,
211 WDR_TIMEOUT);
212 if (rc < 0) /*FIXME: What value speed results */
213 dev_err(&port->dev, "Set BAUD RATE %d failed (error = %d)\n",
214 value, rc);
215 else
216 tty_encode_baud_rate(tty, speed, speed);
217 dev_dbg(&port->dev, "set_baud_rate: value: 0x%x, divisor: 0x%x\n", value, divisor);
218
219 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
220 always sends two extra USB 'device request' messages after the
221 'baud rate change' message. The actual functionality of the
222 request codes in these messages is not fully understood but these
223 particular codes are never seen in any operation besides a baud
224 rate change. Both of these messages send a single byte of data.
225 In the first message, the value of this byte is always zero.
226
227 The second message has been determined experimentally to control
228 whether data will be transmitted to a device which is not asserting
229 the 'CTS' signal. If the second message's data byte is zero, data
230 will be transmitted even if 'CTS' is not asserted (i.e. no hardware
231 flow control). if the second message's data byte is nonzero (a
232 value of 1 is used by this driver), data will not be transmitted to
233 a device which is not asserting 'CTS'.
234 */
235
236 buf[0] = 0;
237 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
238 MCT_U232_SET_UNKNOWN1_REQUEST,
239 MCT_U232_SET_REQUEST_TYPE,
240 0, 0, buf, MCT_U232_SET_UNKNOWN1_SIZE,
241 WDR_TIMEOUT);
242 if (rc < 0)
243 dev_err(&port->dev, "Sending USB device request code %d "
244 "failed (error = %d)\n", MCT_U232_SET_UNKNOWN1_REQUEST,
245 rc);
246
247 if (port && C_CRTSCTS(tty))
248 cts_enable_byte = 1;
249
250 dev_dbg(&port->dev, "set_baud_rate: send second control message, data = %02X\n",
251 cts_enable_byte);
252 buf[0] = cts_enable_byte;
253 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
254 MCT_U232_SET_CTS_REQUEST,
255 MCT_U232_SET_REQUEST_TYPE,
256 0, 0, buf, MCT_U232_SET_CTS_SIZE,
257 WDR_TIMEOUT);
258 if (rc < 0)
259 dev_err(&port->dev, "Sending USB device request code %d "
260 "failed (error = %d)\n", MCT_U232_SET_CTS_REQUEST, rc);
261
262 kfree(buf);
263 return rc;
264 } /* mct_u232_set_baud_rate */
265
266 static int mct_u232_set_line_ctrl(struct usb_serial_port *port,
267 unsigned char lcr)
268 {
269 int rc;
270 unsigned char *buf;
271
272 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
273 if (buf == NULL)
274 return -ENOMEM;
275
276 buf[0] = lcr;
277 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
278 MCT_U232_SET_LINE_CTRL_REQUEST,
279 MCT_U232_SET_REQUEST_TYPE,
280 0, 0, buf, MCT_U232_SET_LINE_CTRL_SIZE,
281 WDR_TIMEOUT);
282 if (rc < 0)
283 dev_err(&port->dev, "Set LINE CTRL 0x%x failed (error = %d)\n", lcr, rc);
284 dev_dbg(&port->dev, "set_line_ctrl: 0x%x\n", lcr);
285 kfree(buf);
286 return rc;
287 } /* mct_u232_set_line_ctrl */
288
289 static int mct_u232_set_modem_ctrl(struct usb_serial_port *port,
290 unsigned int control_state)
291 {
292 int rc;
293 unsigned char mcr;
294 unsigned char *buf;
295
296 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
297 if (buf == NULL)
298 return -ENOMEM;
299
300 mcr = MCT_U232_MCR_NONE;
301 if (control_state & TIOCM_DTR)
302 mcr |= MCT_U232_MCR_DTR;
303 if (control_state & TIOCM_RTS)
304 mcr |= MCT_U232_MCR_RTS;
305
306 buf[0] = mcr;
307 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
308 MCT_U232_SET_MODEM_CTRL_REQUEST,
309 MCT_U232_SET_REQUEST_TYPE,
310 0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE,
311 WDR_TIMEOUT);
312 kfree(buf);
313
314 dev_dbg(&port->dev, "set_modem_ctrl: state=0x%x ==> mcr=0x%x\n", control_state, mcr);
315
316 if (rc < 0) {
317 dev_err(&port->dev, "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
318 return rc;
319 }
320 return 0;
321 } /* mct_u232_set_modem_ctrl */
322
323 static int mct_u232_get_modem_stat(struct usb_serial_port *port,
324 unsigned char *msr)
325 {
326 int rc;
327 unsigned char *buf;
328
329 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
330 if (buf == NULL) {
331 *msr = 0;
332 return -ENOMEM;
333 }
334 rc = usb_control_msg(port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0),
335 MCT_U232_GET_MODEM_STAT_REQUEST,
336 MCT_U232_GET_REQUEST_TYPE,
337 0, 0, buf, MCT_U232_GET_MODEM_STAT_SIZE,
338 WDR_TIMEOUT);
339 if (rc < 0) {
340 dev_err(&port->dev, "Get MODEM STATus failed (error = %d)\n", rc);
341 *msr = 0;
342 } else {
343 *msr = buf[0];
344 }
345 dev_dbg(&port->dev, "get_modem_stat: 0x%x\n", *msr);
346 kfree(buf);
347 return rc;
348 } /* mct_u232_get_modem_stat */
349
350 static void mct_u232_msr_to_icount(struct async_icount *icount,
351 unsigned char msr)
352 {
353 /* Translate Control Line states */
354 if (msr & MCT_U232_MSR_DDSR)
355 icount->dsr++;
356 if (msr & MCT_U232_MSR_DCTS)
357 icount->cts++;
358 if (msr & MCT_U232_MSR_DRI)
359 icount->rng++;
360 if (msr & MCT_U232_MSR_DCD)
361 icount->dcd++;
362 } /* mct_u232_msr_to_icount */
363
364 static void mct_u232_msr_to_state(struct usb_serial_port *port,
365 unsigned int *control_state, unsigned char msr)
366 {
367 /* Translate Control Line states */
368 if (msr & MCT_U232_MSR_DSR)
369 *control_state |= TIOCM_DSR;
370 else
371 *control_state &= ~TIOCM_DSR;
372 if (msr & MCT_U232_MSR_CTS)
373 *control_state |= TIOCM_CTS;
374 else
375 *control_state &= ~TIOCM_CTS;
376 if (msr & MCT_U232_MSR_RI)
377 *control_state |= TIOCM_RI;
378 else
379 *control_state &= ~TIOCM_RI;
380 if (msr & MCT_U232_MSR_CD)
381 *control_state |= TIOCM_CD;
382 else
383 *control_state &= ~TIOCM_CD;
384 dev_dbg(&port->dev, "msr_to_state: msr=0x%x ==> state=0x%x\n", msr, *control_state);
385 } /* mct_u232_msr_to_state */
386
387 /*
388 * Driver's tty interface functions
389 */
390
391 static int mct_u232_startup(struct usb_serial *serial)
392 {
393 struct mct_u232_private *priv;
394 struct usb_serial_port *port, *rport;
395
396 priv = kzalloc(sizeof(struct mct_u232_private), GFP_KERNEL);
397 if (!priv)
398 return -ENOMEM;
399 spin_lock_init(&priv->lock);
400 init_waitqueue_head(&priv->msr_wait);
401 usb_set_serial_port_data(serial->port[0], priv);
402
403 init_waitqueue_head(&serial->port[0]->write_wait);
404
405 /* Puh, that's dirty */
406 port = serial->port[0];
407 rport = serial->port[1];
408 /* No unlinking, it wasn't submitted yet. */
409 usb_free_urb(port->read_urb);
410 port->read_urb = rport->interrupt_in_urb;
411 rport->interrupt_in_urb = NULL;
412 port->read_urb->context = port;
413
414 return 0;
415 } /* mct_u232_startup */
416
417
418 static void mct_u232_release(struct usb_serial *serial)
419 {
420 struct mct_u232_private *priv;
421 int i;
422
423 for (i = 0; i < serial->num_ports; ++i) {
424 /* My special items, the standard routines free my urbs */
425 priv = usb_get_serial_port_data(serial->port[i]);
426 kfree(priv);
427 }
428 } /* mct_u232_release */
429
430 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port)
431 {
432 struct usb_serial *serial = port->serial;
433 struct mct_u232_private *priv = usb_get_serial_port_data(port);
434 int retval = 0;
435 unsigned int control_state;
436 unsigned long flags;
437 unsigned char last_lcr;
438 unsigned char last_msr;
439
440 /* Compensate for a hardware bug: although the Sitecom U232-P25
441 * device reports a maximum output packet size of 32 bytes,
442 * it seems to be able to accept only 16 bytes (and that's what
443 * SniffUSB says too...)
444 */
445 if (le16_to_cpu(serial->dev->descriptor.idProduct)
446 == MCT_U232_SITECOM_PID)
447 port->bulk_out_size = 16;
448
449 /* Do a defined restart: the normal serial device seems to
450 * always turn on DTR and RTS here, so do the same. I'm not
451 * sure if this is really necessary. But it should not harm
452 * either.
453 */
454 spin_lock_irqsave(&priv->lock, flags);
455 if (tty && (tty->termios->c_cflag & CBAUD))
456 priv->control_state = TIOCM_DTR | TIOCM_RTS;
457 else
458 priv->control_state = 0;
459
460 priv->last_lcr = (MCT_U232_DATA_BITS_8 |
461 MCT_U232_PARITY_NONE |
462 MCT_U232_STOP_BITS_1);
463 control_state = priv->control_state;
464 last_lcr = priv->last_lcr;
465 spin_unlock_irqrestore(&priv->lock, flags);
466 mct_u232_set_modem_ctrl(port, control_state);
467 mct_u232_set_line_ctrl(port, last_lcr);
468
469 /* Read modem status and update control state */
470 mct_u232_get_modem_stat(port, &last_msr);
471 spin_lock_irqsave(&priv->lock, flags);
472 priv->last_msr = last_msr;
473 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
474 spin_unlock_irqrestore(&priv->lock, flags);
475
476 retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
477 if (retval) {
478 dev_err(&port->dev,
479 "usb_submit_urb(read bulk) failed pipe 0x%x err %d\n",
480 port->read_urb->pipe, retval);
481 goto error;
482 }
483
484 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
485 if (retval) {
486 usb_kill_urb(port->read_urb);
487 dev_err(&port->dev,
488 "usb_submit_urb(read int) failed pipe 0x%x err %d",
489 port->interrupt_in_urb->pipe, retval);
490 goto error;
491 }
492 return 0;
493
494 error:
495 return retval;
496 } /* mct_u232_open */
497
498 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on)
499 {
500 unsigned int control_state;
501 struct mct_u232_private *priv = usb_get_serial_port_data(port);
502
503 mutex_lock(&port->serial->disc_mutex);
504 if (!port->serial->disconnected) {
505 /* drop DTR and RTS */
506 spin_lock_irq(&priv->lock);
507 if (on)
508 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
509 else
510 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
511 control_state = priv->control_state;
512 spin_unlock_irq(&priv->lock);
513 mct_u232_set_modem_ctrl(port, control_state);
514 }
515 mutex_unlock(&port->serial->disc_mutex);
516 }
517
518 static void mct_u232_close(struct usb_serial_port *port)
519 {
520 if (port->serial->dev) {
521 /* shutdown our urbs */
522 usb_kill_urb(port->write_urb);
523 usb_kill_urb(port->read_urb);
524 usb_kill_urb(port->interrupt_in_urb);
525 }
526 } /* mct_u232_close */
527
528
529 static void mct_u232_read_int_callback(struct urb *urb)
530 {
531 struct usb_serial_port *port = urb->context;
532 struct mct_u232_private *priv = usb_get_serial_port_data(port);
533 struct tty_struct *tty;
534 unsigned char *data = urb->transfer_buffer;
535 int retval;
536 int status = urb->status;
537 unsigned long flags;
538
539 switch (status) {
540 case 0:
541 /* success */
542 break;
543 case -ECONNRESET:
544 case -ENOENT:
545 case -ESHUTDOWN:
546 /* this urb is terminated, clean up */
547 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
548 __func__, status);
549 return;
550 default:
551 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
552 __func__, status);
553 goto exit;
554 }
555
556 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
557
558 /*
559 * Work-a-round: handle the 'usual' bulk-in pipe here
560 */
561 if (urb->transfer_buffer_length > 2) {
562 if (urb->actual_length) {
563 tty = tty_port_tty_get(&port->port);
564 if (tty) {
565 tty_insert_flip_string(tty, data,
566 urb->actual_length);
567 tty_flip_buffer_push(tty);
568 }
569 tty_kref_put(tty);
570 }
571 goto exit;
572 }
573
574 /*
575 * The interrupt-in pipe signals exceptional conditions (modem line
576 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
577 */
578 spin_lock_irqsave(&priv->lock, flags);
579 priv->last_msr = data[MCT_U232_MSR_INDEX];
580
581 /* Record Control Line states */
582 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
583
584 mct_u232_msr_to_icount(&priv->icount, priv->last_msr);
585
586 #if 0
587 /* Not yet handled. See belkin_sa.c for further information */
588 /* Now to report any errors */
589 priv->last_lsr = data[MCT_U232_LSR_INDEX];
590 /*
591 * fill in the flip buffer here, but I do not know the relation
592 * to the current/next receive buffer or characters. I need
593 * to look in to this before committing any code.
594 */
595 if (priv->last_lsr & MCT_U232_LSR_ERR) {
596 tty = tty_port_tty_get(&port->port);
597 /* Overrun Error */
598 if (priv->last_lsr & MCT_U232_LSR_OE) {
599 }
600 /* Parity Error */
601 if (priv->last_lsr & MCT_U232_LSR_PE) {
602 }
603 /* Framing Error */
604 if (priv->last_lsr & MCT_U232_LSR_FE) {
605 }
606 /* Break Indicator */
607 if (priv->last_lsr & MCT_U232_LSR_BI) {
608 }
609 tty_kref_put(tty);
610 }
611 #endif
612 wake_up_interruptible(&priv->msr_wait);
613 spin_unlock_irqrestore(&priv->lock, flags);
614 exit:
615 retval = usb_submit_urb(urb, GFP_ATOMIC);
616 if (retval)
617 dev_err(&port->dev,
618 "%s - usb_submit_urb failed with result %d\n",
619 __func__, retval);
620 } /* mct_u232_read_int_callback */
621
622 static void mct_u232_set_termios(struct tty_struct *tty,
623 struct usb_serial_port *port,
624 struct ktermios *old_termios)
625 {
626 struct usb_serial *serial = port->serial;
627 struct mct_u232_private *priv = usb_get_serial_port_data(port);
628 struct ktermios *termios = tty->termios;
629 unsigned int cflag = termios->c_cflag;
630 unsigned int old_cflag = old_termios->c_cflag;
631 unsigned long flags;
632 unsigned int control_state;
633 unsigned char last_lcr;
634
635 /* get a local copy of the current port settings */
636 spin_lock_irqsave(&priv->lock, flags);
637 control_state = priv->control_state;
638 spin_unlock_irqrestore(&priv->lock, flags);
639 last_lcr = 0;
640
641 /*
642 * Update baud rate.
643 * Do not attempt to cache old rates and skip settings,
644 * disconnects screw such tricks up completely.
645 * Premature optimization is the root of all evil.
646 */
647
648 /* reassert DTR and RTS on transition from B0 */
649 if ((old_cflag & CBAUD) == B0) {
650 dev_dbg(&port->dev, "%s: baud was B0\n", __func__);
651 control_state |= TIOCM_DTR | TIOCM_RTS;
652 mct_u232_set_modem_ctrl(port, control_state);
653 }
654
655 mct_u232_set_baud_rate(tty, serial, port, tty_get_baud_rate(tty));
656
657 if ((cflag & CBAUD) == B0) {
658 dev_dbg(&port->dev, "%s: baud is B0\n", __func__);
659 /* Drop RTS and DTR */
660 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
661 mct_u232_set_modem_ctrl(port, control_state);
662 }
663
664 /*
665 * Update line control register (LCR)
666 */
667
668 /* set the parity */
669 if (cflag & PARENB)
670 last_lcr |= (cflag & PARODD) ?
671 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN;
672 else
673 last_lcr |= MCT_U232_PARITY_NONE;
674
675 /* set the number of data bits */
676 switch (cflag & CSIZE) {
677 case CS5:
678 last_lcr |= MCT_U232_DATA_BITS_5; break;
679 case CS6:
680 last_lcr |= MCT_U232_DATA_BITS_6; break;
681 case CS7:
682 last_lcr |= MCT_U232_DATA_BITS_7; break;
683 case CS8:
684 last_lcr |= MCT_U232_DATA_BITS_8; break;
685 default:
686 dev_err(&port->dev,
687 "CSIZE was not CS5-CS8, using default of 8\n");
688 last_lcr |= MCT_U232_DATA_BITS_8;
689 break;
690 }
691
692 termios->c_cflag &= ~CMSPAR;
693
694 /* set the number of stop bits */
695 last_lcr |= (cflag & CSTOPB) ?
696 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
697
698 mct_u232_set_line_ctrl(port, last_lcr);
699
700 /* save off the modified port settings */
701 spin_lock_irqsave(&priv->lock, flags);
702 priv->control_state = control_state;
703 priv->last_lcr = last_lcr;
704 spin_unlock_irqrestore(&priv->lock, flags);
705 } /* mct_u232_set_termios */
706
707 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state)
708 {
709 struct usb_serial_port *port = tty->driver_data;
710 struct mct_u232_private *priv = usb_get_serial_port_data(port);
711 unsigned char lcr;
712 unsigned long flags;
713
714 spin_lock_irqsave(&priv->lock, flags);
715 lcr = priv->last_lcr;
716
717 if (break_state)
718 lcr |= MCT_U232_SET_BREAK;
719 spin_unlock_irqrestore(&priv->lock, flags);
720
721 mct_u232_set_line_ctrl(port, lcr);
722 } /* mct_u232_break_ctl */
723
724
725 static int mct_u232_tiocmget(struct tty_struct *tty)
726 {
727 struct usb_serial_port *port = tty->driver_data;
728 struct mct_u232_private *priv = usb_get_serial_port_data(port);
729 unsigned int control_state;
730 unsigned long flags;
731
732 spin_lock_irqsave(&priv->lock, flags);
733 control_state = priv->control_state;
734 spin_unlock_irqrestore(&priv->lock, flags);
735
736 return control_state;
737 }
738
739 static int mct_u232_tiocmset(struct tty_struct *tty,
740 unsigned int set, unsigned int clear)
741 {
742 struct usb_serial_port *port = tty->driver_data;
743 struct mct_u232_private *priv = usb_get_serial_port_data(port);
744 unsigned int control_state;
745 unsigned long flags;
746
747 spin_lock_irqsave(&priv->lock, flags);
748 control_state = priv->control_state;
749
750 if (set & TIOCM_RTS)
751 control_state |= TIOCM_RTS;
752 if (set & TIOCM_DTR)
753 control_state |= TIOCM_DTR;
754 if (clear & TIOCM_RTS)
755 control_state &= ~TIOCM_RTS;
756 if (clear & TIOCM_DTR)
757 control_state &= ~TIOCM_DTR;
758
759 priv->control_state = control_state;
760 spin_unlock_irqrestore(&priv->lock, flags);
761 return mct_u232_set_modem_ctrl(port, control_state);
762 }
763
764 static void mct_u232_throttle(struct tty_struct *tty)
765 {
766 struct usb_serial_port *port = tty->driver_data;
767 struct mct_u232_private *priv = usb_get_serial_port_data(port);
768 unsigned int control_state;
769
770 spin_lock_irq(&priv->lock);
771 priv->rx_flags |= THROTTLED;
772 if (C_CRTSCTS(tty)) {
773 priv->control_state &= ~TIOCM_RTS;
774 control_state = priv->control_state;
775 spin_unlock_irq(&priv->lock);
776 mct_u232_set_modem_ctrl(port, control_state);
777 } else {
778 spin_unlock_irq(&priv->lock);
779 }
780 }
781
782 static void mct_u232_unthrottle(struct tty_struct *tty)
783 {
784 struct usb_serial_port *port = tty->driver_data;
785 struct mct_u232_private *priv = usb_get_serial_port_data(port);
786 unsigned int control_state;
787
788 spin_lock_irq(&priv->lock);
789 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) {
790 priv->rx_flags &= ~THROTTLED;
791 priv->control_state |= TIOCM_RTS;
792 control_state = priv->control_state;
793 spin_unlock_irq(&priv->lock);
794 mct_u232_set_modem_ctrl(port, control_state);
795 } else {
796 spin_unlock_irq(&priv->lock);
797 }
798 }
799
800 static int mct_u232_ioctl(struct tty_struct *tty,
801 unsigned int cmd, unsigned long arg)
802 {
803 DEFINE_WAIT(wait);
804 struct usb_serial_port *port = tty->driver_data;
805 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port);
806 struct async_icount cnow, cprev;
807 unsigned long flags;
808
809 dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd);
810
811 switch (cmd) {
812
813 case TIOCMIWAIT:
814
815 dev_dbg(&port->dev, "%s TIOCMIWAIT", __func__);
816
817 spin_lock_irqsave(&mct_u232_port->lock, flags);
818 cprev = mct_u232_port->icount;
819 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
820 for ( ; ; ) {
821 prepare_to_wait(&mct_u232_port->msr_wait,
822 &wait, TASK_INTERRUPTIBLE);
823 schedule();
824 finish_wait(&mct_u232_port->msr_wait, &wait);
825 /* see if a signal did it */
826 if (signal_pending(current))
827 return -ERESTARTSYS;
828 spin_lock_irqsave(&mct_u232_port->lock, flags);
829 cnow = mct_u232_port->icount;
830 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
831 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
832 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
833 return -EIO; /* no change => error */
834 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
835 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
836 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
837 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
838 return 0;
839 }
840 cprev = cnow;
841 }
842
843 }
844 return -ENOIOCTLCMD;
845 }
846
847 static int mct_u232_get_icount(struct tty_struct *tty,
848 struct serial_icounter_struct *icount)
849 {
850 struct usb_serial_port *port = tty->driver_data;
851 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port);
852 struct async_icount *ic = &mct_u232_port->icount;
853 unsigned long flags;
854
855 spin_lock_irqsave(&mct_u232_port->lock, flags);
856
857 icount->cts = ic->cts;
858 icount->dsr = ic->dsr;
859 icount->rng = ic->rng;
860 icount->dcd = ic->dcd;
861 icount->rx = ic->rx;
862 icount->tx = ic->tx;
863 icount->frame = ic->frame;
864 icount->overrun = ic->overrun;
865 icount->parity = ic->parity;
866 icount->brk = ic->brk;
867 icount->buf_overrun = ic->buf_overrun;
868
869 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
870
871 dev_dbg(&port->dev, "%s TIOCGICOUNT RX=%d, TX=%d\n",
872 __func__, icount->rx, icount->tx);
873 return 0;
874 }
875
876 module_usb_serial_driver(serial_drivers, id_table);
877
878 MODULE_AUTHOR(DRIVER_AUTHOR);
879 MODULE_DESCRIPTION(DRIVER_DESC);
880 MODULE_LICENSE("GPL");
881
882 module_param(debug, bool, S_IRUGO | S_IWUSR);
883 MODULE_PARM_DESC(debug, "Debug enabled or not");