@@ -602,7 +602,8 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr)
602
602
}
603
603
}
604
604
605
- static void ssu100_update_lsr (struct usb_serial_port * port , u8 lsr )
605
+ static void ssu100_update_lsr (struct usb_serial_port * port , u8 lsr ,
606
+ char * tty_flag )
606
607
{
607
608
struct ssu100_port_private * priv = usb_get_serial_port_data (port );
608
609
unsigned long flags ;
@@ -611,16 +612,32 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr)
611
612
priv -> shadowLSR = lsr ;
612
613
spin_unlock_irqrestore (& priv -> status_lock , flags );
613
614
615
+ * tty_flag = TTY_NORMAL ;
614
616
if (lsr & UART_LSR_BRK_ERROR_BITS ) {
615
- if (lsr & UART_LSR_BI )
617
+ /* we always want to update icount, but we only want to
618
+ * update tty_flag for one case */
619
+ if (lsr & UART_LSR_BI ) {
616
620
priv -> icount .brk ++ ;
617
- if (lsr & UART_LSR_FE )
618
- priv -> icount .frame ++ ;
619
- if (lsr & UART_LSR_PE )
621
+ * tty_flag = TTY_BREAK ;
622
+ usb_serial_handle_break (port );
623
+ }
624
+ if (lsr & UART_LSR_PE ) {
620
625
priv -> icount .parity ++ ;
621
- if (lsr & UART_LSR_OE )
626
+ if (* tty_flag == TTY_NORMAL )
627
+ * tty_flag = TTY_PARITY ;
628
+ }
629
+ if (lsr & UART_LSR_FE ) {
630
+ priv -> icount .frame ++ ;
631
+ if (* tty_flag == TTY_NORMAL )
632
+ * tty_flag = TTY_FRAME ;
633
+ }
634
+ if (lsr & UART_LSR_OE ){
622
635
priv -> icount .overrun ++ ;
636
+ if (* tty_flag == TTY_NORMAL )
637
+ * tty_flag = TTY_OVERRUN ;
638
+ }
623
639
}
640
+
624
641
}
625
642
626
643
static int ssu100_process_packet (struct tty_struct * tty ,
@@ -629,16 +646,19 @@ static int ssu100_process_packet(struct tty_struct *tty,
629
646
char * packet , int len )
630
647
{
631
648
int i ;
632
- char flag ;
649
+ char flag = TTY_NORMAL ;
633
650
char * ch ;
634
651
635
652
dbg ("%s - port %d" , __func__ , port -> number );
636
653
637
654
if ((len >= 4 ) &&
638
655
(packet [0 ] == 0x1b ) && (packet [1 ] == 0x1b ) &&
639
656
((packet [2 ] == 0x00 ) || (packet [2 ] == 0x01 ))) {
640
- if (packet [2 ] == 0x00 )
641
- ssu100_update_lsr (port , packet [3 ]);
657
+ if (packet [2 ] == 0x00 ) {
658
+ ssu100_update_lsr (port , packet [3 ], & flag );
659
+ if (flag == TTY_OVERRUN )
660
+ tty_insert_flip_char (tty , 0 , TTY_OVERRUN );
661
+ }
642
662
if (packet [2 ] == 0x01 )
643
663
ssu100_update_msr (port , packet [3 ]);
644
664
0 commit comments