comparison packages/fs/yaffs/current/src/ecos-yaffs-nand.c @ 311:16de60f90faa

ecos-yaffs-nand.c: Correctly use ECC on YAFFS tags in yaffs2
author wry
date Fri, 18 Sep 2009 11:13:00 +0000
parents 9c8ff034abb0
children 8e1210f7946a
comparison
equal deleted inserted replaced
310:a097a8d2aa15 311:16de60f90faa
71 cyg_nand_partition *part = (cyg_nand_partition*) dev->genericDevice; 71 cyg_nand_partition *part = (cyg_nand_partition*) dev->genericDevice;
72 int rv = cyg_nand_erase_block(part, blockInNAND); 72 int rv = cyg_nand_erase_block(part, blockInNAND);
73 return rv==0 ? YAFFS_OK : YAFFS_FAIL; 73 return rv==0 ? YAFFS_OK : YAFFS_FAIL;
74 } 74 }
75 75
76 // If writing a yaffs_PackedTags1, we store only its eight meaningful bytes
77 #define PACKEDTAGS1_OOBSIZE 8
78
79 int eyaffs_writeChunkWithTagsToNAND (struct yaffs_DeviceStruct * dev, 76 int eyaffs_writeChunkWithTagsToNAND (struct yaffs_DeviceStruct * dev,
80 int chunkInNAND, const __u8 * data, 77 int chunkInNAND, const __u8 * data,
81 const yaffs_ExtendedTags * tags) 78 const yaffs_ExtendedTags * tags)
82 { 79 {
83 cyg_nand_partition *part = (cyg_nand_partition*) dev->genericDevice; 80 cyg_nand_partition *part = (cyg_nand_partition*) dev->genericDevice;
118 yaffs_PackedTags2TagsPart *pt2tp; 115 yaffs_PackedTags2TagsPart *pt2tp;
119 pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk); 116 pt2tp = (yaffs_PackedTags2TagsPart *)(data + dev->nDataBytesPerChunk);
120 yaffs_PackTags2TagsPart(pt2tp, tags); 117 yaffs_PackTags2TagsPart(pt2tp, tags);
121 rv = cyg_nand_write_page(part, chunkInNAND, data, dev->totalBytesPerChunk, 0, 0); 118 rv = cyg_nand_write_page(part, chunkInNAND, data, dev->totalBytesPerChunk, 0, 0);
122 } else { 119 } else {
123 yaffs_PackedTags2TagsPart pt; 120 yaffs_PackedTags2 pt;
124 yaffs_PackTags2TagsPart(&pt, tags); 121 yaffs_PackTags2(&pt, tags);
125 rv = cyg_nand_write_page(part, chunkInNAND, data, dev->nDataBytesPerChunk, &pt, sizeof(yaffs_PackedTags2TagsPart)); 122 rv = cyg_nand_write_page(part, chunkInNAND, data, dev->nDataBytesPerChunk, &pt, PACKEDTAGS2_OOBSIZE);
126 } 123 }
127 #endif 124 #endif
128 } 125 }
129 126
130 // all done: 127 // all done:
202 yaffs_PackedTags2TagsPart *pt2tp; 199 yaffs_PackedTags2TagsPart *pt2tp;
203 pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk]; 200 pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->nDataBytesPerChunk];
204 yaffs_UnpackTags2TagsPart(tags, pt2tp); 201 yaffs_UnpackTags2TagsPart(tags, pt2tp);
205 } 202 }
206 } else { 203 } else {
207 yaffs_PackedTags2TagsPart pt; 204 yaffs_PackedTags2 pt;
208 rv = cyg_nand_read_page(part, chunkInNAND, data, data ? dev->nDataBytesPerChunk : 0, &pt, sizeof(yaffs_PackedTags2TagsPart)); 205 rv = cyg_nand_read_page(part, chunkInNAND, data, data ? dev->nDataBytesPerChunk : 0, &pt, tags ? PACKEDTAGS2_OOBSIZE : 0);
209 if (tags) 206 if (tags)
210 yaffs_UnpackTags2TagsPart(tags, &pt); 207 yaffs_UnpackTags2(tags, &pt);
211 } 208 }
212 #endif 209 #endif
213 } 210 }
214 211
215 // all done: 212 // all done: