]> www.infradead.org Git - users/jedix/linux-maple.git/commit
serial: 8250: Never adjust UART_LSR_DR in @read_status_mask
authorJohn Ogness <john.ogness@linutronix.de>
Mon, 16 Dec 2024 17:12:43 +0000 (18:18 +0106)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 23 Dec 2024 17:59:59 +0000 (18:59 +0100)
commit9c76c0fa81812619a3de4f3fc681f82c8dc17a66
tree7c9f4ddf23c29c410244bd04c7b5654bbb56cac9
parent9d31746b5385c3f760746f7b2d63b702e2f80de0
serial: 8250: Never adjust UART_LSR_DR in @read_status_mask

The CREAD feature of termios is implemented by setting/clearing
UART_LSR_DR within @ignore_status_mask. For this feature to
function correctly, it requires that UART_LSR_DR is never
masked (unset) in @read_status_mask so that uart_insert_char()
can properly drop the character if CREAD is disabled.

Currently there are code paths that clear/set UART_LSR_DR from
@read_status_mask at times. This appears to be a relic from
Linux 1.1.60, where @read_status_mask could be used to mask
all UART_LSR reading. However, since Linux 2.1.8 that is no
longer the case. Now if UART_LSR_DR is cleared from
@read_status_mask, received characters may not be dropped
even though CREAD is disabled.

This can be seen when:

- CREAD is disabled (UART_LSR_DR is set in @ignore_status_mask)
- LSR has an error bit set from UART_LSR_BRK_ERROR_BITS
  (and that error is not ignored via @ignore_status_mask)
- UART_LSR_DR is cleared in @read_status_mask

In this case characters will be inserted into the tty buffer
even though they should be ignored.

Remove all setting/clearing of UART_LSR_DR for
@read_status_mask except for its initialization.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Link: https://lore.kernel.org/r/20241216171244.12783-4-john.ogness@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_core.c
drivers/tty/serial/8250/8250_omap.c
drivers/tty/serial/8250/8250_port.c