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

Commit 002eb41f authored by Charanya Venkatraman's avatar Charanya Venkatraman Committed by Greg Kroah-Hartman
Browse files

tty:serial:msm:Do not restore Rx interrupts in DMA



Avoid data corruption issues that result in CRC errors during file
transfers over serial ports at higher baud rates.

The current msm_serial driver masks the FIFO Rx interrupts in
msm_start_rx_dma() since Rx FIFO interrupts are not required in DMA
mode. However, msm_complete_rx_dma() re-enables the Rx FIFO interrupts
which could cause RXSTALE event to be processed when a TXLEV interrupt
occurs.

The following is the sequence of events that could occur resulting in
data corruption.

msm_start_rx_dma -> msm_complete_rx_dma -->
spin_unlock_irqrestore(&port->lock) -->
msm_uart_irq()(For TXLEV interrupt) -->  msm_handle_rx_dm() (Read from
FIFO resulting in data corruption)

The patch fixes the issue by not restoring the RXLEV and RXSTALE
interrupts in msm_complete_rx_dma(). These interrupts are required only
in FIFO mode.

Signed-off-by: default avatarCharanya Venkatraman <charanya@codeaurora.org>
Acked-by: default avatarAndy Gross <andy.gross@linaro.org>
Reviewed-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e4276ff8
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -557,10 +557,6 @@ static void msm_complete_rx_dma(void *args)
	val &= ~dma->enable_bit;
	msm_write(port, val, UARTDM_DMEN);

	/* Restore interrupts */
	msm_port->imr |= UART_IMR_RXLEV | UART_IMR_RXSTALE;
	msm_write(port, msm_port->imr, UART_IMR);

	if (msm_read(port, UART_SR) & UART_SR_OVERRUN) {
		port->icount.overrun++;
		tty_insert_flip_char(tport, 0, TTY_OVERRUN);