2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
4 * Copyright (C) 2002-2007 Aleph One Ltd.
5 * for Toby Churchill Ltd and Brightstar Engineering
7 * Created by Charles Manning <charles@aleph1.co.uk>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 const char *yaffs_nand_c_version
=
16 #include "yaffs_nand.h"
17 #include "yaffs_tagscompat.h"
18 #include "yaffs_tagsvalidity.h"
21 int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device
* dev
, int chunkInNAND
,
23 yaffs_ExtendedTags
* tags
)
26 yaffs_ExtendedTags localTags
;
28 int realignedChunkInNAND
= chunkInNAND
- dev
->chunkOffset
;
30 /* If there are no tags provided, use local tags to get prioritised gc working */
34 if (dev
->readChunkWithTagsFromNAND
)
35 result
= dev
->readChunkWithTagsFromNAND(dev
, realignedChunkInNAND
, buffer
,
38 result
= yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev
,
43 tags
->eccResult
> YAFFS_ECC_RESULT_NO_ERROR
){
45 yaffs_BlockInfo
*bi
= yaffs_GetBlockInfo(dev
, chunkInNAND
/dev
->nChunksPerBlock
);
46 yaffs_HandleChunkError(dev
,bi
);
52 int yaffs_WriteChunkWithTagsToNAND(yaffs_Device
* dev
,
55 yaffs_ExtendedTags
* tags
)
57 chunkInNAND
-= dev
->chunkOffset
;
61 tags
->sequenceNumber
= dev
->sequenceNumber
;
63 if (!yaffs_ValidateTags(tags
)) {
65 (TSTR("Writing uninitialised tags" TENDSTR
)));
69 (TSTR("Writing chunk %d tags %d %d" TENDSTR
), chunkInNAND
,
70 tags
->objectId
, tags
->chunkId
));
72 T(YAFFS_TRACE_ERROR
, (TSTR("Writing with no tags" TENDSTR
)));
76 if (dev
->writeChunkWithTagsToNAND
)
77 return dev
->writeChunkWithTagsToNAND(dev
, chunkInNAND
, buffer
,
80 return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev
,
86 int yaffs_MarkBlockBad(yaffs_Device
* dev
, int blockNo
)
88 blockNo
-= dev
->blockOffset
;
91 if (dev
->markNANDBlockBad
)
92 return dev
->markNANDBlockBad(dev
, blockNo
);
94 return yaffs_TagsCompatabilityMarkNANDBlockBad(dev
, blockNo
);
97 int yaffs_QueryInitialBlockState(yaffs_Device
* dev
,
99 yaffs_BlockState
* state
,
100 unsigned *sequenceNumber
)
102 blockNo
-= dev
->blockOffset
;
104 if (dev
->queryNANDBlock
)
105 return dev
->queryNANDBlock(dev
, blockNo
, state
, sequenceNumber
);
107 return yaffs_TagsCompatabilityQueryNANDBlock(dev
, blockNo
,
113 int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct
*dev
,
118 blockInNAND
-= dev
->blockOffset
;
121 dev
->nBlockErasures
++;
122 result
= dev
->eraseBlockInNAND(dev
, blockInNAND
);
127 int yaffs_InitialiseNAND(struct yaffs_DeviceStruct
*dev
)
129 return dev
->initialiseNAND(dev
);