On Mon, Jan 06, 2014 at 05:35:57PM +0100, Colin Leitner wrote:
> Genuine FTDI chips support only CS7/8. A previous fix enforced this
> limitation and reported it back to userspace.
Please include the commit id of the offending commit when fixing
regressions. In this case, you'd refer to commit 8704211f65a2 ("USB:
ftdi_sio: fixed handling of unsupported CSIZE setting").
> However, certain types of smartcard readers depend on specific
> driver behaviour that requests 0 data bits (not 5) to change into a
> different operating mode if CS5 has been set.
>
> This patch reenables this behaviour for all FTDI devices.
Makes sense.
> Tagged to be added to stable, because it affects a lot of users of
> embedded systems which rely on these readers to work properly.
>
> Cc: [email protected]
> Tested-by: Heinrich Siebmanns <[email protected]>
You should add a "Reported-by" tag as well.
> Signed-off-by: Colin Leitner <[email protected]>
> ---
> drivers/usb/serial/ftdi_sio.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
> index fb0d537..f3def6bb 100644
> --- a/drivers/usb/serial/ftdi_sio.c
> +++ b/drivers/usb/serial/ftdi_sio.c
> @@ -2125,9 +2125,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
>
> /*
> * All FTDI UART chips are limited to CS7/8. We won't pretend to
> - * support CS5/6 and revert the CSIZE setting instead.
> + * support CS6 and revert the CSIZE setting instead.
> + *
> + * Some smartcard readers abuse this limitation to switch modes.
> + * Original FTDI chips fall back to eight data bits.
Could you mention CS5 here? Are you sure we shouldn't just restore the
behaviour for CS6 as well?
> + *
> + * TODO: Implement a quirk to only allow this with mentioned
> + * readers. One I know of (Argolis Smartreader V1)
> + * returns "USB smartcard server" as iInterface string.
> + * The vendor didn't bother with a custom VID/PID of
> + * course.
> */
> - if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) {
> + if ((C_CSIZE(tty) != CS5)
> + && (C_CSIZE(tty) != CS8)
> + && (C_CSIZE(tty) != CS7)) {
Just do:
if (C_CSIZE(tty) == CS6)
as CSIZE is two bits wide.
> dev_warn(ddev, "requested CSIZE setting not supported\n");
>
> termios->c_cflag &= ~CSIZE;
> @@ -2174,6 +2185,9 @@ no_skip:
> urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;
> }
> switch (cflag & CSIZE) {
> + case CS5:
> + dev_dbg(ddev, "Setting CS5 quirk\n");
> + break;
> case CS7:
> urb_value |= 7;
> dev_dbg(ddev, "Setting CS7\n");
Thanks,
Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html