Add markbad function
authorKyungmin Park <kmpark@infradead.org>
Thu, 13 Nov 2008 06:14:33 +0000 (15:14 +0900)
committerScott Wood <scottwood@freescale.com>
Fri, 23 Jan 2009 16:32:47 +0000 (10:32 -0600)
Add missing markbad function
If not, it's hang when it entered the mtd->mark_bad().

Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/mtd/onenand/onenand_base.c

index f62b1aa25a64d3d04311d342a021d2f40e90baea..dcc969ff73090f04ca8e1c176b5da6a38c6e6f4a 100644 (file)
@@ -1583,6 +1583,37 @@ int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
        return ret;
 }
 
+/**
+ * onenand_default_block_markbad - [DEFAULT] mark a block bad
+ * @param mtd           MTD device structure
+ * @param ofs           offset from device start
+ *
+ * This is the default implementation, which can be overridden by
+ * a hardware specific driver.
+ */
+static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
+{
+       struct onenand_chip *this = mtd->priv;
+       struct bbm_info *bbm = this->bbm;
+       u_char buf[2] = {0, 0};
+       struct mtd_oob_ops ops = {
+               .mode = MTD_OOB_PLACE,
+               .ooblen = 2,
+               .oobbuf = buf,
+               .ooboffs = 0,
+       };
+       int block;
+
+       /* Get block number */
+       block = ((int) ofs) >> bbm->bbt_erase_shift;
+       if (bbm->bbt)
+               bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
+
+       /* We write two bytes, so we dont have to mess with 16 bit access */
+       ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
+       return onenand_write_oob_nolock(mtd, ofs, &ops);
+}
+
 /**
  * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
  * @param mtd          MTD device structure
@@ -2048,6 +2079,8 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
        if (!this->write_bufferram)
                this->write_bufferram = onenand_write_bufferram;
 
+       if (!this->block_markbad)
+               this->block_markbad = onenand_default_block_markbad;
        if (!this->scan_bbt)
                this->scan_bbt = onenand_default_bbt;