Commit 85443319 authored by Brian Norris's avatar Brian Norris Committed by David Woodhouse

mtd: nand: differentiate 1- vs. 2-byte writes when marking bad blocks

It seems that we have developed a bad-block-marking "feature" out of
pure laziness:

  "We write two bytes per location, so we dont have to mess with 16 bit
  access."

It's relatively simple to write a 1 byte at a time on x8 devices and 2
bytes at a time on x16 devices, so let's do it.
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent cdbec050
...@@ -430,13 +430,17 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) ...@@ -430,13 +430,17 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
/* /*
* Write to first two pages if necessary. If we write to more * Write to first two pages if necessary. If we write to more
* than one location, the first error encountered quits the * than one location, the first error encountered quits the
* procedure. We write two bytes per location, so we dont have * procedure.
* to mess with 16 bit access.
*/ */
ops.len = ops.ooblen = 2;
ops.datbuf = NULL; ops.datbuf = NULL;
ops.oobbuf = buf; ops.oobbuf = buf;
ops.ooboffs = chip->badblockpos & ~0x01; ops.ooboffs = chip->badblockpos;
if (chip->options & NAND_BUSWIDTH_16) {
ops.ooboffs &= ~0x01;
ops.len = ops.ooblen = 2;
} else {
ops.len = ops.ooblen = 1;
}
ops.mode = MTD_OPS_PLACE_OOB; ops.mode = MTD_OPS_PLACE_OOB;
do { do {
ret = nand_do_write_oob(mtd, ofs, &ops); ret = nand_do_write_oob(mtd, ofs, &ops);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment