mtd: nand: differentiate 1- vs. 2-byte writes when marking bad blocks
authorBrian Norris <computersforpeace@gmail.com>
Sat, 14 Jan 2012 02:11:49 +0000 (18:11 -0800)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 26 Mar 2012 23:12:34 +0000 (00:12 +0100)
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: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/nand_base.c

index 7855fd2d5c60178acf4156ec10b400e7be94294f..c6603d4b25c8536efa9c8a44fed7e3aeb25393df 100644 (file)
@@ -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
                 * 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.
+                * procedure.
                 */
-               ops.len = ops.ooblen = 2;
                ops.datbuf = NULL;
                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;
                do {
                        ret = nand_do_write_oob(mtd, ofs, &ops);