[Yaffs] Yaffs2 bad block defination

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
CC: charles@yaffs.net
Subject: [Yaffs] Yaffs2 bad block defination
>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?




Hi clarles,

Do you have any proposal about this?


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