Mercurial > yaffs-ecoscentric-gpl
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 |
