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>
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"
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
);
74 * All of the device info needed for the MCT USB-RS232 converter.
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 */
83 MODULE_DEVICE_TABLE(usb
, id_table
);
85 static struct usb_serial_driver mct_u232_device
= {
90 .description
= "MCT U232",
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
,
109 static struct usb_serial_driver
* const serial_drivers
[] = {
110 &mct_u232_device
, NULL
113 struct mct_u232_private
{
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 */
125 #define THROTTLED 0x01
128 * Handle vendor specific USB requests
131 #define WDR_TIMEOUT 5000 /* default urb timeout */
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.
137 static int mct_u232_calculate_baud_rate(struct usb_serial
*serial
,
138 speed_t value
, speed_t
*result
)
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
) {
148 return 0x02; /* this one not tested */
170 /* FIXME: Can we use any divider - should we do
171 divider = 115200/value;
172 real baud = 115200/divider */
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
)
195 unsigned int divisor
;
198 unsigned char cts_enable_byte
= 0;
201 buf
= kmalloc(MCT_U232_MAX_SIZE
, GFP_KERNEL
);
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
,
212 if (rc
< 0) /*FIXME: What value speed results */
213 dev_err(&port
->dev
, "Set BAUD RATE %d failed (error = %d)\n",
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
);
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.
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'.
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
,
243 dev_err(&port
->dev
, "Sending USB device request code %d "
244 "failed (error = %d)\n", MCT_U232_SET_UNKNOWN1_REQUEST
,
247 if (port
&& C_CRTSCTS(tty
))
250 dev_dbg(&port
->dev
, "set_baud_rate: send second control message, data = %02X\n",
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
,
259 dev_err(&port
->dev
, "Sending USB device request code %d "
260 "failed (error = %d)\n", MCT_U232_SET_CTS_REQUEST
, rc
);
264 } /* mct_u232_set_baud_rate */
266 static int mct_u232_set_line_ctrl(struct usb_serial_port
*port
,
272 buf
= kmalloc(MCT_U232_MAX_SIZE
, GFP_KERNEL
);
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
,
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
);
287 } /* mct_u232_set_line_ctrl */
289 static int mct_u232_set_modem_ctrl(struct usb_serial_port
*port
,
290 unsigned int control_state
)
296 buf
= kmalloc(MCT_U232_MAX_SIZE
, GFP_KERNEL
);
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
;
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
,
314 dev_dbg(&port
->dev
, "set_modem_ctrl: state=0x%x ==> mcr=0x%x\n", control_state
, mcr
);
317 dev_err(&port
->dev
, "Set MODEM CTRL 0x%x failed (error = %d)\n", mcr
, rc
);
321 } /* mct_u232_set_modem_ctrl */
323 static int mct_u232_get_modem_stat(struct usb_serial_port
*port
,
329 buf
= kmalloc(MCT_U232_MAX_SIZE
, GFP_KERNEL
);
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
,
340 dev_err(&port
->dev
, "Get MODEM STATus failed (error = %d)\n", rc
);
345 dev_dbg(&port
->dev
, "get_modem_stat: 0x%x\n", *msr
);
348 } /* mct_u232_get_modem_stat */
350 static void mct_u232_msr_to_icount(struct async_icount
*icount
,
353 /* Translate Control Line states */
354 if (msr
& MCT_U232_MSR_DDSR
)
356 if (msr
& MCT_U232_MSR_DCTS
)
358 if (msr
& MCT_U232_MSR_DRI
)
360 if (msr
& MCT_U232_MSR_DCD
)
362 } /* mct_u232_msr_to_icount */
364 static void mct_u232_msr_to_state(struct usb_serial_port
*port
,
365 unsigned int *control_state
, unsigned char msr
)
367 /* Translate Control Line states */
368 if (msr
& MCT_U232_MSR_DSR
)
369 *control_state
|= TIOCM_DSR
;
371 *control_state
&= ~TIOCM_DSR
;
372 if (msr
& MCT_U232_MSR_CTS
)
373 *control_state
|= TIOCM_CTS
;
375 *control_state
&= ~TIOCM_CTS
;
376 if (msr
& MCT_U232_MSR_RI
)
377 *control_state
|= TIOCM_RI
;
379 *control_state
&= ~TIOCM_RI
;
380 if (msr
& MCT_U232_MSR_CD
)
381 *control_state
|= TIOCM_CD
;
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 */
388 * Driver's tty interface functions
391 static int mct_u232_startup(struct usb_serial
*serial
)
393 struct mct_u232_private
*priv
;
394 struct usb_serial_port
*port
, *rport
;
396 priv
= kzalloc(sizeof(struct mct_u232_private
), GFP_KERNEL
);
399 spin_lock_init(&priv
->lock
);
400 init_waitqueue_head(&priv
->msr_wait
);
401 usb_set_serial_port_data(serial
->port
[0], priv
);
403 init_waitqueue_head(&serial
->port
[0]->write_wait
);
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
;
415 } /* mct_u232_startup */
418 static void mct_u232_release(struct usb_serial
*serial
)
420 struct mct_u232_private
*priv
;
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
]);
428 } /* mct_u232_release */
430 static int mct_u232_open(struct tty_struct
*tty
, struct usb_serial_port
*port
)
432 struct usb_serial
*serial
= port
->serial
;
433 struct mct_u232_private
*priv
= usb_get_serial_port_data(port
);
435 unsigned int control_state
;
437 unsigned char last_lcr
;
438 unsigned char last_msr
;
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...)
445 if (le16_to_cpu(serial
->dev
->descriptor
.idProduct
)
446 == MCT_U232_SITECOM_PID
)
447 port
->bulk_out_size
= 16;
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
454 spin_lock_irqsave(&priv
->lock
, flags
);
455 if (tty
&& (tty
->termios
->c_cflag
& CBAUD
))
456 priv
->control_state
= TIOCM_DTR
| TIOCM_RTS
;
458 priv
->control_state
= 0;
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
);
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
);
476 retval
= usb_submit_urb(port
->read_urb
, GFP_KERNEL
);
479 "usb_submit_urb(read bulk) failed pipe 0x%x err %d\n",
480 port
->read_urb
->pipe
, retval
);
484 retval
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
486 usb_kill_urb(port
->read_urb
);
488 "usb_submit_urb(read int) failed pipe 0x%x err %d",
489 port
->interrupt_in_urb
->pipe
, retval
);
496 } /* mct_u232_open */
498 static void mct_u232_dtr_rts(struct usb_serial_port
*port
, int on
)
500 unsigned int control_state
;
501 struct mct_u232_private
*priv
= usb_get_serial_port_data(port
);
503 mutex_lock(&port
->serial
->disc_mutex
);
504 if (!port
->serial
->disconnected
) {
505 /* drop DTR and RTS */
506 spin_lock_irq(&priv
->lock
);
508 priv
->control_state
|= TIOCM_DTR
| TIOCM_RTS
;
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
);
515 mutex_unlock(&port
->serial
->disc_mutex
);
518 static void mct_u232_close(struct usb_serial_port
*port
)
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
);
526 } /* mct_u232_close */
529 static void mct_u232_read_int_callback(struct urb
*urb
)
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
;
536 int status
= urb
->status
;
546 /* this urb is terminated, clean up */
547 dev_dbg(&port
->dev
, "%s - urb shutting down with status: %d\n",
551 dev_dbg(&port
->dev
, "%s - nonzero urb status received: %d\n",
556 usb_serial_debug_data(&port
->dev
, __func__
, urb
->actual_length
, data
);
559 * Work-a-round: handle the 'usual' bulk-in pipe here
561 if (urb
->transfer_buffer_length
> 2) {
562 if (urb
->actual_length
) {
563 tty
= tty_port_tty_get(&port
->port
);
565 tty_insert_flip_string(tty
, data
,
567 tty_flip_buffer_push(tty
);
575 * The interrupt-in pipe signals exceptional conditions (modem line
576 * signal changes and errors). data[0] holds MSR, data[1] holds LSR.
578 spin_lock_irqsave(&priv
->lock
, flags
);
579 priv
->last_msr
= data
[MCT_U232_MSR_INDEX
];
581 /* Record Control Line states */
582 mct_u232_msr_to_state(port
, &priv
->control_state
, priv
->last_msr
);
584 mct_u232_msr_to_icount(&priv
->icount
, priv
->last_msr
);
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
];
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.
595 if (priv
->last_lsr
& MCT_U232_LSR_ERR
) {
596 tty
= tty_port_tty_get(&port
->port
);
598 if (priv
->last_lsr
& MCT_U232_LSR_OE
) {
601 if (priv
->last_lsr
& MCT_U232_LSR_PE
) {
604 if (priv
->last_lsr
& MCT_U232_LSR_FE
) {
606 /* Break Indicator */
607 if (priv
->last_lsr
& MCT_U232_LSR_BI
) {
612 wake_up_interruptible(&priv
->msr_wait
);
613 spin_unlock_irqrestore(&priv
->lock
, flags
);
615 retval
= usb_submit_urb(urb
, GFP_ATOMIC
);
618 "%s - usb_submit_urb failed with result %d\n",
620 } /* mct_u232_read_int_callback */
622 static void mct_u232_set_termios(struct tty_struct
*tty
,
623 struct usb_serial_port
*port
,
624 struct ktermios
*old_termios
)
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
;
632 unsigned int control_state
;
633 unsigned char last_lcr
;
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
);
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.
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
);
655 mct_u232_set_baud_rate(tty
, serial
, port
, tty_get_baud_rate(tty
));
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
);
665 * Update line control register (LCR)
670 last_lcr
|= (cflag
& PARODD
) ?
671 MCT_U232_PARITY_ODD
: MCT_U232_PARITY_EVEN
;
673 last_lcr
|= MCT_U232_PARITY_NONE
;
675 /* set the number of data bits */
676 switch (cflag
& CSIZE
) {
678 last_lcr
|= MCT_U232_DATA_BITS_5
; break;
680 last_lcr
|= MCT_U232_DATA_BITS_6
; break;
682 last_lcr
|= MCT_U232_DATA_BITS_7
; break;
684 last_lcr
|= MCT_U232_DATA_BITS_8
; break;
687 "CSIZE was not CS5-CS8, using default of 8\n");
688 last_lcr
|= MCT_U232_DATA_BITS_8
;
692 termios
->c_cflag
&= ~CMSPAR
;
694 /* set the number of stop bits */
695 last_lcr
|= (cflag
& CSTOPB
) ?
696 MCT_U232_STOP_BITS_2
: MCT_U232_STOP_BITS_1
;
698 mct_u232_set_line_ctrl(port
, last_lcr
);
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 */
707 static void mct_u232_break_ctl(struct tty_struct
*tty
, int break_state
)
709 struct usb_serial_port
*port
= tty
->driver_data
;
710 struct mct_u232_private
*priv
= usb_get_serial_port_data(port
);
714 spin_lock_irqsave(&priv
->lock
, flags
);
715 lcr
= priv
->last_lcr
;
718 lcr
|= MCT_U232_SET_BREAK
;
719 spin_unlock_irqrestore(&priv
->lock
, flags
);
721 mct_u232_set_line_ctrl(port
, lcr
);
722 } /* mct_u232_break_ctl */
725 static int mct_u232_tiocmget(struct tty_struct
*tty
)
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
;
732 spin_lock_irqsave(&priv
->lock
, flags
);
733 control_state
= priv
->control_state
;
734 spin_unlock_irqrestore(&priv
->lock
, flags
);
736 return control_state
;
739 static int mct_u232_tiocmset(struct tty_struct
*tty
,
740 unsigned int set
, unsigned int clear
)
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
;
747 spin_lock_irqsave(&priv
->lock
, flags
);
748 control_state
= priv
->control_state
;
751 control_state
|= TIOCM_RTS
;
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
;
759 priv
->control_state
= control_state
;
760 spin_unlock_irqrestore(&priv
->lock
, flags
);
761 return mct_u232_set_modem_ctrl(port
, control_state
);
764 static void mct_u232_throttle(struct tty_struct
*tty
)
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
;
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
);
778 spin_unlock_irq(&priv
->lock
);
782 static void mct_u232_unthrottle(struct tty_struct
*tty
)
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
;
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
);
796 spin_unlock_irq(&priv
->lock
);
800 static int mct_u232_ioctl(struct tty_struct
*tty
,
801 unsigned int cmd
, unsigned long arg
)
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
;
809 dev_dbg(&port
->dev
, "%s - cmd = 0x%x\n", __func__
, cmd
);
815 dev_dbg(&port
->dev
, "%s TIOCMIWAIT", __func__
);
817 spin_lock_irqsave(&mct_u232_port
->lock
, flags
);
818 cprev
= mct_u232_port
->icount
;
819 spin_unlock_irqrestore(&mct_u232_port
->lock
, flags
);
821 prepare_to_wait(&mct_u232_port
->msr_wait
,
822 &wait
, TASK_INTERRUPTIBLE
);
824 finish_wait(&mct_u232_port
->msr_wait
, &wait
);
825 /* see if a signal did it */
826 if (signal_pending(current
))
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
))) {
847 static int mct_u232_get_icount(struct tty_struct
*tty
,
848 struct serial_icounter_struct
*icount
)
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
;
855 spin_lock_irqsave(&mct_u232_port
->lock
, flags
);
857 icount
->cts
= ic
->cts
;
858 icount
->dsr
= ic
->dsr
;
859 icount
->rng
= ic
->rng
;
860 icount
->dcd
= ic
->dcd
;
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
;
869 spin_unlock_irqrestore(&mct_u232_port
->lock
, flags
);
871 dev_dbg(&port
->dev
, "%s TIOCGICOUNT RX=%d, TX=%d\n",
872 __func__
, icount
->rx
, icount
->tx
);
876 module_usb_serial_driver(serial_drivers
, id_table
);
878 MODULE_AUTHOR(DRIVER_AUTHOR
);
879 MODULE_DESCRIPTION(DRIVER_DESC
);
880 MODULE_LICENSE("GPL");
882 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
883 MODULE_PARM_DESC(debug
, "Debug enabled or not");