summaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/imx.c
diff options
context:
space:
mode:
authorJiada Wang2014-12-09 10:11:30 +0100
committerGreg Kroah-Hartman2015-01-09 23:23:07 +0100
commit0bbc9b81c1638f6e75c8ed423b5e6ae1a2035d79 (patch)
treefc5a6ce0b2610597c6d3dd6b5dc28e34c827ccd8 /drivers/tty/serial/imx.c
parentRevert "serial: imx: always wake up the processes in the TX callback" (diff)
downloadkernel-qcow2-linux-0bbc9b81c1638f6e75c8ed423b5e6ae1a2035d79.tar.gz
kernel-qcow2-linux-0bbc9b81c1638f6e75c8ed423b5e6ae1a2035d79.tar.xz
kernel-qcow2-linux-0bbc9b81c1638f6e75c8ed423b5e6ae1a2035d79.zip
serial: imx: call imx_dma_tx() again in dma_tx_callback
Currently in dma_tx_callback(), no matter if there is still remaining data pending in circle buffer or not, DMA transmit will be terminated. This will result in some data never get transmitted. In order to fix this issue, call imx_dma_tx() again in dma_tx_callback, when there is pending data and uart hasn't been stopped. Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/imx.c')
-rw-r--r--drivers/tty/serial/imx.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 73158d96822a..0e64f18f8c42 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -495,6 +495,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
imx_stop_tx(&sport->port);
}
+static void imx_dma_tx(struct imx_port *sport);
static void dma_tx_callback(void *data)
{
struct imx_port *sport = data;
@@ -524,6 +525,11 @@ static void dma_tx_callback(void *data)
dev_dbg(sport->port.dev, "exit in %s.\n", __func__);
return;
}
+
+ spin_lock_irqsave(&sport->port.lock, flags);
+ if (!uart_circ_empty(xmit) && !uart_tx_stopped(&sport->port))
+ imx_dma_tx(sport);
+ spin_unlock_irqrestore(&sport->port.lock, flags);
}
static void imx_dma_tx(struct imx_port *sport)