/* Query for the current state of a specific block. * * Examine the tags of the first chunk of the block and return the state: * - YAFFS_BLOCK_STATE_DEAD, the block is marked bad * - YAFFS_BLOCK_STATE_NEEDS_SCANNING, the block is in use * - YAFFS_BLOCK_STATE_EMPTY, the block is clean * * Always returns YAFFS_OK. */ int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState * pState, int *pSequenceNumber) { struct mtd_info * mtd = dev->genericDevice; int chunkNo = blockNo * dev->nChunksPerBlock; loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk; yaffs_ExtendedTags etags; int state = YAFFS_BLOCK_STATE_DEAD; int seqnum = 0; int retval; /* We don't yet have a good place to test for MTD config prerequists. * Do it here as we are called during the initial scan. */ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) { return YAFFS_FAIL; } retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags); etags.blockBad = (mtd->block_isbad)(mtd, addr); if (etags.blockBad) { yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "block %d is marked bad\n", blockNo); state = YAFFS_BLOCK_STATE_DEAD; } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) { /* bad tags, need to look more closely */ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; } else if (etags.chunkUsed) { state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; seqnum = etags.sequenceNumber; } else { state = YAFFS_BLOCK_STATE_EMPTY; } *pState = state; *pSequenceNumber = seqnum; /* query always succeeds */ return YAFFS_OK; }
/* Query for the current state of a specific block. * * Examine the tags of the first chunk of the block and return the state: * - YAFFS_BLOCK_STATE_DEAD, the block is marked bad * - YAFFS_BLOCK_STATE_NEEDS_SCANNING, the block is in use * - YAFFS_BLOCK_STATE_EMPTY, the block is clean * * Always returns YAFFS_OK. */ int nandmtd1_QueryNANDBlock(struct yaffs_dev_s *dev, int block_no, yaffs_block_state_t *pState, __u32 *pSequenceNumber) { struct mtd_info *mtd = yaffs_dev_to_mtd(dev); int chunkNo = block_no * dev->param.chunks_per_block; loff_t addr = (loff_t)chunkNo * dev->data_bytes_per_chunk; yaffs_ext_tags etags; int state = YAFFS_BLOCK_STATE_DEAD; int seqnum = 0; int retval; /* We don't yet have a good place to test for MTD config prerequists. * Do it here as we are called during the initial scan. */ if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) return YAFFS_FAIL; retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags); etags.block_bad = (mtd->block_isbad)(mtd, addr); if (etags.block_bad) { T(YAFFS_TRACE_BAD_BLOCKS, (TSTR("block %d is marked bad"TENDSTR), block_no)); state = YAFFS_BLOCK_STATE_DEAD; } else if (etags.ecc_result != YAFFS_ECC_RESULT_NO_ERROR) { /* bad tags, need to look more closely */ state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; } else if (etags.chunk_used) { state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; seqnum = etags.seq_number; } else { state = YAFFS_BLOCK_STATE_EMPTY; } *pState = state; *pSequenceNumber = seqnum; /* query always succeeds */ return YAFFS_OK; }
int nandmtd1_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState *pState, __u32 *pSequenceNumber) { struct mtd_info *mtd = dev->genericDevice; int chunkNo = blockNo * dev->nChunksPerBlock; loff_t addr = (loff_t)chunkNo * dev->nDataBytesPerChunk; yaffs_ExtendedTags etags; int state = YAFFS_BLOCK_STATE_DEAD; int seqnum = 0; int retval; if (nandmtd1_TestPrerequists(mtd) != YAFFS_OK) return YAFFS_FAIL; retval = nandmtd1_ReadChunkWithTagsFromNAND(dev, chunkNo, NULL, &etags); etags.blockBad = (mtd->block_isbad)(mtd, addr); if (etags.blockBad) { yaffs_trace(YAFFS_TRACE_BAD_BLOCKS, "block %d is marked bad\n", blockNo); state = YAFFS_BLOCK_STATE_DEAD; } else if (etags.eccResult != YAFFS_ECC_RESULT_NO_ERROR) { state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; } else if (etags.chunkUsed) { state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; seqnum = etags.sequenceNumber; } else { state = YAFFS_BLOCK_STATE_EMPTY; } *pState = state; *pSequenceNumber = seqnum; return YAFFS_OK; }