From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DCC70C0502A for ; Sat, 27 Aug 2022 14:44:07 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 320A584220; Sat, 27 Aug 2022 16:44:06 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="WphQZm5f"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5670C84580; Sat, 27 Aug 2022 16:44:04 +0200 (CEST) Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 83C128412C for ; Sat, 27 Aug 2022 16:44:01 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=pali@kernel.org Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 0E555B801B9 for ; Sat, 27 Aug 2022 14:44:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4548FC433D6 for ; Sat, 27 Aug 2022 14:43:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1661611439; bh=Y4sY7Ly3sD5Hg/uckBUqQgnkALcZaXEv+LVFB+HsNq8=; h=Resent-From:Resent-Date:Resent-To:From:To:Subject:Date: In-Reply-To:References:From; b=WphQZm5fFGBpwrmq82K9VdqCb9i/uc3znSx4QbN8Xj8jWf97DdpeeAGt+vzs4M+W/ roXOyYeSOAMVsM3uAfrgDcwQHBxv4heNLdG/SIT+I3AsUMgxVIbU7L1QjFRwdHsdQA WTkeULeoDR6Dr5m9pjFYvnqupFSJzTs0ptw4Qjmb6sVfFnIGEBYKwEU3+QFkR04rbZ UO27Y0n/PcCqBcbwbTmzkvJorAUh0+ab26bU9IAvPrxVLfTEY8NcmPGi2bzMNIdGRo h+emf/cjR0LDccC0tRDVGWML6nRrm/2zel9ys6xMxJr6qh2W5s1ZgZd4jQT/zuiw0m gnM1d1l4SeB0Q== Received: by pali.im (Postfix) id 6F409C7A; Sat, 27 Aug 2022 16:43:56 +0200 (CEST) Resent-From: Pali =?utf-8?B?Um9ow6Fy?= Resent-Date: Sat, 27 Aug 2022 16:43:56 +0200 Resent-Message-ID: <20220827144356.fh2iffqgldxzfesb@pali> Resent-To: u-boot@lists.denx.de Received: by pali.im (Postfix) id 26BBDC7A; Sat, 27 Aug 2022 16:38:03 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Wolfgang Denk , Simon Glass , Heinrich Schuchardt , Tom Rini Subject: [PATCH v3] xyz-modem: Allow to configure initial timeout for loadx and loady Date: Sat, 27 Aug 2022 16:37:55 +0200 Message-Id: <20220827143755.21412-1-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210910204653.3066-1-pali@kernel.org> References: <20210910204653.3066-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Now when loadx and loady commands could be aborted / cancelled by CTRL+C, allow to configure timeout for initial x/y-modem packet via env variable $loadxy_timeout and by default use value from new compile-time config option CONFIG_CMD_LOADXY_TIMEOUT. Value is in seconds and zero value means infinite timeout. Default value is 90s which is the value used before this change for loadx command. Other load commands loadb and loads already waits infinitely. Same behavior for loadx and loady commands can be achieved by setting $loadxy_timeout or CONFIG_CMD_LOADXY_TIMEOUT to 0. Signed-off-by: Pali Rohár --- Changes in v3: * Guard env_get via #ifdef (same what was used for d64a8fd0a902 "hwconfig: Allow to compile it without env support") Changes in v2: * Do not remove MVEBU_TEST_PIN_LATCH_N and MVEBU_XTAL_MODE_MASK macros --- cmd/Kconfig | 7 +++++++ common/xyzModem.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/cmd/Kconfig b/cmd/Kconfig index 211ebe9c8783..54af3769a673 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1194,6 +1194,13 @@ config CMD_LOADS help Load an S-Record file over serial line +config CMD_LOADXY_TIMEOUT + int "loadxy_timeout" + range 0 2000 + default 90 + help + Initial timeout for loadx and loady commands. Zero means infinity. + config CMD_LSBLK depends on BLK bool "lsblk - list block drivers and devices" diff --git a/common/xyzModem.c b/common/xyzModem.c index ece25acb183b..a68d3929024b 100644 --- a/common/xyzModem.c +++ b/common/xyzModem.c @@ -26,6 +26,7 @@ #include #include #include +#include /* 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; -- 2.20.1