mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
tty: fix termios input-speed encoding when using BOTHER
[ Upstream commit1cee38f036] When the termios CIBAUD bits are left unset (i.e. B0), we use the same output and input speed and should leave CIBAUD unchanged. When the user requests a rate using BOTHER and c_ospeed which the driver cannot set exactly, the driver can report back the actual baud rate using tty_termios_encode_baud_rate(). If this rate is close enough to a standard rate however, we could end up setting CIBAUD to a Bfoo value despite the user having left it unset. This in turn could lead to an unexpected input rate being set on subsequent termios updates. Fix this by using a zero tolerance value also for the input rate when CIBAUD is clear so that the matching logic works as expected. Fixes:78137e3b34("[PATCH] tty: improve encode_baud_rate logic") Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
24d7347116
commit
859a99742a
@@ -157,16 +157,20 @@ void tty_termios_encode_baud_rate(struct ktermios *termios,
|
||||
termios->c_ospeed = obaud;
|
||||
|
||||
#ifdef BOTHER
|
||||
if ((termios->c_cflag >> IBSHIFT) & CBAUD)
|
||||
ibinput = 1; /* An input speed was specified */
|
||||
|
||||
/* If the user asked for a precise weird speed give a precise weird
|
||||
answer. If they asked for a Bfoo speed they may have problems
|
||||
digesting non-exact replies so fuzz a bit */
|
||||
|
||||
if ((termios->c_cflag & CBAUD) == BOTHER)
|
||||
if ((termios->c_cflag & CBAUD) == BOTHER) {
|
||||
oclose = 0;
|
||||
if (!ibinput)
|
||||
iclose = 0;
|
||||
}
|
||||
if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
|
||||
iclose = 0;
|
||||
if ((termios->c_cflag >> IBSHIFT) & CBAUD)
|
||||
ibinput = 1; /* An input speed was specified */
|
||||
#endif
|
||||
termios->c_cflag &= ~CBAUD;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user