Re: [PATCH v5 3/8] mtd: rawnand: Ensure the number of bitflips is consistent

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 19 May 2020 09:45:44 +0200
Miquel Raynal <miquel.raynal@xxxxxxxxxxx> wrote:

> The main NAND read page function can loop over "page reads" many times
> in if the reading reports uncorrectable error(s) and if the chip
> supports the read_retry feature.
> 
> In this case, the number of bitflips is summarized between
> attempts. Fix this by re-initializing the entire mtd_ecc_stats object
> each time we retry.
> 
> Suggested-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>
> Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx>

Reviewed-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx>

> ---
>  drivers/mtd/nand/raw/nand_base.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
> index 2bef01e21533..65e9b2fa2fc5 100644
> --- a/drivers/mtd/nand/raw/nand_base.c
> +++ b/drivers/mtd/nand/raw/nand_base.c
> @@ -3288,7 +3288,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
>  	oob_required = oob ? 1 : 0;
>  
>  	while (1) {
> -		unsigned int ecc_failures = mtd->ecc_stats.failed;
> +		struct mtd_ecc_stats ecc_stats = mtd->ecc_stats;
>  
>  		bytes = min(mtd->writesize - col, readlen);
>  		aligned = (bytes == mtd->writesize);
> @@ -3339,7 +3339,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
>  			 */
>  			if (use_bounce_buf) {
>  				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
> -				    !(mtd->ecc_stats.failed - ecc_failures) &&
> +				    !(mtd->ecc_stats.failed - ecc_stats.failed) &&
>  				    (ops->mode != MTD_OPS_RAW)) {
>  					chip->pagecache.page = realpage;
>  					chip->pagecache.bitflips = ret;
> @@ -3362,7 +3362,7 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
>  
>  			nand_wait_readrdy(chip);
>  
> -			if (mtd->ecc_stats.failed - ecc_failures) {
> +			if (mtd->ecc_stats.failed - ecc_stats.failed) {
>  				if (retry_mode + 1 < chip->read_retries) {
>  					retry_mode++;
>  					ret = nand_setup_read_retry(chip,
> @@ -3370,8 +3370,8 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
>  					if (ret < 0)
>  						break;
>  
> -					/* Reset failures; retry */
> -					mtd->ecc_stats.failed = ecc_failures;
> +					/* Reset ecc_stats; retry */
> +					mtd->ecc_stats = ecc_stats;
>  					goto read_retry;
>  				} else {
>  					/* No more retry modes; real failure */


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/



[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux