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