This patch is used to fix memory corruption issue when rx power off. 1. add spin lock in mtk8250_dma_rx_complete function in APDMA mode. 2. add processing mechanism which count value is 0 Signed-off-by: Zhiyong Tao <zhiyong.tao@xxxxxxxxxxxx> --- drivers/tty/serial/8250/8250_mtk.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c index f7d3023f860f..09f7d2166315 100644 --- a/drivers/tty/serial/8250/8250_mtk.c +++ b/drivers/tty/serial/8250/8250_mtk.c @@ -91,12 +91,15 @@ static void mtk8250_dma_rx_complete(void *param) struct mtk8250_data *data = up->port.private_data; struct tty_port *tty_port = &up->port.state->port; struct dma_tx_state state; - int copied, total, cnt; + unsigned int copied, total, cnt; unsigned char *ptr; + unsigned long flags; if (data->rx_status == DMA_RX_SHUTDOWN) return; + spin_lock_irqsave(&up->port.lock, flags); + dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state); total = dma->rx_size - state.residue; cnt = total; @@ -104,9 +107,11 @@ static void mtk8250_dma_rx_complete(void *param) if ((data->rx_pos + cnt) > dma->rx_size) cnt = dma->rx_size - data->rx_pos; - ptr = (unsigned char *)(data->rx_pos + dma->rx_buf); - copied = tty_insert_flip_string(tty_port, ptr, cnt); - data->rx_pos += cnt; + if (cnt != 0) { + ptr = (unsigned char *)(data->rx_pos + dma->rx_buf); + copied = tty_insert_flip_string(tty_port, ptr, cnt); + data->rx_pos += cnt; + } if (total > cnt) { ptr = (unsigned char *)(dma->rx_buf); @@ -120,6 +125,8 @@ static void mtk8250_dma_rx_complete(void *param) tty_flip_buffer_push(tty_port); mtk8250_rx_dma(up); + + spin_unlock_irqrestore(&up->port.lock, flags); } static void mtk8250_rx_dma(struct uart_8250_port *up) -- 2.18.0