Patch "tty: serial: imx: disable UCR4_OREN in .stop_rx() instead of .shutdown()" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    tty: serial: imx: disable UCR4_OREN in .stop_rx() instead of .shutdown()

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     tty-serial-imx-disable-ucr4_oren-in-.stop_rx-instead.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit dc9847055abf5093fe687a27bb53a5139f32c3c6
Author: Fugang Duan <fugang.duan@xxxxxxx>
Date:   Thu Nov 25 10:03:49 2021 +0800

    tty: serial: imx: disable UCR4_OREN in .stop_rx() instead of .shutdown()
    
    [ Upstream commit 028e083832b06fdeeb290e1e57dc1f6702c4c215 ]
    
    The UCR4_OREN should be disabled before disabling the uart receiver in
    .stop_rx() instead of in the .shutdown().
    
    Otherwise, if we have the overrun error during the receiver disable
    process, the overrun interrupt will keep trigging until we disable the
    OREN interrupt in the .shutdown(), because the ORE status can only be
    cleared when read the rx FIFO or reset the controller.  Although the
    called time between the receiver disable and OREN disable in .shutdown()
    is very short, there is still the risk of endless interrupt during this
    short period of time. So here change to disable OREN before the receiver
    been disabled in .stop_rx().
    
    Signed-off-by: Fugang Duan <fugang.duan@xxxxxxx>
    Signed-off-by: Sherry Sun <sherry.sun@xxxxxxx>
    Link: https://lore.kernel.org/r/20211125020349.4980-1-sherry.sun@xxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index 28cc328ddb6eb..93cd8ad57f385 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -508,18 +508,21 @@ static void imx_uart_stop_tx(struct uart_port *port)
 static void imx_uart_stop_rx(struct uart_port *port)
 {
 	struct imx_port *sport = (struct imx_port *)port;
-	u32 ucr1, ucr2;
+	u32 ucr1, ucr2, ucr4;
 
 	ucr1 = imx_uart_readl(sport, UCR1);
 	ucr2 = imx_uart_readl(sport, UCR2);
+	ucr4 = imx_uart_readl(sport, UCR4);
 
 	if (sport->dma_is_enabled) {
 		ucr1 &= ~(UCR1_RXDMAEN | UCR1_ATDMAEN);
 	} else {
 		ucr1 &= ~UCR1_RRDYEN;
 		ucr2 &= ~UCR2_ATEN;
+		ucr4 &= ~UCR4_OREN;
 	}
 	imx_uart_writel(sport, ucr1, UCR1);
+	imx_uart_writel(sport, ucr4, UCR4);
 
 	ucr2 &= ~UCR2_RXEN;
 	imx_uart_writel(sport, ucr2, UCR2);
@@ -1576,7 +1579,7 @@ static void imx_uart_shutdown(struct uart_port *port)
 	imx_uart_writel(sport, ucr1, UCR1);
 
 	ucr4 = imx_uart_readl(sport, UCR4);
-	ucr4 &= ~(UCR4_OREN | UCR4_TCEN);
+	ucr4 &= ~UCR4_TCEN;
 	imx_uart_writel(sport, ucr4, UCR4);
 
 	spin_unlock_irqrestore(&sport->port.lock, flags);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux