X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_nand.c;h=bd815cb7af92b7dea0940e25ecd0daf9c19ebb58;hp=26acf201d76cfd2e6ee09795328b87b45b47d873;hb=3e5718ec7f0df7b76837d10583419b745cb27474;hpb=378bbdf4d64b8b26db55a495ab6ae520ff62e471 diff --git a/yaffs_nand.c b/yaffs_nand.c index 26acf20..bd815cb 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-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -9,28 +9,28 @@ * 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.3 2006-10-03 10:13:03 charles Exp $"; + "$Id: yaffs_nand.c,v 1.10 2009-03-06 17:20:54 wookey 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_ReadChunkWithTagsFromNAND(yaffs_Device *dev, int chunkInNAND, + __u8 *buffer, + yaffs_ExtendedTags *tags) { int result; yaffs_ExtendedTags localTags; - + int realignedChunkInNAND = chunkInNAND - dev->chunkOffset; - + /* If there are no tags provided, use local tags to get prioritised gc working */ - if(!tags) + if (!tags) tags = &localTags; if (dev->readChunkWithTagsFromNAND) @@ -40,26 +40,25 @@ int yaffs_ReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND, result = yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(dev, realignedChunkInNAND, buffer, - tags); - if(tags && - tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR){ - + tags); + if (tags && + tags->eccResult > YAFFS_ECC_RESULT_NO_ERROR) { + yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, chunkInNAND/dev->nChunksPerBlock); - bi->gcPrioritise = 1; - dev->hasPendingPrioritisedGCs = 1; + yaffs_HandleChunkError(dev, bi); } - + return result; } -int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, +int yaffs_WriteChunkWithTagsToNAND(yaffs_Device *dev, int chunkInNAND, - const __u8 * buffer, - yaffs_ExtendedTags * tags) + const __u8 *buffer, + yaffs_ExtendedTags *tags) { chunkInNAND -= dev->chunkOffset; - + if (tags) { tags->sequenceNumber = dev->sequenceNumber; tags->chunkUsed = 1; @@ -86,7 +85,7 @@ int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, tags); } -int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo) +int yaffs_MarkBlockBad(yaffs_Device *dev, int blockNo) { blockNo -= dev->blockOffset; @@ -97,10 +96,10 @@ int yaffs_MarkBlockBad(yaffs_Device * dev, int blockNo) return yaffs_TagsCompatabilityMarkNANDBlockBad(dev, blockNo); } -int yaffs_QueryInitialBlockState(yaffs_Device * dev, +int yaffs_QueryInitialBlockState(yaffs_Device *dev, int blockNo, - yaffs_BlockState * state, - unsigned *sequenceNumber) + yaffs_BlockState *state, + __u32 *sequenceNumber) { blockNo -= dev->blockOffset; @@ -124,9 +123,6 @@ int yaffs_EraseBlockInNAND(struct yaffs_DeviceStruct *dev, dev->nBlockErasures++; result = dev->eraseBlockInNAND(dev, blockInNAND); - /* If at first we don't succeed, try again *once*.*/ - if (!result) - result = dev->eraseBlockInNAND(dev, blockInNAND); return result; } @@ -136,4 +132,4 @@ int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) } - +