serial: imx: do not break from FIFO reading loop prematurely
authorSergey Organov <sorganov@gmail.com>
Wed, 1 Feb 2023 14:26:57 +0000 (17:26 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Feb 2023 12:11:58 +0000 (13:11 +0100)
There is no reason to prematurely break out of FIFO reading loop, and it
might cause needless reenters into ISR, so keep reading until FIFO is
empty.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Link: https://lore.kernel.org/r/20230201142700.4346-5-sorganov@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/imx.c

index bd5d426c28fb6c6c267ea334745012760af22b9e..ef0b9d353617b62a6a63214f109ac64a2db7ca2d 100644 (file)
@@ -890,7 +890,7 @@ static void imx_uart_check_flood(struct imx_port *sport, u32 usr2)
 static irqreturn_t __imx_uart_rxint(int irq, void *dev_id)
 {
        struct imx_port *sport = dev_id;
-       unsigned int rx, flg, ignored = 0;
+       unsigned int rx, flg;
        struct tty_port *port = &sport->port.state->port;
        u32 usr2;
 
@@ -923,11 +923,8 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id)
                        if (rx & URXD_OVRRUN)
                                sport->port.icount.overrun++;
 
-                       if (rx & sport->port.ignore_status_mask) {
-                               if (++ignored > 100)
-                                       goto out;
+                       if (rx & sport->port.ignore_status_mask)
                                continue;
-                       }
 
                        rx &= (sport->port.read_status_mask | 0xFF);
 
@@ -946,13 +943,12 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id)
                }
 
                if (sport->port.ignore_status_mask & URXD_DUMMY_READ)
-                       goto out;
+                       continue;
 
                if (tty_insert_flip_char(port, rx, flg) == 0)
                        sport->port.icount.buf_overrun++;
        }
 
-out:
        tty_flip_buffer_push(port);
 
        return IRQ_HANDLED;