|
@@ -238,13 +238,17 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-void update_tftp(void)
|
|
|
|
|
|
+int update_tftp(ulong addr)
|
|
{
|
|
{
|
|
char *filename, *env_addr;
|
|
char *filename, *env_addr;
|
|
int images_noffset, ndepth, noffset;
|
|
int images_noffset, ndepth, noffset;
|
|
ulong update_addr, update_fladdr, update_size;
|
|
ulong update_addr, update_fladdr, update_size;
|
|
- ulong addr;
|
|
|
|
void *fit;
|
|
void *fit;
|
|
|
|
+ int ret = 0;
|
|
|
|
+
|
|
|
|
+ /* use already present image */
|
|
|
|
+ if (addr)
|
|
|
|
+ goto got_update_file;
|
|
|
|
|
|
printf("Auto-update from TFTP: ");
|
|
printf("Auto-update from TFTP: ");
|
|
|
|
|
|
@@ -253,7 +257,7 @@ void update_tftp(void)
|
|
if (filename == NULL) {
|
|
if (filename == NULL) {
|
|
printf("failed, env. variable '%s' not found\n",
|
|
printf("failed, env. variable '%s' not found\n",
|
|
UPDATE_FILE_ENV);
|
|
UPDATE_FILE_ENV);
|
|
- return;
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
printf("trying update file '%s'\n", filename);
|
|
printf("trying update file '%s'\n", filename);
|
|
@@ -268,15 +272,16 @@ void update_tftp(void)
|
|
if (update_load(filename, CONFIG_UPDATE_TFTP_MSEC_MAX,
|
|
if (update_load(filename, CONFIG_UPDATE_TFTP_MSEC_MAX,
|
|
CONFIG_UPDATE_TFTP_CNT_MAX, addr)) {
|
|
CONFIG_UPDATE_TFTP_CNT_MAX, addr)) {
|
|
printf("Can't load update file, aborting auto-update\n");
|
|
printf("Can't load update file, aborting auto-update\n");
|
|
- return;
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+got_update_file:
|
|
fit = (void *)addr;
|
|
fit = (void *)addr;
|
|
|
|
|
|
if (!fit_check_format((void *)fit)) {
|
|
if (!fit_check_format((void *)fit)) {
|
|
printf("Bad FIT format of the update file, aborting "
|
|
printf("Bad FIT format of the update file, aborting "
|
|
"auto-update\n");
|
|
"auto-update\n");
|
|
- return;
|
|
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
|
|
|
|
/* process updates */
|
|
/* process updates */
|
|
@@ -293,6 +298,7 @@ void update_tftp(void)
|
|
|
|
|
|
if (!fit_image_check_hashes(fit, noffset)) {
|
|
if (!fit_image_check_hashes(fit, noffset)) {
|
|
printf("Error: invalid update hash, aborting\n");
|
|
printf("Error: invalid update hash, aborting\n");
|
|
|
|
+ ret = 1;
|
|
goto next_node;
|
|
goto next_node;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -301,15 +307,17 @@ void update_tftp(void)
|
|
&update_fladdr, &update_size)) {
|
|
&update_fladdr, &update_size)) {
|
|
printf("Error: can't get update parameteres, "
|
|
printf("Error: can't get update parameteres, "
|
|
"aborting\n");
|
|
"aborting\n");
|
|
|
|
+ ret = 1;
|
|
goto next_node;
|
|
goto next_node;
|
|
}
|
|
}
|
|
if (update_flash(update_addr, update_fladdr, update_size)) {
|
|
if (update_flash(update_addr, update_fladdr, update_size)) {
|
|
printf("Error: can't flash update, aborting\n");
|
|
printf("Error: can't flash update, aborting\n");
|
|
|
|
+ ret = 1;
|
|
goto next_node;
|
|
goto next_node;
|
|
}
|
|
}
|
|
next_node:
|
|
next_node:
|
|
noffset = fdt_next_node(fit, noffset, &ndepth);
|
|
noffset = fdt_next_node(fit, noffset, &ndepth);
|
|
}
|
|
}
|
|
|
|
|
|
- return;
|
|
|
|
|
|
+ return ret;
|
|
}
|
|
}
|