FTDI UARTs support only 7 or 8 data dits. 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. Signed-off-by: Colin Leitner <colin.leitner@xxxxxxxxx> --- drivers/usb/serial/ftdi_sio.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index b21d553..2ff128c 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -2115,6 +2115,21 @@ static void ftdi_set_termios(struct tty_struct *tty, 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. + + This is no critical error, as termios(3) clearly states that users + have to check the settings to see if they took effect */ + if (((termios->c_cflag & CSIZE) != CS8) && + ((termios->c_cflag & CSIZE) != CS7)) { + if (old_termios) + termios->c_cflag = (termios->c_cflag & ~CSIZE) | + (old_termios->c_cflag & CSIZE); + else + termios->c_cflag = (termios->c_cflag & ~CSIZE) | CS8; + dev_info(ddev, "requested CSIZE setting not supported\n"); + } + cflag = termios->c_cflag; if (!old_termios) @@ -2151,19 +2166,19 @@ no_skip: } else { urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; } - if (cflag & CSIZE) { - switch (cflag & CSIZE) { - case CS7: - urb_value |= 7; - dev_dbg(ddev, "Setting CS7\n"); - break; - case CS8: - urb_value |= 8; - dev_dbg(ddev, "Setting CS8\n"); - break; - default: - dev_err(ddev, "CSIZE was set but not CS7-CS8\n"); - } + switch (cflag & CSIZE) { + case CS7: + urb_value |= 7; + dev_dbg(ddev, "Setting CS7\n"); + break; + case CS8: + urb_value |= 8; + dev_dbg(ddev, "Setting CS8\n"); + break; + default: + /* It would actually be a driver bug if we ended up in here */ + dev_err(ddev, "CSIZE was set but not CS7-CS8\n"); + break; } /* This is needed by the break command since it uses the same command -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html