comparison yaffs_mtdif.c @ 356:7ee0cc4ba753

Rationalise context and parameter handling
author charles <charles>
date Thu, 18 Feb 2010 01:18:04 +0000
parents c0dfae9e8073
children 7c3694ed38db
comparison
equal deleted inserted replaced
355:a52b8595f22c 356:7ee0cc4ba753
10 * it under the terms of the GNU General Public License version 2 as 10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation. 11 * published by the Free Software Foundation.
12 */ 12 */
13 13
14 const char *yaffs_mtdif_c_version = 14 const char *yaffs_mtdif_c_version =
15 "$Id: yaffs_mtdif.c,v 1.22 2009-03-06 17:20:51 wookey Exp $"; 15 "$Id: yaffs_mtdif.c,v 1.23 2010-02-18 01:18:04 charles Exp $";
16 16
17 #include "yportenv.h" 17 #include "yportenv.h"
18 18
19 19
20 #include "yaffs_mtdif.h" 20 #include "yaffs_mtdif.h"
21 21
22 #include "linux/mtd/mtd.h" 22 #include "linux/mtd/mtd.h"
23 #include "linux/types.h" 23 #include "linux/types.h"
24 #include "linux/time.h" 24 #include "linux/time.h"
25 #include "linux/mtd/nand.h" 25 #include "linux/mtd/nand.h"
26
27 #include "yaffs_linux.h"
26 28
27 #if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18)) 29 #if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18))
28 static struct nand_oobinfo yaffs_oobinfo = { 30 static struct nand_oobinfo yaffs_oobinfo = {
29 .useecc = 1, 31 .useecc = 1,
30 .eccbytes = 6, 32 .eccbytes = 6,
72 #endif 74 #endif
73 75
74 int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND, 76 int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,
75 const __u8 *data, const yaffs_Spare *spare) 77 const __u8 *data, const yaffs_Spare *spare)
76 { 78 {
77 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); 79 struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd;
78 #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) 80 #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
79 struct mtd_oob_ops ops; 81 struct mtd_oob_ops ops;
80 #endif 82 #endif
81 size_t dummy; 83 size_t dummy;
82 int retval = 0; 84 int retval = 0;
87 89
88 if (data && !spare) 90 if (data && !spare)
89 retval = mtd->write(mtd, addr, dev->nDataBytesPerChunk, 91 retval = mtd->write(mtd, addr, dev->nDataBytesPerChunk,
90 &dummy, data); 92 &dummy, data);
91 else if (spare) { 93 else if (spare) {
92 if (dev->useNANDECC) { 94 if (dev->param.useNANDECC) {
93 translate_spare2oob(spare, spareAsBytes); 95 translate_spare2oob(spare, spareAsBytes);
94 ops.mode = MTD_OOB_AUTO; 96 ops.mode = MTD_OOB_AUTO;
95 ops.ooblen = 8; /* temp hack */ 97 ops.ooblen = 8; /* temp hack */
96 } else { 98 } else {
97 ops.mode = MTD_OOB_RAW; 99 ops.mode = MTD_OOB_RAW;
105 } 107 }
106 #else 108 #else
107 __u8 *spareAsBytes = (__u8 *) spare; 109 __u8 *spareAsBytes = (__u8 *) spare;
108 110
109 if (data && spare) { 111 if (data && spare) {
110 if (dev->useNANDECC) 112 if (dev->param.useNANDECC)
111 retval = 113 retval =
112 mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, 114 mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk,
113 &dummy, data, spareAsBytes, 115 &dummy, data, spareAsBytes,
114 &yaffs_oobinfo); 116 &yaffs_oobinfo);
115 else 117 else
136 } 138 }
137 139
138 int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, 140 int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data,
139 yaffs_Spare *spare) 141 yaffs_Spare *spare)
140 { 142 {
141 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); 143 struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd;
142 #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) 144 #if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))
143 struct mtd_oob_ops ops; 145 struct mtd_oob_ops ops;
144 #endif 146 #endif
145 size_t dummy; 147 size_t dummy;
146 int retval = 0; 148 int retval = 0;
151 153
152 if (data && !spare) 154 if (data && !spare)
153 retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk, 155 retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk,
154 &dummy, data); 156 &dummy, data);
155 else if (spare) { 157 else if (spare) {
156 if (dev->useNANDECC) { 158 if (dev->param.useNANDECC) {
157 ops.mode = MTD_OOB_AUTO; 159 ops.mode = MTD_OOB_AUTO;
158 ops.ooblen = 8; /* temp hack */ 160 ops.ooblen = 8; /* temp hack */
159 } else { 161 } else {
160 ops.mode = MTD_OOB_RAW; 162 ops.mode = MTD_OOB_RAW;
161 ops.ooblen = YAFFS_BYTES_PER_SPARE; 163 ops.ooblen = YAFFS_BYTES_PER_SPARE;
163 ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen; 165 ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen;
164 ops.datbuf = data; 166 ops.datbuf = data;
165 ops.ooboffs = 0; 167 ops.ooboffs = 0;
166 ops.oobbuf = spareAsBytes; 168 ops.oobbuf = spareAsBytes;
167 retval = mtd->read_oob(mtd, addr, &ops); 169 retval = mtd->read_oob(mtd, addr, &ops);
168 if (dev->useNANDECC) 170 if (dev->param.useNANDECC)
169 translate_oob2spare(spare, spareAsBytes); 171 translate_oob2spare(spare, spareAsBytes);
170 } 172 }
171 #else 173 #else
172 __u8 *spareAsBytes = (__u8 *) spare; 174 __u8 *spareAsBytes = (__u8 *) spare;
173 175
174 if (data && spare) { 176 if (data && spare) {
175 if (dev->useNANDECC) { 177 if (dev->param.useNANDECC) {
176 /* Careful, this call adds 2 ints */ 178 /* Careful, this call adds 2 ints */
177 /* to the end of the spare data. Calling function */ 179 /* to the end of the spare data. Calling function */
178 /* should allocate enough memory for spare, */ 180 /* should allocate enough memory for spare, */
179 /* i.e. [YAFFS_BYTES_PER_SPARE+2*sizeof(int)]. */ 181 /* i.e. [YAFFS_BYTES_PER_SPARE+2*sizeof(int)]. */
180 retval = 182 retval =
205 return YAFFS_FAIL; 207 return YAFFS_FAIL;
206 } 208 }
207 209
208 int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber) 210 int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
209 { 211 {
210 struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); 212 struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd;
211 __u32 addr = 213 __u32 addr =
212 ((loff_t) blockNumber) * dev->nDataBytesPerChunk 214 ((loff_t) blockNumber) * dev->nDataBytesPerChunk
213 * dev->nChunksPerBlock; 215 * dev->param.nChunksPerBlock;
214 struct erase_info ei; 216 struct erase_info ei;
217
215 int retval = 0; 218 int retval = 0;
216 219
217 ei.mtd = mtd; 220 ei.mtd = mtd;
218 ei.addr = addr; 221 ei.addr = addr;
219 ei.len = dev->nDataBytesPerChunk * dev->nChunksPerBlock; 222 ei.len = dev->nDataBytesPerChunk * dev->param.nChunksPerBlock;
220 ei.time = 1000; 223 ei.time = 1000;
221 ei.retries = 2; 224 ei.retries = 2;
222 ei.callback = NULL; 225 ei.callback = NULL;
223 ei.priv = (u_long) dev; 226 ei.priv = (u_long) dev;
224 227
225 /* Todo finish off the ei if required */
226
227 sema_init(&dev->sem, 0);
228
229 retval = mtd->erase(mtd, &ei); 228 retval = mtd->erase(mtd, &ei);
230 229
231 if (retval == 0) 230 if (retval == 0)
232 return YAFFS_OK; 231 return YAFFS_OK;
233 else 232 else