提交 976b39cd 编写于 作者: L Lucas Stach 提交者: Greg Kroah-Hartman

serial: imx: always restart DMA if more data is available

Simplify the DMA restart logic to always queue up the next transfer
immediately if there is at least one more byte available in the FIFO,
so that the transfer will finish in a limited time.

This way the driver stops to rely on zero length transfers to signal
transfers ends. Those will go away when the idle detect DMA requests
are disabled.
Signed-off-by: NLucas Stach <l.stach@pengutronix.de>
Acked-by: NJiada Wang <jiada_wang@mentor.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 86a04ba6
...@@ -927,23 +927,20 @@ static void dma_rx_callback(void *data) ...@@ -927,23 +927,20 @@ static void dma_rx_callback(void *data)
sport->port.icount.buf_overrun++; sport->port.icount.buf_overrun++;
} }
tty_flip_buffer_push(port); tty_flip_buffer_push(port);
}
start_rx_dma(sport);
} else if (readl(sport->port.membase + USR2) & USR2_RDR) {
/* /*
* start rx_dma directly once data in RXFIFO, more efficient * Restart RX DMA directly if more data is available in order to skip
* than before: * the roundtrip through the IRQ handler. If there is some data already
* 1. call imx_rx_dma_done to stop dma if no data received * in the FIFO, DMA needs to be restarted soon anyways.
* 2. wait next RDR interrupt to start dma transfer. *
* Otherwise stop the DMA and reactivate FIFO IRQs to restart DMA once
* data starts to arrive again.
*/ */
if (readl(sport->port.membase + USR2) & USR2_RDR)
start_rx_dma(sport); start_rx_dma(sport);
} else { else
/*
* stop dma to prevent too many IDLE event trigged if no data
* in RXFIFO
*/
imx_rx_dma_done(sport); imx_rx_dma_done(sport);
}
} }
static int start_rx_dma(struct imx_port *sport) static int start_rx_dma(struct imx_port *sport)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册