int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev,
        int blockNo, yaffs_BlockState *
        state,
        int *sequenceNumber)
{

    yaffs_Spare spare0, spare1;
    static yaffs_Spare spareFF;
    static int init;
    yaffs_ECCResult dummy;

    if (!init) {
        memset(&spareFF, 0xFF, sizeof(spareFF));
        init = 1;
    }

    *sequenceNumber = 0;

    yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock, NULL,
                            &spare0, &dummy, 1);
    yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock + 1, NULL,
                            &spare1, &dummy, 1);

    if (yaffs_CountBits(spare0.blockStatus & spare1.blockStatus) < 7)
        *state = YAFFS_BLOCK_STATE_DEAD;
    else if (memcmp(&spareFF, &spare0, sizeof(spareFF)) == 0)
        *state = YAFFS_BLOCK_STATE_EMPTY;
    else
        *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;

    return YAFFS_OK;
}
Beispiel #2
0
int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
        int chunkInNAND,
        __u8 * data,
        yaffs_ExtendedTags * eTags)
{

#ifdef DEBUG_YAFFS2
    printk("yaffs_TagsCompatabilityReadChunkWithTagsFromNAND\n");
#endif

    yaffs_Spare spare;
    yaffs_Tags tags;
    yaffs_ECCResult eccResult;

    static yaffs_Spare spareFF;
    static int init;

    if (!init) {
        memset(&spareFF, 0xFF, sizeof(spareFF));
        init = 1;
    }

    if (yaffs_ReadChunkFromNAND
            (dev, chunkInNAND, data, &spare, &eccResult, 1)) {
        /* eTags may be NULL */
        if (eTags) {

            int deleted =
                (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0;

            eTags->chunkDeleted = deleted;
            eTags->eccResult = eccResult;
            eTags->blockBad = 0;	/* We're reading it */
            /* therefore it is not a bad block */
            eTags->chunkUsed =
                (memcmp(&spareFF, &spare, sizeof(spareFF)) !=
                 0) ? 1 : 0;

            if (eTags->chunkUsed) {
                yaffs_GetTagsFromSpare(dev, &spare, &tags);

                eTags->objectId = tags.objectId;
                eTags->chunkId = tags.chunkId;
                eTags->byteCount = tags.byteCount;
                eTags->serialNumber = tags.serialNumber;
            }
        }

        return YAFFS_OK;
    } else {
        return YAFFS_FAIL;
    }
}