|
|
@@ -583,10 +583,20 @@ static void tegra_uart_rx_dma_complete(void *args)
|
|
|
struct tty_struct *tty = tty_port_tty_get(&tup->uport.state->port);
|
|
|
struct tty_port *port = &u->state->port;
|
|
|
unsigned long flags;
|
|
|
+ struct dma_tx_state state;
|
|
|
+ enum dma_status status;
|
|
|
|
|
|
- async_tx_ack(tup->rx_dma_desc);
|
|
|
spin_lock_irqsave(&u->lock, flags);
|
|
|
|
|
|
+ status = dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
|
|
|
+
|
|
|
+ if (status == DMA_IN_PROGRESS) {
|
|
|
+ dev_dbg(tup->uport.dev, "RX DMA is in progress\n");
|
|
|
+ goto done;
|
|
|
+ }
|
|
|
+
|
|
|
+ async_tx_ack(tup->rx_dma_desc);
|
|
|
+
|
|
|
/* Deactivate flow control to stop sender */
|
|
|
if (tup->rts_active)
|
|
|
set_rts(tup, false);
|
|
|
@@ -607,6 +617,7 @@ static void tegra_uart_rx_dma_complete(void *args)
|
|
|
if (tup->rts_active)
|
|
|
set_rts(tup, true);
|
|
|
|
|
|
+done:
|
|
|
spin_unlock_irqrestore(&u->lock, flags);
|
|
|
}
|
|
|
|