Skip to content

Commit

Permalink
USB: ftdi_sio: clean up line-status handling
Browse files Browse the repository at this point in the history
Reverse priority of errors reported to ldisc so that it matches that of
other serial drivers (break takes precedence over parity, which takes
precedence over framing errors).

Also make sure overrun errors are handled as in other drivers, that is,
an overrun error is always reported and is not associated with any
received character (instead a NULL character with the TTY_OVERRUN flag
set is inserted).

Signed-off-by: Johan Hovold <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
jhovold authored and gregkh committed May 20, 2010
1 parent d45cc8d commit 166ceb6
Showing 1 changed file with 16 additions and 21 deletions.
37 changes: 16 additions & 21 deletions drivers/usb/serial/ftdi_sio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1767,6 +1767,8 @@ static int ftdi_prepare_write_buffer(struct usb_serial_port *port,
return count;
}

#define FTDI_RS_ERR_MASK (FTDI_RS_BI | FTDI_RS_PE | FTDI_RS_FE | FTDI_RS_OE)

static int ftdi_process_packet(struct tty_struct *tty,
struct usb_serial_port *port, struct ftdi_private *priv,
char *packet, int len)
Expand All @@ -1793,28 +1795,21 @@ static int ftdi_process_packet(struct tty_struct *tty,
priv->prev_status = status;
}

/*
* Although the device uses a bitmask and hence can have multiple
* errors on a packet - the order here sets the priority the error is
* returned to the tty layer.
*/
flag = TTY_NORMAL;
if (packet[1] & FTDI_RS_OE) {
flag = TTY_OVERRUN;
dbg("OVERRRUN error");
}
if (packet[1] & FTDI_RS_BI) {
flag = TTY_BREAK;
dbg("BREAK received");
usb_serial_handle_break(port);
}
if (packet[1] & FTDI_RS_PE) {
flag = TTY_PARITY;
dbg("PARITY error");
}
if (packet[1] & FTDI_RS_FE) {
flag = TTY_FRAME;
dbg("FRAMING error");
if (packet[1] & FTDI_RS_ERR_MASK) {
/* Break takes precedence over parity, which takes precedence
* over framing errors */
if (packet[1] & FTDI_RS_BI) {
flag = TTY_BREAK;
usb_serial_handle_break(port);
} else if (packet[1] & FTDI_RS_PE) {
flag = TTY_PARITY;
} else if (packet[1] & FTDI_RS_FE) {
flag = TTY_FRAME;
}
/* Overrun is special, not associated with a char */
if (packet[1] & FTDI_RS_OE)
tty_insert_flip_char(tty, 0, TTY_OVERRUN);
}

len -= 2;
Expand Down

0 comments on commit 166ceb6

Please sign in to comment.