+ if (!ret) {
+ printf("OK\n");
+ return 0;
+ } else if (ret == -ENOMSG) {
+ /* Handle "bad CRC" case */
+ if (best_prio == -1)
+ best_prio = prio;
+ } else {
+ debug("Failed (%d)\n", ret);
+ }
+ }
+
+ /*
+ * In case of invalid environment, we set the 'default' env location
+ * to the best choice, i.e.:
+ * 1. Environment location with bad CRC, if such location was found
+ * 2. Otherwise use the location with highest priority
+ *
+ * This way, next calls to env_save() will restore the environment
+ * at the right place.
+ */
+ if (best_prio >= 0)
+ debug("Selecting environment with bad CRC\n");
+ else
+ best_prio = 0;
+ env_get_location(ENVOP_LOAD, best_prio);
+
+ return -ENODEV;
+}
+
+int env_save(void)
+{
+ struct env_driver *drv;
+
+ drv = env_driver_lookup(ENVOP_SAVE, gd->env_load_prio);
+ if (drv) {
+ int ret;
+
+ if (!drv->save)
+ return -ENODEV;
+
+ if (!env_has_inited(drv->location))
+ return -ENODEV;
+
+ printf("Saving Environment to %s... ", drv->name);
+ ret = drv->save();