1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 20098e179SSimon Glass /* 30098e179SSimon Glass * (C) Copyright 2000 40098e179SSimon Glass * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 50098e179SSimon Glass */ 60098e179SSimon Glass 70098e179SSimon Glass #include <common.h> 80098e179SSimon Glass #include <bootretry.h> 90098e179SSimon Glass #include <cli.h> 100098e179SSimon Glass #include <errno.h> 110098e179SSimon Glass #include <watchdog.h> 120098e179SSimon Glass 130098e179SSimon Glass #ifndef CONFIG_BOOT_RETRY_MIN 140098e179SSimon Glass #define CONFIG_BOOT_RETRY_MIN CONFIG_BOOT_RETRY_TIME 150098e179SSimon Glass #endif 160098e179SSimon Glass 170098e179SSimon Glass static uint64_t endtime; /* must be set, default is instant timeout */ 180098e179SSimon Glass static int retry_time = -1; /* -1 so can call readline before main_loop */ 190098e179SSimon Glass 200098e179SSimon Glass /*************************************************************************** 210098e179SSimon Glass * initialize command line timeout 220098e179SSimon Glass */ bootretry_init_cmd_timeout(void)23b26440f1SSimon Glassvoid bootretry_init_cmd_timeout(void) 240098e179SSimon Glass { 2500caae6dSSimon Glass char *s = env_get("bootretry"); 260098e179SSimon Glass 270098e179SSimon Glass if (s != NULL) 280098e179SSimon Glass retry_time = (int)simple_strtol(s, NULL, 10); 290098e179SSimon Glass else 300098e179SSimon Glass retry_time = CONFIG_BOOT_RETRY_TIME; 310098e179SSimon Glass 320098e179SSimon Glass if (retry_time >= 0 && retry_time < CONFIG_BOOT_RETRY_MIN) 330098e179SSimon Glass retry_time = CONFIG_BOOT_RETRY_MIN; 340098e179SSimon Glass } 350098e179SSimon Glass 360098e179SSimon Glass /*************************************************************************** 370098e179SSimon Glass * reset command line timeout to retry_time seconds 380098e179SSimon Glass */ bootretry_reset_cmd_timeout(void)39b26440f1SSimon Glassvoid bootretry_reset_cmd_timeout(void) 400098e179SSimon Glass { 410098e179SSimon Glass endtime = endtick(retry_time); 420098e179SSimon Glass } 430098e179SSimon Glass bootretry_tstc_timeout(void)440098e179SSimon Glassint bootretry_tstc_timeout(void) 450098e179SSimon Glass { 460098e179SSimon Glass while (!tstc()) { /* while no incoming data */ 470098e179SSimon Glass if (retry_time >= 0 && get_ticks() > endtime) 480098e179SSimon Glass return -ETIMEDOUT; 490098e179SSimon Glass WATCHDOG_RESET(); 500098e179SSimon Glass } 510098e179SSimon Glass 520098e179SSimon Glass return 0; 530098e179SSimon Glass } 540098e179SSimon Glass bootretry_dont_retry(void)550098e179SSimon Glassvoid bootretry_dont_retry(void) 560098e179SSimon Glass { 570098e179SSimon Glass retry_time = -1; 580098e179SSimon Glass } 59