serial: bcm63xx_uart: fix irq storm after rx fifo overrun.
RX fifo reset is required to clear irq. Signed-off-by: Maxime Bizon <mbizon@freebox.fr> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
1a7d4369b3
Коммит
3bc46b312b
|
@ -250,6 +250,20 @@ static void bcm_uart_do_rx(struct uart_port *port)
|
|||
/* get overrun/fifo empty information from ier
|
||||
* register */
|
||||
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)))
|
||||
break;
|
||||
|
||||
|
@ -284,10 +298,6 @@ static void bcm_uart_do_rx(struct uart_port *port)
|
|||
if (uart_handle_sysrq_char(port, c))
|
||||
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)
|
||||
tty_insert_flip_char(tty, c, flag);
|
||||
|
|
Загрузка…
Ссылка в новой задаче