]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_nand.c
rtc: Set valid date after reset
[karo-tx-uboot.git] / common / cmd_nand.c
index a84f7dc2d1fd301adff83aae7d8a41ad1b8acdf7..fb80bcacd6a06c6b68496767082c602f35cb0b6e 100644 (file)
@@ -419,10 +419,13 @@ static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
                        .mode = MTD_OPS_RAW
                };
 
-               if (read)
+               if (read) {
                        ret = mtd_read_oob(nand, off, &ops);
-               else
+               } else {
                        ret = mtd_write_oob(nand, off, &ops);
+                       if (!ret)
+                               ret = nand_verify_page_oob(nand, &ops, off);
+               }
 
                if (ret) {
                        printf("%s: error at offset %llx, ret %d\n",
@@ -489,7 +492,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
        /* Only "dump" is repeatable. */
        if (repeat && strcmp(cmd, "dump"))
-               return 0;
+               return CMD_RET_FAILURE;
 
        if (strcmp(cmd, "info") == 0) {
 
@@ -498,7 +501,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        if (nand_info[i].name)
                                nand_print_and_set_info(i);
                }
-               return 0;
+               return CMD_RET_SUCCESS;
        }
 
        if (strcmp(cmd, "device") == 0) {
@@ -508,19 +511,20 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                puts("no devices available\n");
                        else
                                nand_print_and_set_info(dev);
-                       return 0;
+                       return CMD_RET_SUCCESS;
                }
 
                dev = (int)simple_strtoul(argv[2], NULL, 10);
                set_dev(dev);
 
-               return 0;
+               return CMD_RET_SUCCESS;
        }
 
 #ifdef CONFIG_ENV_OFFSET_OOB
        /* this command operates only on the first nand device */
        if (strcmp(cmd, "env.oob") == 0)
-               return do_nand_env_oob(cmdtp, argc - 1, argv + 1);
+               return do_nand_env_oob(cmdtp, argc - 1, argv + 1) ?
+                       CMD_RET_FAILURE : CMD_RET_SUCCESS;;
 #endif
 
        /* The following commands operate on the current device, unless
@@ -532,7 +536,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE ||
            !nand_info[dev].name) {
                puts("\nno devices available\n");
-               return 1;
+               return CMD_RET_FAILURE;
        }
        nand = &nand_info[dev];
 
@@ -541,7 +545,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                for (off = 0; off < nand->size; off += nand->erasesize)
                        if (nand_block_isbad(nand, off))
                                printf("  %08llx\n", (unsigned long long)off);
-               return 0;
+               return CMD_RET_SUCCESS;
        }
 
        /*
@@ -593,7 +597,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                /* skip first two or three arguments, look for offset and size */
                if (arg_off_size(argc - o, argv + o, &dev, &off, &size,
                                 &maxsize) != 0)
-                       return 1;
+                       return CMD_RET_FAILURE;
 
                nand = &nand_info[dev];
 
@@ -613,14 +617,14 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                        opts.scrub = 1;
                                } else {
                                        puts("scrub aborted\n");
-                                       return 1;
+                                       return CMD_RET_FAILURE;
                                }
                        }
                }
                ret = nand_erase_opts(nand, &opts);
                printf("%s\n", ret ? "ERROR" : "OK");
 
