diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2015-08-21 20:02:55 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-10-04 17:33:48 +0100 |
commit | e6403c112f8cf573147f621533d2fa2c3fe015de (patch) | |
tree | cf7bc9402cb3c3637ea8797179d33d0995509470 /drivers/tty/serial/sh-sci.c | |
parent | 7b39d901846d2548829e7788eefcfe9091224973 (diff) | |
download | linux-e6403c112f8cf573147f621533d2fa2c3fe015de.tar.bz2 |
serial: sh-sci: Don't call sci_rx_interrupt() on error when using DMA
The error handler calls sci_rx_interrupt() to drain the receive FIFO if
an error condition happens.
However, if DMA is enabled on SCIFA or SCIFB, this will call
disable_irq_nosync() twice. Due to this imbalance, the receive interrupt
will never be re-enabled, and reception stops forever.
To fix this, restrict draining the FIFO to PIO mode, and just call
sci_receive_chars() directly.
Inspired by a patch from Yoshihiro Shimoda
<yoshihiro.shimoda.uh@renesas.com>.
Reported-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/sh-sci.c')
-rw-r--r-- | drivers/tty/serial/sh-sci.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 70e16f402e31..82456fb09138 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -993,6 +993,7 @@ static irqreturn_t sci_tx_interrupt(int irq, void *ptr) static irqreturn_t sci_er_interrupt(int irq, void *ptr) { struct uart_port *port = ptr; + struct sci_port *s = to_sci_port(port); /* Handle errors */ if (port->type == PORT_SCI) { @@ -1003,7 +1004,8 @@ static irqreturn_t sci_er_interrupt(int irq, void *ptr) } } else { sci_handle_fifo_overrun(port); - sci_rx_interrupt(irq, ptr); + if (!s->chan_rx) + sci_receive_chars(ptr); } sci_clear_SCxSR(port, SCxSR_ERROR_CLEAR(port)); |