Skip to content

Commit

Permalink
serial: 8250: 8250_omap: Fix possible interrupt storm
Browse files Browse the repository at this point in the history
It is possible that RX TIMEOUT is signalled after RX FIFO has been
drained, in which case a dummy read of RX FIFO is required to clear RX
TIMEOUT condition. Otherwise, RX TIMEOUT condition is not cleared
leading to an interrupt storm

Cc: stable@vger.kernel.org
Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Link: https://lore.kernel.org/r/20210511151955.28071-1-vigneshr@ti.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Vignesh Raghavendra authored and Greg Kroah-Hartman committed May 20, 2021
1 parent 1f06f57 commit 31fae7c
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions drivers/tty/serial/8250/8250_omap.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
#define UART_OMAP_EFR2 0x23
#define UART_OMAP_EFR2_TIMEOUT_BEHAVE BIT(6)

/* RX FIFO occupancy indicator */
#define UART_OMAP_RX_LVL 0x64

struct omap8250_priv {
int line;
u8 habit;
Expand Down Expand Up @@ -625,6 +628,15 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
serial8250_rpm_get(up);
iir = serial_port_in(port, UART_IIR);
ret = serial8250_handle_irq(port, iir);
/*
* It is possible that RX TIMEOUT is signalled after FIFO
* has been drained, in which case a dummy read of RX FIFO is
* required to clear RX TIMEOUT condition.
*/
if ((iir & UART_IIR_RX_TIMEOUT) == UART_IIR_RX_TIMEOUT) {
if (serial_port_in(port, UART_OMAP_RX_LVL) == 0)
serial_port_in(port, UART_RX);
}
serial8250_rpm_put(up);

return IRQ_RETVAL(ret);
Expand Down

0 comments on commit 31fae7c

Please sign in to comment.