aboutsummaryrefslogtreecommitdiff
path: root/common/xyzModem.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-09-15 09:59:47 -0400
committerTom Rini <trini@konsulko.com>2022-09-15 09:59:47 -0400
commitd9e85eeebabd5fc0c95be96bd70fa7362eb89f33 (patch)
treef3f4c2a9d5d19e8b548ce6ed98fbd5610d30bdd7 /common/xyzModem.c
parent1520af3f8450bb58168fe1cc827a56d435e9f74c (diff)
parent0cd933bb4bd74084d942c42098ebf9e07d9e0f63 (diff)
Merge branch '2022-09-15-general-improvements' into next
- Add uncompressed kernel image support to falcon mode, TEE improvements, make xyz-modem timeout configurable, gpio updates and other assorted improvements.
Diffstat (limited to 'common/xyzModem.c')
-rw-r--r--common/xyzModem.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/common/xyzModem.c b/common/xyzModem.c
index ece25acb18..a68d392902 100644
--- a/common/xyzModem.c
+++ b/common/xyzModem.c
@@ -26,6 +26,7 @@
#include <stdarg.h>
#include <u-boot/crc.h>
#include <watchdog.h>
+#include <env.h>
/* Assumption - run xyzModem protocol over the console port */
@@ -50,6 +51,8 @@ static struct
int len, mode, total_retries;
int total_SOH, total_STX, total_CAN;
bool crc_mode, at_eof, tx_ack;
+ bool first_xmodem_packet;
+ ulong initial_time, timeout;
unsigned long file_length, read_length;
} xyz;
@@ -409,6 +412,19 @@ xyzModem_get_hdr (void)
return 0;
}
+static
+ulong
+xyzModem_get_initial_timeout (void)
+{
+ /* timeout is in seconds, non-positive timeout value is infinity */
+#if CONFIG_IS_ENABLED(ENV_SUPPORT)
+ const char *timeout_str = env_get("loadxy_timeout");
+ if (timeout_str)
+ return 1000 * simple_strtol(timeout_str, NULL, 10);
+#endif
+ return 1000 * CONFIG_CMD_LOADXY_TIMEOUT;
+}
+
int
xyzModem_stream_open (connection_info_t * info, int *err)
{
@@ -439,18 +455,28 @@ xyzModem_stream_open (connection_info_t * info, int *err)
xyz.total_CAN = 0;
xyz.read_length = 0;
xyz.file_length = 0;
+ xyz.first_xmodem_packet = false;
+ xyz.initial_time = get_timer(0);
+ xyz.timeout = xyzModem_get_initial_timeout();
CYGACC_COMM_IF_PUTC (*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
if (xyz.mode == xyzModem_xmodem)
{
/* X-modem doesn't have an information header - exit here */
+ xyz.first_xmodem_packet = true;
xyz.next_blk = 1;
return 0;
}
- while (retries-- > 0)
+ while (!(xyz.timeout && get_timer(xyz.initial_time) > xyz.timeout))
{
+ if (--retries <= 0)
+ {
+ retries = xyzModem_MAX_RETRIES;
+ crc_retries = xyzModem_MAX_RETRIES_WITH_CRC;
+ xyz.crc_mode = true;
+ }
stat = xyzModem_get_hdr ();
if (stat == 0)
{
@@ -503,9 +529,19 @@ xyzModem_stream_read (char *buf, int size, int *err)
retries = xyzModem_MAX_RETRIES;
while (retries-- > 0)
{
+ if (xyz.first_xmodem_packet && xyz.timeout &&
+ get_timer(xyz.initial_time) > xyz.timeout)
+ {
+ *err = xyzModem_timeout;
+ xyz.len = -1;
+ return total;
+ }
+
stat = xyzModem_get_hdr ();
if (stat == 0)
{
+ if (xyz.mode == xyzModem_xmodem && xyz.first_xmodem_packet)
+ xyz.first_xmodem_packet = false;
if (xyz.blk == xyz.next_blk)
{
xyz.tx_ack = true;
@@ -583,7 +619,7 @@ xyzModem_stream_read (char *buf, int size, int *err)
xyz.total_retries++;
ZM_DEBUG (zm_dprintf ("NAK (%d)\n", __LINE__));
}
- if (stat < 0)
+ if (stat < 0 && (!xyz.first_xmodem_packet || stat != xyzModem_timeout))
{
*err = stat;
xyz.len = -1;