GPMI-NAND: Wrong ECC size in driver
Marek Vasut
marek.vasut at gmail.com
Tue Jan 3 19:48:32 EST 2012
Hi,
the gpmi-nand.c driver apparently has misconfigured ecc.size field:
drivers/mtd/nand/gpmi-nand/gpmi-nand.c:
---------- >8 ----------
1493 chip->ecc.mode = NAND_ECC_HW;
1494 chip->ecc.size = 1;
1495 chip->ecc.layout = &gpmi_hw_ecclayout;
---------- 8< ----------
This boils down to misconfigured mtd->subpage_sft in:
drivers/mtd/nand/nand_base.c:
---------- >8 ----------
3434 /* Allow subpage writes up to ecc.steps. Not possible for MLC flash
*/
3435 if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&
3436 !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) {
3437 switch (chip->ecc.steps) {
3438 case 2:
3439 mtd->subpage_sft = 1;
3440 break;
3441 case 4:
3442 case 8:
3443 case 16:
3444 mtd->subpage_sft = 2;
3445 break;
3446 }
3447 }
3448 chip->subpagesize = mtd->writesize >> mtd->subpage_sft;
---------- 8< ----------
The mtd->subpage_sft is accidentally 0 by default. Therefore, the subpage size
is mtd->writesize >> 0. Therefore the subpage size reported to UBI formating
tools is the size of whole page, which works. Now, if I correct the problem by
setting ecc.size properly to 512 bytes, I get into trouble with UBI:
1) UBI formating tools are reported the driver CAN DO subpage writes
2) UBI formating tools are reported the subpage size is 512 bytes
and this happens even though the NAND_NO_SUBPAGE_WRITE option is set by the
driver. This is because:
drivers/mtd/nand/nand_base.c:
---------- >8 ----------
3072 /* Get chip options, preserve non chip based options */
3073 chip->options &= ~NAND_CHIPOPTIONS_MSK;
3074 chip->options |= type->options & NAND_CHIPOPTIONS_MSK;
---------- 8< ----------
which effectively masks that bit away. So, how are we going to fix it?
Cheers!
Marek
More information about the linux-mtd
mailing list