提交 0bbc9b81 编写于 作者: J Jiada Wang 提交者: Greg Kroah-Hartman

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: NJiada Wang <jiada_wang@mentor.com>
Signed-off-by: NDirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 d64b8607
...@@ -495,6 +495,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport) ...@@ -495,6 +495,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
imx_stop_tx(&sport->port); imx_stop_tx(&sport->port);
} }
static void imx_dma_tx(struct imx_port *sport);
static void dma_tx_callback(void *data) static void dma_tx_callback(void *data)
{ {
struct imx_port *sport = data; struct imx_port *sport = data;
...@@ -524,6 +525,11 @@ static void dma_tx_callback(void *data) ...@@ -524,6 +525,11 @@ static void dma_tx_callback(void *data)
dev_dbg(sport->port.dev, "exit in %s.\n", __func__); dev_dbg(sport->port.dev, "exit in %s.\n", __func__);
return; 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) static void imx_dma_tx(struct imx_port *sport)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册