On 24.09.21 23:06, Marek Behún wrote:
From: Pali Rohár <[email protected]>

After kwboot sends EOT, BootROM sends back ACK. Add code for handling
this and retry sending EOT on error.

Signed-off-by: Pali Rohár <[email protected]>
[ refactored ]
Signed-off-by: Marek Behún <[email protected]>

Reviewed-by: Stefan Roese <[email protected]>

Thanks,
Stefan

---
  tools/kwboot.c | 62 ++++++++++++++++++++++++++++++++++++--------------
  1 file changed, 45 insertions(+), 17 deletions(-)

diff --git a/tools/kwboot.c b/tools/kwboot.c
index 8c11dca5ed..ad91afd075 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -403,6 +403,29 @@ _is_xm_reply(char c)
        return c == ACK || c == NAK || c == CAN;
  }
+static int
+_xm_reply_to_error(int c)
+{
+       int rc = -1;
+
+       switch (c) {
+       case ACK:
+               rc = 0;
+               break;
+       case NAK:
+               errno = EBADMSG;
+               break;
+       case CAN:
+               errno = ECANCELED;
+               break;
+       default:
+               errno = EPROTO;
+               break;
+       }
+
+       return rc;
+}
+
  static int
  kwboot_xm_recv_reply(int fd, char *c, int allow_non_xm, int *non_xm_print)
  {
@@ -483,24 +506,29 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block, 
int allow_non_xm,
        if (non_xm_print)
                kwboot_printv("\n");
- rc = -1;
+       return _xm_reply_to_error(c);
+}
- switch (c) {
-       case ACK:
-               rc = 0;
-               break;
-       case NAK:
-               errno = EBADMSG;
-               break;
-       case CAN:
-               errno = ECANCELED;
-               break;
-       default:
-               errno = EPROTO;
-               break;
-       }
+static int
+kwboot_xm_finish(int fd)
+{
+       int rc, retries;
+       char c;
- return rc;
+       kwboot_printv("Finishing transfer\n");
+
+       retries = 16;
+       do {
+               rc = kwboot_tty_send_char(fd, EOT);
+               if (rc)
+                       return rc;
+
+               rc = kwboot_xm_recv_reply(fd, &c, 0, NULL);
+               if (rc)
+                       return rc;
+       } while (c == NAK && retries-- > 0);
+
+       return _xm_reply_to_error(c);
  }
static int
@@ -577,7 +605,7 @@ kwboot_xmodem(int tty, const void *_img, size_t size)
        if (rc)
                return rc;
- return kwboot_tty_send_char(tty, EOT);
+       return kwboot_xm_finish(tty);
  }
static int



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: [email protected]

Reply via email to