Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3bc46b31 authored by Maxime Bizon's avatar Maxime Bizon Committed by Greg Kroah-Hartman
Browse files

serial: bcm63xx_uart: fix irq storm after rx fifo overrun.



RX fifo reset is required to clear irq.

Signed-off-by: default avatarMaxime Bizon <mbizon@freebox.fr>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1a7d4369
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -250,6 +250,20 @@ static void bcm_uart_do_rx(struct uart_port *port)
		/* get overrun/fifo empty information from ier
		/* get overrun/fifo empty information from ier
		 * register */
		 * register */
		iestat = bcm_uart_readl(port, UART_IR_REG);
		iestat = bcm_uart_readl(port, UART_IR_REG);

		if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) {
			unsigned int val;

			/* fifo reset is required to clear
			 * interrupt */
			val = bcm_uart_readl(port, UART_CTL_REG);
			val |= UART_CTL_RSTRXFIFO_MASK;
			bcm_uart_writel(port, val, UART_CTL_REG);

			port->icount.overrun++;
			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
		}

		if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY)))
		if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY)))
			break;
			break;


@@ -284,10 +298,6 @@ static void bcm_uart_do_rx(struct uart_port *port)
		if (uart_handle_sysrq_char(port, c))
		if (uart_handle_sysrq_char(port, c))
			continue;
			continue;


		if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) {
			port->icount.overrun++;
			tty_insert_flip_char(tty, 0, TTY_OVERRUN);
		}


		if ((cstat & port->ignore_status_mask) == 0)
		if ((cstat & port->ignore_status_mask) == 0)
			tty_insert_flip_char(tty, c, flag);
			tty_insert_flip_char(tty, c, flag);