summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/tty/serial/tegra_hsuart.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/tty/serial/tegra_hsuart.c b/drivers/tty/serial/tegra_hsuart.c
index 26e9948e6bc1..9b24f2d9adda 100644
--- a/drivers/tty/serial/tegra_hsuart.c
+++ b/drivers/tty/serial/tegra_hsuart.c
@@ -497,6 +497,13 @@ static void tegra_tx_dma_complete_callback(struct tegra_dma_req *req)
dev_vdbg(t->uport.dev, "%s: %d\n", __func__, count);
+ /* Update xmit pointers without lock if dma aborted. */
+ if (req->status == -TEGRA_DMA_REQ_ERROR_ABORTED) {
+ xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
+ t->tx_in_progress = 0;
+ return;
+ }
+
spin_lock_irqsave(&t->uport.lock, flags);
xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
t->tx_in_progress = 0;
@@ -504,8 +511,7 @@ static void tegra_tx_dma_complete_callback(struct tegra_dma_req *req)
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(&t->uport);
- if (req->status != -TEGRA_DMA_REQ_ERROR_ABORTED)
- tegra_start_next_tx(t);
+ tegra_start_next_tx(t);
spin_unlock_irqrestore(&t->uport.lock, flags);
}