blob: 2bd685c9c22469c640a454612633b216f3a24186 [file] [log] [blame]
diff -aruN a/nandtest.c b/nandtest.c
--- a/nandtest.c 2011-11-16 11:20:33.715549264 -0800
+++ b/nandtest.c 2011-11-16 11:20:46.135549260 -0800
@@ -4,6 +4,7 @@
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -37,6 +38,9 @@
int markbad=0;
int seed;
+/*
+ * Erase and write block by block, checking for errors
+ */
int erase_and_write(loff_t ofs, unsigned char *data, unsigned char *rbuf)
{
struct erase_info_user er;
@@ -126,6 +130,71 @@
return 0;
}
+/*
+ * Restore page by page, skipping empty writes (writing all 0xff can result in non-0xff
+ * OOB bytes in empty blocks, which will be a problem for the fs after the test is complete).
+ */
+int erase_and_restore(loff_t ofs, unsigned char *data)
+{
+ struct erase_info_user er;
+ ssize_t len;
+ int page;
+ int page_count = (meminfo.erasesize/meminfo.writesize);
+ int i;
+ bool isempty;
+ unsigned char *data_page = data;
+
+ printf("\r%08x: erasing... ", (unsigned)ofs);
+ fflush(stdout);
+
+ er.start = ofs;
+ er.length = meminfo.erasesize;
+
+ /* Erase the whole block */
+ if (ioctl(fd, MEMERASE, &er)) {
+ perror("MEMERASE");
+ if (markbad) {
+ printf("Mark block bad at %08lx\n", (long)ofs);
+ ioctl(fd, MEMSETBADBLOCK, &ofs);
+ }
+ return 1;
+ }
+
+ printf("\r%08x: writing...", (unsigned)ofs);
+ fflush(stdout);
+
+ /* Write back page by page */
+ for (page = 0; page < page_count; page++, data_page += meminfo.writesize, ofs += meminfo.writesize) {
+ isempty = true;
+ for (i = 0; i < meminfo.writesize; i++) {
+ if (data_page[i] != 0xff) {
+ isempty = false;
+ break;
+ }
+ }
+
+ if (isempty == false) {
+ len = pwrite(fd, data_page, meminfo.writesize, ofs);
+
+ if (len < 0) {
+ printf("\n");
+ perror("write");
+ if (markbad) {
+ printf("Mark block bad at %08lx\n", (long)ofs);
+ ioctl(fd, MEMSETBADBLOCK, &ofs);
+ }
+ return 1;
+ }
+ if (len < meminfo.writesize) {
+ printf("\n");
+ fprintf(stderr, "Short write (%zd bytes)\n", len);
+ exit(1);
+ }
+ }
+ }
+
+ return 0;
+}
/*
* Main program
@@ -226,7 +295,7 @@
wbuf = malloc(meminfo.erasesize * 3);
if (!wbuf) {
fprintf(stderr, "Could not allocate %d bytes for buffer\n",
- meminfo.erasesize * 2);
+ meminfo.erasesize * 3);
exit(1);
}
rbuf = wbuf + meminfo.erasesize;
@@ -277,7 +346,7 @@
if (erase_and_write(test_ofs, wbuf, rbuf))
continue;
if (keep_contents)
- erase_and_write(test_ofs, kbuf, rbuf);
+ erase_and_restore(test_ofs, kbuf);
}
printf("\nFinished pass %d successfully\n", pass+1);
}