USB: ssu100: set tty_flags in ssu100_process_packet
authorBill Pemberton <wfp5p@virginia.edu>
Fri, 13 Aug 2010 13:59:31 +0000 (09:59 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Aug 2010 03:50:16 +0000 (20:50 -0700)
flag was never set in ssu100_process_packet.  Add logic to set it
before calling tty_insert_flip_*

Signed-off-by: Bill Pemberton <wfp5p@virginia.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/ssu100.c

index 55e9672d286a6a3e9f857ddad6b5c0bddccedfc1..660c31f1499999e7def7e0644fc0b0f0a9859ddf 100644 (file)
@@ -602,7 +602,8 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr)
        }
 }
 
-static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr)
+static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,
+                             char *tty_flag)
 {
        struct ssu100_port_private *priv = usb_get_serial_port_data(port);
        unsigned long flags;
@@ -611,16 +612,32 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr)
        priv->shadowLSR = lsr;
        spin_unlock_irqrestore(&priv->status_lock, flags);
 
+       *tty_flag = TTY_NORMAL;
        if (lsr & UART_LSR_BRK_ERROR_BITS) {
-               if (lsr & UART_LSR_BI)
+               /* we always want to update icount, but we only want to
+                * update tty_flag for one case */
+               if (lsr & UART_LSR_BI) {
                        priv->icount.brk++;
-               if (lsr & UART_LSR_FE)
-                       priv->icount.frame++;
-               if (lsr & UART_LSR_PE)
+                       *tty_flag = TTY_BREAK;
+                       usb_serial_handle_break(port);
+               }
+               if (lsr & UART_LSR_PE) {
                        priv->icount.parity++;
-               if (lsr & UART_LSR_OE)
+                       if (*tty_flag == TTY_NORMAL)
+                               *tty_flag = TTY_PARITY;
+               }
+               if (lsr & UART_LSR_FE) {
+                       priv->icount.frame++;
+                       if (*tty_flag == TTY_NORMAL)
+                               *tty_flag = TTY_FRAME;
+               }
+               if (lsr & UART_LSR_OE){
                        priv->icount.overrun++;
+                       if (*tty_flag == TTY_NORMAL)
+                               *tty_flag = TTY_OVERRUN;
+               }
        }
+
 }
 
 static int ssu100_process_packet(struct tty_struct *tty,
@@ -629,7 +646,7 @@ static int ssu100_process_packet(struct tty_struct *tty,
                                 char *packet, int len)
 {
        int i;
-       char flag;
+       char flag = TTY_NORMAL;
        char *ch;
 
        dbg("%s - port %d", __func__, port->number);
@@ -637,8 +654,11 @@ static int ssu100_process_packet(struct tty_struct *tty,
        if ((len >= 4) &&
            (packet[0] == 0x1b) && (packet[1] == 0x1b) &&
            ((packet[2] == 0x00) || (packet[2] == 0x01))) {
-               if (packet[2] == 0x00)
-                       ssu100_update_lsr(port, packet[3]);
+               if (packet[2] == 0x00) {
+                       ssu100_update_lsr(port, packet[3], &flag);
+                       if (flag == TTY_OVERRUN)
+                               tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+               }
                if (packet[2] == 0x01)
                        ssu100_update_msr(port, packet[3]);