]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00322581-03 tty: serial: imx: start rx_dma once RXFIFO is not empty
authorRobin Gong <b38343@freescale.com>
Fri, 11 Jul 2014 09:47:17 +0000 (17:47 +0800)
committerNitin Garg <nitin.garg@freescale.com>
Fri, 16 Jan 2015 03:17:09 +0000 (21:17 -0600)
Start rx_dma once RXFIFO is not empty that can avoid dma request lost
and causes data delay issue.

(cherry picked from commit 9271c626e207f9a4578b4696e520253a3bd0ad32)

Signed-off-by: Robin Gong <b38343@freescale.com>
Signed-off-by: Fugang Duan <B38611@freescale.com>
drivers/tty/serial/imx.c

index cf573b1259b70530f1039d216e7aecf9f2c85514..c272a367b3f4c7bb6d9d350f8b07cdac4d60f693 100644 (file)
@@ -935,8 +935,21 @@ static void dma_rx_callback(void *data)
                tty_flip_buffer_push(port);
 
                start_rx_dma(sport);
-       } else
+       } else if (readl(sport->port.membase + USR2) & USR2_RDR) {
+               /*
+                * start rx_dma directly once data in RXFIFO, more efficient
+                * than before:
+                *      1. call imx_rx_dma_done to stop dma if no data received
+                *      2. wait next  RDR interrupt to start dma transfer.
+                */
+               start_rx_dma(sport);
+       } else {
+               /*
+                * stop dma to prevent too many IDLE event trigged if no data
+                * in RXFIFO
+                */
                imx_rx_dma_done(sport);
+       }
 }
 
 static int start_rx_dma(struct imx_port *sport)