Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6.git] / drivers / usb / serial / mct_u232.c
1 /*
2  * MCT (Magic Control Technology Corp.) USB RS232 Converter Driver
3  *
4  *   Copyright (C) 2000 Wolfgang Grandegger (wolfgang@ces.ch)
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  * This program is largely derived from the Belkin USB Serial Adapter Driver
12  * (see belkin_sa.[ch]). All of the information about the device was acquired
13  * by using SniffUSB on Windows98. For technical details see mct_u232.h.
14  *
15  * William G. Greathouse and Greg Kroah-Hartman provided great help on how to
16  * do the reverse engineering and how to write a USB serial device driver.
17  *
18  * TO BE DONE, TO BE CHECKED:
19  *   DTR/RTS signal handling may be incomplete or incorrect. I have mainly
20  *   implemented what I have seen with SniffUSB or found in belkin_sa.c.
21  *   For further TODOs check also belkin_sa.c.
22  *
23  * 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, struct file *file);
107 static int  mct_u232_tiocmset(struct tty_struct *tty, struct file *file,
108                         unsigned int set, unsigned int clear);
109 static int  mct_u232_ioctl(struct tty_struct *tty, struct file *file,
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  */
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
793 static int mct_u232_tiocmget(struct tty_struct *tty, struct file *file)
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
809 static int mct_u232_tiocmset(struct tty_struct *tty, struct file *file,
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
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
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
877 static int  mct_u232_ioctl(struct tty_struct *tty, struct file *file,
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
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
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
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");