annotate packages/fs/yaffs/current/src/patches/yaffs_mtdif2.c @ 425:dea4d7d250ad ecos

Move sources into packages/fs/yaffs/current/src/
author Ross Younger <wry@ecoscentric.com>
date Fri, 14 May 2010 16:03:09 +0100
parents patches/yaffs_mtdif2.c@c6c9df8d8c26
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
134
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
1 /*
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
2 * YAFFS: Yet another FFS. A NAND-flash specific file system.
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
3 *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
4 * Copyright (C) 2002 Aleph One Ltd.
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
5 * for Toby Churchill Ltd and Brightstar Engineering
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
6 *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
7 * Created by Charles Manning <charles@aleph1.co.uk>
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
8 *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
10 * it under the terms of the GNU General Public License version 2 as
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
11 * published by the Free Software Foundation.
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
12 */
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
13
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
14 /* mtd interface for YAFFS2 */
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
15
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
16 const char *yaffs_mtdif2_c_version =
172
c6c9df8d8c26 Fix file header to match all the others
colin <colin>
parents: 134
diff changeset
17 "$Id: yaffs_mtdif2.c,v 1.2 2007-03-07 08:05:58 colin Exp $";
134
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
18
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
19 #include "yportenv.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
20
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
21
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
22 #include "yaffs_mtdif2.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
23
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
24 #include "linux/mtd/mtd.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
25 #include "linux/types.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
26 #include "linux/time.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
27
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
28 #include "yaffs_packedtags2.h"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
29
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
30
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
31 void nandmtd2_pt2buf(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
32 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
33 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
34 __u8 *ptab = (__u8 *)pt; /* packed tags as bytes */
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
35
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
36 int i, j = 0, k, n;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
37
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
38 /* Pack buffer with 0xff */
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
39 for (i = 0; i < mtd->oobsize; i++)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
40 dev->spareBuffer[i] = 0xff;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
41
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
42 if(!is_raw){
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
43 memcpy(dev->spareBuffer,pt,sizeof(yaffs_PackedTags2));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
44 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
45 j = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
46 k = mtd->oobinfo.oobfree[j][0];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
47 n = mtd->oobinfo.oobfree[j][1];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
48
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
49 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
50 T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
51 YBUG();
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
52 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
53
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
54 for (i = 0; i < sizeof(yaffs_PackedTags2); i++) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
55 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
56 j++;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
57 k = mtd->oobinfo.oobfree[j][0];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
58 n = mtd->oobinfo.oobfree[j][1];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
59 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
60 T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
61 YBUG();
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
62 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
63 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
64 dev->spareBuffer[k] = ptab[i];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
65 k++;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
66 n--;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
67 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
68 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
69
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
70 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
71
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
72 void nandmtd2_buf2pt(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
73 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
74 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
75 int i, j = 0, k, n;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
76 __u8 *ptab = (__u8 *)pt; /* packed tags as bytes */
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
77
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
78
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
79 if (!is_raw) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
80
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
81 memcpy(pt,dev->spareBuffer,sizeof(yaffs_PackedTags2));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
82 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
83 j = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
84 k = mtd->oobinfo.oobfree[j][0];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
85 n = mtd->oobinfo.oobfree[j][1];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
86
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
87 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
88 T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
89 YBUG();
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
90 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
91
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
92 for (i = 0; i < sizeof(yaffs_PackedTags2); i++) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
93 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
94 j++;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
95 k = mtd->oobinfo.oobfree[j][0];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
96 n = mtd->oobinfo.oobfree[j][1];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
97 if (n == 0) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
98 T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
99 YBUG();
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
100 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
101 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
102 ptab[i] = dev->spareBuffer[k];
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
103 k++;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
104 n--;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
105 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
106 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
107
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
108 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
109
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
110 int nandmtd2_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
111 const __u8 * data,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
112 const yaffs_ExtendedTags * tags)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
113 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
114 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
115 size_t dummy;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
116 int retval = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
117
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
118 loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
119
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
120 yaffs_PackedTags2 pt;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
121
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
122 T(YAFFS_TRACE_MTD,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
123 (TSTR
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
124 ("nandmtd2_WriteChunkWithTagsToNAND chunk %d data %p tags %p"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
125 TENDSTR), chunkInNAND, data, tags));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
126
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
127 if (tags) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
128 yaffs_PackTags2(&pt, tags);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
129 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
130
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
131 if (data && tags) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
132 nandmtd2_pt2buf(dev, &pt, 0);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
133 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
134 mtd->write_ecc(mtd, addr, dev->nBytesPerChunk,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
135 &dummy, data, dev->spareBuffer,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
136 NULL);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
137
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
138 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
139
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
140 T(YAFFS_TRACE_ALWAYS,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
141 (TSTR
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
142 ("Write chunk with null tags or data!" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
143 YBUG();
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
144 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
145
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
146 if (retval == 0)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
147 return YAFFS_OK;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
148 else
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
149 return YAFFS_FAIL;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
150 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
151
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
152 int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
153 __u8 * data, yaffs_ExtendedTags * tags)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
154 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
155 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
156 size_t dummy;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
157 int retval = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
158
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
159 loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
160
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
161 yaffs_PackedTags2 pt;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
162
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
163 T(YAFFS_TRACE_MTD,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
164 (TSTR
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
165 ("nandmtd2_ReadChunkWithTagsToNAND chunk %d data %p tags %p"
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
166 TENDSTR), chunkInNAND, data, tags));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
167
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
168 if (0 && data && tags) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
169 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
170 mtd->read_ecc(mtd, addr, dev->nBytesPerChunk,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
171 &dummy, data, dev->spareBuffer,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
172 NULL);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
173 nandmtd2_buf2pt(dev, &pt, 0);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
174 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
175 if (data)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
176 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
177 mtd->read(mtd, addr, dev->nBytesPerChunk, &dummy,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
178 data);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
179 if (tags) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
180 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
181 mtd->read_oob(mtd, addr, mtd->oobsize, &dummy,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
182 dev->spareBuffer);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
183 nandmtd2_buf2pt(dev, &pt, 1);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
184 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
185 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
186
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
187 if (tags)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
188 yaffs_UnpackTags2(tags, &pt);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
189
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
190 if (retval == 0)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
191 return YAFFS_OK;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
192 else
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
193 return YAFFS_FAIL;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
194 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
195
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
196 int nandmtd2_MarkNANDBlockBad(struct yaffs_DeviceStruct *dev, int blockNo)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
197 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
198 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
199 int retval;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
200 T(YAFFS_TRACE_MTD,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
201 (TSTR("nandmtd2_MarkNANDBlockBad %d" TENDSTR), blockNo));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
202
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
203 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
204 mtd->block_markbad(mtd,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
205 blockNo * dev->nChunksPerBlock *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
206 dev->nBytesPerChunk);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
207
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
208 if (retval == 0)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
209 return YAFFS_OK;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
210 else
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
211 return YAFFS_FAIL;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
212
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
213 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
214
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
215 int nandmtd2_QueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
216 yaffs_BlockState * state, int *sequenceNumber)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
217 {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
218 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
219 int retval;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
220
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
221 T(YAFFS_TRACE_MTD,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
222 (TSTR("nandmtd2_QueryNANDBlock %d" TENDSTR), blockNo));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
223 retval =
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
224 mtd->block_isbad(mtd,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
225 blockNo * dev->nChunksPerBlock *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
226 dev->nBytesPerChunk);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
227
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
228 if (retval) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
229 T(YAFFS_TRACE_MTD, (TSTR("block is bad" TENDSTR)));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
230
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
231 *state = YAFFS_BLOCK_STATE_DEAD;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
232 *sequenceNumber = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
233 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
234 yaffs_ExtendedTags t;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
235 nandmtd2_ReadChunkWithTagsFromNAND(dev,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
236 blockNo *
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
237 dev->nChunksPerBlock, NULL,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
238 &t);
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
239
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
240 if (t.chunkUsed) {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
241 *sequenceNumber = t.sequenceNumber;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
242 *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
243 } else {
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
244 *sequenceNumber = 0;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
245 *state = YAFFS_BLOCK_STATE_EMPTY;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
246 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
247
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
248 T(YAFFS_TRACE_MTD,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
249 (TSTR("block is OK seq %d state %d" TENDSTR), *sequenceNumber,
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
250 *state));
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
251 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
252
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
253 if (retval == 0)
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
254 return YAFFS_OK;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
255 else
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
256 return YAFFS_FAIL;
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
257 }
8a3c44a06d97 Add Sergey's patch
charles <charles>
parents:
diff changeset
258