diff options
Diffstat (limited to 'commands/nand-bitflip.c')
-rw-r--r-- | commands/nand-bitflip.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/commands/nand-bitflip.c b/commands/nand-bitflip.c index cfde2f4040..1395021ec0 100644 --- a/commands/nand-bitflip.c +++ b/commands/nand-bitflip.c @@ -1,13 +1,4 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ +// SPDX-License-Identifier: GPL-2.0-only #include <common.h> #include <command.h> @@ -19,6 +10,25 @@ #include <linux/mtd/mtd.h> #include <mtd/mtd-peb.h> +static int bitflip_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, void *buf) +{ + int ret_code; + + if (mtd->_read_oob) { + struct mtd_oob_ops ops = { + .len = len, + .datbuf = buf, + }; + + ret_code = mtd->_read_oob(mtd, from, &ops); + } else { + ret_code = mtd->_read(mtd, from, len, retlen, buf); + } + + return ret_code; +} + static int do_nand_bitflip(int argc, char *argv[]) { int opt, ret, fd; @@ -43,7 +53,7 @@ static int do_nand_bitflip(int argc, char *argv[]) block = simple_strtoul(optarg, NULL, 0); break; case 'o': - offset = simple_strtoull(optarg, NULL, 0); + offset = strtoull_suffix(optarg, NULL, 0); break; case 'c': check = 1; @@ -86,7 +96,7 @@ static int do_nand_bitflip(int argc, char *argv[]) buf = xzalloc(meminfo.writesize); roffset = (loff_t)block * meminfo.mtd->erasesize + offset; - ret = meminfo.mtd->read(meminfo.mtd, roffset, meminfo.writesize, &r, buf); + ret = bitflip_mtd_read(meminfo.mtd, roffset, meminfo.writesize, &r, buf); if (ret > 0) { printf("page at block %d, offset 0x%08llx has %d bitflips%s\n", block, offset, ret, |