]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: nandwrite: Large page+oob support
authorBrian Norris <computersforpeace@gmail.com>
Sat, 16 Oct 2010 02:12:25 +0000 (19:12 -0700)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sun, 17 Oct 2010 08:02:32 +0000 (11:02 +0300)
Dynamic allocation of the oob buffer provides the necessary
support for removing the oob size check. Now, new unknown OOB
sizes can be handled correctly (for example, 8KB page + 448B
OOB).

Included common.h for the use of xmalloc.

Memory freeing should occur on "restoreoob" as well as on
"closeall."

[Conflicts resolved by Artem]

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
nandwrite.c

index 3520c629922fb685a3798f4c321179c8ce8e0ede..5cdea1ee7f05e5643d856e7f50da431ca8f81b2f 100644 (file)
@@ -41,9 +41,7 @@
 
 #include <asm/types.h>
 #include "mtd/mtd-user.h"
-
-#define MAX_PAGE_SIZE  4096
-#define MAX_OOB_SIZE   128
+#include "common.h"
 
 // oob layouts to pass into the kernel as default
 static struct nand_oobinfo none_oobinfo = {
@@ -276,12 +274,10 @@ int main(int argc, char * const argv[])
        unsigned char *writebuf = NULL;
        // points to the OOB for the current page in filebuf
        unsigned char *oobreadbuf = NULL;
-       unsigned char oobbuf[MAX_OOB_SIZE];
+       unsigned char *oobbuf = NULL;
 
        process_options(argc, argv);
 
-       erase_buffer(oobbuf, sizeof(oobbuf));
-
        if (pad && writeoob) {
                fprintf(stderr, "Can't pad when oob data is present.\n");
                exit (EXIT_FAILURE);
@@ -304,17 +300,6 @@ int main(int argc, char * const argv[])
         * (virtual) block size */
        meminfo.erasesize *= blockalign;
 
-       /* Make sure device page sizes are valid */
-       if (!(meminfo.oobsize == 16 && meminfo.writesize == 512) &&
-                       !(meminfo.oobsize == 8 && meminfo.writesize == 256) &&
-                       !(meminfo.oobsize == 64 && meminfo.writesize == 2048) &&
-                       !(meminfo.oobsize == 64 && meminfo.writesize == 4096) &&
-                       !(meminfo.oobsize == 128 && meminfo.writesize == 4096)) {
-               fprintf(stderr, "Unknown flash (not normal NAND)\n");
-               close(fd);
-               exit (EXIT_FAILURE);
-       }
-
        if (mtdoffset & (meminfo.writesize - 1)) {
                fprintf(stderr, "The start address is not page-aligned !\n"
                                "The pagesize of this NAND Flash is 0x%x.\n",
@@ -452,14 +437,12 @@ int main(int argc, char * const argv[])
 
        // Allocate a buffer big enough to contain all the data (OOB included) for one eraseblock
        filebuf_max = pagelen * meminfo.erasesize / meminfo.writesize;
-       filebuf = (unsigned char*)malloc(filebuf_max);
-       if (!filebuf) {
-               fprintf(stderr, "Failed to allocate memory for file buffer (%d bytes)\n",
-                               pagelen * meminfo.erasesize / meminfo.writesize);
-               goto closeall;
-       }
+       filebuf = xmalloc(filebuf_max);
        erase_buffer(filebuf, filebuf_max);
 
+       oobbuf = xmalloc(meminfo.oobsize);
+       erase_buffer(oobbuf, meminfo.oobsize);
+
        /*
         * Get data from input and write to the device while there is
         * still input to read and we are still within the device
@@ -689,13 +672,12 @@ int main(int argc, char * const argv[])
        failed = false;
 
 closeall:
-       if (filebuf) {
-               free(filebuf);
-       }
-
        close(ifd);
 
 restoreoob:
+       free(filebuf);
+       free(oobbuf);
+
        if (oobinfochanged == 1) {
                if (ioctl (fd, MEMSETOOBSEL, &old_oobinfo) != 0) {
                        perror ("MEMSETOOBSEL");