[PATCH 4.16 019/113] serial: mvebu-uart: Fix local flags handling on termios update

From: Greg Kroah-Hartman
Date: Mon Apr 30 2018 - 15:52:29 EST

4.16-stable review patch. If anyone has any objections, please let me know.


From: Marc Zyngier <marc.zyngier@xxxxxxx>

commit 46c6975a1fd9794ed979565235d24b2f5004e014 upstream.

Commit 68a0db1d7da2 reworked the baud rate selection, but also added
a (not so) subtle change in the way the local flags (c_lflag in the
termios structure) are handled, forcing the new flags to always be the
same as the old ones.

The reason for that particular change is both obscure and undocumented.
It also completely breaks userspace. Something as trivial as getty is

Debian GNU/Linux 9 sy-borg ttyMV0

sy-borg login: root

Debian GNU/Linux 9 sy-borg ttyMV0

which is quite obvious in retrospect: getty cannot get in control of
the echo mode, is stuck in canonical mode, and times out without ever
seeing anything valid. It also begs the question of how this change was
ever tested.

The fix is pretty obvious: stop messing with c_lflag, and the world
will be a happier place.

Cc: stable@xxxxxxxxxxxxxxx # 4.15+
Fixes: 68a0db1d7da2 ("serial: mvebu-uart: add function to change baudrate")
Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>

drivers/tty/serial/mvebu-uart.c | 1 -
1 file changed, 1 deletion(-)

--- a/drivers/tty/serial/mvebu-uart.c
+++ b/drivers/tty/serial/mvebu-uart.c
@@ -495,7 +495,6 @@ static void mvebu_uart_set_termios(struc
termios->c_iflag |= old->c_iflag & ~(INPCK | IGNPAR);
termios->c_cflag &= CREAD | CBAUD;
termios->c_cflag |= old->c_cflag & ~(CREAD | CBAUD);
- termios->c_lflag = old->c_lflag;

spin_unlock_irqrestore(&port->lock, flags);