[PATCH] mtd: nand: fix off-by-one read retry mode counting

Brian Norris computersforpeace at gmail.com
Wed Feb 12 19:46:34 EST 2014


A flash may support N read retry voltage threshold modes, numbered 1
through N (where mode 0 represents the initial state). However,
nand_setup_read_retry() prematurely quits with an error when mode == N.

This off-by-one error shows up, for instance, when using nanddump, and
we have cycled through available modes:

    nand: setting READ RETRY mode 0
    nand: setting READ RETRY mode 1
    nand: setting READ RETRY mode 2
    nand: setting READ RETRY mode 3
    nand: setting READ RETRY mode 4
    nand: setting READ RETRY mode 5
    nand: setting READ RETRY mode 6
    nand: setting READ RETRY mode 7
    nand: setting READ RETRY mode 8
    libmtd: error!: cannot read 8192 bytes from mtd0 (eraseblock 20, offset 0)
            error 22 (Invalid argument)
    nanddump: error!: mtd_read

Tested on Micron MT29F64G08CBCBBH1, with 8 retry modes.

Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/nand/nand_base.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 9be7842f300e..76535a61b87a 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -1471,7 +1471,7 @@ static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
 
 	pr_debug("setting READ RETRY mode %d\n", retry_mode);
 
-	if (retry_mode >= chip->read_retries)
+	if (retry_mode > chip->read_retries)
 		return -EINVAL;
 
 	if (!chip->setup_read_retry)
-- 
1.8.3.2




More information about the linux-mtd mailing list