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