From: Rasmus Villemoes <ravi@prevas.dk>
To: u-boot@lists.denx.de
Cc: Stefan Roese <sr@denx.de>, Tom Rini <trini@konsulko.com>,
Rasmus Villemoes <ravi@prevas.dk>
Subject: [PATCH 2/4] serial: do not overwrite not-consumed characters in rx buffer
Date: Thu, 3 Oct 2024 16:10:27 +0200 [thread overview]
Message-ID: <20241003141029.920035-3-ravi@prevas.dk> (raw)
In-Reply-To: <20241003141029.920035-1-ravi@prevas.dk>
Before the previous patch, pasting a string of length x >
CONFIG_SERIAL_RX_BUFFER_SIZE results in getting the
last (x%CONFIG_SERIAL_RX_BUFFER_SIZE) characters from that string.
With the previous patch, one instead gets the last
CONFIG_SERIAL_RX_BUFFER_SIZE characters repeatedly until the ->rd_ptr
catches up.
Both behaviours are counter-intuitive, and happen because the code
that checks for a character available from the hardware does not
account for whether there is actually room in the software buffer to
receive it. Fix that by adding such accounting. This also brings the
software buffering more in line with how most hardware FIFOs
behave (first received characters are kept, overflowing characters are
dropped).
Signed-off-by: Rasmus Villemoes <ravi@prevas.dk>
---
drivers/serial/serial-uclass.c | 7 ++++---
1 file 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);
}
--
2.46.2
next prev parent reply other threads:[~2024-10-03 14:10 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-03 14:10 [PATCH 0/4] some serial rx buffer patches Rasmus Villemoes
2024-10-03 14:10 ` [PATCH 1/4] serial: fix circular rx buffer edge case Rasmus Villemoes
2024-10-09 1:51 ` Simon Glass
2024-10-09 11:03 ` Rasmus Villemoes
2024-10-17 23:23 ` Simon Glass
2024-10-03 14:10 ` Rasmus Villemoes [this message]
2024-10-09 1:51 ` [PATCH 2/4] serial: do not overwrite not-consumed characters in rx buffer Simon Glass
2024-10-03 14:10 ` [PATCH 3/4] serial: add build-time sanity check of CONFIG_SERIAL_RX_BUFFER_SIZE Rasmus Villemoes
2024-10-09 1:51 ` Simon Glass
2024-10-03 14:10 ` [PATCH 4/4] serial: embed the rx buffer in struct serial_dev_priv Rasmus Villemoes
2024-10-09 1:51 ` Simon Glass
2024-10-17 2:22 ` [PATCH 0/4] some serial rx buffer patches Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241003141029.920035-3-ravi@prevas.dk \
--to=ravi@prevas.dk \
--cc=sr@denx.de \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox