On Tuesday 25 October 2022 17:37:01 Fabio Estevam wrote:
> Hi Pali,
> 
> On 25/10/2022 17:23, Pali Rohár wrote:
> 
> > Hello! I do not have any MXC hardware but I see there one issue.
> > mxc_serial_putc() function probably should not return -EAGAIN when
> > device is busy. But instead it should wait until it is ready.
> > 
> > Could you try to change code to following?
> > 
> >     while (readl(&uart->ts) & UTS_TXFULL)
> >         ;
> > 
> >     writel(ch, &uart->txd);
> 
> Your analysis looks correct.
> 
> The kernel does like this:
> 
> static void imx_uart_console_putchar(struct uart_port *port, unsigned char
> ch)
> {
>       struct imx_port *sport = (struct imx_port *)port;
> 
>       while (imx_uart_readl(sport, imx_uart_uts_reg(sport)) & UTS_TXFULL)
>               barrier();
> 
>       imx_uart_writel(sport, ch, URTX0);
> }
> 
> Thanks

Well, "waiting for HW to be ready" vs. "returning -EAGAIN" is serial API
detail. Kernel (or other implementation) may have different API and
driver always have to implement what API expects. So aligning return
value with kernel is not the argument for fixing issue.


Anyway, I think that my change is not correct.

serial-uclass.c is already calling:

        do {
                err = ops->putc(dev, ch);
        } while (err == -EAGAIN);

Which means that function is called again.

Reply via email to