[PATCH 1/2] mtd: rawnand: Constrain even more when continuous reads are enabled

Christophe Kerello christophe.kerello at foss.st.com
Fri Mar 8 04:26:59 PST 2024


Hi Miquel,

On 3/7/24 12:53, Miquel Raynal wrote:
> As a matter of fact, continuous reads require additional handling at the
> operation level in order for them to work properly. The core helpers do
> have this additional logic now, but any time a controller implements its
> own page helper, this extra logic is "lost". This means we need another
> level of per-controller driver checks to ensure they can leverage
> continuous reads. This is for now unsupported, so in order to ensure
> continuous reads are enabled only when fully using the core page
> helpers, we need to add more initial checks.
> 
> Also, as performance is not relevant during raw accesses, we also
> prevent these from enabling the feature.
> 
> This should solve the issue seen with controllers such as the STM32 FMC2
> when in sequencer mode. In this case, the continuous read feature would
> be enabled but not leveraged, and most importantly not disabled, leading
> to further operations to fail.
> 
> Reported-by: Christophe Kerello <christophe.kerello at foss.st.com>
> Fixes: 003fe4b9545b ("mtd: rawnand: Support for sequential cache reads")
> Cc: stable at vger.kernel.org
> Signed-off-by: Miquel Raynal <miquel.raynal at bootlin.com>

Tested-by: Christophe Kerello <christophe.kerello at foss.st.com>

Regards,
Christophe Kerello.

> ---
>   drivers/mtd/nand/raw/nand_base.c | 12 +++++++++++-
>   1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
> index 4d5a663e4e05..2479fa98f991 100644
> --- a/drivers/mtd/nand/raw/nand_base.c
> +++ b/drivers/mtd/nand/raw/nand_base.c
> @@ -3594,7 +3594,8 @@ static int nand_do_read_ops(struct nand_chip *chip, loff_t from,
>   	oob = ops->oobbuf;
>   	oob_required = oob ? 1 : 0;
>   
> -	rawnand_enable_cont_reads(chip, page, readlen, col);
> +	if (likely(ops->mode != MTD_OPS_RAW))
> +		rawnand_enable_cont_reads(chip, page, readlen, col);
>   
>   	while (1) {
>   		struct mtd_ecc_stats ecc_stats = mtd->ecc_stats;
> @@ -5212,6 +5213,15 @@ static void rawnand_late_check_supported_ops(struct nand_chip *chip)
>   	if (!nand_has_exec_op(chip))
>   		return;
>   
> +	/*
> +	 * For now, continuous reads can only be used with the core page helpers.
> +	 * This can be extended later.
> +	 */
> +	if (!(chip->ecc.read_page == nand_read_page_hwecc ||
> +	      chip->ecc.read_page == nand_read_page_syndrome ||
> +	      chip->ecc.read_page == nand_read_page_swecc))
> +		return;
> +
>   	rawnand_check_cont_read_support(chip);
>   }
>   



More information about the linux-mtd mailing list