X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_nand.c;h=bd1f05806ee56386efa957a1c4031f3eed5a7d3f;hp=cd39d516066564bd452bafd9e48e2a7da82e67c6;hb=e33554a67753729f6b74677473cf0ec3b8d35a7e;hpb=e1b8e63260986ab7afec3c379e7a320677c95846 diff --git a/yaffs_nand.c b/yaffs_nand.c index cd39d51..bd1f058 100644 --- a/yaffs_nand.c +++ b/yaffs_nand.c @@ -1,7 +1,7 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2010 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -9,45 +9,63 @@ * 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_nand_c_version = - "$Id: yaffs_nand.c,v 1.1 2006-05-08 10:13:34 charles Exp $"; #include "yaffs_nand.h" #include "yaffs_tagscompat.h" #include "yaffs_tagsvalidity.h" +#include "yaffs_getblockinfo.h" -int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND, - __u8 * buffer, - yaffs_ExtendedTags * tags) +int yaffs_rd_chunk_tags_nand(yaffs_Device *dev, int chunkInNAND, + __u8 *buffer, + yaffs_ExtendedTags *tags) { - chunkInNAND -= dev->chunkOffset; + int result; + yaffs_ExtendedTags localTags; + + int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; + + dev->nPageReads++; - if (dev->readChunkWithTagsFromNAND) - return dev->readChunkWithTagsFromNAND(dev, chunkInNAND, buffer, + /* If there are no tags provided, use local tags to get prioritised gc working */ + if (!tags) + tags = &localTags; + + if (dev->param.readChunkWithTagsFromNAND) + result = dev->param.readChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, tags); else - return yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, - chunkInNAND, + result = yaffs_tags_compat_rd(dev, + realignedChunkInNAND, buffer, tags); + if (tags && + tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) { + + yaffs_BlockInfo *bi; + bi = yaffs_get_block_info(dev, chunkInNAND/dev->param.nChunksPerBlock); + yaffs_handle_chunk_error(dev, bi); + } + + return result; } -int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, +int yaffs_wr_chunk_tags_nand(yaffs_Device *dev, int chunkInNAND, - const __u8 * buffer, - yaffs_ExtendedTags * tags) + const __u8 *buffer, + yaffs_ExtendedTags *tags) { + + dev->nPageWrites++; + chunkInNAND -= dev->chunkOffset; - + if (tags) { tags->sequenceNumber = dev->sequenceNumber; tags->chunkUsed = 1; - if (!yaffs_ValidateTags(tags)) { + if (!yaffs_validate_tags(tags)) { T(YAFFS_TRACE_ERROR, (TSTR("Writing uninitialised tags" TENDSTR))); YBUG(); @@ -60,64 +78,63 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, YBUG(); } - if (dev->writeChunkWithTagsToNAND) - return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, + if (dev->param.writeChunkWithTagsToNAND) + return dev->param.writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, tags); else - return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, + return yaffs_tags_compat_wr(dev, chunkInNAND, buffer, tags); } -int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo) +int yaffs_mark_bad(yaffs_Device *dev, int blockNo) { blockNo -= dev->blockOffset; -; - if (dev->markNANDBlockBad) - return dev->markNANDBlockBad(dev, blockNo); + + if (dev->param.markNANDBlockBad) + return dev->param.markNANDBlockBad(dev, blockNo); else - return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); + return yaffs_tags_compat_mark_bad(dev, blockNo); } -int yaffs_QueryInitialBlockState(yaffs_Device * dev, +int yaffs_query_init_block_state(yaffs_Device *dev, int blockNo, - yaffs_BlockState * state, - unsigned *sequenceNumber) + yaffs_BlockState *state, + __u32 *sequenceNumber) { blockNo -= dev->blockOffset; - if (dev->queryNANDBlock) - return dev->queryNANDBlock(dev, blockNo, state, sequenceNumber); + if (dev->param.queryNANDBlock) + return dev->param.queryNANDBlock(dev, blockNo, state, sequenceNumber); else - return yaffs_TagsCompatabilityQueryNANDBlock(dev, blockNo, + return yaffs_tags_compat_query_block(dev, blockNo, state, sequenceNumber); } -int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, +int yaffs_erase_block(struct yaffs_DeviceStruct *dev, int blockInNAND) { int result; blockInNAND -= dev->blockOffset; - dev->nBlockErasures++; - result = dev->eraseBlockInNAND(dev, blockInNAND); - /* If at first we don't succeed, try again *once*.*/ - if (!result) - result = dev->eraseBlockInNAND(dev, blockInNAND); + result = dev->param.eraseBlockInNAND(dev, blockInNAND); + return result; } -int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) +int yaffs_init_nand(struct yaffs_DeviceStruct *dev) { - return dev->initialiseNAND(dev); + if(dev->param.initialiseNAND) + return dev->param.initialiseNAND(dev); + return YAFFS_OK; } - +