Skip to content

Commit 82776f6

Browse files
Russell Kinggregkh
authored andcommitted
tty: serial: 21285: fix lockup on open
Commit 293f899 ("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. Fixes: 293f899 ("tty: serial: 21285: stop using the unused[] variable from struct uart_port") Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Cc: stable <stable@vger.kernel.org> Link: https://lore.kernel.org/r/E1kU4GS-0006lE-OO@rmk-PC.armlinux.org.uk Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 3650b22 commit 82776f6

1 file changed

Lines changed: 6 additions & 6 deletions

File tree

drivers/tty/serial/21285.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,25 +50,25 @@ static const char serial21285_name[] = "Footbridge UART";
5050

5151
static bool is_enabled(struct uart_port *port, int bit)
5252
{
53-
unsigned long private_data = (unsigned long)port->private_data;
53+
unsigned long *private_data = (unsigned long *)&port->private_data;
5454

55-
if (test_bit(bit, &private_data))
55+
if (test_bit(bit, private_data))
5656
return true;
5757
return false;
5858
}
5959

6060
static void enable(struct uart_port *port, int bit)
6161
{
62-
unsigned long private_data = (unsigned long)port->private_data;
62+
unsigned long *private_data = (unsigned long *)&port->private_data;
6363

64-
set_bit(bit, &private_data);
64+
set_bit(bit, private_data);
6565
}
6666

6767
static void disable(struct uart_port *port, int bit)
6868
{
69-
unsigned long private_data = (unsigned long)port->private_data;
69+
unsigned long *private_data = (unsigned long *)&port->private_data;
7070

71-
clear_bit(bit, &private_data);
71+
clear_bit(bit, private_data);
7272
}
7373

7474
#define is_tx_enabled(port) is_enabled(port, tx_enabled_bit)

0 commit comments

Comments
 (0)