[PATCH u-boot-marvell v3 17/39] tools: kwboot: Properly finish xmodem transfer

Marek Behún kabel at kernel.org
Fri Sep 24 23:06:54 CEST 2021


From: Pali Rohár <pali at kernel.org>

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 <pali at kernel.org>
[ refactored ]
Signed-off-by: Marek Behún <marek.behun at nic.cz>
---
 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
-- 
2.32.0



More information about the U-Boot mailing list