patch "tty: serial: 21285: fix lockup on open" added to tty-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
tty: serial: 21285: fix lockup on open
to my tty git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git
in the tty-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 82776f6c75a90e1d2103e689b84a689de8f1aa02 Mon Sep 17 00:00:00 2001
From: Russell King <[email protected]>
Date: Sun, 18 Oct 2020 09:42:04 +0100
Subject: tty: serial: 21285: fix lockup on open
Commit 293f89959483 ("tty: serial: 21285: stop using the unused[] variable from struct uart_port") introduced a bug which stops the transmit interrupt being disabled when there are no characters to transmit - disabling the transmit interrupt at the interrupt controller is the only way to stop an interrupt storm. If this interrupt is not disabled when there are no transmit characters, we end up with an interrupt storm which prevents the machine making forward progress.
--- drivers/tty/serial/21285.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/tty/serial/21285.c +6 -6
@@ -50,25 +50,25 @@ static const char serial21285_name[] = "Footbridge UART";static bool is_enabled (struct uart_port *port,int bit) { -unsigned long private_data = (unsigned long )port->private_data; +unsigned long *private_data = (unsigned long *)&port->private_data; -if (test_bit (bit, &private_data)) +if (test_bit (bit, private_data))return true;return false; }static void enable (struct uart_port *port,int bit) { -unsigned long private_data = (unsigned long )port->private_data; +unsigned long *private_data = (unsigned long *)&port->private_data; -set_bit (bit, &private_data); +set_bit (bit, private_data); }static void disable (struct uart_port *port,int bit) { -unsigned long private_data = (unsigned long )port->private_data; +unsigned long *private_data = (unsigned long *)&port->private_data; -clear_bit (bit, &private_data); +clear_bit (bit, private_data); }#define is_tx_enabled (port) is_enabled(port, tx_enabled_bit)
Signature · 1 line
2.29.1