X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_tagscompat.c;h=ace4b28af49dea04c39df9c1dbc7dfbd36e32684;hp=d7c0fd1144540320fef6ce62418fa885267c9d89;hb=68f0159122cfb94e6912dd99d6398ba72e578a72;hpb=363520161b021b7ac870c269064606e3f16feeeb diff --git a/yaffs_tagscompat.c b/yaffs_tagscompat.c index d7c0fd1..ace4b28 100644 --- a/yaffs_tagscompat.c +++ b/yaffs_tagscompat.c @@ -10,7 +10,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * $Id: yaffs_tagscompat.c,v 1.1 2004-11-03 08:14:07 charles Exp $ + * $Id: yaffs_tagscompat.c,v 1.5 2005-08-10 20:34:40 charles Exp $ */ #include "yaffs_guts.h" @@ -18,11 +18,12 @@ #include "yaffs_ecc.h" static void yaffs_HandleReadDataError(yaffs_Device *dev,int chunkInNAND); +#ifdef NOTYET static void yaffs_CheckWrittenBlock(yaffs_Device *dev,int chunkInNAND); static void yaffs_HandleWriteChunkOk(yaffs_Device *dev,int chunkInNAND,const __u8 *data, const yaffs_Spare *spare); static void yaffs_HandleUpdateChunk(yaffs_Device *dev,int chunkInNAND, const yaffs_Spare *spare); static void yaffs_HandleWriteChunkError(yaffs_Device *dev,int chunkInNAND); - +#endif static const char yaffs_countBitsTable[256] = @@ -305,8 +306,7 @@ static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, return retVal; } - - +#ifdef NOTYET static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,int chunkInNAND) { @@ -331,139 +331,14 @@ static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,int chunkInNAND return YAFFS_OK; } - - -#if 0 -int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,int blockInNAND) -{ - dev->nBlockErasures++; - return dev->eraseBlockInNAND(dev,blockInNAND); -} - -int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) -{ - return dev->initialiseNAND(dev); -} - -#endif - -#if 0 -static int yaffs_WriteNewChunkToNAND(struct yaffs_DeviceStruct *dev, const __u8 *data, yaffs_Spare *spare,int useReserve) -{ - int chunk; - - int writeOk = 1; - int attempts = 0; - - unsigned char rbData[YAFFS_BYTES_PER_CHUNK]; - yaffs_Spare rbSpare; - - do{ - chunk = yaffs_AllocateChunk(dev,useReserve); - - if(chunk >= 0) - { - - // First check this chunk is erased... -#ifndef CONFIG_YAFFS_DISABLE_CHUNK_ERASED_CHECK - writeOk = yaffs_CheckChunkErased(dev,chunk); -#endif - if(!writeOk) - { - T(YAFFS_TRACE_ERROR,(TSTR("**>> yaffs chunk %d was not erased" TENDSTR),chunk)); - } - else - { - writeOk = yaffs_WriteChunkToNAND(dev,chunk,data,spare); - } - attempts++; - if(writeOk) - { - // Readback & verify - // If verify fails, then delete this chunk and try again - // To verify we compare everything except the block and - // page status bytes. - // NB We check a raw read without ECC correction applied - yaffs_ReadChunkFromNAND(dev,chunk,rbData,&rbSpare,0); - -#ifndef CONFIG_YAFFS_DISABLE_WRITE_VERIFY - if(!yaffs_VerifyCompare(data,rbData,spare,&rbSpare)) - { - // Didn't verify - T(YAFFS_TRACE_ERROR,(TSTR("**>> yaffs write verify failed on chunk %d" TENDSTR), chunk)); - - writeOk = 0; - } #endif - } - if(writeOk) - { - // Copy the data into the write buffer. - // NB We do this at the end to prevent duplicates in the case of a write error. - //Todo - yaffs_HandleWriteChunkOk(dev,chunk,data,spare); - } - else - { - yaffs_HandleWriteChunkError(dev,chunk); - } - } - - } while(chunk >= 0 && ! writeOk); - if(attempts > 1) - { - T(YAFFS_TRACE_ERROR,(TSTR("**>> yaffs write required %d attempts" TENDSTR),attempts)); - dev->nRetriedWrites+= (attempts - 1); - } - - return chunk; -} - -#endif /// // Functions for robustisizing // // -#if 0 - -static void yaffs_RetireBlock(yaffs_Device *dev,int blockInNAND) -{ - // Ding the blockStatus in the first two pages of the block. - - yaffs_Spare spare; - - memset(&spare, 0xff,sizeof(yaffs_Spare)); - - spare.blockStatus = 0; - - // TODO change this retirement marking for other NAND types - yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock, NULL , &spare); - yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock + 1, NULL , &spare); - - yaffs_GetBlockInfo(dev,blockInNAND)->blockState = YAFFS_BLOCK_STATE_DEAD; - dev->nRetiredBlocks++; -} - -#endif - -#if 0 -static int yaffs_RewriteBufferedBlock(yaffs_Device *dev) -{ - dev->doingBufferedBlockRewrite = 1; - // - // Remove erased chunks - // Rewrite existing chunks to a new block - // Set current write block to the new block - - dev->doingBufferedBlockRewrite = 0; - - return 1; -} - -#endif static void yaffs_HandleReadDataError(yaffs_Device *dev,int chunkInNAND) { @@ -480,6 +355,7 @@ static void yaffs_HandleReadDataError(yaffs_Device *dev,int chunkInNAND) } +#ifdef NOTYET static void yaffs_CheckWrittenBlock(yaffs_Device *dev,int chunkInNAND) { } @@ -530,44 +406,9 @@ static int yaffs_VerifyCompare(const __u8 *d0, const __u8 * d1, const yaffs_Spar return 1; } +#endif /* NOTYET */ -#if 0 -typedef struct -{ - unsigned validMarker0; - unsigned chunkUsed; // Status of the chunk: used or unused - unsigned objectId; // If 0 then this is not part of an object (unused) - unsigned chunkId; // If 0 then this is a header - unsigned byteCount; // Only valid for data chunks - // The following stuff only has meaning when we read - yaffs_ECCResult eccResult; // Only valid when we read. - unsigned blockBad; // Only valid on reading - - // YAFFS 1 stuff - unsigned chunkDeleted; // The chunk is marked deleted - unsigned serialNumber; // Yaffs1 2-bit serial number - - // YAFFS2 stuff - unsigned sequenceNumber; // The sequence number of this block - - unsigned validMarker1; - -} yaffs_ExtendedTags; - - -typedef struct -{ - unsigned chunkId:20; - unsigned serialNumber:2; - unsigned byteCount:10; - unsigned objectId:18; - unsigned ecc:12; - unsigned unusedStuff:2; -} yaffs_Tags; - - -#endif int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,int chunkInNAND,const __u8 *data, const yaffs_ExtendedTags *eTags) { @@ -587,6 +428,13 @@ int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device *dev,int chunkI tags.byteCount = eTags->byteCount; tags.serialNumber = eTags->serialNumber; +// NCB + if (!dev->useNANDECC && data) + { + yaffs_CalcECC(data,&spare); + } + +// /NCB yaffs_LoadTagsIntoSpare(&spare,&tags); } @@ -602,8 +450,21 @@ int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,int chunk yaffs_Tags tags; yaffs_ECCResult eccResult; +// NCB + static yaffs_Spare spareFF; + static int init; + + if(!init) + { + memset(&spareFF,0xFF,sizeof(spareFF)); + init = 1; + } +// /NCB if(yaffs_ReadChunkFromNAND(dev,chunkInNAND,data,&spare,&eccResult,1)) { +// added NCB - eTags may be NULL + if (eTags) { + int deleted = (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; yaffs_GetTagsFromSpare(dev,&spare,&tags); @@ -616,6 +477,10 @@ int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device *dev,int chunk eTags->eccResult = eccResult; eTags->blockBad = 0; // We're reading it therefore it is not a bad block +// NCB added 18/2/2005 + eTags->chunkUsed = (memcmp(&spareFF,&spare,sizeof(spareFF)) != 0) ? 1:0; + } + return YAFFS_OK; } else @@ -631,7 +496,7 @@ int yaffs_TagsCompatabilityMarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int memset(&spare, 0xff,sizeof(yaffs_Spare)); - spare.blockStatus = 0; + spare.blockStatus = 'Y'; yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock, NULL , &spare); yaffs_WriteChunkToNAND(dev, blockInNAND * dev->nChunksPerBlock + 1, NULL , &spare);