On 27.10.21 20:56, Marek Behún wrote:
From: Pali Rohár <p...@kernel.org>

Kwboot puts each xmodem packet to kernel queue, then waits until all bytes
of that packet are transmitted over UART and then waits for xmodem reply
until it is received into kernel queue.

If some reply is received during the time we are waiting until all bytes
are transmitted, then kernel puts them into the queue and returns it to
kwboot in next read() call.

So there is no need to wait (with tcdrain() function) until all bytes from
xmodem packet are transmitted over UART, since any reply received either
during that time or after is returned to kwboot with the next read().

Therefore do not call tcdrain() after each xmodem packet sent. Instead
directly wait for any reply after putting xmodem packet into write kernel
queue.

This change could speed up xmodem transfer in case tcdrain() function waits
for a longer time.

Signed-off-by: Pali Rohár <p...@kernel.org>
Reviewed-by: Marek Behún <marek.be...@nic.cz>

Reviewed-by: Stefan Roese <s...@denx.de>

Thanks,
Stefan

---
  tools/kwboot.c | 13 ++++++++-----
  1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/tools/kwboot.c b/tools/kwboot.c
index b2c48812c3..a6bfd3d4ce 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -404,7 +404,7 @@ out:
  }
static int
-kwboot_tty_send(int fd, const void *buf, size_t len)
+kwboot_tty_send(int fd, const void *buf, size_t len, int nodrain)
  {
        if (!buf)
                return 0;
@@ -412,13 +412,16 @@ kwboot_tty_send(int fd, const void *buf, size_t len)
        if (kwboot_write(fd, buf, len) < 0)
                return -1;
+ if (nodrain)
+               return 0;
+
        return tcdrain(fd);
  }
static int
  kwboot_tty_send_char(int fd, unsigned char c)
  {
-       return kwboot_tty_send(fd, &c, 1);
+       return kwboot_tty_send(fd, &c, 1, 0);
  }
static speed_t
@@ -705,7 +708,7 @@ kwboot_bootmsg(int tty, void *msg)
                        break;
for (count = 0; count < 128; count++) {
-                       rc = kwboot_tty_send(tty, msg, 8);
+                       rc = kwboot_tty_send(tty, msg, 8, 0);
                        if (rc) {
                                usleep(msg_req_delay * 1000);
                                continue;
@@ -737,7 +740,7 @@ kwboot_debugmsg(int tty, void *msg)
                if (rc)
                        break;
- rc = kwboot_tty_send(tty, msg, 8);
+               rc = kwboot_tty_send(tty, msg, 8, 0);
                if (rc) {
                        usleep(msg_req_delay * 1000);
                        continue;
@@ -929,7 +932,7 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block, int 
allow_non_xm,
retries = 0;
        do {
-               rc = kwboot_tty_send(fd, block, sizeof(*block));
+               rc = kwboot_tty_send(fd, block, sizeof(*block), 1);
                if (rc)
                        return rc;


Viele Grüße,
Stefan

--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: s...@denx.de

Reply via email to