Commit 8704211f authored by Colin Leitner's avatar Colin Leitner Committed by Greg Kroah-Hartman

USB: ftdi_sio: fixed handling of unsupported CSIZE setting

FTDI UARTs support only 7 or 8 data bits. Until now the ftdi_sio driver would
only report this limitation for CS6 to dmesg and fail to reflect this fact to
tcgetattr.

This patch reverts the unsupported CSIZE setting and reports the fact with less
severance to dmesg for both CS5 and CS6.

To test the patch it's sufficient to call

    stty -F /dev/ttyUSB0 cs5

which will succeed without the patch and report an error with the patch
applied.

As an additional fix this patch ensures that the control request will always
include a data bit size.
Signed-off-by: default avatarColin Leitner <colin.leitner@gmail.com>
Signed-off-by: default avatarJohan Hovold <jhovold@gmail.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 78692cc3
...@@ -2123,6 +2123,20 @@ static void ftdi_set_termios(struct tty_struct *tty, ...@@ -2123,6 +2123,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
termios->c_cflag |= CRTSCTS; termios->c_cflag |= CRTSCTS;
} }
/*
* All FTDI UART chips are limited to CS7/8. We won't pretend to
* support CS5/6 and revert the CSIZE setting instead.
*/
if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) {
dev_warn(ddev, "requested CSIZE setting not supported\n");
termios->c_cflag &= ~CSIZE;
if (old_termios)
termios->c_cflag |= old_termios->c_cflag & CSIZE;
else
termios->c_cflag |= CS8;
}
cflag = termios->c_cflag; cflag = termios->c_cflag;
if (!old_termios) if (!old_termios)
...@@ -2159,19 +2173,16 @@ static void ftdi_set_termios(struct tty_struct *tty, ...@@ -2159,19 +2173,16 @@ static void ftdi_set_termios(struct tty_struct *tty,
} else { } else {
urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
} }
if (cflag & CSIZE) {
switch (cflag & CSIZE) { switch (cflag & CSIZE) {
case CS7: case CS7:
urb_value |= 7; urb_value |= 7;
dev_dbg(ddev, "Setting CS7\n"); dev_dbg(ddev, "Setting CS7\n");
break; break;
default:
case CS8: case CS8:
urb_value |= 8; urb_value |= 8;
dev_dbg(ddev, "Setting CS8\n"); dev_dbg(ddev, "Setting CS8\n");
break; break;
default:
dev_err(ddev, "CSIZE was set but not CS7-CS8\n");
}
} }
/* This is needed by the break command since it uses the same command /* This is needed by the break command since it uses the same command
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment