Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1f15196 authored by Colin Leitner's avatar Colin Leitner Committed by Greg Kroah-Hartman
Browse files

USB: ftdi_sio: added CS5 quirk for broken smartcard readers



Genuine FTDI chips support only CS7/8. A previous fix in commit
8704211f ("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: stable <stable@vger.kernel.org>
Reported-by: default avatarHeinrich Siebmanns <H.Siebmanns@t-online.de>
Tested-by: default avatarHeinrich Siebmanns <H.Siebmanns@t-online.de>
Signed-off-by: default avatarColin Leitner <colin.leitner@gmail.com>
Signed-off-by: default avatarJohan Hovold <jhovold@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 30666249
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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 @@ static void ftdi_set_termios(struct tty_struct *tty,
		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");