[Yaffs] How to trigger garbage collection on read?

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Peter Barada
Date:  
To: yaffs
Subject: [Yaffs] How to trigger garbage collection on read?
I need to modify YAFFS to trigger garbage collection on a block that has
too many page reads between erases.

This is due to the characterisation of the Micron NAND
(MTMT29C4G48MAPLCJI6) I'm using where it can only have ~20K reads
between erasures to maintain UBER below 10E-14. The NAND itself has an
internal 4-bit ECC engine, but I can't extract any useful information
from the ECC due to the lack of bit error counts (i.e. the chip can only
tell me that a read required some level of correction but not the amount
of correction, and worse the rate of corrections indicated by the chip
is too high to employ effective strike counting).

So I need to track the page reads in a block and if they reach a limit
then cause the block to be garbage collected (i.e. copy out all the
useful data and erase the block).

I thought that just calling yaffs_handle_chunk_error() would suffice in
this case (where the strike count limit that triggers block retirement
is effectively disabled), but it apparently doesn't refresh the block.
I know this because I've added low-level code in the MTD layer that
tracks the page read counts between erasures on a per block bases, and
when I continually read a file from YAFFS I see a block read counts
increasing way past the 20K limit trigger w/o any intervening block erasure.

How can I trigger garbage collection on a NAND read - I understand that
the trigger needs to be selective/deferred to prevent recursion (i.e.
don't want to deal with read count limits while garbage collecting a
block that was triggered due to a read count limit).

Any help is appreciated!

--
Peter Barada