annotate direct/yaffs_ramem2k.c @ 409:b5309c9b6d7f

yaffs Some cleanups. Update copyright messages. Clean up tracing to use TSTR and KERN_DEBUG. Remove cvs $Id. Change /proc/yaffs_debug to /proc/yaffs_stats. ... and a few other clean ups. Signed-off-by: Charles Manning <cdhmanning@gmail.com>
author Charles Manning <cdhmanning@gmail.com>
date Tue, 20 Apr 2010 17:12:46 +1200
parents 7ee0cc4ba753
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
1 /*
167
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 68
diff changeset
2 * YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
3 *
409
b5309c9b6d7f yaffs Some cleanups.
Charles Manning <cdhmanning@gmail.com>
parents: 356
diff changeset
4 * Copyright (C) 2002-2010 Aleph One Ltd.
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
5 * for Toby Churchill Ltd and Brightstar Engineering
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
6 *
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
7 * Created by Charles Manning <charles@aleph1.co.uk>
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
8 *
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
10 * it under the terms of the GNU General Public License version 2 as
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
11 * published by the Free Software Foundation.
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
12 */
167
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 68
diff changeset
13
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 68
diff changeset
14 /*
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 68
diff changeset
15 * yaffs_ramem2k.c: RAM emulation in-kernel for 2K pages (YAFFS2)
582d5458b4c6 normalise licence headers
wookey <wookey>
parents: 68
diff changeset
16 */
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
17
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
18
356
7ee0cc4ba753 Rationalise context and parameter handling
charles <charles>
parents: 343
diff changeset
19 const char *yaffs_ramem2k_c_version = "$Id: yaffs_ramem2k.c,v 1.8 2010-02-18 01:18:04 charles Exp $";
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
20
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
21 #ifndef __KERNEL__
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
22 #define CONFIG_YAFFS_RAM_ENABLED
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
23 #else
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
24 #include <linux/config.h>
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
25 #endif
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
26
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
27 #ifdef CONFIG_YAFFS_RAM_ENABLED
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
28
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
29 #include "yportenv.h"
342
ce702882929d Move tracing out of yportenv.h
charles <charles>
parents: 300
diff changeset
30 #include "yaffs_trace.h"
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
31
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
32 #include "yaffs_nandemul2k.h"
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
33 #include "yaffs_guts.h"
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
34 #include "yaffsinterface.h"
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
35 #include "devextras.h"
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
36 #include "yaffs_packedtags2.h"
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
37
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
38
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
39
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
40 #define EM_SIZE_IN_MEG (32)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
41 #define PAGE_DATA_SIZE (2048)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
42 #define PAGE_SPARE_SIZE (64)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
43 #define PAGES_PER_BLOCK (64)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
44
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
45
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
46
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
47 #define EM_SIZE_IN_BYTES (EM_SIZE_IN_MEG * (1<<20))
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
48
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
49 #define PAGE_TOTAL_SIZE (PAGE_DATA_SIZE+PAGE_SPARE_SIZE)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
50
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
51 #define BLOCK_TOTAL_SIZE (PAGES_PER_BLOCK * PAGE_TOTAL_SIZE)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
52
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
53 #define BLOCKS_PER_MEG ((1<<20)/(PAGES_PER_BLOCK * PAGE_DATA_SIZE))
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
54
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
55
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
56 typedef struct
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
57 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
58 __u8 data[PAGE_TOTAL_SIZE]; // Data + spare
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
59 int empty; // is this empty?
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
60 } nandemul_Page;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
61
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
62
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
63 typedef struct
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
64 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
65 nandemul_Page *page[PAGES_PER_BLOCK];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
66 int damaged;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
67 } nandemul_Block;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
69
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
70
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
71 typedef struct
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
72 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
73 nandemul_Block**block;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
74 int nBlocks;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
75 } nandemul_Device;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
76
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
77 static nandemul_Device ned;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
78
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
79 static int sizeInMB = EM_SIZE_IN_MEG;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
80
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
81
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
82 static void nandemul_yield(int n)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
83 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
84 #ifdef __KERNEL__
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
85 if(n > 0) schedule_timeout(n);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
86 #endif
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
87
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
88 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
89
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
90
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
91 static void nandemul_ReallyEraseBlock(int blockNumber)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
92 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
93 int i;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
94
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
95 nandemul_Block *blk;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
96
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
97 if(blockNumber < 0 || blockNumber >= ned.nBlocks)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
98 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
99 return;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
100 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
101
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
102 blk = ned.block[blockNumber];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
103
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
104 for(i = 0; i < PAGES_PER_BLOCK; i++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
105 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
106 memset(blk->page[i],0xff,sizeof(nandemul_Page));
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
107 blk->page[i]->empty = 1;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
108 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
109 nandemul_yield(2);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
110 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
111
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
112
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
113 static int nandemul2k_CalcNBlocks(void)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
114 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
115 return EM_SIZE_IN_MEG * BLOCKS_PER_MEG;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
116 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
117
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
118
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
119
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
120 static int CheckInit(void)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
121 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
122 static int initialised = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
123
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
124 int i,j;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
125
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
126 int fail = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
127 int nBlocks;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
128
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
129 int nAllocated = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
130
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
131 if(initialised)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
132 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
133 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
134 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
135
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
136
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
137 ned.nBlocks = nBlocks = nandemul2k_CalcNBlocks();
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
138
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
139
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
140 ned.block = YMALLOC(sizeof(nandemul_Block*) * nBlocks );
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
141
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
142 if(!ned.block) return YAFFS_FAIL;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
143
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
144
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
145
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
146
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
147
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
148 for(i=fail=0; i <nBlocks; i++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
149 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
150
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
151 nandemul_Block *blk;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
152
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
153 if(!(blk = ned.block[i] = YMALLOC(sizeof(nandemul_Block))))
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
154 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
155 fail = 1;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
156 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
157 else
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
158 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
159 for(j = 0; j < PAGES_PER_BLOCK; j++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
160 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
161 if((blk->page[j] = YMALLOC(sizeof(nandemul_Page))) == 0)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
162 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
163 fail = 1;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
164 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
165 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
166 nandemul_ReallyEraseBlock(i);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
167 ned.block[i]->damaged = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
168 nAllocated++;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
169 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
170 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
171
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
172 if(fail)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
173 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
174 //Todo thump pages
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
175
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
176 for(i = 0; i < nAllocated; i++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
177 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
178 YFREE(ned.block[i]);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
179 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
180 YFREE(ned.block);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
181
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
182 T(YAFFS_TRACE_ALWAYS,("Allocation failed, could only allocate %dMB of %dMB requested.\n",
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
183 nAllocated/64,sizeInMB));
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
184 return 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
185 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
186
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
187 ned.nBlocks = nBlocks;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
188
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
189 initialised = 1;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
190
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
191 return 1;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
192 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
193
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 171
diff changeset
194 int nandemul2k_WriteChunkWithTagsToNAND(yaffs_Device *dev,int chunkInNAND,const __u8 *data, const yaffs_ExtendedTags *tags)
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
195 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
196 int blk;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
197 int pg;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
198 int i;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
199
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
200 __u8 *x;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
201
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
202
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
203 blk = chunkInNAND/PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
204 pg = chunkInNAND%PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
205
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
206
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
207 if(data)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
208 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
209 x = ned.block[blk]->page[pg]->data;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
210
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
211 for(i = 0; i < PAGE_DATA_SIZE; i++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
212 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
213 x[i] &=data[i];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
214 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
215
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
216 ned.block[blk]->page[pg]->empty = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
217 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
218
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
219
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
220 if(tags)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
221 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
222 x = &ned.block[blk]->page[pg]->data[PAGE_DATA_SIZE];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
223
356
7ee0cc4ba753 Rationalise context and parameter handling
charles <charles>
parents: 343
diff changeset
224 yaffs_PackTags2((yaffs_PackedTags2 *)x,tags, !dev->param.noTagsECC);
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
225
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
226 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
227
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
228 if(tags || data)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
229 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
230 nandemul_yield(1);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
231 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
232
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
233 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
234 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
235
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
236
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
237 int nandemul2k_ReadChunkWithTagsFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaffs_ExtendedTags *tags)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
238 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
239 int blk;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
240 int pg;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
241
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
242 __u8 *x;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
243
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
244
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
245
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
246 blk = chunkInNAND/PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
247 pg = chunkInNAND%PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
248
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
249
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
250 if(data)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
251 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
252 memcpy(data,ned.block[blk]->page[pg]->data,PAGE_DATA_SIZE);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
253 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
254
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
255
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
256 if(tags)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
257 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
258 x = &ned.block[blk]->page[pg]->data[PAGE_DATA_SIZE];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
259
356
7ee0cc4ba753 Rationalise context and parameter handling
charles <charles>
parents: 343
diff changeset
260 yaffs_UnpackTags2(tags,(yaffs_PackedTags2 *)x, !dev->param.noTagsECC);
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
261 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
262
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
263 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
264 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
265
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
266
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
267 static int nandemul2k_CheckChunkErased(yaffs_Device *dev,int chunkInNAND)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
268 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
269 int blk;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
270 int pg;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
271 int i;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
272
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
273
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
274
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
275 blk = chunkInNAND/PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
276 pg = chunkInNAND%PAGES_PER_BLOCK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
277
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
278
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
279 for(i = 0; i < PAGE_TOTAL_SIZE; i++)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
280 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
281 if(ned.block[blk]->page[pg]->data[i] != 0xFF)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
282 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
283 return YAFFS_FAIL;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
284 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
285 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
286
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
287 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
288
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
289 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
290
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
291 int nandemul2k_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
292 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
293
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
294
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
295 if(blockNumber < 0 || blockNumber >= ned.nBlocks)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
296 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
297 T(YAFFS_TRACE_ALWAYS,("Attempt to erase non-existant block %d\n",blockNumber));
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
298 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
299 else if(ned.block[blockNumber]->damaged)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
300 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
301 T(YAFFS_TRACE_ALWAYS,("Attempt to erase damaged block %d\n",blockNumber));
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
302 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
303 else
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
304 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
305 nandemul_ReallyEraseBlock(blockNumber);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
306 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
307
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
308 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
309 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
310
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
311 int nandemul2k_InitialiseNAND(yaffs_Device *dev)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
312 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
313 CheckInit();
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
314 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
315 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
316
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
317 int nandemul2k_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
318 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
319
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
320 __u8 *x;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
321
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
322 x = &ned.block[blockNo]->page[0]->data[PAGE_DATA_SIZE];
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
323
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
324 memset(x,0,sizeof(yaffs_PackedTags2));
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
325
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
326
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
327 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
328
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
329 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
330
204
0f70320a2274 Check in inband tags, some extra yaffs direct functions and some other changes
charles <charles>
parents: 171
diff changeset
331 int nandemul2k_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState *state, __u32 *sequenceNumber)
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
332 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
333 yaffs_ExtendedTags tags;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
334 int chunkNo;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
335
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
336 *sequenceNumber = 0;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
337
356
7ee0cc4ba753 Rationalise context and parameter handling
charles <charles>
parents: 343
diff changeset
338 chunkNo = blockNo * dev->param.nChunksPerBlock;
68
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
339
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
340 nandemul2k_ReadChunkWithTagsFromNAND(dev,chunkNo,NULL,&tags);
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
341 if(tags.blockBad)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
342 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
343 *state = YAFFS_BLOCK_STATE_DEAD;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
344 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
345 else if(!tags.chunkUsed)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
346 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
347 *state = YAFFS_BLOCK_STATE_EMPTY;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
348 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
349 else if(tags.chunkUsed)
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
350 {
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
351 *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
352 *sequenceNumber = tags.sequenceNumber;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
353 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
354 return YAFFS_OK;
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
355 }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
356
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
357 int nandemul2k_GetBytesPerChunk(void) { return PAGE_DATA_SIZE;}
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
358
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
359 int nandemul2k_GetChunksPerBlock(void) { return PAGES_PER_BLOCK; }
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
360 int nandemul2k_GetNumberOfBlocks(void) {return nandemul2k_CalcNBlocks();}
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
361
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
362
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
363 #endif //YAFFS_RAM_ENABLED
436b308dab3f *** empty log message ***
charles <charles>
parents:
diff changeset
364