int nandmtd2_query_block(struct yaffs_dev *dev, int block_no, enum yaffs_block_state *state, u32 * seq_number) { struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int retval; yaffs_trace(YAFFS_TRACE_MTD, "nandmtd2_query_block %d", block_no); retval = mtd_block_isbad(mtd, block_no * dev->param.chunks_per_block * dev->param.total_bytes_per_chunk); if (retval) { yaffs_trace(YAFFS_TRACE_MTD, "block is bad"); *state = YAFFS_BLOCK_STATE_DEAD; *seq_number = 0; } else { struct yaffs_ext_tags t; nandmtd2_read_chunk_tags(dev, block_no * dev->param.chunks_per_block, NULL, &t); if (t.chunk_used) { *seq_number = t.seq_number; *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; } else { *seq_number = 0; *state = YAFFS_BLOCK_STATE_EMPTY; } /*if ecc unfixed, set the block empty. This block will be erased when allocate.*/ if(t.ecc_result == YAFFS_ECC_RESULT_UNFIXED) { printk("yaffsdebug : unfixed ecc error when scan block, seqnum:0x%x\n",t.seq_number); *seq_number = 0; *state = YAFFS_BLOCK_STATE_EMPTY; } } yaffs_trace(YAFFS_TRACE_MTD, "block is bad seq %d state %d", *seq_number, *state); if (retval == 0) return YAFFS_OK; else return YAFFS_FAIL; }
int nandmtd2_query_block(struct yaffs_dev_s *dev, int block_no, yaffs_block_state_t *state, __u32 *seq_number) { struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int retval; T(YAFFS_TRACE_MTD, (TSTR("nandmtd2_query_block %d" TENDSTR), block_no)); retval = mtd->block_isbad(mtd, block_no * dev->param.chunks_per_block * dev->param.total_bytes_per_chunk); if (retval) { T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR))); *state = YAFFS_BLOCK_STATE_DEAD; *seq_number = 0; } else { yaffs_ext_tags t; nandmtd2_read_chunk_tags(dev, block_no * dev->param.chunks_per_block, NULL, &t); if (t.chunk_used) { *seq_number = t.seq_number; *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; } else { *seq_number = 0; *state = YAFFS_BLOCK_STATE_EMPTY; } } T(YAFFS_TRACE_MTD, (TSTR("block is bad seq %d state %d" TENDSTR), *seq_number, *state)); if (retval == 0) return YAFFS_OK; else return YAFFS_FAIL; }
int nandmtd2_query_block(struct yaffs_dev *dev, int block_no, enum yaffs_block_state *state, u32 *seq_number) { struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int retval; yaffs_trace(YAFFS_TRACE_MTD, "nandmtd2_query_block %d", block_no); retval = mtd->block_isbad(mtd, ((loff_t)block_no) * dev->param.chunks_per_block * dev->param.total_bytes_per_chunk); if (retval) { yaffs_trace(YAFFS_TRACE_MTD, "block is bad"); *state = YAFFS_BLOCK_STATE_DEAD; *seq_number = 0; } else { struct yaffs_ext_tags t; nandmtd2_read_chunk_tags(dev, block_no * dev->param.chunks_per_block, NULL, &t); if (t.chunk_used) { *seq_number = t.seq_number; *state = YAFFS_BLOCK_STATE_NEEDS_SCAN; } else { *seq_number = 0; *state = YAFFS_BLOCK_STATE_EMPTY; } } yaffs_trace(YAFFS_TRACE_MTD, "block is bad seq %d state %d", *seq_number, *state); if (retval == 0) return YAFFS_OK; else return YAFFS_FAIL; }