X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_mtdif.c;h=25d92ed6347bf36007767b5d2f3dfe9943eb5af2;hp=1e096502c0a891657bae9060b46ca108207e4a9d;hb=30ab3ff5e311e8e2b488c3f62f30e7450dc6bee9;hpb=378bbdf4d64b8b26db55a495ab6ae520ff62e471 diff --git a/yaffs_mtdif.c b/yaffs_mtdif.c index 1e09650..25d92ed 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.15 2006-10-03 10:13:03 charles Exp $"; + "$Id: yaffs_mtdif.c,v 1.23 2010-02-18 01:18:04 charles Exp $"; #include "yportenv.h" @@ -26,7 +24,9 @@ const char *yaffs_mtdif_c_version = #include "linux/time.h" #include "linux/mtd/nand.h" -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)) +#include "yaffs_linux.h" + +#if (MTD_VERSION_CODE < MTD_VERSION(2, 6, 18)) static struct nand_oobinfo yaffs_oobinfo = { .useecc = 1, .eccbytes = 6, @@ -38,7 +38,7 @@ static struct nand_oobinfo yaffs_noeccinfo = { }; #endif -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) +#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob) { oob[0] = spare->tagByte0; @@ -47,8 +47,8 @@ static inline void translate_spare2oob(const yaffs_Spare *spare, __u8 *oob) oob[3] = spare->tagByte3; oob[4] = spare->tagByte4; oob[5] = spare->tagByte5 & 0x3f; - oob[5] |= spare->blockStatus == 'Y' ? 0: 0x80; - oob[5] |= spare->pageStatus == 0 ? 0: 0x40; + oob[5] |= spare->blockStatus == 'Y' ? 0 : 0x80; + oob[5] |= spare->pageStatus == 0 ? 0 : 0x40; oob[6] = spare->tagByte6; oob[7] = spare->tagByte7; } @@ -64,32 +64,34 @@ 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 */ } #endif -int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, - const __u8 * data, const yaffs_Spare * spare) +int nandmtd_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND, + const __u8 *data, const yaffs_Spare *spare) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) + struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd; +#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) struct mtd_oob_ops ops; #endif size_t dummy; int retval = 0; loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) +#if (MTD_VERSION_CODE > MTD_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) { + if (dev->param.useNANDECC) { translate_spare2oob(spare, spareAsBytes); ops.mode = MTD_OOB_AUTO; ops.ooblen = 8; /* temp hack */ @@ -97,7 +99,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; @@ -107,7 +109,7 @@ int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, __u8 *spareAsBytes = (__u8 *) spare; if (data && spare) { - if (dev->useNANDECC) + if (dev->param.useNANDECC) retval = mtd->write_ecc(mtd, addr, dev->nDataBytesPerChunk, &dummy, data, spareAsBytes, @@ -135,44 +137,44 @@ int nandmtd_WriteChunkToNAND(yaffs_Device * dev, int chunkInNAND, return YAFFS_FAIL; } -int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, - yaffs_Spare * spare) +int nandmtd_ReadChunkFromNAND(yaffs_Device *dev, int chunkInNAND, __u8 *data, + yaffs_Spare *spare) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) + struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd; +#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17)) struct mtd_oob_ops ops; #endif size_t dummy; int retval = 0; loff_t addr = ((loff_t) chunkInNAND) * dev->nDataBytesPerChunk; -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17)) +#if (MTD_VERSION_CODE > MTD_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) { + if (dev->param.useNANDECC) { ops.mode = MTD_OOB_AUTO; ops.ooblen = 8; /* temp hack */ } else { 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; retval = mtd->read_oob(mtd, addr, &ops); - if (dev->useNANDECC) + if (dev->param.useNANDECC) translate_oob2spare(spare, spareAsBytes); } #else __u8 *spareAsBytes = (__u8 *) spare; if (data && spare) { - if (dev->useNANDECC) { + if (dev->param.useNANDECC) { /* Careful, this call adds 2 ints */ /* to the end of the spare data. Calling function */ /* should allocate enough memory for spare, */ @@ -205,27 +207,24 @@ int nandmtd_ReadChunkFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, return YAFFS_FAIL; } -int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber) +int nandmtd_EraseBlockInNAND(yaffs_Device *dev, int blockNumber) { - struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); + struct mtd_info *mtd = yaffs_DeviceToContext(dev)->mtd; __u32 addr = ((loff_t) blockNumber) * dev->nDataBytesPerChunk - * dev->nChunksPerBlock; + * dev->param.nChunksPerBlock; struct erase_info ei; + int retval = 0; ei.mtd = mtd; ei.addr = addr; - ei.len = dev->nDataBytesPerChunk * dev->nChunksPerBlock; + ei.len = dev->nDataBytesPerChunk * dev->param.nChunksPerBlock; ei.time = 1000; ei.retries = 2; ei.callback = NULL; ei.priv = (u_long) dev; - /* Todo finish off the ei if required */ - - sema_init(&dev->sem, 0); - retval = mtd->erase(mtd, &ei); if (retval == 0) @@ -234,7 +233,7 @@ int nandmtd_EraseBlockInNAND(yaffs_Device * dev, int blockNumber) return YAFFS_FAIL; } -int nandmtd_InitialiseNAND(yaffs_Device * dev) +int nandmtd_InitialiseNAND(yaffs_Device *dev) { return YAFFS_OK; }