Signed-off-by: Frank Wunderlich <fran...@public-files.de>
---
 cmd/nvedit.c          | 13 +++++++++++++
 env/env.c             | 30 ++++++++++++++++++++++++++++++
 include/environment.h | 17 +++++++++++++++++
 3 files changed, 60 insertions(+)

diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 24a6cf7824..3b5c62d629 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -756,11 +756,22 @@ static int do_env_save(cmd_tbl_t *cmdtp, int flag, int 
argc,
        return env_save() ? 1 : 0;
 }

+static int do_env_erase(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       return env_erase() ? 1 : 0;
+}
+
 U_BOOT_CMD(
        saveenv, 1, 0,  do_env_save,
        "save environment variables to persistent storage",
        ""
 );
+U_BOOT_CMD(
+       eraseenv, 1, 0, do_env_erase,
+       "erase environment variables from persistent storage",
+       ""
+);
 #endif
 #endif /* CONFIG_SPL_BUILD */

@@ -1207,6 +1218,7 @@ static cmd_tbl_t cmd_env_sub[] = {
 #endif
 #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
        U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""),
+       U_BOOT_CMD_MKENT(erase, 1, 0, do_env_erase, "", ""),
 #endif
        U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""),
 #if defined(CONFIG_CMD_ENV_EXISTS)
@@ -1282,6 +1294,7 @@ static char env_help_text[] =
 #endif
 #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
        "env save - save environment\n"
+       "env erase - erase environment\n"
 #endif
 #if defined(CONFIG_CMD_NVEDIT_EFI)
        "env set -e name [arg ...] - set UEFI variable; unset if 'arg' not 
specified\n"
diff --git a/env/env.c b/env/env.c
index 4b417b90a2..25441370e6 100644
--- a/env/env.c
+++ b/env/env.c
@@ -24,6 +24,8 @@ void env_fix_drivers(void)
                        entry->load += gd->reloc_off;
                if (entry->save)
                        entry->save += gd->reloc_off;
+               if (entry->erase)
+                       entry->erase += gd->reloc_off;
                if (entry->init)
                        entry->init += gd->reloc_off;
        }
@@ -254,6 +256,34 @@ int env_save(void)
        return -ENODEV;
 }

+int env_erase(void)
+{
+       struct env_driver *drv;
+
+       drv = env_driver_lookup(ENVOP_ERASE, gd->env_load_prio);
+       if (drv) {
+               int ret;
+
+               if (!drv->erase)
+                       return -ENODEV;
+
+               if (!env_has_inited(drv->location))
+                       return -ENODEV;
+
+               printf("Erase Environment on %s... ", drv->name);
+               ret = drv->erase();
+               if (ret)
+                       printf("Failed (%d)\n", ret);
+               else
+                       printf("OK\n");
+
+               if (!ret)
+                       return 0;
+       }
+
+       return -ENODEV;
+}
+
 int env_init(void)
 {
        struct env_driver *drv;
diff --git a/include/environment.h b/include/environment.h
index cd96676141..5024cbea7e 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -200,6 +200,7 @@ enum env_operation {
        ENVOP_INIT,     /* we want to call the init function */
        ENVOP_LOAD,     /* we want to call the load function */
        ENVOP_SAVE,     /* we want to call the save function */
+       ENVOP_ERASE,    /* we want to call the erase function */
 };

 struct env_driver {
@@ -225,6 +226,15 @@ struct env_driver {
         */
        int (*save)(void);

+       /**
+        * erase() - Erase the environment on storage
+        *
+        * This method is required for 'eraseenv' to work.
+        *
+        * @return 0 if OK, -ve on error
+        */
+       int (*erase)(void);
+
        /**
         * init() - Set up the initial pre-relocation environment
         *
@@ -303,6 +313,13 @@ int env_load(void);
  */
 int env_save(void);

+/**
+ * env_erase() - Erase the environment on storage
+ *
+ * @return 0 if OK, -ve on error
+ */
+int env_erase(void);
+
 /**
  * env_fix_drivers() - Updates envdriver as per relocation
  */
--
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to