[2/3] mtd: rawnand: micron: Disable ECC earlier in the read path

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

 



Hi Boris,

On 04/07/18 00:20, Boris Brezillon wrote:
> We are about to support extracting the real number of bitflips for
> 4-bits ECC when WRITE_RECOMMEND is returned. This requires re-reading
> the page in raw mode to compare it to the corrected version, and this
> logic will be placed in micron_nand_on_die_ecc_status_4().
> 
> Moving the micron_nand_on_die_ecc_setup() will allow us to disable
> ECC only once.
> 
> As a result, we have to rework the exit path and add an error path
> where the ECC is disabled.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon at bootlin.com>

As I said on the other thread this appears to cause a problem for me on 
the MT29F1G08ABAFAWP-ITE setup I have. I notice we're not able to find 
the BBT, not sure if that is symptom or cause. If I revert this I can 
successfully mount and access data on the chip.

Here's some output from dmesg:

nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xd1
nand: Micron MT29F1G08ABAGAWP
nand: 128 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 128
nand: timing mode 5 not acknowledged by the NAND chip
Bad block table not found for chip 0
Bad block table not found for chip 0
Scanning device for bad blocks
random: fast init done
Bad block table written to 0x000007fe0000, version 0x01
Bad block table written to 0x000007fc0000, version 0x01
3 fixed-partitions partitions found on MTD device pxa3xx_nand-0
Creating 3 MTD partitions on "pxa3xx_nand-0":
0x000000000000-0x000007000000 : "user"
0x000007000000-0x000007800000 : "errlog"
mtdoops: Attached to MTD device 1
mtdoops: ready 0, 1
0x000007800000-0x000008000000 : "nand-bbt"

And from my attempt to mount:

[root at linuxbox ~]# umount /flash && ubiattach -p /dev/mtd0 && mount -t 
ubifs ubi
0:user -o sync /flash
ubi0: attaching mtd0
ubi0: scanning is finished
ubi0 error: ubi_read_volume_table: the layout volume was not found
ubi0 error: ubi_attach_mtd_dev: failed to attach mtd0, error -22
ubiattach: error!: cannot attach "/dev/mtd0"
            error 22 (Invalid argument)
[root at linuxbox ~]#


> ---
>   drivers/mtd/nand/raw/nand_micron.c | 25 ++++++++++++++++---------
>   1 file changed, 16 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c
> index 63ac98a36ed7..b9cbaf125a98 100644
> --- a/drivers/mtd/nand/raw/nand_micron.c
> +++ b/drivers/mtd/nand/raw/nand_micron.c
> @@ -197,30 +197,37 @@ micron_nand_read_page_on_die_ecc(struct mtd_info *mtd, struct nand_chip *chip,
>   
>   	ret = nand_read_page_op(chip, page, 0, NULL, 0);
>   	if (ret)
> -		goto out;
> +		goto err_disable_ecc;
>   
>   	ret = nand_status_op(chip, &status);
>   	if (ret)
> -		goto out;
> +		goto err_disable_ecc;
>   
>   	ret = nand_exit_status_op(chip);
>   	if (ret)
> -		goto out;
> +		goto err_disable_ecc;
>   
> -	if (chip->ecc.strength == 4)
> -		max_bitflips = micron_nand_on_die_ecc_status_4(chip, status);
> -	else
> -		max_bitflips = micron_nand_on_die_ecc_status_8(chip, status);
> +	micron_nand_on_die_ecc_setup(chip, false);
>   
>   	ret = nand_read_data_op(chip, buf, mtd->writesize, false);
>   	if (!ret && oob_required)
>   		ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize,
>   					false);
>   
> -out:
> +	if (ret)
> +		return ret;
> +
> +	if (chip->ecc.strength == 4)
> +		max_bitflips = micron_nand_on_die_ecc_status_4(chip, status);
> +	else
> +		max_bitflips = micron_nand_on_die_ecc_status_8(chip, status);
> +
> +	return max_bitflips;
> +
> +err_disable_ecc:
>   	micron_nand_on_die_ecc_setup(chip, false);
>   
> -	return ret ? ret : max_bitflips;
> +	return ret;
>   }
>   
>   static int
> 




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

  Powered by Linux