nand: yaffs: Remove the "nand write.yaffs" command
authorPeter Tyser <ptyser@xes-inc.com>
Tue, 3 Feb 2015 17:58:16 +0000 (11:58 -0600)
committerScott Wood <scottwood@freescale.com>
Tue, 31 Mar 2015 04:24:39 +0000 (23:24 -0500)
This command is only enabled by one board, complicates the NAND code,
and doesn't appear to have been functioning properly for several
years.  If there are no bad blocks in the NAND region being written
nand_write_skip_bad() will take the shortcut of calling nand_write()
which bypasses the special yaffs handling.  This causes invalid YAFFS
data to be written. See
http://lists.denx.de/pipermail/u-boot/2011-September/102830.html for
an example and a potential workaround.

U-Boot still retains the ability to mount and access YAFFS partitions
via CONFIG_YAFFS2.

Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
common/cmd_nand.c
drivers/mtd/nand/nand_util.c
include/configs/M54418TWR.h
include/configs/VCMA9.h
include/nand.h

index bada28cb7ae576d26f8900696a60c83f3f8cacf8..17fa7ea6bd05a4c3f32a0c29ebe23ba013d0557c 100644 (file)
@@ -704,16 +704,6 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        ret = nand_write_skip_bad(nand, off, &rwsize, NULL,
                                                maxsize, (u_char *)addr,
                                                WITH_DROP_FFS | WITH_WR_VERIFY);
-#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_WR_VERIFY);
 #endif
                } else if (!strcmp(s, ".oob")) {
                        /* out-of-band data */
@@ -856,11 +846,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"
index f48775607101f50a239f6c00abbd11da8712526f..12dd26a33fac3458d0fd89bcf2dcc91859f75895 100644 (file)
@@ -580,24 +580,7 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
        if (actual)
                *actual = 0;
 
-#ifdef CONFIG_CMD_NAND_YAFFS
-       if (flags & WITH_YAFFS_OOB) {
-               if (flags & (~WITH_YAFFS_OOB & ~WITH_WR_VERIFY))
-                       return -EINVAL;
-
-               int pages;
-               pages = nand->erasesize / nand->writesize;
-               blocksize = (pages * nand->oobsize) + nand->erasesize;
-               if (*length % (nand->writesize + nand->oobsize)) {
-                       printf("Attempt to write incomplete page"
-                               " in yaffs mode\n");
-                       return -EINVAL;
-               }
-       } else
-#endif
-       {
-               blocksize = nand->erasesize;
-       }
+       blocksize = nand->erasesize;
 
        /*
         * nand_write() handles unaligned, partial page writes.
@@ -666,58 +649,22 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                else
                        write_size = blocksize - block_offset;
 
-#ifdef CONFIG_CMD_NAND_YAFFS
-               if (flags & WITH_YAFFS_OOB) {
-                       int page, pages;
-                       size_t pagesize = nand->writesize;
-                       size_t pagesize_oob = pagesize + nand->oobsize;
-                       struct mtd_oob_ops ops;
-
-                       ops.len = pagesize;
-                       ops.ooblen = nand->oobsize;
-                       ops.mode = MTD_OPS_AUTO_OOB;
-                       ops.ooboffs = 0;
-
-                       pages = write_size / pagesize_oob;
-                       for (page = 0; page < pages; page++) {
-                               WATCHDOG_RESET();
-
-                               ops.datbuf = p_buffer;
-                               ops.oobbuf = ops.datbuf + pagesize;
-
-                               rval = mtd_write_oob(nand, offset, &ops);
-
-                               if ((flags & WITH_WR_VERIFY) && !rval)
-                                       rval = nand_verify_page_oob(nand,
-                                                       &ops, offset);
-
-                               if (rval != 0)
-                                       break;
-
-                               offset += pagesize;
-                               p_buffer += pagesize_oob;
-                       }
-               }
-               else
-#endif
-               {
-                       truncated_write_size = write_size;
+               truncated_write_size = write_size;
 #ifdef CONFIG_CMD_NAND_TRIMFFS
-                       if (flags & WITH_DROP_FFS)
-                               truncated_write_size = drop_ffs(nand, p_buffer,
-                                               &write_size);
+               if (flags & WITH_DROP_FFS)
+                       truncated_write_size = drop_ffs(nand, p_buffer,
+                                       &write_size);
 #endif
 
-                       rval = nand_write(nand, offset, &truncated_write_size,
-                                       p_buffer);
+               rval = nand_write(nand, offset, &truncated_write_size,
+                               p_buffer);
 
-                       if ((flags & WITH_WR_VERIFY) && !rval)
-                               rval = nand_verify(nand, offset,
-                                       truncated_write_size, p_buffer);
+               if ((flags & WITH_WR_VERIFY) && !rval)
+                       rval = nand_verify(nand, offset,
+                               truncated_write_size, p_buffer);
 
-                       offset += write_size;
-                       p_buffer += write_size;
-               }
+               offset += write_size;
+               p_buffer += write_size;
 
                if (rval != 0) {
                        printf("NAND write to offset %llx failed %d\n",
index be1750f62780b009e4b530c81c5b3850a8e92cd7..3a6e9811d51e02a61db20d0164770e3a01b872d7 100644 (file)
@@ -53,7 +53,6 @@
 #define CONFIG_CMD_MISC
 #define CONFIG_CMD_MII
 #undef CONFIG_CMD_NAND
-#undef CONFIG_CMD_NAND_YAFFS
 #define CONFIG_CMD_NET
 #define CONFIG_CMD_NFS
 #define CONFIG_CMD_PING
index 94078f548196a1075ebc0658910506fa1b45d631..6aee6db3f38acfbd02616d07607dae744e49d3c5 100644 (file)
@@ -62,7 +62,6 @@
 #define CONFIG_CMD_PING
 #define CONFIG_CMD_BSP
 #define CONFIG_CMD_NAND
-#define CONFIG_CMD_NAND_YAFFS
 
 #define CONFIG_BOARD_LATE_INIT
 
index 8ea4d5d75caeb8313d40a26f24d49e043d63de50..d2a53ab856e8c4228e616b1bde2de35f25350162 100644 (file)
@@ -104,11 +104,8 @@ typedef struct nand_erase_options nand_erase_options_t;
 int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                       size_t *actual, loff_t lim, u_char *buffer);
 
-#define WITH_YAFFS_OOB (1 << 0) /* whether write with yaffs format. This flag
-                                 * is a 'mode' meaning it cannot be mixed with
-                                 * other flags */
-#define WITH_DROP_FFS  (1 << 1) /* drop trailing all-0xff pages */
-#define WITH_WR_VERIFY (1 << 2) /* verify data was written correctly */
+#define WITH_DROP_FFS  (1 << 0) /* drop trailing all-0xff pages */
+#define WITH_WR_VERIFY (1 << 1) /* verify data was written correctly */
 
 int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
                        size_t *actual, loff_t lim, u_char *buffer, int flags);