RE: [PATCH] tty: serial: fsl_lpuart: avoid idle preamble pending if CTS is enabled

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

 




> -----Original Message-----
> From: Sverdlin, Alexander <alexander.sverdlin@xxxxxxxxxxx>
> Sent: Monday, March 4, 2024 3:14 PM
> To: u.kleine-koenig@xxxxxxxxxxxxxx; Sherry Sun <sherry.sun@xxxxxxx>;
> gregkh@xxxxxxxxxxxxxxxxxxx; ilpo.jarvinen@xxxxxxxxxxxxxxx;
> robh@xxxxxxxxxx; Shenwei Wang <shenwei.wang@xxxxxxx>;
> tglx@xxxxxxxxxxxxx; jirislaby@xxxxxxxxxx; robert.hodaszi@xxxxxxxx
> Cc: linux-serial@xxxxxxxxxxxxxxx; imx@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Frank Li <frank.li@xxxxxxx>
> Subject: Re: [PATCH] tty: serial: fsl_lpuart: avoid idle preamble pending if CTS
> is enabled
> 
> Hi Sherry,
> 
> thank you for the fix!
> 
> On Mon, 2024-03-04 at 10:07 +0800, Sherry Sun wrote:
> > If the remote uart device is not connected or not enabled after
> > booting up, the CTS line is high by default. At this time, if we
> > enable the flow control when opening the device(for example, using
> > "stty -F /dev/ttyLP4 crtscts" command), there will be a pending idle
> > preamble(first writing 0 and then writing 1 to UARTCTRL_TE will queue
> > an idle preamble) that cannot be sent out, resulting in the uart port
> > fail to close(waiting for TX empty), so the user space stty will have
> > to wait for a long time or forever.
> >
> > This is an LPUART IP bug(idle preamble has higher priority than CTS),
> > here add a workaround patch to enable TX CTS after enabling
> > UARTCTRL_TE, so that the idle preamble does not get stuck due to CTS is
> deasserted.
> >
> > Signed-off-by: Sherry Sun <sherry.sun@xxxxxxx>
> > ---
> >  drivers/tty/serial/fsl_lpuart.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/tty/serial/fsl_lpuart.c
> > b/drivers/tty/serial/fsl_lpuart.c index 5ddf110aedbe..dce1b5851de0
> > 100644
> > --- a/drivers/tty/serial/fsl_lpuart.c
> > +++ b/drivers/tty/serial/fsl_lpuart.c
> > @@ -2345,8 +2345,12 @@ lpuart32_set_termios(struct uart_port *port,
> > struct ktermios *termios,
> >
> >         lpuart32_write(&sport->port, bd, UARTBAUD);
> >         lpuart32_serial_setbrg(sport, baud);
> > -       lpuart32_write(&sport->port, modem, UARTMODIR);
> > +       /* disable CTS before enabling UARTCTRL_TE to avoid pending
> > +idle preamble */
> > +       lpuart32_write(&sport->port, modem & ~UARTMODIR_TXCTSE,
> > +UARTMODIR);
> >         lpuart32_write(&sport->port, ctrl, UARTCTRL);
> > +       /* re-enable the CTS if needed */
> > +       lpuart32_write(&sport->port, modem, UARTMODIR);
> > +
> >         /* restore control register */
> 
> The fix makes sense to me!
> I see only one issue with above comment, which commit 380c966c093e7
> already have put quite sub-optimal (after the actual write), but your commit
> now shifts it even further making it completely dangling.
> Should it be before last UARTCTRL write?

Hi Alexander, good catch, I will move the "/* restore control register */" message to the appropriate place in V2. Thanks!

Best Regards
Sherry





[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux