summaryrefslogtreecommitdiff
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorMuhammad Hamza Farooq <mfarooq@visteon.com>2015-09-18 11:08:31 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-10-04 16:36:10 (GMT)
commit3b963042b64f5de3c63a1ebcbe2cad6b1597b8b9 (patch)
treed4c46ca508d6382e87af00246de0fa762d9aeec0 /drivers/tty/serial
parent1d3db608f933605d2dce44a0262ea94da3407465 (diff)
downloadlinux-3b963042b64f5de3c63a1ebcbe2cad6b1597b8b9.tar.xz
serial: sh-sci: Do not terminate DMA engine when race condition occurs
When DMA packet completion and timer expiry take place at the same time, do not terminate the DMA engine, leading by submission of new descriptors, as the DMA communication hasn't necessarily stopped here. Signed-off-by: Muhammad Hamza Farooq <mfarooq@visteon.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')
-rw-r--r--drivers/tty/serial/sh-sci.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 84c1515..9406fe2 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1296,9 +1296,14 @@ static void rx_timer_fn(unsigned long arg)
}
status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state);
- if (status == DMA_COMPLETE)
+ if (status == DMA_COMPLETE) {
dev_dbg(port->dev, "Cookie %d #%d has already completed\n",
s->active_rx, active);
+ spin_unlock_irqrestore(&port->lock, flags);
+
+ /* Let packet complete handler take care of the packet */
+ return;
+ }
/* Handle incomplete DMA receive */
dmaengine_terminate_all(s->chan_rx);