diff options
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/tegra_hsuart.c | 10 |
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); } |