]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/usb/hso.c
tty: Fix the HSO termios handling a bit
[linux-2.6-omap-h63xx.git] / drivers / net / usb / hso.c
index d345a6eec4caf2afefd1ec3774f40692af035d81..7373fb6b3f88bb08e748b1cf2b40c7a4a77d8381 100644 (file)
@@ -362,8 +362,6 @@ static struct tty_driver *tty_drv;
 static struct hso_device *serial_table[HSO_SERIAL_TTY_MINORS];
 static struct hso_device *network_table[HSO_MAX_NET_DEVICES];
 static spinlock_t serial_table_lock;
-static struct ktermios *hso_serial_termios[HSO_SERIAL_TTY_MINORS];
-static struct ktermios *hso_serial_termios_locked[HSO_SERIAL_TTY_MINORS];
 
 static const s32 default_port_spec[] = {
        HSO_INTF_MUX | HSO_PORT_NETWORK,
@@ -1009,23 +1007,11 @@ static void read_bulk_callback(struct urb *urb)
 
 /* Serial driver functions */
 
-static void _hso_serial_set_termios(struct tty_struct *tty,
-                                   struct ktermios *old)
+static void hso_init_termios(struct ktermios *termios)
 {
-       struct hso_serial *serial = get_serial_by_tty(tty);
-       struct ktermios *termios;
-
-       if (!serial) {
-               printk(KERN_ERR "%s: no tty structures", __func__);
-               return;
-       }
-
-       D4("port %d", serial->minor);
-
        /*
         * The default requirements for this device are:
         */
-       termios = tty->termios;
        termios->c_iflag &=
                ~(IGNBRK        /* disable ignore break */
                | BRKINT        /* disable break causes interrupt */
@@ -1057,15 +1043,38 @@ static void _hso_serial_set_termios(struct tty_struct *tty,
        termios->c_cflag |= CS8;        /* character size 8 bits */
 
        /* baud rate 115200 */
-       tty_encode_baud_rate(tty, 115200, 115200);
+       tty_termios_encode_baud_rate(termios, 115200, 115200);
+}
+
+static void _hso_serial_set_termios(struct tty_struct *tty,
+                                   struct ktermios *old)
+{
+       struct hso_serial *serial = get_serial_by_tty(tty);
+       struct ktermios *termios;
+
+       if (!serial) {
+               printk(KERN_ERR "%s: no tty structures", __func__);
+               return;
+       }
+
+       D4("port %d", serial->minor);
 
        /*
-        * Force low_latency on; otherwise the pushes are scheduled;
-        * this is bad as it opens up the possibility of dropping bytes
-        * on the floor.  We don't want to drop bytes on the floor. :)
+        *      Fix up unsupported bits
         */
-       tty->low_latency = 1;
-       return;
+       termios = tty->termios;
+       termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
+
+       termios->c_cflag &=
+               ~(CSIZE         /* no size */
+               | PARENB        /* disable parity bit */
+               | CBAUD         /* clear current baud rate */
+               | CBAUDEX);     /* clear current buad rate */
+
+       termios->c_cflag |= CS8;        /* character size 8 bits */
+
+       /* baud rate 115200 */
+       tty_encode_baud_rate(tty, 115200, 115200);
 }
 
 static void hso_resubmit_rx_bulk_urb(struct hso_serial *serial, struct urb *urb)
@@ -2969,9 +2978,7 @@ static int __init hso_init(void)
        tty_drv->subtype = SERIAL_TYPE_NORMAL;
        tty_drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
        tty_drv->init_termios = tty_std_termios;
-       tty_drv->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-       tty_drv->termios = hso_serial_termios;
-       tty_drv->termios_locked = hso_serial_termios_locked;
+       hso_init_termios(&tty_drv->init_termios);
        tty_set_operations(tty_drv, &hso_serial_ops);
 
        /* register the tty driver */