On Tue, Jul 9, 2019 at 5:55 PM Sagar Shrikant Kadam <sagar.ka...@sifive.com> wrote: > > In y-modem transfer mode, tstc/getc fail to check if there is any > data available / received in RX FIFO, and so y-modem transfer never > succeeds. Using receive watermark bit within ip register fixes the > issue. > > This patch is based on commit c7392b7bc4e1 ("Use the RX watermark > interrupt pending bit for TSTC") available at[1] > > [1] https://github.com/sifive/HiFive_U-Boot/tree/regression > > Signed-off-by: Sagar Shrikant Kadam <sagar.ka...@sifive.com> > --- > > drivers/serial/serial_sifive.c | 23 +++++++---------------- > 1 file changed, 7 insertions(+), 16 deletions(-) > > diff --git a/drivers/serial/serial_sifive.c b/drivers/serial/serial_sifive.c > index fdfef69..c142ccd 100644 > --- a/drivers/serial/serial_sifive.c > +++ b/drivers/serial/serial_sifive.c > @@ -22,6 +22,9 @@ DECLARE_GLOBAL_DATA_PTR; > #define UART_TXCTRL_TXEN 0x1 > #define UART_RXCTRL_RXEN 0x1 > > +/* IP register */ > +#define UART_IP_RXWM 0x2 > + > struct uart_sifive { > u32 txfifo; > u32 rxfifo; > @@ -34,7 +37,6 @@ struct uart_sifive { > > struct sifive_uart_platdata { > unsigned long clock; > - int saved_input_char; > struct uart_sifive *regs; > }; > > @@ -94,7 +96,7 @@ static int _sifive_serial_getc(struct uart_sifive *regs) > return -EAGAIN; > ch &= UART_RXFIFO_DATA; > > - return (!ch) ? -EAGAIN : ch; > + return ch; > } > > static int sifive_serial_setbrg(struct udevice *dev, int baudrate) > @@ -133,7 +135,6 @@ static int sifive_serial_probe(struct udevice *dev) > if (gd->flags & GD_FLG_RELOC) > return 0; > > - platdata->saved_input_char = 0; > _sifive_serial_init(platdata->regs); > > return 0; > @@ -145,12 +146,6 @@ static int sifive_serial_getc(struct udevice *dev) > struct sifive_uart_platdata *platdata = dev_get_platdata(dev); > struct uart_sifive *regs = platdata->regs; > > - if (platdata->saved_input_char > 0) { > - c = platdata->saved_input_char; > - platdata->saved_input_char = 0; > - return c; > - } > - > while ((c = _sifive_serial_getc(regs)) == -EAGAIN) ; > > return c; > @@ -171,14 +166,10 @@ static int sifive_serial_pending(struct udevice *dev, > bool input) > struct sifive_uart_platdata *platdata = dev_get_platdata(dev); > struct uart_sifive *regs = platdata->regs; > > - if (input) { > - if (platdata->saved_input_char > 0) > - return 1; > - platdata->saved_input_char = _sifive_serial_getc(regs); > - return (platdata->saved_input_char > 0) ? 1 : 0; > - } else { > + if (input) > + return (readl(®s->ip) & UART_IP_RXWM); > + else > return !!(readl(®s->txfifo) & UART_TXFIFO_FULL); > - } > } > > static int sifive_serial_ofdata_to_platdata(struct udevice *dev) > -- > 2.7.4 >
Looks good to me. Reviewed-by: Anup Patel <anup.pa...@wdc.com> Tested-by: Anup Patel <anup.pa...@wdc.com> Regards, Anup _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot