From 00fc2d4d47e87536c89509f234777fc7d93cab9e Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Fri, 15 Oct 2010 19:12:25 -0700 Subject: mtd-utils: nandwrite: Large page+oob support 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 Signed-off-by: Artem Bityutskiy --- nandwrite.c | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/nandwrite.c b/nandwrite.c index 3520c62..5cdea1e 100644 --- a/nandwrite.c +++ b/nandwrite.c @@ -41,9 +41,7 @@ #include #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"); -- cgit v1.2.3