Commit 6399cc16 authored by Peter Senna Tschudin's avatar Peter Senna Tschudin Committed by Greg Kroah-Hartman

imx-serial: RX DMA startup latency

commit 4dec2f11 upstream.

18a42088 introduced a change to reduce the RX DMA latency on the first reception
when the serial port was opened for reading. However it was claiming a hardirq
unsafe lock after a hardirq safe lock which is not allowed and causes lockdep
to complain verbosely.

This patch changes the code to always start RX DMA earlier, instead of
relying on the flags used to open the serial port removing the code that
was looking for the serial file flags.
Signed-off-by: default avatarPeter Senna Tschudin <peter.senna@collabora.com>
Tested-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: default avatarFabio Estevam <festevam@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 34bfc894
...@@ -1340,30 +1340,14 @@ static int imx_startup(struct uart_port *port) ...@@ -1340,30 +1340,14 @@ static int imx_startup(struct uart_port *port)
imx_enable_ms(&sport->port); imx_enable_ms(&sport->port);
/* /*
* If the serial port is opened for reading start RX DMA immediately * Start RX DMA immediately instead of waiting for RX FIFO interrupts.
* instead of waiting for RX FIFO interrupts. In our iMX53 the average * In our iMX53 the average delay for the first reception dropped from
* delay for the first reception dropped from approximately 35000 * approximately 35000 microseconds to 1000 microseconds.
* microseconds to 1000 microseconds.
*/ */
if (sport->dma_is_enabled) { if (sport->dma_is_enabled) {
struct tty_struct *tty = sport->port.state->port.tty;
struct tty_file_private *file_priv;
int readcnt = 0;
spin_lock(&tty->files_lock);
if (!list_empty(&tty->tty_files))
list_for_each_entry(file_priv, &tty->tty_files, list)
if (!(file_priv->file->f_flags & O_WRONLY))
readcnt++;
spin_unlock(&tty->files_lock);
if (readcnt > 0) {
imx_disable_rx_int(sport); imx_disable_rx_int(sport);
start_rx_dma(sport); start_rx_dma(sport);
} }
}
spin_unlock_irqrestore(&sport->port.lock, flags); spin_unlock_irqrestore(&sport->port.lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment