[PATCH 08/14] ARM: i.MX: xload nand: Pull ECC status checking out of read page

Marco Felsch m.felsch at pengutronix.de
Wed Nov 2 01:33:14 PDT 2022


Hi Sascha,

On 22-11-01, Sascha Hauer wrote:
> The read page code can be reused by upcoming i.MX7 support, but the ECC
> checking will be different. Pull ECC status checking out of the read
> page code to make that reusable on i.MX7.
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
>  arch/arm/mach-imx/xload-gpmi-nand.c | 42 ++++++++++++++++++++---------
>  1 file changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/xload-gpmi-nand.c b/arch/arm/mach-imx/xload-gpmi-nand.c
> index dc4cc45be0..543ec108ba 100644
> --- a/arch/arm/mach-imx/xload-gpmi-nand.c
> +++ b/arch/arm/mach-imx/xload-gpmi-nand.c
> @@ -236,8 +236,6 @@ static int mxs_nand_read_page(struct mxs_nand_info *info, int writesize,
>  	int cmd_queue_len;
>  	u8 *cmd_buf;
>  	int ret;
> -	uint8_t	*status;
> -	int i;
>  	int timeout;
>  	int descnum = 0;
>  	int max_pagenum = info->nand_size /
> @@ -375,20 +373,26 @@ static int mxs_nand_read_page(struct mxs_nand_info *info, int writesize,
>  	writel(BCH_CTRL_COMPLETE_IRQ,
>  		bch_regs + BCH_CTRL + STMP_OFFSET_REG_CLR);
>  
> -	/* Loop over status bytes, accumulating ECC status. */
> -	status = databuf + writesize + mxs_nand_aux_status_offset();
> -	for (i = 0; i < writesize / MXS_NAND_CHUNK_DATA_CHUNK_SIZE; i++) {
> -		if (status[i] == 0xfe) {
> -			ret = -EBADMSG;
> -			goto err;
> -		}
> -	}
> -
>  	ret = 0;
>  err:
>  	return ret;
>  }
>  
> +static int mxs_nand_get_ecc_status(struct mxs_nand_info *info, void *databuf)
> +{
> +	uint8_t	*status;
> +	int i;
> +
> +	/* Loop over status bytes, accumulating ECC status. */
> +	status = databuf + info->organization.pagesize + mxs_nand_aux_status_offset();
> +	for (i = 0; i < info->organization.pagesize / MXS_NAND_CHUNK_DATA_CHUNK_SIZE; i++) {
> +		if (status[i] == 0xfe)
> +			return -EBADMSG;
> +	}
> +
> +	return 0;
> +}
> +
>  static int mxs_nand_get_read_status(struct mxs_nand_info *info, void *databuf)
>  {
>  	int ret;
> @@ -851,6 +855,10 @@ static int get_fcb(struct mxs_nand_info *info, void *databuf)
>  		if (ret)
>  			continue;
>  
> +		ret = mxs_nand_get_ecc_status(info, databuf);
> +		if (ret)
> +			continue;
> +
>  		memcpy(fcb, databuf + mxs_nand_aux_status_offset(),
>  			sizeof(*fcb));
>  
> @@ -886,7 +894,11 @@ static int get_dbbt(struct mxs_nand_info *info, void *databuf)
>  		page = startpage + i * info->organization.pages_per_eraseblock;
>  
>  		ret = mxs_nand_read_page(info, info->organization.pagesize,
> -			info->organization.oobsize, page, databuf, 0);
> +			info->organization.oobsize, page, databuf, 0, false);

Maybe I didn't saw the change, but where did you changed the function
declaration?

Regards,
  Marco

> +		if (ret)
> +			continue;
> +
> +		ret = mxs_nand_get_ecc_status(info, databuf);
>  		if (ret)
>  			continue;
>  
> @@ -900,7 +912,11 @@ static int get_dbbt(struct mxs_nand_info *info, void *databuf)
>  			return -ENOENT;
>  
>  		ret = mxs_nand_read_page(info, info->organization.pagesize,
> -			info->organization.oobsize, page + 4, databuf, 0);
> +			info->organization.oobsize, page + 4, databuf, 0, false);
> +		if (ret)
> +			continue;
> +
> +		ret = mxs_nand_get_ecc_status(info, databuf);
>  		if (ret)
>  			continue;
>  
> -- 
> 2.30.2
> 
> 
> 



More information about the barebox mailing list