mtd: nand: update nand_default_block_markbad()
This is an update that depends on the previous patches I sent. We can now write to all the appropriate BB marker locations (i.e. pages 1 AND 2, bytes 1 AND 6) with nand_default_block_markbad() if necessary, according to the flags marked in chip->options. Note that I removed the line: ofs += mtd->oobsize; Unless I am wrong, this line was completely unnecessary in the first place. Signed-off-by: Brian Norris <norris@broadcom.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
6ea9ad2418
commit
02ed70bb7b
@ -397,7 +397,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|||||||
{
|
{
|
||||||
struct nand_chip *chip = mtd->priv;
|
struct nand_chip *chip = mtd->priv;
|
||||||
uint8_t buf[2] = { 0, 0 };
|
uint8_t buf[2] = { 0, 0 };
|
||||||
int block, ret;
|
int block, ret, i = 0;
|
||||||
|
|
||||||
if (chip->options & NAND_BBT_SCANLASTPAGE)
|
if (chip->options & NAND_BBT_SCANLASTPAGE)
|
||||||
ofs += mtd->erasesize - mtd->writesize;
|
ofs += mtd->erasesize - mtd->writesize;
|
||||||
@ -411,17 +411,31 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|||||||
if (chip->options & NAND_USE_FLASH_BBT)
|
if (chip->options & NAND_USE_FLASH_BBT)
|
||||||
ret = nand_update_bbt(mtd, ofs);
|
ret = nand_update_bbt(mtd, ofs);
|
||||||
else {
|
else {
|
||||||
/* We write two bytes, so we dont have to mess with 16 bit
|
|
||||||
* access
|
|
||||||
*/
|
|
||||||
nand_get_device(chip, mtd, FL_WRITING);
|
nand_get_device(chip, mtd, FL_WRITING);
|
||||||
ofs += mtd->oobsize;
|
|
||||||
|
/* Write to first two pages and to byte 1 and 6 if necessary.
|
||||||
|
* If we write to more than one location, the first error
|
||||||
|
* encountered quits the procedure. We write two bytes per
|
||||||
|
* location, so we dont have to mess with 16 bit access.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
chip->ops.len = chip->ops.ooblen = 2;
|
chip->ops.len = chip->ops.ooblen = 2;
|
||||||
chip->ops.datbuf = NULL;
|
chip->ops.datbuf = NULL;
|
||||||
chip->ops.oobbuf = buf;
|
chip->ops.oobbuf = buf;
|
||||||
chip->ops.ooboffs = chip->badblockpos & ~0x01;
|
chip->ops.ooboffs = chip->badblockpos & ~0x01;
|
||||||
|
|
||||||
ret = nand_do_write_oob(mtd, ofs, &chip->ops);
|
ret = nand_do_write_oob(mtd, ofs, &chip->ops);
|
||||||
|
|
||||||
|
if (!ret && (chip->options & NAND_BBT_SCANBYTE1AND6)) {
|
||||||
|
chip->ops.ooboffs = NAND_SMALL_BADBLOCK_POS
|
||||||
|
& ~0x01;
|
||||||
|
ret = nand_do_write_oob(mtd, ofs, &chip->ops);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
ofs += mtd->writesize;
|
||||||
|
} while (!ret && (chip->options & NAND_BBT_SCAN2NDPAGE) &&
|
||||||
|
i < 2);
|
||||||
|
|
||||||
nand_release_device(mtd);
|
nand_release_device(mtd);
|
||||||
}
|
}
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
Loading…
Reference in New Issue
Block a user