From: Colin Leitner <colin.leit...@googlemail.com>

Genuine FTDI chips support only CS7/8. A previous fix in commit
8704211f65a2 ("USB: ftdi_sio: fixed handling of unsupported CSIZE
setting") enforced this limitation and reported it back to userspace.

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.

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: sta...@vger.kernel.org
Reported-by: Heinrich Siebmanns <h.siebma...@t-online.de>
Tested-by: Heinrich Siebmanns <h.siebma...@t-online.de>
Signed-off-by: Colin Leitner <colin.leit...@gmail.com>
Signed-off-by: Johan Hovold <jhov...@gmail.com>
---

Greg, 

This patch fixes a reported regression in v3.13-rc which was
unfortunately also backported to stable.

Johan


 drivers/usb/serial/ftdi_sio.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index a4bebacc5cae..5057201bbba8 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -2121,10 +2121,20 @@ static void ftdi_set_termios(struct tty_struct *tty,
        }
 
        /*
-        * All FTDI UART chips are limited to CS7/8. We won't pretend to
+        * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to
         * support CS5/6 and revert the CSIZE setting instead.
+        *
+        * CS5 however is used to control some smartcard readers which abuse
+        * this limitation to switch modes. Original FTDI chips fall back to
+        * eight data bits.
+        *
+        * 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) == CS6) {
                dev_warn(ddev, "requested CSIZE setting not supported\n");
 
                termios->c_cflag &= ~CSIZE;
@@ -2171,6 +2181,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");
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to