diff mbox

[U-Boot] mtd: OneNAND: Fix onenand_block_markbad

Message ID 20170620151745.76jj6ht5bire5wad@lenoch
State Accepted
Commit 4e118ce6d8e6f8b2d61f632ec0898886d15fa71c
Delegated to: Tom Rini
Headers show

Commit Message

Ladislav Michl June 20, 2017, 3:17 p.m. UTC
commit dfe64e2c89731a3f9950d7acd8681b68df2bae03
    Author: Sergey Lapin <slapin@ossfans.org>
    Date:   Mon Jan 14 03:46:50 2013 +0000

        mtd: resync with Linux-3.7.1

modified onenand_block_markbad to call mtd_block_markbad,
but as _block_markbad function pointer used by mtd_block_markbad
to do actual job is by default pointing back to
onenand_block_markbad there is no way this function ever
finishes its job.
Fix it by changing function body according current (4.12-rc6)
linux implementation.
Tested on IGEPv2 board with Muxed OneNAND(DDP) 512MB containing
several unerasable blocks this function marked bad.

Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
---
 drivers/mtd/onenand/onenand_base.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Tom Rini June 24, 2017, 10:17 p.m. UTC | #1
On Tue, Jun 20, 2017 at 05:17:45PM +0200, Ladislav Michl wrote:

> commit dfe64e2c89731a3f9950d7acd8681b68df2bae03
>     Author: Sergey Lapin <slapin@ossfans.org>
>     Date:   Mon Jan 14 03:46:50 2013 +0000
> 
>         mtd: resync with Linux-3.7.1
> 
> modified onenand_block_markbad to call mtd_block_markbad,
> but as _block_markbad function pointer used by mtd_block_markbad
> to do actual job is by default pointing back to
> onenand_block_markbad there is no way this function ever
> finishes its job.
> Fix it by changing function body according current (4.12-rc6)
> linux implementation.
> Tested on IGEPv2 board with Muxed OneNAND(DDP) 512MB containing
> several unerasable blocks this function marked bad.
> 
> Signed-off-by: Ladislav Michl <ladis@linux-mips.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index 2e3d0e5c9a..8282f683a5 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -1919,6 +1919,7 @@  static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
  */
 int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 {
+	struct onenand_chip *this = mtd->priv;
 	int ret;
 
 	ret = onenand_block_isbad(mtd, ofs);
@@ -1929,7 +1930,10 @@  int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
 		return ret;
 	}
 
-	ret = mtd_block_markbad(mtd, ofs);
+	onenand_get_device(mtd, FL_WRITING);
+	ret = this->block_markbad(mtd, ofs);
+	onenand_release_device(mtd);
+
 	return ret;
 }