summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMuhammad Hamza Farooq <mfarooq@visteon.com>2015-09-18 13:08:31 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-10-04 17:36:10 +0100
commit3b963042b64f5de3c63a1ebcbe2cad6b1597b8b9 (patch)
treed4c46ca508d6382e87af00246de0fa762d9aeec0
parent1d3db608f933605d2dce44a0262ea94da3407465 (diff)
downloadop-kernel-dev-3b963042b64f5de3c63a1ebcbe2cad6b1597b8b9.zip
op-kernel-dev-3b963042b64f5de3c63a1ebcbe2cad6b1597b8b9.tar.gz
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>
-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);
OpenPOWER on IntegriCloud