*** empty log message ***
[yaffs2.git] / yaffs_tagscompat.c
index d7c0fd1144540320fef6ce62418fa885267c9d89..ace4b28af49dea04c39df9c1dbc7dfbd36e32684 100644 (file)
@@ -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"
 #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);