From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott Wood Date: Fri, 16 Nov 2012 17:54:10 -0600 Subject: [U-Boot] [PATCH v2] nand: Add torture feature In-Reply-To: <1752254295.1495778.1353093654020.JavaMail.root@advansee.com> (from benoit.thebaudeau@advansee.com on Fri Nov 16 13:20:54 2012) Message-ID: <1353110050.13910.6@snotra> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 11/16/2012 01:20:54 PM, Beno?t Th?baudeau wrote: > +int nand_torture(nand_info_t *nand, loff_t offset) > +{ > + u_char patterns[] = {0xa5, 0x5a, 0x00}; > + struct erase_info instr = { > + .mtd = nand, > + .addr = offset, > + .len = nand->erasesize, > + }; > + size_t retlen; > + int err, ret = -1, i, patt_count; > + u_char *buf; > + > + if ((offset & (nand->erasesize - 1)) != 0) { > + puts("Attempt to torture a block at a non block-aligned > " > + "offset\n"); > + return -EINVAL; > + } > + > + if (offset + nand->erasesize > nand->size) { > + puts("Attempt to torture a block outside the flash > area\n"); > + return -EINVAL; > + } I won't hold up the patch for this, since I think it works out OK due to type promotion rules (and in any case there are easier ways for a hostile user to do bad things in U-Boot) with nand->size being uint64_t, but loff_t is signed. An explicit cast would be nice. > + patt_count = ARRAY_SIZE(patterns); > + > + buf = malloc(nand->erasesize); > + if (buf == NULL) { > + puts("Out of memory for erase block buffer\n"); > + return -ENOMEM; > + } > + > + for (i = 0; i < patt_count; i++) { > + err = nand->erase(nand, &instr); > + if (err) { > + printf("%s: erase() failed for block at 0x%llx: > %d\n", > + nand->name, instr.addr, err); > + goto out; > + } > + > + /* Make sure the block contains only 0xff bytes */ > + err = nand->read(nand, offset, nand->erasesize, > &retlen, buf); > + if ((err && err != -EUCLEAN) || retlen != > nand->erasesize) { > + printf("%s: read() failed for block at 0x%llx: > %d\n", > + nand->name, instr.addr, err); > + goto out; > + } > + > + err = check_pattern(buf, 0xff, nand->erasesize); > + if (!err) { > + printf("Erased block at 0x%llx, but a non-0xff > byte " > + "was found\n", offset); > + ret = -EIO; > + goto out; > + } Strings should not be wrapped (to improve greppability of errors), even if it would put the line over 80 columns. I'll fix this when applying. > diff --git u-boot-nand-flash-9c60e75.orig/include/nand.h > u-boot-nand-flash-9c60e75/include/nand.h > index bbe28b2..c4530b0 100644 > --- u-boot-nand-flash-9c60e75.orig/include/nand.h > +++ u-boot-nand-flash-9c60e75/include/nand.h > @@ -139,6 +139,9 @@ int nand_read_skip_bad(nand_info_t *nand, loff_t > offset, size_t *length, > int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t > *length, > u_char *buffer, int flags); > int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t > *opts); > +#ifdef CONFIG_CMD_NAND_TORTURE > +int nand_torture(nand_info_t *nand, loff_t offset); > +#endif Prototypes should not be ifdeffed. Will fix when applying. Applied to u-boot-nand-flash. -Scott