[Yaffs] bad block management

Top Page
Attachments:
Message as email
+ (text/plain)
+ (text/html)
Delete this message
Reply to this message
Author: bpqw
Date:  
To: yaffs@lists.aleph1.co.uk
Subject: [Yaffs] bad block management
Hi

I have review the yaffs2 source code and have a doubt. See the follow



In Yaffs2 the read interface is yaffs_rd_chunk_tags_nand int yaffs_rd_chunk_tags_nand(struct yaffs_dev *dev, int nand_chunk,

                       u8 *buffer, struct yaffs_ext_tags *tags) {


      .........


      result = dev->tagger.read_chunk_tags_fn(dev, flash_chunk, buffer, tags);


      if (tags && tags->ecc_result > YAFFS_ECC_RESULT_NO_ERROR) {




            struct yaffs_block_info *bi;


            bi = yaffs_get_block_info(dev,


                                nand_chunk /


                                dev->param.chunks_per_block);


            yaffs_handle_chunk_error(dev, bi);


      }


      return result;


}



The yaffs_rd_chunk_tags_nand will call the mtd interface mtd_read_oob



int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) {

      int ret_code;


      ops->retlen = ops->oobretlen = 0;


      if (!mtd->_read_oob)


            return -EOPNOTSUPP;


      /*


      * In cases where ops->datbuf != NULL, mtd->_read_oob() has semantics


      * similar to mtd->_read(), returning a non-negative integer


      * representing max bitflips. In other cases, mtd->_read_oob() may


      * return -EUCLEAN. In all cases, perform similar logic to mtd_read().


      */


      ret_code = mtd->_read_oob(mtd, from, ops);


      if (unlikely(ret_code < 0))


            return ret_code;


      if (mtd->ecc_strength == 0)


            return 0;   /* device lacks ecc */


      return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0; }




So if the bitflips num over mtd->bitflip_threshold the mtd_read_oob will return -EUCLEAN and tags->ecc_result > YAFFS_ECC_RESULT_NO_ERROR.

Then we will call yaffs_handle_chunk_error.

void yaffs_handle_chunk_error(struct yaffs_dev *dev,

                        struct yaffs_block_info *bi)


{

      if (!bi->gc_prioritise) {


            bi->gc_prioritise = 1;


            dev->has_pending_prioritised_gc = 1;


            bi->chunk_error_strikes++;




            if (bi->chunk_error_strikes > 3) {


                  bi->needs_retiring = 1; /* Too many stikes, so retire */


                  yaffs_trace(YAFFS_TRACE_ALWAYS,


                        "yaffs: Block struck out");




            }


      }


}



>From the code we can see if bitflips num over mtd->bitflip_threshold we will mark this block as gc if bitflips num over mtd->bitflip_threshold over three times we will mark this block as bad block.




We define bad block is if erase or program failed we can mark this block as bad block.

So is it reasonable just according to the bitflips over mtd->bitflip_threshold over three times to judge the block as bad block?

What's your opinion about my doubts?


Br
White Ding
____________________________
EBU APAC Application Engineering
Tel:86-21-38997078<Tel:86-21-38997384>
Mobile: 86-13761729112
Address: No 601 Fasai Rd, Waigaoqiao Free Trade Zone Pudong, Shanghai, China