Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bbc9b81 authored by Jiada Wang's avatar Jiada Wang Committed by Greg Kroah-Hartman
Browse files

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: default avatarJiada Wang <jiada_wang@mentor.com>
Signed-off-by: default avatarDirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d64b8607
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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)