From d64b8607aceb9bd3b3dabddfc4f76458e5a8489d Mon Sep 17 00:00:00 2001 From: Jiada Wang Date: Tue, 9 Dec 2014 18:11:29 +0900 Subject: [PATCH] Revert "serial: imx: always wake up the processes in the TX callback" This reverts commit 2ad28e3efee21a5bbf940c83d1f0395b76bd3efb. Instead of always wake up write_wait process in TX callback, TX callback should call imx_dma_tx() again, and let imx_dma_tx transfer the remaining data in circle buffer. The issue with commit 2ad28e3 is, in case there is remaining data in circle buffer, but no process is waiting on write_wait queue, then as no following uart_write() will be called after uart_write_wakeup(), thus cause data loss. Moreover according to Documentation/serial/driver, uart_write_wakeup() should be called in case the transmit buffer have dropped below a threshold. Signed-off-by: Jiada Wang Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/imx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 1c4f367b6fb6..73158d96822a 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -516,7 +516,8 @@ static void dma_tx_callback(void *data) spin_unlock_irqrestore(&sport->port.lock, flags); - uart_write_wakeup(&sport->port); + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) + uart_write_wakeup(&sport->port); if (waitqueue_active(&sport->dma_wait)) { wake_up(&sport->dma_wait); -- 2.11.4.GIT