yaffs: Changes to test scripts
[yaffs2.git] / yaffs_nand.c
1 /*
2  * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
3  *
4  * Copyright (C) 2002-2010 Aleph One Ltd.
5  *   for Toby Churchill Ltd and Brightstar Engineering
6  *
7  * Created by Charles Manning <charles@aleph1.co.uk>
8  *
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.
12  */
13
14 #include "yaffs_nand.h"
15 #include "yaffs_tagscompat.h"
16 #include "yaffs_tagsvalidity.h"
17
18 #include "yaffs_getblockinfo.h"
19
20 int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND,
21                                            __u8 *buffer,
22                                            yaffs_ExtendedTags *tags)
23 {
24         int result;
25         yaffs_ExtendedTags localTags;
26
27         int realignedChunkInNAND = chunkInNAND - dev->chunkOffset;
28
29         dev->nPageReads++;
30
31         /* If there are no tags provided, use local tags to get prioritised gc working */
32         if (!tags)
33                 tags = &localTags;
34
35         if (dev->param.readChunkWithTagsFromNAND)
36                 result = dev->param.readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer,
37                                                       tags);
38         else
39                 result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev,
40                                                                         realignedChunkInNAND,
41                                                                         buffer,
42                                                                         tags);
43         if (tags &&
44            tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) {
45
46                 yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->param.nChunksPerBlock);
47                 yaffs_HandleChunkError(dev, bi);
48         }
49
50         return result;
51 }
52
53 int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev,
54                                                    int chunkInNAND,
55                                                    const __u8 *buffer,
56                                                    yaffs_ExtendedTags *tags)
57 {
58
59         dev->nPageWrites++;
60
61         chunkInNAND -= dev->chunkOffset;
62
63
64         if (tags) {
65                 tags->sequenceNumber = dev->sequenceNumber;
66                 tags->chunkUsed = 1;
67                 if (!yaffs_ValidateTags(tags)) {
68                         T(YAFFS_TRACE_ERROR,
69                           (TSTR("Writing uninitialised tags" TENDSTR)));
70                         YBUG();
71                 }
72                 T(YAFFS_TRACE_WRITE,
73                   (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND,
74                    tags->objectId, tags->chunkId));
75         } else {
76                 T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR)));
77                 YBUG();
78         }
79
80         if (dev->param.writeChunkWithTagsToNAND)
81                 return dev->param.writeChunkWithTagsToNAND(dev, chunkInNAND, buffer,
82                                                      tags);
83         else
84                 return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev,
85                                                                        chunkInNAND,
86                                                                        buffer,
87                                                                        tags);
88 }
89
90 int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo)
91 {
92         blockNo -= dev->blockOffset;
93
94
95         if (dev->param.markNANDBlockBad)
96                 return dev->param.markNANDBlockBad(dev, blockNo);
97         else
98                 return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo);
99 }
100
101 int yaffs_QueryInitialBlockState(yaffs_Device *dev,
102                                                  int blockNo,
103                                                  yaffs_BlockState *state,
104                                                  __u32 *sequenceNumber)
105 {
106         blockNo -= dev->blockOffset;
107
108         if (dev->param.queryNANDBlock)
109                 return dev->param.queryNANDBlock(dev, blockNo, state, sequenceNumber);
110         else
111                 return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo,
112                                                              state,
113                                                              sequenceNumber);
114 }
115
116
117 int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev,
118                                   int blockInNAND)
119 {
120         int result;
121
122         blockInNAND -= dev->blockOffset;
123
124         dev->nBlockErasures++;
125
126         result = dev->param.eraseBlockInNAND(dev, blockInNAND);
127
128         return result;
129 }
130
131 int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev)
132 {
133         if(dev->param.initialiseNAND)
134                 return dev->param.initialiseNAND(dev);
135         return YAFFS_OK;
136 }
137
138
139