Linux 3.9-rc4
[linux-2.6/cjktty.git] / drivers / usb / serial / mct_u232.c
blob06d5a60be2c4cb87279744372edef4a41864b74b
1 /*
2 * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver
4 * Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
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.
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.
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.
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.
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"
41 #define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
42 #define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
45 * Function prototypes
47 static int mct_u232_startup(struct usb_serial *serial);
48 static int mct_u232_port_probe(struct usb_serial_port *port);
49 static int mct_u232_port_remove(struct usb_serial_port *remove);
50 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port);
51 static void mct_u232_close(struct usb_serial_port *port);
52 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on);
53 static void mct_u232_read_int_callback(struct urb *urb);
54 static void mct_u232_set_termios(struct tty_struct *tty,
55 struct usb_serial_port *port, struct ktermios *old);
56 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state);
57 static int mct_u232_tiocmget(struct tty_struct *tty);
58 static int mct_u232_tiocmset(struct tty_struct *tty,
59 unsigned int set, unsigned int clear);
60 static int mct_u232_ioctl(struct tty_struct *tty,
61 unsigned int cmd, unsigned long arg);
62 static int mct_u232_get_icount(struct tty_struct *tty,
63 struct serial_icounter_struct *icount);
64 static void mct_u232_throttle(struct tty_struct *tty);
65 static void mct_u232_unthrottle(struct tty_struct *tty);
69 * All of the device info needed for the MCT USB-RS232 converter.
71 static const struct usb_device_id id_table[] = {
72 { USB_DEVICE(MCT_U232_VID, MCT_U232_PID) },
73 { USB_DEVICE(MCT_U232_VID, MCT_U232_SITECOM_PID) },
74 { USB_DEVICE(MCT_U232_VID, MCT_U232_DU_H3SP_PID) },
75 { USB_DEVICE(MCT_U232_BELKIN_F5U109_VID, MCT_U232_BELKIN_F5U109_PID) },
76 { } /* Terminating entry */
78 MODULE_DEVICE_TABLE(usb, id_table);
80 static struct usb_serial_driver mct_u232_device = {
81 .driver = {
82 .owner = THIS_MODULE,
83 .name = "mct_u232",
85 .description = "MCT U232",
86 .id_table = id_table,
87 .num_ports = 1,
88 .open = mct_u232_open,
89 .close = mct_u232_close,
90 .dtr_rts = mct_u232_dtr_rts,
91 .throttle = mct_u232_throttle,
92 .unthrottle = mct_u232_unthrottle,
93 .read_int_callback = mct_u232_read_int_callback,
94 .set_termios = mct_u232_set_termios,
95 .break_ctl = mct_u232_break_ctl,
96 .tiocmget = mct_u232_tiocmget,
97 .tiocmset = mct_u232_tiocmset,
98 .attach = mct_u232_startup,
99 .port_probe = mct_u232_port_probe,
100 .port_remove = mct_u232_port_remove,
101 .ioctl = mct_u232_ioctl,
102 .get_icount = mct_u232_get_icount,
105 static struct usb_serial_driver * const serial_drivers[] = {
106 &mct_u232_device, NULL
109 struct mct_u232_private {
110 spinlock_t lock;
111 unsigned int control_state; /* Modem Line Setting (TIOCM) */
112 unsigned char last_lcr; /* Line Control Register */
113 unsigned char last_lsr; /* Line Status Register */
114 unsigned char last_msr; /* Modem Status Register */
115 unsigned int rx_flags; /* Throttling flags */
116 struct async_icount icount;
119 #define THROTTLED 0x01
122 * Handle vendor specific USB requests
125 #define WDR_TIMEOUT 5000 /* default urb timeout */
128 * Later day 2.6.0-test kernels have new baud rates like B230400 which
129 * we do not know how to support. We ignore them for the moment.
131 static int mct_u232_calculate_baud_rate(struct usb_serial *serial,
132 speed_t value, speed_t *result)
134 *result = value;
136 if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
137 || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
138 switch (value) {
139 case 300:
140 return 0x01;
141 case 600:
142 return 0x02; /* this one not tested */
143 case 1200:
144 return 0x03;
145 case 2400:
146 return 0x04;
147 case 4800:
148 return 0x06;
149 case 9600:
150 return 0x08;
151 case 19200:
152 return 0x09;
153 case 38400:
154 return 0x0a;
155 case 57600:
156 return 0x0b;
157 case 115200:
158 return 0x0c;
159 default:
160 *result = 9600;
161 return 0x08;
163 } else {
164 /* FIXME: Can we use any divider - should we do
165 divider = 115200/value;
166 real baud = 115200/divider */
167 switch (value) {
168 case 300: break;
169 case 600: break;
170 case 1200: break;
171 case 2400: break;
172 case 4800: break;
173 case 9600: break;
174 case 19200: break;
175 case 38400: break;
176 case 57600: break;
177 case 115200: break;
178 default:
179 value = 9600;
180 *result = 9600;
182 return 115200/value;
186 static int mct_u232_set_baud_rate(struct tty_struct *tty,
187 struct usb_serial *serial, struct usb_serial_port *port, speed_t value)
189 unsigned int divisor;
190 int rc;
191 unsigned char *buf;
192 unsigned char cts_enable_byte = 0;
193 speed_t speed;
195 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
196 if (buf == NULL)
197 return -ENOMEM;
199 divisor = mct_u232_calculate_baud_rate(serial, value, &speed);
200 put_unaligned_le32(cpu_to_le32(divisor), buf);
201 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
202 MCT_U232_SET_BAUD_RATE_REQUEST,
203 MCT_U232_SET_REQUEST_TYPE,
204 0, 0, buf, MCT_U232_SET_BAUD_RATE_SIZE,
205 WDR_TIMEOUT);
206 if (rc < 0) /*FIXME: What value speed results */
207 dev_err(&port->dev, "Set BAUD RATE %d failed (error = %d)\n",
208 value, rc);
209 else
210 tty_encode_baud_rate(tty, speed, speed);
211 dev_dbg(&port->dev, "set_baud_rate: value: 0x%x, divisor: 0x%x\n", value, divisor);
213 /* Mimic the MCT-supplied Windows driver (version 1.21P.0104), which
214 always sends two extra USB 'device request' messages after the
215 'baud rate change' message. The actual functionality of the
216 request codes in these messages is not fully understood but these
217 particular codes are never seen in any operation besides a baud
218 rate change. Both of these messages send a single byte of data.
219 In the first message, the value of this byte is always zero.
221 The second message has been determined experimentally to control
222 whether data will be transmitted to a device which is not asserting
223 the 'CTS' signal. If the second message's data byte is zero, data
224 will be transmitted even if 'CTS' is not asserted (i.e. no hardware
225 flow control). if the second message's data byte is nonzero (a
226 value of 1 is used by this driver), data will not be transmitted to
227 a device which is not asserting 'CTS'.
230 buf[0] = 0;
231 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
232 MCT_U232_SET_UNKNOWN1_REQUEST,
233 MCT_U232_SET_REQUEST_TYPE,
234 0, 0, buf, MCT_U232_SET_UNKNOWN1_SIZE,
235 WDR_TIMEOUT);
236 if (rc < 0)
237 dev_err(&port->dev, "Sending USB device request code %d "
238 "failed (error = %d)\n", MCT_U232_SET_UNKNOWN1_REQUEST,
239 rc);
241 if (port && C_CRTSCTS(tty))
242 cts_enable_byte = 1;
244 dev_dbg(&port->dev, "set_baud_rate: send second control message, data = %02X\n",
245 cts_enable_byte);
246 buf[0] = cts_enable_byte;
247 rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
248 MCT_U232_SET_CTS_REQUEST,
249 MCT_U232_SET_REQUEST_TYPE,
250 0, 0, buf, MCT_U232_SET_CTS_SIZE,
251 WDR_TIMEOUT);
252 if (rc < 0)
253 dev_err(&port->dev, "Sending USB device request code %d "
254 "failed (error = %d)\n", MCT_U232_SET_CTS_REQUEST, rc);
256 kfree(buf);
257 return rc;
258 } /* mct_u232_set_baud_rate */
260 static int mct_u232_set_line_ctrl(struct usb_serial_port *port,
261 unsigned char lcr)
263 int rc;
264 unsigned char *buf;
266 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
267 if (buf == NULL)
268 return -ENOMEM;
270 buf[0] = lcr;
271 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
272 MCT_U232_SET_LINE_CTRL_REQUEST,
273 MCT_U232_SET_REQUEST_TYPE,
274 0, 0, buf, MCT_U232_SET_LINE_CTRL_SIZE,
275 WDR_TIMEOUT);
276 if (rc < 0)
277 dev_err(&port->dev, "Set LINE CTRL 0x%x failed (error = %d)\n", lcr, rc);
278 dev_dbg(&port->dev, "set_line_ctrl: 0x%x\n", lcr);
279 kfree(buf);
280 return rc;
281 } /* mct_u232_set_line_ctrl */
283 static int mct_u232_set_modem_ctrl(struct usb_serial_port *port,
284 unsigned int control_state)
286 int rc;
287 unsigned char mcr;
288 unsigned char *buf;
290 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
291 if (buf == NULL)
292 return -ENOMEM;
294 mcr = MCT_U232_MCR_NONE;
295 if (control_state & TIOCM_DTR)
296 mcr |= MCT_U232_MCR_DTR;
297 if (control_state & TIOCM_RTS)
298 mcr |= MCT_U232_MCR_RTS;
300 buf[0] = mcr;
301 rc = usb_control_msg(port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
302 MCT_U232_SET_MODEM_CTRL_REQUEST,
303 MCT_U232_SET_REQUEST_TYPE,
304 0, 0, buf, MCT_U232_SET_MODEM_CTRL_SIZE,
305 WDR_TIMEOUT);
306 kfree(buf);
308 dev_dbg(&port->dev, "set_modem_ctrl: state=0x%x ==> mcr=0x%x\n", control_state, mcr);
310 if (rc < 0) {
311 dev_err(&port->dev, "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr, rc);
312 return rc;
314 return 0;
315 } /* mct_u232_set_modem_ctrl */
317 static int mct_u232_get_modem_stat(struct usb_serial_port *port,
318 unsigned char *msr)
320 int rc;
321 unsigned char *buf;
323 buf = kmalloc(MCT_U232_MAX_SIZE, GFP_KERNEL);
324 if (buf == NULL) {
325 *msr = 0;
326 return -ENOMEM;
328 rc = usb_control_msg(port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0),
329 MCT_U232_GET_MODEM_STAT_REQUEST,
330 MCT_U232_GET_REQUEST_TYPE,
331 0, 0, buf, MCT_U232_GET_MODEM_STAT_SIZE,
332 WDR_TIMEOUT);
333 if (rc < 0) {
334 dev_err(&port->dev, "Get MODEM STATus failed (error = %d)\n", rc);
335 *msr = 0;
336 } else {
337 *msr = buf[0];
339 dev_dbg(&port->dev, "get_modem_stat: 0x%x\n", *msr);
340 kfree(buf);
341 return rc;
342 } /* mct_u232_get_modem_stat */
344 static void mct_u232_msr_to_icount(struct async_icount *icount,
345 unsigned char msr)
347 /* Translate Control Line states */
348 if (msr & MCT_U232_MSR_DDSR)
349 icount->dsr++;
350 if (msr & MCT_U232_MSR_DCTS)
351 icount->cts++;
352 if (msr & MCT_U232_MSR_DRI)
353 icount->rng++;
354 if (msr & MCT_U232_MSR_DCD)
355 icount->dcd++;
356 } /* mct_u232_msr_to_icount */
358 static void mct_u232_msr_to_state(struct usb_serial_port *port,
359 unsigned int *control_state, unsigned char msr)
361 /* Translate Control Line states */
362 if (msr & MCT_U232_MSR_DSR)
363 *control_state |= TIOCM_DSR;
364 else
365 *control_state &= ~TIOCM_DSR;
366 if (msr & MCT_U232_MSR_CTS)
367 *control_state |= TIOCM_CTS;
368 else
369 *control_state &= ~TIOCM_CTS;
370 if (msr & MCT_U232_MSR_RI)
371 *control_state |= TIOCM_RI;
372 else
373 *control_state &= ~TIOCM_RI;
374 if (msr & MCT_U232_MSR_CD)
375 *control_state |= TIOCM_CD;
376 else
377 *control_state &= ~TIOCM_CD;
378 dev_dbg(&port->dev, "msr_to_state: msr=0x%x ==> state=0x%x\n", msr, *control_state);
379 } /* mct_u232_msr_to_state */
382 * Driver's tty interface functions
385 static int mct_u232_startup(struct usb_serial *serial)
387 struct usb_serial_port *port, *rport;
389 /* Puh, that's dirty */
390 port = serial->port[0];
391 rport = serial->port[1];
392 /* No unlinking, it wasn't submitted yet. */
393 usb_free_urb(port->read_urb);
394 port->read_urb = rport->interrupt_in_urb;
395 rport->interrupt_in_urb = NULL;
396 port->read_urb->context = port;
398 return 0;
399 } /* mct_u232_startup */
401 static int mct_u232_port_probe(struct usb_serial_port *port)
403 struct mct_u232_private *priv;
405 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
406 if (!priv)
407 return -ENOMEM;
409 spin_lock_init(&priv->lock);
411 usb_set_serial_port_data(port, priv);
413 return 0;
416 static int mct_u232_port_remove(struct usb_serial_port *port)
418 struct mct_u232_private *priv;
420 priv = usb_get_serial_port_data(port);
421 kfree(priv);
423 return 0;
426 static int mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port)
428 struct usb_serial *serial = port->serial;
429 struct mct_u232_private *priv = usb_get_serial_port_data(port);
430 int retval = 0;
431 unsigned int control_state;
432 unsigned long flags;
433 unsigned char last_lcr;
434 unsigned char last_msr;
436 /* Compensate for a hardware bug: although the Sitecom U232-P25
437 * device reports a maximum output packet size of 32 bytes,
438 * it seems to be able to accept only 16 bytes (and that's what
439 * SniffUSB says too...)
441 if (le16_to_cpu(serial->dev->descriptor.idProduct)
442 == MCT_U232_SITECOM_PID)
443 port->bulk_out_size = 16;
445 /* Do a defined restart: the normal serial device seems to
446 * always turn on DTR and RTS here, so do the same. I'm not
447 * sure if this is really necessary. But it should not harm
448 * either.
450 spin_lock_irqsave(&priv->lock, flags);
451 if (tty && (tty->termios.c_cflag & CBAUD))
452 priv->control_state = TIOCM_DTR | TIOCM_RTS;
453 else
454 priv->control_state = 0;
456 priv->last_lcr = (MCT_U232_DATA_BITS_8 |
457 MCT_U232_PARITY_NONE |
458 MCT_U232_STOP_BITS_1);
459 control_state = priv->control_state;
460 last_lcr = priv->last_lcr;
461 spin_unlock_irqrestore(&priv->lock, flags);
462 mct_u232_set_modem_ctrl(port, control_state);
463 mct_u232_set_line_ctrl(port, last_lcr);
465 /* Read modem status and update control state */
466 mct_u232_get_modem_stat(port, &last_msr);
467 spin_lock_irqsave(&priv->lock, flags);
468 priv->last_msr = last_msr;
469 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
470 spin_unlock_irqrestore(&priv->lock, flags);
472 retval = usb_submit_urb(port->read_urb, GFP_KERNEL);
473 if (retval) {
474 dev_err(&port->dev,
475 "usb_submit_urb(read bulk) failed pipe 0x%x err %d\n",
476 port->read_urb->pipe, retval);
477 goto error;
480 retval = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
481 if (retval) {
482 usb_kill_urb(port->read_urb);
483 dev_err(&port->dev,
484 "usb_submit_urb(read int) failed pipe 0x%x err %d",
485 port->interrupt_in_urb->pipe, retval);
486 goto error;
488 return 0;
490 error:
491 return retval;
492 } /* mct_u232_open */
494 static void mct_u232_dtr_rts(struct usb_serial_port *port, int on)
496 unsigned int control_state;
497 struct mct_u232_private *priv = usb_get_serial_port_data(port);
499 spin_lock_irq(&priv->lock);
500 if (on)
501 priv->control_state |= TIOCM_DTR | TIOCM_RTS;
502 else
503 priv->control_state &= ~(TIOCM_DTR | TIOCM_RTS);
504 control_state = priv->control_state;
505 spin_unlock_irq(&priv->lock);
507 mct_u232_set_modem_ctrl(port, control_state);
510 static void mct_u232_close(struct usb_serial_port *port)
513 * Must kill the read urb as it is actually an interrupt urb, which
514 * generic close thus fails to kill.
516 usb_kill_urb(port->read_urb);
517 usb_kill_urb(port->interrupt_in_urb);
519 usb_serial_generic_close(port);
520 } /* mct_u232_close */
523 static void mct_u232_read_int_callback(struct urb *urb)
525 struct usb_serial_port *port = urb->context;
526 struct mct_u232_private *priv = usb_get_serial_port_data(port);
527 unsigned char *data = urb->transfer_buffer;
528 int retval;
529 int status = urb->status;
530 unsigned long flags;
532 switch (status) {
533 case 0:
534 /* success */
535 break;
536 case -ECONNRESET:
537 case -ENOENT:
538 case -ESHUTDOWN:
539 /* this urb is terminated, clean up */
540 dev_dbg(&port->dev, "%s - urb shutting down with status: %d\n",
541 __func__, status);
542 return;
543 default:
544 dev_dbg(&port->dev, "%s - nonzero urb status received: %d\n",
545 __func__, status);
546 goto exit;
549 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
552 * Work-a-round: handle the 'usual' bulk-in pipe here
554 if (urb->transfer_buffer_length > 2) {
555 if (urb->actual_length) {
556 tty_insert_flip_string(&port->port, data,
557 urb->actual_length);
558 tty_flip_buffer_push(&port->port);
560 goto exit;
564 * The interrupt-in pipe signals exceptional conditions (modem line
565 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
567 spin_lock_irqsave(&priv->lock, flags);
568 priv->last_msr = data[MCT_U232_MSR_INDEX];
570 /* Record Control Line states */
571 mct_u232_msr_to_state(port, &priv->control_state, priv->last_msr);
573 mct_u232_msr_to_icount(&priv->icount, priv->last_msr);
575 #if 0
576 /* Not yet handled. See belkin_sa.c for further information */
577 /* Now to report any errors */
578 priv->last_lsr = data[MCT_U232_LSR_INDEX];
580 * fill in the flip buffer here, but I do not know the relation
581 * to the current/next receive buffer or characters. I need
582 * to look in to this before committing any code.
584 if (priv->last_lsr & MCT_U232_LSR_ERR) {
585 tty = tty_port_tty_get(&port->port);
586 /* Overrun Error */
587 if (priv->last_lsr & MCT_U232_LSR_OE) {
589 /* Parity Error */
590 if (priv->last_lsr & MCT_U232_LSR_PE) {
592 /* Framing Error */
593 if (priv->last_lsr & MCT_U232_LSR_FE) {
595 /* Break Indicator */
596 if (priv->last_lsr & MCT_U232_LSR_BI) {
598 tty_kref_put(tty);
600 #endif
601 wake_up_interruptible(&port->delta_msr_wait);
602 spin_unlock_irqrestore(&priv->lock, flags);
603 exit:
604 retval = usb_submit_urb(urb, GFP_ATOMIC);
605 if (retval)
606 dev_err(&port->dev,
607 "%s - usb_submit_urb failed with result %d\n",
608 __func__, retval);
609 } /* mct_u232_read_int_callback */
611 static void mct_u232_set_termios(struct tty_struct *tty,
612 struct usb_serial_port *port,
613 struct ktermios *old_termios)
615 struct usb_serial *serial = port->serial;
616 struct mct_u232_private *priv = usb_get_serial_port_data(port);
617 struct ktermios *termios = &tty->termios;
618 unsigned int cflag = termios->c_cflag;
619 unsigned int old_cflag = old_termios->c_cflag;
620 unsigned long flags;
621 unsigned int control_state;
622 unsigned char last_lcr;
624 /* get a local copy of the current port settings */
625 spin_lock_irqsave(&priv->lock, flags);
626 control_state = priv->control_state;
627 spin_unlock_irqrestore(&priv->lock, flags);
628 last_lcr = 0;
631 * Update baud rate.
632 * Do not attempt to cache old rates and skip settings,
633 * disconnects screw such tricks up completely.
634 * Premature optimization is the root of all evil.
637 /* reassert DTR and RTS on transition from B0 */
638 if ((old_cflag & CBAUD) == B0) {
639 dev_dbg(&port->dev, "%s: baud was B0\n", __func__);
640 control_state |= TIOCM_DTR | TIOCM_RTS;
641 mct_u232_set_modem_ctrl(port, control_state);
644 mct_u232_set_baud_rate(tty, serial, port, tty_get_baud_rate(tty));
646 if ((cflag & CBAUD) == B0) {
647 dev_dbg(&port->dev, "%s: baud is B0\n", __func__);
648 /* Drop RTS and DTR */
649 control_state &= ~(TIOCM_DTR | TIOCM_RTS);
650 mct_u232_set_modem_ctrl(port, control_state);
654 * Update line control register (LCR)
657 /* set the parity */
658 if (cflag & PARENB)
659 last_lcr |= (cflag & PARODD) ?
660 MCT_U232_PARITY_ODD : MCT_U232_PARITY_EVEN;
661 else
662 last_lcr |= MCT_U232_PARITY_NONE;
664 /* set the number of data bits */
665 switch (cflag & CSIZE) {
666 case CS5:
667 last_lcr |= MCT_U232_DATA_BITS_5; break;
668 case CS6:
669 last_lcr |= MCT_U232_DATA_BITS_6; break;
670 case CS7:
671 last_lcr |= MCT_U232_DATA_BITS_7; break;
672 case CS8:
673 last_lcr |= MCT_U232_DATA_BITS_8; break;
674 default:
675 dev_err(&port->dev,
676 "CSIZE was not CS5-CS8, using default of 8\n");
677 last_lcr |= MCT_U232_DATA_BITS_8;
678 break;
681 termios->c_cflag &= ~CMSPAR;
683 /* set the number of stop bits */
684 last_lcr |= (cflag & CSTOPB) ?
685 MCT_U232_STOP_BITS_2 : MCT_U232_STOP_BITS_1;
687 mct_u232_set_line_ctrl(port, last_lcr);
689 /* save off the modified port settings */
690 spin_lock_irqsave(&priv->lock, flags);
691 priv->control_state = control_state;
692 priv->last_lcr = last_lcr;
693 spin_unlock_irqrestore(&priv->lock, flags);
694 } /* mct_u232_set_termios */
696 static void mct_u232_break_ctl(struct tty_struct *tty, int break_state)
698 struct usb_serial_port *port = tty->driver_data;
699 struct mct_u232_private *priv = usb_get_serial_port_data(port);
700 unsigned char lcr;
701 unsigned long flags;
703 spin_lock_irqsave(&priv->lock, flags);
704 lcr = priv->last_lcr;
706 if (break_state)
707 lcr |= MCT_U232_SET_BREAK;
708 spin_unlock_irqrestore(&priv->lock, flags);
710 mct_u232_set_line_ctrl(port, lcr);
711 } /* mct_u232_break_ctl */
714 static int mct_u232_tiocmget(struct tty_struct *tty)
716 struct usb_serial_port *port = tty->driver_data;
717 struct mct_u232_private *priv = usb_get_serial_port_data(port);
718 unsigned int control_state;
719 unsigned long flags;
721 spin_lock_irqsave(&priv->lock, flags);
722 control_state = priv->control_state;
723 spin_unlock_irqrestore(&priv->lock, flags);
725 return control_state;
728 static int mct_u232_tiocmset(struct tty_struct *tty,
729 unsigned int set, unsigned int clear)
731 struct usb_serial_port *port = tty->driver_data;
732 struct mct_u232_private *priv = usb_get_serial_port_data(port);
733 unsigned int control_state;
734 unsigned long flags;
736 spin_lock_irqsave(&priv->lock, flags);
737 control_state = priv->control_state;
739 if (set & TIOCM_RTS)
740 control_state |= TIOCM_RTS;
741 if (set & TIOCM_DTR)
742 control_state |= TIOCM_DTR;
743 if (clear & TIOCM_RTS)
744 control_state &= ~TIOCM_RTS;
745 if (clear & TIOCM_DTR)
746 control_state &= ~TIOCM_DTR;
748 priv->control_state = control_state;
749 spin_unlock_irqrestore(&priv->lock, flags);
750 return mct_u232_set_modem_ctrl(port, control_state);
753 static void mct_u232_throttle(struct tty_struct *tty)
755 struct usb_serial_port *port = tty->driver_data;
756 struct mct_u232_private *priv = usb_get_serial_port_data(port);
757 unsigned int control_state;
759 spin_lock_irq(&priv->lock);
760 priv->rx_flags |= THROTTLED;
761 if (C_CRTSCTS(tty)) {
762 priv->control_state &= ~TIOCM_RTS;
763 control_state = priv->control_state;
764 spin_unlock_irq(&priv->lock);
765 mct_u232_set_modem_ctrl(port, control_state);
766 } else {
767 spin_unlock_irq(&priv->lock);
771 static void mct_u232_unthrottle(struct tty_struct *tty)
773 struct usb_serial_port *port = tty->driver_data;
774 struct mct_u232_private *priv = usb_get_serial_port_data(port);
775 unsigned int control_state;
777 spin_lock_irq(&priv->lock);
778 if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) {
779 priv->rx_flags &= ~THROTTLED;
780 priv->control_state |= TIOCM_RTS;
781 control_state = priv->control_state;
782 spin_unlock_irq(&priv->lock);
783 mct_u232_set_modem_ctrl(port, control_state);
784 } else {
785 spin_unlock_irq(&priv->lock);
789 static int mct_u232_ioctl(struct tty_struct *tty,
790 unsigned int cmd, unsigned long arg)
792 DEFINE_WAIT(wait);
793 struct usb_serial_port *port = tty->driver_data;
794 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port);
795 struct async_icount cnow, cprev;
796 unsigned long flags;
798 dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd);
800 switch (cmd) {
802 case TIOCMIWAIT:
804 dev_dbg(&port->dev, "%s TIOCMIWAIT", __func__);
806 spin_lock_irqsave(&mct_u232_port->lock, flags);
807 cprev = mct_u232_port->icount;
808 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
809 for ( ; ; ) {
810 prepare_to_wait(&port->delta_msr_wait,
811 &wait, TASK_INTERRUPTIBLE);
812 schedule();
813 finish_wait(&port->delta_msr_wait, &wait);
814 /* see if a signal did it */
815 if (signal_pending(current))
816 return -ERESTARTSYS;
818 if (port->serial->disconnected)
819 return -EIO;
821 spin_lock_irqsave(&mct_u232_port->lock, flags);
822 cnow = mct_u232_port->icount;
823 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
824 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
825 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
826 return -EIO; /* no change => error */
827 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
828 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
829 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) ||
830 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) {
831 return 0;
833 cprev = cnow;
837 return -ENOIOCTLCMD;
840 static int mct_u232_get_icount(struct tty_struct *tty,
841 struct serial_icounter_struct *icount)
843 struct usb_serial_port *port = tty->driver_data;
844 struct mct_u232_private *mct_u232_port = usb_get_serial_port_data(port);
845 struct async_icount *ic = &mct_u232_port->icount;
846 unsigned long flags;
848 spin_lock_irqsave(&mct_u232_port->lock, flags);
850 icount->cts = ic->cts;
851 icount->dsr = ic->dsr;
852 icount->rng = ic->rng;
853 icount->dcd = ic->dcd;
854 icount->rx = ic->rx;
855 icount->tx = ic->tx;
856 icount->frame = ic->frame;
857 icount->overrun = ic->overrun;
858 icount->parity = ic->parity;
859 icount->brk = ic->brk;
860 icount->buf_overrun = ic->buf_overrun;
862 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
864 dev_dbg(&port->dev, "%s TIOCGICOUNT RX=%d, TX=%d\n",
865 __func__, icount->rx, icount->tx);
866 return 0;
869 module_usb_serial_driver(serial_drivers, id_table);
871 MODULE_AUTHOR(DRIVER_AUTHOR);
872 MODULE_DESCRIPTION(DRIVER_DESC);
873 MODULE_LICENSE("GPL");