Re: Minimal patch against TI AM335x UART swallowing the first byte using the 8250_omap driver in RS485 mode

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

 



On 11/8/19 3:41 PM, Falco Hyfing wrote:

Hi,

> I stumbled upon this unresolved issue where the TI AM335x UART is
> sporadically swallowing the first byte using the 8250_omap driver in
> RS485 mode.
> 
> Previous discussions of the issue ended on Christmas Eve last year. For
> reference:
> https://marc.info/?w=2&r=1&s=fix+clearing+fifos+rs485+mode+again&q=t

Right, I'm sorry for not following up on that thread anymore. I was ill
during that time and I didn't have the energy to counter all those
negative emails. So thanks for picking this up.

I think the issue is a generic one though, and affects various other
16550 UARTs, it's not isolated to the OMAP UART, which is why I patched
the generic code. I think if we could solve the quirk of that JZ4780
UART, the generic approach would work.

> As our company plans to move our serial device servers' firmware to an
> upstream kernel version we need a solution for this problem.
> 
> I appended a small patch that seems to resolve the issue for our products.
> 
> I would like to kindly ask whether you could test this patch with
> various serial hardware that would be affected by this driver.
> 
> Kind regards,
> 
>     Falco Hyfing
>     Software Engineer at VisionSystems GmbH
> 
> 
> diff --git a/drivers/tty/serial/8250/8250_port.c
> b/drivers/tty/serial/8250/8250_port.c
> index 8407166610ce..25dd44d5f6ff 100644
> --- a/drivers/tty/serial/8250/8250_port.c
> +++ b/drivers/tty/serial/8250/8250_port.c
> @@ -1405,7 +1405,8 @@ static void __do_stop_tx_rs485(struct
> uart_8250_port *p)
>          * Enable previously disabled RX interrupts.
>          */
>         if (!(p->port.rs485.flags & SER_RS485_RX_DURING_TX)) {
> -               serial8250_clear_and_reinit_fifos(p);
> +               serial_port_out(&p->port, UART_FCR, p->fcr |
> +                               UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
> 
>                 p->ier |= UART_IER_RLSI | UART_IER_RDI;
>                 serial_port_out(&p->port, UART_IER, p->ier);
> 


-- 
Best regards,
Marek Vasut



[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