GPMI-NAND: Wrong ECC size in driver
Marek Vasut
marek.vasut at gmail.com
Wed Jan 4 16:33:15 EST 2012
> Hi Marek:
> > 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
>
> The gpmi driver does not support the subpage read/write.
That's what I said above.
> I will be happy if the driver works only by setting the
> NAND_NO_SUBPAGE_WRITE, without setting the ecc.size.
So you intentionally set the ecc.size to 1 to work around the issue?
>
> Best Regards
> Huang Shijie
>
> > 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