summaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial
diff options
context:
space:
mode:
authorJiada Wang2014-12-09 10:11:29 +0100
committerGreg Kroah-Hartman2015-01-09 23:23:07 +0100
commitd64b8607aceb9bd3b3dabddfc4f76458e5a8489d (patch)
tree12a74a895defc98a81441333bcedfd8c776031f4 /drivers/tty/serial
parentserial: imx: use dma_is_txing to synchronize dma_tx_callback and imx_dma_tx (diff)
downloadkernel-qcow2-linux-d64b8607aceb9bd3b3dabddfc4f76458e5a8489d.tar.gz
kernel-qcow2-linux-d64b8607aceb9bd3b3dabddfc4f76458e5a8489d.tar.xz
kernel-qcow2-linux-d64b8607aceb9bd3b3dabddfc4f76458e5a8489d.zip
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 <jiada_wang@mentor.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial')
-rw-r--r--drivers/tty/serial/imx.c3
1 files changed, 2 insertions, 1 deletions
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);