[PATCH] tty: serial: 21285: fix lockup on open
Greg Kroah-Hartman
gregkh at linuxfoundation.org
Mon Oct 19 03:00:46 EDT 2020
On Sun, Oct 18, 2020 at 09:42:04AM +0100, Russell King wrote:
> 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.
>
> Fixes: 293f89959483 ("tty: serial: 21285: stop using the unused[] variable from struct uart_port")
> Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>
> ---
> drivers/tty/serial/21285.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/tty/serial/21285.c b/drivers/tty/serial/21285.c
> index 718e010fcb04..09baef4ccc39 100644
> --- a/drivers/tty/serial/21285.c
> +++ b/drivers/tty/serial/21285.c
> @@ -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)
> --
> 2.20.1
>
Sorry about this, my fault. I'll merge this after 5.10-rc1 is out,
thanks for the fix.
greg k-h
More information about the linux-arm-kernel
mailing list