diff options
author | Maxime Bizon <mbizon@freebox.fr> | 2011-06-10 17:17:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-06-16 15:01:58 -0400 |
commit | 3bc46b312b1486b1fe2db4246a34a30160d26d8d (patch) | |
tree | 2aec20b62e923e3083c4c1d33c5bd4457e7e4194 /drivers/tty | |
parent | 1a7d4369b3fe1f8e5efe7f11a1c482055693852f (diff) |
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>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/bcm63xx_uart.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/tty/serial/bcm63xx_uart.c b/drivers/tty/serial/bcm63xx_uart.c index a1a0e55d0807..c0b68b9cad91 100644 --- a/drivers/tty/serial/bcm63xx_uart.c +++ b/drivers/tty/serial/bcm63xx_uart.c | |||
@@ -250,6 +250,20 @@ static void bcm_uart_do_rx(struct uart_port *port) | |||
250 | /* get overrun/fifo empty information from ier | 250 | /* get overrun/fifo empty information from ier |
251 | * register */ | 251 | * register */ |
252 | iestat = bcm_uart_readl(port, UART_IR_REG); | 252 | iestat = bcm_uart_readl(port, UART_IR_REG); |
253 | |||
254 | if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) { | ||
255 | unsigned int val; | ||
256 | |||
257 | /* fifo reset is required to clear | ||
258 | * interrupt */ | ||
259 | val = bcm_uart_readl(port, UART_CTL_REG); | ||
260 | val |= UART_CTL_RSTRXFIFO_MASK; | ||
261 | bcm_uart_writel(port, val, UART_CTL_REG); | ||
262 | |||
263 | port->icount.overrun++; | ||
264 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
265 | } | ||
266 | |||
253 | if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) | 267 | if (!(iestat & UART_IR_STAT(UART_IR_RXNOTEMPTY))) |
254 | break; | 268 | break; |
255 | 269 | ||
@@ -284,10 +298,6 @@ static void bcm_uart_do_rx(struct uart_port *port) | |||
284 | if (uart_handle_sysrq_char(port, c)) | 298 | if (uart_handle_sysrq_char(port, c)) |
285 | continue; | 299 | continue; |
286 | 300 | ||
287 | if (unlikely(iestat & UART_IR_STAT(UART_IR_RXOVER))) { | ||
288 | port->icount.overrun++; | ||
289 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | ||
290 | } | ||
291 | 301 | ||
292 | if ((cstat & port->ignore_status_mask) == 0) | 302 | if ((cstat & port->ignore_status_mask) == 0) |
293 | tty_insert_flip_char(tty, c, flag); | 303 | tty_insert_flip_char(tty, c, flag); |