serial: sh-sci: Do not terminate DMA engine when race condition occurs
authorMuhammad Hamza Farooq <mfarooq@visteon.com>
Fri, 18 Sep 2015 11:08:31 +0000 (13:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Oct 2015 16:36:10 +0000 (17:36 +0100)
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>
drivers/tty/serial/sh-sci.c

index 84c15152e111b084cbb387e6a5c98b4ccb420cfc..9406fe227bc76c96da8ce78fe8e93c8bbfc30e1c 100644 (file)
@@ -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);