[U-Boot] [PATCH] riscv : serial: use rx watermark to indicate rx data is present
Sagar Kadam
sagar.kadam at sifive.com
Wed Jul 10 05:11:09 UTC 2019
Hi Anup,
On Wed, Jul 10, 2019 at 10:03 AM Anup Patel <anup at brainfault.org> wrote:
>
> On Tue, Jul 9, 2019 at 5:55 PM Sagar Shrikant Kadam
> <sagar.kadam at 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.kadam at 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.patel at wdc.com>
> Tested-by: Anup Patel <anup.patel at wdc.com>
>
Thank you for testing it.
> Regards,
> Anup
More information about the U-Boot
mailing list