diff options
Diffstat (limited to 'drivers/serial/serial-uclass.c')
-rw-r--r-- | drivers/serial/serial-uclass.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index 05fe9645bee..28d7a202afc 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -328,10 +328,11 @@ static int __serial_tstc(struct udevice *dev) static int _serial_tstc(struct udevice *dev) { struct serial_dev_priv *upriv = dev_get_uclass_priv(dev); - uint wr; + uint wr, avail; - /* Read all available chars into the RX buffer */ - while (__serial_tstc(dev)) { + /* Read all available chars into the RX buffer while there's room */ + avail = CONFIG_SERIAL_RX_BUFFER_SIZE - (upriv->wr_ptr - upriv->rd_ptr); + while (avail-- && __serial_tstc(dev)) { wr = upriv->wr_ptr++ % CONFIG_SERIAL_RX_BUFFER_SIZE; upriv->buf[wr] = __serial_getc(dev); } |