summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut+renesas@gmail.com>2020-05-09 22:30:05 +0200
committerMarek Vasut <marek.vasut+renesas@gmail.com>2020-09-01 14:46:41 +0200
commitf5ba5c90d4b9c4d691a62eaca47dc095eefba8b1 (patch)
tree116f369fa019660eeda65f8e03e63c29797c0b29
parent23e333a5c083a000d0cabc53f7c0d261bae9e5ca (diff)
downloadu-boot-f5ba5c90d4b9c4d691a62eaca47dc095eefba8b1.tar.gz
serial: sh: Improve FIFO empty check on RX
If the SCIF is receiving data quickly enough, it may happen that the SCxSR_RDxF flag is cleared in sh_serial_getc_generic(), while the FIFO still contains data. If that happens, the serial_getc_check() reports no data in the FIFO as the flag is no longer set. Add one more check, if the SCxSR_RDxF is not set, read out the FIFO level and if there are still characters in the FIFO, permit reading them out. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
-rw-r--r--drivers/serial/serial_sh.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/serial/serial_sh.c b/drivers/serial/serial_sh.c
index 13b179f03d..e27d256574 100644
--- a/drivers/serial/serial_sh.c
+++ b/drivers/serial/serial_sh.c
@@ -116,7 +116,10 @@ static int serial_getc_check(struct uart_port *port)
handle_error(port);
if (sci_in(port, SCLSR) & SCxSR_ORER(port))
handle_error(port);
- return status & (SCIF_DR | SCxSR_RDxF(port));
+ status &= (SCIF_DR | SCxSR_RDxF(port));
+ if (status)
+ return status;
+ return scif_rxfill(port);
}
static int sh_serial_getc_generic(struct uart_port *port)