diff mbox series

[v3] mtd: rawnand: mxc: Move the ECC engine initialization to the right place

Message ID 20201016213613.1450-1-festevam@gmail.com
State Accepted
Headers show
Series [v3] mtd: rawnand: mxc: Move the ECC engine initialization to the right place | expand

Commit Message

Fabio Estevam Oct. 16, 2020, 9:36 p.m. UTC
No ECC initialization should happen during the host controller probe.

In fact, we need the probe function to call nand_scan() in order to:

- identify the device, its capabilities and constraints (nand_scan_ident())
- configure the ECC engine accordingly (->attach_chip())
- scan its content and prepare the core (nand_scan_tail())

Moving these lines to mxcnd_attach_chip() fixes a regression caused by
a previous commit supposed to clarify these steps.

When moving the ECC initialization from probe() to attach(), get rid
of the pdata usage to determine the engine type and let the core decide
instead.

Tested on a imx27-pdk board.

Reported-by: Fabio Estevam <festevam@gmail.com>
Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: Fabio Estevam <festevam@gmail.com>
---
Changes since v2:
- Remove pdata check in attach() and let the core determine the engine type

 drivers/mtd/nand/raw/mxc_nand.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

Comments

Fabio Estevam Oct. 18, 2020, 7:42 p.m. UTC | #1
Hi Miquel,

On Fri, Oct 16, 2020 at 6:36 PM Fabio Estevam <festevam@gmail.com> wrote:
>
> No ECC initialization should happen during the host controller probe.
>
> In fact, we need the probe function to call nand_scan() in order to:
>
> - identify the device, its capabilities and constraints (nand_scan_ident())
> - configure the ECC engine accordingly (->attach_chip())
> - scan its content and prepare the core (nand_scan_tail())
>
> Moving these lines to mxcnd_attach_chip() fixes a regression caused by
> a previous commit supposed to clarify these steps.
>
> When moving the ECC initialization from probe() to attach(), get rid
> of the pdata usage to determine the engine type and let the core decide
> instead.
>
> Tested on a imx27-pdk board.
>
> Reported-by: Fabio Estevam <festevam@gmail.com>
> Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Fabio Estevam <festevam@gmail.com>

Would you like me to resend it with the tag below?

