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
=
15 "$Id: yaffs_nand.c,v 1.9 2008-05-05 07:58:58 charles Exp $";
17 #include "yaffs_nand.h"
18 #include "yaffs_tagscompat.h"
19 #include "yaffs_tagsvalidity.h"
21 #include "yaffs_getblockinfo.h"
23 int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device
* dev
, int chunkInNAND
,
25 yaffs_ExtendedTags
* tags
)
28 yaffs_ExtendedTags localTags
;
30 int realignedChunkInNAND
= chunkInNAND
- dev
->chunkOffset
;
32 /* If there are no tags provided, use local tags to get prioritised gc working */
36 if (dev
->readChunkWithTagsFromNAND
)
37 result
= dev
->readChunkWithTagsFromNAND(dev
, realignedChunkInNAND
, buffer
,
40 result
= yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev
,
45 tags
->eccResult
> YAFFS_ECC_RESULT_NO_ERROR
){
47 yaffs_BlockInfo
*bi
= yaffs_GetBlockInfo(dev
, chunkInNAND
/dev
->nChunksPerBlock
);
48 yaffs_HandleChunkError(dev
,bi
);
54 int yaffs_WriteChunkWithTagsToNAND(yaffs_Device
* dev
,
57 yaffs_ExtendedTags
* tags
)
59 chunkInNAND
-= dev
->chunkOffset
;
63 tags
->sequenceNumber
= dev
->sequenceNumber
;
65 if (!yaffs_ValidateTags(tags
)) {
67 (TSTR("Writing uninitialised tags" TENDSTR
)));
71 (TSTR("Writing chunk %d tags %d %d" TENDSTR
), chunkInNAND
,
72 tags
->objectId
, tags
->chunkId
));
74 T(YAFFS_TRACE_ERROR
, (TSTR("Writing with no tags" TENDSTR
)));
78 if (dev
->writeChunkWithTagsToNAND
)
79 return dev
->writeChunkWithTagsToNAND(dev
, chunkInNAND
, buffer
,
82 return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev
,
88 int yaffs_MarkBlockBad(yaffs_Device
* dev
, int blockNo
)
90 blockNo
-= dev
->blockOffset
;
93 if (dev
->markNANDBlockBad
)
94 return dev
->markNANDBlockBad(dev
, blockNo
);
96 return yaffs_TagsCompatabilityMarkNANDBlockBad(dev
, blockNo
);
99 int yaffs_QueryInitialBlockState(yaffs_Device
* dev
,
101 yaffs_BlockState
* state
,
102 __u32
*sequenceNumber
)
104 blockNo
-= dev
->blockOffset
;
106 if (dev
->queryNANDBlock
)
107 return dev
->queryNANDBlock(dev
, blockNo
, state
, sequenceNumber
);
109 return yaffs_TagsCompatabilityQueryNANDBlock(dev
, blockNo
,
115 int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct
*dev
,
120 blockInNAND
-= dev
->blockOffset
;
123 dev
->nBlockErasures
++;
124 result
= dev
->eraseBlockInNAND(dev
, blockInNAND
);
129 int yaffs_InitialiseNAND(struct yaffs_DeviceStruct
*dev
)
131 return dev
->initialiseNAND(dev
);