X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_mtdif.c;h=6e2a9de22267318f34bb7c42deabdea3a3e8dca8;hp=1f40e8fbb0c33ca6fdd2f4d399f822b16ce1de53;hb=e1ac494e05a5dc7ab61d799af815d103a11d318c;hpb=3321ac060648a65e47093e6f3e7387b4b1c5d5cd diff --git a/yaffs_mtdif.c b/yaffs_mtdif.c index 1f40e8f..6e2a9de 100644 --- a/yaffs_mtdif.c +++ b/yaffs_mtdif.c @@ -1,8 +1,7 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * yaffs_mtdif.c NAND mtd wrapper functions. + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -10,11 +9,10 @@ * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. - * */ const char *yaffs_mtdif_c_version = - "$Id: yaffs_mtdif.c,v 1.14 2006-09-26 13:28:13 vwool Exp $"; + "$Id: yaffs_mtdif.c,v 1.19 2007-02-14 01:09:06 wookey Exp $"; #include "yportenv.h" @@ -64,8 +62,10 @@ static inline void translate_oob2spare(yaffs_Spare *spare, __u8 *oob) spare->tagByte5 = oob[5] == 0xff ? 0xff : oob[5] & 0x3f; spare->blockStatus = oob[5] & 0x80 ? 0xff : 'Y'; spare->pageStatus = oob[5] & 0x40 ? 0xff : 0; + spare->ecc1[0] = spare->ecc1[1] = spare->ecc1[2] = 0xff; spare->tagByte6 = oob[6]; spare->tagByte7 = oob[7]; + spare->ecc2[0] = spare->ecc2[1] = spare->ecc2[2] = 0xff; nspare->eccres1 = nspare->eccres2 = 0; /* FIXME */ } @@ -81,12 +81,12 @@ int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, size_t dummy; int retval = 0; - loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk; + loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) __u8 spareAsBytes[8]; /* OOB */ if (data && !spare) - retval = mtd->write(mtd, addr, dev->nBytesPerChunk, + retval = mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy, data); else if (spare) { if (dev->useNANDECC) { @@ -97,7 +97,7 @@ int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, ops.mode = MTD_OOB_RAW; ops.ooblen = YAFFS_BYTES_PER_SPARE; } - ops.len = data ? dev->nBytesPerChunk : ops.ooblen; + ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen; ops.datbuf = (u8 *)data; ops.ooboffs = 0; ops.oobbuf = spareAsBytes; @@ -109,18 +109,18 @@ int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, if (data && spare) { if (dev->useNANDECC) retval = - mtd->write_ecc(mtd, addr, dev->nBytesPerChunk, + mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, &dummy, data, spareAsBytes, &yaffs_oobinfo); else retval = - mtd->write_ecc(mtd, addr, dev->nBytesPerChunk, + mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, &dummy, data, spareAsBytes, &yaffs_noeccinfo); } else { if (data) retval = - mtd->write(mtd, addr, dev->nBytesPerChunk, &dummy, + mtd->write(mtd, addr, dev->nDataBytesPerChunk, &dummy, data); if (spare) retval = @@ -145,12 +145,12 @@ int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, size_t dummy; int retval = 0; - loff_t addr = ((loff_t) chunkInNAND) * dev->nBytesPerChunk; + loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) __u8 spareAsBytes[8]; /* OOB */ if (data && !spare) - retval = mtd->read(mtd, addr, dev->nBytesPerChunk, + retval = mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, data); else if (spare) { if (dev->useNANDECC) { @@ -160,7 +160,7 @@ int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, ops.mode = MTD_OOB_RAW; ops.ooblen = YAFFS_BYTES_PER_SPARE; } - ops.len = data ? dev->nBytesPerChunk : ops.ooblen; + ops.len = data ? dev->nDataBytesPerChunk : ops.ooblen; ops.datbuf = data; ops.ooboffs = 0; ops.oobbuf = spareAsBytes; @@ -178,19 +178,19 @@ int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, /* should allocate enough memory for spare, */ /* i.e. [YAFFS_BYTES_PER_SPARE+2*sizeof(int)]. */ retval = - mtd->read_ecc(mtd, addr, dev->nBytesPerChunk, + mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, &dummy, data, spareAsBytes, &yaffs_oobinfo); } else { retval = - mtd->read_ecc(mtd, addr, dev->nBytesPerChunk, + mtd->read_ecc(mtd, addr, dev->nDataBytesPerChunk, &dummy, data, spareAsBytes, &yaffs_noeccinfo); } } else { if (data) retval = - mtd->read(mtd, addr, dev->nBytesPerChunk, &dummy, + mtd->read(mtd, addr, dev->nDataBytesPerChunk, &dummy, data); if (spare) retval = @@ -209,14 +209,14 @@ int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber) { struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); __u32 addr = - ((loff_t) blockNumber) * dev->nBytesPerChunk + ((loff_t) blockNumber) * dev->nDataBytesPerChunk * dev->nChunksPerBlock; struct erase_info ei; int retval = 0; ei.mtd = mtd; ei.addr = addr; - ei.len = dev->nBytesPerChunk * dev->nChunksPerBlock; + ei.len = dev->nDataBytesPerChunk * dev->nChunksPerBlock; ei.time = 1000; ei.retries = 2; ei.callback = NULL;