Re: [PATCH] mtd: spinand: Wait after erase in spinand_markbad

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Den mån 4 mars 2019 kl 12:23 skrev Miquel Raynal <miquel.raynal@xxxxxxxxxxx>:
>
> Hi Emil,
>
> Emil Lenngren <emil.lenngren@xxxxxxxxx> wrote on Mon, 18 Feb 2019
> 12:27:25 +0100:
>
> > Hi,
> >
> > Den sön 6 jan. 2019 kl 09:11 skrev Boris Brezillon <bbrezillon@xxxxxxxxxx>:
> > >
> > > On Sat, 5 Jan 2019 22:01:44 -0800
> > > Emil Lenngren <emil.lenngren@xxxxxxxxx> wrote:
> > >
> > > > Hi,
> > > >
> > > > Den lör 5 jan. 2019 kl 05:59 skrev Boris Brezillon <bbrezillon@xxxxxxxxxx>:
> > > > >
> > > > > On Fri, 21 Dec 2018 12:58:14 +0100
> > > > > Emil Lenngren <emil.lenngren@xxxxxxxxx> wrote:
> > > > >
> > > > > > SPI NAND flashes don't accept new commands while an erase is ongoing.
> > > > > > Make sure to wait until the device is ready before writing the marker.
> > > > > >
> > > > > > Just as with the erase op, no error check is performed since we want
> > > > > > to continue writing the marker even if the erase fails.
> > > > > >
> > > > > > Signed-off-by: Emil Lenngren <emil.lenngren@xxxxxxxxx>
> > > > > > ---
> > > > > >  drivers/mtd/nand/spi/core.c | 2 ++
> > > > > >  1 file changed, 2 insertions(+)
> > > > > >
> > > > > > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > > > > > index 479c2f2cf1..c2724d34e6 100644
> > > > > > --- a/drivers/mtd/nand/spi/core.c
> > > > > > +++ b/drivers/mtd/nand/spi/core.c
> > > > > > @@ -685,6 +685,8 @@ static int spinand_markbad(struct nand_device *nand, const struct nand_pos *pos)
> > > > > >
> > > > > >       spinand_erase_op(spinand, pos);
> > > > > >
> > > > > > +     spinand_wait(spinand, NULL);
> > > > > > +
> > > > >
> > > > > After thinking a bit more about it, I think we should simply write the
> > > > > BBM and skip the erase operation. Marking a block bad is just about
> > > > > writing 0 to the first 2 bytes of the OOB area, and we don't need the
> > > > > block to be erased to do that.
> > > > >
> > > >
> > > > I compared with the raw and implementation in
> > > > nand_block_markbad_lowlevel, it also erases first, ignoring a
> > > > potential error.
> > >
> > > Yes, and I think this implementation was inspired by the rawnand one,
> > > but I'm not sure the rawnand implem is correct.
> > >
> > > >
> > > > On the other hand, a common spi flash chip MX35LF1GE4AB states in the
> > > > datasheet that it's not recommended to erase a bad block, but no
> > > > reason why.
> > >
> > > Because the erase might succeed and reset the BBM to 0xff, thus marking
> > > the block good even if it's unreliable.
> > >
> > > > At the same time, it's generally disallowed to write the
> > > > same page twice...
> > >
> > > That's only if you care about the data you write to the page. Marking a
> > > block bad is just about setting the BBM to 0x0, which should always work
> > > even if the page you're writing to has already been written, simply
> > > because a 1 -> 0 cell transition does not require an erase (only a 0 ->
> > > 1 transition does).
> >
> > Should the BBM be written with or without ECC? Now it uses whatever
> > mode was used in the last operation. Also for reading, I see the
> > "spinand_isbad" function sets .mode to MTD_OPS_RAW but that field
> > doesn't seem to be inspected, again using the same ECC mode as in the
> > last operation.
> > Isn't it best to use the non-ECC mode for both reading and writing the
> > BBM? If we would use ECC mode and overwrite the page when writing the
> > BBM marker, I guess the controller needs to store a second error
> > correction code (overwriting the previous one), which will probably
> > lead to ECC failure if later read in ECC-mode (and who knows if it
> > will "correct" the zero bits to ones...).
> >
>
> I suppose writing the BBM without correction is what we want.

I was also thinking, is it a good or bad idea to move the BBM
writing/reading to NAND core? I mean, as I understand, both parallel
nand and spi nand use the same logic to handle the BBM (at the
beginning of the OOB area). Or is there some specific treatment that
must be done individually for spi and parallel flash chips?

After reading the BBM info of some datasheets, it appears the variance
lies between different manufacturers, not the technology used
(parallel or spi). For example, Toshiba fills a whole bad block with
00h and instructs to read any byte in any page and check if it
contains 00h. Macronix on the other hand instructs to check the first
byte of the OOB area in the first and second page to see they contain
00h. SmartMedia instructs to check the 6th byte of the OOB area of the
first page and see if it contains at least two zero bits.

/Emil

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/




[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux