Patchwork mtd: onenand: bugfix for 2x mode bad block handling

login
register
mail settings
Submitter Roman Tereshonkov
Date Dec. 2, 2010, 1:28 p.m.
Message ID <1291296518-31566-1-git-send-email-roman.tereshonkov@nokia.com>
Download mbox | patch
Permalink /patch/73967/
State Accepted
Commit 01039e4e63a8ea0d66fcfc71d7b99769bbbed9d6
Headers show

Comments

Roman Tereshonkov - Dec. 2, 2010, 1:28 p.m.
This bug becomes visible in 2x mode when chip->writesize
is different from mtd->writesize (= 2 * chip->writesize).
At this case the bad block information is read from
the first and the third physical pages instead of
the first and the second as specification states.

Signed-off-by: Roman Tereshonkov <roman.tereshonkov@nokia.com>
---
 drivers/mtd/onenand/onenand_bbt.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
Kyungmin Park - Dec. 2, 2010, 11:24 p.m.
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>

On Thu, Dec 2, 2010 at 10:28 PM, Roman Tereshonkov
<roman.tereshonkov@nokia.com> wrote:
> This bug becomes visible in 2x mode when chip->writesize
> is different from mtd->writesize (= 2 * chip->writesize).
> At this case the bad block information is read from
> the first and the third physical pages instead of
> the first and the second as specification states.
>
> Signed-off-by: Roman Tereshonkov <roman.tereshonkov@nokia.com>
> ---
>  drivers/mtd/onenand/onenand_bbt.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c
> index 01ab5b3..905209b 100644
> --- a/drivers/mtd/onenand/onenand_bbt.c
> +++ b/drivers/mtd/onenand/onenand_bbt.c
> @@ -91,13 +91,15 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
>                for (j = 0; j < len; j++) {
>                        /* No need to read pages fully,
>                         * just read required OOB bytes */
> -                       ret = onenand_bbt_read_oob(mtd, from + j * mtd->writesize + bd->offs, &ops);
> +                       ret = onenand_bbt_read_oob(mtd,
> +                               from + j * this->writesize + bd->offs, &ops);
>
>                        /* If it is a initial bad block, just ignore it */
>                        if (ret == ONENAND_BBT_READ_FATAL_ERROR)
>                                return -EIO;
>
> -                       if (ret || check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) {
> +                       if (ret || check_short_pattern(&buf[j * scanlen],
> +                                              scanlen, this->writesize, bd)) {
>                                bbm->bbt[i >> 3] |= 0x03 << (i & 0x6);
>                                printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n",
>                                        i >> 1, (unsigned int) from);
> --
> 1.7.0.4
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
Artem Bityutskiy - Dec. 3, 2010, 4:14 p.m.
On Thu, 2010-12-02 at 15:28 +0200, Roman Tereshonkov wrote:
> This bug becomes visible in 2x mode when chip->writesize
> is different from mtd->writesize (= 2 * chip->writesize).
> At this case the bad block information is read from
> the first and the third physical pages instead of
> the first and the second as specification states.
> 
> Signed-off-by: Roman Tereshonkov <roman.tereshonkov@nokia.com>

Pushed to l2-mtd-2.6.git, thanks.

Patch

diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c
index 01ab5b3..905209b 100644
--- a/drivers/mtd/onenand/onenand_bbt.c
+++ b/drivers/mtd/onenand/onenand_bbt.c
@@ -91,13 +91,15 @@  static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr
 		for (j = 0; j < len; j++) {
 			/* No need to read pages fully,
 			 * just read required OOB bytes */
-			ret = onenand_bbt_read_oob(mtd, from + j * mtd->writesize + bd->offs, &ops);
+			ret = onenand_bbt_read_oob(mtd,
+				from + j * this->writesize + bd->offs, &ops);
 
 			/* If it is a initial bad block, just ignore it */
 			if (ret == ONENAND_BBT_READ_FATAL_ERROR)
 				return -EIO;
 
-			if (ret || check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) {
+			if (ret || check_short_pattern(&buf[j * scanlen],
+					       scanlen, this->writesize, bd)) {
 				bbm->bbt[i >> 3] |= 0x03 << (i & 0x6);
 				printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n",
 					i >> 1, (unsigned int) from);