From: Marek Vasut <marex@denx.de>
To: Huang Shijie <shijie8@gmail.com>
Cc: fabio.estevam@freescale.com, dedekind1@gmail.com,
stable@vger.kernel.org, linux-mtd@lists.infradead.org,
shawn.guo@linaro.org, dwmw2@infradead.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v4] mtd: gpmi: add NAND write verify support
Date: Sat, 11 Aug 2012 16:10:44 +0200 [thread overview]
Message-ID: <201208111610.45107.marex@denx.de> (raw)
In-Reply-To: <1344737275-18342-1-git-send-email-shijie8@gmail.com>
Dear Huang Shijie,
> Add NAND write verify support in gpmi-nand driver.
>
> This patch fixes a kernel crash when we select
> CONFIG_MTD_NAND_VERIFY_WRITE=y, and do some write tests:
>
> root@freescale /$ dd if=/dev/zero of=/dev/mtd0 bs=128k count=1
> [ 41.070000] Unable to handle kernel NULL pointer dereference at virtual
> addr0 [ 41.080000] pgd = c77ac000
> [ 41.080000] [00000000] *pgd=4773c831, *pte=00000000, *ppte=00000000
> [ 41.090000] Internal error: Oops: 17 [#1] ARM
> [ 41.090000] Modules linked in:
> [ 41.090000] CPU: 0 Not tainted
> (3.6.0-rc1-next-20120809-00002-ga25d017-d) [ 41.090000] PC is at
> nand_verify_buf+0x18/0x5c
> [ 41.090000] LR is at nand_write_page+0xc0/0x140
> [ 41.090000] pc : [<c023e7d4>] lr : [<c023fcfc>] psr: 20000013
> [ 41.090000] sp : c7779de4 ip : 00000000 fp : c6e60000
> [ 41.090000] r10: 00000000 r9 : 00020000 r8 : 00000000
> [ 41.090000] r7 : 00000000 r6 : c6e60000 r5 : c762cb10 r4 : 00000000
> [ 41.090000] r3 : c762c8a8 r2 : 00000800 r1 : c6e60000 r0 : 00000000
> [ 41.090000] Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment
> user [ 41.090000] Control: 0005317f Table: 477ac000 DAC: 00000015
> [ 41.090000] Process dd (pid: 427, stack limit = 0xc7778270)
> [ 41.090000] Stack: (0xc7779de4 to 0xc777a000)
> ...
>
> The crash log is fetched from Fabio's patch. thanks to Fabio's hard
work.
>
> Cc: <stable@vger.kernel.org>
> Reported-by: Fabio Estevam <fabio.estevam@freescale.com>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> v3 --> v4:
> [1] add credit to Fabio.
>
> v2 --> v3:
> [1] free the verify_buf when we exit.
>
> v1 --> v2:
> [1] use the mtd->writesize to allocate the verify buffer.
> [2] add new field `verify_buf` in gpmi_nand_data{}
>
> tested this patch on imx6q-arm2 board.
> ---
> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 25 +++++++++++++++++++++++++
> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 1 +
> 2 files changed, 26 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 8c0d2f0..e1e4c51 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> @@ -1512,12 +1512,34 @@ static int gpmi_pre_bbt_scan(struct gpmi_nand_data
> *this) return nand_boot_init(this);
> }
>
> +static int gpmi_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int
> len) +{
> + struct nand_chip *chip = mtd->priv;
> + struct gpmi_nand_data *this = chip->priv;
> + int ret;
> +
> + ret = chip->ecc.read_page(mtd, chip, this->verify_buf, 0, 0);
> + if (ret)
> + return -EFAULT;
> + if (memcmp(buf, this->verify_buf, len))
> + return -EFAULT;
> + return 0;
> +}
> +
> static int gpmi_scan_bbt(struct mtd_info *mtd)
> {
> struct nand_chip *chip = mtd->priv;
> struct gpmi_nand_data *this = chip->priv;
> int ret;
>
> + /*
> + * We have gotten the right page size now, use it to allocate
> + * the proper verify buffer.
> + */
> + this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
devm_
> + if (!this->verify_buf)
> + return -ENOMEM;
> +
> /* Prepare for the BBT scan. */
> ret = gpmi_pre_bbt_scan(this);
> if (ret)
> @@ -1531,6 +1553,8 @@ void gpmi_nfc_exit(struct gpmi_nand_data *this)
> {
> nand_release(&this->mtd);
> gpmi_free_dma_buffer(this);
> + kfree(this->verify_buf);
> + this->verify_buf = NULL;
Then you won't have to care for this ... I told you at least once before.
> }
>
> static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this)
> @@ -1556,6 +1580,7 @@ static int __devinit gpmi_nfc_init(struct
> gpmi_nand_data *this) chip->read_byte = gpmi_read_byte;
> chip->read_buf = gpmi_read_buf;
> chip->write_buf = gpmi_write_buf;
> + chip->verify_buf = gpmi_verify_buf;
> chip->ecc.read_page = gpmi_ecc_read_page;
> chip->ecc.write_page = gpmi_ecc_write_page;
> chip->ecc.read_oob = gpmi_ecc_read_oob;
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h index 1547a60..8ddf115 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> @@ -144,6 +144,7 @@ struct gpmi_nand_data {
> /* MTD / NAND */
> struct nand_chip nand;
> struct mtd_info mtd;
> + uint8_t *verify_buf;
>
> /* General-use Variables */
> int current_chip;
WARNING: multiple messages have this Message-ID (diff)
From: marex@denx.de (Marek Vasut)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4] mtd: gpmi: add NAND write verify support
Date: Sat, 11 Aug 2012 16:10:44 +0200 [thread overview]
Message-ID: <201208111610.45107.marex@denx.de> (raw)
In-Reply-To: <1344737275-18342-1-git-send-email-shijie8@gmail.com>
Dear Huang Shijie,
> Add NAND write verify support in gpmi-nand driver.
>
> This patch fixes a kernel crash when we select
> CONFIG_MTD_NAND_VERIFY_WRITE=y, and do some write tests:
>
> root at freescale /$ dd if=/dev/zero of=/dev/mtd0 bs=128k count=1
> [ 41.070000] Unable to handle kernel NULL pointer dereference at virtual
> addr0 [ 41.080000] pgd = c77ac000
> [ 41.080000] [00000000] *pgd=4773c831, *pte=00000000, *ppte=00000000
> [ 41.090000] Internal error: Oops: 17 [#1] ARM
> [ 41.090000] Modules linked in:
> [ 41.090000] CPU: 0 Not tainted
> (3.6.0-rc1-next-20120809-00002-ga25d017-d) [ 41.090000] PC is at
> nand_verify_buf+0x18/0x5c
> [ 41.090000] LR is at nand_write_page+0xc0/0x140
> [ 41.090000] pc : [<c023e7d4>] lr : [<c023fcfc>] psr: 20000013
> [ 41.090000] sp : c7779de4 ip : 00000000 fp : c6e60000
> [ 41.090000] r10: 00000000 r9 : 00020000 r8 : 00000000
> [ 41.090000] r7 : 00000000 r6 : c6e60000 r5 : c762cb10 r4 : 00000000
> [ 41.090000] r3 : c762c8a8 r2 : 00000800 r1 : c6e60000 r0 : 00000000
> [ 41.090000] Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment
> user [ 41.090000] Control: 0005317f Table: 477ac000 DAC: 00000015
> [ 41.090000] Process dd (pid: 427, stack limit = 0xc7778270)
> [ 41.090000] Stack: (0xc7779de4 to 0xc777a000)
> ...
>
> The crash log is fetched from Fabio's patch. thanks to Fabio's hard
work.
>
> Cc: <stable@vger.kernel.org>
> Reported-by: Fabio Estevam <fabio.estevam@freescale.com>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> v3 --> v4:
> [1] add credit to Fabio.
>
> v2 --> v3:
> [1] free the verify_buf when we exit.
>
> v1 --> v2:
> [1] use the mtd->writesize to allocate the verify buffer.
> [2] add new field `verify_buf` in gpmi_nand_data{}
>
> tested this patch on imx6q-arm2 board.
> ---
> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 25 +++++++++++++++++++++++++
> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 1 +
> 2 files changed, 26 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 8c0d2f0..e1e4c51 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
> @@ -1512,12 +1512,34 @@ static int gpmi_pre_bbt_scan(struct gpmi_nand_data
> *this) return nand_boot_init(this);
> }
>
> +static int gpmi_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int
> len) +{
> + struct nand_chip *chip = mtd->priv;
> + struct gpmi_nand_data *this = chip->priv;
> + int ret;
> +
> + ret = chip->ecc.read_page(mtd, chip, this->verify_buf, 0, 0);
> + if (ret)
> + return -EFAULT;
> + if (memcmp(buf, this->verify_buf, len))
> + return -EFAULT;
> + return 0;
> +}
> +
> static int gpmi_scan_bbt(struct mtd_info *mtd)
> {
> struct nand_chip *chip = mtd->priv;
> struct gpmi_nand_data *this = chip->priv;
> int ret;
>
> + /*
> + * We have gotten the right page size now, use it to allocate
> + * the proper verify buffer.
> + */
> + this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
devm_
> + if (!this->verify_buf)
> + return -ENOMEM;
> +
> /* Prepare for the BBT scan. */
> ret = gpmi_pre_bbt_scan(this);
> if (ret)
> @@ -1531,6 +1553,8 @@ void gpmi_nfc_exit(struct gpmi_nand_data *this)
> {
> nand_release(&this->mtd);
> gpmi_free_dma_buffer(this);
> + kfree(this->verify_buf);
> + this->verify_buf = NULL;
Then you won't have to care for this ... I told you at least once before.
> }
>
> static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this)
> @@ -1556,6 +1580,7 @@ static int __devinit gpmi_nfc_init(struct
> gpmi_nand_data *this) chip->read_byte = gpmi_read_byte;
> chip->read_buf = gpmi_read_buf;
> chip->write_buf = gpmi_write_buf;
> + chip->verify_buf = gpmi_verify_buf;
> chip->ecc.read_page = gpmi_ecc_read_page;
> chip->ecc.write_page = gpmi_ecc_write_page;
> chip->ecc.read_oob = gpmi_ecc_read_oob;
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h index 1547a60..8ddf115 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
> @@ -144,6 +144,7 @@ struct gpmi_nand_data {
> /* MTD / NAND */
> struct nand_chip nand;
> struct mtd_info mtd;
> + uint8_t *verify_buf;
>
> /* General-use Variables */
> int current_chip;
next prev parent reply other threads:[~2012-08-11 14:10 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-12 2:07 [PATCH v4] mtd: gpmi: add NAND write verify support Huang Shijie
2012-08-12 2:07 ` Huang Shijie
2012-08-11 14:10 ` Marek Vasut [this message]
2012-08-11 14:10 ` Marek Vasut
2012-08-11 15:15 ` Huang Shijie
2012-08-11 15:15 ` Huang Shijie
2012-08-12 19:14 ` Marek Vasut
2012-08-12 19:14 ` Marek Vasut
2012-08-13 2:21 ` Huang Shijie
2012-08-13 2:21 ` Huang Shijie
2012-08-13 2:35 ` Huang Shijie
2012-08-13 2:35 ` Huang Shijie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201208111610.45107.marex@denx.de \
--to=marex@denx.de \
--cc=dedekind1@gmail.com \
--cc=dwmw2@infradead.org \
--cc=fabio.estevam@freescale.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-mtd@lists.infradead.org \
--cc=shawn.guo@linaro.org \
--cc=shijie8@gmail.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.