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