annotate yaffs_mtdif2.c @ 143:bec3d6bed11a

Interworking with 2.6.18 kernel enabled Notable is that to enable it for yaffs1 compatibility mode, I introduced a workaround (translate_spare2oob/translate_oob2spare) which should be redesigned if possible. The thing is that yaffs1 presumes SmartMedia OOB layout which might be not true for a lot of modern flash controllers, so there has to be translation. Or, in case we get to tags inband, this workaround will become useless.
author vwool <vwool>
date Tue, 26 Sep 2006 13:28:13 +0000
parents 34ac1a735230
children 1a32267ef1c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
1 /*
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
2 * YAFFS: Yet another FFS. A NAND-flash specific file system.
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
3 * yaffs_mtdif.c NAND mtd wrapper functions.
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
4 *
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
5 * Copyright (C) 2002 Aleph One Ltd.
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
6 * for Toby Churchill Ltd and Brightstar Engineering
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
7 *
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
8 * Created by Charles Manning <charles@aleph1.co.uk>
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
9 *
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
10 * This program is free software; you can redistribute it and/or modify
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
11 * it under the terms of the GNU General Public License version 2 as
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
12 * published by the Free Software Foundation.
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
13 *
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
14 */
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
15
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
16 /* mtd interface for YAFFS2 */
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
17
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
18 const char *yaffs_mtdif2_c_version =
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
19 "$Id: yaffs_mtdif2.c,v 1.13 2006-09-26 13:28:13 vwool Exp $";
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
20
45
1f2f55618d63 If kernel/config.h is included in yportenv.h, then yportenv.h must be
marty <marty>
parents: 24
diff changeset
21 #include "yportenv.h"
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
22
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
23
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
24 #include "yaffs_mtdif2.h"
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
25
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
26 #include "linux/mtd/mtd.h"
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
27 #include "linux/types.h"
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
28 #include "linux/time.h"
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
29
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
30 #include "yaffs_packedtags2.h"
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
31
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
32 int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
33 const __u8 * data,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
34 const yaffs_ExtendedTags * tags)
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
35 {
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
36 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
37 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
38 struct mtd_oob_ops ops;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
39 #else
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
40 size_t dummy;
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
41 #endif
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
42 int retval = 0;
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
43
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
44 loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
45
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
46 yaffs_PackedTags2 pt;
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
47
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
48 T(YAFFS_TRACE_MTD,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
49 (TSTR
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
50 ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p"
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
51 TENDSTR), chunkInNAND, data, tags));
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
52
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
53 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
54 if (tags)
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
55 yaffs_PackTags2(&pt, tags);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
56 else
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
57 BUG(); /* both tags and data should always be present */
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
58
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
59 if (data) {
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
60 ops.mode = MTD_OOB_AUTO;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
61 ops.ooblen = sizeof(pt);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
62 ops.len = dev->nBytesPerChunk;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
63 ops.ooboffs = 0;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
64 ops.datbuf = (__u8 *)data;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
65 ops.oobbuf = (void *)&pt;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
66 retval = mtd->write_oob(mtd, addr, &ops);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
67 } else
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
68 BUG(); /* both tags and data should always be present */
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
69 #else
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
70 if (tags) {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
71 yaffs_PackTags2(&pt, tags);
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
72 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
73
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
74 if (data && tags) {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
75 if (dev->useNANDECC)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
76 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
77 mtd->write_ecc(mtd, addr, dev->nBytesPerChunk,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
78 &dummy, data, (__u8 *) & pt, NULL);
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
79 else
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
80 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
81 mtd->write_ecc(mtd, addr, dev->nBytesPerChunk,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
82 &dummy, data, (__u8 *) & pt, NULL);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
83 } else {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
84 if (data)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
85 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
86 mtd->write(mtd, addr, dev->nBytesPerChunk, &dummy,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
87 data);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
88 if (tags)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
89 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
90 mtd->write_oob(mtd, addr, mtd->oobsize, &dummy,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
91 (__u8 *) & pt);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
92
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
93 }
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
94 #endif
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
95
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
96 if (retval == 0)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
97 return YAFFS_OK;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
98 else
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
99 return YAFFS_FAIL;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
100 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
101
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
102 int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
103 __u8 * data, yaffs_ExtendedTags * tags)
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
104 {
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
105 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
106 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
107 struct mtd_oob_ops ops;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
108 #endif
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
109 size_t dummy;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
110 int retval = 0;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
111
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
112 loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
113
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
114 yaffs_PackedTags2 pt;
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
115
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
116 T(YAFFS_TRACE_MTD,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
117 (TSTR
126
2e7fd6d40037 Fix a couple of mistakes in TRACE/Error messages. Update copyright date.
wookey <wookey>
parents: 103
diff changeset
118 ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p"
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
119 TENDSTR), chunkInNAND, data, tags));
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
120
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
121 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
122 if (data && !tags)
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
123 retval = mtd->read(mtd, addr, dev->nBytesPerChunk,
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
124 &dummy, data);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
125 else if (tags) {
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
126 ops.mode = MTD_OOB_AUTO;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
127 ops.ooblen = sizeof(pt);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
128 ops.len = data ? dev->nBytesPerChunk : sizeof(pt);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
129 ops.ooboffs = 0;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
130 ops.datbuf = data;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
131 ops.oobbuf = dev->spareBuffer;
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
132 retval = mtd->read_oob(mtd, addr, &ops);
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
133 }
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
134 #else
103
a3aac8938f90 Back out mistaken checkin
charles <charles>
parents: 102
diff changeset
135 if (data && tags) {
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
136 if (dev->useNANDECC) {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
137 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
138 mtd->read_ecc(mtd, addr, dev->nBytesPerChunk,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
139 &dummy, data, dev->spareBuffer,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
140 NULL);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
141 } else {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
142 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
143 mtd->read_ecc(mtd, addr, dev->nBytesPerChunk,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
144 &dummy, data, dev->spareBuffer,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
145 NULL);
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
146 }
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
147 } else {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
148 if (data)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
149 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
150 mtd->read(mtd, addr, dev->nBytesPerChunk, &dummy,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
151 data);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
152 if (tags)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
153 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
154 mtd->read_oob(mtd, addr, mtd->oobsize, &dummy,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
155 dev->spareBuffer);
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
156 }
143
bec3d6bed11a Interworking with 2.6.18 kernel enabled
vwool <vwool>
parents: 142
diff changeset
157 #endif
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
158
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
159 memcpy(&pt, dev->spareBuffer, sizeof(pt));
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
160
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
161 if (tags)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
162 yaffs_UnpackTags2(tags, &pt);
142
34ac1a735230 Better retirement and erasure checking.
charles <charles>
parents: 126
diff changeset
163
34ac1a735230 Better retirement and erasure checking.
charles <charles>
parents: 126
diff changeset
164 if(tags && retval == -EBADMSG && tags->eccResult == YAFFS_ECC_RESULT_NO_ERROR)
34ac1a735230 Better retirement and erasure checking.
charles <charles>
parents: 126
diff changeset
165 tags->eccResult = YAFFS_ECC_RESULT_UNFIXED;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
166
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
167 if (retval == 0)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
168 return YAFFS_OK;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
169 else
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
170 return YAFFS_FAIL;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
171 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
172
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
173 int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
174 {
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
175 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
176 int retval;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
177 T(YAFFS_TRACE_MTD,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
178 (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), blockNo));
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
179
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
180 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
181 mtd->block_markbad(mtd,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
182 blockNo * dev->nChunksPerBlock *
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
183 dev->nBytesPerChunk);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
184
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
185 if (retval == 0)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
186 return YAFFS_OK;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
187 else
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
188 return YAFFS_FAIL;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
189
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
190 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
191
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
192 int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
193 yaffs_BlockState * state, int *sequenceNumber)
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
194 {
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
195 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
196 int retval;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
197
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
198 T(YAFFS_TRACE_MTD,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
199 (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), blockNo));
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
200 retval =
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
201 mtd->block_isbad(mtd,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
202 blockNo * dev->nChunksPerBlock *
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
203 dev->nBytesPerChunk);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
204
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
205 if (retval) {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
206 T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR)));
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
207
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
208 *state = YAFFS_BLOCK_STATE_DEAD;
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
209 *sequenceNumber = 0;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
210 } else {
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
211 yaffs_ExtendedTags t;
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
212 nandmtd2_ReadChunkWithTagsFromNAND(dev,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
213 blockNo *
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
214 dev->nChunksPerBlock, NULL,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
215 &t);
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
216
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
217 if (t.chunkUsed) {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
218 *sequenceNumber = t.sequenceNumber;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
219 *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
220 } else {
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
221 *sequenceNumber = 0;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
222 *state = YAFFS_BLOCK_STATE_EMPTY;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
223 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
224 }
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
225 T(YAFFS_TRACE_MTD,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
226 (TSTR("block is bad seq %d state %d" TENDSTR), *sequenceNumber,
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
227 *state));
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
228
76
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
229 if (retval == 0)
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
230 return YAFFS_OK;
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
231 else
0113df80498c lindent
marty <marty>
parents: 57
diff changeset
232 return YAFFS_FAIL;
7
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
233 }
9fd733a84a74 *** empty log message ***
charles <charles>
parents:
diff changeset
234