[PATCH] serial: mxc: Wait until TX FIFO is not full
Sean Anderson
sean.anderson at seco.com
Wed Oct 26 19:35:50 CEST 2022
On 10/26/22 13:08, Michael Nazzareno Trimarchi wrote:
> Hi
>
> On Tue, Oct 25, 2022 at 11:32 PM Fabio Estevam <festevam at gmail.com> wrote:
>>
>> From: Fabio Estevam <festevam at denx.de>
>>
>> Tim Harvey reported the console garbage on imx6 since
>> commit c7878a0483c5 ("serial: mxc: have putc use the TXFIFO").
>>
>> Do as suggested by Pali Rohár where the the driver should
>> not return -EAGAIN when the TX FIFO is full.
>>
>> It should keep waiting until the TX FIFO is no longer full.
>>
>> This also aligns with the implementation of the imx serial driver
>> in the kernel:
>>
>> 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);
>> }
>>
>> Fixes: c7878a0483c5 ("serial: mxc: have putc use the TXFIFO")
>> Reported-by: Tim Harvey <tharvey at gateworks.com>
>> Suggested-by: Pali Rohár <pali at kernel.org>
>> Signed-off-by: Fabio Estevam <festevam at denx.de>
>> ---
>> drivers/serial/serial_mxc.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/serial/serial_mxc.c b/drivers/serial/serial_mxc.c
>> index 4cf79c1ca24f..332219fa87fc 100644
>> --- a/drivers/serial/serial_mxc.c
>> +++ b/drivers/serial/serial_mxc.c
>> @@ -311,8 +311,8 @@ static int mxc_serial_putc(struct udevice *dev, const char ch)
>> struct mxc_serial_plat *plat = dev_get_plat(dev);
>> struct mxc_uart *const uart = plat->reg;
>>
>> - if (readl(&uart->ts) & UTS_TXFULL)
>> - return -EAGAIN;
>> + while (readl(&uart->ts) & UTS_TXFULL)
>> + barrier();
>>
>> writel(ch, &uart->txd);
>>
> _debug_uart_putc
>
> Should not be patched in the same way?
>
> Anyway, does the external loop do the same with -EAGAIN as was
> discussed in another thread?
>
> Michael
Yes, see _serial_putc. This is the DM version. The non-DM version
(mxc_serial_putc) does a while loop already.
--Sean
_serial_putc
More information about the U-Boot
mailing list