Fixes: d7157ff49a5b ("mtd: rawnand: Use the ECC framework user input
parsing bits")

This commit is in Linus' tree now.

Thanks
Sascha Hauer Oct. 19, 2020, 9:13 a.m. UTC | #2
On Fri, Oct 16, 2020 at 06:36:13PM -0300, Fabio Estevam wrote:
> No ECC initialization should happen during the host controller probe.
> 
> In fact, we need the probe function to call nand_scan() in order to:
> 
> - identify the device, its capabilities and constraints (nand_scan_ident())
> - configure the ECC engine accordingly (->attach_chip())
> - scan its content and prepare the core (nand_scan_tail())
> 
> Moving these lines to mxcnd_attach_chip() fixes a regression caused by
> a previous commit supposed to clarify these steps.
> 
> When moving the ECC initialization from probe() to attach(), get rid
> of the pdata usage to determine the engine type and let the core decide
> instead.
> 
> Tested on a imx27-pdk board.
> 
> Reported-by: Fabio Estevam <festevam@gmail.com>
> Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Fabio Estevam <festevam@gmail.com>

I gave it a test on a Phytec phyCARD board, this fixes it.

Tested-by: Sascha Hauer <s.hauer@pengutronix.de>

Sascha

> ---
> Changes since v2:
> - Remove pdata check in attach() and let the core determine the engine type
> 
>  drivers/mtd/nand/raw/mxc_nand.c | 17 +++++------------
>  1 file changed, 5 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/mtd/nand/raw/mxc_nand.c b/drivers/mtd/nand/raw/mxc_nand.c
> index d4200eb2ad32..684c51e5e60d 100644
> --- a/drivers/mtd/nand/raw/mxc_nand.c
> +++ b/drivers/mtd/nand/raw/mxc_nand.c
> @@ -1681,6 +1681,11 @@ static int mxcnd_attach_chip(struct nand_chip *chip)
>  	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	struct device *dev = mtd->dev.parent;
>  
> +	chip->ecc.bytes = host->devtype_data->eccbytes;
> +	host->eccsize = host->devtype_data->eccsize;
> +	chip->ecc.size = 512;
> +	mtd_set_ooblayout(mtd, host->devtype_data->ooblayout);
> +
>  	switch (chip->ecc.engine_type) {
>  	case NAND_ECC_ENGINE_TYPE_ON_HOST:
>  		chip->ecc.read_page = mxc_nand_read_page;
> @@ -1836,19 +1841,7 @@ static int mxcnd_probe(struct platform_device *pdev)
>  	if (host->devtype_data->axi_offset)
>  		host->regs_axi = host->base + host->devtype_data->axi_offset;
>  
> -	this->ecc.bytes = host->devtype_data->eccbytes;
> -	host->eccsize = host->devtype_data->eccsize;
> -
>  	this->legacy.select_chip = host->devtype_data->select_chip;
> -	this->ecc.size = 512;
> -	mtd_set_ooblayout(mtd, host->devtype_data->ooblayout);
> -
> -	if (host->pdata.hw_ecc) {
> -		this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
> -	} else {
> -		this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
> -		this->ecc.algo = NAND_ECC_ALGO_HAMMING;
> -	}
>  
>  	/* NAND bus width determines access functions used by upper layer */
>  	if (host->pdata.width == 2)
> -- 
> 2.17.1
> 
> 
>
Martin Kaiser Oct. 25, 2020, 6:01 p.m. UTC | #3
Thus wrote Sascha Hauer (s.hauer@pengutronix.de):

> On Fri, Oct 16, 2020 at 06:36:13PM -0300, Fabio Estevam wrote:
> > No ECC initialization should happen during the host controller probe.

> > In fact, we need the probe function to call nand_scan() in order to:

> > - identify the device, its capabilities and constraints (nand_scan_ident())
> > - configure the ECC engine accordingly (->attach_chip())
> > - scan its content and prepare the core (nand_scan_tail())

> > Moving these lines to mxcnd_attach_chip() fixes a regression caused by
> > a previous commit supposed to clarify these steps.

> > When moving the ECC initialization from probe() to attach(), get rid
> > of the pdata usage to determine the engine type and let the core decide
> > instead.

> > Tested on a imx27-pdk board.

> > Reported-by: Fabio Estevam <festevam@gmail.com>
> > Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > Signed-off-by: Fabio Estevam <festevam@gmail.com>

> I gave it a test on a Phytec phyCARD board, this fixes it.

> Tested-by: Sascha Hauer <s.hauer@pengutronix.de>

same here on my imx25 system with this flash chip

[    2.044024] nand: Toshiba NAND 256MiB 1,8V 8-bit
[    2.048721] nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 128

Tested-by: Martin Kaiser <martin@kaiser.cx>

I would be helptful if the fix showed up in linux-next soon...
Miquel Raynal Oct. 26, 2020, 5:45 p.m. UTC | #4
On Fri, 2020-10-16 at 21:36:13 UTC, Fabio Estevam wrote:
> No ECC initialization should happen during the host controller probe.
> 
> In fact, we need the probe function to call nand_scan() in order to:
> 
> - identify the device, its capabilities and constraints (nand_scan_ident())
> - configure the ECC engine accordingly (->attach_chip())
> - scan its content and prepare the core (nand_scan_tail())
> 
> Moving these lines to mxcnd_attach_chip() fixes a regression caused by
> a previous commit supposed to clarify these steps.
> 
> When moving the ECC initialization from probe() to attach(), get rid
> of the pdata usage to determine the engine type and let the core decide
> instead.
> 
> Tested on a imx27-pdk board.
> 
> Reported-by: Fabio Estevam <festevam@gmail.com>
> Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> Signed-off-by: Fabio Estevam <festevam@gmail.com>
> Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
> Tested-by: Martin Kaiser <martin@kaiser.cx>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git mtd/fixes, thanks.

Miquel
Miquel Raynal Oct. 26, 2020, 5:49 p.m. UTC | #5
Hello,

Miquel Raynal <miquel.raynal@bootlin.com> wrote on Mon, 26 Oct 2020
18:45:32 +0100:

> On Fri, 2020-10-16 at 21:36:13 UTC, Fabio Estevam wrote:
> > No ECC initialization should happen during the host controller probe.
> > 
> > In fact, we need the probe function to call nand_scan() in order to:
> > 
> > - identify the device, its capabilities and constraints (nand_scan_ident())
> > - configure the ECC engine accordingly (->attach_chip())
> > - scan its content and prepare the core (nand_scan_tail())
> > 
> > Moving these lines to mxcnd_attach_chip() fixes a regression caused by
> > a previous commit supposed to clarify these steps.
> > 
> > When moving the ECC initialization from probe() to attach(), get rid
> > of the pdata usage to determine the engine type and let the core decide
> > instead.
> > 
> > Tested on a imx27-pdk board.
> > 
> > Reported-by: Fabio Estevam <festevam@gmail.com>
> > Co-developed-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
> > Signed-off-by: Fabio Estevam <festevam@gmail.com>
> > Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
> > Tested-by: Martin Kaiser <martin@kaiser.cx>  

This patch should be in next by tomorrow+.

I moved my SoB to the bottom as Fabio is now the author of the patch
and added the Fixes tag.

Cheers,
Miquèl
diff mbox series

Patch

diff --git a/drivers/mtd/nand/raw/mxc_nand.c b/drivers/mtd/nand/raw/mxc_nand.c
index d4200eb2ad32..684c51e5e60d 100644
--- a/drivers/mtd/nand/raw/mxc_nand.c
+++ b/drivers/mtd/nand/raw/mxc_nand.c
@@ -1681,6 +1681,11 @@  static int mxcnd_attach_chip(struct nand_chip *chip)
 	struct mxc_nand_host *host = nand_get_controller_data(chip);
 	struct device *dev = mtd->dev.parent;
 
+	chip->ecc.bytes = host->devtype_data->eccbytes;
+	host->eccsize = host->devtype_data->eccsize;
+	chip->ecc.size = 512;
+	mtd_set_ooblayout(mtd, host->devtype_data->ooblayout);
+
 	switch (chip->ecc.engine_type) {
 	case NAND_ECC_ENGINE_TYPE_ON_HOST:
 		chip->ecc.read_page = mxc_nand_read_page;
@@ -1836,19 +1841,7 @@  static int mxcnd_probe(struct platform_device *pdev)
 	if (host->devtype_data->axi_offset)
 		host->regs_axi = host->base + host->devtype_data->axi_offset;
 
-	this->ecc.bytes = host->devtype_data->eccbytes;
-	host->eccsize = host->devtype_data->eccsize;
-
 	this->legacy.select_chip = host->devtype_data->select_chip;
-	this->ecc.size = 512;
-	mtd_set_ooblayout(mtd, host->devtype_data->ooblayout);
-
-	if (host->pdata.hw_ecc) {
-		this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
-	} else {
-		this->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
-		this->ecc.algo = NAND_ECC_ALGO_HAMMING;
-	}
 
 	/* NAND bus width determines access functions used by upper layer */
 	if (host->pdata.width == 2)