-               return ret == 0 ? 0 : 1;
+               return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
        }
 
        if (strncmp(cmd, "dump", 4) == 0) {
@@ -630,7 +634,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                off = (int)simple_strtoul(argv[2], NULL, 16);
                ret = nand_dump(nand, off, !strcmp(&cmd[4], ".oob"), repeat);
 
-               return ret == 0 ? 1 : 0;
+               return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
        }
 
        if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {
@@ -647,8 +651,6 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
                printf("\nNAND %s: ", read ? "read" : "write");
 
-               nand = &nand_info[dev];
-
                s = strchr(cmd, '.');
 
                if (s && !strcmp(s, ".raw")) {
@@ -657,6 +659,8 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        if (arg_off(argv[3], &dev, &off, &size, &maxsize))
                                return 1;
 
+                       nand = &nand_info[dev];
+
                        if (argc > 4 && !str2long(argv[4], &pagecount)) {
                                printf("'%s' is not a number\n", argv[4]);
                                return 1;
@@ -679,6 +683,8 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        rwsize = size;
                }
 
+               nand = &nand_info[dev];
+
                if (!s || !strcmp(s, ".jffs2") ||
                    !strcmp(s, ".e") || !strcmp(s, ".i")) {
                        if (read)
@@ -688,26 +694,17 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        else
                                ret = nand_write_skip_bad(nand, off, &rwsize,
                                                          NULL, maxsize,
-                                                         (u_char *)addr, 0);
+                                                         (u_char *)addr,
+                                                         WITH_WR_VERIFY);
 #ifdef CONFIG_CMD_NAND_TRIMFFS
                } else if (!strcmp(s, ".trimffs")) {
                        if (read) {
                                printf("Unknown nand command suffix '%s'\n", s);
-                               return 1;
+                               return CMD_RET_FAILURE;
                        }
                        ret = nand_write_skip_bad(nand, off, &rwsize, NULL,
                                                maxsize, (u_char *)addr,
-                                               WITH_DROP_FFS);
-#endif
-#ifdef CONFIG_CMD_NAND_YAFFS
-               } else if (!strcmp(s, ".yaffs")) {
-                       if (read) {
-                               printf("Unknown nand command suffix '%s'.\n", s);
-                               return 1;
-                       }
-                       ret = nand_write_skip_bad(nand, off, &rwsize, NULL,
-                                               maxsize, (u_char *)addr,
-                                               WITH_YAFFS_OOB);
+                                               WITH_DROP_FFS | WITH_WR_VERIFY);
 #endif
                } else if (!strcmp(s, ".oob")) {
                        /* out-of-band data */
@@ -725,13 +722,13 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        ret = raw_access(nand, addr, off, pagecount, read);
                } else {
                        printf("Unknown nand command suffix '%s'.\n", s);
-                       return 1;
+                       return CMD_RET_FAILURE;
                }
 
                printf(" %zu bytes %s: %s\n", rwsize,
                       read ? "read" : "written", ret ? "ERROR" : "OK");
 
-               return ret == 0 ? 0 : 1;
+               return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
        }
 
 #ifdef CONFIG_CMD_NAND_TORTURE
@@ -776,12 +773,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        --argc;
                        ++argv;
                }
-               return ret;
+               return ret == 0 ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
        }
 
        if (strcmp(cmd, "biterr") == 0) {
                /* todo */
-               return 1;
+               return CMD_RET_FAILURE;
        }
 
 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
@@ -801,10 +798,10 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                puts("NAND flash successfully locked\n");
                        } else {
                                puts("Error locking NAND flash\n");
-                               return 1;
+                               return CMD_RET_FAILURE;
                        }
                }
-               return 0;
+               return CMD_RET_SUCCESS;
        }
 
        if (strncmp(cmd, "unlock", 5) == 0) {
@@ -817,16 +814,16 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
                if (arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
                                 &maxsize) < 0)
-                       return 1;
+                       return CMD_RET_FAILURE;
 
                if (!nand_unlock(&nand_info[dev], off, size, allexcept)) {
                        puts("NAND flash successfully unlocked\n");
                } else {
                        puts("Error unlocking NAND flash, "
                             "write and erase will probably fail\n");
-                       return 1;
+                       return CMD_RET_FAILURE;
                }
-               return 0;
+               return CMD_RET_SUCCESS;
        }
 #endif
 
@@ -850,11 +847,6 @@ static char nand_help_text[] =
        "    write 'size' bytes starting at offset 'off' from memory address\n"
        "    'addr', skipping bad blocks and dropping any pages at the end\n"
        "    of eraseblocks that contain only 0xFF\n"
-#endif
-#ifdef CONFIG_CMD_NAND_YAFFS
-       "nand write.yaffs - addr off|partition size\n"
-       "    write 'size' bytes starting at offset 'off' with yaffs format\n"
-       "    from memory address 'addr', skipping bad blocks.\n"
 #endif
        "nand erase[.spread] [clean] off size - erase 'size' bytes "
        "from offset 'off'\n"
@@ -898,7 +890,9 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
        int r;
        char *s;
        size_t cnt;
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        image_header_t *hdr;
+#endif
 #if defined(CONFIG_FIT)
        const void *fit_hdr = NULL;
 #endif
@@ -924,6 +918,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
        bootstage_mark(BOOTSTAGE_ID_NAND_HDR_READ);
 
        switch (genimg_get_format ((void *)addr)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        case IMAGE_FORMAT_LEGACY:
                hdr = (image_header_t *)addr;
 
@@ -932,6 +927,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
 
                cnt = image_get_image_size (hdr);
                break;
+#endif
 #if defined(CONFIG_FIT)
        case IMAGE_FORMAT_FIT:
                fit_hdr = (const void *)addr;