Some fixes and add NOR integrity code
[yaffs2.git] / yaffs_tagscompat.c
index ab756d06d0a9eb580ef520bd48265dc08e03e4f3..f6c40535088c05a9317c19a8324980ef6d5fa028 100644 (file)
@@ -253,6 +253,9 @@ static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev,
                /* Must allocate enough memory for spare+2*sizeof(int) */
                /* for ecc results from device. */
                struct yaffs_NANDSpare nspare;
+               
+               memset(&nspare,0,sizeof(nspare));
+               
                retVal =
                    dev->readChunkFromNAND(dev, chunkInNAND, data,
                                           (yaffs_Spare *) & nspare);
@@ -337,7 +340,7 @@ static void yaffs_HandleReadDataError(yaffs_Device * dev, int chunkInNAND)
        int blockInNAND = chunkInNAND / dev->nChunksPerBlock;
 
        /* Mark the block for retirement */
-       yaffs_GetBlockInfo(dev, blockInNAND)->needsRetiring = 1;
+       yaffs_GetBlockInfo(dev, blockInNAND + dev->blockOffset)->needsRetiring = 1;
        T(YAFFS_TRACE_ERROR | YAFFS_TRACE_BAD_BLOCKS,
          (TSTR("**>>Block %d marked for retirement" TENDSTR), blockInNAND));
 
@@ -415,7 +418,16 @@ int yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(yaffs_Device * dev,
        } else {
                tags.objectId = eTags->objectId;
                tags.chunkId = eTags->chunkId;
-               tags.byteCount = eTags->byteCount;
+
+               tags.byteCountLSB = eTags->byteCount & 0x3ff;
+               
+               if(dev->nDataBytesPerChunk >= 1024){
+                       tags.byteCountMSB = (eTags->byteCount >> 10) & 3;
+               } else {
+                       tags.byteCountMSB = 3;
+               }
+               
+
                tags.serialNumber = eTags->serialNumber;
 
                if (!dev->useNANDECC && data) {
@@ -436,7 +448,7 @@ int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
 
        yaffs_Spare spare;
        yaffs_Tags tags;
-       yaffs_ECCResult eccResult;
+       yaffs_ECCResult eccResult = YAFFS_ECC_RESULT_UNKNOWN;
 
        static yaffs_Spare spareFF;
        static int init = 0;
@@ -467,7 +479,11 @@ int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev,
 
                                eTags->objectId = tags.objectId;
                                eTags->chunkId = tags.chunkId;
-                               eTags->byteCount = tags.byteCount;
+                               eTags->byteCount = tags.byteCountLSB;
+
+                               if(dev->nDataBytesPerChunk >= 1024)
+                                       eTags->byteCount |= (((unsigned) tags.byteCountMSB) << 10);
+
                                eTags->serialNumber = tags.serialNumber;
                        }
                }