USB: keyspan: fix tty line-status reporting
Subsystems (4)
Johan Hovold
maintainerPATCH 1/3 USB: keyspan: fix tty line-status reporting
Fix handling of TTY error flags, which are not bitmasks and must specifically not be ORed together as this prevents the line discipline from recognising them.
Also insert null characters when reporting overrun errors as these are not associated with the received character.
Fixes 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc stable <[email protected]>
Signed-off-by Johan Hovold <[email protected]>
--- drivers/usb/serial/keyspan.c | 76 ++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 28 deletions(-)
drivers/usb/serial/keyspan.c +48 -28
@@ -321,14 +321,19 @@ static void usa26_indat_callback(struct urb *urb)/* some bytes had errors, every byte has status */ dev_dbg (&port->dev,"%s - RX error!!!!\n" , __func__);for (i =0 ; i +1 < urb->actual_length; i +=2 ) { -int stat = data[i], flag =0 ; -if (stat &RXERROR_OVERRUN ) - flag |=TTY_OVERRUN ; -if (stat &RXERROR_FRAMING ) - flag |=TTY_FRAME ; -if (stat &RXERROR_PARITY ) - flag |=TTY_PARITY ; +int stat = data[i]; +int flag =TTY_NORMAL ; + +if (stat &RXERROR_OVERRUN ) { +tty_insert_flip_char (&port->port,0 , +TTY_OVERRUN ); + }/* XXX should handle break (0x10) */ +if (stat &RXERROR_PARITY ) + flag =TTY_PARITY ; +else if (stat &RXERROR_FRAMING ) + flag =TTY_FRAME ; +tty_insert_flip_char (&port->port, data[i+1 ], flag); }
@@ -649,14 +654,19 @@ static void usa49_indat_callback(struct urb *urb) }else {/* some bytes had errors, every byte has status */ for (i =0 ; i +1 < urb->actual_length; i +=2 ) { -int stat = data[i], flag =0 ; -if (stat &RXERROR_OVERRUN ) - flag |=TTY_OVERRUN ; -if (stat &RXERROR_FRAMING ) - flag |=TTY_FRAME ; -if (stat &RXERROR_PARITY ) - flag |=TTY_PARITY ; +int stat = data[i]; +int flag =TTY_NORMAL ; + +if (stat &RXERROR_OVERRUN ) { +tty_insert_flip_char (&port->port,0 , +TTY_OVERRUN ); + }/* XXX should handle break (0x10) */ +if (stat &RXERROR_PARITY ) + flag =TTY_PARITY ; +else if (stat &RXERROR_FRAMING ) + flag =TTY_FRAME ; +tty_insert_flip_char (&port->port, data[i+1 ], flag); }
@@ -713,15 +723,19 @@ static void usa49wg_indat_callback(struct urb *urb)*/ for (x =0 ; x +1 < len && i +1 < urb->actual_length; x +=2 ) { -int stat = data[i], flag =0 ; +int stat = data[i]; +int flag =TTY_NORMAL ; -if (stat &RXERROR_OVERRUN ) - flag |=TTY_OVERRUN ; -if (stat &RXERROR_FRAMING ) - flag |=TTY_FRAME ; -if (stat &RXERROR_PARITY ) - flag |=TTY_PARITY ; +if (stat &RXERROR_OVERRUN ) { +tty_insert_flip_char (&port->port,0 , +TTY_OVERRUN ); + }/* XXX should handle break (0x10) */ +if (stat &RXERROR_PARITY ) + flag =TTY_PARITY ; +else if (stat &RXERROR_FRAMING ) + flag =TTY_FRAME ; +tty_insert_flip_char (&port->port, data[i+1 ], flag); i +=2 ;
@@ -784,14 +798,20 @@ static void usa90_indat_callback(struct urb *urb)/* some bytes had errors, every byte has status */ dev_dbg (&port->dev,"%s - RX error!!!!\n" , __func__);for (i =0 ; i +1 < urb->actual_length; i +=2 ) { -int stat = data[i], flag =0 ; -if (stat &RXERROR_OVERRUN ) - flag |=TTY_OVERRUN ; -if (stat &RXERROR_FRAMING ) - flag |=TTY_FRAME ; -if (stat &RXERROR_PARITY ) - flag |=TTY_PARITY ; +int stat = data[i]; +int flag =TTY_NORMAL ; + +if (stat &RXERROR_OVERRUN ) { +tty_insert_flip_char ( + &port->port,0 , +TTY_OVERRUN ); + }/* XXX should handle break (0x10) */ +if (stat &RXERROR_PARITY ) + flag =TTY_PARITY ; +else if (stat &RXERROR_FRAMING ) + flag =TTY_FRAME ; +tty_insert_flip_char (&port->port, data[i+1 ], flag); }
Signature · 1 line
2.0.4
Johan Hovold
maintainerPATCH 2/3 USB: keyspan: fix overrun-error reporting
Fix reporting of overrun errors, which are not associated with a character. Instead insert a null character and report only once.
Fixes 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc stable <[email protected]>
Signed-off-by Johan Hovold <[email protected]>
--- drivers/usb/serial/keyspan.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/usb/serial/keyspan.c +11 -10
@@ -311,12 +311,13 @@ static void usa26_indat_callback(struct urb *urb)if ((data[0 ] &0x80 ) ==0 ) {/* no errors on individual bytes, only possible overrun err */ -if (data[0 ] &RXERROR_OVERRUN ) - err =TTY_OVERRUN ; -else - err =0 ; +if (data[0 ] &RXERROR_OVERRUN ) { +tty_insert_flip_char (&port->port,0 , +TTY_OVERRUN ); + }for (i =1 ; i < urb->actual_length ; ++i) -tty_insert_flip_char (&port->port, data[i], err); +tty_insert_flip_char (&port->port, data[i], +TTY_NORMAL ); }else {/* some bytes had errors, every byte has status */ dev_dbg (&port->dev,"%s - RX error!!!!\n" , __func__);
@@ -787,13 +788,13 @@ static void usa90_indat_callback(struct urb *urb)if ((data[0 ] &0x80 ) ==0 ) {/* no errors on individual bytes, only possible overrun err*/ -if (data[0 ] &RXERROR_OVERRUN ) - err =TTY_OVERRUN ; -else - err =0 ; +if (data[0 ] &RXERROR_OVERRUN ) { +tty_insert_flip_char (&port->port,0 , +TTY_OVERRUN ); + }for (i =1 ; i < urb->actual_length ; ++i)tty_insert_flip_char (&port->port, - data[i], err); + data[i],TTY_NORMAL ); }else {/* some bytes had errors, every byte has status */ dev_dbg (&port->dev,"%s - RX error!!!!\n" , __func__);
Signature · 1 line
2.0.4
Johan Hovold
maintainerPATCH 3/3 USB: ssu100: fix overrun-error reporting
In reply to Johan HovoldFix reporting of overrun errors, which should only be reported once using the inserted null character.
Fixes 6b8f1ca5581b ("USB: ssu100: set tty_flags in ssu100_process_packet")
Cc stable <[email protected]>
Signed-off-by Johan Hovold <[email protected]>
--- drivers/usb/serial/ssu100.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/usb/serial/ssu100.c +3 -8
@@ -490,10 +490,9 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,if (*tty_flag ==TTY_NORMAL ) *tty_flag =TTY_FRAME ; } -if (lsr &UART_LSR_OE ){ +if (lsr &UART_LSR_OE ) { port->icount.overrun++; -if (*tty_flag ==TTY_NORMAL ) - *tty_flag =TTY_OVERRUN ; +tty_insert_flip_char (&port->port,0 ,TTY_OVERRUN ); } }
@@ -511,12 +510,8 @@ static void ssu100_process_read_urb(struct urb *urb)if ((len >=4 ) && (packet[0 ] ==0x1b ) && (packet[1 ] ==0x1b ) && ((packet[2 ] ==0x00 ) || (packet[2 ] ==0x01 ))) { -if (packet[2 ] ==0x00 ) { +if (packet[2 ] ==0x00 )ssu100_update_lsr (port, packet[3 ], &flag); -if (flag ==TTY_OVERRUN ) -tty_insert_flip_char (&port->port,0 , -TTY_OVERRUN ); - }if (packet[2 ] ==0x01 )ssu100_update_msr (port, packet[3 ]);
Signature · 1 line
2.0.4