]> git.sur5r.net Git - u-boot/blobdiff - drivers/mtd/nand/nand_util.c
Merge branch 'master' of git://git.denx.de/u-boot-mpc83xx
[u-boot] / drivers / mtd / nand / nand_util.c
index 02fe914db8b2e8f89a102ccda757b32a247cd7c1..149af83abd34aac37e46beda81de90d61ecd3808 100644 (file)
@@ -31,9 +31,6 @@
  */
 
 #include <common.h>
-
-#if defined(CONFIG_CMD_NAND) && !defined(CFG_NAND_LEGACY)
-
 #include <command.h>
 #include <watchdog.h>
 #include <malloc.h>
@@ -81,9 +78,7 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
        const char *mtd_device = meminfo->name;
        struct mtd_oob_ops oob_opts;
        struct nand_chip *chip = meminfo->priv;
-       uint8_t buf[64];
 
-       memset(buf, 0, sizeof(buf));
        memset(&erase, 0, sizeof(erase));
        memset(&oob_opts, 0, sizeof(oob_opts));
 
@@ -92,13 +87,9 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
        erase.addr = opts->offset;
        erase_length = opts->length;
 
-
        cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);
        cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);
        cleanmarker.totlen = cpu_to_je32(8);
-       cleanmarker.hdr_crc = cpu_to_je32(
-       crc32_no_comp(0, (unsigned char *) &cleanmarker,
-       sizeof(struct jffs2_unknown_node) - 4));
 
        /* scrub option allows to erase badblock. To prevent internal
         * check from erase() method, set block check method to dummy
@@ -157,23 +148,21 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
                }
 
                /* format for JFFS2 ? */
-               if (opts->jffs2) {
-
-                       chip->ops.len = chip->ops.ooblen = 64;
+               if (opts->jffs2 && chip->ecc.layout->oobavail >= 8) {
+                       chip->ops.ooblen = 8;
                        chip->ops.datbuf = NULL;
-                       chip->ops.oobbuf = buf;
-                       chip->ops.ooboffs = chip->badblockpos & ~0x01;
+                       chip->ops.oobbuf = (uint8_t *)&cleanmarker;
+                       chip->ops.ooboffs = 0;
+                       chip->ops.mode = MTD_OOB_AUTO;
 
                        result = meminfo->write_oob(meminfo,
-                                                       erase.addr + meminfo->oobsize,
-                                                       &chip->ops);
+                                                   erase.addr,
+                                                   &chip->ops);
                        if (result != 0) {
                                printf("\n%s: MTD writeoob failure: %d\n",
-                               mtd_device, result);
+                                      mtd_device, result);
                                continue;
                        }
-                       else
-                               printf("%s: MTD writeoob at 0x%08x\n",mtd_device, erase.addr + meminfo->oobsize );
                }
 
                if (!opts->quiet) {
@@ -193,11 +182,11 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
                                percent_complete = percent;
 
                                printf("\rErasing at 0x%x -- %3d%% complete.",
-                               erase.addr, percent);
+                                      erase.addr, percent);
 
                                if (opts->jffs2 && result == 0)
-                               printf(" Cleanmarker written at 0x%x.",
-                               erase.addr);
+                                       printf(" Cleanmarker written at 0x%x.",
+                                              erase.addr);
                        }
                }
        }
@@ -438,7 +427,7 @@ int nand_unlock(nand_info_t *meminfo, ulong start, ulong length)
  * @return image length including bad blocks
  */
 static size_t get_len_incl_bad (nand_info_t *nand, size_t offset,
-                                const size_t length)
+                               const size_t length)
 {
        size_t len_incl_bad = 0;
        size_t len_excl_bad = 0;
@@ -475,7 +464,7 @@ static size_t get_len_incl_bad (nand_info_t *nand, size_t offset,
  * @return             0 in case of success
  */
 int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
-                        u_char *buffer)
+                       u_char *buffer)
 {
        int rval;
        size_t left_to_write = *length;
@@ -500,7 +489,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
                rval = nand_write (nand, offset, length, buffer);
                if (rval != 0) {
                        printf ("NAND write to offset %x failed %d\n",
-                               offset, rval);
+                               offset, rval);
                        return rval;
                }
        }
@@ -524,7 +513,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
                rval = nand_write (nand, offset, &write_size, p_buffer);
                if (rval != 0) {
                        printf ("NAND write to offset %x failed %d\n",
-                               offset, rval);
+                               offset, rval);
                        *length -= left_to_write;
                        return rval;
                }
@@ -570,7 +559,7 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
                rval = nand_read (nand, offset, length, buffer);
                if (rval != 0) {
                        printf ("NAND read from offset %x failed %d\n",
-                               offset, rval);
+                               offset, rval);
                        return rval;
                }
        }
@@ -594,7 +583,7 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
                rval = nand_read (nand, offset, &read_length, p_buffer);
                if (rval != 0) {
                        printf ("NAND read from offset %x failed %d\n",
-                               offset, rval);
+                               offset, rval);
                        *length -= left_to_read;
                        return rval;
                }
@@ -606,5 +595,3 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length,
 
        return 0;
 }
-
-#endif /* defined(CONFIG_CMD_NAND) && !defined(CFG_NAND_LEGACY) */